]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
Offsetmapping now could be customized on per-texture basis. Added mod_q3shader_defaul...
[xonotic/darkplaces.git] / model_brush.c
index 2f7caae247973d4d86ed8c5910996d4a7ccc3299..0503d2ebcd78809690ee3dacb6887bf721bea7c9 100644 (file)
@@ -46,6 +46,8 @@ cvar_t mod_q3bsp_debugtracebrush = {0, "mod_q3bsp_debugtracebrush", "0", "select
 cvar_t mod_q3bsp_lightmapmergepower = {CVAR_SAVE, "mod_q3bsp_lightmapmergepower", "4", "merges the quake3 128x128 lightmap textures into larger lightmap group textures to speed up rendering, 1 = 256x256, 2 = 512x512, 3 = 1024x1024, 4 = 2048x2048, 5 = 4096x4096, ..."};
 cvar_t mod_q3bsp_nolightmaps = {CVAR_SAVE, "mod_q3bsp_nolightmaps", "0", "do not load lightmaps in Q3BSP maps (to save video RAM, but be warned: it looks ugly)"};
 cvar_t mod_q3bsp_tracelineofsight_brushes = {0, "mod_q3bsp_tracelineofsight_brushes", "0", "enables culling of entities behind detail brushes, curves, etc"};
+cvar_t mod_q3shader_default_offsetmapping = {CVAR_SAVE, "mod_q3shader_default_offsetmapping", "1", "use offsetmapping by default on all surfaces"};
+
 cvar_t mod_q1bsp_polygoncollisions = {0, "mod_q1bsp_polygoncollisions", "0", "disables use of precomputed cliphulls and instead collides with polygons (uses Bounding Interval Hierarchy optimizations)"};
 cvar_t mod_collision_bih = {0, "mod_collision_bih", "1", "enables use of generated Bounding Interval Hierarchy tree instead of compiled bsp tree in collision code"};
 cvar_t mod_recalculatenodeboxes = {0, "mod_recalculatenodeboxes", "1", "enables use of generated node bounding boxes based on BSP tree portal reconstruction, rather than the node boxes supplied by the map compiler"};
@@ -78,6 +80,7 @@ void Mod_BrushInit(void)
        Cvar_RegisterVariable(&mod_q3bsp_lightmapmergepower);
        Cvar_RegisterVariable(&mod_q3bsp_nolightmaps);
        Cvar_RegisterVariable(&mod_q3bsp_tracelineofsight_brushes);
+       Cvar_RegisterVariable(&mod_q3shader_default_offsetmapping);
        Cvar_RegisterVariable(&mod_q1bsp_polygoncollisions);
        Cvar_RegisterVariable(&mod_collision_bih);
        Cvar_RegisterVariable(&mod_recalculatenodeboxes);
@@ -1465,6 +1468,8 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l)
                tx->reflectfactor = 1;
                Vector4Set(tx->reflectcolor4f, 1, 1, 1, 1);
                tx->r_water_wateralpha = 1;
+               tx->offsetmapping = OFFSETMAPPING_OFF;
+               tx->offsetscale = 1;
                tx->specularscalemod = 1;
                tx->specularpowermod = 1;
        }
@@ -5739,7 +5744,8 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
        const int *e;
        const texture_t *texture;
        int axis;
-#if 0
+#define BIHLINECLIP
+#ifdef BIHLINECLIP
        int sideflags;
        vec_t frontdist1;
        vec_t frontdist2;
@@ -5765,7 +5771,7 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        return;
 #endif
                axis = node->type - BIH_SPLITX;
-#if 1
+#if 0
                if (segmentmins[axis] <= node->backmax)
                {
                        if (segmentmaxs[axis] >= node->frontmin)
@@ -5777,10 +5783,10 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                else
                        return; // trace falls between children
 #else
-               frontdist1 = start[axis] - node->backmax;
-               frontdist2 = end[axis] - node->backmax;
-               backdist1 = start[axis] - node->frontmin;
-               backdist2 = end[axis] - node->frontmin;
+               frontdist1 = start[axis] - node->frontmin;
+               frontdist2 = end[axis] - node->frontmin;
+               backdist1 = start[axis] - node->backmax;
+               backdist2 = end[axis] - node->backmax;
                sideflags = 0;
                if (frontdist1 < 0)
                        sideflags |= 1;
@@ -5790,6 +5796,18 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        sideflags |= 4;
                if (backdist2 < 0)
                        sideflags |= 8;
+#if 0
+               if (sideflags & 12)
+               {
+                       if ((sideflags & 3) != 3)
+                               Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, end, linestart, lineend);
+                       nodenum = node->back;
+               }
+               else if ((sideflags & 3) != 3)
+                       nodenum = node->front;
+               else
+                       return; // trace falls between children
+#else
                switch(sideflags)
                {
                case 0:
@@ -5798,6 +5816,7 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        continue;
                case 1:
                        // START end START END
+#ifdef BIHLINECLIP
                        frontfrac = frontdist1 / (frontdist1 - frontdist2);
                        VectorLerp(start, frontfrac, end, clipped[0]);
                        start = clipped[0];
@@ -5807,9 +5826,11 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#endif
                        nodenum = node->front;
                        break;
                case 2:
+#ifdef BIHLINECLIP
                        // start END START END
                        frontfrac = frontdist1 / (frontdist1 - frontdist2);
                        VectorLerp(start, frontfrac, end, clipped[0]);
@@ -5820,6 +5841,7 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#endif
                        nodenum = node->front;
                        break;
                case 3:
@@ -5828,6 +5850,7 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                case 4:
                        // start end start END
                        Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, end, linestart, lineend);
