X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=transform.h;h=a5e7a091a05da2975b40cdd41c2e5ac7f05eea0f;hb=0256e57e16a302ad45090618b8d6eb5930788809;hp=6b0494ecf21da6d0e15c47c65cf66fdf8dd2493a;hpb=7d0ec7ce187f7333a7ada2884108757a4fec6449;p=xonotic%2Fdarkplaces.git diff --git a/transform.h b/transform.h index 6b0494ec..a5e7a091 100644 --- a/transform.h +++ b/transform.h @@ -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_t *e); -extern void softwaretransformforbrushentity (entity_t *e); -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 +