/* * R_DrawCoronas */ void R_DrawCoronas( void ) { unsigned int i; float dist; dlight_t *light; rtrace_t tr; if( r_dynamiclight->integer != 2 ) return; for( i = 0; i < rsc.numDlights; i++ ) { light = rsc.dlights + i; dist = rn.viewAxis[AXIS_FORWARD+0] * ( light->origin[0] - rn.viewOrigin[0] ) + rn.viewAxis[AXIS_FORWARD+1] * ( light->origin[1] - rn.viewOrigin[1] ) + rn.viewAxis[AXIS_FORWARD+2] * ( light->origin[2] - rn.viewOrigin[2] ); if( dist < 24.0f ) continue; dist -= light->intensity; R_TraceLine( &tr, light->origin, rn.viewOrigin, SURF_NONSOLID ); if( tr.fraction != 1.0f ) continue; R_AddDSurfToDrawList( rsc.worldent, R_FogForSphere( light->origin, 1 ), r_coronaShader, Distance( rn.viewOrigin, light->origin ), 0, NULL, &r_coronaSurfs[i] ); } }
/* * RF_GetShaderForOrigin * * Trace 64 units in all axial directions to find the closest surface */ shader_t *RF_GetShaderForOrigin( const vec3_t origin ) { int i, j; vec3_t dir, end; rtrace_t tr; shader_t *best = NULL; float best_frac = 1000.0f; for( i = 0; i < 3; i++ ) { VectorClear( dir ); for( j = -1; j <= 1; j += 2 ) { dir[i] = j; VectorMA( origin, 64, dir, end ); R_TraceLine( &tr, origin, end, 0 ); if( !tr.shader ) { continue; } if( tr.fraction < best_frac ) { best = tr.shader; best_frac = tr.fraction; } } } return best; }
/* * R_RenderDebugSurface */ static void R_RenderDebugSurface( const refdef_t *fd ) { rtrace_t tr; vec3_t forward; vec3_t start, end; msurface_t *surf; if( fd->rdflags & RDF_NOWORLDMODEL ) return; if( r_speeds->integer != 4 && r_speeds->integer != 5 ) return; VectorCopy( &fd->viewaxis[AXIS_FORWARD], forward ); VectorCopy( fd->vieworg, start ); VectorMA( start, 4096, forward, end ); surf = R_TraceLine( &tr, start, end, 0 ); if( surf && surf->drawSurf && !r_showtris->integer ) { R_ClearDrawList( rn.meshlist ); R_ClearDrawList( rn.portalmasklist ); if( !R_AddSurfToDrawList( rn.meshlist, R_NUM2ENT(tr.ent), NULL, surf->shader, 0, 0, NULL, surf->drawSurf ) ) { return; } if( rn.refdef.rdflags & RDF_FLIPPED ) RB_FlipFrontFace(); rsc.debugSurface = surf; if( r_speeds->integer == 5 ) { // VBO debug mode R_AddVBOSlice( surf->drawSurf - rsh.worldBrushModel->drawSurfaces, surf->drawSurf->numVerts, surf->drawSurf->numElems, 0, 0 ); } else { // classic mode (showtris for individual surface) R_AddVBOSlice( surf->drawSurf - rsh.worldBrushModel->drawSurfaces, surf->mesh->numVerts, surf->mesh->numElems, surf->firstDrawSurfVert, surf->firstDrawSurfElem ); } R_DrawOutlinedSurfaces( rn.meshlist ); if( rn.refdef.rdflags & RDF_FLIPPED ) RB_FlipFrontFace(); } }