X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=transform.h;h=a5e7a091a05da2975b40cdd41c2e5ac7f05eea0f;hb=034cc2f41e93d705c4437ed99564bdeeac6d4883;hp=a68de7d7896b4bab2a15005c9d271dae541b32ac;hpb=cf9b04f7dd65f32c7a781028efa6c8a56622b842;p=xonotic%2Fdarkplaces.git diff --git a/transform.h b/transform.h index a68de7d7..a5e7a091 100644 --- a/transform.h +++ b/transform.h @@ -1,15 +1,72 @@ -// LordHavoc: software transform support, intended for transpoly and wallpoly systems -#define tft_translate 1 -#define tft_rotate 2 +#ifndef TRANSFORM_H +#define TRANSFORM_H -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 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 -extern void softwaretransformforentity (entity_t *e); -extern void softwaretransformidentity (); -extern void softwaretransformset (vec3_t origin, vec3_t angles, vec_t scale); -extern void (*softwaretransform) (vec3_t in, vec3_t out);