+ // calculate texture matrix for triangle
+ // 20 assignments
+ voffset = e[0];
+ vert[0][0] = vertex3f[voffset*3+0];
+ vert[0][1] = vertex3f[voffset*3+1];
+ vert[0][2] = vertex3f[voffset*3+2];
+ vert[0][3] = texcoord2f[voffset*2];
+ voffset = e[1];
+ vert[1][0] = vertex3f[voffset*3+0];
+ vert[1][1] = vertex3f[voffset*3+1];
+ vert[1][2] = vertex3f[voffset*3+2];
+ vert[1][3] = texcoord2f[voffset*2];
+ voffset = e[2];
+ vert[2][0] = vertex3f[voffset*3+0];
+ vert[2][1] = vertex3f[voffset*3+1];
+ vert[2][2] = vertex3f[voffset*3+2];
+ vert[2][3] = texcoord2f[voffset*2];
+ // 3 assignments, 3 subtracts
+ VectorSubtract(vert[1], vert[0], vec[0]);
+ // 3 assignments, 3 subtracts
+ VectorSubtract(vert[2], vert[0], vec[1]);
+ // 3 assignments, 3 subtracts, 6 multiplies
+ CrossProduct(vec[0], vec[1], normal);
+ // 1 assignment, 2 adds, 3 multiplies, 1 compare
+ if (DotProduct(normal, normal) >= 0.001)
+ {
+ // 4 assignments, 1 rsqrt, 2 adds, 6 multiplies
+ VectorNormalize(normal);
+ tdir[0] = ((vert[1][3] - vert[0][3]) * (vert[2][0] - vert[0][0]) - (vert[2][3] - vert[0][3]) * (vert[1][0] - vert[0][0]));
+ tdir[1] = ((vert[1][3] - vert[0][3]) * (vert[2][1] - vert[0][1]) - (vert[2][3] - vert[0][3]) * (vert[1][1] - vert[0][1]));
+ tdir[2] = ((vert[1][3] - vert[0][3]) * (vert[2][2] - vert[0][2]) - (vert[2][3] - vert[0][3]) * (vert[1][2] - vert[0][2]));
+ // 4 assignments, 1 rsqrt, 2 adds, 6 multiplies
+ VectorNormalize(tdir);
+ // 1 assignments, 1 negates, 2 adds, 3 multiplies
+ f = -DotProduct(tdir, normal);
+ // 3 assignments, 3 adds, 3 multiplies
+ VectorMA(tdir, f, normal, tdir);
+ // 4 assignments, 1 rsqrt, 2 adds, 6 multiplies
+ VectorNormalize(tdir);
+ // 3 assignments, 3 subtracts, 6 multiplies
+ CrossProduct(tdir, normal, sdir);
+ // this is probably not necessary
+ // 4 assignments, 1 rsqrt, 2 adds, 6 multiplies
+ VectorNormalize(sdir);
+ //
+ VectorNegate(sdir, sdir);
+ // accumulate matrix onto verts used by triangle
+ // 30 assignments, 27 adds
+ for (i = 0;i < 3;i++)
+ {
+ voffset = e[i];
+ svector3f[voffset*3 ] += sdir[0];
+ svector3f[voffset*3+1] += sdir[1];
+ svector3f[voffset*3+2] += sdir[2];
+ tvector3f[voffset*3 ] += tdir[0];
+ tvector3f[voffset*3+1] += tdir[1];
+ tvector3f[voffset*3+2] += tdir[2];
+ normal3f[voffset*3 ] += normal[0];
+ normal3f[voffset*3+1] += normal[1];
+ normal3f[voffset*3+2] += normal[2];
+ }
+ }