faster number to edict lookup (sv.edictstable) and faster edict to number lookup...
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 28 Oct 2002 14:26:49 +0000 (14:26 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 28 Oct 2002 14:26:49 +0000 (14:26 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2574 d7cf8633-e32d-0410-b094-e92efae38249

pr_edict.c
progs.h
server.h
sv_main.c

index 8520ede01ac44f24623ef63cf23292e506ce6f5e..54e25b50c409993dd1acf86680aa84e75396f4c3 100644 (file)
@@ -1556,22 +1556,13 @@ edict_t *EDICT_NUM_ERROR(int n)
 
 int NUM_FOR_EDICT(edict_t *e)
 {
-       int             b;
-
-       b = (qbyte *)e - (qbyte *)sv.edicts;
-       b = b / pr_edict_size;
-
-       if (b < 0 || b >= sv.num_edicts)
+       if ((qbyte *)e < (qbyte *)sv.edicts || (qbyte *)e > (qbyte *)sv.edicts + pr_edictareasize)
                Host_Error ("NUM_FOR_EDICT: bad pointer");
-       return b;
+       return e->number;
 }
 
 int NoCrash_NUM_FOR_EDICT(edict_t *e)
 {
-       int             b;
-
-       b = (qbyte *)e - (qbyte *)sv.edicts;
-       b = b / pr_edict_size;
-       return b;
+       return e->number;
 }
 
diff --git a/progs.h b/progs.h
index b69e0caac4801812f11d6ee1a1e8c95c0293906d..a50b7af9354c1ce754e728df94ad45a4771b9e5d 100644 (file)
--- a/progs.h
+++ b/progs.h
@@ -43,17 +43,18 @@ typedef struct link_s
 #define        MAX_ENT_LEAFS   256
 typedef struct edict_s
 {
-       qboolean        free;
-       link_t          area;
+       qboolean free; // true if this edict is unused
+       link_t area; // physics area this edict is linked into
+       int number; // number of this edict
 
 #ifdef QUAKEENTITIES
-       entity_state_t  baseline;
-       entity_state_t  deltabaseline; // LordHavoc: previous frame
+       entity_state_t baseline; // baseline values
+       entity_state_t deltabaseline; // LordHavoc: previous frame
 #endif
 
-       int                     suspendedinairflag;     // LordHavoc: gross hack to make floating items still work
-       float           freetime;                       // sv.time when the object was freed
-       entvars_t       v;                                      // C exported fields from progs
+       int suspendedinairflag; // LordHavoc: gross hack to make floating items still work
+       float freetime; // sv.time when the object was freed
+       entvars_t v; // C exported fields from progs
 // other fields from progs come immediately after
 } edict_t;
 
@@ -140,7 +141,7 @@ void ED_ParseGlobals (const char *data);
 void ED_LoadFromFile (const char *data);
 
 edict_t *EDICT_NUM_ERROR(int n);
-#define EDICT_NUM(n) (n >= 0 ? (n < sv.max_edicts ? (edict_t *)((qbyte *)sv.edicts + (n) * pr_edict_size) : EDICT_NUM_ERROR(n)) : EDICT_NUM_ERROR(n))
+#define EDICT_NUM(n) ((n >= 0 && n < sv.max_edicts) ? sv.edictstable[(n)] : EDICT_NUM_ERROR(n))
 
 int NUM_FOR_EDICT(edict_t *e);
 
index dd0bc421c07d1e89a98de3f6fee2a22a62eb8709..4887aa13e388404cf0ea75f8106aa9df674b1135 100644 (file)
--- a/server.h
+++ b/server.h
@@ -69,6 +69,8 @@ typedef struct
        int max_edicts;
        // can NOT be array indexed, because edict_t is variable sized, but can be used to reference the world ent
        edict_t *edicts;
+       // can be array indexed
+       edict_t **edictstable;
        // some actions are only valid during load
        server_state_t state;
 
index 1f3e4bb6e3f03526a03a77fc6bd8bc1d721b6b91..7f250b0d8d45acf34ef73ab7470bdd69bc98031f 100644 (file)
--- a/sv_main.c
+++ b/sv_main.c
@@ -1766,6 +1766,13 @@ void SV_SpawnServer (const char *server)
        // clear the edict memory pool
        Mem_EmptyPool(sv_edicts_mempool);
        sv.edicts = Mem_Alloc(sv_edicts_mempool, sv.max_edicts * pr_edict_size);
+       sv.edictstable = Mem_Alloc(sv_edicts_mempool, sv.max_edicts * sizeof(edict_t *));
+       for (i = 0;i < MAX_EDICTS;i++)
+       {
+               ent = (edict_t *)((qbyte *)sv.edicts + (i * pr_edict_size));
+               ent->number = i;
+               sv.edictstable[i] = ent;
+       }
 
        sv.datagram.maxsize = sizeof(sv.datagram_buf);
        sv.datagram.cursize = 0;