cvar_t mod_q3shader_default_offsetmapping_bias = {CVAR_SAVE, "mod_q3shader_default_offsetmapping_bias", "0", "default bias used for offsetmapping"};
cvar_t mod_q3shader_default_polygonfactor = {0, "mod_q3shader_default_polygonfactor", "0", "biases depth values of 'polygonoffset' shaders to prevent z-fighting artifacts"};
cvar_t mod_q3shader_default_polygonoffset = {0, "mod_q3shader_default_polygonoffset", "-2", "biases depth values of 'polygonoffset' shaders to prevent z-fighting artifacts"};
+cvar_t mod_q3shader_default_refractive_index = { 0, "mod_q3shader_default_refractive_index", "1.33", "angle of refraction specified as n to apply when a photon is refracted, example values are: 1.0003 = air, water = 1.333, crown glass = 1.517, flint glass = 1.655, diamond = 2.417" };
cvar_t mod_q3shader_force_addalpha = {0, "mod_q3shader_force_addalpha", "0", "treat GL_ONE GL_ONE (or add) blendfunc as GL_SRC_ALPHA GL_ONE for compatibility with older DarkPlaces releases"};
cvar_t mod_q3shader_force_terrain_alphaflag = {0, "mod_q3shader_force_terrain_alphaflag", "0", "for multilayered terrain shaders force TEXF_ALPHA flag on both layers"};
Cvar_RegisterVariable(&mod_q3shader_default_offsetmapping_bias);
Cvar_RegisterVariable(&mod_q3shader_default_polygonfactor);
Cvar_RegisterVariable(&mod_q3shader_default_polygonoffset);
+ Cvar_RegisterVariable(&mod_q3shader_default_refractive_index);
Cvar_RegisterVariable(&mod_q3shader_force_addalpha);
Cvar_RegisterVariable(&mod_q3shader_force_terrain_alphaflag);
Cvar_RegisterVariable(&mod_q1bsp_polygoncollisions);
if (model == NULL)
return NULL;
- // LordHavoc: modified to start at first clip node,
+ // LadyHavoc: modified to start at first clip node,
// in other words: first node of the (sub)model
node = model->brush.data_nodes + model->brushq1.hulls[0].firstclipnode;
while (node->plane)
rhc.hull = &model->brushq1.hulls[0]; // 0x0x0
else if (model->brush.ishlbsp)
{
- // LordHavoc: this has to have a minor tolerance (the .1) because of
+ // LadyHavoc: this has to have a minor tolerance (the .1) because of
// minor float precision errors from the box being transformed around
if (boxsize[0] < 32.1)
{
}
else
{
- // LordHavoc: this has to have a minor tolerance (the .1) because of
+ // LadyHavoc: this has to have a minor tolerance (the .1) because of
// minor float precision errors from the box being transformed around
if (boxsize[0] < 32.1)
rhc.hull = &model->brushq1.hulls[1]; // 32x32x56
w11 = ( dsfrac) * ( dtfrac) * (1.0f / 128.0f);
// values for pointer math
- line3 = lmwidth * 3; // LordHavoc: *3 for colored lighting
- size3 = lmwidth * lmheight * 3; // LordHavoc: *3 for colored lighting
+ line3 = lmwidth * 3; // LadyHavoc: *3 for colored lighting
+ size3 = lmwidth * lmheight * 3; // LadyHavoc: *3 for colored lighting
// look up the pixel
- lightmap = surface->lightmapinfo->samples + dti * line3 + dsi*3; // LordHavoc: *3 for colored lighting
+ lightmap = surface->lightmapinfo->samples + dti * line3 + dsi*3; // LadyHavoc: *3 for colored lighting
// bilinear filter each lightmap style, and sum them
for (maps = 0;maps < MAXLIGHTMAPS && surface->lightmapinfo->styles[maps] != 255;maps++)
}
// the line intersects, find intersection point
- // LordHavoc: this uses the original trace for maximum accuracy
+ // LadyHavoc: this uses the original trace for maximum accuracy
if (plane->type < 3)
{
t1 = t->start[plane->type] - plane->dist;
}
}
- loadmodel->brush.solidskyskinframe = R_SkinFrame_LoadInternalBGRA("sky_solidtexture", 0 , (unsigned char *) solidpixels, w, h, vid.sRGB3D);
- loadmodel->brush.alphaskyskinframe = R_SkinFrame_LoadInternalBGRA("sky_alphatexture", TEXF_ALPHA, (unsigned char *) alphapixels, w, h, vid.sRGB3D);
+ loadmodel->brush.solidskyskinframe = R_SkinFrame_LoadInternalBGRA("sky_solidtexture", 0 , (unsigned char *) solidpixels, w, h, 0, 0, 0, vid.sRGB3D);
+ loadmodel->brush.alphaskyskinframe = R_SkinFrame_LoadInternalBGRA("sky_alphatexture", TEXF_ALPHA, (unsigned char *) alphapixels, w, h, 0, 0, 0, vid.sRGB3D);
Mem_Free(solidpixels);
Mem_Free(alphapixels);
}
}
// bump it back to where we started parsing
- sb->readcount = watermark;
+ sb->readcount = (int)watermark;
firstskynoshadowtexture = loadmodel->num_textures;
loadmodel->num_textures += numsky;
tx->width = 16;
tx->height = 16;
tx->basealpha = 1.0f;
- tx->materialshaderpass = tx->shaderpasses[0] = Mod_CreateShaderPass(skinframemissing);
+ tx->materialshaderpass = tx->shaderpasses[0] = Mod_CreateShaderPass(loadmodel->mempool, skinframemissing);
tx->materialshaderpass->skinframes[0] = skinframemissing;
tx->currentskinframe = skinframemissing;
tx->basematerialflags = MATERIALFLAG_WALL;
// clear water settings
tx->reflectmin = 0;
tx->reflectmax = 1;
+ tx->refractive_index = mod_q3shader_default_refractive_index.value;
tx->refractfactor = 1;
Vector4Set(tx->refractcolor4f, 1, 1, 1, 1);
tx->reflectfactor = 1;
s += 5;
FS_StripExtension(s, mapname, sizeof(mapname));
- // LordHavoc: mostly rewritten map texture loader
+ // LadyHavoc: mostly rewritten map texture loader
for (i = 0;i < nummiptex;i++)
{
doffset = MSG_ReadLittleLong(sb);
if ((mtwidth & 15) || (mtheight & 15))
Con_DPrintf("%s: warning: texture \"%s\" is not 16 aligned\n", loadmodel->name, name);
- // LordHavoc: force all names to lowercase
+ // LadyHavoc: force all names to lowercase
for (j = 0;name[j];j++)
if (name[j] >= 'A' && name[j] <= 'Z')
name[j] += 'a' - 'A';
- // LordHavoc: backup the texture_t because q3 shader loading overwrites it
+ // LadyHavoc: backup the texture_t because q3 shader loading overwrites it
backuptex = loadmodel->data_textures[i];
- if (name[0] && Mod_LoadTextureFromQ3Shader(loadmodel->data_textures + i, name, false, false, 0))
+ if (name[0] && Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, loadmodel->data_textures + i, name, false, false, 0, MATERIALFLAG_WALL))
continue;
loadmodel->data_textures[i] = backuptex;
if (cls.state != ca_dedicated)
{
- // LordHavoc: HL sky textures are entirely different than quake
+ // LadyHavoc: HL sky textures are entirely different than quake
if (!loadmodel->brush.ishlbsp && !strncmp(tx->name, "sky", 3) && mtwidth == mtheight * 2)
{
data = loadimagepixelsbgra(gamemode == GAME_TENEBRAE ? tx->name : va(vabuf, sizeof(vabuf), "textures/%s/%s", mapname, tx->name), false, false, false, NULL);
}
else
{
- skinframe_t *skinframe = R_SkinFrame_LoadExternal(gamemode == GAME_TENEBRAE ? tx->name : va(vabuf, sizeof(vabuf), "textures/%s/%s", mapname, tx->name), TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS, false);
+ skinframe_t *skinframe = R_SkinFrame_LoadExternal(gamemode == GAME_TENEBRAE ? tx->name : va(vabuf, sizeof(vabuf), "textures/%s/%s", mapname, tx->name), TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS, false, false);
if (!skinframe)
- skinframe = R_SkinFrame_LoadExternal(gamemode == GAME_TENEBRAE ? tx->name : va(vabuf, sizeof(vabuf), "textures/%s", tx->name), TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS, false);
+ skinframe = R_SkinFrame_LoadExternal(gamemode == GAME_TENEBRAE ? tx->name : va(vabuf, sizeof(vabuf), "textures/%s", tx->name), TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS, false, false);
if (skinframe)
tx->offsetmapping = OFFSETMAPPING_DEFAULT; // allow offsetmapping on external textures without a q3 shader
if (!skinframe)
{
tx->width = image_width;
tx->height = image_height;
- skinframe = R_SkinFrame_LoadInternalBGRA(tx->name, TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP, pixels, image_width, image_height, true);
+ skinframe = R_SkinFrame_LoadInternalBGRA(tx->name, TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP, pixels, image_width, image_height, image_width, image_height, CRC_Block(pixels, image_width * image_height * 4), true);
}
if (freepixels)
Mem_Free(freepixels);
if (skinframe)
tx->materialshaderpass->skinframes[0] = skinframe;
}
- // LordHavoc: some Tenebrae textures get replaced by black
+ // LadyHavoc: some Tenebrae textures get replaced by black
if (!strncmp(tx->name, "*glassmirror", 12)) // Tenebrae
- tx->materialshaderpass->skinframes[0] = R_SkinFrame_LoadInternalBGRA(tx->name, TEXF_MIPMAP | TEXF_ALPHA, zerotrans, 1, 1, false);
+ tx->materialshaderpass->skinframes[0] = R_SkinFrame_LoadInternalBGRA(tx->name, TEXF_MIPMAP | TEXF_ALPHA, zerotrans, 1, 1, 0, 0, 0, false);
else if (!strncmp(tx->name, "mirror", 6)) // Tenebrae
- tx->materialshaderpass->skinframes[0] = R_SkinFrame_LoadInternalBGRA(tx->name, 0, zeroopaque, 1, 1, false);
+ tx->materialshaderpass->skinframes[0] = R_SkinFrame_LoadInternalBGRA(tx->name, 0, zeroopaque, 1, 1, 0, 0, 0, false);
tx->currentskinframe = tx->materialshaderpass->skinframes[0];
}
tx->basematerialflags = MATERIALFLAG_WALL;
if (tx->name[0] == '*')
{
- // LordHavoc: some turbulent textures should not be affected by wateralpha
+ // LadyHavoc: some turbulent textures should not be affected by wateralpha
if (!strncmp(tx->name, "*glassmirror", 12)) // Tenebrae
tx->basematerialflags |= MATERIALFLAG_NOSHADOW | MATERIALFLAG_ADD | MATERIALFLAG_BLENDED | MATERIALFLAG_REFLECTION;
else if (!strncmp(tx->name,"*lava",5)
char litfilename[MAX_QPATH];
char dlitfilename[MAX_QPATH];
fs_offset_t filesize;
- if (loadmodel->brush.ishlbsp) // LordHavoc: load the colored lighting data straight
+ if (loadmodel->brush.ishlbsp) // LadyHavoc: load the colored lighting data straight
{
loadmodel->brushq1.lightdata = (unsigned char *)Mem_Alloc(loadmodel->mempool, sb->cursize);
for (i = 0;i < sb->cursize;i++)
loadmodel->brushq1.lightdata[i] = sb->data[i] >>= 1;
}
- else // LordHavoc: bsp version 29 (normal white lighting)
+ else // LadyHavoc: bsp version 29 (normal white lighting)
{
- // LordHavoc: hope is not lost yet, check for a .lit file to load
+ // LadyHavoc: hope is not lost yet, check for a .lit file to load
strlcpy (litfilename, loadmodel->name, sizeof (litfilename));
FS_StripExtension (litfilename, litfilename, sizeof (litfilename));
strlcpy (dlitfilename, litfilename, sizeof (dlitfilename));
data = NULL;
}
}
- // LordHavoc: oh well, expand the white lighting data
+ // LadyHavoc: oh well, expand the white lighting data
if (!sb->cursize)
return;
loadmodel->brushq1.lightdata = (unsigned char *)Mem_Alloc(loadmodel->mempool, sb->cursize*3);
totaltris += numedges - 2;
}
- Mod_AllocSurfMesh(loadmodel->mempool, totalverts, totaltris, true, false, false);
+ Mod_AllocSurfMesh(loadmodel->mempool, totalverts, totaltris, true, false);
lightmaptexture = NULL;
deluxemaptexture = r_texture_blanknormalmap;
}
#endif
}
- else if (loadmodel->brush.ishlbsp || loadmodel->brush.isq2bsp) // LordHavoc: HalfLife map (bsp version 30)
+ else if (loadmodel->brush.ishlbsp || loadmodel->brush.isq2bsp) // LadyHavoc: HalfLife map (bsp version 30)
surface->lightmapinfo->samples = loadmodel->brushq1.lightdata + lightmapoffset;
- else // LordHavoc: white lighting (bsp version 29)
+ else // LadyHavoc: white lighting (bsp version 29)
{
surface->lightmapinfo->samples = loadmodel->brushq1.lightdata + (lightmapoffset * 3);
if (loadmodel->brushq1.nmaplightdata)
v = ((DotProduct(((loadmodel->surfmesh.data_vertex3f + 3 * surface->num_firstvertex) + i * 3), surface->lightmapinfo->texinfo->vecs[1]) + surface->lightmapinfo->texinfo->vecs[1][3]) + 8 - surface->lightmapinfo->texturemins[1]) * (1.0 / 16.0);
(loadmodel->surfmesh.data_texcoordlightmap2f + 2 * surface->num_firstvertex)[i * 2 + 0] = u * uscale + ubase;
(loadmodel->surfmesh.data_texcoordlightmap2f + 2 * surface->num_firstvertex)[i * 2 + 1] = v * vscale + vbase;
- // LordHavoc: calc lightmap data offset for vertex lighting to use
+ // LadyHavoc: calc lightmap data offset for vertex lighting to use
iu = (int) u;
iv = (int) v;
(loadmodel->surfmesh.data_lightmapoffsets + surface->num_firstvertex)[i] = (bound(0, iv, tmax) * ssize + bound(0, iu, smax)) * 3;
for (j=0 ; j<2 ; j++)
{
- // LordHavoc: this code supports broken bsp files produced by
+ // LadyHavoc: this code supports broken bsp files produced by
// arguire qbsp which can produce more than 32768 nodes, any value
// below count is assumed to be a node number, any other value is
// assumed to be a leaf number
}
else
{
- // LordHavoc: this code supports arguire qbsp's broken clipnodes indices (more than 32768 clipnodes), values above count are assumed to be contents values
+ // LadyHavoc: this code supports arguire qbsp's broken clipnodes indices (more than 32768 clipnodes), values above count are assumed to be contents values
out->children[0] = (unsigned short)MSG_ReadLittleShort(sb);
out->children[1] = (unsigned short)MSG_ReadLittleShort(sb);
if (out->children[0] >= count)
VectorAdd(inmins, hull->clip_size, outmaxs);
}
-static int Mod_Q1BSP_CreateShadowMesh(dp_model_t *mod)
-{
- int j;
- int numshadowmeshtriangles = 0;
- msurface_t *surface;
- if (cls.state == ca_dedicated)
- return 0;
- // make a single combined shadow mesh to allow optimized shadow volume creation
-
- for (j = 0, surface = mod->data_surfaces;j < mod->num_surfaces;j++, surface++)
- {
- surface->num_firstshadowmeshtriangle = numshadowmeshtriangles;
- numshadowmeshtriangles += surface->num_triangles;
- }
- mod->brush.shadowmesh = Mod_ShadowMesh_Begin(mod->mempool, numshadowmeshtriangles * 3, numshadowmeshtriangles, NULL, NULL, NULL, false, false, true);
- for (j = 0, surface = mod->data_surfaces;j < mod->num_surfaces;j++, surface++)
- if (surface->num_triangles > 0)
- Mod_ShadowMesh_AddMesh(mod->mempool, mod->brush.shadowmesh, NULL, NULL, NULL, mod->surfmesh.data_vertex3f, NULL, NULL, NULL, NULL, surface->num_triangles, (mod->surfmesh.data_element3i + 3 * surface->num_firsttriangle));
- mod->brush.shadowmesh = Mod_ShadowMesh_Finish(mod->mempool, mod->brush.shadowmesh, false, r_enableshadowvolumes.integer != 0, false);
- if (mod->brush.shadowmesh && mod->brush.shadowmesh->neighbor3i)
- Mod_BuildTriangleNeighbors(mod->brush.shadowmesh->neighbor3i, mod->brush.shadowmesh->element3i, mod->brush.shadowmesh->numtriangles);
-
- return numshadowmeshtriangles;
-}
-
void Mod_CollisionBIH_TraceLineAgainstSurfaces(dp_model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, trace_t *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
mod->GetLightInfo = R_Q1BSP_GetLightInfo;
mod->CompileShadowMap = R_Q1BSP_CompileShadowMap;
mod->DrawShadowMap = R_Q1BSP_DrawShadowMap;
- mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
- mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
mod->DrawLight = R_Q1BSP_DrawLight;
// load into heap
mod->numframes = 2; // regular and alternate animation
mod->numskins = 1;
- // make a single combined shadow mesh to allow optimized shadow volume creation
- Mod_Q1BSP_CreateShadowMesh(loadmodel);
-
if (loadmodel->brush.numsubmodels)
loadmodel->brush.submodels = (dp_model_t **)Mem_Alloc(loadmodel->mempool, loadmodel->brush.numsubmodels * sizeof(dp_model_t *));
- // LordHavoc: to clear the fog around the original quake submodel code, I
+ // LadyHavoc: to clear the fog around the original quake submodel code, I
// will explain:
// first of all, some background info on the submodels:
// model 0 is the map model (the world, named maps/e1m1.bsp for example)
// the number i), at the end of the loop it duplicates the model to become
// the next submodel, and loops back to set up the new submodel.
- // LordHavoc: now the explanation of my sane way (which works identically):
+ // LadyHavoc: now the explanation of my sane way (which works identically):
// set up the world model, then on each submodel copy from the world model
// and set up the submodel with the respective model info.
totalstylesurfaces = 0;
datapointer = (unsigned char *)Mem_Alloc(mod->mempool, mod->num_surfaces * sizeof(int) + totalstyles * sizeof(model_brush_lightstyleinfo_t) + totalstylesurfaces * sizeof(int *));
for (i = 0;i < mod->brush.numsubmodels;i++)
{
- // LordHavoc: this code was originally at the end of this loop, but
+ // LadyHavoc: this code was originally at the end of this loop, but
// has been transformed to something more readable at the start here.
if (i > 0)
}
else
{
- // LordHavoc: empty submodel(lacrima.bsp has such a glitch)
+ // LadyHavoc: empty submodel(lacrima.bsp has such a glitch)
Con_Printf("warning: empty submodel *%i in %s\n", i+1, loadmodel->name);
}
//mod->brushq1.num_visleafs = bm->visleafs;
int q2flags = out->q2flags;
unsigned char *walfile = NULL;
fs_offset_t walfilesize = 0;
- Mod_LoadTextureFromQ3Shader(tx, filename, true, true, TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS);
+ Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, tx, filename, true, true, TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS, MATERIALFLAG_WALL);
// now read the .wal file to get metadata (even if a .tga was overriding it, we still need the wal data)
walfile = FS_LoadFile(filename, tempmempool, true, &walfilesize);
if (walfile)
static void Mod_Q2BSP_LoadLighting(sizebuf_t *sb)
{
- // LordHavoc: this fits exactly the same format that we use in .lit files
+ // LadyHavoc: this fits exactly the same format that we use in .lit files
loadmodel->brushq1.lightdata = (unsigned char *)Mem_Alloc(loadmodel->mempool, sb->cursize);
MSG_ReadBytes(sb, sb->cursize, loadmodel->brushq1.lightdata);
}
mod->GetLightInfo = R_Q1BSP_GetLightInfo;
mod->CompileShadowMap = R_Q1BSP_CompileShadowMap;
mod->DrawShadowMap = R_Q1BSP_DrawShadowMap;
- mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
- mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
mod->DrawLight = R_Q1BSP_DrawLight;
// load into heap
mod->numframes = 0; // q2bsp animations are kind of special, frame is unbounded...
mod->numskins = 1;
- // make a single combined shadow mesh to allow optimized shadow volume creation
- Mod_Q1BSP_CreateShadowMesh(loadmodel);
-
if (loadmodel->brush.numsubmodels)
loadmodel->brush.submodels = (dp_model_t **)Mem_Alloc(loadmodel->mempool, loadmodel->brush.numsubmodels * sizeof(dp_model_t *));
{
out[i].surfaceflags = LittleLong(in[i].surfaceflags);
out[i].supercontents = Mod_Q3BSP_SuperContentsFromNativeContents(LittleLong(in[i].contents));
- Mod_LoadTextureFromQ3Shader(out + i, in[i].name, true, true, TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS);
+ Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, out + i, in[i].name, true, true, TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS, MATERIALFLAG_WALL);
// restore the surfaceflags and supercontents
out[i].surfaceflags = LittleLong(in[i].surfaceflags);
out[i].supercontents = Mod_Q3BSP_SuperContentsFromNativeContents(LittleLong(in[i].contents));
int i, oldi, j, n, count, invalidelements, patchsize[2], finalwidth, finalheight, xtess, ytess, finalvertices, finaltriangles, firstvertex, firstelement, type, oldnumtriangles, oldnumtriangles2, meshvertices, meshtriangles, collisionvertices, collisiontriangles, numvertices, numtriangles, cxtess, cytess;
float lightmaptcbase[2], lightmaptcscale[2];
//int *originalelement3i;
- //int *originalneighbor3i;
float *originalvertex3f;
//float *originalsvector3f;
//float *originaltvector3f;
i = oldi;
in = oldin;
out = oldout;
- Mod_AllocSurfMesh(loadmodel->mempool, meshvertices, meshtriangles, false, true, false);
+ Mod_AllocSurfMesh(loadmodel->mempool, meshvertices, meshtriangles, false, true);
if (collisiontriangles)
{
loadmodel->brush.data_collisionvertex3f = (float *)Mem_Alloc(loadmodel->mempool, collisionvertices * sizeof(float[3]));
q3dlightgrid_t *a, *s;
// scale lighting by lightstyle[0] so that darkmode in dpmod works properly
- switch(vid.renderpath)
- {
- case RENDERPATH_GL20:
- case RENDERPATH_D3D9:
- case RENDERPATH_D3D10:
- case RENDERPATH_D3D11:
- case RENDERPATH_SOFT:
- case RENDERPATH_GLES2:
- // LordHavoc: FIXME: is this true?
- stylescale = 1; // added while render
- break;
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GLES1:
- stylescale = r_refdef.scene.rtlightstylevalue[0];
- break;
- }
+ // LadyHavoc: FIXME: is this true?
+ stylescale = 1; // added while render
+ //stylescale = r_refdef.scene.rtlightstylevalue[0];
if (!model->brushq3.num_lightgrid)
{
mod->GetLightInfo = R_Q1BSP_GetLightInfo;
mod->CompileShadowMap = R_Q1BSP_CompileShadowMap;
mod->DrawShadowMap = R_Q1BSP_DrawShadowMap;
- mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
- mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
mod->DrawLight = R_Q1BSP_DrawLight;
mod_base = (unsigned char *)header;
// FIXME: shader alpha should replace r_wateralpha support in q3bsp
loadmodel->brush.supportwateralpha = true;
- // make a single combined shadow mesh to allow optimized shadow volume creation
- Mod_Q1BSP_CreateShadowMesh(loadmodel);
-
loadmodel->brush.num_leafs = 0;
Mod_Q3BSP_RecursiveFindNumLeafs(loadmodel->brush.data_nodes);
loadmodel->GetLightInfo = R_Q1BSP_GetLightInfo;
loadmodel->CompileShadowMap = R_Q1BSP_CompileShadowMap;
loadmodel->DrawShadowMap = R_Q1BSP_DrawShadowMap;
- loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
- loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
loadmodel->DrawLight = R_Q1BSP_DrawLight;
skinfiles = Mod_LoadSkinFiles();
// allocate storage for final mesh data
loadmodel->num_textures = numtextures * loadmodel->numskins;
loadmodel->num_texturesperskin = numtextures;
- data = (unsigned char *)Mem_Alloc(loadmodel->mempool, loadmodel->num_surfaces * sizeof(int) + loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t) + numtriangles * sizeof(int[3]) + (numvertices <= 65536 ? numtriangles * sizeof(unsigned short[3]) : 0) + (r_enableshadowvolumes.integer ? numtriangles * sizeof(int[3]) : 0) + numvertices * sizeof(float[14]) + loadmodel->brush.numsubmodels * sizeof(dp_model_t *));
+ data = (unsigned char *)Mem_Alloc(loadmodel->mempool, loadmodel->num_surfaces * sizeof(int) + loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t) + numtriangles * sizeof(int[3]) + (numvertices <= 65536 ? numtriangles * sizeof(unsigned short[3]) : 0) + numvertices * sizeof(float[14]) + loadmodel->brush.numsubmodels * sizeof(dp_model_t *));
loadmodel->brush.submodels = (dp_model_t **)data;data += loadmodel->brush.numsubmodels * sizeof(dp_model_t *);
loadmodel->sortedmodelsurfaces = (int *)data;data += loadmodel->num_surfaces * sizeof(int);
loadmodel->data_textures = (texture_t *)data;data += loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t);
loadmodel->surfmesh.num_vertices = numvertices;
loadmodel->surfmesh.num_triangles = numtriangles;
- if (r_enableshadowvolumes.integer)
- loadmodel->surfmesh.data_neighbor3i = (int *)data;data += numtriangles * sizeof(int[3]);
loadmodel->surfmesh.data_vertex3f = (float *)data;data += numvertices * sizeof(float[3]);
loadmodel->surfmesh.data_svector3f = (float *)data;data += numvertices * sizeof(float[3]);
loadmodel->surfmesh.data_tvector3f = (float *)data;data += numvertices * sizeof(float[3]);
loadmodel->surfmesh.data_normal3f = (float *)data;data += numvertices * sizeof(float[3]);
loadmodel->surfmesh.data_texcoordtexture2f = (float *)data;data += numvertices * sizeof(float[2]);
- if (loadmodel->surfmesh.num_vertices <= 65536)
+
+ if (loadmodel->surfmesh.num_vertices <= 65536) {
loadmodel->surfmesh.data_element3s = (unsigned short *)data;data += loadmodel->surfmesh.num_triangles * sizeof(unsigned short[3]);
+ }
for (j = 0;j < loadmodel->surfmesh.num_vertices;j++)
{
Mem_Free(vertexhashtable);
Mem_Free(vertexhashdata);
- // make a single combined shadow mesh to allow optimized shadow volume creation
- Mod_Q1BSP_CreateShadowMesh(loadmodel);
-
// compute all the mesh information that was not loaded from the file
if (loadmodel->surfmesh.data_element3s)
for (i = 0;i < loadmodel->surfmesh.num_triangles*3;i++)
loadmodel->surfmesh.data_element3s[i] = loadmodel->surfmesh.data_element3i[i];
- Mod_ValidateElements(loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.num_triangles, 0, loadmodel->surfmesh.num_vertices, __FILE__, __LINE__);
+ Mod_ValidateElements(loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_element3s, loadmodel->surfmesh.num_triangles, 0, loadmodel->surfmesh.num_vertices, __FILE__, __LINE__);
// generate normals if the file did not have them
if (!VectorLength2(loadmodel->surfmesh.data_normal3f))
Mod_BuildNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_normal3f, r_smoothnormals_areaweighting.integer != 0);
Mod_BuildTextureVectorsFromNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_texcoordtexture2f, loadmodel->surfmesh.data_normal3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_svector3f, loadmodel->surfmesh.data_tvector3f, r_smoothnormals_areaweighting.integer != 0);
- if (loadmodel->surfmesh.data_neighbor3i)
- Mod_BuildTriangleNeighbors(loadmodel->surfmesh.data_neighbor3i, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.num_triangles);
// if this is a worldmodel and has no BSP tree, create a fake one for the purpose
loadmodel->brush.num_visleafs = 1;