ssize = (surface->lightmapinfo->extents[0] >> 4) + 1;
tsize = (surface->lightmapinfo->extents[1] >> 4) + 1;
- // stainmap for permanent marks on walls
- surface->lightmapinfo->stainsamples = (unsigned char *)Mem_Alloc(loadmodel->mempool, ssize * tsize * 3);
- // clear to white
- memset(surface->lightmapinfo->stainsamples, 255, ssize * tsize * 3);
-
if (!lightmaptexture || !Mod_Q1BSP_AllocLightmapBlock(&allocState, lightmapsize, lightmapsize, ssize, tsize, &lightmapx, &lightmapy))
{
// allocate a texture pool if we need it
}
}
+
+ if (cl_stainmaps.integer)
+ {
+ // allocate stainmaps for permanent marks on walls
+ int stainmapsize = 0;
+ unsigned char *stainsamples = NULL;
+ for (surfacenum = 0, surface = loadmodel->data_surfaces;surfacenum < count;surfacenum++, surface++)
+ {
+ ssize = (surface->lightmapinfo->extents[0] >> 4) + 1;
+ tsize = (surface->lightmapinfo->extents[1] >> 4) + 1;
+ stainmapsize += ssize * tsize * 3;
+ }
+ // allocate and clear to white
+ stainsamples = (unsigned char *)Mem_Alloc(loadmodel->mempool, stainmapsize);
+ memset(stainsamples, 255, stainmapsize);
+ // assign pointers
+ for (surfacenum = 0, surface = loadmodel->data_surfaces;surfacenum < count;surfacenum++, surface++)
+ {
+ ssize = (surface->lightmapinfo->extents[0] >> 4) + 1;
+ tsize = (surface->lightmapinfo->extents[1] >> 4) + 1;
+ surface->lightmapinfo->stainsamples = stainsamples;
+ stainsamples += ssize * tsize * 3;
+ }
+ }
}
+
+ // generate ushort elements array if possible
+ if (loadmodel->surfmesh.data_element3s)
+ for (i = 0;i < loadmodel->surfmesh.num_triangles*3;i++)
+ loadmodel->surfmesh.data_element3s[i] = loadmodel->surfmesh.data_element3i[i];
}
static void Mod_Q1BSP_LoadNodes_RecursiveSetParent(mnode_t *node, mnode_t *parent)
mod->brush.LightPoint = NULL;
mod->brush.AmbientSoundLevelsForPoint = NULL;
}
+ // copy the submodel bounds, then enlarge the yaw and rotated bounds according to radius
+ VectorCopy(bm->mins, mod->normalmins);
+ VectorCopy(bm->maxs, mod->normalmaxs);
+ VectorCopy(bm->mins, mod->yawmins);
+ VectorCopy(bm->maxs, mod->yawmaxs);
+ VectorCopy(bm->mins, mod->rotatedmins);
+ VectorCopy(bm->maxs, mod->rotatedmaxs);
if (mod->nummodelsurfaces)
{
- // LordHavoc: calculate bmodel bounding box rather than trusting what it says
- mod->normalmins[0] = mod->normalmins[1] = mod->normalmins[2] = 1000000000.0f;
- mod->normalmaxs[0] = mod->normalmaxs[1] = mod->normalmaxs[2] = -1000000000.0f;
modelyawradius = 0;
modelradius = 0;
for (j = 0, surface = &mod->data_surfaces[mod->firstmodelsurface];j < mod->nummodelsurfaces;j++, surface++)
// calculate bounding shapes
for (k = 0, vec = (loadmodel->surfmesh.data_vertex3f + 3 * surface->num_firstvertex);k < surface->num_vertices;k++, vec += 3)
{
- if (mod->normalmins[0] > vec[0]) mod->normalmins[0] = vec[0];
- if (mod->normalmins[1] > vec[1]) mod->normalmins[1] = vec[1];
- if (mod->normalmins[2] > vec[2]) mod->normalmins[2] = vec[2];
- if (mod->normalmaxs[0] < vec[0]) mod->normalmaxs[0] = vec[0];
- if (mod->normalmaxs[1] < vec[1]) mod->normalmaxs[1] = vec[1];
- if (mod->normalmaxs[2] < vec[2]) mod->normalmaxs[2] = vec[2];
dist = vec[0]*vec[0]+vec[1]*vec[1];
if (modelyawradius < dist)
modelyawradius = dist;
}
modelyawradius = sqrt(modelyawradius);
modelradius = sqrt(modelradius);
- mod->yawmins[0] = mod->yawmins[1] = - (mod->yawmaxs[0] = mod->yawmaxs[1] = modelyawradius);
- mod->yawmins[2] = mod->normalmins[2];
- mod->yawmaxs[2] = mod->normalmaxs[2];
- mod->rotatedmins[0] = mod->rotatedmins[1] = mod->rotatedmins[2] = -modelradius;
- mod->rotatedmaxs[0] = mod->rotatedmaxs[1] = mod->rotatedmaxs[2] = modelradius;
+ mod->yawmins[0] = min(mod->yawmins[0], -modelyawradius);
+ mod->yawmaxs[0] = min(mod->yawmaxs[0], -modelyawradius);
+ mod->yawmins[1] = min(mod->yawmins[1], modelyawradius);
+ mod->yawmaxs[1] = min(mod->yawmaxs[1], modelyawradius);
+ mod->rotatedmins[0] = min(mod->rotatedmins[0], -modelradius);
+ mod->rotatedmaxs[0] = min(mod->rotatedmaxs[0], modelradius);
+ mod->rotatedmins[1] = min(mod->rotatedmins[1], -modelradius);
+ mod->rotatedmaxs[1] = min(mod->rotatedmaxs[1], modelradius);
+ mod->rotatedmins[2] = min(mod->rotatedmins[2], -modelradius);
+ mod->rotatedmaxs[2] = min(mod->rotatedmaxs[2], modelradius);
mod->radius = modelradius;
mod->radius2 = modelradius * modelradius;
{
// check face type first
type = LittleLong(in->type);
- if (type != Q3FACETYPE_POLYGON
+ if (type != Q3FACETYPE_FLAT
&& type != Q3FACETYPE_PATCH
&& type != Q3FACETYPE_MESH
&& type != Q3FACETYPE_FLARE)
}
switch(type)
{
- case Q3FACETYPE_POLYGON:
+ case Q3FACETYPE_FLAT:
case Q3FACETYPE_MESH:
// no processing necessary
break;
out->num_firsttriangle = meshtriangles;
switch(type)
{
- case Q3FACETYPE_POLYGON:
+ case Q3FACETYPE_FLAT:
case Q3FACETYPE_MESH:
// no processing necessary, except for lightmap merging
for (j = 0;j < out->num_vertices;j++)
// for per pixel lighting
Mod_BuildTextureVectorsFromNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_texcoordtexture2f, loadmodel->surfmesh.data_normal3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_svector3f, loadmodel->surfmesh.data_tvector3f, true);
+ // generate ushort elements array if possible
+ if (loadmodel->surfmesh.data_element3s)
+ for (i = 0;i < loadmodel->surfmesh.num_triangles*3;i++)
+ loadmodel->surfmesh.data_element3s[i] = loadmodel->surfmesh.data_element3i[i];
+
// free the no longer needed vertex data
loadmodel->brushq3.num_vertices = 0;
if (loadmodel->brushq3.data_vertex3f)
mod = loadmodel;
for (i = 0;i < loadmodel->brush.numsubmodels;i++)
{
- qboolean boxready;
if (i > 0)
{
char name[10];
// because q3map2 sometimes lies (mostly to affect the lightgrid),
// which can in turn mess up the farclip (as well as culling when
// outside the level - an unimportant concern)
- boxready = false;
//printf("Editing model %d... BEFORE re-bounding: %f %f %f - %f %f %f\n", i, mod->normalmins[0], mod->normalmins[1], mod->normalmins[2], mod->normalmaxs[0], mod->normalmaxs[1], mod->normalmaxs[2]);
for (j = 0;j < mod->nummodelsurfaces;j++)
int k;
if (!surface->num_vertices)
continue;
- if (!boxready)
- // (div0) do we REALLY want this? Above it says "enlarge the
- // bounding box", but this completely regenerates this.
- // Remove this part and the variable to make it ACTUALLY
- // enlarge the bbox.
- {
- VectorCopy(v, mod->normalmins);
- VectorCopy(v, mod->normalmaxs);
- boxready = true;
- }
for (k = 0;k < surface->num_vertices;k++, v += 3)
{
mod->normalmins[0] = min(mod->normalmins[0], v[0]);