//cvar_t r_subdivide_size = {CVAR_SAVE, "r_subdivide_size", "128"};
cvar_t halflifebsp = {0, "halflifebsp", "0"};
+cvar_t mcbsp = {0, "mcbsp", "0"};
cvar_t r_novis = {0, "r_novis", "0"};
cvar_t r_miplightmaps = {CVAR_SAVE, "r_miplightmaps", "0"};
cvar_t r_lightmaprgba = {0, "r_lightmaprgba", "1"};
{
// Cvar_RegisterVariable(&r_subdivide_size);
Cvar_RegisterVariable(&halflifebsp);
+ Cvar_RegisterVariable(&mcbsp);
Cvar_RegisterVariable(&r_novis);
Cvar_RegisterVariable(&r_miplightmaps);
Cvar_RegisterVariable(&r_lightmaprgba);
VectorSubtract(boxstartmaxs, boxstartmins, boxsize);
if (boxsize[0] < 3)
rhc.hull = &model->brushq1.hulls[0]; // 0x0x0
+ else if (model->brush.ismcbsp)
+ {
+ if (boxsize[2] < 48) // pick the nearest of 40 or 56
+ rhc.hull = &model->brushq1.hulls[2]; // 16x16x40
+ else
+ rhc.hull = &model->brushq1.hulls[1]; // 16x16x56
+ }
else if (model->brush.ishlbsp)
{
// LordHavoc: this has to have a minor tolerance (the .1) because of
}
else
{
- if (!Mod_LoadSkinFrame(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, tx->name[0] != '*', true))
+ if (!Mod_LoadSkinFrame(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, true))
{
// did not find external texture, load it from the bsp or wad3
if (loadmodel->brush.ishlbsp)
Mem_Free(freepixels);
}
else if (mtdata) // texture included
- Mod_LoadSkinFrame_Internal(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_PRECACHE | TEXF_PICMIP, false, tx->name[0] != '*', tx->name[0] != '*' && r_fullbrights.integer, mtdata, tx->width, tx->height);
+ Mod_LoadSkinFrame_Internal(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_PRECACHE | TEXF_PICMIP, false, tx->name[0] != '*' && r_fullbrights.integer, mtdata, tx->width, tx->height);
}
}
if (tx->skin.base == NULL)
for (i=0; i<l->filelen; i++)
loadmodel->brushq1.lightdata[i] = mod_base[l->fileofs+i] >>= 1;
}
+ else if (loadmodel->brush.ismcbsp)
+ {
+ loadmodel->brushq1.lightdata = Mem_Alloc(loadmodel->mempool, l->filelen);
+ memcpy(loadmodel->brushq1.lightdata, mod_base + l->fileofs, l->filelen);
+ }
else // LordHavoc: bsp version 29 (normal white lighting)
{
// LordHavoc: hope is not lost yet, check for a .lit file to load
data = (qbyte*) FS_LoadFile(litfilename, tempmempool, false);
if (data)
{
- if (fs_filesize == (size_t)(8 + l->filelen * 3) && data[0] == 'Q' && data[1] == 'L' && data[2] == 'I' && data[3] == 'T')
+ if (fs_filesize == (fs_offset_t)(8 + l->filelen * 3) && data[0] == 'Q' && data[1] == 'L' && data[2] == 'I' && data[3] == 'T')
{
i = LittleLong(((int *)data)[1]);
if (i == 1)
}
}
-static void Mod_Q1BSP_LoadSubmodels(lump_t *l)
+static void Mod_Q1BSP_LoadSubmodels(lump_t *l, hullinfo_t *hullinfo)
{
- dmodel_t *in;
+ qbyte *index;
dmodel_t *out;
int i, j, count;
- in = (void *)(mod_base + l->fileofs);
- if (l->filelen % sizeof(*in))
- Host_Error("Mod_Q1BSP_LoadSubmodels: funny lump size in %s",loadmodel->name);
- count = l->filelen / sizeof(*in);
- out = Mem_Alloc(loadmodel->mempool, count*sizeof(*out));
+ index = (qbyte *)(mod_base + l->fileofs);
+ if (l->filelen % (48+4*hullinfo->filehulls))
+ Host_Error ("Mod_Q1BSP_LoadSubmodels: funny lump size in %s", loadmodel->name);
+
+ count = l->filelen / (48+4*hullinfo->filehulls);
+ out = Mem_Alloc (loadmodel->mempool, count*sizeof(*out));
loadmodel->brushq1.submodels = out;
loadmodel->brush.numsubmodels = count;
- for ( i=0 ; i<count ; i++, in++, out++)
- {
- for (j=0 ; j<3 ; j++)
+ for (i = 0; i < count; i++, out++)
+ {
+ // spread out the mins / maxs by a pixel
+ out->mins[0] = LittleFloat(*(float*)index) - 1; index += 4;
+ out->mins[1] = LittleFloat(*(float*)index) - 1; index += 4;
+ out->mins[2] = LittleFloat(*(float*)index) - 1; index += 4;
+ out->maxs[0] = LittleFloat(*(float*)index) + 1; index += 4;
+ out->maxs[1] = LittleFloat(*(float*)index) + 1; index += 4;
+ out->maxs[2] = LittleFloat(*(float*)index) + 1; index += 4;
+ out->origin[0] = LittleFloat (*(float*)index); index += 4;
+ out->origin[1] = LittleFloat (*(float*)index); index += 4;
+ out->origin[2] = LittleFloat (*(float*)index); index += 4;
+ for (j = 0; j < hullinfo->filehulls; j++)
{
- // spread the mins / maxs by a pixel
- out->mins[j] = LittleFloat(in->mins[j]) - 1;
- out->maxs[j] = LittleFloat(in->maxs[j]) + 1;
- out->origin[j] = LittleFloat(in->origin[j]);
+ out->headnode[j] = LittleLong (*(int*)index);
+ index += 4;
}
- for (j=0 ; j<MAX_MAP_HULLS ; j++)
- out->headnode[j] = LittleLong(in->headnode[j]);
- out->visleafs = LittleLong(in->visleafs);
- out->firstface = LittleLong(in->firstface);
- out->numfaces = LittleLong(in->numfaces);
+ out->visleafs = LittleLong (*(int*)index); index += 4;
+ out->firstface = LittleLong (*(int*)index); index += 4;
+ out->numfaces = LittleLong (*(int*)index); index += 4;
}
}
// vertex limit
loadmodel->nummeshes = 1;
loadmodel->meshlist = Mem_Alloc(loadmodel->mempool, sizeof(surfmesh_t *));
- loadmodel->meshlist[0] = Mod_AllocSurfMesh(loadmodel->mempool, totalverts, totaltris, true, true, false, false);
+ loadmodel->meshlist[0] = Mod_AllocSurfMesh(loadmodel->mempool, totalverts, totaltris, true, false, false);
totalverts = 0;
totaltris = 0;
t = DotProduct(((surface->groupmesh->data_vertex3f + 3 * surface->num_firstvertex) + i * 3), surface->lightmapinfo->texinfo->vecs[1]) + surface->lightmapinfo->texinfo->vecs[1][3];
(surface->groupmesh->data_texcoordtexture2f + 2 * surface->num_firstvertex)[i * 2 + 0] = s / surface->texture->width;
(surface->groupmesh->data_texcoordtexture2f + 2 * surface->num_firstvertex)[i * 2 + 1] = t / surface->texture->height;
- (surface->groupmesh->data_texcoorddetail2f + 2 * surface->num_firstvertex)[i * 2 + 0] = s * (1.0f / 16.0f);
- (surface->groupmesh->data_texcoorddetail2f + 2 * surface->num_firstvertex)[i * 2 + 1] = t * (1.0f / 16.0f);
(surface->groupmesh->data_texcoordlightmap2f + 2 * surface->num_firstvertex)[i * 2 + 0] = 0;
(surface->groupmesh->data_texcoordlightmap2f + 2 * surface->num_firstvertex)[i * 2 + 1] = 0;
(surface->groupmesh->data_lightmapoffsets + surface->num_firstvertex)[i] = 0;
}
// compile additional data about the surface geometry
- Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, surface->groupmesh->data_vertex3f, surface->groupmesh->data_texcoordtexture2f, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle), surface->groupmesh->data_svector3f, surface->groupmesh->data_tvector3f, surface->groupmesh->data_normal3f);
+ Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, surface->groupmesh->data_vertex3f, surface->groupmesh->data_texcoordtexture2f, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle), surface->groupmesh->data_svector3f, surface->groupmesh->data_tvector3f, surface->groupmesh->data_normal3f, true);
BoxFromPoints(surface->mins, surface->maxs, surface->num_vertices, (surface->groupmesh->data_vertex3f + 3 * surface->num_firstvertex));
// generate surface extents information
}
}
-static void Mod_Q1BSP_LoadClipnodes(lump_t *l)
+static void Mod_Q1BSP_LoadClipnodes(lump_t *l, hullinfo_t *hullinfo)
{
dclipnode_t *in, *out;
int i, count;
loadmodel->brushq1.clipnodes = out;
loadmodel->brushq1.numclipnodes = count;
- if (loadmodel->brush.ishlbsp)
+ for (i = 1; i < hullinfo->numhulls; i++)
{
- hull = &loadmodel->brushq1.hulls[1];
- hull->clipnodes = out;
- hull->firstclipnode = 0;
- hull->lastclipnode = count-1;
- hull->planes = loadmodel->brush.data_planes;
- hull->clip_mins[0] = -16;
- hull->clip_mins[1] = -16;
- hull->clip_mins[2] = -36;
- hull->clip_maxs[0] = 16;
- hull->clip_maxs[1] = 16;
- hull->clip_maxs[2] = 36;
- VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size);
-
- hull = &loadmodel->brushq1.hulls[2];
- hull->clipnodes = out;
- hull->firstclipnode = 0;
- hull->lastclipnode = count-1;
- hull->planes = loadmodel->brush.data_planes;
- hull->clip_mins[0] = -32;
- hull->clip_mins[1] = -32;
- hull->clip_mins[2] = -32;
- hull->clip_maxs[0] = 32;
- hull->clip_maxs[1] = 32;
- hull->clip_maxs[2] = 32;
- VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size);
-
- hull = &loadmodel->brushq1.hulls[3];
+ hull = &loadmodel->brushq1.hulls[i];
hull->clipnodes = out;
hull->firstclipnode = 0;
hull->lastclipnode = count-1;
hull->planes = loadmodel->brush.data_planes;
- hull->clip_mins[0] = -16;
- hull->clip_mins[1] = -16;
- hull->clip_mins[2] = -18;
- hull->clip_maxs[0] = 16;
- hull->clip_maxs[1] = 16;
- hull->clip_maxs[2] = 18;
- VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size);
- }
- else
- {
- hull = &loadmodel->brushq1.hulls[1];
- hull->clipnodes = out;
- hull->firstclipnode = 0;
- hull->lastclipnode = count-1;
- hull->planes = loadmodel->brush.data_planes;
- hull->clip_mins[0] = -16;
- hull->clip_mins[1] = -16;
- hull->clip_mins[2] = -24;
- hull->clip_maxs[0] = 16;
- hull->clip_maxs[1] = 16;
- hull->clip_maxs[2] = 32;
- VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size);
-
- hull = &loadmodel->brushq1.hulls[2];
- hull->clipnodes = out;
- hull->firstclipnode = 0;
- hull->lastclipnode = count-1;
- hull->planes = loadmodel->brush.data_planes;
- hull->clip_mins[0] = -32;
- hull->clip_mins[1] = -32;
- hull->clip_mins[2] = -24;
- hull->clip_maxs[0] = 32;
- hull->clip_maxs[1] = 32;
- hull->clip_maxs[2] = 64;
+ hull->clip_mins[0] = hullinfo->hullsizes[i][0][0];
+ hull->clip_mins[1] = hullinfo->hullsizes[i][0][1];
+ hull->clip_mins[2] = hullinfo->hullsizes[i][0][2];
+ hull->clip_maxs[0] = hullinfo->hullsizes[i][1][0];
+ hull->clip_maxs[1] = hullinfo->hullsizes[i][1][1];
+ hull->clip_maxs[2] = hullinfo->hullsizes[i][1][2];
VectorSubtract(hull->clip_maxs, hull->clip_mins, hull->clip_size);
}
const hull_t *hull;
VectorSubtract(inmaxs, inmins, size);
- if (cmodel->brush.ishlbsp)
+ if (cmodel->brush.ismcbsp)
+ {
+ if (size[0] < 3)
+ hull = &cmodel->brushq1.hulls[0]; // 0x0x0
+ else if (size[2] < 48) // pick the nearest of 40 or 56
+ hull = &cmodel->brushq1.hulls[2]; // 16x16x40
+ else
+ hull = &cmodel->brushq1.hulls[1]; // 16x16x56
+ }
+ else if (cmodel->brush.ishlbsp)
{
if (size[0] < 3)
hull = &cmodel->brushq1.hulls[0]; // 0x0x0
VectorAdd(inmins, hull->clip_size, outmaxs);
}
-extern void R_Q1BSP_DrawSky(entity_render_t *ent);
-extern void R_Q1BSP_Draw(entity_render_t *ent);
-extern void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, qbyte *outleafpvs, int *outnumleafspointer, int *outsurfacelist, qbyte *outsurfacepvs, int *outnumsurfacespointer);
-extern void R_Q1BSP_DrawShadowVolume(entity_render_t *ent, vec3_t relativelightorigin, float lightradius, int numsurfaces, const int *surfacelist, const vec3_t lightmins, const vec3_t lightmaxs);
-extern void R_Q1BSP_DrawLight(entity_render_t *ent, float *lightcolor, int numsurfaces, const int *surfacelist);
-void Mod_Q1BSP_Load(model_t *mod, void *buffer)
+void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend)
{
int i, j, k;
dheader_t *header;
float dist, modelyawradius, modelradius, *vec;
msurface_t *surface;
int numshadowmeshtriangles;
+ dheader_t _header;
+ hullinfo_t hullinfo;
mod->type = mod_brushq1;
- header = (dheader_t *)buffer;
+ if (!memcmp (buffer, "MCBSPpad", 8))
+ {
+ qbyte *index;
- i = LittleLong(header->version);
- if (i != BSPVERSION && i != 30)
- Host_Error("Mod_Q1BSP_Load: %s has wrong version number(%i should be %i(Quake) or 30(HalfLife))", mod->name, i, BSPVERSION);
- mod->brush.ishlbsp = i == 30;
+ mod->brush.ismcbsp = true;
+ mod->brush.ishlbsp = false;
+
+ mod_base = (qbyte*)buffer;
+
+ index = mod_base;
+ index += 8;
+ i = LittleLong(*(int*)index); index += 4;
+ if (i != MCBSPVERSION)
+ Host_Error("Mod_Q1BSP_Load: %s has wrong version number(%i should be %i)", mod->name, i, MCBSPVERSION);
+
+ // read hull info
+ hullinfo.numhulls = LittleLong(*(int*)index); index += 4;
+ hullinfo.filehulls = hullinfo.numhulls;
+ VectorClear (hullinfo.hullsizes[0][0]);
+ VectorClear (hullinfo.hullsizes[0][1]);
+ for (i = 1; i < hullinfo.numhulls; i++)
+ {
+ hullinfo.hullsizes[i][0][0] = LittleFloat(*(float*)index); index += 4;
+ hullinfo.hullsizes[i][0][1] = LittleFloat(*(float*)index); index += 4;
+ hullinfo.hullsizes[i][0][2] = LittleFloat(*(float*)index); index += 4;
+ hullinfo.hullsizes[i][1][0] = LittleFloat(*(float*)index); index += 4;
+ hullinfo.hullsizes[i][1][1] = LittleFloat(*(float*)index); index += 4;
+ hullinfo.hullsizes[i][1][2] = LittleFloat(*(float*)index); index += 4;
+ }
+
+ // read lumps
+ _header.version = 0;
+ for (i = 0; i < HEADER_LUMPS; i++)
+ {
+ _header.lumps[i].fileofs = LittleLong(*(int*)index); index += 4;
+ _header.lumps[i].filelen = LittleLong(*(int*)index); index += 4;
+ }
+
+ header = &_header;
+ }
+ else
+ {
+ header = (dheader_t *)buffer;
+
+ i = LittleLong(header->version);
+ if (i != BSPVERSION && i != 30)
+ Host_Error("Mod_Q1BSP_Load: %s has wrong version number(%i should be %i(Quake) or 30(HalfLife)", mod->name, i, BSPVERSION);
+ mod->brush.ishlbsp = i == 30;
+ mod->brush.ismcbsp = false;
+
+ // fill in hull info
+ VectorClear (hullinfo.hullsizes[0][0]);
+ VectorClear (hullinfo.hullsizes[0][1]);
+ if (mod->brush.ishlbsp)
+ {
+ hullinfo.numhulls = 4;
+ hullinfo.filehulls = 4;
+ VectorSet (hullinfo.hullsizes[0][0], -16, -16, -36);
+ VectorSet (hullinfo.hullsizes[0][1], 16, 16, 36);
+ VectorSet (hullinfo.hullsizes[1][0], -32, -32, -32);
+ VectorSet (hullinfo.hullsizes[1][1], 32, 32, 32);
+ VectorSet (hullinfo.hullsizes[2][0], -16, -16, -18);
+ VectorSet (hullinfo.hullsizes[2][1], 16, 16, 18);
+ }
+ else
+ {
+ hullinfo.numhulls = 3;
+ hullinfo.filehulls = 4;
+ VectorSet (hullinfo.hullsizes[0][0], -16, -16, -24);
+ VectorSet (hullinfo.hullsizes[0][1], 16, 16, 32);
+ VectorSet (hullinfo.hullsizes[1][0], -32, -32, -24);
+ VectorSet (hullinfo.hullsizes[1][1], 32, 32, 64);
+ }
+
+ // read lumps
+ mod_base = (qbyte*)buffer;
+ for (i = 0; i < HEADER_LUMPS; i++)
+ {
+ header->lumps[i].fileofs = LittleLong(header->lumps[i].fileofs);
+ header->lumps[i].filelen = LittleLong(header->lumps[i].filelen);
+ }
+ }
mod->soundfromcenter = true;
mod->TraceBox = Mod_Q1BSP_TraceBox;
mod->brush.PointInLeaf = Mod_Q1BSP_PointInLeaf;
if (loadmodel->isworldmodel)
- Cvar_SetValue("halflifebsp", mod->brush.ishlbsp);
-
-// swap all the lumps
- mod_base = (qbyte *)header;
-
- header->version = LittleLong(header->version);
- for (i = 0;i < HEADER_LUMPS;i++)
{
- header->lumps[i].fileofs = LittleLong(header->lumps[i].fileofs);
- header->lumps[i].filelen = LittleLong(header->lumps[i].filelen);
+ Cvar_SetValue("halflifebsp", mod->brush.ishlbsp);
+ Cvar_SetValue("mcbsp", mod->brush.ismcbsp);
}
// load into heap
Mod_Q1BSP_LoadLeaffaces(&header->lumps[LUMP_MARKSURFACES]);
Mod_Q1BSP_LoadVisibility(&header->lumps[LUMP_VISIBILITY]);
// load submodels before leafs because they contain the number of vis leafs
- Mod_Q1BSP_LoadSubmodels(&header->lumps[LUMP_MODELS]);
+ Mod_Q1BSP_LoadSubmodels(&header->lumps[LUMP_MODELS], &hullinfo);
Mod_Q1BSP_LoadLeafs(&header->lumps[LUMP_LEAFS]);
Mod_Q1BSP_LoadNodes(&header->lumps[LUMP_NODES]);
- Mod_Q1BSP_LoadClipnodes(&header->lumps[LUMP_CLIPNODES]);
+ Mod_Q1BSP_LoadClipnodes(&header->lumps[LUMP_CLIPNODES], &hullinfo);
if (!mod->brushq1.lightdata)
mod->brush.LightPoint = NULL;
mod->DrawSky = NULL;
mod->Draw = R_Q1BSP_Draw;
mod->GetLightInfo = R_Q1BSP_GetLightInfo;
+ mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
mod->DrawLight = R_Q1BSP_DrawLight;
if (i != 0)
//Mod_Q1BSP_ProcessLightList();
if (developer.integer)
- Con_Printf("Some stats for q1bsp model \"%s\": %i faces, %i nodes, %i leafs, %i visleafs, %i visleafportals\n", loadmodel->name, loadmodel->num_surfaces, loadmodel->brush.num_nodes, loadmodel->brush.num_leafs, mod->brushq1.submodels[i].visleafs, loadmodel->brush.num_portals);
+ Con_Printf("Some stats for q1bsp model \"%s\": %i faces, %i nodes, %i leafs, %i visleafs, %i visleafportals\n", loadmodel->name, loadmodel->num_surfaces, loadmodel->brush.num_nodes, loadmodel->brush.num_leafs, mod->brush.num_pvsclusters, loadmodel->brush.num_portals);
}
static void Mod_Q2BSP_LoadEntities(lump_t *l)
*/
}
-void static Mod_Q2BSP_Load(model_t *mod, void *buffer)
+void static Mod_Q2BSP_Load(model_t *mod, void *buffer, void *bufferend)
{
int i;
q2dheader_t *header;
if (i != Q2BSPVERSION)
Host_Error("Mod_Q2BSP_Load: %s has wrong version number (%i, should be %i)", mod->name, i, Q2BSPVERSION);
mod->brush.ishlbsp = false;
+ mod->brush.ismcbsp = false;
if (loadmodel->isworldmodel)
+ {
Cvar_SetValue("halflifebsp", mod->brush.ishlbsp);
+ Cvar_SetValue("mcbsp", mod->brush.ismcbsp);
+ }
mod_base = (qbyte *)header;
Con_Printf(" %s", parameter[j]);
Con_Print("\n");
}
- if (passnumber == 0 && numparameters >= 1 && (flags & Q3SURFACEPARM_TRANS))
+ if (passnumber == 0 && numparameters >= 1)
{
- if (!strcasecmp(parameter[0], "blendfunc"))
+ if (!strcasecmp(parameter[0], "blendfunc") && (flags & Q3SURFACEPARM_TRANS))
{
if (numparameters == 2 && !strcasecmp(parameter[1], "add"))
flags2 |= Q3TEXTUREFLAG_ADDITIVE;
//if (R_TextureHasAlpha(out->skin.base))
// out->surfaceparms |= Q3SURFACEPARM_TRANS;
}
- if (!Mod_LoadSkinFrame(&out->skin, out->name, (((out->textureflags & Q3TEXTUREFLAG_NOMIPMAPS) || (out->surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (out->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP), false, false, true))
- if (!Mod_LoadSkinFrame(&out->skin, out->firstpasstexturename, (((out->textureflags & Q3TEXTUREFLAG_NOMIPMAPS) || (out->surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (out->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP), false, false, true))
+ if (!Mod_LoadSkinFrame(&out->skin, out->name, (((out->textureflags & Q3TEXTUREFLAG_NOMIPMAPS) || (out->surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (out->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP), false, true))
+ if (!Mod_LoadSkinFrame(&out->skin, out->firstpasstexturename, (((out->textureflags & Q3TEXTUREFLAG_NOMIPMAPS) || (out->surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (out->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP), false, true))
if (cls.state != ca_dedicated)
Con_Printf("%s: texture loading for shader \"%s\" failed (first layer \"%s\" not found either)\n", loadmodel->name, out->name, out->firstpasstexturename);
// no animation
{
strlcpy (out->shadername, in->shadername, sizeof (out->shadername));
n = LittleLong(in->brushindex);
- if (n < 0 || n >= loadmodel->brush.num_brushes)
- Host_Error("Mod_Q3BSP_LoadEffects: invalid brushindex %i (%i brushes)\n", n, loadmodel->brush.num_brushes);
+ if (n >= loadmodel->brush.num_brushes)
+ {
+ Con_Printf("Mod_Q3BSP_LoadEffects: invalid brushindex %i (%i brushes), setting to -1\n", n, loadmodel->brush.num_brushes);
+ n = -1;
+ }
out->brushindex = n;
out->unknown = LittleLong(in->unknown);
}
i = oldi;
in = oldin;
out = oldout;
- mesh = tempmeshlist[meshnum] = Mod_AllocSurfMesh(loadmodel->mempool, meshvertices, meshtriangles, false, false, true, false);
+ mesh = tempmeshlist[meshnum] = Mod_AllocSurfMesh(loadmodel->mempool, meshvertices, meshtriangles, false, true, false);
meshvertices = 0;
meshtriangles = 0;
for (;i < count && meshvertices + out->num_vertices <= mesh->num_vertices;i++, in++, out++)
Con_Print("\n");
}
// for per pixel lighting
- Mod_BuildTextureVectorsAndNormals(out->num_firstvertex, out->num_vertices, out->num_triangles, out->groupmesh->data_vertex3f, out->groupmesh->data_texcoordtexture2f, (out->groupmesh->data_element3i + 3 * out->num_firsttriangle), out->groupmesh->data_svector3f, out->groupmesh->data_tvector3f, out->groupmesh->data_normal3f);
+ Mod_BuildTextureVectorsAndNormals(out->num_firstvertex, out->num_vertices, out->num_triangles, out->groupmesh->data_vertex3f, out->groupmesh->data_texcoordtexture2f, (out->groupmesh->data_element3i + 3 * out->num_firsttriangle), out->groupmesh->data_svector3f, out->groupmesh->data_tvector3f, out->groupmesh->data_normal3f, true);
// calculate a bounding box
VectorClear(out->mins);
VectorClear(out->maxs);
loadmodel->brushq3.num_lightgrid_isize[1] = loadmodel->brushq3.num_lightgrid_imaxs[1] - loadmodel->brushq3.num_lightgrid_imins[1] + 1;
loadmodel->brushq3.num_lightgrid_isize[2] = loadmodel->brushq3.num_lightgrid_imaxs[2] - loadmodel->brushq3.num_lightgrid_imins[2] + 1;
count = loadmodel->brushq3.num_lightgrid_isize[0] * loadmodel->brushq3.num_lightgrid_isize[1] * loadmodel->brushq3.num_lightgrid_isize[2];
+ Matrix4x4_CreateScale3(&loadmodel->brushq3.num_lightgrid_indexfromworld, loadmodel->brushq3.num_lightgrid_scale[0], loadmodel->brushq3.num_lightgrid_scale[1], loadmodel->brushq3.num_lightgrid_scale[2]);
+ Matrix4x4_ConcatTranslate(&loadmodel->brushq3.num_lightgrid_indexfromworld, -loadmodel->brushq3.num_lightgrid_imins[0] * loadmodel->brushq3.num_lightgrid_cellsize[0], -loadmodel->brushq3.num_lightgrid_imins[1] * loadmodel->brushq3.num_lightgrid_cellsize[1], -loadmodel->brushq3.num_lightgrid_imins[2] * loadmodel->brushq3.num_lightgrid_cellsize[2]);
+
+ // if lump is empty there is nothing to load, we can deal with that in the LightPoint code
if (l->filelen)
{
if (l->filelen < count * (int)sizeof(*in))
Host_Error("Mod_Q3BSP_LoadLightGrid: invalid lightgrid lump size %i bytes, should be %i bytes (%ix%ix%i)\n", l->filelen, count * sizeof(*in), loadmodel->brushq3.num_lightgrid_dimensions[0], loadmodel->brushq3.num_lightgrid_dimensions[1], loadmodel->brushq3.num_lightgrid_dimensions[2]);
if (l->filelen != count * (int)sizeof(*in))
Con_Printf("Mod_Q3BSP_LoadLightGrid: Warning: calculated lightgrid size %i bytes does not match lump size %i\n", count * sizeof(*in), l->filelen);
- }
-
- out = Mem_Alloc(loadmodel->mempool, count * sizeof(*out));
- loadmodel->brushq3.data_lightgrid = out;
- loadmodel->brushq3.num_lightgrid = count;
-
- // no swapping or validation necessary
- if (l->filelen)
+ out = Mem_Alloc(loadmodel->mempool, count * sizeof(*out));
+ loadmodel->brushq3.data_lightgrid = out;
+ loadmodel->brushq3.num_lightgrid = count;
+ // no swapping or validation necessary
memcpy(out, in, count * (int)sizeof(*out));
- else
- {
- // no data, fill with white
- int i;
- for (i = 0;i < count;i++)
- {
- out[i].ambientrgb[0] = 128;
- out[i].ambientrgb[1] = 128;
- out[i].ambientrgb[2] = 128;
- out[i].diffusergb[0] = 0;
- out[i].diffusergb[1] = 0;
- out[i].diffusergb[2] = 0;
- out[i].diffusepitch = 0;
- out[i].diffuseyaw = 0;
- }
}
-
- Matrix4x4_CreateScale3(&loadmodel->brushq3.num_lightgrid_indexfromworld, loadmodel->brushq3.num_lightgrid_scale[0], loadmodel->brushq3.num_lightgrid_scale[1], loadmodel->brushq3.num_lightgrid_scale[2]);
- Matrix4x4_ConcatTranslate(&loadmodel->brushq3.num_lightgrid_indexfromworld, -loadmodel->brushq3.num_lightgrid_imins[0] * loadmodel->brushq3.num_lightgrid_cellsize[0], -loadmodel->brushq3.num_lightgrid_imins[1] * loadmodel->brushq3.num_lightgrid_cellsize[1], -loadmodel->brushq3.num_lightgrid_imins[2] * loadmodel->brushq3.num_lightgrid_cellsize[2]);
}
static void Mod_Q3BSP_LoadPVS(lump_t *l)
int i, j, k, index[3];
float transformed[3], blend1, blend2, blend, yaw, pitch, sinpitch;
q3dlightgrid_t *a, *s;
- // FIXME: write this
if (!model->brushq3.num_lightgrid)
{
ambientcolor[0] = 1;
loadmodel->brush.num_leafs = numleafs;
}
-void Mod_Q3BSP_Load(model_t *mod, void *buffer)
+void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend)
{
int i, j, numshadowmeshtriangles;
q3dheader_t *header;
i = LittleLong(header->version);
if (i != Q3BSPVERSION)
Host_Error("Mod_Q3BSP_Load: %s has wrong version number (%i, should be %i)", mod->name, i, Q3BSPVERSION);
- if (mod->isworldmodel)
- Cvar_SetValue("halflifebsp", false);
+ mod->brush.ishlbsp = false;
+ mod->brush.ismcbsp = false;
+ if (loadmodel->isworldmodel)
+ {
+ Cvar_SetValue("halflifebsp", mod->brush.ishlbsp);
+ Cvar_SetValue("mcbsp", mod->brush.ismcbsp);
+ }
mod->soundfromcenter = true;
mod->TraceBox = Mod_Q3BSP_TraceBox;
mod->brush.PointInLeaf = Mod_Q1BSP_PointInLeaf;
mod->Draw = R_Q1BSP_Draw;
mod->GetLightInfo = R_Q1BSP_GetLightInfo;
+ mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
mod->DrawLight = R_Q1BSP_DrawLight;
}
}
-void Mod_IBSP_Load(model_t *mod, void *buffer)
+void Mod_IBSP_Load(model_t *mod, void *buffer, void *bufferend)
{
int i = LittleLong(((int *)buffer)[1]);
if (i == Q3BSPVERSION)
- Mod_Q3BSP_Load(mod,buffer);
+ Mod_Q3BSP_Load(mod,buffer, bufferend);
else if (i == Q2BSPVERSION)
- Mod_Q2BSP_Load(mod,buffer);
+ Mod_Q2BSP_Load(mod,buffer, bufferend);
else
Host_Error("Mod_IBSP_Load: unknown/unsupported version %i\n", i);
}
-void Mod_MAP_Load(model_t *mod, void *buffer)
+void Mod_MAP_Load(model_t *mod, void *buffer, void *bufferend)
{
Host_Error("Mod_MAP_Load: not yet implemented\n");
}