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();
+ model_t *mod;
+
+ for (i = 0, mod = mod_known;i < MAX_MOD_KNOWN;i++, mod++)
+ if (mod->name[0])
+ if (mod->used)
+ Mod_LoadModel(mod, true, false, mod->isworldmodel);
}
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]);
+ model_t *mod;
+
+ for (i = 0, mod = mod_known;i < MAX_MOD_KNOWN;i++, mod++)
+ if (mod->loaded)
+ Mod_UnloadModel(mod);
}
static void mod_newmap(void)
R_RegisterModule("Models", mod_start, mod_shutdown, mod_newmap);
}
-void Mod_FreeModel (model_t *mod)
-{
- R_FreeTexturePool(&mod->texturepool);
- Mem_FreePool(&mod->mempool);
-
- // clear the struct to make it available
- memset(mod, 0, sizeof(model_t));
-}
-
void Mod_UnloadModel (model_t *mod)
{
char name[MAX_QPATH];
strcpy(name, mod->name);
isworldmodel = mod->isworldmodel;
used = mod->used;
- Mod_FreeModel(mod);
+ // free textures/memory attached to the model
+ R_FreeTexturePool(&mod->texturepool);
+ Mem_FreePool(&mod->mempool);
+ // clear the struct to make it available
+ memset(mod, 0, sizeof(model_t));
+ // restore the fields we want to preserve
strcpy(mod->name, name);
mod->isworldmodel = isworldmodel;
mod->used = used;
int num;
unsigned int crc;
void *buf;
+ fs_offset_t filesize;
mod->used = true;
{
if (checkdisk && mod->loaded)
Con_DPrintf("checking model %s\n", mod->name);
- buf = FS_LoadFile (mod->name, tempmempool, false);
+ buf = FS_LoadFile (mod->name, tempmempool, false, &filesize);
if (buf)
{
- crc = CRC_Block((qbyte *)buf, fs_filesize);
+ crc = CRC_Block((unsigned char *)buf, filesize);
if (mod->crc != crc)
mod->loaded = false;
}
Con_DPrintf("loading model %s\n", mod->name);
// LordHavoc: unload the existing model in this slot (if there is one)
- Mod_UnloadModel(mod);
+ if (mod->loaded)
+ Mod_UnloadModel(mod);
// load the model
mod->isworldmodel = isworldmodel;
if (buf)
{
- char *bufend = (char *)buf + fs_filesize;
+ char *bufend = (char *)buf + filesize;
num = LittleLong(*((int *)buf));
// call the apropriate loader
loadmodel = mod;
void Mod_ClearUsed(void)
{
+#if 0
int i;
model_t *mod;
for (i = 0, mod = mod_known;i < MAX_MOD_KNOWN;i++, mod++)
if (mod->name[0])
mod->used = false;
+#endif
}
void Mod_PurgeUnused(void)
for (i = 0, mod = mod_known;i < MAX_MOD_KNOWN;i++, mod++)
if (mod->name[0])
if (!mod->used)
- Mod_FreeModel(mod);
+ Mod_UnloadModel(mod);
}
// only used during loading!
void Mod_RemoveStaleWorldModels(model_t *skip)
-{
- int i;
- for (i = 0;i < MAX_MOD_KNOWN;i++)
- if (mod_known[i].isworldmodel && skip != &mod_known[i])
- Mod_UnloadModel(mod_known + i);
-}
-
-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);
+ {
+ if (mod->isworldmodel && mod->loaded && skip != mod)
+ {
+ Mod_UnloadModel(mod);
+ mod->isworldmodel = false;
+ mod->used = false;
+ }
+ }
}
/*
return mod;
}
- Host_Error ("Mod_FindName: ran out of models\n");
+ Host_Error ("Mod_FindName: ran out of models");
return NULL;
}
*/
model_t *Mod_ForName(const char *name, qboolean crash, qboolean checkdisk, qboolean isworldmodel)
{
- return Mod_LoadModel(Mod_FindName(name), crash, checkdisk, isworldmodel);
+ model_t *model;
+ model = Mod_FindName(name);
+ if (model->name[0] != '*' && (!model->loaded || checkdisk))
+ Mod_LoadModel(model, crash, checkdisk, isworldmodel);
+ return model;
}
-qbyte *mod_base;
+unsigned char *mod_base;
//=============================================================================
int Mod_BuildVertexRemapTableFromElements(int numelements, const int *elements, int numvertices, int *remapvertices)
{
int i, count;
- qbyte *used;
- used = (qbyte *)Mem_Alloc(tempmempool, numvertices);
+ unsigned char *used;
+ used = (unsigned char *)Mem_Alloc(tempmempool, numvertices);
memset(used, 0, numvertices);
for (i = 0;i < numelements;i++)
used[elements[i]] = 1;
// 6 multiply, 9 subtract
VectorSubtract(v1, v0, v10);
VectorSubtract(v2, v0, v20);
- normal3f[0] = v10[1] * v20[2] - v10[2] * v20[1];
- normal3f[1] = v10[2] * v20[0] - v10[0] * v20[2];
- normal3f[2] = v10[0] * v20[1] - v10[1] * v20[0];
+ normal3f[0] = v20[1] * v10[2] - v20[2] * v10[1];
+ normal3f[1] = v20[2] * v10[0] - v20[0] * v10[2];
+ normal3f[2] = v20[0] * v10[1] - v20[1] * v10[0];
// 12 multiply, 10 subtract
tc10[1] = tc1[1] - tc0[1];
tc20[1] = tc2[1] - tc0[1];
surfmesh_t *Mod_AllocSurfMesh(mempool_t *mempool, int numvertices, int numtriangles, qboolean lightmapoffsets, qboolean vertexcolors, qboolean neighbors)
{
surfmesh_t *mesh;
- qbyte *data;
+ unsigned char *data;
mesh = (surfmesh_t *)Mem_Alloc(mempool, sizeof(surfmesh_t) + numvertices * (3 + 3 + 3 + 3 + 2 + 2 + (vertexcolors ? 4 : 0)) * sizeof(float) + numvertices * (lightmapoffsets ? 1 : 0) * sizeof(int) + numtriangles * (3 + (neighbors ? 3 : 0)) * sizeof(int));
mesh->num_vertices = numvertices;
mesh->num_triangles = numtriangles;
- data = (qbyte *)(mesh + 1);
+ data = (unsigned char *)(mesh + 1);
if (mesh->num_vertices)
{
mesh->data_vertex3f = (float *)data, data += sizeof(float[3]) * mesh->num_vertices;
shadowmesh_t *Mod_ShadowMesh_Alloc(mempool_t *mempool, int maxverts, int maxtriangles, rtexture_t *map_diffuse, rtexture_t *map_specular, rtexture_t *map_normal, int light, int neighbors, int expandable)
{
shadowmesh_t *newmesh;
- qbyte *data;
+ unsigned char *data;
int size;
size = sizeof(shadowmesh_t);
size += maxverts * sizeof(float[3]);
size += maxtriangles * sizeof(int[3]);
if (expandable)
size += SHADOWMESHVERTEXHASH * sizeof(shadowmeshvertexhash_t *) + maxverts * sizeof(shadowmeshvertexhash_t);
- data = (qbyte *)Mem_Alloc(mempool, size);
+ data = (unsigned char *)Mem_Alloc(mempool, size);
newmesh = (shadowmesh_t *)data;data += sizeof(*newmesh);
newmesh->map_diffuse = map_diffuse;
newmesh->map_specular = map_specular;
}
}
-static rtexture_t *GL_TextureForSkinLayer(const qbyte *in, int width, int height, const char *name, const unsigned int *palette, int textureflags)
+static rtexture_t *GL_TextureForSkinLayer(const unsigned char *in, int width, int height, const char *name, const unsigned int *palette, int textureflags)
{
int i;
for (i = 0;i < width*height;i++)
- if (((qbyte *)&palette[in[i]])[3] > 0)
+ if (((unsigned char *)&palette[in[i]])[3] > 0)
return R_LoadTexture2D (loadmodel->texturepool, name, width, height, in, TEXTYPE_PALETTE, textureflags, palette);
return NULL;
}
return true;
}
-int Mod_LoadSkinFrame_Internal(skinframe_t *skinframe, char *basename, int textureflags, int loadpantsandshirt, int loadglowtexture, qbyte *skindata, int width, int height)
+int Mod_LoadSkinFrame_Internal(skinframe_t *skinframe, char *basename, int textureflags, int loadpantsandshirt, int loadglowtexture, unsigned char *skindata, int width, int height)
{
- qbyte *temp1, *temp2;
+ unsigned char *temp1, *temp2;
memset(skinframe, 0, sizeof(*skinframe));
if (!skindata)
return false;
if (r_shadow_bumpscale_basetexture.value > 0)
{
- temp1 = (qbyte *)Mem_Alloc(loadmodel->mempool, width * height * 8);
+ temp1 = (unsigned char *)Mem_Alloc(loadmodel->mempool, width * height * 8);
temp2 = temp1 + width * height * 4;
Image_Copy8bitRGBA(skindata, temp1, width * height, palette_nofullbrights);
Image_HeightmapToNormalmap(temp1, temp2, width, height, false, r_shadow_bumpscale_basetexture.value);
return true;
}
-void Mod_GetTerrainVertex3fTexCoord2fFromRGBA(const qbyte *imagepixels, int imagewidth, int imageheight, int ix, int iy, float *vertex3f, float *texcoord2f, matrix4x4_t *pixelstepmatrix, matrix4x4_t *pixeltexturestepmatrix)
+void Mod_GetTerrainVertex3fTexCoord2fFromRGBA(const unsigned char *imagepixels, int imagewidth, int imageheight, int ix, int iy, float *vertex3f, float *texcoord2f, matrix4x4_t *pixelstepmatrix, matrix4x4_t *pixeltexturestepmatrix)
{
float v[3], tc[3];
v[0] = ix;
texcoord2f[1] = tc[1];
}
-void Mod_GetTerrainVertexFromRGBA(const qbyte *imagepixels, int imagewidth, int imageheight, int ix, int iy, float *vertex3f, float *svector3f, float *tvector3f, float *normal3f, float *texcoord2f, matrix4x4_t *pixelstepmatrix, matrix4x4_t *pixeltexturestepmatrix)
+void Mod_GetTerrainVertexFromRGBA(const unsigned char *imagepixels, int imagewidth, int imageheight, int ix, int iy, float *vertex3f, float *svector3f, float *tvector3f, float *normal3f, float *texcoord2f, matrix4x4_t *pixelstepmatrix, matrix4x4_t *pixeltexturestepmatrix)
{
float vup[3], vdown[3], vleft[3], vright[3];
float tcup[3], tcdown[3], tcleft[3], tcright[3];
VectorAdd(normal3f, nl, normal3f);
}
-void Mod_ConstructTerrainPatchFromRGBA(const qbyte *imagepixels, int imagewidth, int imageheight, int x1, int y1, int width, int height, int *element3i, int *neighbor3i, float *vertex3f, float *svector3f, float *tvector3f, float *normal3f, float *texcoord2f, matrix4x4_t *pixelstepmatrix, matrix4x4_t *pixeltexturestepmatrix)
+void Mod_ConstructTerrainPatchFromRGBA(const unsigned char *imagepixels, int imagewidth, int imageheight, int x1, int y1, int width, int height, int *element3i, int *neighbor3i, float *vertex3f, float *svector3f, float *tvector3f, float *normal3f, float *texcoord2f, matrix4x4_t *pixelstepmatrix, matrix4x4_t *pixeltexturestepmatrix)
{
int x, y, ix, iy, *e;
e = element3i;
*/
memset(tagsets, 0, sizeof(tagsets));
memset(word, 0, sizeof(word));
- for (i = 0;i < MAX_SKINS && (data = text = (char *)FS_LoadFile(va("%s_%i.skin", loadmodel->name, i), tempmempool, true));i++)
+ for (i = 0;i < MAX_SKINS && (data = text = (char *)FS_LoadFile(va("%s_%i.skin", loadmodel->name, i), tempmempool, true, NULL));i++)
{
numtags = 0;