#include "polygon.h"
cvar_t r_mipskins = {CVAR_SAVE, "r_mipskins", "0", "mipmaps model skins so they render faster in the distance and do not display noise artifacts, can cause discoloration of skins if they contain undesirable border colors"};
-cvar_t mod_generatelightmaps_unitspersample = {CVAR_SAVE, "mod_generatelightmaps_unitspersample", "16", "lightmap resolution"};
+cvar_t mod_generatelightmaps_unitspersample = {CVAR_SAVE, "mod_generatelightmaps_unitspersample", "8", "lightmap resolution"};
cvar_t mod_generatelightmaps_borderpixels = {CVAR_SAVE, "mod_generatelightmaps_borderpixels", "2", "extra space around polygons to prevent sampling artifacts"};
cvar_t mod_generatelightmaps_texturesize = {CVAR_SAVE, "mod_generatelightmaps_texturesize", "1024", "size of lightmap textures"};
-cvar_t mod_generatelightmaps_lightmapsamples = {CVAR_SAVE, "mod_generatelightmaps_lightmapsamples", "9", "number of raytrace tests done per lightmap pixel"};
-cvar_t mod_generatelightmaps_vertexsamples = {CVAR_SAVE, "mod_generatelightmaps_vertexsamples", "16", "number of raytrace tests done per vertex"};
-cvar_t mod_generatelightmaps_gridsamples = {CVAR_SAVE, "mod_generatelightmaps_gridsamples", "16", "number of raytrace tests done per lightgrid cell"};
-cvar_t mod_generatelightmaps_lightmapradius = {CVAR_SAVE, "mod_generatelightmaps_lightmapradius", "32", "number of raytrace tests done per lightmap pixel"};
-cvar_t mod_generatelightmaps_vertexradius = {CVAR_SAVE, "mod_generatelightmaps_vertexradius", "32", "number of raytrace tests done per vertex"};
-cvar_t mod_generatelightmaps_gridradius = {CVAR_SAVE, "mod_generatelightmaps_gridradius", "128", "number of raytrace tests done per lightgrid cell"};
+cvar_t mod_generatelightmaps_lightmapsamples = {CVAR_SAVE, "mod_generatelightmaps_lightmapsamples", "16", "number of shadow tests done per lightmap pixel"};
+cvar_t mod_generatelightmaps_vertexsamples = {CVAR_SAVE, "mod_generatelightmaps_vertexsamples", "16", "number of shadow tests done per vertex"};
+cvar_t mod_generatelightmaps_gridsamples = {CVAR_SAVE, "mod_generatelightmaps_gridsamples", "64", "number of shadow tests done per lightgrid cell"};
+cvar_t mod_generatelightmaps_lightmapradius = {CVAR_SAVE, "mod_generatelightmaps_lightmapradius", "16", "sampling area around each lightmap pixel"};
+cvar_t mod_generatelightmaps_vertexradius = {CVAR_SAVE, "mod_generatelightmaps_vertexradius", "16", "sampling area around each vertex"};
+cvar_t mod_generatelightmaps_gridradius = {CVAR_SAVE, "mod_generatelightmaps_gridradius", "64", "sampling area around each lightgrid cell center"};
dp_model_t *loadmodel;
int element[2];
}
edgehashentry_t;
- edgehashentry_t *edgehash[TRIANGLEEDGEHASH], *edgehashentries, edgehashentriesbuffer[TRIANGLEEDGEHASH*3], *hash;
- memset(edgehash, 0, sizeof(edgehash));
- edgehashentries = edgehashentriesbuffer;
+ static edgehashentry_t **edgehash;
+ edgehashentry_t *edgehashentries, *hash;
+ if (!numtriangles)
+ return;
+ edgehash = Mem_Alloc(tempmempool, TRIANGLEEDGEHASH * sizeof(*edgehash));
// if there are too many triangles for the stack array, allocate larger buffer
- if (numtriangles > TRIANGLEEDGEHASH)
- edgehashentries = (edgehashentry_t *)Mem_Alloc(tempmempool, numtriangles * 3 * sizeof(edgehashentry_t));
+ edgehashentries = (edgehashentry_t *)Mem_Alloc(tempmempool, numtriangles * 3 * sizeof(edgehashentry_t));
// find neighboring triangles
for (i = 0, e = elements, n = neighbors;i < numtriangles;i++, e += 3, n += 3)
{
CL_KeepaliveMessage(false);
}
// free the allocated buffer
- if (edgehashentries != edgehashentriesbuffer)
- Mem_Free(edgehashentries);
+ Mem_Free(edgehashentries);
+ Mem_Free(edgehash);
}
#else
// very slow but simple way
static void Mod_ShadowMesh_CreateVBOs(shadowmesh_t *mesh)
{
- if (!gl_support_arb_vertex_buffer_object)
+ if (!vid.support.arb_vertex_buffer_object)
return;
// element buffer is easy because it's just one array
end = ((unsigned char *) (&shader->Q3SHADERINFO_COMPARE_END)) + sizeof(shader->Q3SHADERINFO_COMPARE_END);
start2 = (unsigned char *) (&entry->shader.Q3SHADERINFO_COMPARE_START);
if(memcmp(start, start2, end - start))
- Con_Printf("Shader '%s' already defined, ignoring mismatching redeclaration\n", shader->name);
+ Con_DPrintf("Shader '%s' already defined, ignoring mismatching redeclaration\n", shader->name);
else
Con_DPrintf("Shader '%s' already defined\n", shader->name);
return;
strlcpy(shader.name, com_token, sizeof(shader.name));
if (!COM_ParseToken_QuakeC(&text, false) || strcasecmp(com_token, "{"))
{
- Con_Printf("%s parsing error - expected \"{\", found \"%s\"\n", search->filenames[fileindex], com_token);
+ Con_DPrintf("%s parsing error - expected \"{\", found \"%s\"\n", search->filenames[fileindex], com_token);
break;
}
while (COM_ParseToken_QuakeC(&text, false))
}
//for (j = numparameters;j < TEXTURE_MAXFRAMES + 4;j++)
// parameter[j][0] = 0;
- if (developer.integer >= 100)
+ if (developer_insane.integer)
{
- Con_Printf("%s %i: ", shader.name, shader.numlayers - 1);
+ Con_DPrintf("%s %i: ", shader.name, shader.numlayers - 1);
for (j = 0;j < numparameters;j++)
- Con_Printf(" %s", parameter[j]);
- Con_Print("\n");
+ Con_DPrintf(" %s", parameter[j]);
+ Con_DPrint("\n");
}
if (numparameters >= 2 && !strcasecmp(parameter[0], "blendfunc"))
{
shader.textureblendalpha = true;
}
}
- layer->texflags = TEXF_ALPHA | TEXF_PRECACHE;
+ layer->texflags = TEXF_ALPHA;
if (!(shader.surfaceparms & Q3SURFACEPARM_NOMIPMAPS))
layer->texflags |= TEXF_MIPMAP;
if (!(shader.textureflags & Q3TEXTUREFLAG_NOPICMIP))
// parameter[j][0] = 0;
if (fileindex == 0 && !strcasecmp(com_token, "}"))
break;
- if (developer.integer >= 100)
+ if (developer_insane.integer)
{
- Con_Printf("%s: ", shader.name);
+ Con_DPrintf("%s: ", shader.name);
for (j = 0;j < numparameters;j++)
- Con_Printf(" %s", parameter[j]);
- Con_Print("\n");
+ Con_DPrintf(" %s", parameter[j]);
+ Con_DPrint("\n");
}
if (numparameters < 1)
continue;
texflagsmask &= ~TEXF_COMPRESS;
texture->specularscalemod = 1; // unless later loaded from the shader
texture->specularpowermod = 1; // unless later loaded from the shader
+ // WHEN ADDING DEFAULTS HERE, REMEMBER TO SYNC TO SHADER LOADING ABOVE
+ // HERE, AND Q1BSP LOADING
+ // JUST GREP FOR "specularscalemod = 1".
if (shader)
{
}
else if (!strcmp(texture->name, "noshader") || !texture->name[0])
{
- if (developer.integer >= 100)
- Con_Printf("^1%s:^7 using fallback noshader material for ^3\"%s\"\n", loadmodel->name, name);
+ if (developer_extra.integer)
+ Con_DPrintf("^1%s:^7 using fallback noshader material for ^3\"%s\"\n", loadmodel->name, name);
texture->surfaceparms = 0;
}
else if (!strcmp(texture->name, "common/nodraw") || !strcmp(texture->name, "textures/common/nodraw"))
{
- if (developer.integer >= 100)
- Con_Printf("^1%s:^7 using fallback nodraw material for ^3\"%s\"\n", loadmodel->name, name);
+ if (developer_extra.integer)
+ Con_DPrintf("^1%s:^7 using fallback nodraw material for ^3\"%s\"\n", loadmodel->name, name);
texture->surfaceparms = 0;
texture->basematerialflags = MATERIALFLAG_NODRAW | MATERIALFLAG_NOSHADOW;
}
else
{
- if (developer.integer >= 100)
- Con_Printf("^1%s:^7 No shader found for texture ^3\"%s\"\n", loadmodel->name, texture->name);
+ if (developer_extra.integer)
+ Con_DPrintf("^1%s:^7 No shader found for texture ^3\"%s\"\n", loadmodel->name, texture->name);
texture->surfaceparms = 0;
if (texture->surfaceflags & Q3SURFACEFLAG_NODRAW)
texture->basematerialflags |= MATERIALFLAG_NODRAW | MATERIALFLAG_NOSHADOW;
{
if (fallback)
{
- qboolean has_alpha;
- if ((texture->skinframes[0] = R_SkinFrame_LoadExternal_CheckAlpha(texture->name, defaulttexflags, false, &has_alpha)))
+ if ((texture->skinframes[0] = R_SkinFrame_LoadExternal(texture->name, defaulttexflags, false)))
{
- if(has_alpha && (defaulttexflags & TEXF_ALPHA))
+ if(texture->skinframes[0]->hasalpha)
texture->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_NOSHADOW;
}
else
static void Mod_BuildVBOs(void)
{
- if (developer.integer && loadmodel->surfmesh.data_element3s && loadmodel->surfmesh.data_element3i)
+ if (gl_paranoid.integer && loadmodel->surfmesh.data_element3s && loadmodel->surfmesh.data_element3i)
{
int i;
for (i = 0;i < loadmodel->surfmesh.num_triangles*3;i++)
}
}
- if (!gl_support_arb_vertex_buffer_object)
+ if (!vid.support.arb_vertex_buffer_object)
return;
// element buffer is easy because it's just one array
int transformindex;
int poseindex;
int cornerindex;
- float modelscale;
const int *e;
const float *pose;
size_t l;
l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "version 1\nnodes\n");
if (l > 0)
outbufferpos += l;
- modelscale = 1;
- if(model->num_poses >= 0)
- modelscale = sqrt(model->data_poses[0] * model->data_poses[0] + model->data_poses[1] * model->data_poses[1] + model->data_poses[2] * model->data_poses[2]);
- if(fabs(modelscale - 1) > 1e-4)
- {
- if(firstpose == 0) // only print the when writing the reference pose
- Con_Printf("The model has an old-style model scale of %f\n", modelscale);
- }
- else
- modelscale = 1;
for (transformindex = 0;transformindex < model->num_bones;transformindex++)
{
if (outbufferpos >= outbuffermax >> 1)
l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "end\nskeleton\n");
if (l > 0)
outbufferpos += l;
- for (poseindex = 0, pose = model->data_poses + model->num_bones * 12 * firstpose;poseindex < numposes;poseindex++)
+ for (poseindex = 0;poseindex < numposes;poseindex++)
{
countframes++;
l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "time %i\n", poseindex);
{
float a, b, c;
float angles[3];
- float mtest[3][4];
+ float mtest[4][3];
+ matrix4x4_t posematrix;
if (outbufferpos >= outbuffermax >> 1)
{
outbuffermax *= 2;
// strangely the smd angles are for a transposed matrix, so we
// have to generate a transposed matrix, then convert that...
- mtest[0][0] = pose[ 0];
- mtest[0][1] = pose[ 4];
- mtest[0][2] = pose[ 8];
- mtest[0][3] = pose[ 3];
- mtest[1][0] = pose[ 1];
- mtest[1][1] = pose[ 5];
- mtest[1][2] = pose[ 9];
- mtest[1][3] = pose[ 7];
- mtest[2][0] = pose[ 2];
- mtest[2][1] = pose[ 6];
- mtest[2][2] = pose[10];
- mtest[2][3] = pose[11];
+ Matrix4x4_FromBonePose6s(&posematrix, model->num_posescale, model->data_poses6s + 6*(model->num_bones * poseindex + transformindex));
+ Matrix4x4_ToArray12FloatGL(&posematrix, mtest[0]);
AnglesFromVectors(angles, mtest[0], mtest[2], false);
if (angles[0] >= 180) angles[0] -= 360;
if (angles[1] >= 180) angles[1] -= 360;
#if 0
{
float cy, sy, cp, sp, cr, sr;
- float test[3][4];
- // smd matrix construction, for comparing to non-transposed m
+ float test[4][3];
+ // smd matrix construction, for comparing
sy = sin(c);
cy = cos(c);
sp = sin(b);
cr = cos(a);
test[0][0] = cp*cy;
- test[1][0] = cp*sy;
- test[2][0] = -sp;
- test[0][1] = sr*sp*cy+cr*-sy;
+ test[0][1] = cp*sy;
+ test[0][2] = -sp;
+ test[1][0] = sr*sp*cy+cr*-sy;
test[1][1] = sr*sp*sy+cr*cy;
- test[2][1] = sr*cp;
- test[0][2] = (cr*sp*cy+-sr*-sy);
- test[1][2] = (cr*sp*sy+-sr*cy);
+ test[1][2] = sr*cp;
+ test[2][0] = (cr*sp*cy+-sr*-sy);
+ test[2][1] = (cr*sp*sy+-sr*cy);
test[2][2] = cr*cp;
- test[0][3] = pose[3];
- test[1][3] = pose[7];
- test[2][3] = pose[11];
+ test[3][0] = pose[9];
+ test[3][1] = pose[10];
+ test[3][2] = pose[11];
}
#endif
- l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "%3i %f %f %f %f %f %f\n", transformindex, pose[3] * modelscale, pose[7] * modelscale, pose[11] * modelscale, DEG2RAD(angles[ROLL]), DEG2RAD(angles[PITCH]), DEG2RAD(angles[YAW]));
+ l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "%3i %f %f %f %f %f %f\n", transformindex, mtest[3][0], mtest[3][1], mtest[3][2], DEG2RAD(angles[ROLL]), DEG2RAD(angles[PITCH]), DEG2RAD(angles[YAW]));
if (l > 0)
outbufferpos += l;
}
state->width = width;
state->height = height;
state->currentY = 0;
- state->rows = Mem_Alloc(tempmempool, state->height * sizeof(*state->rows));
+ state->rows = Mem_Alloc(loadmodel->mempool, state->height * sizeof(*state->rows));
for (y = 0;y < state->height;y++)
{
state->rows[y].currentX = 0;
const float *vertex3f = model->surfmesh.data_vertex3f;
const int *element3i = model->surfmesh.data_element3i;
const int *e;
- double v2[3][3];
+ float v2[3][3];
for (surfaceindex = 0, surface = model->data_surfaces;surfaceindex < model->nummodelsurfaces;surfaceindex++, surface++)
{
if (!BoxesOverlap(surface->mins, surface->maxs, mins, maxs))
{
int maxnodes = 1<<14;
svbsp_node_t *nodes;
- double origin[3];
+ float origin[3];
float mins[3];
float maxs[3];
svbsp_t svbsp;
{
//R_SampleRTLights(pos, sample, numoffsets, offsets);
VectorSubtract(lightinfo->origin, pos, relativepoint);
+ // don't accept light from behind a surface, it causes bad shading
+ if (normal && DotProduct(relativepoint, normal) <= 0)
+ continue;
dist2 = VectorLength2(relativepoint);
if (dist2 >= lightinfo->radius2)
continue;
model->texturepool = R_AllocTexturePool();
lm_basescalepixels = 1.0f / max(0.0001f, mod_generatelightmaps_unitspersample.value);
lm_borderpixels = mod_generatelightmaps_borderpixels.integer;
- lm_texturesize = bound(lm_borderpixels*2+1, 64, gl_max_texture_size);
+ lm_texturesize = bound(lm_borderpixels*2+1, 64, (int)vid.maxtexturesize_2d);
lm_maxpixels = lm_texturesize-(lm_borderpixels*2+1);
Mod_AllocLightmap_Init(&lmstate, lm_texturesize, lm_texturesize);
lightmapnumber = 0;
break;
// if we haven't maxed out the lightmap size yet, we retry the
// entire surface batch...
- if (lm_texturesize * 2 <= min(mod_generatelightmaps_texturesize.integer, gl_max_texture_size))
+ if (lm_texturesize * 2 <= min(mod_generatelightmaps_texturesize.integer, (int)vid.maxtexturesize_2d))
{
lm_texturesize *= 2;
surfaceindex = -1;
for (lightmapindex = 0;lightmapindex < model->brushq3.num_mergedlightmaps;lightmapindex++)
{
- model->brushq3.data_lightmaps[lightmapindex] = R_LoadTexture2D(model->texturepool, va("lightmap%i", lightmapindex), lm_texturesize, lm_texturesize, lightmappixels + lightmapindex * lm_texturesize * lm_texturesize * 4, TEXTYPE_BGRA, TEXF_FORCELINEAR | TEXF_PRECACHE, NULL);
- model->brushq3.data_deluxemaps[lightmapindex] = R_LoadTexture2D(model->texturepool, va("deluxemap%i", lightmapindex), lm_texturesize, lm_texturesize, deluxemappixels + lightmapindex * lm_texturesize * lm_texturesize * 4, TEXTYPE_BGRA, TEXF_FORCELINEAR | TEXF_PRECACHE, NULL);
+ model->brushq3.data_lightmaps[lightmapindex] = R_LoadTexture2D(model->texturepool, va("lightmap%i", lightmapindex), lm_texturesize, lm_texturesize, lightmappixels + lightmapindex * lm_texturesize * lm_texturesize * 4, TEXTYPE_BGRA, TEXF_FORCELINEAR, NULL);
+ model->brushq3.data_deluxemaps[lightmapindex] = R_LoadTexture2D(model->texturepool, va("deluxemap%i", lightmapindex), lm_texturesize, lm_texturesize, deluxemappixels + lightmapindex * lm_texturesize * lm_texturesize * 4, TEXTYPE_BGRA, TEXF_FORCELINEAR, NULL);
}
if (lightmappixels)