diff --git a/bsputil/bsputil.c b/bsputil/bsputil.c index 69529cdc..73fa9fd4 100644 --- a/bsputil/bsputil.c +++ b/bsputil/bsputil.c @@ -288,7 +288,7 @@ main(int argc, char **argv) Error("couldn't open %s for writing\n", source); err = fwrite(bsp.dentdata, sizeof(char), bsp.entdatasize - 1, f); - if (err != entdatasize - 1) + if (err != bsp.entdatasize - 1) Error("%s", strerror(errno)); err = fclose(f); diff --git a/common/bspfile.c b/common/bspfile.c index 8c7d27d6..35e07cfa 100644 --- a/common/bspfile.c +++ b/common/bspfile.c @@ -23,152 +23,6 @@ /* ========================================================================= */ -int nummodels; -dmodel_t *dmodels; - -int visdatasize; -byte *dvisdata; - -int lightdatasize; -byte *dlightdata; - -int texdatasize; -dtexdata_t dtexdata; - -int entdatasize; -char *dentdata; - -int numleafs; -bsp29_dleaf_t *dleafs; - -int numplanes; -dplane_t *dplanes; - -int numvertexes; -dvertex_t *dvertexes; - -int numnodes; -bsp29_dnode_t *dnodes; - -int numtexinfo; -texinfo_t *texinfo; - -int numfaces; -bsp29_dface_t *dfaces; - -int numclipnodes; -bsp29_dclipnode_t *dclipnodes; - -int numedges; -bsp29_dedge_t *dedges; - -int nummarksurfaces; -uint16_t *dmarksurfaces; - -int numsurfedges; -int32_t *dsurfedges; - -/* Transitional helper functions */ -void -GetBSPGlobals(bspdata_t *bspdata) -{ - bspdata->nummodels = nummodels; - bspdata->dmodels = dmodels; - - bspdata->visdatasize = visdatasize; - bspdata->dvisdata = dvisdata; - - bspdata->lightdatasize = lightdatasize; - bspdata->dlightdata = dlightdata; - - bspdata->texdatasize = texdatasize; - bspdata->dtexdata = dtexdata; - - bspdata->entdatasize = entdatasize; - bspdata->dentdata = dentdata; - - bspdata->numleafs = numleafs; - bspdata->dleafs = dleafs; - - bspdata->numplanes = numplanes; - bspdata->dplanes = dplanes; - - bspdata->numvertexes = numvertexes; - bspdata->dvertexes = dvertexes; - - bspdata->numnodes = numnodes; - bspdata->dnodes = dnodes; - - bspdata->numtexinfo = numtexinfo; - bspdata->texinfo = texinfo; - - bspdata->numfaces = numfaces; - bspdata->dfaces = dfaces; - - bspdata->numclipnodes = numclipnodes; - bspdata->dclipnodes = dclipnodes; - - bspdata->numedges = numedges; - bspdata->dedges = dedges; - - bspdata->nummarksurfaces = nummarksurfaces; - bspdata->dmarksurfaces = dmarksurfaces; - - bspdata->numsurfedges = numsurfedges; - bspdata->dsurfedges = dsurfedges; -} - -void -SetBSPGlobals(const bspdata_t *bspdata) -{ - nummodels = bspdata->nummodels; - dmodels = bspdata->dmodels; - - visdatasize = bspdata->visdatasize; - dvisdata = bspdata->dvisdata; - - lightdatasize = bspdata->lightdatasize; - dlightdata = bspdata->dlightdata; - - texdatasize = bspdata->texdatasize; - dtexdata = bspdata->dtexdata; - - entdatasize = bspdata->entdatasize; - dentdata = bspdata->dentdata; - - numleafs = bspdata->numleafs; - dleafs = bspdata->dleafs; - - numplanes = bspdata->numplanes; - dplanes = bspdata->dplanes; - - numvertexes = bspdata->numvertexes; - dvertexes = bspdata->dvertexes; - - numnodes = bspdata->numnodes; - dnodes = bspdata->dnodes; - - numtexinfo = bspdata->numtexinfo; - texinfo = bspdata->texinfo; - - numfaces = bspdata->numfaces; - dfaces = bspdata->dfaces; - - numclipnodes = bspdata->numclipnodes; - dclipnodes = bspdata->dclipnodes; - - numedges = bspdata->numedges; - dedges = bspdata->dedges; - - nummarksurfaces = bspdata->nummarksurfaces; - dmarksurfaces = bspdata->dmarksurfaces; - - numsurfedges = bspdata->numsurfedges; - dsurfedges = bspdata->dsurfedges; -} - -/* ========================================================================= */ - typedef enum { TO_DISK, TO_CPU } swaptype_t; /* diff --git a/include/common/bspfile.h b/include/common/bspfile.h index cbeb66e2..7fc93b6d 100644 --- a/include/common/bspfile.h +++ b/include/common/bspfile.h @@ -246,59 +246,13 @@ typedef struct { uint8_t ambient_level[NUM_AMBIENTS]; } bsp2_dleaf_t; -/* ========================================================================= */ - -extern int nummodels; -extern dmodel_t *dmodels; - -extern int visdatasize; -extern byte *dvisdata; - -extern int lightdatasize; -extern byte *dlightdata; - typedef union { byte *base; dmiptexlump_t *header; } dtexdata_t; -extern int texdatasize; -extern dtexdata_t dtexdata; +/* ========================================================================= */ -extern int entdatasize; -extern char *dentdata; - -extern int numleafs; -extern bsp29_dleaf_t *dleafs; - -extern int numplanes; -extern dplane_t *dplanes; - -extern int numvertexes; -extern dvertex_t *dvertexes; - -extern int numnodes; -extern bsp29_dnode_t *dnodes; - -extern int numtexinfo; -extern texinfo_t *texinfo; - -extern int numfaces; -extern bsp29_dface_t *dfaces; - -extern int numclipnodes; -extern bsp29_dclipnode_t *dclipnodes; - -extern int numedges; -extern bsp29_dedge_t *dedges; - -extern int nummarksurfaces; -extern unsigned short *dmarksurfaces; - -extern int numsurfedges; -extern int *dsurfedges; - -/* TODO - Transition utils over to using an instanced struct for bsp data */ typedef struct { int nummodels; dmodel_t *dmodels; @@ -346,10 +300,6 @@ typedef struct { int32_t *dsurfedges; } bspdata_t; -/* Transitional helper functions */ -void GetBSPGlobals(bspdata_t *bspdata); -void SetBSPGlobals(const bspdata_t *bspdata); - /* LoadBSPFile returns the BSP version... */ int LoadBSPFile(const char *filename, bspdata_t *bsp); void WriteBSPFile(const char *filename, bspdata_t *bsp, int version); diff --git a/include/light/entities.h b/include/light/entities.h index c03e29dd..aa781e95 100644 --- a/include/light/entities.h +++ b/include/light/entities.h @@ -96,7 +96,7 @@ entity_t *FindEntityWithKeyPair(const char *key, const char *value); const char *ValueForKey(const entity_t *ent, const char *key); void GetVectorForKey(const entity_t *ent, const char *key, vec3_t vec); -void LoadEntities(void); -void WriteEntitiesToString(void); +void LoadEntities(const bspdata_t *bsp); +void WriteEntitiesToString(bspdata_t *bsp); #endif /* __LIGHT_ENTITIES_H__ */ diff --git a/include/light/light.h b/include/light/light.h index d1a2270b..2e4e5c2b 100644 --- a/include/light/light.h +++ b/include/light/light.h @@ -87,8 +87,9 @@ typedef struct { /* tracelist is a null terminated array of BSP models to use for LOS tests */ extern const dmodel_t *const *tracelist; -void LightFace(bsp29_dface_t *face, const modelinfo_t *modelinfo); -void MakeTnodes(void); +void LightFace(bsp29_dface_t *face, const modelinfo_t *modelinfo, + const bspdata_t *bsp); +void MakeTnodes(const bspdata_t *bsp); extern float scaledist; extern float rangescale; diff --git a/include/vis/vis.h b/include/vis/vis.h index 05f8e962..1965d2d1 100644 --- a/include/vis/vis.h +++ b/include/vis/vis.h @@ -136,12 +136,11 @@ extern char portalfile[1024]; extern char statefile[1024]; extern char statetmpfile[1024]; -void LeafFlow(int leafnum); void BasePortalVis(void); void PortalFlow(portal_t *p); -void CalcAmbientSounds(void); +void CalcAmbientSounds(bspdata_t *bsp); extern double starttime, endtime, statetime; diff --git a/light/entities.c b/light/entities.c index 64257519..68f7ea04 100644 --- a/light/entities.c +++ b/light/entities.c @@ -282,7 +282,7 @@ CountEntities(const char *entitystring) * ================== */ void -LoadEntities(void) +LoadEntities(const bspdata_t *bsp) { char *data; entity_t *entity; @@ -292,7 +292,7 @@ LoadEntities(void) int memsize, num_lights; /* Count the entities and allocate memory */ - max_entities = CountEntities(dentdata); + max_entities = CountEntities(bsp->dentdata); memsize = max_entities * sizeof(*entities); entities = malloc(memsize); if (!entities) @@ -302,7 +302,7 @@ LoadEntities(void) /* start parsing */ num_entities = 0; num_lights = 0; - data = dentdata; + data = bsp->dentdata; /* go through all the entities */ while (1) { @@ -508,7 +508,7 @@ Get_EntityStringSize(const entity_t *entities, int num_entities) * ================ */ void -WriteEntitiesToString(void) +WriteEntitiesToString(bspdata_t *bsp) { const entity_t *entity; const epair_t *epair; @@ -516,19 +516,20 @@ WriteEntitiesToString(void) char *pos; int i; - if (dentdata) - free(dentdata); + if (bsp->dentdata) + free(bsp->dentdata); /* FIXME - why are we printing this here? */ logprint("%i switchable light styles\n", numlighttargets); - entdatasize = Get_EntityStringSize(entities, num_entities); - dentdata = malloc(entdatasize); - if (!dentdata) - Error("%s: allocation of %d bytes failed\n", __func__, entdatasize); + bsp->entdatasize = Get_EntityStringSize(entities, num_entities); + bsp->dentdata = malloc(bsp->entdatasize); + if (!bsp->dentdata) + Error("%s: allocation of %d bytes failed\n", __func__, + bsp->entdatasize); - space = entdatasize; - pos = dentdata; + space = bsp->entdatasize; + pos = bsp->dentdata; for (i = 0, entity = entities; i < num_entities; i++, entity++) { if (!entity->epairs) continue; diff --git a/light/light.c b/light/light.c index ddae06e4..52946673 100644 --- a/light/light.c +++ b/light/light.c @@ -77,10 +77,11 @@ GetFileSpace(byte **lightdata, byte **colordata, int size) } static void * -LightThread(void *junk) +LightThread(void *arg) { int facenum, i; dmodel_t *model; + const bspdata_t *bsp = arg; while (1) { facenum = GetThreadWork(); @@ -88,25 +89,25 @@ LightThread(void *junk) break; /* Find the correct model offset */ - for (i = 0, model = dmodels; i < nummodels; i++, model++) { + for (i = 0, model = bsp->dmodels; i < bsp->nummodels; i++, model++) { if (facenum < model->firstface) continue; if (facenum < model->firstface + model->numfaces) break; } - if (i == nummodels) { + if (i == bsp->nummodels) { logprint("warning: no model has face %d\n", facenum); continue; } - LightFace(dfaces + facenum, &modelinfo[i]); + LightFace(bsp->dfaces + facenum, &modelinfo[i], bsp); } return NULL; } static void -FindModelInfo(void) +FindModelInfo(const bspdata_t *bsp) { int i, shadow, numshadowmodels; entity_t *entity; @@ -115,18 +116,18 @@ FindModelInfo(void) const dmodel_t **shadowmodels; modelinfo_t *info; - shadowmodels = malloc(sizeof(dmodel_t *) * (nummodels + 1)); - memset(shadowmodels, 0, sizeof(dmodel_t *) * (nummodels + 1)); + shadowmodels = malloc(sizeof(dmodel_t *) * (bsp->nummodels + 1)); + memset(shadowmodels, 0, sizeof(dmodel_t *) * (bsp->nummodels + 1)); /* The world always casts shadows */ - shadowmodels[0] = &dmodels[0]; + shadowmodels[0] = &bsp->dmodels[0]; numshadowmodels = 1; - memset(modelinfo, 0, sizeof(*modelinfo) * nummodels); - modelinfo[0].model = &dmodels[0]; + memset(modelinfo, 0, sizeof(*modelinfo) * bsp->nummodels); + modelinfo[0].model = &bsp->dmodels[0]; - for (i = 1, info = modelinfo + 1; i < nummodels; i++, info++) { - info->model = &dmodels[i]; + for (i = 1, info = modelinfo + 1; i < bsp->nummodels; i++, info++) { + info->model = &bsp->dmodels[i]; /* Find the entity for the model */ snprintf(modelname, sizeof(modelname), "*%d", i); @@ -138,7 +139,7 @@ FindModelInfo(void) /* Check if this model will cast shadows (shadow => shadowself) */ shadow = atoi(ValueForKey(entity, "_shadow")); if (shadow) { - shadowmodels[numshadowmodels++] = &dmodels[i]; + shadowmodels[numshadowmodels++] = &bsp->dmodels[i]; } else { shadow = atoi(ValueForKey(entity, "_shadowself")); if (shadow) @@ -172,33 +173,34 @@ FindModelInfo(void) * ============= */ static void -LightWorld(void) +LightWorld(bspdata_t *bsp) { - if (dlightdata) - free(dlightdata); + if (bsp->dlightdata) + free(bsp->dlightdata); /* FIXME - remove this limit */ - lightdatasize = MAX_MAP_LIGHTING; - dlightdata = malloc(lightdatasize + 16); /* for alignment */ - if (!dlightdata) - Error("%s: allocation of %i bytes failed.", __func__, lightdatasize); - memset(dlightdata, 0, lightdatasize + 16); - lightdatasize /= 4; + bsp->lightdatasize = MAX_MAP_LIGHTING; + bsp->dlightdata = malloc(bsp->lightdatasize + 16); /* for alignment */ + if (!bsp->dlightdata) + Error("%s: allocation of %i bytes failed.", + __func__, bsp->lightdatasize); + memset(bsp->dlightdata, 0, bsp->lightdatasize + 16); + bsp->lightdatasize /= 4; /* align filebase to a 4 byte boundary */ - filebase = file_p = (byte *)(((uintptr_t)dlightdata + 3) & ~3); - file_end = filebase + lightdatasize; + filebase = file_p = (byte *)(((uintptr_t)bsp->dlightdata + 3) & ~3); + file_end = filebase + bsp->lightdatasize; /* litfile data stored in dlightdata, after the white light */ lit_filebase = file_end + 12 - ((uintptr_t)file_end % 12); lit_file_p = lit_filebase; lit_file_end = lit_filebase + 3 * (MAX_MAP_LIGHTING / 4); - RunThreadsOn(0, numfaces, LightThread, NULL); + RunThreadsOn(0, bsp->numfaces, LightThread, bsp); logprint("Lighting Completed.\n\n"); - lightdatasize = file_p - filebase; - logprint("lightdatasize: %i\n", lightdatasize); + bsp->lightdatasize = file_p - filebase; + logprint("lightdatasize: %i\n", bsp->lightdatasize); } @@ -291,22 +293,19 @@ main(int argc, const char **argv) StripExtension(source); DefaultExtension(source, ".bsp"); bsp_version = LoadBSPFile(source, &bsp); - SetBSPGlobals(&bsp); /* FIXME */ - LoadEntities(); - MakeTnodes(); - modelinfo = malloc(nummodels * sizeof(*modelinfo)); - FindModelInfo(); - LightWorld(); + LoadEntities(&bsp); + MakeTnodes(&bsp); + modelinfo = malloc(bsp.nummodels * sizeof(*modelinfo)); + FindModelInfo(&bsp); + LightWorld(&bsp); free(modelinfo); - WriteEntitiesToString(); + WriteEntitiesToString(&bsp); if (write_litfile) WriteLitFile(&bsp, source, LIT_VERSION); - /* Still need to update from globals */ - GetBSPGlobals(&bsp); WriteBSPFile(source, &bsp, bsp_version); end = I_FloatTime(); diff --git a/light/ltface.c b/light/ltface.c index fb1c6aba..770e9883 100644 --- a/light/ltface.c +++ b/light/ltface.c @@ -194,26 +194,26 @@ TriArea(const dvertex_t *v0, const dvertex_t *v1, const dvertex_t *v2) } static vec_t -FaceArea(const bsp29_dface_t *f) +FaceArea(const bsp29_dface_t *face, const bspdata_t *bsp) { - int i, e; + int i, edgenum; dvertex_t *v0, *v1, *v2; vec_t poly_area = 0; - e = dsurfedges[f->firstedge]; - if (e >= 0) - v0 = dvertexes + dedges[e].v[0]; + edgenum = bsp->dsurfedges[face->firstedge]; + if (edgenum >= 0) + v0 = bsp->dvertexes + bsp->dedges[edgenum].v[0]; else - v0 = dvertexes + dedges[-e].v[1]; + v0 = bsp->dvertexes + bsp->dedges[-edgenum].v[1]; - for (i = 1; i < f->numedges - 1; i++) { - e = dsurfedges[f->firstedge + i]; - if (e >= 0) { - v1 = dvertexes + dedges[e].v[0]; - v2 = dvertexes + dedges[e].v[1]; + for (i = 1; i < face->numedges - 1; i++) { + edgenum = bsp->dsurfedges[face->firstedge + i]; + if (edgenum >= 0) { + v1 = bsp->dvertexes + bsp->dedges[edgenum].v[0]; + v2 = bsp->dvertexes + bsp->dedges[edgenum].v[1]; } else { - v1 = dvertexes + dedges[-e].v[1]; - v2 = dvertexes + dedges[-e].v[0]; + v1 = bsp->dvertexes + bsp->dedges[-edgenum].v[1]; + v2 = bsp->dvertexes + bsp->dedges[-edgenum].v[0]; } poly_area += TriArea(v0, v1, v2); } @@ -222,9 +222,9 @@ FaceArea(const bsp29_dface_t *f) } static void -FaceCentroid(const bsp29_dface_t *f, vec3_t out) +FaceCentroid(const bsp29_dface_t *face, const bspdata_t *bsp, vec3_t out) { - int i, e; + int i, edgenum; dvertex_t *v0, *v1, *v2; vec3_t centroid, poly_centroid; vec_t area, poly_area; @@ -232,20 +232,20 @@ FaceCentroid(const bsp29_dface_t *f, vec3_t out) VectorCopy(vec3_origin, poly_centroid); poly_area = 0; - e = dsurfedges[f->firstedge]; - if (e >= 0) - v0 = dvertexes + dedges[e].v[0]; + edgenum = bsp->dsurfedges[face->firstedge]; + if (edgenum >= 0) + v0 = bsp->dvertexes + bsp->dedges[edgenum].v[0]; else - v0 = dvertexes + dedges[-e].v[1]; + v0 = bsp->dvertexes + bsp->dedges[-edgenum].v[1]; - for (i = 1; i < f->numedges - 1; i++) { - e = dsurfedges[f->firstedge + i]; - if (e >= 0) { - v1 = dvertexes + dedges[e].v[0]; - v2 = dvertexes + dedges[e].v[1]; + for (i = 1; i < face->numedges - 1; i++) { + edgenum = bsp->dsurfedges[face->firstedge + i]; + if (edgenum >= 0) { + v1 = bsp->dvertexes + bsp->dedges[edgenum].v[0]; + v2 = bsp->dvertexes + bsp->dedges[edgenum].v[1]; } else { - v1 = dvertexes + dedges[-e].v[1]; - v2 = dvertexes + dedges[-e].v[0]; + v1 = bsp->dvertexes + bsp->dedges[-edgenum].v[1]; + v2 = bsp->dvertexes + bsp->dedges[-edgenum].v[0]; } area = TriArea(v0, v1, v2); @@ -265,15 +265,16 @@ FaceCentroid(const bsp29_dface_t *f, vec3_t out) * ================ */ static void -CreateFaceTransform(const bsp29_dface_t *face, pmatrix3_t *transform) +CreateFaceTransform(const bsp29_dface_t *face, const bspdata_t *bsp, + pmatrix3_t *transform) { const dplane_t *plane; const texinfo_t *tex; int i; /* Prepare the transform matrix and init row/column permutations */ - plane = &dplanes[face->planenum]; - tex = &texinfo[face->texinfo]; + plane = &bsp->dplanes[face->planenum]; + tex = &bsp->texinfo[face->texinfo]; for (i = 0; i < 3; i++) { transform->data[0][i] = tex->vecs[0][i]; transform->data[1][i] = tex->vecs[1][i]; @@ -285,10 +286,10 @@ CreateFaceTransform(const bsp29_dface_t *face, pmatrix3_t *transform) /* Decompose the matrix. If we can't, texture axes are invalid. */ if (!PMatrix3_LU_Decompose(transform)) { - const vec_t *p = dvertexes[dedges[face->firstedge].v[0]].point; + const vec_t *p = bsp->dvertexes[bsp->dedges[face->firstedge].v[0]].point; Error("Bad texture axes on face:\n" " face point at (%s)\n" - " face area = %5.3f\n", VecStr(p), FaceArea(face)); + " face area = %5.3f\n", VecStr(p), FaceArea(face, bsp)); } } @@ -319,24 +320,24 @@ WorldToTexCoord(const vec3_t world, const texinfo_t *tex, vec_t coord[2]) #if 0 /* Debug helper - move elsewhere? */ static void -PrintFaceInfo(const bsp29_dface_t *face) +PrintFaceInfo(const bsp29_dface_t *face, const bspdata_t *bsp) { - const texinfo_t *tex = &texinfo[face->texinfo]; - const int offset = dtexdata.header->dataofs[tex->miptex]; - const miptex_t *miptex = (const miptex_t *)(dtexdata.base + offset); + const texinfo_t *tex = &bsp->texinfo[face->texinfo]; + const int offset = bsp->dtexdata.header->dataofs[tex->miptex]; + const miptex_t *miptex = (const miptex_t *)(bsp->dtexdata.base + offset); int i; logprint("face %d, texture %s, %d edges...\n" " vectors (%3.3f, %3.3f, %3.3f) (%3.3f)\n" " (%3.3f, %3.3f, %3.3f) (%3.3f)\n", - (int)(face - dfaces), miptex->name, face->numedges, + (int)(face - bsp->dfaces), miptex->name, face->numedges, tex->vecs[0][0], tex->vecs[0][1], tex->vecs[0][2], tex->vecs[0][3], tex->vecs[1][0], tex->vecs[1][1], tex->vecs[1][2], tex->vecs[1][3]); for (i = 0; i < face->numedges; i++) { - int edge = dsurfedges[face->firstedge + i]; - int vert = (edge >= 0) ? dedges[edge].v[0] : dedges[-edge].v[1]; - const float *point = dvertexes[vert].point; + int edge = bsp->dsurfedges[face->firstedge + i]; + int vert = (edge >= 0) ? bsp->dedges[edge].v[0] : bsp->dedges[-edge].v[1]; + const float *point = bsp->dvertexes[vert].point; logprint("%s %3d (%3.3f, %3.3f, %3.3f) :: edge %d\n", i ? " " : " verts ", vert, @@ -353,7 +354,8 @@ PrintFaceInfo(const bsp29_dface_t *face) */ __attribute__((noinline)) static void -CalcFaceExtents(const bsp29_dface_t *face, const vec3_t offset, lightsurf_t *surf) +CalcFaceExtents(const bsp29_dface_t *face, const vec3_t offset, + const bspdata_t *bsp, lightsurf_t *surf) { vec_t mins[2], maxs[2], texcoord[2]; vec3_t worldpoint; @@ -363,12 +365,12 @@ CalcFaceExtents(const bsp29_dface_t *face, const vec3_t offset, lightsurf_t *sur mins[0] = mins[1] = VECT_MAX; maxs[0] = maxs[1] = -VECT_MAX; - tex = &texinfo[face->texinfo]; + tex = &bsp->texinfo[face->texinfo]; for (i = 0; i < face->numedges; i++) { - edge = dsurfedges[face->firstedge + i]; - vert = (edge >= 0) ? dedges[edge].v[0] : dedges[-edge].v[1]; - dvertex = &dvertexes[vert]; + edge = bsp->dsurfedges[face->firstedge + i]; + vert = (edge >= 0) ? bsp->dedges[edge].v[0] : bsp->dedges[-edge].v[1]; + dvertex = &bsp->dvertexes[vert]; VectorAdd(dvertex->point, offset, worldpoint); WorldToTexCoord(worldpoint, tex, texcoord); @@ -380,7 +382,7 @@ CalcFaceExtents(const bsp29_dface_t *face, const vec3_t offset, lightsurf_t *sur } } - FaceCentroid(face, worldpoint); + FaceCentroid(face, bsp, worldpoint); VectorAdd(worldpoint, offset, worldpoint); WorldToTexCoord(worldpoint, tex, surf->exactmid); @@ -390,14 +392,14 @@ CalcFaceExtents(const bsp29_dface_t *face, const vec3_t offset, lightsurf_t *sur surf->texmins[i] = mins[i]; surf->texsize[i] = maxs[i] - mins[i]; if (surf->texsize[i] > 17) { - const dplane_t *plane = dplanes + face->planenum; - const int offset = dtexdata.header->dataofs[tex->miptex]; - const miptex_t *miptex = (const miptex_t *)(dtexdata.base + offset); + const dplane_t *plane = bsp->dplanes + face->planenum; + const int offset = bsp->dtexdata.header->dataofs[tex->miptex]; + const miptex_t *miptex = (const miptex_t *)(bsp->dtexdata.base + offset); Error("Bad surface extents:\n" " surface %d, %s extents = %d\n" " texture %s at (%s)\n" " surface normal (%s)\n", - (int)(face - dfaces), i ? "t" : "s", surf->texsize[i], + (int)(face - bsp->dfaces), i ? "t" : "s", surf->texsize[i], miptex->name, VecStr(worldpoint), VecStrf(plane->normal)); } } @@ -491,7 +493,7 @@ CalcPoints(const dmodel_t *model, const texorg_t *texorg, lightsurf_t *surf) __attribute__((noinline)) static void Lightsurf_Init(const modelinfo_t *modelinfo, const bsp29_dface_t *face, - lightsurf_t *lightsurf) + const bspdata_t *bsp, lightsurf_t *lightsurf) { plane_t *plane; vec3_t planepoint; @@ -502,8 +504,8 @@ Lightsurf_Init(const modelinfo_t *modelinfo, const bsp29_dface_t *face, /* Set up the plane, including model offset */ plane = &lightsurf->plane; - VectorCopy(dplanes[face->planenum].normal, plane->normal); - plane->dist = dplanes[face->planenum].dist; + VectorCopy(bsp->dplanes[face->planenum].normal, plane->normal); + plane->dist = bsp->dplanes[face->planenum].dist; VectorScale(plane->normal, plane->dist, planepoint); VectorAdd(planepoint, modelinfo->offset, planepoint); plane->dist = DotProduct(plane->normal, planepoint); @@ -513,12 +515,12 @@ Lightsurf_Init(const modelinfo_t *modelinfo, const bsp29_dface_t *face, } /* Set up the texorg for coordinate transformation */ - CreateFaceTransform(face, &texorg.transform); - texorg.texinfo = &texinfo[face->texinfo]; + CreateFaceTransform(face, bsp, &texorg.transform); + texorg.texinfo = &bsp->texinfo[face->texinfo]; texorg.planedist = plane->dist; /* Set up the surface points */ - CalcFaceExtents(face, modelinfo->offset, lightsurf); + CalcFaceExtents(face, modelinfo->offset, bsp, lightsurf); CalcPoints(modelinfo->model, &texorg, lightsurf); } @@ -953,7 +955,8 @@ WriteLightmaps(bsp29_dface_t *face, const lightsurf_t *lightsurf, * ============ */ void -LightFace(bsp29_dface_t *face, const modelinfo_t *modelinfo) +LightFace(bsp29_dface_t *face, const modelinfo_t *modelinfo, + const bspdata_t *bsp) { int i, j, k; const entity_t *entity; @@ -967,10 +970,10 @@ LightFace(bsp29_dface_t *face, const modelinfo_t *modelinfo) face->lightofs = -1; for (i = 0; i < MAXLIGHTMAPS; i++) face->styles[i] = 255; - if (texinfo[face->texinfo].flags & TEX_SPECIAL) + if (bsp->texinfo[face->texinfo].flags & TEX_SPECIAL) return; - Lightsurf_Init(modelinfo, face, &lightsurf); + Lightsurf_Init(modelinfo, face, bsp, &lightsurf); Lightmaps_Init(lightmaps, MAXLIGHTMAPS + 1); /* diff --git a/light/trace.c b/light/trace.c index 367664c6..d67fdc81 100644 --- a/light/trace.c +++ b/light/trace.c @@ -20,11 +20,11 @@ #include typedef struct tnode_s { - int type; vec3_t normal; vec_t dist; + int type; int children[2]; - int pad; + const dplane_t *plane; } tnode_t; static tnode_t *tnodes; @@ -37,40 +37,39 @@ static tnode_t *tnode_p; * ============== */ static void -MakeTnodes_r(int nodenum) +MakeTnodes_r(int nodenum, const bspdata_t *bsp) { - tnode_t *t; - dplane_t *plane; + tnode_t *tnode; int i; bsp29_dnode_t *node; - t = tnode_p++; + tnode = tnode_p++; - node = dnodes + nodenum; - plane = dplanes + node->planenum; + node = bsp->dnodes + nodenum; + tnode->plane = bsp->dplanes + node->planenum; - t->type = plane->type; - VectorCopy(plane->normal, t->normal); - t->dist = plane->dist; + tnode->type = tnode->plane->type; + VectorCopy(tnode->plane->normal, tnode->normal); + tnode->dist = tnode->plane->dist; for (i = 0; i < 2; i++) { if (node->children[i] < 0) { - t->children[i] = dleafs[-node->children[i] - 1].contents; + tnode->children[i] = bsp->dleafs[-node->children[i] - 1].contents; } else { - t->children[i] = tnode_p - tnodes; - MakeTnodes_r(node->children[i]); + tnode->children[i] = tnode_p - tnodes; + MakeTnodes_r(node->children[i], bsp); } } } void -MakeTnodes(void) +MakeTnodes(const bspdata_t *bsp) { int i; - tnode_p = tnodes = malloc(numnodes * sizeof(tnode_t)); - for (i = 0; i < nummodels; i++) - MakeTnodes_r(dmodels[i].headnode[0]); + tnode_p = tnodes = malloc(bsp->numnodes * sizeof(tnode_t)); + for (i = 0; i < bsp->nummodels; i++) + MakeTnodes_r(bsp->dmodels[i].headnode[0], bsp); } /* @@ -86,11 +85,12 @@ typedef struct { vec3_t front; int node; int side; + const dplane_t *plane; } tracestack_t; /* * ============== - * TestLineOrSky + * TraceLine * ============== */ #define MAX_TSTACK 128 @@ -149,8 +149,7 @@ TraceLine(const dmodel_t *model, const int traceflags, if (!crossnode) return -tracehit; if (hitpoint) { - const int planenum = dnodes[crossnode->node].planenum; - hitpoint->dplane = dplanes + planenum; + hitpoint->dplane = crossnode->plane; hitpoint->side = crossnode->side; VectorCopy(crossnode->back, hitpoint->point); } @@ -204,6 +203,7 @@ TraceLine(const dmodel_t *model, const int traceflags, Error("%s: tstack overflow\n", __func__); tstack->node = node; tstack->side = 0; + tstack->plane = tnode->plane; VectorCopy(front, tstack->front); VectorCopy(back, tstack->back); crossnode = tstack++; @@ -224,6 +224,7 @@ TraceLine(const dmodel_t *model, const int traceflags, side = frontdist < 0; tstack->node = node; tstack->side = side; + tstack->plane = tnode->plane; VectorCopy(front, tstack->front); VectorCopy(back, tstack->back); crossnode = tstack; @@ -239,6 +240,7 @@ TraceLine(const dmodel_t *model, const int traceflags, side = frontdist < 0; tstack->node = node; tstack->side = side; + tstack->plane = tnode->plane; VectorCopy(back, tstack->back); VectorSubtract(back, front, back); VectorMA(front, frontdist / (frontdist - backdist), back, back); diff --git a/vis/soundpvs.c b/vis/soundpvs.c index f1d1b215..00ebc79b 100644 --- a/vis/soundpvs.c +++ b/vis/soundpvs.c @@ -17,6 +17,7 @@ See file, 'COPYING', for details. */ +#include #include @@ -34,29 +35,30 @@ Find an aproximate distance to the nearest emiter of each class for each leaf. ==================== */ static void -SurfaceBBox(const bsp29_dface_t *s, vec3_t mins, vec3_t maxs) +SurfaceBBox(const bspdata_t *bsp, const bsp29_dface_t *surf, + vec3_t mins, vec3_t maxs) { int i, j; - int e; - int vi; - const float *v; + int edgenum; + int vertnum; + const float *vert; - mins[0] = mins[1] = 999999; - maxs[0] = maxs[1] = -99999; + mins[0] = mins[1] = FLT_MAX; + maxs[0] = maxs[1] = -FLT_MAX; - for (i = 0; i < s->numedges; i++) { - e = dsurfedges[s->firstedge + i]; - if (e >= 0) - vi = dedges[e].v[0]; + for (i = 0; i < surf->numedges; i++) { + edgenum = bsp->dsurfedges[surf->firstedge + i]; + if (edgenum >= 0) + vertnum = bsp->dedges[edgenum].v[0]; else - vi = dedges[-e].v[1]; - v = dvertexes[vi].point; + vertnum = bsp->dedges[-edgenum].v[1]; + vert = bsp->dvertexes[vertnum].point; for (j = 0; j < 3; j++) { - if (v[j] < mins[j]) - mins[j] = v[j]; - if (v[j] > maxs[j]) - maxs[j] = v[j]; + if (vert[j] < mins[j]) + mins[j] = vert[j]; + if (vert[j] > maxs[j]) + maxs[j] = vert[j]; } } } @@ -68,7 +70,7 @@ SurfaceBBox(const bsp29_dface_t *s, vec3_t mins, vec3_t maxs) ==================== */ void -CalcAmbientSounds(void) +CalcAmbientSounds(bspdata_t *bsp) { const bsp29_dface_t *surf; const texinfo_t *info; @@ -84,7 +86,7 @@ CalcAmbientSounds(void) float vol; for (i = 0; i < portalleafs_real; i++) { - leaf = &dleafs[i + 1]; + leaf = &bsp->dleafs[i + 1]; // // clear ambients @@ -101,13 +103,13 @@ CalcAmbientSounds(void) // // check this leaf for sound textures // - hit = &dleafs[j + 1]; + hit = &bsp->dleafs[j + 1]; for (k = 0; k < hit->nummarksurfaces; k++) { - surf = &dfaces[dmarksurfaces[hit->firstmarksurface + k]]; - info = &texinfo[surf->texinfo]; - ofs = dtexdata.header->dataofs[info->miptex]; - miptex = (const miptex_t *)(dtexdata.base + ofs); + surf = &bsp->dfaces[bsp->dmarksurfaces[hit->firstmarksurface + k]]; + info = &bsp->texinfo[surf->texinfo]; + ofs = bsp->dtexdata.header->dataofs[info->miptex]; + miptex = (const miptex_t *)(bsp->dtexdata.base + ofs); if (!strncasecmp(miptex->name, "sky", 3) && ambientsky) ambient_type = AMBIENT_SKY; @@ -123,7 +125,7 @@ CalcAmbientSounds(void) continue; // find distance from source leaf to polygon - SurfaceBBox(surf, mins, maxs); + SurfaceBBox(bsp, surf, mins, maxs); maxd = 0; for (l = 0; l < 3; l++) { if (mins[l] > leaf->maxs[l]) diff --git a/vis/vis.c b/vis/vis.c index b952f0b0..eccb488d 100644 --- a/vis/vis.c +++ b/vis/vis.c @@ -499,7 +499,7 @@ static double stateinterval; ============== */ void * -LeafThread(void *unused) +LeafThread(void *arg) { double now; portal_t *p; @@ -571,8 +571,8 @@ CompressRow(const byte *vis, const int numbytes, byte *out) */ int totalvis; -void -LeafFlow(int leafnum) +static void +LeafFlow(int leafnum, bsp29_dleaf_t *dleaf) { leaf_t *leaf; byte *outbuffer; @@ -624,7 +624,7 @@ LeafFlow(int leafnum) Error("Vismap expansion overflow"); /* leaf 0 is a common solid */ - dleafs[leafnum + 1].visofs = dest - vismap; + dleaf->visofs = dest - vismap; memcpy(dest, compressed, len); free(compressed); @@ -632,7 +632,7 @@ LeafFlow(int leafnum) void -ClusterFlow(int leafnum, leafbits_t *buffer) +ClusterFlow(int leafnum, leafbits_t *buffer, bsp29_dleaf_t *dleaf) { leaf_t *leaf; byte *outbuffer; @@ -688,7 +688,7 @@ ClusterFlow(int leafnum, leafbits_t *buffer) Error("Vismap expansion overflow"); /* leaf 0 is a common solid */ - dleafs[leafnum + 1].visofs = dest - vismap; + dleaf->visofs = dest - vismap; memcpy(dest, compressed, len); free(compressed); @@ -700,7 +700,7 @@ ClusterFlow(int leafnum, leafbits_t *buffer) ================== */ void -CalcPortalVis(void) +CalcPortalVis(const bspdata_t *bsp) { int i, startcount; portal_t *p; @@ -739,7 +739,7 @@ CalcPortalVis(void) ================== */ void -CalcVis(void) +CalcVis(const bspdata_t *bsp) { int i; @@ -751,14 +751,14 @@ CalcVis(void) } logprint("Calculating Full Vis:\n"); - CalcPortalVis(); + CalcPortalVis(bsp); // // assemble the leaf vis lists by oring and compressing the portal lists // if (portalleafs == portalleafs_real) { for (i = 0; i < portalleafs; i++) - LeafFlow(i); + LeafFlow(i, &bsp->dleafs[i + 1]); } else { leafbits_t *buffer; @@ -766,7 +766,7 @@ CalcVis(void) buffer = malloc(LeafbitsSize(portalleafs)); for (i = 0; i < portalleafs_real; i++) { memset(buffer, 0, LeafbitsSize(portalleafs)); - ClusterFlow(i, buffer); + ClusterFlow(i, buffer, &bsp->dleafs[i + 1]); } free(buffer); } @@ -1001,7 +1001,7 @@ SetWindingSphere(winding_t *w) ============ */ void -LoadPortals(char *name) +LoadPortals(char *name, bspdata_t *bsp) { int i, j, count; portal_t *p; @@ -1064,13 +1064,13 @@ LoadPortals(char *name) originalvismapsize = portalleafs_real * ((portalleafs_real + 7) / 8); // FIXME - more intelligent allocation? - dvisdata = malloc(MAX_MAP_VISIBILITY); - if (!dvisdata) + bsp->dvisdata = malloc(MAX_MAP_VISIBILITY); + if (!bsp->dvisdata) Error("%s: dvisdata allocation failed (%i bytes)", __func__, MAX_MAP_VISIBILITY); - memset(dvisdata, 0, MAX_MAP_VISIBILITY); + memset(bsp->dvisdata, 0, MAX_MAP_VISIBILITY); - vismap = vismap_p = dvisdata; + vismap = vismap_p = bsp->dvisdata; vismap_end = vismap + MAX_MAP_VISIBILITY; for (i = 0, p = portals; i < numportals; i++) { @@ -1239,13 +1239,12 @@ main(int argc, char **argv) DefaultExtension(sourcefile, ".bsp"); bsp_version = LoadBSPFile(sourcefile, &bsp); - SetBSPGlobals(&bsp); /* FIXME */ strcpy(portalfile, argv[i]); StripExtension(portalfile); strcat(portalfile, ".prt"); - LoadPortals(portalfile); + LoadPortals(portalfile, &bsp); strcpy(statefile, sourcefile); StripExtension(statefile); @@ -1260,19 +1259,17 @@ main(int argc, char **argv) // CalcPassages (); - CalcVis(); + CalcVis(&bsp); logprint("c_noclip: %i\n", c_noclip); logprint("c_chains: %lu\n", c_chains); - visdatasize = vismap_p - dvisdata; + bsp.visdatasize = vismap_p - bsp.dvisdata; logprint("visdatasize:%i compressed from %i\n", - visdatasize, originalvismapsize); + bsp.visdatasize, originalvismapsize); - CalcAmbientSounds(); + CalcAmbientSounds(&bsp); - /* still need to update from globals */ - GetBSPGlobals(&bsp); WriteBSPFile(sourcefile, &bsp, bsp_version); // unlink (portalfile);