Skip to content

Commit 1dbd1e0

Browse files
committed
tr_model_md3: parallel MD3 model loading
1 parent b81f9e4 commit 1dbd1e0

File tree

1 file changed

+39
-35
lines changed

1 file changed

+39
-35
lines changed

src/engine/renderer/tr_model_md3.cpp

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
3435
bool 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

Comments
 (0)