From ca65a17b271d34e6eedcbb0bc5f0a3ffb40af3ae Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Wed, 17 Oct 2012 21:17:37 +0000 Subject: From /dev/humancontroller: really fix the confusion with game entity and refentity numbers for any natural number M, the following is logical as a whole: - the array size for refentities is M; - the refentity number limit is M-1, ie., each refentity number is in [0..M-1]; - the special number for the world is M. before r1429, the code was roughly the following: // constants related to the game, should not be used by the renderer // renderer stuff refEntity_t refEntities[MAX_ENTITIES]; int numRefEntities = 0; void addRefEntity(refEntity_t re) { if (numRefEntities >= ENTITYNUM_WORLD) return; // full refEntities[numRefEntities++] = re; } void render(int num) { if (num == ENTITYNUM_WORLD) renderWorld(); else renderRefEntity(refEntities[num]); } so before r1429, - the array size for refentities was 1023; - the refentity number limit was 1021, ie., each refentity number was in [0..1021]; and - the special number for the world entity was 1022. this was a small waste of memory, as the last array element wasn't used. r1429 changed if (numRefEntities >= ENTITYNUM_WORLD) to if (numRefEntities >= MAX_ENTITIES). this creates the following configuration: - the array size for refentities is 1023; - the refentity number limit is 1022, ie., each refentity number is in [0..1022]; and - the special number for the world entity is 1022. r1429 just makes things worse: it allows 1 more refentity to be added, but that entity doesn't get drawn anyway, as its number will be equal to the special number for the world. this is a small waste of not only memory, but also processing time. perhaps in XreaL, ENTITYNUM_WORLD is a game entity constant, and has nothing to do with refentities. a new REFENTITYNUM_WORLD constant should be added to denote the special number for the world, and that constant should be used in the renderer code in place of ENTITYNUM_WORLD. so define such a constant, and let it be equal to MAX_ENTITIES, which is 1023. --- src/renderer/tr_backend.c | 2 +- src/renderer/tr_main.c | 4 ++-- src/renderer/tr_scene.c | 2 +- src/renderer/tr_types.h | 3 +++ src/renderer/tr_world.c | 4 ++-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/renderer/tr_backend.c b/src/renderer/tr_backend.c index ef391019..acf82bd0 100644 --- a/src/renderer/tr_backend.c +++ b/src/renderer/tr_backend.c @@ -577,7 +577,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) { if ( entityNum != oldEntityNum ) { depthRange = isCrosshair = qfalse; - if ( entityNum != ENTITYNUM_WORLD ) { + if ( entityNum != REFENTITYNUM_WORLD ) { backEnd.currentEntity = &backEnd.refdef.entities[entityNum]; backEnd.refdef.floatTime = originalTime - backEnd.currentEntity->e.shaderTime; // we have to reset the shaderTime as well otherwise image animations start diff --git a/src/renderer/tr_main.c b/src/renderer/tr_main.c index 060fafb6..08b739bd 100644 --- a/src/renderer/tr_main.c +++ b/src/renderer/tr_main.c @@ -680,7 +680,7 @@ qboolean R_GetPortalOrientations( drawSurf_t *drawSurf, int entityNum, R_PlaneForSurface( drawSurf->surface, &originalPlane ); // rotate the plane if necessary - if ( entityNum != ENTITYNUM_WORLD ) { + if ( entityNum != REFENTITYNUM_WORLD ) { tr.currentEntityNum = entityNum; tr.currentEntity = &tr.refdef.entities[entityNum]; @@ -797,7 +797,7 @@ static qboolean IsMirror( const drawSurf_t *drawSurf, int entityNum ) R_PlaneForSurface( drawSurf->surface, &originalPlane ); // rotate the plane if necessary - if ( entityNum != ENTITYNUM_WORLD ) + if ( entityNum != REFENTITYNUM_WORLD ) { tr.currentEntityNum = entityNum; tr.currentEntity = &tr.refdef.entities[entityNum]; diff --git a/src/renderer/tr_scene.c b/src/renderer/tr_scene.c index 5a5b2dd5..72e078d5 100644 --- a/src/renderer/tr_scene.c +++ b/src/renderer/tr_scene.c @@ -101,7 +101,7 @@ void R_AddPolygonSurfaces( void ) { shader_t *sh; srfPoly_t *poly; - tr.currentEntityNum = ENTITYNUM_WORLD; + tr.currentEntityNum = REFENTITYNUM_WORLD; tr.shiftedEntityNum = tr.currentEntityNum << QSORT_ENTITYNUM_SHIFT; for ( i = 0, poly = tr.refdef.polys; i < tr.refdef.numPolys ; i++, poly++ ) { diff --git a/src/renderer/tr_types.h b/src/renderer/tr_types.h index d2b4d23d..6c394628 100644 --- a/src/renderer/tr_types.h +++ b/src/renderer/tr_types.h @@ -28,7 +28,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define MAX_DLIGHTS 32 // can't be increased, because bit flags are used on surfaces #define ENTITYNUM_BITS 10 // can't be increased without changing drawsurf bit packing +// the last N-bit number (2^ENTITYNUM_BITS - 1) is reserved for the special world refentity, +// and this is reflected by the value of MAX_ENTITIES (which therefore is not a power-of-2) #define MAX_ENTITIES ((1<localOrigin, cv->meshRadius ); } else { sphereCull = R_CullPointAndRadius( cv->localOrigin, cv->meshRadius ); @@ -652,7 +652,7 @@ void R_AddWorldSurfaces (void) { return; } - tr.currentEntityNum = ENTITYNUM_WORLD; + tr.currentEntityNum = REFENTITYNUM_WORLD; tr.shiftedEntityNum = tr.currentEntityNum << QSORT_ENTITYNUM_SHIFT; // determine which leaves are in the PVS / areamask -- cgit