]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - meshqueue.c
default r_useportalculling to 1, I don't know why it was off
[xonotic/darkplaces.git] / meshqueue.c
index f313154442e6922c8b25f19ffe25810bb1dc6ff2..b176bf4dc677ae17a3e8bd57a2ce86cf0462fac3 100644 (file)
@@ -17,6 +17,7 @@ typedef struct meshqueue_s
 meshqueue_t;
 
 float mqt_viewplanedist;
+float mqt_viewmaxdist;
 meshqueue_t *mq_array, *mqt_array, *mq_listhead;
 int mq_count, mqt_count;
 int mq_total, mqt_total;
@@ -47,7 +48,7 @@ void R_MeshQueue_Render(void)
 static void R_MeshQueue_EnlargeTransparentArray(int newtotal)
 {
        meshqueue_t *newarray;
-       newarray = Mem_Alloc(cl_mempool, newtotal * sizeof(meshqueue_t));
+       newarray = (meshqueue_t *)Mem_Alloc(cl_mempool, newtotal * sizeof(meshqueue_t));
        if (mqt_array)
        {
                memcpy(newarray, mqt_array, mqt_total * sizeof(meshqueue_t));
@@ -111,12 +112,14 @@ void R_MeshQueue_AddTransparent(const vec3_t center, void (*callback)(const void
        mq->data2 = data2;
        mq->dist = DotProduct(center, r_viewforward) - mqt_viewplanedist;
        mq->next = NULL;
+       mqt_viewmaxdist = max(mqt_viewmaxdist, mq->dist);
 }
 
 void R_MeshQueue_RenderTransparent(void)
 {
        int i;
        int hashdist;
+       float distscale;
        meshqueue_t *mqt;
        meshqueue_t *hash[4096], **hashpointer[4096];
        if (mq_count)
@@ -126,10 +129,11 @@ void R_MeshQueue_RenderTransparent(void)
        memset(hash, 0, sizeof(hash));
        for (i = 0;i < 4096;i++)
                hashpointer[i] = &hash[i];
+       distscale = 4095.0f / max(mqt_viewmaxdist, 4095);
        for (i = 0, mqt = mqt_array;i < mqt_count;i++, mqt++)
        {
                // generate index
-               hashdist = (int) (mqt->dist);
+               hashdist = (int) (mqt->dist * distscale);
                hashdist = bound(0, hashdist, 4095);
                // link to tail of hash chain (to preserve render order)
                mqt->next = NULL;
@@ -155,16 +159,17 @@ void R_MeshQueue_BeginScene(void)
                mq_total = r_meshqueue_entries.integer;
                if (mq_array)
                        Mem_Free(mq_array);
-               mq_array = Mem_Alloc(cl_mempool, mq_total * sizeof(meshqueue_t));
+               mq_array = (meshqueue_t *)Mem_Alloc(cl_mempool, mq_total * sizeof(meshqueue_t));
        }
 
        if (mqt_array == NULL)
-               mqt_array = Mem_Alloc(cl_mempool, mqt_total * sizeof(meshqueue_t));
+               mqt_array = (meshqueue_t *)Mem_Alloc(cl_mempool, mqt_total * sizeof(meshqueue_t));
 
        mq_count = 0;
        mqt_count = 0;
        mq_listhead = NULL;
        mqt_viewplanedist = DotProduct(r_vieworigin, r_viewforward);
+       mqt_viewmaxdist = 0;
 }
 
 void R_MeshQueue_EndScene(void)