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;
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;
tx->offsetbias = 0;
tx->specularscalemod = 1;
tx->specularpowermod = 1;
+ tx->transparentsort = TRANSPARENTSORT_DISTANCE;
+ // WHEN ADDING DEFAULTS HERE, REMEMBER TO PUT DEFAULTS IN ALL LOADERS
+ // JUST GREP FOR "specularscalemod = 1".
}
if (!sb->cursize)
{
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
{
{
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);
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);
{
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);
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);
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;
}
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;