diff --git a/ref/soft/r_local.h b/ref/soft/r_local.h index e754434f..a9a918ce 100644 --- a/ref/soft/r_local.h +++ b/ref/soft/r_local.h @@ -476,6 +476,7 @@ void R_SetupRefParams( const struct ref_viewpass_s *rvp ); void R_TranslateForEntity( cl_entity_t *e ); void R_RotateForEntity( cl_entity_t *e ); void R_SetupGL( qboolean set_gl_state ); +qboolean R_OpaqueEntity( cl_entity_t *ent ); void R_AllowFog( qboolean allowed ); void R_SetupFrustum( void ); void R_FindViewLeaf( void ); diff --git a/ref/soft/r_main.c b/ref/soft/r_main.c index c3207af3..d51e5cab 100644 --- a/ref/soft/r_main.c +++ b/ref/soft/r_main.c @@ -145,7 +145,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 ) { int rendermode = R_GetEntityRenderMode( ent ); diff --git a/ref/soft/r_studio.c b/ref/soft/r_studio.c index 55fe5ddc..0da4909d 100644 --- a/ref/soft/r_studio.c +++ b/ref/soft/r_studio.c @@ -3293,7 +3293,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 ) { @@ -3326,26 +3326,47 @@ 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 ); } } + /* ================= R_RunViewmodelEvents