]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
changed dpmaster.deathmask.net ip4 address, added ip6 address
[xonotic/darkplaces.git] / model_brush.c
index f6453414e4726dfd4024028b76f4f8c11dbd5b8f..eba42f526e937d9191ff8708d46d1a1677872b3f 100644 (file)
@@ -39,6 +39,7 @@ cvar_t r_subdivisions_collision_mintess = {0, "r_subdivisions_collision_mintess"
 cvar_t r_subdivisions_collision_maxtess = {0, "r_subdivisions_collision_maxtess", "1024", "maximum number of subdivisions (prevents curves beyond a certain detail level, limits smoothing)"};
 cvar_t r_subdivisions_collision_maxvertices = {0, "r_subdivisions_collision_maxvertices", "4225", "maximum vertices allowed per subdivided curve"};
 cvar_t r_trippy = {0, "r_trippy", "0", "easter egg"};
+cvar_t r_fxaa = {CVAR_SAVE, "r_fxaa", "0", "fast approximate anti aliasing"};
 cvar_t mod_noshader_default_offsetmapping = {CVAR_SAVE, "mod_noshader_default_offsetmapping", "1", "use offsetmapping by default on all surfaces that are not using q3 shader files"};
 cvar_t mod_obj_orientation = {0, "mod_obj_orientation", "1", "fix orientation of OBJ models to the usual conventions (if zero, use coordinates as is)"};
 cvar_t mod_q3bsp_curves_collisions = {0, "mod_q3bsp_curves_collisions", "1", "enables collisions with curves (SLOW)"};
@@ -83,6 +84,7 @@ void Mod_BrushInit(void)
        Cvar_RegisterVariable(&r_subdivisions_collision_maxtess);
        Cvar_RegisterVariable(&r_subdivisions_collision_maxvertices);
        Cvar_RegisterVariable(&r_trippy);
+       Cvar_RegisterVariable(&r_fxaa);
        Cvar_RegisterVariable(&mod_noshader_default_offsetmapping);
        Cvar_RegisterVariable(&mod_obj_orientation);
        Cvar_RegisterVariable(&mod_q3bsp_curves_collisions);
@@ -903,6 +905,8 @@ static void Mod_Q1BSP_TracePoint(struct model_s *model, const frameblend_t *fram
        Mod_Q1BSP_RecursiveHullCheckPoint(&rhc, rhc.hull->firstclipnode);
 }
 
+static void Mod_Q1BSP_TraceLineAgainstSurfaces(struct model_s *model, const frameblend_t *frameblend, const skeleton_t *skeleton, trace_t *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask);
+
 static void Mod_Q1BSP_TraceLine(struct model_s *model, const frameblend_t *frameblend, const skeleton_t *skeleton, trace_t *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask)
 {
        RecursiveHullCheckTraceInfo_t rhc;
@@ -913,6 +917,13 @@ static void Mod_Q1BSP_TraceLine(struct model_s *model, const frameblend_t *frame
                return;
        }
 
+       // sometimes we want to traceline against polygons so we can report the texture that was hit rather than merely a contents, but using this method breaks one of negke's maps so it must be a cvar check...
+       if (sv_gameplayfix_q1bsptracelinereportstexture.integer)
+       {
+               Mod_Q1BSP_TraceLineAgainstSurfaces(model, frameblend, skeleton, trace, start, end, hitsupercontentsmask);
+               return;
+       }
+
        memset(&rhc, 0, sizeof(rhc));
        memset(trace, 0, sizeof(trace_t));
        rhc.trace = trace;
@@ -1783,7 +1794,8 @@ static void Mod_Q1BSP_LoadTextures(sizebuf_t *sb)
                {
                        tx->supercontents = mod_q1bsp_texture_sky.supercontents;
                        tx->surfaceflags = mod_q1bsp_texture_sky.surfaceflags;
-                       tx->supercontents |= SUPERCONTENTS_SOLID; // for the surface traceline we need to hit this surface as a solid...
+                       // for the surface traceline we need to hit this surface as a solid...
+                       tx->supercontents |= SUPERCONTENTS_SOLID;
                }
                else
                {
@@ -2759,7 +2771,7 @@ static void Mod_Q1BSP_LoadNodes(sizebuf_t *sb)
 {
        int                     i, j, count, p, child[2];
        mnode_t         *out;
-       size_t structsize = loadmodel->brush.isbsp2 ? 44 : 24;
+       size_t structsize = loadmodel->brush.isbsp2rmqe ? 32 : (loadmodel->brush.isbsp2 ? 44 : 24);
 
        if (sb->cursize % structsize)
                Host_Error("Mod_Q1BSP_LoadNodes: funny lump size in %s",loadmodel->name);
@@ -2776,7 +2788,20 @@ static void Mod_Q1BSP_LoadNodes(sizebuf_t *sb)
                p = MSG_ReadLittleLong(sb);
                out->plane = loadmodel->brush.data_planes + p;
 
-               if (loadmodel->brush.isbsp2)
+               if (loadmodel->brush.isbsp2rmqe)
+               {
+                       child[0] = MSG_ReadLittleLong(sb);
+                       child[1] = MSG_ReadLittleLong(sb);
+                       out->mins[0] = MSG_ReadLittleShort(sb);
+                       out->mins[1] = MSG_ReadLittleShort(sb);
+                       out->mins[2] = MSG_ReadLittleShort(sb);
+                       out->maxs[0] = MSG_ReadLittleShort(sb);
+                       out->maxs[1] = MSG_ReadLittleShort(sb);
+                       out->maxs[2] = MSG_ReadLittleShort(sb);
+                       out->firstsurface = MSG_ReadLittleLong(sb);
+                       out->numsurfaces = MSG_ReadLittleLong(sb);
+               }
+               else if (loadmodel->brush.isbsp2)
                {
                        child[0] = MSG_ReadLittleLong(sb);
                        child[1] = MSG_ReadLittleLong(sb);
@@ -2850,7 +2875,7 @@ static void Mod_Q1BSP_LoadLeafs(sizebuf_t *sb)
 {
        mleaf_t *out;
        int i, j, count, p, firstmarksurface, nummarksurfaces;
-       size_t structsize = loadmodel->brush.isbsp2 ? 44 : 28;
+       size_t structsize = loadmodel->brush.isbsp2rmqe ? 32 : (loadmodel->brush.isbsp2 ? 44 : 28);
 
        if (sb->cursize % structsize)
                Host_Error("Mod_Q1BSP_LoadLeafs: funny lump size in %s",loadmodel->name);
@@ -2884,7 +2909,19 @@ static void Mod_Q1BSP_LoadLeafs(sizebuf_t *sb)
                                Mod_Q1BSP_DecompressVis(loadmodel->brushq1.data_compressedpvs + p, loadmodel->brushq1.data_compressedpvs + loadmodel->brushq1.num_compressedpvs, loadmodel->brush.data_pvsclusters + out->clusterindex * loadmodel->brush.num_pvsclusterbytes, loadmodel->brush.data_pvsclusters + (out->clusterindex + 1) * loadmodel->brush.num_pvsclusterbytes);
                }
 
-               if (loadmodel->brush.isbsp2)
+               if (loadmodel->brush.isbsp2rmqe)
+               {
+                       out->mins[0] = MSG_ReadLittleShort(sb);
+                       out->mins[1] = MSG_ReadLittleShort(sb);
+                       out->mins[2] = MSG_ReadLittleShort(sb);
+                       out->maxs[0] = MSG_ReadLittleShort(sb);
+                       out->maxs[1] = MSG_ReadLittleShort(sb);
+                       out->maxs[2] = MSG_ReadLittleShort(sb);
+       
+                       firstmarksurface = MSG_ReadLittleLong(sb);
+                       nummarksurfaces = MSG_ReadLittleLong(sb);
+               }
+               else if (loadmodel->brush.isbsp2)
                {
                        out->mins[0] = MSG_ReadLittleFloat(sb);
                        out->mins[1] = MSG_ReadLittleFloat(sb);
@@ -3747,13 +3784,18 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
                mod->brush.ishlbsp = true;
                mod->modeldatatypestring = "HLBSP";
                break;
+       case ('2' + 'P' * 256 + 'S' * 65536 + 'B' * 16777216):
+               mod->brush.isbsp2 = true;
+               mod->brush.isbsp2rmqe = true; // like bsp2 except leaf/node bounds are 16bit (unexpanded)
+               mod->modeldatatypestring = "Q1BSP2rmqe";
+               break;
        case ('B' + 'S' * 256 + 'P' * 65536 + '2' * 16777216):
                mod->brush.isbsp2 = true;
                mod->modeldatatypestring = "Q1BSP2";
                break;
        default:
                mod->modeldatatypestring = "Unknown BSP";
-               Host_Error("Mod_Q1BSP_Load: %s has wrong version number %i: supported versions are 29 (Quake), 30 (Half-Life), \"BSP2\"", mod->name, i);
+               Host_Error("Mod_Q1BSP_Load: %s has wrong version number %i: supported versions are 29 (Quake), 30 (Half-Life), \"BSP2\" or \"2PSB\" (rmqe)", mod->name, i);
                return;
        }
 
@@ -3791,10 +3833,7 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
 
        mod->soundfromcenter = true;
        mod->TraceBox = Mod_Q1BSP_TraceBox;
-       if (sv_gameplayfix_q1bsptracelinereportstexture.integer)
-               mod->TraceLine = Mod_Q1BSP_TraceLineAgainstSurfaces; // LordHavoc: use the surface-hitting version of TraceLine in all cases
-       else
-               mod->TraceLine = Mod_Q1BSP_TraceLine;
+       mod->TraceLine = Mod_Q1BSP_TraceLine;
        mod->TracePoint = Mod_Q1BSP_TracePoint;
        mod->PointSuperContents = Mod_Q1BSP_PointSuperContents;
        mod->TraceLineAgainstSurfaces = Mod_Q1BSP_TraceLineAgainstSurfaces;