int R_MDRComputeFogNum( mdrHeader_t *header, trRefEntity_t *ent ) { int i, j; fog_t *fog; mdrFrame_t *mdrFrame; vec3_t localOrigin; int frameSize; if ( tr.refdef.rdflags & RDF_NOWORLDMODEL ) { return 0; } frameSize = (size_t)( &((mdrFrame_t *)0)->bones[ header->numBones ] ); // FIXME: non-normalized axis issues mdrFrame = ( mdrFrame_t * ) ( ( byte * ) header + header->ofsFrames + frameSize * ent->e.frame); VectorAdd( ent->e.origin, mdrFrame->localOrigin, localOrigin ); for ( i = 1 ; i < tr.world->numfogs ; i++ ) { fog = &tr.world->fogs[i]; for ( j = 0 ; j < 3 ; j++ ) { if ( localOrigin[j] - mdrFrame->radius >= fog->bounds[1][j] ) { break; } if ( localOrigin[j] + mdrFrame->radius <= fog->bounds[0][j] ) { break; } } if ( j == 3 ) { return i; } } return R_DefaultFogNum(); }
/* ================= R_ComputeIQMFogNum ================= */ int R_ComputeIQMFogNum( iqmData_t *data, trRefEntity_t *ent ) { int i, j; fog_t *fog; const vec_t *bounds; const vec_t defaultBounds[6] = { -8, -8, -8, 8, 8, 8 }; vec3_t diag, center; vec3_t localOrigin; vec_t radius; if ( tr.refdef.rdflags & RDF_NOWORLDMODEL ) { return 0; } // FIXME: non-normalized axis issues if (data->bounds) { bounds = data->bounds + 6*ent->e.frame; } else { bounds = defaultBounds; } VectorSubtract( bounds+3, bounds, diag ); VectorMA( bounds, 0.5f, diag, center ); VectorAdd( ent->e.origin, center, localOrigin ); radius = 0.5f * VectorLength( diag ); for ( i = 1 ; i < tr.world->numfogs ; i++ ) { fog = &tr.world->fogs[i]; for ( j = 0 ; j < 3 ; j++ ) { if ( localOrigin[j] - radius >= fog->bounds[1][j] ) { break; } if ( localOrigin[j] + radius <= fog->bounds[0][j] ) { break; } } if ( j == 3 ) { return i; } } return R_DefaultFogNum(); }