+#ifdef BIHLINECLIP
                        backfrac = backdist1 / (backdist1 - backdist2);
                        VectorLerp(start, backfrac, end, clipped[0]);
                        end = clipped[0];
@@ -5837,10 +5860,12 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#endif
                        nodenum = node->back;
                        break;
                case 5:
                        // START end start END
+#ifdef BIHLINECLIP
                        frontfrac = frontdist1 / (frontdist1 - frontdist2);
                        VectorLerp(start, frontfrac, end, clipped[1]);
                        Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, clipped[1], end, linestart, lineend);
@@ -5853,10 +5878,14 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#else
+                       Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, end, linestart, lineend);
+#endif
                        nodenum = node->back;
                        break;
                case 6:
                        // start END start END
+#ifdef BIHLINECLIP
                        frontfrac = frontdist1 / (frontdist1 - frontdist2);
                        VectorLerp(start, frontfrac, end, clipped[1]);
                        Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, clipped[1], linestart, lineend);
@@ -5869,10 +5898,14 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#else
+                       Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, end, linestart, lineend);
+#endif
                        nodenum = node->back;
                        break;
                case 7:
                        // START END start END
+#ifdef BIHLINECLIP
                        backfrac = backdist1 / (backdist1 - backdist2);
                        VectorLerp(start, backfrac, end, clipped[0]);
                        end = clipped[0];
@@ -5882,11 +5915,13 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#endif
                        nodenum = node->back;
                        break;
                case 8:
                        // start end START end
                        Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, end, linestart, lineend);
+#ifdef BIHLINECLIP
                        backfrac = backdist1 / (backdist1 - backdist2);
                        VectorLerp(start, backfrac, end, clipped[0]);
                        start = clipped[0];
@@ -5896,10 +5931,12 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#endif
                        nodenum = node->back;
                        break;
                case 9:
                        // START end START end
+#ifdef BIHLINECLIP
                        frontfrac = frontdist1 / (frontdist1 - frontdist2);
                        VectorLerp(start, frontfrac, end, clipped[1]);
                        Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, clipped[1], end, linestart, lineend);
@@ -5912,10 +5949,14 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#else
+                       Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, end, linestart, lineend);
+#endif
                        nodenum = node->back;
                        break;
                case 10:
                        // start END START end
+#ifdef BIHLINECLIP
                        frontfrac = frontdist1 / (frontdist1 - frontdist2);
                        VectorLerp(start, frontfrac, end, clipped[1]);
                        Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, clipped[1], linestart, lineend);
@@ -5928,10 +5969,14 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#else
+                       Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, end, linestart, lineend);
+#endif
                        nodenum = node->back;
                        break;
                case 11:
                        // START END START end
+#ifdef BIHLINECLIP
                        backfrac = backdist1 / (backdist1 - backdist2);
                        VectorLerp(start, backfrac, end, clipped[0]);
                        start = clipped[0];
@@ -5941,6 +5986,7 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        segmentmaxs[0] = max(start[0], end[0]);
                        segmentmaxs[1] = max(start[1], end[1]);
                        segmentmaxs[2] = max(start[2], end[2]);
+#endif
                        nodenum = node->back;
                        break;
                case 12:
@@ -5950,16 +5996,24 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        break;
                case 13:
                        // START end start end
+#ifdef BIHLINECLIP
                        frontfrac = frontdist1 / (frontdist1 - frontdist2);
                        VectorLerp(start, frontfrac, end, clipped[1]);
                        Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, clipped[1], end, linestart, lineend);
+#else
+                       Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, end, linestart, lineend);
+#endif
                        nodenum = node->back;
                        break;
                case 14:
                        // start END start end
+#ifdef BIHLINECLIP
                        frontfrac = frontdist1 / (frontdist1 - frontdist2);
                        VectorLerp(start, frontfrac, end, clipped[1]);
                        Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, clipped[1], linestart, lineend);
+#else
+                       Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace, model, node->front, start, end, linestart, lineend);
+#endif
                        nodenum = node->back;
                        break;
                case 15:
@@ -5967,6 +6021,7 @@ static void Mod_CollisionBIH_TraceLine_RecursiveBIHNode(trace_t *trace, dp_model
                        nodenum = node->back;
                        continue;
                }
+#endif
 #endif
        }
        if (!model->collision_bih.leafs)
@@ -6009,11 +6064,11 @@ static void Mod_CollisionBIH_TraceBrush_RecursiveBIHNode(trace_t *trace, dp_mode
        {
                node = model->collision_bih.nodes + nodenum;
                axis = node->type - BIH_SPLITX;
-#if 0
-#if 0
+#if 1
                if (!BoxesOverlap(segmentmins, segmentmaxs, node->mins, node->maxs))
                        return;
 #endif
+#if 0
                Mod_CollisionBIH_TraceBrush_RecursiveBIHNode(trace, model, node->front, thisbrush_start, thisbrush_end, segmentmins, segmentmaxs);
                nodenum = node->back;
                continue;