Mod_LoadQ3Shaders();
for (i = 0;i < nummodels;i++)
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*')
+ if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*')
if (mod->used)
Mod_LoadModel(mod, true, false, mod->isworldmodel);
}
dp_model_t *mod;
for (i = 0;i < nummodels;i++)
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && (mod->loaded || mod->mempool))
+ if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && (mod->loaded || mod->mempool))
Mod_UnloadModel(mod);
Mem_FreePool (&q3shaders_mem);
R_SkinFrame_PrepareForPurge();
for (i = 0;i < nummodels;i++)
{
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->mempool && mod->data_textures)
+ if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->mempool && mod->data_textures)
{
for (j = 0;j < mod->num_textures;j++)
{
for (i = 0;i < nummodels;i++)
{
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->mempool && mod->data_surfaces)
+ if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->mempool && mod->data_surfaces)
{
for (surfacenum = 0, surface = mod->data_surfaces;surfacenum < mod->num_surfaces;surfacenum++, surface++)
{
mod->loaded = false;
}
+void R_Model_Null_Draw(entity_render_t *ent)
+{
+ return;
+}
+
/*
==================
Mod_LoadModel
if (mod->name[0] == '*') // submodel
return mod;
+
+ if (!strcmp(mod->name, "null"))
+ {
+ if (mod->isworldmodel != isworldmodel)
+ mod->loaded = false;
+
+ if(mod->loaded)
+ return mod;
+
+ if (mod->loaded || mod->mempool)
+ Mod_UnloadModel(mod);
+
+ if (developer_loading.integer)
+ Con_Printf("loading model %s\n", mod->name);
+
+ mod->isworldmodel = isworldmodel;
+ mod->used = true;
+ mod->crc = -1;
+ mod->loaded = false;
+
+ VectorClear(mod->normalmins);
+ VectorClear(mod->normalmaxs);
+ VectorClear(mod->yawmins);
+ VectorClear(mod->yawmaxs);
+ VectorClear(mod->rotatedmins);
+ VectorClear(mod->rotatedmaxs);
+
+ mod->modeldatatypestring = "null";
+ mod->type = mod_null;
+ mod->Draw = R_Model_Null_Draw;
+ mod->numframes = 2;
+ mod->numskins = 1;
+
+ // no fatal errors occurred, so this model is ready to use.
+ mod->loaded = true;
+
+ return mod;
+ }
crc = 0;
buf = NULL;
int nummodels = Mem_ExpandableArray_IndexRange(&models);
dp_model_t *mod;
for (i = 0;i < nummodels;i++)
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0])
+ if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0])
mod->used = false;
}
dp_model_t *mod;
for (i = 0;i < nummodels;i++)
{
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && !mod->used)
+ if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && !mod->used)
{
Mod_UnloadModel(mod);
Mem_ExpandableArray_FreeRecord(&models, mod);
dp_model_t *mod;
for (i = 0;i < nummodels;i++)
{
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->isworldmodel && mod->loaded && skip != mod)
+ if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->isworldmodel && mod->loaded && skip != mod)
{
Mod_UnloadModel(mod);
mod->isworldmodel = false;
// search the currently loaded models
for (i = 0;i < nummodels;i++)
{
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && !strcmp(mod->name, name))
+ if ((mod = (dp_model_t*) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && !strcmp(mod->name, name))
{
mod->used = true;
return mod;
}
// no match found, create a new one
- mod = Mem_ExpandableArray_AllocRecord(&models);
+ mod = (dp_model_t *) Mem_ExpandableArray_AllocRecord(&models);
strlcpy(mod->name, name, sizeof(mod->name));
mod->loaded = false;
mod->used = true;
int nummodels = Mem_ExpandableArray_IndexRange(&models);
dp_model_t *mod;
for (i = 0;i < nummodels;i++)
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*' && mod->used)
+ if ((mod = (dp_model_t *) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0] && mod->name[0] != '*' && mod->used)
Mod_LoadModel(mod, true, true, mod->isworldmodel);
}
Con_Print("Loaded models:\n");
for (i = 0;i < nummodels;i++)
- if ((mod = Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0])
+ if ((mod = (dp_model_t *) Mem_ExpandableArray_RecordAtIndex(&models, i)) && mod->name[0])
Con_Printf("%4iK %s\n", mod->mempool ? (int)((mod->mempool->totalsize + 1023) / 1024) : 0, mod->name);
}
int i;
layer->numframes = min(numparameters - 2, TEXTURE_MAXFRAMES);
layer->framerate = atof(parameter[1]);
- layer->texturename = Mem_Alloc (q3shaders_mem, sizeof (char*) * layer->numframes);
+ layer->texturename = (char **) Mem_Alloc (q3shaders_mem, sizeof (char*) * layer->numframes);
for (i = 0;i < layer->numframes;i++)
layer->texturename[i] = Mem_strdup (q3shaders_mem, parameter[i + 2]);
}
else if (!strcasecmp(parameter[1], "vertex")) layer->alphagen.alphagen = Q3ALPHAGEN_VERTEX;
else if (!strcasecmp(parameter[1], "wave"))
{
- layer->alphagen.alphagen = Q3RGBGEN_WAVE;
+ layer->alphagen.alphagen = Q3ALPHAGEN_WAVE;
layer->alphagen.wavefunc = Mod_LoadQ3Shaders_EnumerateWaveFunc(parameter[2]);
for (i = 0;i < numparameters - 3 && i < Q3WAVEPARMS;i++)
layer->alphagen.waveparms[i] = atof(parameter[i+3]);
layer->texflags = TEXF_ALPHA | TEXF_PRECACHE;
if (!(shader.surfaceparms & Q3SURFACEPARM_NOMIPMAPS))
layer->texflags |= TEXF_MIPMAP;
- if (!(shader.textureflags & Q3TEXTUREFLAG_NOPICMIP) && (r_picmipworld.integer || (layer->texturename && layer->texturename[0] && strncmp(layer->texturename[0], "textures/", 9))))
+ if (!(shader.textureflags & Q3TEXTUREFLAG_NOPICMIP))
layer->texflags |= TEXF_PICMIP | TEXF_COMPRESS;
if (layer->clampmap)
layer->texflags |= TEXF_CLAMP;
Con_Printf("%s: loaded shader for %s\n", loadmodel->name, name);
texture->surfaceparms = shader->surfaceparms;
texture->textureflags = shader->textureflags;
+
+ // allow disabling of picmip or compression by defaulttexflags
+ if(!(defaulttexflags & TEXF_PICMIP))
+ texture->textureflags &= ~TEXF_PICMIP;
+ if(!(defaulttexflags & TEXF_COMPRESS))
+ texture->textureflags &= ~TEXF_COMPRESS;
+
texture->basematerialflags = 0;
if (shader->surfaceparms & Q3SURFACEPARM_SKY)
{
int Mod_RemoveDegenerateTriangles(int numtriangles, const int *inelement3i, int *outelement3i, const float *vertex3f)
{
int i, outtriangles;
- float d, edgedir[3], temp[3];
+ float edgedir1[3], edgedir2[3], temp[3];
// a degenerate triangle is one with no width (thickness, surface area)
// these are characterized by having all 3 points colinear (along a line)
// or having two points identical
+ // the simplest check is to calculate the triangle's area
for (i = 0, outtriangles = 0;i < numtriangles;i++, inelement3i += 3)
{
// calculate first edge
- VectorSubtract(vertex3f + inelement3i[1] * 3, vertex3f + inelement3i[0] * 3, edgedir);
- if (VectorLength2(edgedir) < 0.0001f)
- continue; // degenerate first edge (no length)
- VectorNormalize(edgedir);
- // check if third point is on the edge (colinear)
- d = -DotProduct(vertex3f + inelement3i[2] * 3, edgedir);
- VectorMA(vertex3f + inelement3i[2] * 3, d, edgedir, temp);
- if (VectorLength2(temp) < 0.0001f)
- continue; // third point colinear with first edge
- // valid triangle (no colinear points, no duplicate points)
+ VectorSubtract(vertex3f + inelement3i[1] * 3, vertex3f + inelement3i[0] * 3, edgedir1);
+ VectorSubtract(vertex3f + inelement3i[2] * 3, vertex3f + inelement3i[0] * 3, edgedir2);
+ CrossProduct(edgedir1, edgedir2, temp);
+ if (VectorLength2(temp) < 0.001f)
+ continue; // degenerate triangle (no area)
+ // valid triangle (has area)
VectorCopy(inelement3i, outelement3i);
outelement3i += 3;
outtriangles++;