diff --git a/src/r_data/models/models_ue1.cpp b/src/r_data/models/models_ue1.cpp index bd4f54e3d..16ad497dd 100644 --- a/src/r_data/models/models_ue1.cpp +++ b/src/r_data/models/models_ue1.cpp @@ -83,7 +83,6 @@ void FUE1Model::LoadGeometry() averts = (uint32_t*)(buffer2+sizeof(a3dhead)); dxverts = NULL; } - weaponPoly = -1; // set counters numVerts = dhead->numverts; numFrames = ahead->numframes; @@ -109,6 +108,9 @@ void FUE1Model::LoadGeometry() unpackuvert(averts[j+i*numVerts],2), -unpackuvert(averts[j+i*numVerts],1)); } + // refs will be set later + Vert.P.Reset(); + Vert.nP = 0; // push vertex (without normals, will be calculated later) verts.Push(Vert); } @@ -130,23 +132,26 @@ void FUE1Model::LoadGeometry() dir[0] = verts[Poly.V[1]+numVerts*j].Pos-verts[Poly.V[0]+numVerts*j].Pos; dir[1] = verts[Poly.V[2]+numVerts*j].Pos-verts[Poly.V[0]+numVerts*j].Pos; Poly.Normals.Push((dir[0]^dir[1]).Unit()); + // since we're iterating frames, also set references for later + for ( int k=0; k<3; k++ ) + { + verts[Poly.V[k]+numVerts*j].P.Push(i); + verts[Poly.V[k]+numVerts*j].nP++; + } } // push polys.Push(Poly); } - // compute normals for vertex arrays - // iterates through all polys and compute the average of all facet normals - // from those who use this vertex. not pretty, but does the job + // compute normals for vertex arrays (average of all referenced poly normals) + // since we have references listed from before, this saves a lot of time + // without having to loop through the entire model each vertex (especially true for very complex models) for ( int i=0; i P; // polys that reference this vertex, used in normal computation to save time + int nP; // count of those polys }; struct UE1Poly { @@ -101,7 +103,7 @@ private: int numFrames; int numPolys; int numGroups; - int weaponPoly; // for future model attachment support, unused for now + TArray specialPolys; // for future model attachment support, unused for now TArray verts; TArray polys;