#include "quakedef.h"
-model_t *loadmodel;
+model_t *loadmodel;
// LordHavoc: increased from 512 to 2048
#define MAX_MOD_KNOWN 2048
-model_t mod_known[MAX_MOD_KNOWN];
+static model_t mod_known[MAX_MOD_KNOWN];
-void mod_start()
+rtexture_t *r_notexture;
+rtexturepool_t *r_notexturepool;
+
+texture_t r_surf_notexture;
+
+void Mod_SetupNoTexture(void)
+{
+ int x, y;
+ qbyte pix[16][16][4];
+
+ // this makes a light grey/dark grey checkerboard texture
+ for (y = 0;y < 16;y++)
+ {
+ for (x = 0;x < 16;x++)
+ {
+ if ((y < 8) ^ (x < 8))
+ {
+ pix[y][x][0] = 128;
+ pix[y][x][1] = 128;
+ pix[y][x][2] = 128;
+ pix[y][x][3] = 255;
+ }
+ else
+ {
+ pix[y][x][0] = 64;
+ pix[y][x][1] = 64;
+ pix[y][x][2] = 64;
+ pix[y][x][3] = 255;
+ }
+ }
+ }
+
+ r_notexturepool = R_AllocTexturePool();
+ r_notexture = R_LoadTexture(r_notexturepool, "notexture", 16, 16, &pix[0][0][0], TEXTYPE_RGBA, TEXF_MIPMAP);
+}
+
+extern void Mod_BrushStartup (void);
+extern void Mod_BrushShutdown (void);
+
+static void mod_start(void)
{
int i;
for (i = 0;i < MAX_MOD_KNOWN;i++)
if (mod_known[i].name[0])
Mod_UnloadModel(&mod_known[i]);
+ Mod_LoadModels();
+
+ Mod_SetupNoTexture();
+ Mod_BrushStartup();
}
-void mod_shutdown()
+static void mod_shutdown(void)
{
int i;
for (i = 0;i < MAX_MOD_KNOWN;i++)
if (mod_known[i].name[0])
Mod_UnloadModel(&mod_known[i]);
+
+ R_FreeTexturePool(&r_notexturepool);
+ Mod_BrushShutdown();
}
-void mod_newmap()
+static void mod_newmap(void)
{
}
{
int crc;
void *buf;
- char tempname[MAX_QPATH];
mod->used = true;
if (mod->name[0] == '*') // submodel
return mod;
- if (checkdisk)
+ crc = 0;
+ buf = NULL;
+ if (!mod->needload)
{
- // load the file
- buf = COM_LoadFile (mod->name, false);
- if (!buf)
+ if (checkdisk)
{
- if (crash)
- Host_Error ("Mod_LoadModel: %s not found", mod->name); // LordHavoc: Sys_Error was *ANNOYING*
- return NULL;
- }
+ buf = COM_LoadFile (mod->name, false);
+ if (!buf)
+ {
+ if (crash)
+ Host_Error ("Mod_LoadModel: %s not found", mod->name); // LordHavoc: Sys_Error was *ANNOYING*
+ return NULL;
+ }
- crc = CRC_Block(buf, com_filesize);
+ crc = CRC_Block(buf, com_filesize);
+ }
+ else
+ crc = mod->crc;
- if (!mod->needload && mod->crc == crc && mod->isworldmodel == isworldmodel)
+ if (mod->crc == crc && mod->isworldmodel == isworldmodel)
{
- Mem_Free(buf);
+ if (buf)
+ Mem_Free(buf);
return mod; // already loaded
}
-
- Con_DPrintf("loading model %s\n", mod->name);
}
- else
- {
- if (!mod->needload && mod->isworldmodel == isworldmodel)
- return mod; // already loaded
- Con_DPrintf("loading model %s\n", mod->name);
+ Con_DPrintf("loading model %s\n", mod->name);
+ if (!buf)
+ {
buf = COM_LoadFile (mod->name, false);
if (!buf)
{
if (crash)
- Host_Error ("Mod_LoadModel: %s not found", mod->name); // LordHavoc: Sys_Error was *ANNOYING*
+ Host_Error ("Mod_LoadModel: %s not found", mod->name);
return NULL;
}
crc = CRC_Block(buf, com_filesize);
}
- // make sure nothing got trashed
- Mem_CheckSentinelsGlobal();
-
// allocate a new model
loadmodel = mod;
- // LordHavoc: clear the model struct
- strcpy(tempname, mod->name);
- Mod_FreeModel(mod);
-
- strcpy(mod->name, tempname);
+ // LordHavoc: unload the existing model in this slot (if there is one)
+ Mod_UnloadModel(mod);
mod->isworldmodel = isworldmodel;
mod->needload = false;
mod->used = true;
// all models use memory, so allocate a memory pool
mod->mempool = Mem_AllocPool(mod->name);
// all models load textures, so allocate a texture pool
- mod->texturepool = R_AllocTexturePool();
+ if (cls.state != ca_dedicated)
+ mod->texturepool = R_AllocTexturePool();
// call the apropriate loader
if (!memcmp(buf, "IDPO" , 4)) Mod_LoadAliasModel (mod, buf);
Mem_Free(buf);
- // make sure nothing got trashed
- Mem_CheckSentinelsGlobal();
-
return mod;
}
{
if (mod)
{
- if (!mod->needload)
+ if (mod->needload)
+ Mod_LoadModel(mod, true, true, mod->isworldmodel);
+ else
{
if (mod->type == mod_invalid)
Host_Error("Mod_CheckLoaded: invalid model\n");
mod->used = true;
return;
}
-
- Mod_LoadModel(mod, true, true, mod->isworldmodel);
}
}
*/
void Mod_ClearAll (void)
{
- /*
- int i;
- model_t *mod;
-
- for (i = 0, mod = mod_known;i < MAX_MOD_KNOWN;i++, mod++)
- if (mod->name[0])
- if (mod->usesheap)
- Mod_FreeModel(mod);
- */
}
void Mod_ClearUsed(void)
{
- int i;
- model_t *mod;
+ int i;
+ model_t *mod;
for (i = 0, mod = mod_known;i < MAX_MOD_KNOWN;i++, mod++)
if (mod->name[0])
void Mod_PurgeUnused(void)
{
- int i;
- model_t *mod;
+ int i;
+ model_t *mod;
for (i = 0, mod = mod_known;i < MAX_MOD_KNOWN;i++, mod++)
if (mod->name[0])
Mod_FreeModel(mod);
}
+void Mod_LoadModels(void)
+{
+ int i;
+ model_t *mod;
+
+ for (i = 0, mod = mod_known;i < MAX_MOD_KNOWN;i++, mod++)
+ if (mod->name[0])
+ if (mod->used)
+ Mod_CheckLoaded(mod);
+}
+
/*
==================
Mod_FindName
==================
*/
-model_t *Mod_FindName (char *name)
+model_t *Mod_FindName (const char *name)
{
- int i;
- model_t *mod, *freemod;
+ int i;
+ model_t *mod, *freemod;
if (!name[0])
Host_Error ("Mod_ForName: NULL name");
==================
*/
-void Mod_TouchModel (char *name)
+void Mod_TouchModel (const char *name)
{
model_t *mod;
Loads in a model for the given name
==================
*/
-model_t *Mod_ForName (char *name, qboolean crash, qboolean checkdisk, qboolean isworldmodel)
+model_t *Mod_ForName (const char *name, qboolean crash, qboolean checkdisk, qboolean isworldmodel)
{
- model_t *mod;
-
- mod = Mod_FindName (name);
- mod->used = true;
-
- return Mod_LoadModel (mod, crash, checkdisk, isworldmodel);
+ return Mod_LoadModel (Mod_FindName (name), crash, checkdisk, isworldmodel);
}
-byte *mod_base;
-
-/*
-=================
-RadiusFromBounds
-=================
-*/
-/*
-float RadiusFromBounds (vec3_t mins, vec3_t maxs)
-{
- int i;
- vec3_t corner;
-
- for (i=0 ; i<3 ; i++)
- corner[i] = fabs(mins[i]) > fabs(maxs[i]) ? fabs(mins[i]) : fabs(maxs[i]);
+qbyte *mod_base;
- return Length (corner);
-}
-*/
//=============================================================================
for (i = 0;i < MAX_MOD_KNOWN;i++)
if (mod_known[i].name[0])
Mod_UnloadModel(&mod_known[i]);
+ Mod_LoadModels();
}
+int Mod_FindTriangleWithEdge(int *elements, int numtriangles, int start, int end)
+{
+ int i;
+ for (i = 0;i < numtriangles;i++, elements += 3)
+ {
+ if (elements[0] == start && elements[1] == end)
+ return i;
+ if (elements[1] == start && elements[2] == end)
+ return i;
+ if (elements[2] == start && elements[0] == end)
+ return i;
+ }
+ return -1;
+}
+
+void Mod_BuildTriangleNeighbors(int *neighbors, int *elements, int numtriangles)
+{
+ int i, *e, *n;
+ for (i = 0, e = elements, n = neighbors;i < numtriangles;i++, e += 3, n += 3)
+ {
+ n[0] = Mod_FindTriangleWithEdge(elements, numtriangles, e[1], e[0]);
+ n[1] = Mod_FindTriangleWithEdge(elements, numtriangles, e[2], e[1]);
+ n[2] = Mod_FindTriangleWithEdge(elements, numtriangles, e[0], e[2]);
+ }
+}