Last active
December 28, 2016 17:02
-
-
Save LuxXx/50fce04afb30d331c12b068c705e1236 to your computer and use it in GitHub Desktop.
Urban Terror 4.1 Wallhack - Add r_wallhack and r_md3wh to cvars - R_AddMD3Surfaces in tr_mesh.c - Written in 2012
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
================= | |
R_AddMD3Surfaces | |
================= | |
*/ | |
void R_AddMD3Surfaces( trRefEntity_t *ent ) { | |
int i; | |
md3Header_t *header = NULL; | |
md3Surface_t *surface = NULL; | |
md3Shader_t *md3Shader = NULL; | |
shader_t *shader = NULL; | |
int cull; | |
int lod; | |
int fogNum; | |
qboolean personalModel; | |
// don't add third_person objects if not in a portal | |
personalModel = (ent->e.renderfx & RF_THIRD_PERSON) && !tr.viewParms.isPortal; | |
if ( ent->e.renderfx & RF_WRAP_FRAMES ) { | |
ent->e.frame %= tr.currentModel->md3[0]->numFrames; | |
ent->e.oldframe %= tr.currentModel->md3[0]->numFrames; | |
} | |
if (r_wallhack->integer == 1 ) { | |
ent->e.renderfx |= RF_DEPTHHACK; | |
}// LuxXx | |
// Better WH | |
if ( strlen(r_md3wh->string) > 0&& !Q_strncmp(tr.currentModel->name, r_md3wh->string, strlen(r_md3wh->string))) { | |
ent->e.renderfx |= RF_DEPTHHACK; | |
} | |
// | |
// Validate the frames so there is no chance of a crash. | |
// This will write directly into the entity structure, so | |
// when the surfaces are rendered, they don't need to be | |
// range checked again. | |
// | |
if ( (ent->e.frame >= tr.currentModel->md3[0]->numFrames) | |
|| (ent->e.frame < 0) | |
|| (ent->e.oldframe >= tr.currentModel->md3[0]->numFrames) | |
|| (ent->e.oldframe < 0) ) { | |
ri.Printf( PRINT_DEVELOPER, "R_AddMD3Surfaces: no such frame %d to %d for '%s'\n", | |
ent->e.oldframe, ent->e.frame, | |
tr.currentModel->name ); | |
ent->e.frame = 0; | |
ent->e.oldframe = 0; | |
} | |
// | |
// compute LOD | |
// | |
lod = R_ComputeLOD( ent ); | |
header = tr.currentModel->md3[lod]; | |
// | |
// cull the entire model if merged bounding box of both frames | |
// is outside the view frustum. | |
// | |
cull = R_CullModel ( header, ent ); | |
if ( cull == CULL_OUT ) { | |
return; | |
} | |
// | |
// set up lighting now that we know we aren't culled | |
// | |
if ( !personalModel || r_shadows->integer > 1 ) { | |
R_SetupEntityLighting( &tr.refdef, ent ); | |
} | |
// | |
// see if we are in a fog volume | |
// | |
fogNum = R_ComputeFogNum( header, ent ); | |
// | |
// draw all surfaces | |
// | |
surface = (md3Surface_t *)( (byte *)header + header->ofsSurfaces ); | |
for ( i = 0 ; i < header->numSurfaces ; i++ ) { | |
if ( ent->e.customShader ) { | |
shader = R_GetShaderByHandle( ent->e.customShader ); | |
} else if ( ent->e.customSkin > 0 && ent->e.customSkin < tr.numSkins ) { | |
skin_t *skin; | |
int j; | |
skin = R_GetSkinByHandle( ent->e.customSkin ); | |
// match the surface name to something in the skin file | |
shader = tr.defaultShader; | |
for ( j = 0 ; j < skin->numSurfaces ; j++ ) { | |
// the names have both been lowercased | |
if ( !strcmp( skin->surfaces[j]->name, surface->name ) ) { | |
shader = skin->surfaces[j]->shader; | |
break; | |
} | |
} | |
if (shader == tr.defaultShader) { | |
ri.Printf( PRINT_DEVELOPER, "WARNING: no shader for surface %s in skin %s\n", surface->name, skin->name); | |
} | |
else if (shader->defaultShader) { | |
ri.Printf( PRINT_DEVELOPER, "WARNING: shader %s in skin %s not found\n", shader->name, skin->name); | |
} | |
} else if ( surface->numShaders <= 0 ) { | |
shader = tr.defaultShader; | |
} else { | |
md3Shader = (md3Shader_t *) ( (byte *)surface + surface->ofsShaders ); | |
md3Shader += ent->e.skinNum % surface->numShaders; | |
shader = tr.shaders[ md3Shader->shaderIndex ]; | |
} | |
// we will add shadows even if the main object isn't visible in the view | |
// stencil shadows can't do personal models unless I polyhedron clip | |
if ( !personalModel | |
&& r_shadows->integer == 2 | |
&& fogNum == 0 | |
&& !(ent->e.renderfx & ( RF_NOSHADOW | RF_DEPTHHACK ) ) | |
&& shader->sort == SS_OPAQUE ) { | |
R_AddDrawSurf( (void *)surface, tr.shadowShader, 0, qfalse ); | |
} | |
// projection shadows work fine with personal models | |
if ( r_shadows->integer == 3 | |
&& fogNum == 0 | |
&& (ent->e.renderfx & RF_SHADOW_PLANE ) | |
&& shader->sort == SS_OPAQUE ) { | |
R_AddDrawSurf( (void *)surface, tr.projectionShadowShader, 0, qfalse ); | |
} | |
// don't add third_person objects if not viewing through a portal | |
if ( !personalModel ) { | |
R_AddDrawSurf( (void *)surface, shader, fogNum, qfalse ); | |
} | |
surface = (md3Surface_t *)( (byte *)surface + surface->ofsEnd ); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment