@@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
2222*/
2323// tr_models.c -- model loading and caching
2424#include " tr_local.h"
25+ #include " framework/Omp.h"
2526
2627#define LL (x ) x = LittleLong(x)
2728#define LF (x ) x = LittleFloat(x)
@@ -33,8 +34,6 @@ R_LoadMD3
3334*/
3435bool R_LoadMD3 ( model_t *mod, int lod, const void *buffer, const char *modName )
3536{
36- int i, j, k; // , l;
37-
3837 md3Header_t *md3Model;
3938 md3Frame_t *md3Frame;
4039 md3Surface_t *md3Surf;
@@ -47,7 +46,6 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
4746 mdvModel_t *mdvModel;
4847 mdvFrame_t *frame;
4948 mdvSurface_t *surf; // , *surface;
50- srfTriangle_t *tri;
5149 mdvXyz_t *v;
5250 mdvNormal_t *n;
5351 mdvSt_t *st;
@@ -94,11 +92,11 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
9492
9593 md3Frame = ( md3Frame_t * )( ( byte * ) md3Model + md3Model->ofsFrames );
9694
97- for ( i = 0 ; i < md3Model->numFrames ; i++, frame++, md3Frame++ )
95+ for ( size_t i = 0 ; i < md3Model->numFrames ; i++, frame++, md3Frame++ )
9896 {
9997 frame->radius = LittleFloat ( md3Frame->radius );
10098
101- for ( j = 0 ; j < 3 ; j++ )
99+ for ( size_t j = 0 ; j < 3 ; j++ )
102100 {
103101 frame->bounds [ 0 ][ j ] = LittleFloat ( md3Frame->bounds [ 0 ][ j ] );
104102 frame->bounds [ 1 ][ j ] = LittleFloat ( md3Frame->bounds [ 1 ][ j ] );
@@ -112,9 +110,9 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
112110
113111 md3Tag = ( md3Tag_t * )( ( byte * ) md3Model + md3Model->ofsTags );
114112
115- for ( i = 0 ; i < md3Model->numTags * md3Model->numFrames ; i++, tag++, md3Tag++ )
113+ for ( size_t i = 0 ; i < md3Model->numTags * md3Model->numFrames ; i++, tag++, md3Tag++ )
116114 {
117- for ( j = 0 ; j < 3 ; j++ )
115+ for ( size_t j = 0 ; j < 3 ; j++ )
118116 {
119117 tag->origin [ j ] = LittleFloat ( md3Tag->origin [ j ] );
120118 tag->axis [ 0 ][ j ] = LittleFloat ( md3Tag->axis [ 0 ][ j ] );
@@ -127,7 +125,7 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
127125
128126 md3Tag = ( md3Tag_t * )( ( byte * ) md3Model + md3Model->ofsTags );
129127
130- for ( i = 0 ; i < md3Model->numTags ; i++, tagName++, md3Tag++ )
128+ for ( size_t i = 0 ; i < md3Model->numTags ; i++, tagName++, md3Tag++ )
131129 {
132130 Q_strncpyz ( tagName->name , md3Tag->name , sizeof ( tagName->name ) );
133131 }
@@ -138,7 +136,7 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
138136
139137 md3Surf = ( md3Surface_t * )( ( byte * ) md3Model + md3Model->ofsSurfaces );
140138
141- for ( i = 0 ; i < md3Model->numSurfaces ; i++ )
139+ for ( size_t i = 0 ; i < md3Model->numSurfaces ; i++ )
142140 {
143141 LL ( md3Surf->ident );
144142 LL ( md3Surf->flags );
@@ -178,7 +176,7 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
178176
179177 // strip off a trailing _1 or _2
180178 // this is a crutch for q3data being a mess
181- j = strlen ( surf->name );
179+ size_t j = strlen ( surf->name );
182180
183181 if ( j > 2 && surf->name [ j - 2 ] == ' _' )
184182 {
@@ -191,6 +189,8 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
191189
192190 // swap all the triangles
193191 surf->numTriangles = md3Surf->numTriangles ;
192+
193+ srfTriangle_t *tri;
194194 surf->triangles = tri = (srfTriangle_t*) ri.Hunk_Alloc ( sizeof ( *tri ) * md3Surf->numTriangles , ha_pref::h_low );
195195
196196 md3Tri = ( md3Triangle_t * )( ( byte * ) md3Surf + md3Surf->ofsTriangles );
@@ -246,12 +246,11 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
246246 srfVBOMDVMesh_t *vboSurf;
247247 glIndex_t *indexes;
248248
249- int f;
250-
251249 std::vector<srfVBOMDVMesh_t *> vboSurfaces;
252250 vboSurfaces.reserve ( 10 );
253251
254- for ( i = 0 , surf = mdvModel->surfaces ; i < mdvModel->numSurfaces ; i++, surf++ )
252+ surf = mdvModel->surfaces ;
253+ for ( size_t i = 0 ; i < mdvModel->numSurfaces ; i++, surf++ )
255254 {
256255 // allocate temp memory for vertex data
257256 vec3_t *scaledPosition = (vec3_t *)ri.Hunk_AllocateTempMemory ( sizeof ( vec3_t ) * mdvModel->numFrames * surf->numVerts );
@@ -264,35 +263,33 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
264263
265264 // calc and feed tangent spaces
266265 {
267- const float *v0, *v1, *v2;
268- const float *t0, *t1, *t2;
269- vec3_t tangent, *tangents;
270- vec3_t binormal, *binormals;
266+ vec3_t *tangents = (vec3_t *)ri.Hunk_AllocateTempMemory ( surf->numVerts * sizeof ( vec3_t ) );
267+ vec3_t *binormals = (vec3_t *)ri.Hunk_AllocateTempMemory ( surf->numVerts * sizeof ( vec3_t ) );
271268
272- tangents = (vec3_t *)ri.Hunk_AllocateTempMemory ( surf->numVerts * sizeof ( vec3_t ) );
273- binormals = (vec3_t *)ri.Hunk_AllocateTempMemory ( surf->numVerts * sizeof ( vec3_t ) );
274-
275- for ( f = 0 ; f < mdvModel->numFrames ; f++ )
269+ for ( size_t f = 0 ; f < mdvModel->numFrames ; f++ )
276270 {
277- for ( j = 0 ; j < ( surf->numVerts ); j++ )
271+ for ( size_t j = 0 ; j < ( surf->numVerts ); j++ )
278272 {
279273 VectorClear ( tangents[ j ] );
280274 VectorClear ( binormals[ j ] );
281275 }
282276
283- for ( j = 0 , tri = surf-> triangles ; j < surf-> numTriangles ; j++, tri++ )
277+ auto task0 = [&]( const size_t & j ) -> void
284278 {
285- v0 = surf->verts [ surf->numVerts * f + tri->indexes [ 0 ] ].xyz ;
286- v1 = surf->verts [ surf->numVerts * f + tri->indexes [ 1 ] ].xyz ;
287- v2 = surf->verts [ surf->numVerts * f + tri->indexes [ 2 ] ].xyz ;
279+ srfTriangle_t *tri = surf->triangles + j;
280+
281+ const float *v0 = surf->verts [ surf->numVerts * f + tri->indexes [ 0 ] ].xyz ;
282+ const float *v1 = surf->verts [ surf->numVerts * f + tri->indexes [ 1 ] ].xyz ;
283+ const float *v2 = surf->verts [ surf->numVerts * f + tri->indexes [ 2 ] ].xyz ;
288284
289- t0 = surf->st [ tri->indexes [ 0 ] ].st ;
290- t1 = surf->st [ tri->indexes [ 1 ] ].st ;
291- t2 = surf->st [ tri->indexes [ 2 ] ].st ;
285+ const float * t0 = surf->st [ tri->indexes [ 0 ] ].st ;
286+ const float * t1 = surf->st [ tri->indexes [ 1 ] ].st ;
287+ const float * t2 = surf->st [ tri->indexes [ 2 ] ].st ;
292288
289+ vec3_t tangent, binormal;
293290 R_CalcTangents ( tangent, binormal, v0, v1, v2, t0, t1, t2 );
294291
295- for ( k = 0 ; k < 3 ; k++ )
292+ for ( size_t k = 0 ; k < 3 ; k++ )
296293 {
297294 float *w;
298295
@@ -302,17 +299,21 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
302299 w = binormals[ tri->indexes [ k ] ];
303300 VectorAdd ( w, binormal, w );
304301 }
305- }
302+ };
306303
307- for ( j = 0 ; j < surf->numVerts ; j++ )
304+ Omp::Tasker ( task0, surf->numTriangles );
305+
306+ auto task1 = [&]( const size_t & j ) -> void
308307 {
309308 VectorNormalize ( tangents[ j ] );
310309 VectorNormalize ( binormals[ j ] );
311310 R_TBNtoQtangents (
312311 tangents[ j ], binormals[ j ],
313312 surf->normals [ f * surf->numVerts + j ].normal ,
314313 qtangents[ f * surf->numVerts + j ] );
315- }
314+ };
315+
316+ Omp::Tasker ( task1, surf->numVerts );
316317 }
317318
318319 ri.Hunk_FreeTempMemory ( binormals );
@@ -354,8 +355,11 @@ bool R_LoadMD3( model_t *mod, int lod, const void *buffer, const char *modName )
354355 ri.Hunk_FreeTempMemory ( scaledPosition );
355356
356357 indexes = (glIndex_t *)ri.Hunk_AllocateTempMemory ( 3 * surf->numTriangles * sizeof ( glIndex_t ) );
357- for ( f = j = 0 ; j < surf->numTriangles ; j++ ) {
358- for ( k = 0 ; k < 3 ; k++ ) {
358+
359+ size_t f = 0 ;
360+
361+ for ( size_t j = 0 ; j < surf->numTriangles ; j++ ) {
362+ for ( size_t k = 0 ; k < 3 ; k++ ) {
359363 indexes[ f++ ] = surf->triangles [ j ].indexes [ k ];
360364 }
361365 }
0 commit comments