[quake3-commits] r2327 - trunk/code/renderer

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Wed Oct 17 17:17:39 EDT 2012


Author: ztm
Date: 2012-10-17 17:17:37 -0400 (Wed, 17 Oct 2012)
New Revision: 2327

Modified:
   trunk/code/renderer/tr_backend.c
   trunk/code/renderer/tr_main.c
   trunk/code/renderer/tr_scene.c
   trunk/code/renderer/tr_types.h
   trunk/code/renderer/tr_world.c
Log:
>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.

Modified: trunk/code/renderer/tr_backend.c
===================================================================
--- trunk/code/renderer/tr_backend.c	2012-10-17 20:39:45 UTC (rev 2326)
+++ trunk/code/renderer/tr_backend.c	2012-10-17 21:17:37 UTC (rev 2327)
@@ -576,7 +576,7 @@
 		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

Modified: trunk/code/renderer/tr_main.c
===================================================================
--- trunk/code/renderer/tr_main.c	2012-10-17 20:39:45 UTC (rev 2326)
+++ trunk/code/renderer/tr_main.c	2012-10-17 21:17:37 UTC (rev 2327)
@@ -679,7 +679,7 @@
 	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];
 
@@ -796,7 +796,7 @@
 	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];

Modified: trunk/code/renderer/tr_scene.c
===================================================================
--- trunk/code/renderer/tr_scene.c	2012-10-17 20:39:45 UTC (rev 2326)
+++ trunk/code/renderer/tr_scene.c	2012-10-17 21:17:37 UTC (rev 2327)
@@ -100,7 +100,7 @@
 	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++ ) {

Modified: trunk/code/renderer/tr_types.h
===================================================================
--- trunk/code/renderer/tr_types.h	2012-10-17 20:39:45 UTC (rev 2326)
+++ trunk/code/renderer/tr_types.h	2012-10-17 21:17:37 UTC (rev 2327)
@@ -27,7 +27,10 @@
 #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)

Modified: trunk/code/renderer/tr_world.c
===================================================================
--- trunk/code/renderer/tr_world.c	2012-10-17 20:39:45 UTC (rev 2326)
+++ trunk/code/renderer/tr_world.c	2012-10-17 21:17:37 UTC (rev 2327)
@@ -58,7 +58,7 @@
 		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 );
@@ -651,7 +651,7 @@
 		return;
 	}
 
-	tr.currentEntityNum = ENTITYNUM_WORLD;
+	tr.currentEntityNum = REFENTITYNUM_WORLD;
 	tr.shiftedEntityNum = tr.currentEntityNum << QSORT_ENTITYNUM_SHIFT;
 
 	// determine which leaves are in the PVS / areamask



More information about the quake3-commits mailing list