summaryrefslogtreecommitdiff
path: root/src/engine/worldio.cpp
diff options
context:
space:
mode:
authorxolatile2025-08-05 01:05:35 +0200
committerxolatile2025-08-05 01:05:35 +0200
commit6762e292d02e37a69a807e01493d4e14319cca33 (patch)
tree6be0e9914ababfe279644172f6eee9c2d0de9ef5 /src/engine/worldio.cpp
parentd309df4ce4d8ad0ed995a8e1c4267412a7782021 (diff)
downloadxolatile-badassbug-6762e292d02e37a69a807e01493d4e14319cca33.tar.xz
xolatile-badassbug-6762e292d02e37a69a807e01493d4e14319cca33.tar.zst
Do not compile, deleting stuff...
Diffstat (limited to 'src/engine/worldio.cpp')
-rw-r--r--src/engine/worldio.cpp349
1 files changed, 19 insertions, 330 deletions
diff --git a/src/engine/worldio.cpp b/src/engine/worldio.cpp
index 34823fa..61e0e8e 100644
--- a/src/engine/worldio.cpp
+++ b/src/engine/worldio.cpp
@@ -40,23 +40,6 @@ void getmapfilenames(const char *fname, const char *cname, char *pakname, char *
validmapname(mapname, fname, strpbrk(fname, "/\\") ? NULL : "maps/");
}
-static void fixent(entity &e, int version)
-{
- if(version <= 10 && e.type >= 7) e.type++;
- if(version <= 12 && e.type >= 8) e.type++;
- if(version <= 14 && e.type >= ET_MAPMODEL && e.type <= 16)
- {
- if(e.type == 16) e.type = ET_MAPMODEL;
- else e.type++;
- }
- if(version <= 20 && e.type >= ET_ENVMAP) e.type++;
- if(version <= 21 && e.type >= ET_PARTICLES) e.type++;
- if(version <= 22 && e.type >= ET_SOUND) e.type++;
- if(version <= 23 && e.type >= ET_SPOTLIGHT) e.type++;
- if(version <= 30 && (e.type == ET_MAPMODEL || e.type == ET_PLAYERSTART)) e.attr1 = (int(e.attr1)+180)%360;
- if(version <= 31 && e.type == ET_MAPMODEL) { int yaw = (int(e.attr1)%360 + 360)%360 + 7; e.attr1 = yaw - yaw%15; }
-}
-
bool loadents(const char *fname, vector<entity> &ents, uint *crc)
{
string pakname, mapname, mcfgname, ogzname;
@@ -71,30 +54,12 @@ bool loadents(const char *fname, vector<entity> &ents, uint *crc)
if(memcmp(hdr.magic, "OCTA", 4) || hdr.worldsize <= 0|| hdr.numents < 0) { conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; }
if(hdr.version>MAPVERSION) { conoutf(CON_ERROR, "map %s requires a newer version of Cube 2: Sauerbraten", ogzname); delete f; return false; }
compatheader chdr;
- if(hdr.version <= 28)
- {
- if(f->read(&chdr.lightprecision, sizeof(chdr) - 7*sizeof(int)) != sizeof(chdr) - 7*sizeof(int)) { conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; }
- }
- else
- {
- int extra = 0;
- if(hdr.version <= 29) extra++;
- if(f->read(&hdr.blendmap, sizeof(hdr) - (7+extra)*sizeof(int)) != sizeof(hdr) - (7+extra)*sizeof(int)) { conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; }
+ if(f->read(&hdr.blendmap, sizeof(hdr) - 7*sizeof(int)) != sizeof(hdr) - 7*sizeof(int)) {
+ conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false;
}
- if(hdr.version <= 28)
- {
- lilswap(&chdr.lightprecision, 3);
- hdr.blendmap = chdr.blendmap;
- hdr.numvars = 0;
- hdr.numvslots = 0;
- }
- else
- {
- lilswap(&hdr.blendmap, 2);
- if(hdr.version <= 29) hdr.numvslots = 0;
- else lilswap(&hdr.numvslots, 1);
- }
+ lilswap(&hdr.blendmap, 2);
+ lilswap(&hdr.numvslots, 1);
loopi(hdr.numvars)
{
@@ -112,7 +77,6 @@ bool loadents(const char *fname, vector<entity> &ents, uint *crc)
copystring(gametype, "fps");
bool samegame = true;
int eif = 0;
- if(hdr.version>=16)
{
int len = f->getchar();
f->read(gametype, len+1);
@@ -122,22 +86,14 @@ bool loadents(const char *fname, vector<entity> &ents, uint *crc)
samegame = false;
conoutf(CON_WARN, "WARNING: loading map from %s game, ignoring entities except for lights/mapmodels", gametype);
}
- if(hdr.version>=16)
{
eif = f->getlil<ushort>();
int extrasize = f->getlil<ushort>();
f->seek(extrasize, SEEK_CUR);
}
- if(hdr.version<14)
- {
- f->seek(256, SEEK_CUR);
- }
- else
- {
- ushort nummru = f->getlil<ushort>();
- f->seek(nummru*sizeof(ushort), SEEK_CUR);
- }
+ ushort nummru = f->getlil<ushort>();
+ f->seek(nummru*sizeof(ushort), SEEK_CUR);
loopi(min(hdr.numents, MAXENTS))
{
@@ -145,13 +101,8 @@ bool loadents(const char *fname, vector<entity> &ents, uint *crc)
f->read(&e, sizeof(entity));
lilswap(&e.o.x, 3);
lilswap(&e.attr1, 5);
- fixent(e, hdr.version);
if(eif > 0) f->seek(eif, SEEK_CUR);
- if(samegame)
- {
- entities::readent(e, NULL, hdr.version);
- }
- else if(e.type>=ET_GAMESPECIFIC || hdr.version<=14)
+ if(e.type>=ET_GAMESPECIFIC)
{
ents.pop();
continue;
@@ -393,111 +344,6 @@ struct mergecompat
cube *loadchildren(stream *f, const ivec &co, int size, bool &failed);
-void convertoldsurfaces(cube &c, const ivec &co, int size, surfacecompat *srcsurfs, int hassurfs, normalscompat *normals, int hasnorms, mergecompat *merges, int hasmerges)
-{
- surfaceinfo dstsurfs[6];
- vertinfo verts[6*2*MAXFACEVERTS];
- int totalverts = 0, numsurfs = 6;
- memset(dstsurfs, 0, sizeof(dstsurfs));
- loopi(6) if((hassurfs|hasnorms|hasmerges)&(1<<i))
- {
- surfaceinfo &dst = dstsurfs[i];
- vertinfo *curverts = NULL;
- int numverts = 0;
- surfacecompat *src = NULL, *blend = NULL;
- if(hassurfs&(1<<i))
- {
- src = &srcsurfs[i];
- if(src->layer&2)
- {
- blend = &srcsurfs[numsurfs++];
- dst.lmid[0] = src->lmid;
- dst.lmid[1] = blend->lmid;
- dst.numverts |= LAYER_BLEND;
- if(blend->lmid >= LMID_RESERVED && (src->x != blend->x || src->y != blend->y || src->w != blend->w || src->h != blend->h || memcmp(src->texcoords, blend->texcoords, sizeof(src->texcoords))))
- dst.numverts |= LAYER_DUP;
- }
- else if(src->layer == 1) { dst.lmid[1] = src->lmid; dst.numverts |= LAYER_BOTTOM; }
- else { dst.lmid[0] = src->lmid; dst.numverts |= LAYER_TOP; }
- }
- else dst.numverts |= LAYER_TOP;
- bool uselms = hassurfs&(1<<i) && (dst.lmid[0] >= LMID_RESERVED || dst.lmid[1] >= LMID_RESERVED || dst.numverts&~LAYER_TOP),
- usemerges = hasmerges&(1<<i) && merges[i].u1 < merges[i].u2 && merges[i].v1 < merges[i].v2,
- usenorms = hasnorms&(1<<i) && normals[i].normals[0] != bvec(128, 128, 128);
- if(uselms || usemerges || usenorms)
- {
- ivec v[4], pos[4], e1, e2, e3, n, vo = ivec(co).mask(0xFFF).shl(3);
- genfaceverts(c, i, v);
- n.cross((e1 = v[1]).sub(v[0]), (e2 = v[2]).sub(v[0]));
- if(usemerges)
- {
- const mergecompat &m = merges[i];
- int offset = -n.dot(v[0].mul(size).add(vo)),
- dim = dimension(i), vc = C[dim], vr = R[dim];
- loopk(4)
- {
- const ivec &coords = facecoords[i][k];
- int cc = coords[vc] ? m.u2 : m.u1,
- rc = coords[vr] ? m.v2 : m.v1,
- dc = n[dim] ? -(offset + n[vc]*cc + n[vr]*rc)/n[dim] : vo[dim];
- ivec &mv = pos[k];
- mv[vc] = cc;
- mv[vr] = rc;
- mv[dim] = dc;
- }
- }
- else
- {
- int convex = (e3 = v[0]).sub(v[3]).dot(n), vis = 3;
- if(!convex)
- {
- if(ivec().cross(e3, e2).iszero()) { if(!n.iszero()) vis = 1; }
- else if(n.iszero()) vis = 2;
- }
- int order = convex < 0 ? 1 : 0;
- pos[0] = v[order].mul(size).add(vo);
- pos[1] = vis&1 ? v[order+1].mul(size).add(vo) : pos[0];
- pos[2] = v[order+2].mul(size).add(vo);
- pos[3] = vis&2 ? v[(order+3)&3].mul(size).add(vo) : pos[0];
- }
- curverts = verts + totalverts;
- loopk(4)
- {
- if(k > 0 && (pos[k] == pos[0] || pos[k] == pos[k-1])) continue;
- vertinfo &dv = curverts[numverts++];
- dv.setxyz(pos[k]);
- if(uselms)
- {
- float u = src->x + (src->texcoords[k*2] / 255.0f) * (src->w - 1),
- v = src->y + (src->texcoords[k*2+1] / 255.0f) * (src->h - 1);
- dv.u = ushort(floor(clamp((u) * float(USHRT_MAX+1)/LM_PACKW + 0.5f, 0.0f, float(USHRT_MAX))));
- dv.v = ushort(floor(clamp((v) * float(USHRT_MAX+1)/LM_PACKH + 0.5f, 0.0f, float(USHRT_MAX))));
- }
- else dv.u = dv.v = 0;
- dv.norm = usenorms && normals[i].normals[k] != bvec(128, 128, 128) ? encodenormal(normals[i].normals[k].tonormal().normalize()) : 0;
- }
- dst.verts = totalverts;
- dst.numverts |= numverts;
- totalverts += numverts;
- if(dst.numverts&LAYER_DUP) loopk(4)
- {
- if(k > 0 && (pos[k] == pos[0] || pos[k] == pos[k-1])) continue;
- vertinfo &bv = verts[totalverts++];
- bv.setxyz(pos[k]);
- bv.u = ushort(floor(clamp((blend->x + (blend->texcoords[k*2] / 255.0f) * (blend->w - 1)) * float(USHRT_MAX+1)/LM_PACKW, 0.0f, float(USHRT_MAX))));
- bv.v = ushort(floor(clamp((blend->y + (blend->texcoords[k*2+1] / 255.0f) * (blend->h - 1)) * float(USHRT_MAX+1)/LM_PACKH, 0.0f, float(USHRT_MAX))));
- bv.norm = usenorms && normals[i].normals[k] != bvec(128, 128, 128) ? encodenormal(normals[i].normals[k].tonormal().normalize()) : 0;
- }
- }
- }
- setsurfaces(c, dstsurfs, verts, totalverts);
-}
-
-static inline int convertoldmaterial(int mat)
-{
- return ((mat&7)<<MATF_VOLUME_SHIFT) | (((mat>>3)&3)<<MATF_CLIP_SHIFT) | (((mat>>5)&7)<<MATF_FLAG_SHIFT);
-}
-
void loadc(stream *f, cube &c, const ivec &co, int size, bool &failed)
{
bool haschildren = false;
@@ -515,110 +361,9 @@ void loadc(stream *f, cube &c, const ivec &co, int size, bool &failed)
default: failed = true; return;
}
loopi(6) c.texture[i] = mapversion<14 ? f->getchar() : f->getlil<ushort>();
- if(mapversion < 7) f->seek(3, SEEK_CUR);
- else if(mapversion <= 31)
- {
- uchar mask = f->getchar();
- if(mask & 0x80)
- {
- int mat = f->getchar();
- if(mapversion < 27)
- {
- static const ushort matconv[] = { MAT_AIR, MAT_WATER, MAT_CLIP, MAT_GLASS|MAT_CLIP, MAT_NOCLIP, MAT_LAVA|MAT_DEATH, MAT_GAMECLIP, MAT_DEATH };
- c.material = size_t(mat) < sizeof(matconv)/sizeof(matconv[0]) ? (int) matconv[mat] : (int) MAT_AIR;
- }
- else c.material = convertoldmaterial(mat);
- }
- surfacecompat surfaces[12];
- normalscompat normals[6];
- mergecompat merges[6];
- int hassurfs = 0, hasnorms = 0, hasmerges = 0;
- if(mask & 0x3F)
- {
- int numsurfs = 6;
- loopi(numsurfs)
- {
- if(i >= 6 || mask & (1 << i))
- {
- f->read(&surfaces[i], sizeof(surfacecompat));
- lilswap(&surfaces[i].x, 2);
- if(mapversion < 10) ++surfaces[i].lmid;
- if(mapversion < 18)
- {
- if(surfaces[i].lmid >= LMID_AMBIENT1) ++surfaces[i].lmid;
- if(surfaces[i].lmid >= LMID_BRIGHT1) ++surfaces[i].lmid;
- }
- if(mapversion < 19)
- {
- if(surfaces[i].lmid >= LMID_DARK) surfaces[i].lmid += 2;
- }
- if(i < 6)
- {
- if(mask & 0x40) { hasnorms |= 1<<i; f->read(&normals[i], sizeof(normalscompat)); }
- if(surfaces[i].layer != 0 || surfaces[i].lmid != LMID_AMBIENT)
- hassurfs |= 1<<i;
- if(surfaces[i].layer&2) numsurfs++;
- }
- }
- }
- }
- if(mapversion <= 8) edgespan2vectorcube(c);
- if(mapversion <= 11)
- {
- swap(c.faces[0], c.faces[2]);
- swap(c.texture[0], c.texture[4]);
- swap(c.texture[1], c.texture[5]);
- if(hassurfs&0x33)
- {
- swap(surfaces[0], surfaces[4]);
- swap(surfaces[1], surfaces[5]);
- hassurfs = (hassurfs&~0x33) | ((hassurfs&0x30)>>4) | ((hassurfs&0x03)<<4);
- }
- }
- if(mapversion >= 20)
- {
- if(octsav&0x80)
- {
- int merged = f->getchar();
- c.merged = merged&0x3F;
- if(merged&0x80)
- {
- int mask = f->getchar();
- if(mask)
- {
- hasmerges = mask&0x3F;
- loopi(6) if(mask&(1<<i))
- {
- mergecompat *m = &merges[i];
- f->read(m, sizeof(mergecompat));
- lilswap(&m->u1, 4);
- if(mapversion <= 25)
- {
- int uorigin = m->u1 & 0xE000, vorigin = m->v1 & 0xE000;
- m->u1 = (m->u1 - uorigin) << 2;
- m->u2 = (m->u2 - uorigin) << 2;
- m->v1 = (m->v1 - vorigin) << 2;
- m->v2 = (m->v2 - vorigin) << 2;
- }
- }
- }
- }
- }
- }
- if(hassurfs || hasnorms || hasmerges)
- convertoldsurfaces(c, co, size, surfaces, hassurfs, normals, hasnorms, merges, hasmerges);
- }
- else
+
{
- if(octsav&0x40)
- {
- if(mapversion <= 32)
- {
- int mat = f->getchar();
- c.material = convertoldmaterial(mat);
- }
- else c.material = f->getlil<ushort>();
- }
+ if(octsav&0x40) c.material = f->getlil<ushort>();
if(octsav&0x80) c.merged = f->getchar();
if(octsav&0x20)
{
@@ -952,7 +697,6 @@ bool save_world(const char *mname, bool nolms)
lilswap(&tmp.o.x, 3);
lilswap(&tmp.attr1, 5);
f->write(&tmp, sizeof(entity));
- entities::writeent(*ents[i], ebuf);
if(entities::extraentinfosize()) f->write(ebuf, entities::extraentinfosize());
}
}
@@ -1003,15 +747,8 @@ bool load_world(const char *mname, const char *cname) // still supports all map
if(memcmp(hdr.magic, "OCTA", 4) || hdr.worldsize <= 0|| hdr.numents < 0) { conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; }
if(hdr.version>MAPVERSION) { conoutf(CON_ERROR, "map %s requires a newer version of Cube 2: Sauerbraten", ogzname); delete f; return false; }
compatheader chdr;
- if(hdr.version <= 28)
- {
- if(f->read(&chdr.lightprecision, sizeof(chdr) - 7*sizeof(int)) != sizeof(chdr) - 7*sizeof(int)) { conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; }
- }
- else
- {
- int extra = 0;
- if(hdr.version <= 29) extra++;
- if(f->read(&hdr.blendmap, sizeof(hdr) - (7+extra)*sizeof(int)) != sizeof(hdr) - (7+extra)*sizeof(int)) { conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; }
+ if(f->read(&hdr.blendmap, sizeof(hdr) - 7*sizeof(int)) != sizeof(hdr) - 7*sizeof(int)) {
+ conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false;
}
resetmap();
@@ -1023,36 +760,8 @@ bool load_world(const char *mname, const char *cname) // still supports all map
setvar("mapversion", hdr.version, true, false);
- if(hdr.version <= 28)
- {
- lilswap(&chdr.lightprecision, 3);
- if(chdr.lightprecision) setvar("lightprecision", chdr.lightprecision);
- if(chdr.lighterror) setvar("lighterror", chdr.lighterror);
- if(chdr.bumperror) setvar("bumperror", chdr.bumperror);
- setvar("lightlod", chdr.lightlod);
- if(chdr.ambient) setvar("ambient", chdr.ambient);
- setvar("skylight", (int(chdr.skylight[0])<<16) | (int(chdr.skylight[1])<<8) | int(chdr.skylight[2]));
- setvar("watercolour", (int(chdr.watercolour[0])<<16) | (int(chdr.watercolour[1])<<8) | int(chdr.watercolour[2]), true);
- setvar("waterfallcolour", (int(chdr.waterfallcolour[0])<<16) | (int(chdr.waterfallcolour[1])<<8) | int(chdr.waterfallcolour[2]));
- setvar("lavacolour", (int(chdr.lavacolour[0])<<16) | (int(chdr.lavacolour[1])<<8) | int(chdr.lavacolour[2]));
- setvar("fullbright", 0, true);
- if(chdr.lerpsubdivsize || chdr.lerpangle) setvar("lerpangle", chdr.lerpangle);
- if(chdr.lerpsubdivsize)
- {
- setvar("lerpsubdiv", chdr.lerpsubdiv);
- setvar("lerpsubdivsize", chdr.lerpsubdivsize);
- }
- setsvar("maptitle", chdr.maptitle);
- hdr.blendmap = chdr.blendmap;
- hdr.numvars = 0;
- hdr.numvslots = 0;
- }
- else
- {
- lilswap(&hdr.blendmap, 2);
- if(hdr.version <= 29) hdr.numvslots = 0;
- else lilswap(&hdr.numvslots, 1);
- }
+ lilswap(&hdr.blendmap, 2);
+ lilswap(&hdr.numvslots, 1);
renderprogress(0, "clearing world...");
@@ -1108,7 +817,6 @@ bool load_world(const char *mname, const char *cname) // still supports all map
copystring(gametype, "fps");
bool samegame = true;
int eif = 0;
- if(hdr.version>=16)
{
int len = f->getchar();
f->read(gametype, len+1);
@@ -1118,7 +826,6 @@ bool load_world(const char *mname, const char *cname) // still supports all map
samegame = false;
conoutf(CON_WARN, "WARNING: loading map from %s game, ignoring entities except for lights/mapmodels", gametype);
}
- if(hdr.version>=16)
{
eif = f->getlil<ushort>();
int extrasize = f->getlil<ushort>();
@@ -1128,17 +835,8 @@ bool load_world(const char *mname, const char *cname) // still supports all map
}
texmru.shrink(0);
- if(hdr.version<14)
- {
- uchar oldtl[256];
- f->read(oldtl, sizeof(oldtl));
- loopi(256) texmru.add(oldtl[i]);
- }
- else
- {
- ushort nummru = f->getlil<ushort>();
- loopi(nummru) texmru.add(f->getlil<ushort>());
- }
+ ushort nummru = f->getlil<ushort>();
+ loopi(nummru) texmru.add(f->getlil<ushort>());
renderprogress(0, "loading entities...");
@@ -1152,16 +850,14 @@ bool load_world(const char *mname, const char *cname) // still supports all map
f->read(&e, sizeof(entity));
lilswap(&e.o.x, 3);
lilswap(&e.attr1, 5);
- fixent(e, hdr.version);
if(samegame)
{
if(einfosize > 0) f->read(ebuf, einfosize);
- entities::readent(e, ebuf, mapversion);
}
else
{
if(eif > 0) f->seek(eif, SEEK_CUR);
- if(e.type>=ET_GAMESPECIFIC || hdr.version<=14)
+ if(e.type>=ET_GAMESPECIFIC)
{
entities::deleteentity(ents.pop());
continue;
@@ -1174,12 +870,6 @@ bool load_world(const char *mname, const char *cname) // still supports all map
conoutf(CON_WARN, "warning: ent outside of world: enttype[%s] index %d (%f, %f, %f)", entities::entname(e.type), i, e.o.x, e.o.y, e.o.z);
}
}
- if(hdr.version <= 14 && e.type == ET_MAPMODEL)
- {
- e.o.z += e.attr3;
- if(e.attr4) conoutf(CON_WARN, "warning: mapmodel ent (index %d) uses texture slot %d", i, e.attr4);
- e.attr3 = e.attr4 = 0;
- }
}
if(ebuf) delete[] ebuf;
@@ -1202,15 +892,14 @@ bool load_world(const char *mname, const char *cname) // still supports all map
if(!failed)
{
- if(hdr.version >= 7) loopi(hdr.lightmaps)
+ loopi(hdr.lightmaps)
{
renderprogress(i/(float)hdr.lightmaps, "loading lightmaps...");
LightMap &lm = lightmaps.add();
- if(hdr.version >= 17)
{
int type = f->getchar();
lm.type = type&0x7F;
- if(hdr.version >= 20 && type&0x80)
+ if(type&0x80)
{
lm.unlitx = f->getlil<ushort>();
lm.unlity = f->getlil<ushort>();
@@ -1222,7 +911,7 @@ bool load_world(const char *mname, const char *cname) // still supports all map
lm.finalize();
}
- if(hdr.version >= 28 && hdr.blendmap) loadblendmap(f, hdr.blendmap);
+ if(hdr.blendmap) loadblendmap(f, hdr.blendmap);
}
mapcrc = f->getcrc();