4{
5
7 float *bonepose;
8 float *boneposerelative;
10
11
13 boneposerelative = bonepose +
model->num_bones * 12;
14
16
17
18 weights =
model->surfmesh.data_blendweights;
19 for (
i = 0;
i <
model->surfmesh.num_blends;
i++, weights++)
20 {
22 const float *
RESTRICT m = boneposerelative + 12 * (
unsigned int)weights->index[0];
23 float f = weights->influence[0] * (1.0f / 255.0f);
24 b[ 0] =
f*m[ 0];
b[ 1] =
f*m[ 1];
b[ 2] =
f*m[ 2];
b[ 3] =
f*m[ 3];
25 b[ 4] =
f*m[ 4];
b[ 5] =
f*m[ 5];
b[ 6] =
f*m[ 6];
b[ 7] =
f*m[ 7];
26 b[ 8] =
f*m[ 8];
b[ 9] =
f*m[ 9];
b[10] =
f*m[10];
b[11] =
f*m[11];
27 for (k = 1;k < 4 && weights->influence[k];k++)
28 {
29 m = boneposerelative + 12 * (
unsigned int)weights->index[k];
30 f = weights->influence[k] * (1.0f / 255.0f);
31 b[ 0] +=
f*m[ 0];
b[ 1] +=
f*m[ 1];
b[ 2] +=
f*m[ 2];
b[ 3] +=
f*m[ 3];
32 b[ 4] +=
f*m[ 4];
b[ 5] +=
f*m[ 5];
b[ 6] +=
f*m[ 6];
b[ 7] +=
f*m[ 7];
33 b[ 8] +=
f*m[ 8];
b[ 9] +=
f*m[ 9];
b[10] +=
f*m[10];
b[11] +=
f*m[11];
34 }
35 }
36
37#define LOAD_MATRIX_SCALAR() const float * RESTRICT m = boneposerelative + 12 * (unsigned int)*b
38
39#define LOAD_MATRIX3() \
40 LOAD_MATRIX_SCALAR()
41#define LOAD_MATRIX4() \
42 LOAD_MATRIX_SCALAR()
43
44#define TRANSFORM_POSITION_SCALAR(in, out) \
45 (out)[0] = ((in)[0] * m[0] + (in)[1] * m[1] + (in)[2] * m[ 2] + m[3]); \
46 (out)[1] = ((in)[0] * m[4] + (in)[1] * m[5] + (in)[2] * m[ 6] + m[7]); \
47 (out)[2] = ((in)[0] * m[8] + (in)[1] * m[9] + (in)[2] * m[10] + m[11]);
48#define TRANSFORM_VECTOR_SCALAR(in, out) \
49 (out)[0] = ((in)[0] * m[0] + (in)[1] * m[1] + (in)[2] * m[ 2]); \
50 (out)[1] = ((in)[0] * m[4] + (in)[1] * m[5] + (in)[2] * m[ 6]); \
51 (out)[2] = ((in)[0] * m[8] + (in)[1] * m[9] + (in)[2] * m[10]);
52
53#define TRANSFORM_POSITION(in, out) \
54 TRANSFORM_POSITION_SCALAR(in, out)
55#define TRANSFORM_VECTOR(in, out) \
56 TRANSFORM_VECTOR_SCALAR(in, out)
57
58
59 if (vertex3f)
60 {
63
64 if (normal3f)
65 {
67 if (svector3f && tvector3f)
68 {
71
72
73
74 for (
i = 0;
i <
model->surfmesh.num_vertices;
i++,
v += 3,
n += 3, svec += 3, tvec += 3,
b++,
75 vertex3f += 3, normal3f += 3, svector3f += 3, tvector3f += 3)
76 {
82 }
83
84 return;
85 }
86
87 for (
i = 0;
i <
model->surfmesh.num_vertices;
i++,
v += 3,
n += 3,
b++, vertex3f += 3, normal3f += 3)
88 {
92 }
93 }
94 else
95 {
96 for (
i = 0;
i <
model->surfmesh.num_vertices;
i++,
v += 3,
b++, vertex3f += 3)
97 {
100 }
101 }
102 }
103
104 else if (normal3f)
105 {
108 for (
i = 0;
i <
model->surfmesh.num_vertices;
i++,
n += 3,
b++, normal3f += 3)
109 {
112 }
113 }
114
115 if (svector3f)
116 {
117 const float *
RESTRICT svec =
model->surfmesh.data_svector3f;
119 for (
i = 0;
i <
model->surfmesh.num_vertices;
i++, svec += 3,
b++, svector3f += 3)
120 {
123 }
124 }
125
126 if (tvector3f)
127 {
128 const float *
RESTRICT tvec =
model->surfmesh.data_tvector3f;
130 for (
i = 0;
i <
model->surfmesh.num_vertices;
i++, tvec += 3,
b++, tvector3f += 3)
131 {
134 }
135 }
136}
#define TRANSFORM_VECTOR(in, out)
#define TRANSFORM_POSITION(in, out)
void * Mod_Skeletal_AnimateVertices_AllocBuffers(size_t nbytes)
void Mod_Skeletal_BuildTransforms(const model_t *RESTRICT model, const frameblend_t *RESTRICT frameblend, const skeleton_t *skeleton, float *RESTRICT bonepose, float *RESTRICT boneposerelative)