/* ================= R_AComputeFogNum ================= */ static int R_AComputeFogNum( md4Header_t *header, trRefEntity_t *ent ) { int i; fog_t *fog; md4Frame_t *frame; vec3_t localOrigin; int frameSize; if ( tr.refdef.rdflags & RDF_NOWORLDMODEL ) { return 0; } if (header->ofsFrames<0) // Compressed { frameSize = (int)( &((md4CompFrame_t *)0)->bones[ header->numBones ] ); frame = (md4Frame_t *)((byte *)header - header->ofsFrames + ent->e.frame * frameSize ); // HACK! These frames actually are md4CompFrames, but the first fields are the same, // so this will work for this routine. } else { frameSize = (int)( &((md4Frame_t *)0)->bones[ header->numBones ] ); frame = (md4Frame_t *)((byte *)header + header->ofsFrames + ent->e.frame * frameSize ); } VectorAdd( ent->e.origin, frame->localOrigin, localOrigin ); int partialFog = 0; for ( i = 1 ; i < tr.world->numfogs ; i++ ) { fog = &tr.world->fogs[i]; if ( localOrigin[0] - frame->radius >= fog->bounds[0][0] && localOrigin[0] + frame->radius <= fog->bounds[1][0] && localOrigin[1] - frame->radius >= fog->bounds[0][1] && localOrigin[1] + frame->radius <= fog->bounds[1][1] && localOrigin[2] - frame->radius >= fog->bounds[0][2] && localOrigin[2] + frame->radius <= fog->bounds[1][2] ) {//totally inside it return i; break; } if ( ( localOrigin[0] - frame->radius >= fog->bounds[0][0] && localOrigin[1] - frame->radius >= fog->bounds[0][1] && localOrigin[2] - frame->radius >= fog->bounds[0][2] && localOrigin[0] - frame->radius <= fog->bounds[1][0] && localOrigin[1] - frame->radius <= fog->bounds[1][1] && localOrigin[2] - frame->radius <= fog->bounds[1][2] ) || ( localOrigin[0] + frame->radius >= fog->bounds[0][0] && localOrigin[1] + frame->radius >= fog->bounds[0][1] && localOrigin[2] + frame->radius >= fog->bounds[0][2] && localOrigin[0] + frame->radius <= fog->bounds[1][0] && localOrigin[1] + frame->radius <= fog->bounds[1][1] && localOrigin[2] + frame->radius <= fog->bounds[1][2] ) ) {//partially inside it if ( tr.refdef.fogIndex == i || R_FogParmsMatch( tr.refdef.fogIndex, i ) ) {//take new one only if it's the same one that the viewpoint is in return i; break; } else if ( !partialFog ) {//first partialFog partialFog = i; } } } //if all else fails, return the first partialFog return partialFog; }
/* ================= R_ComputeFogNum ================= */ static int R_ComputeFogNum( md3Header_t *header, trRefEntity_t *ent ) { int i; fog_t *fog; md3Frame_t *md3Frame; vec3_t localOrigin; if ( tr.refdef.rdflags & RDF_NOWORLDMODEL ) { return 0; } if ( tr.refdef.doLAGoggles ) { return tr.world->numfogs; } // FIXME: non-normalized axis issues md3Frame = ( md3Frame_t * ) ( ( byte * ) header + header->ofsFrames ) + ent->e.frame; VectorAdd( ent->e.origin, md3Frame->localOrigin, localOrigin ); int partialFog = 0; for ( i = 1 ; i < tr.world->numfogs ; i++ ) { fog = &tr.world->fogs[i]; if ( localOrigin[0] - md3Frame->radius >= fog->bounds[0][0] && localOrigin[0] + md3Frame->radius <= fog->bounds[1][0] && localOrigin[1] - md3Frame->radius >= fog->bounds[0][1] && localOrigin[1] + md3Frame->radius <= fog->bounds[1][1] && localOrigin[2] - md3Frame->radius >= fog->bounds[0][2] && localOrigin[2] + md3Frame->radius <= fog->bounds[1][2] ) {//totally inside it return i; break; } if ( ( localOrigin[0] - md3Frame->radius >= fog->bounds[0][0] && localOrigin[1] - md3Frame->radius >= fog->bounds[0][1] && localOrigin[2] - md3Frame->radius >= fog->bounds[0][2] && localOrigin[0] - md3Frame->radius <= fog->bounds[1][0] && localOrigin[1] - md3Frame->radius <= fog->bounds[1][1] && localOrigin[2] - md3Frame->radius <= fog->bounds[1][2]) || ( localOrigin[0] + md3Frame->radius >= fog->bounds[0][0] && localOrigin[1] + md3Frame->radius >= fog->bounds[0][1] && localOrigin[2] + md3Frame->radius >= fog->bounds[0][2] && localOrigin[0] + md3Frame->radius <= fog->bounds[1][0] && localOrigin[1] + md3Frame->radius <= fog->bounds[1][1] && localOrigin[2] + md3Frame->radius <= fog->bounds[1][2] ) ) {//partially inside it if ( tr.refdef.fogIndex == i || R_FogParmsMatch( tr.refdef.fogIndex, i ) ) {//take new one only if it's the same one that the viewpoint is in return i; break; } else if ( !partialFog ) {//first partialFog partialFog = i; } } } //if all else fails, return the first partialFog return partialFog; }
/* ================= R_SpriteFogNum See if a sprite is inside a fog volume ================= */ int R_SpriteFogNum( trRefEntity_t *ent ) { int i; fog_t *fog; if ( tr.refdef.rdflags & RDF_NOWORLDMODEL ) { return 0; } if (tr.refdef.doLAGoggles) { return tr.world->numfogs; } int partialFog = 0; for ( i = 1 ; i < tr.world->numfogs ; i++ ) { fog = &tr.world->fogs[i]; if ( ent->e.origin[0] - ent->e.radius >= fog->bounds[0][0] && ent->e.origin[0] + ent->e.radius <= fog->bounds[1][0] && ent->e.origin[1] - ent->e.radius >= fog->bounds[0][1] && ent->e.origin[1] + ent->e.radius <= fog->bounds[1][1] && ent->e.origin[2] - ent->e.radius >= fog->bounds[0][2] && ent->e.origin[2] + ent->e.radius <= fog->bounds[1][2] ) {//totally inside it return i; break; } if ( ( ent->e.origin[0] - ent->e.radius >= fog->bounds[0][0] && ent->e.origin[1] - ent->e.radius >= fog->bounds[0][1] && ent->e.origin[2] - ent->e.radius >= fog->bounds[0][2] && ent->e.origin[0] - ent->e.radius <= fog->bounds[1][0] && ent->e.origin[1] - ent->e.radius <= fog->bounds[1][1] && ent->e.origin[2] - ent->e.radius <= fog->bounds[1][2] ) || ( ent->e.origin[0] + ent->e.radius >= fog->bounds[0][0] && ent->e.origin[1] + ent->e.radius >= fog->bounds[0][1] && ent->e.origin[2] + ent->e.radius >= fog->bounds[0][2] && ent->e.origin[0] + ent->e.radius <= fog->bounds[1][0] && ent->e.origin[1] + ent->e.radius <= fog->bounds[1][1] && ent->e.origin[2] + ent->e.radius <= fog->bounds[1][2] ) ) {//partially inside it if ( tr.refdef.fogIndex == i || R_FogParmsMatch( tr.refdef.fogIndex, i ) ) {//take new one only if it's the same one that the viewpoint is in return i; break; } else if ( !partialFog ) {//first partialFog partialFog = i; } } } return partialFog; }