diff --git a/ref/gl/gl_local.h b/ref/gl/gl_local.h index 38c17be9..d91044f2 100644 --- a/ref/gl/gl_local.h +++ b/ref/gl/gl_local.h @@ -399,6 +399,7 @@ void R_TranslateForEntity( cl_entity_t *e ); void R_RotateForEntity( cl_entity_t *e ); void R_SetupGL( qboolean set_gl_state ); void R_AllowFog( qboolean allowed ); +qboolean R_OpaqueEntity( cl_entity_t *ent ); void R_SetupFrustum( void ); void R_FindViewLeaf( void ); void R_CheckGamma( void ); diff --git a/ref/gl/gl_rmain.c b/ref/gl/gl_rmain.c index 995bd3e6..6224d4e5 100644 --- a/ref/gl/gl_rmain.c +++ b/ref/gl/gl_rmain.c @@ -61,7 +61,7 @@ R_OpaqueEntity Opaque entity can be brush or studio model but sprite =============== */ -static qboolean R_OpaqueEntity( cl_entity_t *ent ) +qboolean R_OpaqueEntity( cl_entity_t *ent ) { if( R_GetEntityRenderMode( ent ) == kRenderNormal ) return true; diff --git a/ref/gl/gl_studio.c b/ref/gl/gl_studio.c index 3480d611..3de2dec4 100644 --- a/ref/gl/gl_studio.c +++ b/ref/gl/gl_studio.c @@ -3527,7 +3527,7 @@ static int R_StudioDrawModel( int flags ) R_StudioDrawModelInternal ================= */ -void R_StudioDrawModelInternal( cl_entity_t *e, int flags ) +static void R_StudioDrawModelInternal( cl_entity_t *e, int flags ) { if( !RI.drawWorld ) { @@ -3560,22 +3560,42 @@ void R_DrawStudioModel( cl_entity_t *e ) { R_StudioDrawModelInternal( e, STUDIO_RENDER|STUDIO_EVENTS ); } - else + else if( e->curstate.movetype == MOVETYPE_FOLLOW && e->curstate.aiment > 0 ) { - if( e->curstate.movetype == MOVETYPE_FOLLOW && e->curstate.aiment > 0 ) - { - cl_entity_t *parent = CL_GetEntityByIndex( e->curstate.aiment ); + cl_entity_t *parent = CL_GetEntityByIndex( e->curstate.aiment ), **entities; + uint i, num_entities; - if( parent && parent->model && parent->model->type == mod_studio ) - { - RI.currententity = parent; - R_StudioDrawModelInternal( RI.currententity, 0 ); - VectorCopy( parent->curstate.origin, e->curstate.origin ); - VectorCopy( parent->origin, e->origin ); - RI.currententity = e; - } + if( !parent || !parent->model || parent->model->type != mod_studio ) + return; + + if( R_OpaqueEntity( parent )) + { + entities = tr.draw_list->solid_entities; + num_entities = tr.draw_list->num_solid_entities; + } + else + { + entities = tr.draw_list->trans_entities; + num_entities = tr.draw_list->num_solid_entities; } + for( i = 0; i < num_entities; i++ ) + { + if( (*entities)[i].index != e->curstate.aiment ) + continue; + + RI.currententity = &(*entities)[i]; + R_StudioDrawModelInternal( RI.currententity, 0 ); + VectorCopy( RI.currententity->curstate.origin, e->curstate.origin ); + VectorCopy( RI.currententity->origin, e->origin ); + RI.currententity = e; + + R_StudioDrawModelInternal( e, STUDIO_RENDER|STUDIO_EVENTS ); + break; + } + } + else + { R_StudioDrawModelInternal( e, STUDIO_RENDER|STUDIO_EVENTS ); } }