X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=model_brush.c;h=9085bdfe02c74566b06c15c71a379c209cfd8c50;hb=75ed014650cc6c57abc48b854fb60f78bc249eab;hp=7835687d56052342d8b11dc603daa125f1da079d;hpb=c10cd5ef15e3211797e91900f6ada528faa93e92;p=xonotic%2Fdarkplaces.git diff --git a/model_brush.c b/model_brush.c index 7835687d..9085bdfe 100644 --- a/model_brush.c +++ b/model_brush.c @@ -788,7 +788,7 @@ loc0: int i, ds, dt; msurface_t *surf; - surf = cl.worldmodel->brushq1.surfaces + node->firstsurface; + surf = r_refdef.worldmodel->brushq1.surfaces + node->firstsurface; for (i = 0;i < node->numsurfaces;i++, surf++) { if (!(surf->flags & SURF_LIGHTMAP) || !surf->samples) @@ -869,7 +869,7 @@ 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(ambientcolor, diffusecolor, diffusenormal, cl.worldmodel->brushq1.nodes + cl.worldmodel->brushq1.hulls[0].firstclipnode, p[0], p[1], p[2], p[2] - 65536); + Mod_Q1BSP_LightPoint_RecursiveBSPNode(ambientcolor, diffusecolor, diffusenormal, model->brushq1.nodes + model->brushq1.hulls[0].firstclipnode, p[0], p[1], p[2], p[2] - 65536); } static void Mod_Q1BSP_DecompressVis(const qbyte *in, const qbyte *inend, qbyte *out, qbyte *outend) @@ -880,7 +880,7 @@ static void Mod_Q1BSP_DecompressVis(const qbyte *in, const qbyte *inend, qbyte * { if (in == inend) { - Con_DPrintf("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, out - outstart, outend - outstart); return; } c = *in++; @@ -890,14 +890,14 @@ static void Mod_Q1BSP_DecompressVis(const qbyte *in, const qbyte *inend, qbyte * { if (in == inend) { - Con_DPrintf("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, out - outstart, outend - outstart); return; } for (c = *in++;c > 0;c--) { if (out == outend) { - Con_DPrintf("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, out - outstart, outend - outstart); return; } *out++ = 0; @@ -2271,6 +2271,102 @@ static void Mod_Q1BSP_LoadPlanes(lump_t *l) } } +static void Mod_Q1BSP_LoadMapBrushes(void) +{ +#if 0 +// unfinished + int submodel, numbrushes; + qboolean firstbrush; + char *text, *maptext; + char mapfilename[MAX_QPATH]; + FS_StripExtension (loadmodel->name, mapfilename, sizeof (mapfilename)); + strlcat (mapfilename, ".map", sizeof (mapfilename)); + maptext = (qbyte*) FS_LoadFile(mapfilename, tempmempool, false); + if (!maptext) + return; + text = maptext; + if (!COM_ParseToken(&data, false)) + return; // error + submodel = 0; + for (;;) + { + if (!COM_ParseToken(&data, false)) + break; + if (com_token[0] != '{') + return; // error + // entity + firstbrush = true; + numbrushes = 0; + maxbrushes = 256; + brushes = Mem_Alloc(loadmodel->mempool, maxbrushes * sizeof(mbrush_t)); + for (;;) + { + if (!COM_ParseToken(&data, false)) + return; // error + if (com_token[0] == '}') + break; // end of entity + if (com_token[0] == '{') + { + // brush + if (firstbrush) + { + if (submodel) + { + if (submodel > loadmodel->brush.numsubmodels) + { + Con_Printf("Mod_Q1BSP_LoadMapBrushes: .map has more submodels than .bsp!\n"); + model = NULL; + } + else + model = loadmodel->brush.submodels[submodel]; + } + else + model = loadmodel; + } + for (;;) + { + if (!COM_ParseToken(&data, false)) + return; // error + if (com_token[0] == '}') + break; // end of brush + // each brush face should be this format: + // ( x y z ) ( x y z ) ( x y z ) texture scroll_s scroll_t rotateangle scale_s scale_t + // FIXME: support hl .map format + for (pointnum = 0;pointnum < 3;pointnum++) + { + COM_ParseToken(&data, false); + for (componentnum = 0;componentnum < 3;componentnum++) + { + COM_ParseToken(&data, false); + point[pointnum][componentnum] = atof(com_token); + } + COM_ParseToken(&data, false); + } + COM_ParseToken(&data, false); + strlcpy(facetexture, com_token, sizeof(facetexture)); + COM_ParseToken(&data, false); + //scroll_s = atof(com_token); + COM_ParseToken(&data, false); + //scroll_t = atof(com_token); + COM_ParseToken(&data, false); + //rotate = atof(com_token); + COM_ParseToken(&data, false); + //scale_s = atof(com_token); + COM_ParseToken(&data, false); + //scale_t = atof(com_token); + TriangleNormal(point[0], point[1], point[2], planenormal); + VectorNormalizeDouble(planenormal); + planedist = DotProduct(point[0], planenormal); + //ChooseTexturePlane(planenormal, texturevector[0], texturevector[1]); + } + continue; + } + } + } +#endif +} + + #define MAX_PORTALPOINTS 64 typedef struct portal_s @@ -3022,11 +3118,11 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer) Mod_Q1BSP_MakePortals(); mod->numframes = 2; // regular and alternate animation + mod->numskins = 1; mainmempool = mod->mempool; Mod_Q1BSP_LoadLightList(); - loadmodel = loadmodel; // make a single combined shadow mesh to allow optimized shadow volume creation numshadowmeshtriangles = 0; @@ -3040,7 +3136,10 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer) Mod_ShadowMesh_AddMesh(loadmodel->mempool, loadmodel->brush.shadowmesh, NULL, NULL, NULL, surf->mesh.data_vertex3f, NULL, NULL, NULL, NULL, surf->mesh.num_triangles, surf->mesh.data_element3i); loadmodel->brush.shadowmesh = Mod_ShadowMesh_Finish(loadmodel->mempool, loadmodel->brush.shadowmesh, false, true); Mod_BuildTriangleNeighbors(loadmodel->brush.shadowmesh->neighbor3i, loadmodel->brush.shadowmesh->element3i, loadmodel->brush.shadowmesh->numtriangles); - + + if (loadmodel->brush.numsubmodels) + loadmodel->brush.submodels = Mem_Alloc(loadmodel->mempool, loadmodel->brush.numsubmodels * sizeof(model_t *)); + // LordHavoc: to clear the fog around the original quake submodel code, I // will explain: // first of all, some background info on the submodels: @@ -3080,6 +3179,9 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer) mod->mempool = NULL; } + if (loadmodel->brush.submodels) + loadmodel->brush.submodels[i] = mod; + bm = &mod->brushq1.submodels[i]; mod->brushq1.hulls[0].firstclipnode = bm->headnode[0]; @@ -3168,6 +3270,8 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer) mod->brushq1.num_visleafs = bm->visleafs; } + Mod_Q1BSP_LoadMapBrushes(); + //Mod_Q1BSP_ProcessLightList(); if (developer.integer) @@ -3896,8 +4000,8 @@ parseerror: Con_DPrintf("%s: No shader found for texture \"%s\"\n", loadmodel->name, out->name); out->surfaceparms = 0; // these are defaults - if (!strncmp(out->name, "textures/skies/", 15)) - out->surfaceparms |= Q3SURFACEPARM_SKY; + //if (!strncmp(out->name, "textures/skies/", 15)) + // out->surfaceparms |= Q3SURFACEPARM_SKY; //if (!strcmp(out->name, "caulk") || !strcmp(out->name, "common/caulk") || !strcmp(out->name, "textures/common/caulk") // || !strcmp(out->name, "nodraw") || !strcmp(out->name, "common/nodraw") || !strcmp(out->name, "textures/common/nodraw")) // out->surfaceparms |= Q3SURFACEPARM_NODRAW; @@ -5686,7 +5790,7 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer) q3msurface_t *face; mod->type = mod_brushq3; - mod->numframes = 1; + mod->numframes = 2; // although alternate textures are not supported it is annoying to complain about no such frame 1 mod->numskins = 1; header = (q3dheader_t *)buffer;