1 // LordHavoc: transform code for purposes of transpoly, wallpoly, etc
5 vec3_t softwaretransform_x;
6 vec3_t softwaretransform_y;
7 vec3_t softwaretransform_z;
8 vec_t softwaretransform_scale;
9 vec3_t softwaretransform_offset;
11 // set to different transform code depending on complexity of transform
12 void (*softwaretransform) (vec3_t in, vec3_t out);
15 void softwaretransform_dorotatescaletranslate (vec3_t in, vec3_t out)
17 out[0] = (in[0] * softwaretransform_x[0] + in[1] * softwaretransform_y[0] + in[2] * softwaretransform_z[0]) * softwaretransform_scale + softwaretransform_offset[0];
18 out[1] = (in[0] * softwaretransform_x[1] + in[1] * softwaretransform_y[1] + in[2] * softwaretransform_z[1]) * softwaretransform_scale + softwaretransform_offset[1];
19 out[2] = (in[0] * softwaretransform_x[2] + in[1] * softwaretransform_y[2] + in[2] * softwaretransform_z[2]) * softwaretransform_scale + softwaretransform_offset[2];
22 void softwaretransform_doscaletranslate (vec3_t in, vec3_t out)
24 out[0] = in[0] * softwaretransform_scale + softwaretransform_offset[0];
25 out[1] = in[1] * softwaretransform_scale + softwaretransform_offset[1];
26 out[2] = in[2] * softwaretransform_scale + softwaretransform_offset[2];
29 void softwaretransform_dorotatetranslate (vec3_t in, vec3_t out)
31 out[0] = (in[0] * softwaretransform_x[0] + in[1] * softwaretransform_y[0] + in[2] * softwaretransform_z[0]) + softwaretransform_offset[0];
32 out[1] = (in[0] * softwaretransform_x[1] + in[1] * softwaretransform_y[1] + in[2] * softwaretransform_z[1]) + softwaretransform_offset[1];
33 out[2] = (in[0] * softwaretransform_x[2] + in[1] * softwaretransform_y[2] + in[2] * softwaretransform_z[2]) + softwaretransform_offset[2];
36 void softwaretransform_dotranslate (vec3_t in, vec3_t out)
38 out[0] = in[0] + softwaretransform_offset[0];
39 out[1] = in[1] + softwaretransform_offset[1];
40 out[2] = in[2] + softwaretransform_offset[2];
43 void softwaretransform_dorotatescale (vec3_t in, vec3_t out)
45 out[0] = (in[0] * softwaretransform_x[0] + in[1] * softwaretransform_y[0] + in[2] * softwaretransform_z[0]) * softwaretransform_scale;
46 out[1] = (in[0] * softwaretransform_x[1] + in[1] * softwaretransform_y[1] + in[2] * softwaretransform_z[1]) * softwaretransform_scale;
47 out[2] = (in[0] * softwaretransform_x[2] + in[1] * softwaretransform_y[2] + in[2] * softwaretransform_z[2]) * softwaretransform_scale;
50 void softwaretransform_doscale (vec3_t in, vec3_t out)
52 out[0] = in[0] * softwaretransform_scale + softwaretransform_offset[0];
53 out[1] = in[1] * softwaretransform_scale + softwaretransform_offset[1];
54 out[2] = in[2] * softwaretransform_scale + softwaretransform_offset[2];
57 void softwaretransform_dorotate (vec3_t in, vec3_t out)
59 out[0] = (in[0] * softwaretransform_x[0] + in[1] * softwaretransform_y[0] + in[2] * softwaretransform_z[0]);
60 out[1] = (in[0] * softwaretransform_x[1] + in[1] * softwaretransform_y[1] + in[2] * softwaretransform_z[1]);
61 out[2] = (in[0] * softwaretransform_x[2] + in[1] * softwaretransform_y[2] + in[2] * softwaretransform_z[2]);
64 void softwaretransform_docopy (vec3_t in, vec3_t out)
71 // to save time on transforms, choose the appropriate function
72 void softwaretransform_classify()
74 if (softwaretransform_offset[0] != 0 || softwaretransform_offset[1] != 0 || softwaretransform_offset[2] != 0)
76 if (softwaretransform_scale != 1)
78 if (softwaretransform_x[0] != 1 || softwaretransform_x[1] != 0 || softwaretransform_x[2] != 0 ||
79 softwaretransform_y[0] != 0 || softwaretransform_y[1] != 1 || softwaretransform_y[2] != 0 ||
80 softwaretransform_z[0] != 0 || softwaretransform_z[1] != 0 || softwaretransform_z[2] != 1)
81 softwaretransform = &softwaretransform_dorotatescaletranslate;
83 softwaretransform = &softwaretransform_doscaletranslate;
87 if (softwaretransform_x[0] != 1 || softwaretransform_x[1] != 0 || softwaretransform_x[2] != 0 ||
88 softwaretransform_y[0] != 0 || softwaretransform_y[1] != 1 || softwaretransform_y[2] != 0 ||
89 softwaretransform_z[0] != 0 || softwaretransform_z[1] != 0 || softwaretransform_z[2] != 1)
90 softwaretransform = &softwaretransform_dorotatetranslate;
92 softwaretransform = &softwaretransform_dotranslate;
97 if (softwaretransform_scale != 1)
99 if (softwaretransform_x[0] != 1 || softwaretransform_x[1] != 0 || softwaretransform_x[2] != 0 ||
100 softwaretransform_y[0] != 0 || softwaretransform_y[1] != 1 || softwaretransform_y[2] != 0 ||
101 softwaretransform_z[0] != 0 || softwaretransform_z[1] != 0 || softwaretransform_z[2] != 1)
102 softwaretransform = &softwaretransform_dorotatescale;
104 softwaretransform = &softwaretransform_doscale;
108 if (softwaretransform_x[0] != 1 || softwaretransform_x[1] != 0 || softwaretransform_x[2] != 0 ||
109 softwaretransform_y[0] != 0 || softwaretransform_y[1] != 1 || softwaretransform_y[2] != 0 ||
110 softwaretransform_z[0] != 0 || softwaretransform_z[1] != 0 || softwaretransform_z[2] != 1)
111 softwaretransform = &softwaretransform_dorotate;
113 softwaretransform = &softwaretransform_docopy;
118 void softwaretransformidentity ()
120 softwaretransform_offset[0] = softwaretransform_offset[1] = softwaretransform_offset[2] = softwaretransform_x[1] = softwaretransform_x[2] = softwaretransform_y[0] = softwaretransform_y[2] = softwaretransform_z[0] = softwaretransform_z[1] = 0;
121 softwaretransform_x[0] = softwaretransform_y[1] = softwaretransform_z[2] = 1;
122 softwaretransform_scale = 1;
123 // we know what it is
124 softwaretransform = &softwaretransform_docopy;
127 void softwaretransformset (vec3_t origin, vec3_t angles, vec_t scale)
129 VectorCopy(origin, softwaretransform_offset);
130 AngleVectors(angles, softwaretransform_x, softwaretransform_y, softwaretransform_z);
131 softwaretransform_y[0] = -softwaretransform_y[0];
132 softwaretransform_y[1] = -softwaretransform_y[1];
133 softwaretransform_y[2] = -softwaretransform_y[2];
134 softwaretransform_scale = scale;
135 // choose best transform code
136 softwaretransform_classify();
139 void softwaretransformforentity (entity_t *e)
142 angles[0] = -e->angles[0];
143 angles[1] = e->angles[1];
144 angles[2] = e->angles[2];
145 softwaretransformset(e->origin, angles, e->scale);