Skip to content

Commit

Permalink
From /dev/humancontroller:
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
zturtleman committed Oct 17, 2012
1 parent d49d075 commit bc4ca16
Show file tree
Hide file tree
Showing 5 changed files with 9 additions and 6 deletions.
2 changes: 1 addition & 1 deletion code/renderer/tr_backend.c
Expand Up @@ -576,7 +576,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
Expand Down
4 changes: 2 additions & 2 deletions code/renderer/tr_main.c
Expand Up @@ -679,7 +679,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];

Expand Down Expand Up @@ -796,7 +796,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];
Expand Down
2 changes: 1 addition & 1 deletion code/renderer/tr_scene.c
Expand Up @@ -100,7 +100,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++ ) {
Expand Down
3 changes: 3 additions & 0 deletions code/renderer/tr_types.h
Expand Up @@ -27,7 +27,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<<ENTITYNUM_BITS) - 1)
#define REFENTITYNUM_WORLD ((1<<ENTITYNUM_BITS) - 1)

// renderfx flags
#define RF_MINLIGHT 0x0001 // allways have some light (viewmodel, some items)
Expand Down
4 changes: 2 additions & 2 deletions code/renderer/tr_world.c
Expand Up @@ -58,7 +58,7 @@ static qboolean R_CullGrid( srfGridMesh_t *cv ) {
return qtrue;
}

if ( tr.currentEntityNum != ENTITYNUM_WORLD ) {
if ( tr.currentEntityNum != REFENTITYNUM_WORLD ) {
sphereCull = R_CullLocalPointAndRadius( cv->localOrigin, cv->meshRadius );
} else {
sphereCull = R_CullPointAndRadius( cv->localOrigin, cv->meshRadius );
Expand Down Expand Up @@ -651,7 +651,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
Expand Down

0 comments on commit bc4ca16

Please sign in to comment.