model_t *loadmodel;
-// LordHavoc: increased from 512 to 2048
-#define MAX_MOD_KNOWN 2048
+// LordHavoc: was 512
+#define MAX_MOD_KNOWN (MAX_MODELS + 256)
static model_t mod_known[MAX_MOD_KNOWN];
rtexturepool_t *mod_shared_texturepool;
{
for (surfacenum = 0, surface = mod_known[i].brush.data_surfaces;surfacenum < mod_known[i].brush.num_surfaces;surfacenum++, surface++)
{
- if (surface->stainsamples)
+ if (surface->lightmapinfo && surface->lightmapinfo->stainsamples)
{
- ssize = (surface->extents[0] >> 4) + 1;
- tsize = (surface->extents[1] >> 4) + 1;
-
- if (ssize > 256 || tsize > 256)
- Host_Error("Bad surface extents");
-
- if (surface->stainsamples)
- memset(surface->stainsamples, 255, ssize * tsize * 3);
-
+ ssize = (surface->lightmapinfo->extents[0] >> 4) + 1;
+ tsize = (surface->lightmapinfo->extents[1] >> 4) + 1;
+ memset(surface->lightmapinfo->stainsamples, 255, ssize * tsize * 3);
surface->cached_dlight = true;
}
}
else if (!memcmp(buf, "IDP2", 4)) Mod_IDP2_Load(mod, buf);
else if (!memcmp(buf, "IDP3", 4)) Mod_IDP3_Load(mod, buf);
else if (!memcmp(buf, "IDSP", 4)) Mod_IDSP_Load(mod, buf);
+ else if (!memcmp(buf, "IDS2", 4)) Mod_IDS2_Load(mod, buf);
else if (!memcmp(buf, "IBSP", 4)) Mod_IBSP_Load(mod, buf);
else if (!memcmp(buf, "ZYMOTICMODEL", 12)) Mod_ZYMOTICMODEL_Load(mod, buf);
else if (strlen(mod->name) >= 4 && !strcmp(mod->name - 4, ".map")) Mod_MAP_Load(mod, buf);
}
// warning: this is an expensive function!
-void Mod_BuildNormals(int numverts, int numtriangles, const float *vertex3f, const int *elements, float *normal3f)
+void Mod_BuildNormals(int firstvertex, int numvertices, int numtriangles, const float *vertex3f, const int *elements, float *normal3f)
{
int i, tnum;
float normal[3], *v;
const int *e;
// clear the vectors
- memset(normal3f, 0, numverts * sizeof(float[3]));
+ memset(normal3f + 3 * firstvertex, 0, numvertices * sizeof(float[3]));
// process each vertex of each triangle and accumulate the results
for (tnum = 0, e = elements;tnum < numtriangles;tnum++, e += 3)
{
}
// now we could divide the vectors by the number of averaged values on
// each vertex... but instead normalize them
- for (i = 0, v = normal3f;i < numverts;i++, v += 3)
+ for (i = 0, v = normal3f + 3 * firstvertex;i < numvertices;i++, v += 3)
VectorNormalize(v);
}
}
// warning: this is a very expensive function!
-void Mod_BuildTextureVectorsAndNormals(int numverts, int numtriangles, const float *vertex3f, const float *texcoord2f, const int *elements, float *svector3f, float *tvector3f, float *normal3f)
+void Mod_BuildTextureVectorsAndNormals(int firstvertex, int numvertices, int numtriangles, const float *vertex3f, const float *texcoord2f, const int *elements, float *svector3f, float *tvector3f, float *normal3f)
{
int i, tnum;
float sdir[3], tdir[3], normal[3], *v;
const int *e;
// clear the vectors
if (svector3f)
- memset(svector3f, 0, numverts * sizeof(float[3]));
+ memset(svector3f + 3 * firstvertex, 0, numvertices * sizeof(float[3]));
if (tvector3f)
- memset(tvector3f, 0, numverts * sizeof(float[3]));
+ memset(tvector3f + 3 * firstvertex, 0, numvertices * sizeof(float[3]));
if (normal3f)
- memset(normal3f, 0, numverts * sizeof(float[3]));
+ memset(normal3f + 3 * firstvertex, 0, numvertices * sizeof(float[3]));
// process each vertex of each triangle and accumulate the results
for (tnum = 0, e = elements;tnum < numtriangles;tnum++, e += 3)
{
// each vertex... but instead normalize them
// 4 assignments, 1 divide, 1 sqrt, 2 adds, 6 multiplies
if (svector3f)
- for (i = 0, v = svector3f;i < numverts;i++, v += 3)
+ for (i = 0, v = svector3f + 3 * firstvertex;i < numvertices;i++, v += 3)
VectorNormalize(v);
// 4 assignments, 1 divide, 1 sqrt, 2 adds, 6 multiplies
if (tvector3f)
- for (i = 0, v = tvector3f;i < numverts;i++, v += 3)
+ for (i = 0, v = tvector3f + 3 * firstvertex;i < numvertices;i++, v += 3)
VectorNormalize(v);
// 4 assignments, 1 divide, 1 sqrt, 2 adds, 6 multiplies
if (normal3f)
- for (i = 0, v = normal3f;i < numverts;i++, v += 3)
+ for (i = 0, v = normal3f + 3 * firstvertex;i < numvertices;i++, v += 3)
VectorNormalize(v);
}
-surfmesh_t *Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, int numcollisionvertices, int numcollisiontriangles, qboolean detailtexcoords, qboolean lightmapoffsets, qboolean vertexcolors)
+surfmesh_t *Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, qboolean detailtexcoords, qboolean lightmapoffsets, qboolean vertexcolors, qboolean neighbors)
{
surfmesh_t *mesh;
qbyte *data;
- mesh = Mem_Alloc(mempool, sizeof(surfmesh_t) + numvertices * (3 + 3 + 3 + 3 + 2 + 2 + (detailtexcoords ? 2 : 0) + (vertexcolors ? 4 : 0)) * sizeof(float) + numvertices * (lightmapoffsets ? 1 : 0) * sizeof(int) + numtriangles * (3 + 3) * sizeof(int) + numcollisionvertices * sizeof(float[3]) + numcollisiontriangles * sizeof(int[3]));
+ mesh = Mem_Alloc(mempool, sizeof(surfmesh_t) + numvertices * (3 + 3 + 3 + 3 + 2 + 2 + (detailtexcoords ? 2 : 0) + (vertexcolors ? 4 : 0)) * sizeof(float) + numvertices * (lightmapoffsets ? 1 : 0) * sizeof(int) + numtriangles * (3 + 3 + (neighbors ? 3 : 0)) * sizeof(int));
mesh->num_vertices = numvertices;
mesh->num_triangles = numtriangles;
- mesh->num_collisionvertices = numcollisionvertices;
- mesh->num_collisiontriangles = numcollisiontriangles;
data = (qbyte *)(mesh + 1);
if (mesh->num_vertices)
{
if (mesh->num_triangles)
{
mesh->data_element3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles;
- mesh->data_neighbor3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles;
+ mesh->data_element3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles;
+ if (neighbors)
+ mesh->data_neighbor3i = (int *)data, data += sizeof(int[3]) * mesh->num_triangles;
}
- if (mesh->num_collisionvertices)
- mesh->data_collisionvertex3f = (float *)data, data += sizeof(float[3]) * mesh->num_collisionvertices;
- if (mesh->num_collisiontriangles)
- mesh->data_collisionelement3i = (int *)data, data += sizeof(int[3]) * mesh->num_collisiontriangles;
return mesh;
}