@@ -63,7 +63,6 @@ typedef struct aliasinstance_s {
63
63
64
64
struct ibuf_s {
65
65
int count ;
66
- int skinnum ;
67
66
entity_t * ent ;
68
67
69
68
struct {
@@ -298,7 +297,7 @@ void R_FlushAliasInstances (qboolean showtris)
298
297
qmodel_t * model ;
299
298
aliashdr_t * paliashdr ;
300
299
qboolean alphatest , translucent , oit , md5 ;
301
- int anim , mode ;
300
+ int skinnum , anim , mode ;
302
301
unsigned state ;
303
302
GLuint buf ;
304
303
GLbyte * ofs ;
@@ -318,10 +317,18 @@ void R_FlushAliasInstances (qboolean showtris)
318
317
// set up textures
319
318
//
320
319
anim = (int )(cl .time * 10 ) & 3 ;
321
- textures [0 ] = paliashdr -> gltextures [ibuf .skinnum ][anim ];
322
- textures [1 ] = paliashdr -> fbtextures [ibuf .skinnum ][anim ];
320
+ skinnum = ibuf .ent -> skinnum ;
321
+ if ((skinnum >= paliashdr -> numskins ) || (skinnum < 0 ))
322
+ {
323
+ Con_DPrintf ("R_DrawAliasModel: no such skin # %d for '%s'\n" , skinnum , model -> name );
324
+ // ericw -- display skin 0 for winquake compatibility
325
+ skinnum = 0 ;
326
+ }
327
+
328
+ textures [0 ] = paliashdr -> gltextures [skinnum ][anim ];
329
+ textures [1 ] = paliashdr -> fbtextures [skinnum ][anim ];
323
330
if (ibuf .ent -> colormap != vid .colormap && !gl_nocolors .value )
324
- if (PTR_IN_RANGE (ibuf .ent , cl_entities + 1 , cl_entities + cl . maxclients )) /* && !strcmp (ibuf.ent->model->name, "progs/player.mdl") */
331
+ if (CL_IsPlayerEnt (ibuf .ent )) /* && !strcmp (ibuf.ent->model->name, "progs/player.mdl") */
325
332
textures [0 ] = playertextures [ibuf .ent - cl_entities - 1 ];
326
333
327
334
if (!gl_fullbrights .value )
@@ -430,6 +437,32 @@ void R_FlushAliasInstances (qboolean showtris)
430
437
GL_EndGroup ();
431
438
}
432
439
440
+ /*
441
+ =================
442
+ R_Alias_CanAddToBatch
443
+ =================
444
+ */
445
+ static qboolean R_Alias_CanAddToBatch (const entity_t * e )
446
+ {
447
+ // empty batch
448
+ if (!ibuf .count )
449
+ return true;
450
+
451
+ // full batch
452
+ if (ibuf .count == countof (ibuf .inst ))
453
+ return false;
454
+
455
+ // different models/skins
456
+ if (ibuf .ent -> model != e -> model || ibuf .ent -> skinnum != e -> skinnum )
457
+ return false;
458
+
459
+ // players have custom colors
460
+ if (!gl_nocolors .value && CL_IsPlayerEnt (ibuf .ent ))
461
+ return false;
462
+
463
+ return true;
464
+ }
465
+
433
466
/*
434
467
=================
435
468
R_DrawAliasModel_Real
@@ -438,7 +471,6 @@ R_DrawAliasModel_Real
438
471
static void R_DrawAliasModel_Real (entity_t * e , qboolean showtris )
439
472
{
440
473
aliashdr_t * paliashdr ;
441
- int skinnum ;
442
474
lerpdata_t lerpdata ;
443
475
float fovscale = 1.0f ;
444
476
float model_matrix [16 ];
@@ -501,19 +533,6 @@ static void R_DrawAliasModel_Real (entity_t *e, qboolean showtris)
501
533
rs_aliaspolys += paliashdr -> numtris ;
502
534
R_SetupAliasLighting (e );
503
535
504
- //
505
- // set up textures
506
- //
507
- skinnum = e -> skinnum ;
508
- if ((skinnum >= paliashdr -> numskins ) || (skinnum < 0 ))
509
- {
510
- Con_DPrintf ("R_DrawAliasModel: no such skin # %d for '%s'\n" , skinnum , e -> model -> name );
511
- // ericw -- display skin 0 for winquake compatibility
512
- skinnum = 0 ;
513
- }
514
- if (r_lightmap_cheatsafe || showtris )
515
- skinnum = 0 ;
516
-
517
536
//
518
537
// draw it
519
538
//
@@ -524,21 +543,11 @@ static void R_DrawAliasModel_Real (entity_t *e, qboolean showtris)
524
543
if (showtris )
525
544
entalpha = 1.f ;
526
545
527
- if (ibuf .count )
528
- {
529
- if (ibuf .count == countof (ibuf .inst ) ||
530
- ibuf .ent -> model != e -> model ||
531
- ibuf .skinnum != skinnum )
532
- {
533
- R_FlushAliasInstances (showtris );
534
- }
535
- }
546
+ if (!R_Alias_CanAddToBatch (e ))
547
+ R_FlushAliasInstances (showtris );
536
548
537
549
if (!ibuf .count )
538
- {
539
550
ibuf .ent = e ;
540
- ibuf .skinnum = skinnum ;
541
- }
542
551
543
552
instance = & ibuf .inst [ibuf .count ++ ];
544
553
0 commit comments