barnes14

Untitled

May 3rd, 2021
527
20 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void Mod_BuildMD2Tangents(model_t* mod, dmdl_t* pheader, fstvert_t* poutst)
  2. {
  3.     int             i, j, k, l;
  4.     daliasframe_t* frame;
  5.     dtrivertx_t* verts, * v;
  6.     dtriangle_t* tris = (dtriangle_t*)((byte*)pheader + pheader->ofs_tris);
  7.     int             cx = pheader->num_xyz * pheader->num_frames * sizeof(vec3_t);
  8.     static vec3_t   tangents_[MAX_VERTS], binormals_[MAX_VERTS], normals_[MAX_VERTS];
  9.     static vec3_t* tangents, * binormals, * normals;
  10.  
  11.     mod->binormals = binormals = Hunk_Alloc(cx);
  12.     mod->tangents = tangents = Hunk_Alloc(cx);
  13.     mod->normals = normals = Hunk_Alloc(cx);
  14.  
  15.     mod->memorySize += cx;
  16.     mod->memorySize += cx;
  17.  
  18.         //for all frames
  19.     for (i = 0; i < pheader->num_frames; i++) {
  20.  
  21.         //set temp to zero
  22.         memset(tangents_, 0, pheader->num_xyz * sizeof(vec3_t));
  23.         memset(binormals_, 0, pheader->num_xyz * sizeof(vec3_t));
  24.         memset(normals_, 0, pheader->num_xyz * sizeof(vec3_t));
  25.  
  26.         tris = (dtriangle_t*)((byte*)pheader + pheader->ofs_tris);
  27.         frame = (daliasframe_t*)((byte*)pheader + pheader->ofs_frames + i * pheader->framesize);
  28.         verts = frame->verts;
  29.  
  30.         //for all tris
  31.         for (j = 0; j < pheader->num_tris; j++) {
  32.             vec3_t  edge0, edge1, edge2;
  33.             vec3_t  triangle[3], dir0, dir1;
  34.             vec3_t  tangent, binormal, normal, cross;
  35.  
  36.             for (k = 0; k < 3; k++) {
  37.                 l = tris[j].index_xyz[k];
  38.                 v = &verts[l];
  39.                 for (l = 0; l < 3; l++)
  40.                     triangle[k][l] = v->v[l];
  41.             }
  42.  
  43.             //calc normals
  44.             VectorSubtract(triangle[0], triangle[1], dir0);
  45.             VectorSubtract(triangle[2], triangle[1], dir1);
  46.             CrossProduct(dir1, dir0, normal);
  47.             VectorInvert(normal);
  48.             VectorNormalize(normal);
  49.  
  50.             // calc tangents
  51.             edge0[0] = (float)verts[tris[j].index_xyz[0]].v[0];
  52.             edge0[1] = (float)verts[tris[j].index_xyz[0]].v[1];
  53.             edge0[2] = (float)verts[tris[j].index_xyz[0]].v[2];
  54.             edge1[0] = (float)verts[tris[j].index_xyz[1]].v[0];
  55.             edge1[1] = (float)verts[tris[j].index_xyz[1]].v[1];
  56.             edge1[2] = (float)verts[tris[j].index_xyz[1]].v[2];
  57.             edge2[0] = (float)verts[tris[j].index_xyz[2]].v[0];
  58.             edge2[1] = (float)verts[tris[j].index_xyz[2]].v[1];
  59.             edge2[2] = (float)verts[tris[j].index_xyz[2]].v[2];
  60.  
  61.             R_CalcTangentVectors(edge0, edge1, edge2,
  62.                 &poutst[tris[j].index_st[0]].s,
  63.                 &poutst[tris[j].index_st[1]].s,
  64.                 &poutst[tris[j].index_st[2]].s,
  65.                 tangent, binormal);
  66.  
  67.             // inverse if needed
  68.             CrossProduct(binormal, tangent, cross);
  69.             if (DotProduct(cross, normal) < 0.0) {
  70.                 VectorInvert(tangent);
  71.                 VectorInvert(binormal);
  72.             }
  73.  
  74.             for (k = 0; k < 3; k++) {
  75.                 l = tris[j].index_xyz[k];
  76.                 VectorAdd(tangents_[l], tangent, tangents_[l]);
  77.                 VectorAdd(binormals_[l], binormal, binormals_[l]);
  78.                 VectorAdd(normals_[l], normal, normals_[l]);
  79.             }
  80.         }
  81.  
  82.         for (j = 0; j < pheader->num_xyz; j++)
  83.             for (k = j + 1; k < pheader->num_xyz; k++)
  84.                 if (verts[j].v[0] == verts[k].v[0] && verts[j].v[1] == verts[k].v[1] && verts[j].v[2] == verts[k].v[2]) {
  85.  
  86.                     float* jnormal = q_byteDirs[verts[j].lightnormalindex];
  87.                     float* knormal = q_byteDirs[verts[k].lightnormalindex];
  88.  
  89.                     if (DotProduct(jnormal, knormal) >= smooth_cosine) {
  90.  
  91.                         VectorAdd(tangents_[j], tangents_[k], tangents_[j]);
  92.                         VectorCopy(tangents_[j], tangents_[k]);
  93.  
  94.                         VectorAdd(binormals_[j], binormals_[k], binormals_[j]);
  95.                         VectorCopy(binormals_[j], binormals_[k]);
  96.  
  97.                         VectorAdd(normals_[j], normals_[k], normals_[j]);
  98.                         VectorCopy(normals_[j], normals_[k]);
  99.                     }
  100.                 }
  101.  
  102.         //normalize averages
  103.         for (j = 0; j < pheader->num_xyz; j++) {
  104.  
  105.             VectorNormalize(tangents_[j]);
  106.             VectorNormalize(binormals_[j]);
  107.             VectorNormalize(normals_[j]);
  108.  
  109.             VectorCopy(tangents_[j], mod->tangents[i * pheader->num_xyz + j]);
  110.             VectorCopy(binormals_[j], mod->binormals[i * pheader->num_xyz + j]);
  111.             VectorCopy(normals_[j], mod->normals[i * pheader->num_xyz + j]);
  112.         }
  113.     }
  114.  
  115. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×