X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=model_brush.c;h=d7fef5d50ff34b37edeec17b969fc7365b4ca80b;hb=16742571f9a7d696a654668febdc10b4f4affd57;hp=e644b225c0065259b28acc097695397a4b2fdf43;hpb=d9c2443445df49c61e0107ebcb7e5dc06d978b6c;p=xonotic%2Fdarkplaces.git diff --git a/model_brush.c b/model_brush.c index e644b225..d7fef5d5 100644 --- a/model_brush.c +++ b/model_brush.c @@ -614,6 +614,7 @@ RecursiveHullCheckTraceInfo_t; #define HULLCHECKSTATE_SOLID 1 #define HULLCHECKSTATE_DONE 2 +extern cvar_t collision_prefernudgedfraction; static int Mod_Q1BSP_RecursiveHullCheck(RecursiveHullCheckTraceInfo_t *t, int num, double p1f, double p2f, double p1[3], double p2[3]) { // status variables, these don't need to be saved on the stack when @@ -768,6 +769,9 @@ loc0: midf = (t1 - DIST_EPSILON) / (t1 - t2); t->trace->fraction = bound(0, midf, 1); + if (collision_prefernudgedfraction.integer) + t->trace->realfraction = t->trace->fraction; + #if COLLISIONPARANOID >= 3 Con_Print("D"); #endif @@ -1118,7 +1122,8 @@ middle sample (the one which was requested) void Mod_Q1BSP_LightPoint(model_t *model, const vec3_t p, vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal) { Mod_Q1BSP_LightPoint_RecursiveBSPNode(model, ambientcolor, diffusecolor, diffusenormal, model->brush.data_nodes + model->brushq1.hulls[0].firstclipnode, p[0], p[1], p[2] + 0.125, p[2] - 65536); - VectorSet(diffusenormal, 0, 0, -1); + // pretend lighting is coming down from above (due to lack of a lightgrid to know primary lighting direction) + VectorSet(diffusenormal, 0, 0, 1); } static void Mod_Q1BSP_DecompressVis(const unsigned char *in, const unsigned char *inend, unsigned char *out, unsigned char *outend) @@ -1129,7 +1134,7 @@ static void Mod_Q1BSP_DecompressVis(const unsigned char *in, const unsigned char { if (in == inend) { - Con_Printf("Mod_Q1BSP_DecompressVis: input underrun on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, out - outstart, outend - outstart); + Con_Printf("Mod_Q1BSP_DecompressVis: input underrun on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, (int)(out - outstart), (int)(outend - outstart)); return; } c = *in++; @@ -1139,14 +1144,14 @@ static void Mod_Q1BSP_DecompressVis(const unsigned char *in, const unsigned char { if (in == inend) { - Con_Printf("Mod_Q1BSP_DecompressVis: input underrun (during zero-run) on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, out - outstart, outend - outstart); + Con_Printf("Mod_Q1BSP_DecompressVis: input underrun (during zero-run) on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, (int)(out - outstart), (int)(outend - outstart)); return; } for (c = *in++;c > 0;c--) { if (out == outend) { - Con_Printf("Mod_Q1BSP_DecompressVis: output overrun on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, out - outstart, outend - outstart); + Con_Printf("Mod_Q1BSP_DecompressVis: output overrun on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, (int)(out - outstart), (int)(outend - outstart)); return; } *out++ = 0; @@ -1263,10 +1268,11 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) tx->skinframerate = 1; tx->currentskinframe = tx->skinframes; tx->skinframes[0].base = r_texture_notexture; + tx->backgroundcurrentskinframe = tx->backgroundskinframes; tx->basematerialflags = 0; if (i == loadmodel->num_textures - 1) { - tx->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_LIGHTBOTHSIDES; + tx->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_LIGHTBOTHSIDES | MATERIALFLAG_NOSHADOW; tx->supercontents = mod_q1bsp_texture_water.supercontents; tx->surfaceflags = mod_q1bsp_texture_water.surfaceflags; } @@ -1397,7 +1403,7 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) if (strncmp(tx->name,"*lava",5) && strncmp(tx->name,"*teleport",9) && strncmp(tx->name,"*rift",5)) // Scourge of Armagon texture - tx->basematerialflags |= MATERIALFLAG_WATERALPHA; + tx->basematerialflags |= MATERIALFLAG_WATERALPHA | MATERIALFLAG_NOSHADOW; if (!strncmp(tx->name, "*lava", 5)) { tx->supercontents = mod_q1bsp_texture_lava.supercontents; @@ -1413,13 +1419,13 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) tx->supercontents = mod_q1bsp_texture_water.supercontents; tx->surfaceflags = mod_q1bsp_texture_water.surfaceflags; } - tx->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_LIGHTBOTHSIDES; + tx->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_LIGHTBOTHSIDES | MATERIALFLAG_NOSHADOW; } else if (tx->name[0] == 's' && tx->name[1] == 'k' && tx->name[2] == 'y') { tx->supercontents = mod_q1bsp_texture_sky.supercontents; tx->surfaceflags = mod_q1bsp_texture_sky.surfaceflags; - tx->basematerialflags |= MATERIALFLAG_SKY; + tx->basematerialflags |= MATERIALFLAG_SKY | MATERIALFLAG_NOSHADOW; } else { @@ -1428,7 +1434,7 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) tx->basematerialflags |= MATERIALFLAG_WALL; } if (tx->skinframes[0].fog) - tx->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT; + tx->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT | MATERIALFLAG_NOSHADOW; // start out with no animation tx->currentframe = tx; @@ -1600,7 +1606,7 @@ static void Mod_Q1BSP_LoadLighting(lump_t *l) else if (filesize == 8) Con_Print("Empty .lit file, ignoring\n"); else - Con_Printf("Corrupt .lit file (file size %i bytes, should be %i bytes), ignoring\n", filesize, 8 + l->filelen * 3); + Con_Printf("Corrupt .lit file (file size %i bytes, should be %i bytes), ignoring\n", (int) filesize, (int) (8 + l->filelen * 3)); if (data) { Mem_Free(data); @@ -2337,7 +2343,7 @@ static void Mod_Q1BSP_LoadLeafs(lump_t *l) out->numleafsurfaces = LittleShort(in->nummarksurfaces); if (out->firstleafsurface < 0 || LittleShort(in->firstmarksurface) + out->numleafsurfaces > loadmodel->brush.num_leafsurfaces) { - Con_Printf("Mod_Q1BSP_LoadLeafs: invalid leafsurface range %i:%i outside range %i:%i\n", out->firstleafsurface, out->firstleafsurface + out->numleafsurfaces, 0, loadmodel->brush.num_leafsurfaces); + Con_Printf("Mod_Q1BSP_LoadLeafs: invalid leafsurface range %i:%i outside range %i:%i\n", (int)(out->firstleafsurface - loadmodel->brush.data_leafsurfaces), (int)(out->firstleafsurface + out->numleafsurfaces - loadmodel->brush.data_leafsurfaces), 0, loadmodel->brush.num_leafsurfaces); out->firstleafsurface = NULL; out->numleafsurfaces = 0; } @@ -2363,6 +2369,26 @@ static void Mod_Q1BSP_LoadLeafs(lump_t *l) } } +qboolean Mod_Q1BSP_CheckWaterAlphaSupport(void) +{ + int i, j; + mleaf_t *leaf; + const unsigned char *pvs; + // check all liquid leafs to see if they can see into empty leafs, if any + // can we can assume this map supports r_wateralpha + for (i = 0, leaf = loadmodel->brush.data_leafs;i < loadmodel->brush.num_leafs;i++, leaf++) + { + if ((leaf->contents == CONTENTS_WATER || leaf->contents == CONTENTS_SLIME) && (leaf->clusterindex >= 0 && loadmodel->brush.data_pvsclusters)) + { + pvs = loadmodel->brush.data_pvsclusters + leaf->clusterindex * loadmodel->brush.num_pvsclusterbytes; + for (j = 0;j < loadmodel->brush.num_leafs;j++) + if (CHECKPVSBIT(pvs, loadmodel->brush.data_leafs[j].clusterindex) && loadmodel->brush.data_leafs[j].contents == CONTENTS_EMPTY) + return true; + } + } + return false; +} + static void Mod_Q1BSP_LoadClipnodes(lump_t *l, hullinfo_t *hullinfo) { dclipnode_t *in, *out; @@ -3279,6 +3305,9 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend) Mod_Q1BSP_LoadNodes(&header->lumps[LUMP_NODES]); Mod_Q1BSP_LoadClipnodes(&header->lumps[LUMP_CLIPNODES], &hullinfo); + // check if the map supports transparent water rendering + loadmodel->brush.supportwateralpha = Mod_Q1BSP_CheckWaterAlphaSupport(); + if (!mod->brushq1.lightdata) mod->brush.LightPoint = NULL; @@ -3945,6 +3974,7 @@ static void Mod_Q3BSP_LoadEntities(lump_t *l) typedef struct q3shaderinfo_layer_s { + int alphatest; int clampmap; float framerate; int numframes; @@ -4100,11 +4130,8 @@ static void Mod_Q3BSP_LoadShaders(void) } } } - if (layer == shader->layers + 0) - { - if (numparameters >= 2 && !strcasecmp(parameter[0], "alphafunc")) - shader->textureflags |= Q3TEXTUREFLAG_ALPHATEST; - } + if (numparameters >= 2 && !strcasecmp(parameter[0], "alphafunc")) + layer->alphatest = true; if (numparameters >= 2 && (!strcasecmp(parameter[0], "map") || !strcasecmp(parameter[0], "clampmap"))) { if (!strcasecmp(parameter[0], "clampmap")) @@ -4119,7 +4146,7 @@ static void Mod_Q3BSP_LoadShaders(void) { int i; layer->numframes = min(numparameters - 2, TEXTURE_MAXFRAMES); - layer->framerate = atoi(parameter[1]); + layer->framerate = atof(parameter[1]); for (i = 0;i < layer->numframes;i++) strlcpy(layer->texturename[i], parameter[i + 2], sizeof(layer->texturename)); } @@ -4151,7 +4178,7 @@ static void Mod_Q3BSP_LoadShaders(void) numparameters = 0; for (j = 0;strcasecmp(com_token, "\n") && strcasecmp(com_token, "}");j++) { - if (j < 4) + if (j < TEXTURE_MAXFRAMES + 4) { strlcpy(parameter[j], com_token, sizeof(parameter[j])); numparameters = j + 1; @@ -4271,7 +4298,7 @@ static void Mod_Q3BSP_LoadShaders(void) if (shader->numlayers) { shader->primarylayer = shader->layers + 0; - if (shader->layers[1].blendfunc[0] == GL_SRC_ALPHA && shader->layers[1].blendfunc[1] == GL_ONE_MINUS_SRC_ALPHA) + if ((shader->layers[1].blendfunc[0] == GL_SRC_ALPHA && shader->layers[1].blendfunc[1] == GL_ONE_MINUS_SRC_ALPHA) || shader->layers[1].alphatest) { // terrain blending or other effects shader->backgroundlayer = shader->layers + 0; @@ -4328,7 +4355,7 @@ static void Mod_Q3BSP_LoadTextures(lump_t *l) out->basematerialflags = 0; if (shader->surfaceparms & Q3SURFACEPARM_SKY) { - out->basematerialflags |= MATERIALFLAG_SKY; + out->basematerialflags |= MATERIALFLAG_SKY | MATERIALFLAG_NOSHADOW; if (shader->skyboxname[0]) { // quake3 seems to append a _ to the skybox name, so this must do so as well @@ -4336,17 +4363,19 @@ static void Mod_Q3BSP_LoadTextures(lump_t *l) } } else if ((out->surfaceflags & Q3SURFACEFLAG_NODRAW) || shader->numlayers == 0) - out->basematerialflags |= MATERIALFLAG_NODRAW; + out->basematerialflags |= MATERIALFLAG_NODRAW | MATERIALFLAG_NOSHADOW; else if (shader->surfaceparms & Q3SURFACEPARM_LAVA) - out->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_FULLBRIGHT; + out->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_LIGHTBOTHSIDES | MATERIALFLAG_FULLBRIGHT | MATERIALFLAG_NOSHADOW; else if (shader->surfaceparms & Q3SURFACEPARM_SLIME) - out->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_WATERALPHA; + out->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_LIGHTBOTHSIDES | MATERIALFLAG_WATERALPHA | MATERIALFLAG_NOSHADOW; else if (shader->surfaceparms & Q3SURFACEPARM_WATER) - out->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_WATERALPHA; + out->basematerialflags |= MATERIALFLAG_WATER | MATERIALFLAG_LIGHTBOTHSIDES | MATERIALFLAG_WATERALPHA | MATERIALFLAG_NOSHADOW; else out->basematerialflags |= MATERIALFLAG_WALL; - if (shader->textureflags & Q3TEXTUREFLAG_ALPHATEST) - out->basematerialflags |= MATERIALFLAG_ALPHATEST | MATERIALFLAG_TRANSPARENT; + if (shader->layers[0].alphatest) + out->basematerialflags |= MATERIALFLAG_ALPHATEST | MATERIALFLAG_TRANSPARENT | MATERIALFLAG_NOSHADOW; + if (shader->textureflags & (Q3TEXTUREFLAG_TWOSIDED | Q3TEXTUREFLAG_AUTOSPRITE | Q3TEXTUREFLAG_AUTOSPRITE2)) + out->basematerialflags |= MATERIALFLAG_NOSHADOW; out->customblendfunc[0] = GL_ONE; out->customblendfunc[1] = GL_ZERO; if (shader->numlayers > 0) @@ -4377,13 +4406,13 @@ Q3 shader blendfuncs actually used in the game (* = supported by DP) if (shader->layers[0].blendfunc[0] != GL_ONE || shader->layers[0].blendfunc[1] != GL_ZERO) { if (shader->layers[0].blendfunc[0] == GL_ONE && shader->layers[0].blendfunc[1] == GL_ONE) - out->basematerialflags |= MATERIALFLAG_ADD | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT; + out->basematerialflags |= MATERIALFLAG_ADD | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT | MATERIALFLAG_NOSHADOW; else if (shader->layers[0].blendfunc[0] == GL_SRC_ALPHA && shader->layers[0].blendfunc[1] == GL_ONE) - out->basematerialflags |= MATERIALFLAG_ADD | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT; + out->basematerialflags |= MATERIALFLAG_ADD | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT | MATERIALFLAG_NOSHADOW; else if (shader->layers[0].blendfunc[0] == GL_SRC_ALPHA && shader->layers[0].blendfunc[1] == GL_ONE_MINUS_SRC_ALPHA) - out->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT; + out->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT | MATERIALFLAG_NOSHADOW; else - out->basematerialflags |= MATERIALFLAG_CUSTOMBLEND | MATERIALFLAG_FULLBRIGHT | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT; + out->basematerialflags |= MATERIALFLAG_CUSTOMBLEND | MATERIALFLAG_FULLBRIGHT | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT | MATERIALFLAG_NOSHADOW; } } if (!shader->lighting) @@ -4397,6 +4426,15 @@ Q3 shader blendfuncs actually used in the game (* = supported by DP) if (!Mod_LoadSkinFrame(&out->skinframes[j], shader->primarylayer->texturename[j], ((shader->surfaceparms & Q3SURFACEPARM_NOMIPMAPS) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (shader->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP) | (shader->primarylayer->clampmap ? TEXF_CLAMP : 0), false, true)) Con_Printf("%s: could not load texture \"%s\" (frame %i) for shader \"%s\"\n", loadmodel->name, shader->primarylayer->texturename[j], j, out->name); } + if (shader->backgroundlayer && cls.state != ca_dedicated) + { + int j; + out->backgroundnumskinframes = shader->backgroundlayer->numframes; + out->backgroundskinframerate = shader->backgroundlayer->framerate; + for (j = 0;j < shader->backgroundlayer->numframes;j++) + if (!Mod_LoadSkinFrame(&out->backgroundskinframes[j], shader->backgroundlayer->texturename[j], ((shader->surfaceparms & Q3SURFACEPARM_NOMIPMAPS) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (shader->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP) | (shader->backgroundlayer->clampmap ? TEXF_CLAMP : 0), false, true)) + Con_Printf("%s: could not load texture \"%s\" (frame %i) for shader \"%s\"\n", loadmodel->name, shader->backgroundlayer->texturename[j], j, out->name); + } } else { @@ -4404,9 +4442,9 @@ Q3 shader blendfuncs actually used in the game (* = supported by DP) Con_DPrintf("%s: No shader found for texture \"%s\"\n", loadmodel->name, out->name); out->surfaceparms = 0; if (out->surfaceflags & Q3SURFACEFLAG_NODRAW) - out->basematerialflags |= MATERIALFLAG_NODRAW; + out->basematerialflags |= MATERIALFLAG_NODRAW | MATERIALFLAG_NOSHADOW; else if (out->surfaceflags & Q3SURFACEFLAG_SKY) - out->basematerialflags |= MATERIALFLAG_SKY; + out->basematerialflags |= MATERIALFLAG_SKY | MATERIALFLAG_NOSHADOW; else out->basematerialflags |= MATERIALFLAG_WALL; // these are defaults @@ -4424,6 +4462,7 @@ Q3 shader blendfuncs actually used in the game (* = supported by DP) // init the animation variables out->currentframe = out; out->currentskinframe = &out->skinframes[0]; + out->backgroundcurrentskinframe = &out->backgroundskinframes[0]; } if (c) Con_DPrintf("%s: %i textures missing shaders\n", loadmodel->name, c); @@ -5246,9 +5285,9 @@ static void Mod_Q3BSP_LoadLightGrid(lump_t *l) if (l->filelen) { if (l->filelen < count * (int)sizeof(*in)) - Host_Error("Mod_Q3BSP_LoadLightGrid: invalid lightgrid lump size %i bytes, should be %i bytes (%ix%ix%i)", l->filelen, count * sizeof(*in), loadmodel->brushq3.num_lightgrid_dimensions[0], loadmodel->brushq3.num_lightgrid_dimensions[1], loadmodel->brushq3.num_lightgrid_dimensions[2]); + Host_Error("Mod_Q3BSP_LoadLightGrid: invalid lightgrid lump size %i bytes, should be %i bytes (%ix%ix%i)", l->filelen, (int)(count * sizeof(*in)), loadmodel->brushq3.num_lightgrid_dimensions[0], loadmodel->brushq3.num_lightgrid_dimensions[1], loadmodel->brushq3.num_lightgrid_dimensions[2]); if (l->filelen != count * (int)sizeof(*in)) - Con_Printf("Mod_Q3BSP_LoadLightGrid: Warning: calculated lightgrid size %i bytes does not match lump size %i", count * sizeof(*in), l->filelen); + Con_Printf("Mod_Q3BSP_LoadLightGrid: Warning: calculated lightgrid size %i bytes does not match lump size %i\n", (int)(count * sizeof(*in)), l->filelen); out = (q3dlightgrid_t *)Mem_Alloc(loadmodel->mempool, count * sizeof(*out)); loadmodel->brushq3.data_lightgrid = out; loadmodel->brushq3.num_lightgrid = count; @@ -5289,7 +5328,7 @@ static void Mod_Q3BSP_LoadPVS(lump_t *l) Host_Error("Mod_Q3BSP_LoadPVS: (chainlength = %i) < ((numclusters = %i) + 7) / 8", loadmodel->brush.num_pvsclusterbytes, loadmodel->brush.num_pvsclusters); totalchains = loadmodel->brush.num_pvsclusterbytes * loadmodel->brush.num_pvsclusters; if (l->filelen < totalchains + (int)sizeof(*in)) - Host_Error("Mod_Q3BSP_LoadPVS: lump too small ((numclusters = %i) * (chainlength = %i) + sizeof(q3dpvs_t) == %i bytes, lump is %i bytes)", loadmodel->brush.num_pvsclusters, loadmodel->brush.num_pvsclusterbytes, totalchains + sizeof(*in), l->filelen); + Host_Error("Mod_Q3BSP_LoadPVS: lump too small ((numclusters = %i) * (chainlength = %i) + sizeof(q3dpvs_t) == %i bytes, lump is %i bytes)", loadmodel->brush.num_pvsclusters, loadmodel->brush.num_pvsclusterbytes, (int)(totalchains + sizeof(*in)), l->filelen); loadmodel->brush.data_pvsclusters = (unsigned char *)Mem_Alloc(loadmodel->mempool, totalchains); memcpy(loadmodel->brush.data_pvsclusters, (unsigned char *)(in + 1), totalchains); @@ -5298,15 +5337,20 @@ static void Mod_Q3BSP_LoadPVS(lump_t *l) static void Mod_Q3BSP_LightPoint(model_t *model, const vec3_t p, vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal) { int i, j, k, index[3]; - float transformed[3], blend1, blend2, blend, yaw, pitch, sinpitch; + float transformed[3], blend1, blend2, blend, yaw, pitch, sinpitch, stylescale; q3dlightgrid_t *a, *s; + + // scale lighting by lightstyle[0] so that darkmode in dpmod works properly + stylescale = r_refdef.lightstylevalue[0] * (1.0f / 264.0f); + if (!model->brushq3.num_lightgrid) { - ambientcolor[0] = 1; - ambientcolor[1] = 1; - ambientcolor[2] = 1; + ambientcolor[0] = stylescale; + ambientcolor[1] = stylescale; + ambientcolor[2] = stylescale; return; } + Matrix4x4_Transform(&model->brushq3.num_lightgrid_indexfromworld, p, transformed); //Matrix4x4_Print(&model->brushq3.num_lightgrid_indexfromworld); //Con_Printf("%f %f %f transformed %f %f %f clamped ", p[0], p[1], p[2], transformed[0], transformed[1], transformed[2]); @@ -5317,6 +5361,7 @@ static void Mod_Q3BSP_LightPoint(model_t *model, const vec3_t p, vec3_t ambientc index[1] = (int)floor(transformed[1]); index[2] = (int)floor(transformed[2]); //Con_Printf("%f %f %f index %i %i %i:\n", transformed[0], transformed[1], transformed[2], index[0], index[1], index[2]); + // now lerp the values VectorClear(diffusenormal); a = &model->brushq3.data_lightgrid[(index[2] * model->brushq3.num_lightgrid_isize[1] + index[1]) * model->brushq3.num_lightgrid_isize[0] + index[0]]; @@ -5332,7 +5377,7 @@ static void Mod_Q3BSP_LightPoint(model_t *model, const vec3_t p, vec3_t ambientc continue; for (i = 0;i < 2;i++) { - blend = blend2 * (i ? (transformed[0] - index[0]) : (1 - (transformed[0] - index[0]))); + blend = blend2 * (i ? (transformed[0] - index[0]) : (1 - (transformed[0] - index[0]))) * stylescale; if (blend < 0.001f || index[0] + i >= model->brushq3.num_lightgrid_isize[0]) continue; s = a + (k * model->brushq3.num_lightgrid_isize[1] + j) * model->brushq3.num_lightgrid_isize[0] + i; @@ -5348,6 +5393,8 @@ static void Mod_Q3BSP_LightPoint(model_t *model, const vec3_t p, vec3_t ambientc } } } + + // normalize the light direction before turning VectorNormalize(diffusenormal); //Con_Printf("result: ambient %f %f %f diffuse %f %f %f diffusenormal %f %f %f\n", ambientcolor[0], ambientcolor[1], ambientcolor[2], diffusecolor[0], diffusecolor[1], diffusecolor[2], diffusenormal[0], diffusenormal[1], diffusenormal[2]); } @@ -5763,6 +5810,9 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend) // the MakePortals code works fine on the q3bsp data as well Mod_Q1BSP_MakePortals(); + // 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 numshadowmeshtriangles = 0; for (j = 0, surface = loadmodel->data_surfaces;j < loadmodel->num_surfaces;j++, surface++) @@ -5848,6 +5898,8 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend) break; if (j < mod->nummodelsurfaces) mod->DrawSky = R_Q1BSP_DrawSky; + else + mod->DrawSky = NULL; } }