X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=model_brush.c;h=fb12604d7278c4b8c69ed7e3af3c375d70f0419b;hb=d159736a199e4043ed98cde48f6d5716ec40845c;hp=8622d3d01d7561bf3dcabc4e20f7372ddb0d6929;hpb=6824d8ddc8a43cae0609be5bbe8bee01fa1a4225;p=xonotic%2Fdarkplaces.git diff --git a/model_brush.c b/model_brush.c index 8622d3d0..fb12604d 100644 --- a/model_brush.c +++ b/model_brush.c @@ -26,24 +26,24 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "wad.h" -//cvar_t r_subdivide_size = {CVAR_SAVE, "r_subdivide_size", "128"}; -cvar_t halflifebsp = {0, "halflifebsp", "0"}; -cvar_t mcbsp = {0, "mcbsp", "0"}; -cvar_t r_novis = {0, "r_novis", "0"}; -cvar_t r_miplightmaps = {CVAR_SAVE, "r_miplightmaps", "0"}; -cvar_t r_lightmaprgba = {0, "r_lightmaprgba", "1"}; -cvar_t r_nosurftextures = {0, "r_nosurftextures", "0"}; -cvar_t r_subdivisions_tolerance = {0, "r_subdivisions_tolerance", "4"}; -cvar_t r_subdivisions_mintess = {0, "r_subdivisions_mintess", "1"}; -cvar_t r_subdivisions_maxtess = {0, "r_subdivisions_maxtess", "1024"}; -cvar_t r_subdivisions_maxvertices = {0, "r_subdivisions_maxvertices", "65536"}; -cvar_t r_subdivisions_collision_tolerance = {0, "r_subdivisions_collision_tolerance", "15"}; -cvar_t r_subdivisions_collision_mintess = {0, "r_subdivisions_collision_mintess", "1"}; -cvar_t r_subdivisions_collision_maxtess = {0, "r_subdivisions_collision_maxtess", "1024"}; -cvar_t r_subdivisions_collision_maxvertices = {0, "r_subdivisions_collision_maxvertices", "4225"}; -cvar_t mod_q3bsp_curves_collisions = {0, "mod_q3bsp_curves_collisions", "1"}; -cvar_t mod_q3bsp_optimizedtraceline = {0, "mod_q3bsp_optimizedtraceline", "1"}; -cvar_t mod_q3bsp_debugtracebrush = {0, "mod_q3bsp_debugtracebrush", "0"}; +//cvar_t r_subdivide_size = {CVAR_SAVE, "r_subdivide_size", "128", "how large water polygons should be (smaller values produce more polygons which give better warping effects)"}; +cvar_t halflifebsp = {0, "halflifebsp", "0", "indicates the current map is hlbsp format (useful to know because of different bounding box sizes)"}; +cvar_t mcbsp = {0, "mcbsp", "0", "indicates the current map is mcbsp format (useful to know because of different bounding box sizes)"}; +cvar_t r_novis = {0, "r_novis", "0", "draws whole level, see also sv_cullentities_pvs 0"}; +cvar_t r_miplightmaps = {CVAR_SAVE, "r_miplightmaps", "0", "mipmaps lightmaps on upload, also expanding them to power of 2 sizes, this runs slower"}; +cvar_t r_lightmaprgba = {0, "r_lightmaprgba", "1", "whether to use RGBA (32bit) or RGB (24bit) lightmaps"}; +cvar_t r_nosurftextures = {0, "r_nosurftextures", "0", "pretends there was no texture lump found in the q1bsp/hlbsp loading (useful for debugging this rare case)"}; +cvar_t r_subdivisions_tolerance = {0, "r_subdivisions_tolerance", "4", "maximum error tolerance on curve subdivision for rendering purposes (in other words, the curves will be given as many polygons as necessary to represent curves at this quality)"}; +cvar_t r_subdivisions_mintess = {0, "r_subdivisions_mintess", "1", "minimum number of subdivisions (values above 1 will smooth curves that don't need it)"}; +cvar_t r_subdivisions_maxtess = {0, "r_subdivisions_maxtess", "1024", "maximum number of subdivisions (prevents curves beyond a certain detail level, limits smoothing)"}; +cvar_t r_subdivisions_maxvertices = {0, "r_subdivisions_maxvertices", "65536", "maximum vertices allowed per subdivided curve"}; +cvar_t r_subdivisions_collision_tolerance = {0, "r_subdivisions_collision_tolerance", "15", "maximum error tolerance on curve subdivision for collision purposes (usually a larger error tolerance than for rendering)"}; +cvar_t r_subdivisions_collision_mintess = {0, "r_subdivisions_collision_mintess", "1", "minimum number of subdivisions (values above 1 will smooth curves that don't need it)"}; +cvar_t r_subdivisions_collision_maxtess = {0, "r_subdivisions_collision_maxtess", "1024", "maximum number of subdivisions (prevents curves beyond a certain detail level, limits smoothing)"}; +cvar_t r_subdivisions_collision_maxvertices = {0, "r_subdivisions_collision_maxvertices", "4225", "maximum vertices allowed per subdivided curve"}; +cvar_t mod_q3bsp_curves_collisions = {0, "mod_q3bsp_curves_collisions", "1", "enables collisions with curves (SLOW)"}; +cvar_t mod_q3bsp_optimizedtraceline = {0, "mod_q3bsp_optimizedtraceline", "1", "whether to use optimized traceline code for line traces (as opposed to tracebox code)"}; +cvar_t mod_q3bsp_debugtracebrush = {0, "mod_q3bsp_debugtracebrush", "0", "selects different tracebrush bsp recursion algorithms (for debugging purposes only)"}; void Mod_BrushInit(void) { @@ -1096,7 +1096,7 @@ void R_Q1BSP_LoadSplitSky (unsigned char *src, int width, int height, int bytesp if (width != 256 || height != 128) { loadmodel->brush.solidskytexture = R_LoadTexture2D(loadmodel->texturepool, "sky_solidtexture", width, height, src, bytesperpixel == 4 ? TEXTYPE_RGBA : TEXTYPE_PALETTE, TEXF_PRECACHE, bytesperpixel == 1 ? palette_complete : NULL); - loadmodel->brush.alphaskytexture = NULL;; + loadmodel->brush.alphaskytexture = NULL; return; } @@ -1158,7 +1158,7 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) texture_t *tx, *tx2, *anims[10], *altanims[10]; dmiptexlump_t *m; unsigned char *data, *mtdata; - char name[256]; + char name[MAX_QPATH]; loadmodel->data_textures = NULL; @@ -1250,67 +1250,57 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) Con_Printf("warning: unnamed texture in %s, renaming to %s\n", loadmodel->name, tx->name); } - // LordHavoc: HL sky textures are entirely different than quake - if (!loadmodel->brush.ishlbsp && !strncmp(tx->name, "sky", 3) && mtwidth == 256 && mtheight == 128) + if (cls.state != ca_dedicated) { - if (loadmodel->isworldmodel) + // LordHavoc: HL sky textures are entirely different than quake + if (!loadmodel->brush.ishlbsp && !strncmp(tx->name, "sky", 3) && mtwidth == 256 && mtheight == 128) { - data = loadimagepixels(tx->name, false, 0, 0); - if (data) + if (loadmodel->isworldmodel) { - R_Q1BSP_LoadSplitSky(data, image_width, image_height, 4); - Mem_Free(data); + data = loadimagepixels(tx->name, false, 0, 0); + if (data) + { + R_Q1BSP_LoadSplitSky(data, image_width, image_height, 4); + Mem_Free(data); + } + else if (mtdata != NULL) + R_Q1BSP_LoadSplitSky(mtdata, mtwidth, mtheight, 1); } - else if (mtdata != NULL) - R_Q1BSP_LoadSplitSky(mtdata, mtwidth, mtheight, 1); } - } - else - { - if (!Mod_LoadSkinFrame(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, true)) + else { - // did not find external texture, load it from the bsp or wad3 - if (loadmodel->brush.ishlbsp) + if (!Mod_LoadSkinFrame(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, true)) { - // internal texture overrides wad - unsigned char *pixels, *freepixels, *fogpixels; - pixels = freepixels = NULL; - if (mtdata) - pixels = W_ConvertWAD3Texture(dmiptex); - if (pixels == NULL) - pixels = freepixels = W_GetTexture(tx->name); - if (pixels != NULL) + // did not find external texture, load it from the bsp or wad3 + if (loadmodel->brush.ishlbsp) { - tx->width = image_width; - tx->height = image_height; - tx->skin.base = tx->skin.merged = R_LoadTexture2D(loadmodel->texturepool, tx->name, image_width, image_height, pixels, TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, NULL); - if (Image_CheckAlpha(pixels, image_width * image_height, true)) + // internal texture overrides wad + unsigned char *pixels, *freepixels; + pixels = freepixels = NULL; + if (mtdata) + pixels = W_ConvertWAD3Texture(dmiptex); + if (pixels == NULL) + pixels = freepixels = W_GetTexture(tx->name); + if (pixels != NULL) { - fogpixels = (unsigned char *)Mem_Alloc(tempmempool, image_width * image_height * 4); - for (j = 0;j < image_width * image_height * 4;j += 4) - { - fogpixels[j + 0] = 255; - fogpixels[j + 1] = 255; - fogpixels[j + 2] = 255; - fogpixels[j + 3] = pixels[j + 3]; - } - tx->skin.fog = R_LoadTexture2D(loadmodel->texturepool, tx->name, image_width, image_height, pixels, TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, NULL); - Mem_Free(fogpixels); + tx->width = image_width; + tx->height = image_height; + Mod_LoadSkinFrame_Internal(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, false, pixels, image_width, image_height, 32, NULL, NULL); } + if (freepixels) + Mem_Free(freepixels); } - if (freepixels) - Mem_Free(freepixels); + else if (mtdata) // texture included + Mod_LoadSkinFrame_Internal(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_PRECACHE | TEXF_PICMIP, false, tx->name[0] != '*' && r_fullbrights.integer, mtdata, tx->width, tx->height, 8, NULL, NULL); } - else if (mtdata) // texture included - Mod_LoadSkinFrame_Internal(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_PRECACHE | TEXF_PICMIP, false, tx->name[0] != '*' && r_fullbrights.integer, mtdata, tx->width, tx->height); } - } - if (tx->skin.base == NULL) - { - // no texture found - tx->width = 16; - tx->height = 16; - tx->skin.base = r_texture_notexture; + if (tx->skin.base == NULL) + { + // no texture found + tx->width = 16; + tx->height = 16; + tx->skin.base = r_texture_notexture; + } } tx->basematerialflags = 0; @@ -1456,6 +1446,7 @@ static void Mod_Q1BSP_LoadLighting(lump_t *l) int i; unsigned char *in, *out, *data, d; char litfilename[1024]; + fs_offset_t filesize; loadmodel->brushq1.lightdata = NULL; if (loadmodel->brush.ishlbsp) // LordHavoc: load the colored lighting data straight { @@ -1474,17 +1465,17 @@ static void Mod_Q1BSP_LoadLighting(lump_t *l) strlcpy (litfilename, loadmodel->name, sizeof (litfilename)); FS_StripExtension (litfilename, litfilename, sizeof (litfilename)); strlcat (litfilename, ".lit", sizeof (litfilename)); - data = (unsigned char*) FS_LoadFile(litfilename, tempmempool, false); + data = (unsigned char*) FS_LoadFile(litfilename, tempmempool, false, &filesize); if (data) { - if (fs_filesize == (fs_offset_t)(8 + l->filelen * 3) && data[0] == 'Q' && data[1] == 'L' && data[2] == 'I' && data[3] == 'T') + if (filesize == (fs_offset_t)(8 + l->filelen * 3) && data[0] == 'Q' && data[1] == 'L' && data[2] == 'I' && data[3] == 'T') { i = LittleLong(((int *)data)[1]); if (i == 1) { Con_DPrintf("loaded %s\n", litfilename); - loadmodel->brushq1.lightdata = (unsigned char *)Mem_Alloc(loadmodel->mempool, fs_filesize - 8); - memcpy(loadmodel->brushq1.lightdata, data + 8, fs_filesize - 8); + loadmodel->brushq1.lightdata = (unsigned char *)Mem_Alloc(loadmodel->mempool, filesize - 8); + memcpy(loadmodel->brushq1.lightdata, data + 8, filesize - 8); Mem_Free(data); return; } @@ -1496,10 +1487,10 @@ static void Mod_Q1BSP_LoadLighting(lump_t *l) } else { - if (fs_filesize == 8) + 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", fs_filesize, 8 + l->filelen * 3); + Con_Printf("Corrupt .lit file (file size %i bytes, should be %i bytes), ignoring\n", filesize, 8 + l->filelen * 3); Mem_Free(data); } } @@ -1529,7 +1520,7 @@ static void Mod_Q1BSP_LoadLightList(void) strlcpy (lightsfilename, loadmodel->name, sizeof (lightsfilename)); FS_StripExtension (lightsfilename, lightsfilename, sizeof(lightsfilename)); strlcat (lightsfilename, ".lights", sizeof (lightsfilename)); - s = lightsstring = (char *) FS_LoadFile(lightsfilename, tempmempool, false); + s = lightsstring = (char *) FS_LoadFile(lightsfilename, tempmempool, false, NULL); if (s) { numlights = 0; @@ -1619,18 +1610,18 @@ static void Mod_Q1BSP_ParseWadsFromEntityLump(const char *data) key[strlen(key)-1] = 0; if (!COM_ParseToken(&data, false)) return; // error - strcpy(value, com_token); + dpsnprintf(value, sizeof(value), "%s", com_token); if (!strcmp("wad", key)) // for HalfLife maps { if (loadmodel->brush.ishlbsp) { j = 0; - for (i = 0;i < 4096;i++) + for (i = 0;i < (int)sizeof(value);i++) if (value[i] != ';' && value[i] != '\\' && value[i] != '/' && value[i] != ':') break; if (value[i]) { - for (;i < 4096;i++) + for (;i < (int)sizeof(value);i++) { // ignore path - the \\ check is for HalfLife... stupid windoze 'programmers'... if (value[i] == '\\' || value[i] == '/' || value[i] == ':') @@ -1767,6 +1758,12 @@ static void Mod_Q1BSP_LoadEdges(lump_t *l) { out->v[0] = (unsigned short)LittleShort(in->v[0]); out->v[1] = (unsigned short)LittleShort(in->v[1]); + if (out->v[0] >= loadmodel->brushq1.numvertexes || out->v[1] >= loadmodel->brushq1.numvertexes) + { + Host_Error("Mod_Q1BSP_LoadEdges: %s has invalid vertex indices in edge %i (vertices %i %i >= numvertices %i)\n", loadmodel->name, i, out->v[0], out->v[1], loadmodel->brushq1.numvertexes); + out->v[0] = 0; + out->v[1] = 0; + } } } @@ -1948,7 +1945,7 @@ static void Mod_Q1BSP_GenerateWarpMesh(msurface_t *surface) subdivpolyverts = 0; SubdividePolygon(surface->num_vertices, (surface->groupmesh->data_vertex3f + 3 * surface->num_firstvertex)); if (subdivpolytriangles < 1) - Host_Error("Mod_Q1BSP_GenerateWarpMesh: no triangles?\n"); + Host_Error("Mod_Q1BSP_GenerateWarpMesh: no triangles?"); surface->mesh = mesh = Mem_Alloc(loadmodel->mempool, sizeof(surfmesh_t) + subdivpolytriangles * sizeof(int[3]) + subdivpolyverts * sizeof(surfvertex_t)); mesh->num_vertices = subdivpolyverts; @@ -2011,16 +2008,16 @@ static void Mod_Q1BSP_LoadFaces(lump_t *l) firstedge = LittleLong(in->firstedge); numedges = LittleShort(in->numedges); if ((unsigned int) firstedge > (unsigned int) loadmodel->brushq1.numsurfedges || (unsigned int) numedges > (unsigned int) loadmodel->brushq1.numsurfedges || (unsigned int) firstedge + (unsigned int) numedges > (unsigned int) loadmodel->brushq1.numsurfedges) - Host_Error("Mod_Q1BSP_LoadFaces: invalid edge range (firstedge %i, numedges %i, model edges %i)\n", firstedge, numedges, loadmodel->brushq1.numsurfedges); + Host_Error("Mod_Q1BSP_LoadFaces: invalid edge range (firstedge %i, numedges %i, model edges %i)", firstedge, numedges, loadmodel->brushq1.numsurfedges); i = LittleShort(in->texinfo); if ((unsigned int) i >= (unsigned int) loadmodel->brushq1.numtexinfo) - Host_Error("Mod_Q1BSP_LoadFaces: invalid texinfo index %i(model has %i texinfos)\n", i, loadmodel->brushq1.numtexinfo); + Host_Error("Mod_Q1BSP_LoadFaces: invalid texinfo index %i(model has %i texinfos)", i, loadmodel->brushq1.numtexinfo); surface->lightmapinfo->texinfo = loadmodel->brushq1.texinfo + i; surface->texture = surface->lightmapinfo->texinfo->texture; planenum = LittleShort(in->planenum); if ((unsigned int) planenum >= (unsigned int) loadmodel->brush.num_planes) - Host_Error("Mod_Q1BSP_LoadFaces: invalid plane index %i (model has %i planes)\n", planenum, loadmodel->brush.num_planes); + Host_Error("Mod_Q1BSP_LoadFaces: invalid plane index %i (model has %i planes)", planenum, loadmodel->brush.num_planes); //surface->flags = surface->texture->flags; //if (LittleShort(in->side)) @@ -2155,7 +2152,7 @@ static void Mod_Q1BSP_LoadFaces(lump_t *l) static void Mod_Q1BSP_LoadNodes_RecursiveSetParent(mnode_t *node, mnode_t *parent) { //if (node->parent) - // Host_Error("Mod_Q1BSP_LoadNodes_RecursiveSetParent: runaway recursion\n"); + // Host_Error("Mod_Q1BSP_LoadNodes_RecursiveSetParent: runaway recursion"); node->parent = parent; if (node->plane) { @@ -2305,7 +2302,7 @@ static void Mod_Q1BSP_LoadClipnodes(lump_t *l, hullinfo_t *hullinfo) out->children[0] = LittleShort(in->children[0]); out->children[1] = LittleShort(in->children[1]); if (out->children[0] >= count || out->children[1] >= count) - Host_Error("Corrupt clipping hull(out of range child)\n"); + Host_Error("Corrupt clipping hull(out of range child)"); } } @@ -2405,7 +2402,7 @@ static void Mod_Q1BSP_LoadMapBrushes(void) char mapfilename[MAX_QPATH]; FS_StripExtension (loadmodel->name, mapfilename, sizeof (mapfilename)); strlcat (mapfilename, ".map", sizeof (mapfilename)); - maptext = (unsigned char*) FS_LoadFile(mapfilename, tempmempool, false); + maptext = (unsigned char*) FS_LoadFile(mapfilename, tempmempool, false, NULL); if (!maptext) return; text = maptext; @@ -3728,7 +3725,7 @@ void static Mod_Q2BSP_Load(model_t *mod, void *buffer, void *bufferend) int i; q2dheader_t *header; - Host_Error("Mod_Q2BSP_Load: not yet implemented\n"); + Host_Error("Mod_Q2BSP_Load: not yet implemented"); mod->type = mod_brushq2; @@ -3781,7 +3778,7 @@ static int Mod_Q3BSP_NativeContentsFromSuperContents(model_t *model, int superco static void Mod_Q3BSP_LoadEntities(lump_t *l) { const char *data; - char key[128], value[4096]; + char key[128], value[MAX_INPUTLINE]; float v[3]; loadmodel->brushq3.num_lightgrid_cellsize[0] = 64; loadmodel->brushq3.num_lightgrid_cellsize[1] = 64; @@ -3855,7 +3852,7 @@ static void Mod_Q3BSP_LoadTextures(lump_t *l) { for (i = 0;i < search->numfilenames;i++) { - if ((f = (char *)FS_LoadFile(search->filenames[i], tempmempool, false))) + if ((f = (char *)FS_LoadFile(search->filenames[i], tempmempool, false, NULL))) { text = f; while (COM_ParseToken(&text, false)) @@ -4105,9 +4102,9 @@ parseerror: //if (R_TextureHasAlpha(out->skin.base)) // out->surfaceparms |= Q3SURFACEPARM_TRANS; } - if (!Mod_LoadSkinFrame(&out->skin, out->name, (((out->textureflags & Q3TEXTUREFLAG_NOMIPMAPS) || (out->surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (out->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP), false, true)) - if (!Mod_LoadSkinFrame(&out->skin, out->firstpasstexturename, (((out->textureflags & Q3TEXTUREFLAG_NOMIPMAPS) || (out->surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (out->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP), false, true)) - if (cls.state != ca_dedicated) + if (cls.state != ca_dedicated) + if (!Mod_LoadSkinFrame(&out->skin, out->name, (((out->textureflags & Q3TEXTUREFLAG_NOMIPMAPS) || (out->surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (out->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP), false, true)) + if (!Mod_LoadSkinFrame(&out->skin, out->firstpasstexturename, (((out->textureflags & Q3TEXTUREFLAG_NOMIPMAPS) || (out->surfaceparms & Q3SURFACEPARM_NOMIPMAPS)) ? 0 : TEXF_MIPMAP) | TEXF_ALPHA | TEXF_PRECACHE | (out->textureflags & Q3TEXTUREFLAG_NOPICMIP ? 0 : TEXF_PICMIP), false, true)) Con_Printf("%s: texture loading for shader \"%s\" failed (first layer \"%s\" not found either)\n", loadmodel->name, out->name, out->firstpasstexturename); // no animation out->currentframe = out; @@ -4160,11 +4157,11 @@ static void Mod_Q3BSP_LoadBrushSides(lump_t *l) { n = LittleLong(in->planeindex); if (n < 0 || n >= loadmodel->brush.num_planes) - Host_Error("Mod_Q3BSP_LoadBrushSides: invalid planeindex %i (%i planes)\n", n, loadmodel->brush.num_planes); + Host_Error("Mod_Q3BSP_LoadBrushSides: invalid planeindex %i (%i planes)", n, loadmodel->brush.num_planes); out->plane = loadmodel->brush.data_planes + n; n = LittleLong(in->textureindex); if (n < 0 || n >= loadmodel->num_textures) - Host_Error("Mod_Q3BSP_LoadBrushSides: invalid textureindex %i (%i textures)\n", n, loadmodel->num_textures); + Host_Error("Mod_Q3BSP_LoadBrushSides: invalid textureindex %i (%i textures)", n, loadmodel->num_textures); out->texture = loadmodel->data_textures + n; } } @@ -4193,12 +4190,12 @@ static void Mod_Q3BSP_LoadBrushes(lump_t *l) n = LittleLong(in->firstbrushside); c = LittleLong(in->numbrushsides); if (n < 0 || n + c > loadmodel->brush.num_brushsides) - Host_Error("Mod_Q3BSP_LoadBrushes: invalid brushside range %i : %i (%i brushsides)\n", n, n + c, loadmodel->brush.num_brushsides); + Host_Error("Mod_Q3BSP_LoadBrushes: invalid brushside range %i : %i (%i brushsides)", n, n + c, loadmodel->brush.num_brushsides); out->firstbrushside = loadmodel->brush.data_brushsides + n; out->numbrushsides = c; n = LittleLong(in->textureindex); if (n < 0 || n >= loadmodel->num_textures) - Host_Error("Mod_Q3BSP_LoadBrushes: invalid textureindex %i (%i textures)\n", n, loadmodel->num_textures); + Host_Error("Mod_Q3BSP_LoadBrushes: invalid textureindex %i (%i textures)", n, loadmodel->num_textures); out->texture = loadmodel->data_textures + n; // make a list of mplane_t structs to construct a colbrush from @@ -4696,13 +4693,13 @@ static void Mod_Q3BSP_LoadModels(lump_t *l) n = LittleLong(in->firstface); c = LittleLong(in->numfaces); if (n < 0 || n + c > loadmodel->num_surfaces) - Host_Error("Mod_Q3BSP_LoadModels: invalid face range %i : %i (%i faces)\n", n, n + c, loadmodel->num_surfaces); + Host_Error("Mod_Q3BSP_LoadModels: invalid face range %i : %i (%i faces)", n, n + c, loadmodel->num_surfaces); out->firstface = n; out->numfaces = c; n = LittleLong(in->firstbrush); c = LittleLong(in->numbrushes); if (n < 0 || n + c > loadmodel->brush.num_brushes) - Host_Error("Mod_Q3BSP_LoadModels: invalid brush range %i : %i (%i brushes)\n", n, n + c, loadmodel->brush.num_brushes); + Host_Error("Mod_Q3BSP_LoadModels: invalid brush range %i : %i (%i brushes)", n, n + c, loadmodel->brush.num_brushes); out->firstbrush = n; out->numbrushes = c; } @@ -4727,7 +4724,7 @@ static void Mod_Q3BSP_LoadLeafBrushes(lump_t *l) { n = LittleLong(*in); if (n < 0 || n >= loadmodel->brush.num_brushes) - Host_Error("Mod_Q3BSP_LoadLeafBrushes: invalid brush index %i (%i brushes)\n", n, loadmodel->brush.num_brushes); + Host_Error("Mod_Q3BSP_LoadLeafBrushes: invalid brush index %i (%i brushes)", n, loadmodel->brush.num_brushes); *out = n; } } @@ -4751,7 +4748,7 @@ static void Mod_Q3BSP_LoadLeafFaces(lump_t *l) { n = LittleLong(*in); if (n < 0 || n >= loadmodel->num_surfaces) - Host_Error("Mod_Q3BSP_LoadLeafFaces: invalid face index %i (%i faces)\n", n, loadmodel->num_surfaces); + Host_Error("Mod_Q3BSP_LoadLeafFaces: invalid face index %i (%i faces)", n, loadmodel->num_surfaces); *out = n; } } @@ -4786,13 +4783,13 @@ static void Mod_Q3BSP_LoadLeafs(lump_t *l) n = LittleLong(in->firstleafface); c = LittleLong(in->numleaffaces); if (n < 0 || n + c > loadmodel->brush.num_leafsurfaces) - Host_Error("Mod_Q3BSP_LoadLeafs: invalid leafsurface range %i : %i (%i leafsurfaces)\n", n, n + c, loadmodel->brush.num_leafsurfaces); + Host_Error("Mod_Q3BSP_LoadLeafs: invalid leafsurface range %i : %i (%i leafsurfaces)", n, n + c, loadmodel->brush.num_leafsurfaces); out->firstleafsurface = loadmodel->brush.data_leafsurfaces + n; out->numleafsurfaces = c; n = LittleLong(in->firstleafbrush); c = LittleLong(in->numleafbrushes); if (n < 0 || n + c > loadmodel->brush.num_leafbrushes) - Host_Error("Mod_Q3BSP_LoadLeafs: invalid leafbrush range %i : %i (%i leafbrushes)\n", n, n + c, loadmodel->brush.num_leafbrushes); + Host_Error("Mod_Q3BSP_LoadLeafs: invalid leafbrush range %i : %i (%i leafbrushes)", n, n + c, loadmodel->brush.num_leafbrushes); out->firstleafbrush = loadmodel->brush.data_leafbrushes + n; out->numleafbrushes = c; } @@ -4818,7 +4815,7 @@ static void Mod_Q3BSP_LoadNodes(lump_t *l) out->parent = NULL; n = LittleLong(in->planeindex); if (n < 0 || n >= loadmodel->brush.num_planes) - Host_Error("Mod_Q3BSP_LoadNodes: invalid planeindex %i (%i planes)\n", n, loadmodel->brush.num_planes); + Host_Error("Mod_Q3BSP_LoadNodes: invalid planeindex %i (%i planes)", n, loadmodel->brush.num_planes); out->plane = loadmodel->brush.data_planes + n; for (j = 0;j < 2;j++) { @@ -4826,14 +4823,14 @@ static void Mod_Q3BSP_LoadNodes(lump_t *l) if (n >= 0) { if (n >= loadmodel->brush.num_nodes) - Host_Error("Mod_Q3BSP_LoadNodes: invalid child node index %i (%i nodes)\n", n, loadmodel->brush.num_nodes); + Host_Error("Mod_Q3BSP_LoadNodes: invalid child node index %i (%i nodes)", n, loadmodel->brush.num_nodes); out->children[j] = loadmodel->brush.data_nodes + n; } else { n = -1 - n; if (n >= loadmodel->brush.num_leafs) - Host_Error("Mod_Q3BSP_LoadNodes: invalid child leaf index %i (%i leafs)\n", n, loadmodel->brush.num_leafs); + Host_Error("Mod_Q3BSP_LoadNodes: invalid child leaf index %i (%i leafs)", n, loadmodel->brush.num_leafs); out->children[j] = (mnode_t *)(loadmodel->brush.data_leafs + n); } } @@ -4878,9 +4875,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)\n", 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, 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\n", count * sizeof(*in), l->filelen); + Con_Printf("Mod_Q3BSP_LoadLightGrid: Warning: calculated lightgrid size %i bytes does not match lump size %i", 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; @@ -4918,10 +4915,10 @@ static void Mod_Q3BSP_LoadPVS(lump_t *l) loadmodel->brush.num_pvsclusters = LittleLong(in->numclusters); loadmodel->brush.num_pvsclusterbytes = LittleLong(in->chainlength); if (loadmodel->brush.num_pvsclusterbytes < ((loadmodel->brush.num_pvsclusters + 7) / 8)) - Host_Error("Mod_Q3BSP_LoadPVS: (chainlength = %i) < ((numclusters = %i) + 7) / 8\n", loadmodel->brush.num_pvsclusterbytes, loadmodel->brush.num_pvsclusters); + 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)\n", 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, 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); @@ -5826,11 +5823,11 @@ void Mod_IBSP_Load(model_t *mod, void *buffer, void *bufferend) else if (i == Q2BSPVERSION) Mod_Q2BSP_Load(mod,buffer, bufferend); else - Host_Error("Mod_IBSP_Load: unknown/unsupported version %i\n", i); + Host_Error("Mod_IBSP_Load: unknown/unsupported version %i", i); } void Mod_MAP_Load(model_t *mod, void *buffer, void *bufferend) { - Host_Error("Mod_MAP_Load: not yet implemented\n"); + Host_Error("Mod_MAP_Load: not yet implemented"); }