From 54fb6d630222e0baf52ed223500dff4cf8da0f19 Mon Sep 17 00:00:00 2001 From: xolatile Date: Sun, 20 Jul 2025 22:24:08 +0200 Subject: Armour, respawn, executable, recorder, SMD format... --- src/engine/octarender.cpp | 143 +++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 72 deletions(-) (limited to 'src/engine/octarender.cpp') 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 &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 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<= 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<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 &sf = vc.skyfaces[i]; + vector &sf = vc.skyfaces[i]; if(sf.empty()) continue; vc.skymask |= 0x3F&~(1<tjoints, maxlevel = -1; - loopi(6) if(c.merged&(1<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<slot->shader->type&SHADER_ENVMAP ? (layer->slot->texmask&(1<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<surfaces[i].numverts&MAXFACEVERTS) numvis++; } - else + else { numvis++; if(c.texture[i] != DEFAULT_SKY && !(c.ext && c.ext->surfaces[i].numverts&MAXFACEVERTS)) checkmask |= 1<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(); -- cgit v1.2.3