X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=meshqueue.c;h=b7087c01292d8e98025d59468858e7913b02a1c9;hb=4d1fd3c5300f6db48293cb15df23bf4d2590eed9;hp=b176bf4dc677ae17a3e8bd57a2ce86cf0462fac3;hpb=a3b61f2eccf7a65fe4cbbfc4e453aa29e1d2551b;p=xonotic%2Fdarkplaces.git diff --git a/meshqueue.c b/meshqueue.c index b176bf4d..b7087c01 100644 --- a/meshqueue.c +++ b/meshqueue.c @@ -2,16 +2,17 @@ #include "quakedef.h" #include "meshqueue.h" -cvar_t r_meshqueue_entries = {CVAR_SAVE, "r_meshqueue_entries", "16"}; -cvar_t r_meshqueue_immediaterender = {0, "r_meshqueue_immediaterender", "0"}; -cvar_t r_meshqueue_sort = {0, "r_meshqueue_sort", "0"}; +cvar_t r_meshqueue_entries = {CVAR_SAVE, "r_meshqueue_entries", "16", "maximum number of meshes to batch together and sort before issuing render calls (unused)"}; +cvar_t r_meshqueue_immediaterender = {0, "r_meshqueue_immediaterender", "0", "immediately render non-transparent meshes rather than batching"}; +cvar_t r_meshqueue_sort = {0, "r_meshqueue_sort", "0", "whether to sort meshes in a batch before issuing calls"}; typedef struct meshqueue_s { struct meshqueue_s *next; - void (*callback)(const void *data1, int data2); - const void *data1; - int data2; + void (*callback)(const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight); + const entity_render_t *ent; + int surfacenumber; + const rtlight_t *rtlight; float dist; } meshqueue_t; @@ -40,7 +41,7 @@ void R_MeshQueue_Render(void) if (!mq_count) return; for (mq = mq_listhead;mq;mq = mq->next) - mq->callback(mq->data1, mq->data2); + mq->callback(mq->ent, mq->surfacenumber, mq->rtlight); mq_count = 0; mq_listhead = NULL; } @@ -48,7 +49,7 @@ void R_MeshQueue_Render(void) static void R_MeshQueue_EnlargeTransparentArray(int newtotal) { meshqueue_t *newarray; - newarray = (meshqueue_t *)Mem_Alloc(cl_mempool, newtotal * sizeof(meshqueue_t)); + newarray = (meshqueue_t *)Mem_Alloc(cls.permanentmempool, newtotal * sizeof(meshqueue_t)); if (mqt_array) { memcpy(newarray, mqt_array, mqt_total * sizeof(meshqueue_t)); @@ -58,20 +59,21 @@ static void R_MeshQueue_EnlargeTransparentArray(int newtotal) mqt_total = newtotal; } -void R_MeshQueue_Add(void (*callback)(const void *data1, int data2), const void *data1, int data2) +void R_MeshQueue_Add(void (*callback)(const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight), const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight) { meshqueue_t *mq, **mqnext; if (r_meshqueue_immediaterender.integer) { - callback(data1, data2); + callback(ent, surfacenumber, rtlight); return; } if (mq_count >= mq_total) R_MeshQueue_Render(); mq = &mq_array[mq_count++]; mq->callback = callback; - mq->data1 = data1; - mq->data2 = data2; + mq->ent = ent; + mq->surfacenumber = surfacenumber; + mq->rtlight = rtlight; if (r_meshqueue_sort.integer) { @@ -80,12 +82,17 @@ void R_MeshQueue_Add(void (*callback)(const void *data1, int data2), const void { if (mq->callback == (*mqnext)->callback) { - if (mq->data1 == (*mqnext)->data1) + if (mq->ent == (*mqnext)->ent) { - if (mq->data2 <= (*mqnext)->data2) + if (mq->surfacenumber == (*mqnext)->surfacenumber) + { + if (mq->rtlight <= (*mqnext)->rtlight) + break; + } + else if (mq->surfacenumber < (*mqnext)->surfacenumber) break; } - else if (mq->data1 < (*mqnext)->data1) + else if (mq->ent < (*mqnext)->ent) break; } else if (mq->callback < (*mqnext)->callback) @@ -101,15 +108,16 @@ void R_MeshQueue_Add(void (*callback)(const void *data1, int data2), const void *mqnext = mq; } -void R_MeshQueue_AddTransparent(const vec3_t center, void (*callback)(const void *data1, int data2), const void *data1, int data2) +void R_MeshQueue_AddTransparent(const vec3_t center, void (*callback)(const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight), const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight) { meshqueue_t *mq; if (mqt_count >= mqt_total) R_MeshQueue_EnlargeTransparentArray(mqt_total + 100); mq = &mqt_array[mqt_count++]; mq->callback = callback; - mq->data1 = data1; - mq->data2 = data2; + mq->ent = ent; + mq->surfacenumber = surfacenumber; + mq->rtlight = rtlight; mq->dist = DotProduct(center, r_viewforward) - mqt_viewplanedist; mq->next = NULL; mqt_viewmaxdist = max(mqt_viewmaxdist, mq->dist); @@ -143,7 +151,7 @@ void R_MeshQueue_RenderTransparent(void) for (i = 4095;i >= 0;i--) if (hash[i]) for (mqt = hash[i];mqt;mqt = mqt->next) - mqt->callback(mqt->data1, mqt->data2); + mqt->callback(mqt->ent, mqt->surfacenumber, mqt->rtlight); mqt_count = 0; } @@ -159,11 +167,11 @@ void R_MeshQueue_BeginScene(void) mq_total = r_meshqueue_entries.integer; if (mq_array) Mem_Free(mq_array); - mq_array = (meshqueue_t *)Mem_Alloc(cl_mempool, mq_total * sizeof(meshqueue_t)); + mq_array = (meshqueue_t *)Mem_Alloc(cls.permanentmempool, mq_total * sizeof(meshqueue_t)); } if (mqt_array == NULL) - mqt_array = (meshqueue_t *)Mem_Alloc(cl_mempool, mqt_total * sizeof(meshqueue_t)); + mqt_array = (meshqueue_t *)Mem_Alloc(cls.permanentmempool, mqt_total * sizeof(meshqueue_t)); mq_count = 0; mqt_count = 0;