SHARE
TWEET

MDL normals

a guest Oct 20th, 2014 181 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void R_BuildFrameNormals (aliashdr_t *hdr, trivertx_t *verts, dtriangle_t *triangles, vertexnormals_t *vnorms)
  2. {
  3.         for (int i = 0; i < hdr->numverts; i++)
  4.         {
  5.                 // no normals initially
  6.                 Vector3Clear (vnorms[i].normal);
  7.                 vnorms[i].numnormals = 0;
  8.         }
  9.  
  10.         for (int i = 0; i < hdr->numtris; i++)
  11.         {
  12.                 float triverts[3][3];
  13.                 float vtemp1[3], vtemp2[3], normal[3];
  14.                 int *vertindexes = triangles[i].vertindex;
  15.  
  16.                 // undo the vertex rotation from modelgen.c here too
  17.                 for (int j = 0; j < 3; j++)
  18.                 {
  19.                         triverts[j][0] = (float) verts[vertindexes[j]].v[1] * hdr->scale[1] + hdr->scale_origin[1];
  20.                         triverts[j][1] = -((float) verts[vertindexes[j]].v[0] * hdr->scale[0] + hdr->scale_origin[0]);
  21.                         triverts[j][2] = (float) verts[vertindexes[j]].v[2] * hdr->scale[2] + hdr->scale_origin[2];
  22.                 }
  23.  
  24.                 // calc the per-triangle normal
  25.                 Vector3Subtract (vtemp1, triverts[0], triverts[1]);
  26.                 Vector3Subtract (vtemp2, triverts[2], triverts[1]);
  27.                 Vector3Cross (normal, vtemp1, vtemp2);
  28.                 Vector3Normalize (normal);
  29.  
  30.                 // rotate the normal so the model faces down the positive x axis
  31.                 float newnormal[3] = {-normal[1], normal[0], normal[2]};
  32.  
  33.                 // and accumulate it into the calculated normals array
  34.                 for (int j = 0; j < 3; j++)
  35.                 {
  36.                         Vector3Add (vnorms[vertindexes[j]].normal, vnorms[vertindexes[j]].normal, newnormal);
  37.                         vnorms[vertindexes[j]].numnormals++;
  38.                 }
  39.         }
  40.  
  41.         // copy out normals
  42.         for (int i = 0; i < hdr->numverts; i++)
  43.         {
  44.                 // numnormals was checked for > 0 in modelgen.c so we shouldn't need to do it again
  45.                 // here but we do anyway just in case a rogue modder has used a bad modelling tool
  46.                 if (vnorms[i].numnormals > 0)
  47.                 {
  48.                         Vector3Scalef (vnorms[i].normal, vnorms[i].normal, (float) vnorms[i].numnormals);
  49.                         Vector3Normalize (vnorms[i].normal);
  50.                 }
  51.                 else Vector3Set (vnorms[i].normal, 0.0f, 0.0f, 1.0f);
  52.         }
  53. }
RAW Paste Data
Top