X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=model_brush.c;h=66d4d27dc42ce5d55c91992e5b17c4c136aabe39;hb=6be576a5bdfccd4467e87edcbb13ff81740bb79c;hp=f0e3d326957ce681c770b0280c914c1bc08cb72f;hpb=56f80bb76e6c8d260e9d0e9ff279bbf06f519227;p=xonotic%2Fdarkplaces.git diff --git a/model_brush.c b/model_brush.c index f0e3d326..66d4d27d 100644 --- a/model_brush.c +++ b/model_brush.c @@ -1193,9 +1193,17 @@ 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); // pretend lighting is coming down from above (due to lack of a lightgrid to know primary lighting direction) VectorSet(diffusenormal, 0, 0, 1); + + if (!model->brushq1.lightdata) + { + VectorSet(ambientcolor, 1, 1, 1); + VectorSet(diffusecolor, 0, 0, 0); + return; + } + + 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); } static void Mod_Q1BSP_DecompressVis(const unsigned char *in, const unsigned char *inend, unsigned char *out, unsigned char *outend) @@ -3406,9 +3414,6 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend) // check if the map supports transparent water rendering loadmodel->brush.supportwateralpha = Mod_Q1BSP_CheckWaterAlphaSupport(); - if (!mod->brushq1.lightdata) - mod->brush.LightPoint = NULL; - if (mod->brushq1.data_compressedpvs) Mem_Free(mod->brushq1.data_compressedpvs); mod->brushq1.data_compressedpvs = NULL; @@ -3432,7 +3437,7 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->brush.shadowmesh = Mod_ShadowMesh_Begin(loadmodel->mempool, numshadowmeshtriangles * 3, numshadowmeshtriangles, NULL, NULL, NULL, false, false, true); for (j = 0, surface = loadmodel->data_surfaces;j < loadmodel->num_surfaces;j++, surface++) Mod_ShadowMesh_AddMesh(loadmodel->mempool, loadmodel->brush.shadowmesh, NULL, NULL, NULL, loadmodel->surfmesh.data_vertex3f, NULL, NULL, NULL, NULL, surface->num_triangles, (loadmodel->surfmesh.data_element3i + 3 * surface->num_firsttriangle)); - loadmodel->brush.shadowmesh = Mod_ShadowMesh_Finish(loadmodel->mempool, loadmodel->brush.shadowmesh, false, true); + loadmodel->brush.shadowmesh = Mod_ShadowMesh_Finish(loadmodel->mempool, loadmodel->brush.shadowmesh, false, true, false); Mod_BuildTriangleNeighbors(loadmodel->brush.shadowmesh->neighbor3i, loadmodel->brush.shadowmesh->element3i, loadmodel->brush.shadowmesh->numtriangles); if (loadmodel->brush.numsubmodels) @@ -4398,8 +4403,11 @@ static void Mod_Q3BSP_LoadShaders(void) // identify if this is a blended terrain shader or similar if (shader->numlayers) { + shader->backgroundlayer = NULL; shader->primarylayer = shader->layers + 0; - if ((shader->layers[1].blendfunc[0] == GL_SRC_ALPHA && shader->layers[1].blendfunc[1] == GL_ONE_MINUS_SRC_ALPHA) || shader->layers[1].alphatest) + if ((shader->layers[0].blendfunc[0] == GL_ONE && shader->layers[0].blendfunc[1] == GL_ZERO && !shader->layers[0].alphatest) + && ((shader->layers[1].blendfunc[0] == GL_SRC_ALPHA && shader->layers[1].blendfunc[1] == GL_ONE_MINUS_SRC_ALPHA && !shader->layers[0].alphatest) + || (shader->layers[1].blendfunc[0] == GL_ONE && shader->layers[1].blendfunc[1] == GL_ZERO && shader->layers[1].alphatest))) { // terrain blending or other effects shader->backgroundlayer = shader->layers + 0; @@ -4407,7 +4415,10 @@ static void Mod_Q3BSP_LoadShaders(void) } // now see if the lightmap came first, and if so choose the second texture instead if (!strcasecmp(shader->primarylayer->texturename[0], "$lightmap")) + { + shader->backgroundlayer = NULL; shader->primarylayer = shader->layers + 1; + } } } Mem_Free(f); @@ -4475,7 +4486,9 @@ static void Mod_Q3BSP_LoadTextures(lump_t *l) out->basematerialflags |= MATERIALFLAG_WALL; if (shader->layers[0].alphatest) out->basematerialflags |= MATERIALFLAG_ALPHATEST | MATERIALFLAG_TRANSPARENT | MATERIALFLAG_NOSHADOW; - if (shader->textureflags & (Q3TEXTUREFLAG_TWOSIDED | Q3TEXTUREFLAG_AUTOSPRITE | Q3TEXTUREFLAG_AUTOSPRITE2)) + if (shader->textureflags & Q3TEXTUREFLAG_TWOSIDED) + out->basematerialflags |= MATERIALFLAG_NOSHADOW | MATERIALFLAG_NOCULLFACE; + if (shader->textureflags & (Q3TEXTUREFLAG_AUTOSPRITE | Q3TEXTUREFLAG_AUTOSPRITE2)) out->basematerialflags |= MATERIALFLAG_NOSHADOW; out->customblendfunc[0] = GL_ONE; out->customblendfunc[1] = GL_ZERO; @@ -4525,7 +4538,7 @@ Q3 shader blendfuncs actually used in the game (* = supported by DP) out->skinframerate = shader->primarylayer->framerate; for (j = 0;j < shader->primarylayer->numframes;j++) 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); + Con_DPrintf("%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) { @@ -4534,7 +4547,7 @@ Q3 shader blendfuncs actually used in the game (* = supported by DP) 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); + Con_DPrintf("%s: could not load texture \"%s\" (frame %i) for shader \"%s\"\n", loadmodel->name, shader->backgroundlayer->texturename[j], j, out->name); } } else if (!strcmp(out->name, "noshader")) @@ -4560,7 +4573,7 @@ Q3 shader blendfuncs actually used in the game (* = supported by DP) // out->surfaceparms |= Q3SURFACEPARM_TRANS; if (cls.state != ca_dedicated) if (!Mod_LoadSkinFrame(&out->skinframes[0], out->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, true)) - Con_Printf("%s: could not load texture for missing shader \"%s\"\n", loadmodel->name, out->name); + Con_DPrintf("%s: could not load texture for missing shader \"%s\"\n", loadmodel->name, out->name); } // init the animation variables out->currentframe = out; @@ -5988,7 +6001,7 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend) for (j = 0, surface = loadmodel->data_surfaces;j < loadmodel->num_surfaces;j++, surface++) if (surface->num_triangles > 0) Mod_ShadowMesh_AddMesh(loadmodel->mempool, loadmodel->brush.shadowmesh, NULL, NULL, NULL, loadmodel->surfmesh.data_vertex3f, NULL, NULL, NULL, NULL, surface->num_triangles, (loadmodel->surfmesh.data_element3i + 3 * surface->num_firsttriangle)); - loadmodel->brush.shadowmesh = Mod_ShadowMesh_Finish(loadmodel->mempool, loadmodel->brush.shadowmesh, false, true); + loadmodel->brush.shadowmesh = Mod_ShadowMesh_Finish(loadmodel->mempool, loadmodel->brush.shadowmesh, false, true, false); Mod_BuildTriangleNeighbors(loadmodel->brush.shadowmesh->neighbor3i, loadmodel->brush.shadowmesh->element3i, loadmodel->brush.shadowmesh->numtriangles); loadmodel->brush.num_leafs = 0;