- vec3_t v;
- float s = 1.0f / softwaretransform_scale;
- v[0] = in[0] - softwaretransform_offset[0];
- v[1] = in[1] - softwaretransform_offset[1];
- v[2] = in[2] - softwaretransform_offset[2];
- out[0] = (v[0] * softwaretransform_x[0] + v[1] * softwaretransform_x[1] + v[2] * softwaretransform_x[2]) * s;
- out[1] = (v[0] * softwaretransform_y[0] + v[1] * softwaretransform_y[1] + v[2] * softwaretransform_y[2]) * s;
- out[2] = (v[0] * softwaretransform_z[0] + v[1] * softwaretransform_z[1] + v[2] * softwaretransform_z[2]) * s;
+ float invscale;
+ invscale = 1.0f / scale;
+ if (scale == 0)
+ Host_Error("softwaretransformset: 0 scale\n");
+
+ AngleMatrix(angles, origin, softwaretransform_rotatematrix);
+
+ softwaretransform_matrix[0][0] = softwaretransform_rotatematrix[0][0] * scale;
+ softwaretransform_matrix[0][1] = softwaretransform_rotatematrix[0][1] * scale;
+ softwaretransform_matrix[0][2] = softwaretransform_rotatematrix[0][2] * scale;
+ softwaretransform_matrix[1][0] = softwaretransform_rotatematrix[1][0] * scale;
+ softwaretransform_matrix[1][1] = softwaretransform_rotatematrix[1][1] * scale;
+ softwaretransform_matrix[1][2] = softwaretransform_rotatematrix[1][2] * scale;
+ softwaretransform_matrix[2][0] = softwaretransform_rotatematrix[2][0] * scale;
+ softwaretransform_matrix[2][1] = softwaretransform_rotatematrix[2][1] * scale;
+ softwaretransform_matrix[2][2] = softwaretransform_rotatematrix[2][2] * scale;
+ softwaretransform_matrix[0][3] = softwaretransform_rotatematrix[0][3];
+ softwaretransform_matrix[1][3] = softwaretransform_rotatematrix[1][3];
+ softwaretransform_matrix[2][3] = softwaretransform_rotatematrix[2][3];
+
+ softwaretransform_invmatrix[0][0] = softwaretransform_rotatematrix[0][0] * invscale;
+ softwaretransform_invmatrix[0][1] = softwaretransform_rotatematrix[1][0] * invscale;
+ softwaretransform_invmatrix[0][2] = softwaretransform_rotatematrix[2][0] * invscale;
+ softwaretransform_invmatrix[1][0] = softwaretransform_rotatematrix[0][1] * invscale;
+ softwaretransform_invmatrix[1][1] = softwaretransform_rotatematrix[1][1] * invscale;
+ softwaretransform_invmatrix[1][2] = softwaretransform_rotatematrix[2][1] * invscale;
+ softwaretransform_invmatrix[2][0] = softwaretransform_rotatematrix[0][2] * invscale;
+ softwaretransform_invmatrix[2][1] = softwaretransform_rotatematrix[1][2] * invscale;
+ softwaretransform_invmatrix[2][2] = softwaretransform_rotatematrix[2][2] * invscale;
+ softwaretransform_invmatrix[0][3] = softwaretransform_rotatematrix[0][3];
+ softwaretransform_invmatrix[1][3] = softwaretransform_rotatematrix[1][3];
+ softwaretransform_invmatrix[2][3] = softwaretransform_rotatematrix[2][3];
+
+ // choose transform mode
+ if (softwaretransform_matrix[0][0] != 1 || softwaretransform_matrix[0][1] != 0 || softwaretransform_matrix[0][2] != 0
+ || softwaretransform_matrix[1][0] != 0 || softwaretransform_matrix[1][1] != 1 || softwaretransform_matrix[1][2] != 0
+ || softwaretransform_matrix[2][0] != 0 || softwaretransform_matrix[2][1] != 0 || softwaretransform_matrix[2][2] != 1)
+ softwaretransform_complexity = 2;
+ else if (softwaretransform_matrix[0][3] != 0 || softwaretransform_matrix[1][3] != 0 || softwaretransform_matrix[2][3] != 0)
+ softwaretransform_complexity = 1;
+ else
+ softwaretransform_complexity = 0;