diff options
| author | xolatile | 2025-07-20 22:24:08 +0200 |
|---|---|---|
| committer | xolatile | 2025-07-20 22:24:08 +0200 |
| commit | 54fb6d630222e0baf52ed223500dff4cf8da0f19 (patch) | |
| tree | 416446961e24e5b9e8f8adc03c702dcb71961992 /src/engine/octarender.cpp | |
| parent | c46daa31f8e0339aed12736699d0003d27f1fc7e (diff) | |
| download | xolatile-badassbug-54fb6d630222e0baf52ed223500dff4cf8da0f19.tar.xz xolatile-badassbug-54fb6d630222e0baf52ed223500dff4cf8da0f19.tar.zst | |
Armour, respawn, executable, recorder, SMD format...
Diffstat (limited to 'src/engine/octarender.cpp')
| -rw-r--r-- | src/engine/octarender.cpp | 143 |
1 files changed, 71 insertions, 72 deletions
diff --git a/src/engine/octarender.cpp b/src/engine/octarender.cpp index faf609f..ec410de 100644 --- a/src/engine/octarender.cpp +++ b/src/engine/octarender.cpp @@ -31,7 +31,7 @@ void destroyvbo(GLuint vbo) vboinfo &vbi = *exists; if(vbi.uses <= 0) return; vbi.uses--; - if(!vbi.uses) + if(!vbi.uses) { glDeleteBuffers_(1, &vbo); vbos.remove(vbo); @@ -49,9 +49,9 @@ void genvbo(int type, void *buf, int len, vtxarray **vas, int numva) glBufferData_(target, len, buf, GL_STATIC_DRAW); glBindBuffer_(target, 0); - vboinfo &vbi = vbos[vbo]; + vboinfo &vbi = vbos[vbo]; vbi.uses = numva; - + if(printvbo) conoutf(CON_DEBUG, "vbo %d: type %d, size %d, %d uses", vbo, type, len, numva); loopi(numva) @@ -59,14 +59,14 @@ void genvbo(int type, void *buf, int len, vtxarray **vas, int numva) vtxarray *va = vas[i]; switch(type) { - case VBO_VBUF: - va->vbuf = vbo; + case VBO_VBUF: + va->vbuf = vbo; break; - case VBO_EBUF: - va->ebuf = vbo; + case VBO_EBUF: + va->ebuf = vbo; break; - case VBO_SKYBUF: - va->skybuf = vbo; + case VBO_SKYBUF: + va->skybuf = vbo; break; } } @@ -118,9 +118,9 @@ uchar *addvbo(vtxarray *va, int type, int numelems, int elemsize) int len = numelems*elemsize; uchar *buf = data.reserve(len).buf; data.advance(len); - return buf; + return buf; } - + struct verthash { static const int SIZE = 1<<13; @@ -130,10 +130,10 @@ struct verthash verthash() { clearverts(); } - void clearverts() - { + void clearverts() + { memset(table, -1, sizeof(table)); - chain.setsize(0); + chain.setsize(0); verts.setsize(0); } @@ -161,7 +161,7 @@ struct verthash vtx.norm = norm; vtx.tangent = tangent; return addvert(vtx); - } + } }; enum @@ -234,13 +234,13 @@ struct vacollect : verthash void remapunlit(vector<sortkey> &remap) { - uint lastlmid[8] = { LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT }, + uint lastlmid[8] = { LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT }, firstlmid[8] = { LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT, LMID_AMBIENT }; int firstlit[8] = { -1, -1, -1, -1, -1, -1, -1, -1 }; loopv(texs) { sortkey &k = texs[i]; - if(k.lmid>=LMID_RESERVED) + if(k.lmid>=LMID_RESERVED) { LightMapTexture &lmtex = lightmaptexs[k.lmid]; int type = lmtex.type&LM_TYPE; @@ -280,7 +280,7 @@ struct vacollect : verthash if(firstlmid[type]==LMID_AMBIENT) continue; indices[k].unlit = firstlmid[type]; } - } + } loopj(2) { int offset = 4 + 2*j; @@ -295,14 +295,14 @@ struct vacollect : verthash if(firstlmid[type]==LMID_AMBIENT) continue; indices[k].unlit = firstlmid[type]; } - } + } loopv(remap) { sortkey &k = remap[i]; sortval &t = indices[k]; - if(t.unlit<=0) continue; + if(t.unlit<=0) continue; LightMapTexture &lm = lightmaptexs[t.unlit]; - svec2 lmtc(short(ceil((lm.unlitx + 0.5f) * SHRT_MAX/lm.w)), + svec2 lmtc(short(ceil((lm.unlitx + 0.5f) * SHRT_MAX/lm.w)), short(ceil((lm.unlity + 0.5f) * SHRT_MAX/lm.h))); loopl(2) loopvj(t.tris[l]) { @@ -319,7 +319,7 @@ struct vacollect : verthash if(dst) loopl(2) loopvj(t.tris[l]) dst->tris[l].add(t.tris[l][j]); } } - + void optimize() { vector<sortkey> remap; @@ -359,7 +359,7 @@ struct vacollect : verthash if(x.alpha > y.alpha) return false; if(x.layer < y.layer) return true; if(x.layer > y.layer) return false; - if(x.tex == y.tex) + if(x.tex == y.tex) { if(x.lmid < y.lmid) return true; if(x.lmid > y.lmid) return false; @@ -405,9 +405,9 @@ struct vacollect : verthash va->voffset = 0; if(va->verts) { - if(vbosize[VBO_VBUF] + verts.length() > maxvbosize || + if(vbosize[VBO_VBUF] + verts.length() > maxvbosize || vbosize[VBO_EBUF] + worldtris > USHRT_MAX || - vbosize[VBO_SKYBUF] + skytris > USHRT_MAX) + vbosize[VBO_SKYBUF] + skytris > USHRT_MAX) flushvbo(); va->voffset = vbosize[VBO_VBUF]; @@ -419,7 +419,7 @@ struct vacollect : verthash va->matbuf = NULL; va->matsurfs = matsurfs.length(); - if(va->matsurfs) + if(va->matsurfs) { va->matbuf = new materialsurface[matsurfs.length()]; memcpy(va->matbuf, matsurfs.getbuf(), matsurfs.length()*sizeof(materialsurface)); @@ -435,7 +435,7 @@ struct vacollect : verthash ushort *skydata = (ushort *)addvbo(va, VBO_SKYBUF, va->sky+va->explicitsky, sizeof(ushort)); memcpy(skydata, skyindices.getbuf(), va->sky*sizeof(ushort)); memcpy(skydata+va->sky, explicitskyindices.getbuf(), va->explicitsky*sizeof(ushort)); - if(va->voffset) loopi(va->sky+va->explicitsky) skydata[i] += va->voffset; + if(va->voffset) loopi(va->sky+va->explicitsky) skydata[i] += va->voffset; } va->eslist = NULL; @@ -465,7 +465,7 @@ struct vacollect : verthash e.layer = k.layer; e.envmap = k.envmap; ushort *startbuf = curbuf; - loopl(2) + loopl(2) { e.minvert[l] = USHRT_MAX; e.maxvert[l] = 0; @@ -487,7 +487,7 @@ struct vacollect : verthash } if(k.layer==LAYER_BLEND) { va->texs--; va->tris -= e.length[1]/3; va->blends++; va->blendtris += e.length[1]/3; } else if(k.alpha==ALPHA_BACK) { va->texs--; va->tris -= e.length[1]/3; va->alphaback++; va->alphabacktris += e.length[1]/3; } - else if(k.alpha==ALPHA_FRONT) { va->texs--; va->tris -= e.length[1]/3; va->alphafront++; va->alphafronttris += e.length[1]/3; } + else if(k.alpha==ALPHA_FRONT) { va->texs--; va->tris -= e.length[1]/3; va->alphafront++; va->alphafronttris += e.length[1]/3; } Slot &slot = *lookupvslot(k.tex, false).slot; loopvj(slot.sts) va->texmask |= 1<<slot.sts[j].type; @@ -509,7 +509,7 @@ struct vacollect : verthash bool emptyva() { return verts.empty() && matsurfs.empty() && skyindices.empty() && explicitskyindices.empty() && grasstris.empty() && mapmodels.empty(); - } + } } vc; int recalcprogress = 0; @@ -601,7 +601,7 @@ void addtris(const sortkey &key, int orient, vertex *verts, int *index, int numv { case 1: i1 = i2 = mid; cedge = edge+i+1; break; case 2: if(i1 != mid || i0 == left) { i0 = i1; i1 = right; } i2 = right; if(i+1 == numverts-2) cedge = edge+i+2; break; - case 3: if(i0 == start) { i0 = i1; i1 = left; } i2 = left; // fall-through + case 3: if(i0 == start) { i0 = i1; i1 = left; } i2 = left; // fall-through default: if(!i) cedge = edge; break; } if(i1 != i2) @@ -636,13 +636,13 @@ void addtris(const sortkey &key, int orient, vertex *verts, int *index, int numv offset2 = (int(v2.pos[axis]*8) - origin) / d[axis]; vec o = vec(v1.pos).sub(vec(d).mul(offset1/8.0f)); float doffset = 1.0f / (offset2 - offset1); - + if(i1 < 0) for(;;) { tjoint &t = tjoints[ctj]; if(t.next < 0 || tjoints[t.next].edge != cedge) break; ctj = t.next; - } + } while(ctj >= 0) { tjoint &t = tjoints[ctj]; @@ -679,7 +679,7 @@ void addgrasstri(int face, vertex *verts, int numv, ushort texture, ushort lmid) grasstri &g = vc.grasstris.add(); int i1, i2, i3, i4; if(numv <= 3 && face%2) { i1 = face+1; i2 = face+2; i3 = i4 = 0; } - else { i1 = 0; i2 = face+1; i3 = face+2; i4 = numv > 3 ? face+3 : i3; } + else { i1 = 0; i2 = face+1; i3 = face+2; i4 = numv > 3 ? face+3 : i3; } g.v[0] = verts[i1].pos; g.v[1] = verts[i2].pos; g.v[2] = verts[i3].pos; @@ -725,7 +725,7 @@ void addgrasstri(int face, vertex *verts, int numv, ushort texture, ushort lmid) tc2v = verts[i2].lm.y - verts[i1].lm.y, tc3u = verts[i3].lm.x - verts[i1].lm.x, tc3v = verts[i3].lm.y - verts[i1].lm.y; - + g.tcu = vec4(0, 0, 0, tc1u - (bx.z*tc2u + by.z*tc3u)); g.tcu[px] = bx.x*tc2u + by.x*tc3u; g.tcu[py] = -(bx.y*tc2u + by.y*tc3u); @@ -750,7 +750,7 @@ static inline void calctexgen(VSlot &vslot, int dim, vec4 &sgen, vec4 &tgen) toff = -(r.swapxy ? vslot.offset.x : vslot.offset.y)/ys; static const int si[] = { 1, 0, 0 }, ti[] = { 2, 2, 1 }; int sdim = si[dim], tdim = ti[dim]; - sgen = vec4(0, 0, 0, soff); + sgen = vec4(0, 0, 0, soff); tgen = vec4(0, 0, 0, toff); if(r.swapxy) { @@ -765,7 +765,7 @@ static inline void calctexgen(VSlot &vslot, int dim, vec4 &sgen, vec4 &tgen) } ushort encodenormal(const vec &n) -{ +{ if(n.iszero()) return 0; int yaw = int(-atan2(n.x, n.y)/RAD), pitch = int(asin(n.z)/RAD); return ushort(clamp(pitch + 90, 0, 180)*360 + (yaw < 0 ? yaw%360 + 360 : yaw%360) + 1); @@ -837,9 +837,9 @@ void addcubeverts(VSlot &vslot, int orient, int size, vec *pos, int convex, usho vertex &v = verts[k]; v.pos = pos[k]; v.tc = vec2(sgen.dot(v.pos), tgen.dot(v.pos)); - if(lmtex) - { - v.lm = svec2(short(ceil((lm->offsetx + vinfo[k].u*(float(LM_PACKW)/float(USHRT_MAX+1)) + 0.5f) * float(SHRT_MAX)/lmtex->w)), + if(lmtex) + { + v.lm = svec2(short(ceil((lm->offsetx + vinfo[k].u*(float(LM_PACKW)/float(USHRT_MAX+1)) + 0.5f) * float(SHRT_MAX)/lmtex->w)), short(ceil((lm->offsety + vinfo[k].v*(float(LM_PACKH)/float(USHRT_MAX+1)) + 0.5f) * float(SHRT_MAX)/lmtex->h))); } else v.lm = svec2(0, 0); @@ -870,7 +870,7 @@ void addcubeverts(VSlot &vslot, int orient, int size, vec *pos, int convex, usho sortkey key(texture, lmid, !vslot.scroll.iszero() ? dim : 3, layer == LAYER_BLEND ? LAYER_BLEND : LAYER_TOP, envmap, alpha ? (vslot.alphaback ? ALPHA_BACK : (vslot.alphafront ? ALPHA_FRONT : NO_ALPHA)) : NO_ALPHA); addtris(key, orient, verts, index, numverts, convex, shadowmask, tj); - if(grassy) + if(grassy) { for(int i = 0; i < numverts-2; i += 2) { @@ -878,7 +878,7 @@ void addcubeverts(VSlot &vslot, int orient, int size, vec *pos, int convex, usho if(index[0]!=index[i+1] && index[i+1]!=index[i+2] && index[i+2]!=index[0]) faces |= 1; if(i+3 < numverts && index[0]!=index[i+2] && index[i+2]!=index[i+3] && index[i+3]!=index[0]) faces |= 2; if(grassy > 1 && faces==3) addgrasstri(i, verts, 4, texture, lmid); - else + else { if(faces&1) addgrasstri(i, verts, 3, texture, lmid); if(faces&2) addgrasstri(i+1, verts, 3, texture, lmid); @@ -898,8 +898,8 @@ static uint hthash(const edgegroup &g) return g.slope.x^(g.slope.y<<2)^(g.slope.z<<4)^g.origin.x^g.origin.y^g.origin.z; } -static bool htcmp(const edgegroup &x, const edgegroup &y) -{ +static bool htcmp(const edgegroup &x, const edgegroup &y) +{ return x.slope==y.slope && x.origin==y.origin; } @@ -1044,7 +1044,7 @@ void gencubeverts(cube &c, const ivec &co, int size, int csi) int vismask = ~c.merged & 0x3F; if(!(c.visible&0x80)) vismask &= c.visible; if(!vismask) return; - + int tj = filltjoints && c.ext ? c.ext->tjoints : -1, vis; loopi(6) if(vismask&(1<<i) && (vis = visibletris(c, i, co, size))) { @@ -1081,7 +1081,7 @@ void gencubeverts(cube &c, const ivec &co, int size, int csi) if(!c.ext) addcubeverts(vslot, i, size, pos, convex, c.texture[i], LMID_AMBIENT, NULL, numverts, hastj, envmap, grassy, (c.material&MAT_ALPHA)!=0); else - { + { const surfaceinfo &surf = c.ext->surfaces[i]; if(!surf.numverts || surf.numverts&LAYER_TOP) addcubeverts(vslot, i, size, pos, convex, c.texture[i], surf.lmid[0], verts, numverts, hastj, envmap, grassy, (c.material&MAT_ALPHA)!=0, LAYER_TOP|(surf.numverts&LAYER_BLEND)); @@ -1122,7 +1122,7 @@ static inline int hasskyfaces(cube &c, const ivec &co, int size, int faces[6] = } void minskyface(cube &cu, int orient, const ivec &co, int size, facebounds &orig) -{ +{ facebounds mincf; mincf.u1 = orig.u2; mincf.u2 = orig.u1; @@ -1133,7 +1133,7 @@ void minskyface(cube &cu, int orient, const ivec &co, int size, facebounds &orig orig.u2 = min(mincf.u2, orig.u2); orig.v1 = max(mincf.v1, orig.v1); orig.v2 = min(mincf.v2, orig.v2); -} +} void genskyfaces(cube &c, const ivec &o, int size) { @@ -1144,7 +1144,7 @@ void genskyfaces(cube &c, const ivec &o, int size) { int orient = faces[i], dim = dimension(orient); facebounds m; - m.u1 = (o[C[dim]]&0xFFF)<<3; + m.u1 = (o[C[dim]]&0xFFF)<<3; m.u2 = m.u1 + (size<<3); m.v1 = (o[R[dim]]&0xFFF)<<3; m.v2 = m.v1 + (size<<3); @@ -1160,7 +1160,7 @@ void addskyverts(const ivec &o, int size) loopi(6) { int dim = dimension(i), c = C[dim], r = R[dim]; - vector<facebounds> &sf = vc.skyfaces[i]; + vector<facebounds> &sf = vc.skyfaces[i]; if(sf.empty()) continue; vc.skymask |= 0x3F&~(1<<opposite(i)); sf.setsize(mergefaces(i, sf.getbuf(), sf.length())); @@ -1193,7 +1193,7 @@ void addskyverts(const ivec &o, int size) } } } - + ////////// Vertex Arrays ////////////// int allocva = 0; @@ -1316,12 +1316,12 @@ void updatevabbs(bool force) } struct mergedface -{ +{ uchar orient, lmid, numverts; ushort mat, tex, envmap; vertinfo *verts; int tjoints; -}; +}; #define MAXMERGELEVEL 12 static int vahasmerges = 0, vamergemax = 0; @@ -1331,11 +1331,11 @@ int genmergedfaces(cube &c, const ivec &co, int size, int minlevel = -1) { if(!c.ext || isempty(c)) return -1; int tj = c.ext->tjoints, maxlevel = -1; - loopi(6) if(c.merged&(1<<i)) + loopi(6) if(c.merged&(1<<i)) { surfaceinfo &surf = c.ext->surfaces[i]; int numverts = surf.numverts&MAXFACEVERTS; - if(!numverts) + if(!numverts) { if(minlevel < 0) vahasmerges |= MERGE_PART; continue; @@ -1347,7 +1347,7 @@ int genmergedfaces(cube &c, const ivec &co, int size, int minlevel = -1) mf.envmap = EMID_NONE; mf.lmid = surf.lmid[0]; mf.numverts = surf.numverts; - mf.verts = c.ext->verts() + surf.verts; + mf.verts = c.ext->verts() + surf.verts; mf.tjoints = -1; int level = calcmergedsize(i, co, size, mf.verts, mf.numverts&MAXFACEVERTS); if(level > minlevel) @@ -1363,7 +1363,7 @@ int genmergedfaces(cube &c, const ivec &co, int size, int minlevel = -1) mf.envmap = vslot.slot->texmask&(1<<TEX_ENVMAP) ? EMID_CUSTOM : closestenvmap(i, co, size); ushort envmap2 = layer && layer->slot->shader->type&SHADER_ENVMAP ? (layer->slot->texmask&(1<<TEX_ENVMAP) ? EMID_CUSTOM : closestenvmap(i, co, size)) : EMID_NONE; - if(surf.numverts&LAYER_TOP) vamerges[level].add(mf); + if(surf.numverts&LAYER_TOP) vamerges[level].add(mf); if(surf.numverts&LAYER_BOTTOM) { mf.tex = vslot.layer; @@ -1391,7 +1391,7 @@ int findmergedfaces(cube &c, const ivec &co, int size, int csi, int minlevel) int maxlevel = -1; loopi(8) { - ivec o(i, co, size/2); + ivec o(i, co, size/2); int level = findmergedfaces(c.children[i], o, size/2, csi-1, minlevel); maxlevel = max(maxlevel, level); } @@ -1427,7 +1427,7 @@ void addmergedverts(int level, const ivec &o) void rendercube(cube &c, const ivec &co, int size, int csi, int &maxlevel) // creates vertices and indices ready to be put into a va { //if(size<=16) return; - if(c.ext && c.ext->va) + if(c.ext && c.ext->va) { maxlevel = max(maxlevel, c.ext->va->mergelevel); return; // don't re-render @@ -1442,9 +1442,9 @@ void rendercube(cube &c, const ivec &co, int size, int csi, int &maxlevel) // c ivec o(i, co, size/2); int level = -1; rendercube(c.children[i], o, size/2, csi-1, level); - if(level >= csi) + if(level >= csi) c.escaped |= 1<<i; - maxlevel = max(maxlevel, level); + maxlevel = max(maxlevel, level); } --neighbourdepth; @@ -1456,10 +1456,10 @@ void rendercube(cube &c, const ivec &co, int size, int csi, int &maxlevel) // c } return; } - + genskyfaces(c, co, size); - if(!isempty(c)) + if(!isempty(c)) { gencubeverts(c, co, size, csi); if(c.merged) maxlevel = max(maxlevel, genmergedfaces(c, co, size)); @@ -1570,19 +1570,19 @@ static inline int setcubevisibility(cube &c, const ivec &co, int size) loopi(6) { int facemask = classifyface(c, i, co, size); - if(facemask&1) + if(facemask&1) { vismask |= 1<<i; if(c.merged&(1<<i)) { if(c.ext && c.ext->surfaces[i].numverts&MAXFACEVERTS) numvis++; } - else + else { numvis++; if(c.texture[i] != DEFAULT_SKY && !(c.ext && c.ext->surfaces[i].numverts&MAXFACEVERTS)) checkmask |= 1<<i; } - } + } if(facemask&2 && collideface(c, i)) collidemask |= 1<<i; } c.visible = collidemask | (vismask ? (vismask != collidemask ? (checkmask ? 0x80|0x40 : 0x80) : 0x40) : 0); @@ -1604,7 +1604,7 @@ int updateva(cube *c, const ivec &co, int size, int csi) ivec o(i, co, size); vamergemax = 0; vahasmerges = 0; - if(c[i].ext && c[i].ext->va) + if(c[i].ext && c[i].ext->va) { varoot.add(c[i].ext->va); if(c[i].ext->va->hasmerges&MERGE_ORIGIN) findmergedfaces(c[i], o, size, csi, csi); @@ -1612,13 +1612,13 @@ int updateva(cube *c, const ivec &co, int size, int csi) else { if(c[i].children) count += updateva(c[i].children, o, size/2, csi-1); - else + else { if(!isempty(c[i])) count += setcubevisibility(c[i], o, size); count += hasskyfaces(c[i], o, size); } int tcount = count + (csi <= MAXMERGELEVEL ? vamerges[csi].length() : 0); - if(tcount > vafacemax || (tcount >= vafacemin && size >= vacubesize) || size == min(0x1000, worldsize/2)) + if(tcount > vafacemax || (tcount >= vafacemin && size >= vacubesize) || size == min(0x1000, worldsize/2)) { loadprogress = clamp(recalcprogress/float(allocnodes), 0.0f, 1.0f); setva(c[i], o, size, csi); @@ -1671,7 +1671,7 @@ void addtjoint(const edgegroup &g, const cubeedge &e, int offset) tj.next = cur; if(prev < 0) e.c->ext->tjoints = tjoints.length()-1; - else tjoints[prev].next = tjoints.length()-1; + else tjoints[prev].next = tjoints.length()-1; } void findtjoints(int cur, const edgegroup &g) @@ -1785,9 +1785,8 @@ void allchanged(bool load) setupmaterials(); invalidatepostfx(); updatevabbs(true); - resetblobs(); lightents(); - if(load) + if(load) { seedparticles(); drawtextures(); |
