]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - transform.h
DP code cleanup, stage one - all headers that can be protected by ifdef
[xonotic/darkplaces.git] / transform.h
index e2d82e58e1f0618c19b8b870b72d0b223999f095..a5e7a091a05da2975b40cdd41c2e5ac7f05eea0f 100644 (file)
@@ -1,18 +1,72 @@
-// LordHavoc: software transform support, intended for transpoly and wallpoly systems
-
-#define tft_translate 1
-#define tft_rotate 2
-
-extern vec_t softwaretransform_scale;
-extern vec3_t softwaretransform_offset;
-extern vec3_t softwaretransform_x;
-extern vec3_t softwaretransform_y;
-extern vec3_t softwaretransform_z;
-extern int softwaretransform_type;
-
-extern void softwaretransformforentity (entity_render_t *r);
-extern void softwaretransformforbrushentity (entity_render_t *r);
-extern void softwaretransformidentity (void);
-extern void softwaretransformset (vec3_t origin, vec3_t angles, vec_t scale);
-extern void (*softwaretransform) (vec3_t in, vec3_t out);
-extern void softwareuntransform (vec3_t in, vec3_t out);
+
+#ifndef TRANSFORM_H
+#define TRANSFORM_H
+
+extern vec_t softwaretransform_rotatematrix[3][4];
+extern vec_t softwaretransform_matrix[3][4];
+extern vec_t softwaretransform_invmatrix[3][4];
+extern int softwaretransform_complexity;
+
+void softwaretransformidentity (void);
+void softwaretransformset (vec3_t origin, vec3_t angles, vec_t scale);
+void softwaretransformforentity (entity_render_t *r);
+
+// #defines for speed reasons
+#define softwaretransform(in, out)\
+{\
+       if (softwaretransform_complexity == 0)\
+       {\
+               VectorCopy(in, out);\
+       }\
+       else if (softwaretransform_complexity == 1)\
+       {\
+               out[0] = in[0] + softwaretransform_matrix[0][3];\
+               out[1] = in[1] + softwaretransform_matrix[1][3];\
+               out[2] = in[2] + softwaretransform_matrix[2][3];\
+       }\
+       else\
+       {\
+               out[0] = DotProduct(in, softwaretransform_matrix[0]) + softwaretransform_matrix[0][3];\
+               out[1] = DotProduct(in, softwaretransform_matrix[1]) + softwaretransform_matrix[1][3];\
+               out[2] = DotProduct(in, softwaretransform_matrix[2]) + softwaretransform_matrix[2][3];\
+       }\
+}
+
+#define softwaretransformdirection(in, out)\
+{\
+       if (softwaretransform_complexity == 2)\
+       {\
+               out[0] = DotProduct(in, softwaretransform_rotatematrix[0]);\
+               out[1] = DotProduct(in, softwaretransform_rotatematrix[1]);\
+               out[2] = DotProduct(in, softwaretransform_rotatematrix[2]);\
+       }\
+       else\
+               VectorCopy(in, out);\
+}
+
+#define softwareuntransform(in, out)\
+{\
+       if (softwaretransform_complexity == 0)\
+       {\
+               VectorCopy(in, out);\
+       }\
+       else if (softwaretransform_complexity == 1)\
+       {\
+               out[0] = in[0] - softwaretransform_invmatrix[0][3];\
+               out[1] = in[1] - softwaretransform_invmatrix[1][3];\
+               out[2] = in[2] - softwaretransform_invmatrix[2][3];\
+       }\
+       else\
+       {\
+               vec3_t soft_v;\
+               soft_v[0] = in[0] - softwaretransform_invmatrix[0][3];\
+               soft_v[1] = in[1] - softwaretransform_invmatrix[1][3];\
+               soft_v[2] = in[2] - softwaretransform_invmatrix[2][3];\
+               out[0] = DotProduct(soft_v, softwaretransform_invmatrix[0]);\
+               out[1] = DotProduct(soft_v, softwaretransform_invmatrix[1]);\
+               out[2] = DotProduct(soft_v, softwaretransform_invmatrix[2]);\
+       }\
+}
+
+#endif
+