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 | |
| 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')
| -rw-r--r-- | src/engine/engine.h | 24 | ||||
| -rw-r--r-- | src/engine/main.cpp | 5 | ||||
| -rw-r--r-- | src/engine/model.h | 2 | ||||
| -rw-r--r-- | src/engine/octaedit.cpp | 23 | ||||
| -rw-r--r-- | src/engine/octarender.cpp | 143 | ||||
| -rw-r--r-- | src/engine/rendermodel.cpp | 24 | ||||
| -rw-r--r-- | src/engine/smd.h | 447 |
7 files changed, 85 insertions, 583 deletions
diff --git a/src/engine/engine.h b/src/engine/engine.h index efee4cd..0187ecc 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -523,21 +523,6 @@ extern void initdecals(); extern void cleardecals(); extern void renderdecals(bool mainpass = false); -// blob - -enum -{ - BLOB_STATIC = 0, - BLOB_DYNAMIC -}; - -extern int showblobs; - -extern void initblobs(int type = -1); -extern void resetblobs(); -extern void renderblob(int type, const vec &o, float radius, float fade = 1); -extern void flushblobs(); - // rendersky extern int explicitsky; extern double skyarea; @@ -597,15 +582,6 @@ extern bool loadblendmap(stream *f, int info); extern void saveblendmap(stream *f); extern uchar shouldsaveblendmap(); -// recorder - -namespace recorder -{ - extern void stop(); - extern void capture(bool overlay = true); - extern void cleanup(); -} - #endif #endif diff --git a/src/engine/main.cpp b/src/engine/main.cpp index d12a38b..b4a4c98 100644 --- a/src/engine/main.cpp +++ b/src/engine/main.cpp @@ -10,7 +10,6 @@ extern void cleargamma(); void cleanup() { - recorder::stop(); cleanupserver(); SDL_ShowCursor(SDL_TRUE); SDL_SetRelativeMouseMode(SDL_FALSE); @@ -761,7 +760,6 @@ void resetgl() extern void cleanupva(); extern void cleanupparticles(); extern void cleanupdecals(); - extern void cleanupblobs(); extern void cleanupsky(); extern void cleanupmodels(); extern void cleanupprefabs(); @@ -771,11 +769,9 @@ void resetgl() extern void cleanreflections(); extern void cleanupglare(); extern void cleanupdepthfx(); - recorder::cleanup(); cleanupva(); cleanupparticles(); cleanupdecals(); - cleanupblobs(); cleanupsky(); cleanupmodels(); cleanupprefabs(); @@ -1046,7 +1042,6 @@ void checkinput() void swapbuffers(bool overlay) { - recorder::capture(overlay); gle::disable(); SDL_GL_SwapWindow(screen); } diff --git a/src/engine/model.h b/src/engine/model.h index f1effd1..d314d4b 100644 --- a/src/engine/model.h +++ b/src/engine/model.h @@ -1,4 +1,4 @@ -enum { MDL_MD3, MDL_MD5, MDL_IQM, MDL_SMD, NUMMODELTYPES }; +enum { MDL_MD3, MDL_MD5, MDL_IQM, NUMMODELTYPES }; struct model { diff --git a/src/engine/octaedit.cpp b/src/engine/octaedit.cpp index 5baa6f0..3092221 100644 --- a/src/engine/octaedit.cpp +++ b/src/engine/octaedit.cpp @@ -4,7 +4,7 @@ extern int outline; bool boxoutline = false; -void boxs(int orient, vec o, const vec &s, float size) +void boxs(int orient, vec o, const vec &s, float size) { int d = dimension(orient), dc = dimcoord(orient); float f = boxoutline ? (dc>0 ? 0.2f : -0.2f) : 0; @@ -291,7 +291,7 @@ void countselchild(cube *c, const ivec &cor, int size) { ivec o(i, cor, size); if(c[i].children) countselchild(c[i].children, o, size/2); - else + else { selchildcount++; if(c[i].material != MAT_AIR && selchildmat != MAT_AIR) @@ -488,7 +488,7 @@ void rendereditcursor() selchildcount = 0; selchildmat = -1; countselchild(worldroot, ivec(0, 0, 0), worldsize/2); - if(mag>=1 && selchildcount==1) + if(mag>=1 && selchildcount==1) { selchildmat = c->material; if(mag>1) selchildcount = -mag; @@ -604,7 +604,6 @@ void commitchanges(bool force) setupmaterials(oldlen); invalidatepostfx(); updatevabbs(); - resetblobs(); } void changed(const block3 &sel, bool commit = true) @@ -981,7 +980,7 @@ static bool unpackblock(block3 *&b, B &buf) } struct vslotmap -{ +{ int index; VSlot *vslot; @@ -1362,7 +1361,7 @@ static void genprefabmesh(prefabmesh &r, cube &c, const ivec &co, int size) } else if(!isempty(c)) { - int vis; + int vis; loopi(6) if((vis = visibletris(c, i, co, size))) { ivec v[4]; @@ -2619,8 +2618,8 @@ void rotatecube(cube &c, int d) // rotates cube clockwise. see pics in cvs for void mpflip(selinfo &sel, bool local) { - if(local) - { + if(local) + { game::edittrigger(sel, EDIT_FLIP); makeundo(); } @@ -2676,8 +2675,8 @@ COMMAND(flip, ""); COMMAND(rotate, "i"); enum { EDITMATF_EMPTY = 0x10000, EDITMATF_NOTEMPTY = 0x20000, EDITMATF_SOLID = 0x30000, EDITMATF_NOTSOLID = 0x40000 }; -static const struct { const char *name; int filter; } editmatfilters[] = -{ +static const struct { const char *name; int filter; } editmatfilters[] = +{ { "empty", EDITMATF_EMPTY }, { "notempty", EDITMATF_NOTEMPTY }, { "solid", EDITMATF_SOLID }, @@ -2744,8 +2743,8 @@ void editmat(char *name, char *filtername) if(filter < 0) filter = findmaterial(filtername); if(filter < 0) { - conoutf(CON_ERROR, "unknown material \"%s\"", filtername); - return; + conoutf(CON_ERROR, "unknown material \"%s\"", filtername); + return; } } int id = -1; 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(); diff --git a/src/engine/rendermodel.cpp b/src/engine/rendermodel.cpp index ccbc58b..66092ba 100644 --- a/src/engine/rendermodel.cpp +++ b/src/engine/rendermodel.cpp @@ -28,12 +28,10 @@ UNUSED static int __dummy__##modelclass = addmodeltype((modeltype), __loadmodel_ #include "md3.h" #include "md5.h" #include "iqm.h" -#include "smd.h" MODELTYPE(MDL_MD3, md3); MODELTYPE(MDL_MD5, md5); MODELTYPE(MDL_IQM, iqm); -MODELTYPE(MDL_SMD, smd); #define checkmdl if(!loadingmodel) { conoutf(CON_ERROR, "not loading a model"); return; } @@ -606,18 +604,7 @@ void endmodelbatches() { modelbatch &b = *batches[i]; if(b.batched.empty()) continue; - if(b.flags&(MDL_SHADOW|MDL_DYNSHADOW)) - { - vec center, bbradius; - b.m->boundbox(center, bbradius); - loopvj(b.batched) - { - batchedmodel &bm = b.batched[j]; - if(bm.flags&(MDL_SHADOW|MDL_DYNSHADOW)) - renderblob(bm.flags&MDL_DYNSHADOW ? BLOB_DYNAMIC : BLOB_STATIC, bm.d && bm.d->ragdoll ? bm.d->ragdoll->center : bm.pos, bm.d ? bm.d->radius : max(bbradius.x, bbradius.y), bm.transparent); - } - flushblobs(); - } + bool rendered = false; occludequery *query = NULL; if(b.flags&MDL_GHOST) @@ -806,7 +793,7 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl if(!m) return; vec center(0, 0, 0), bbradius(0, 0, 0); float radius = 0; - bool shadow = !shadowmap && !glaring && (flags&(MDL_SHADOW|MDL_DYNSHADOW)) && showblobs; + bool shadow = !shadowmap && !glaring && (flags&(MDL_SHADOW|MDL_DYNSHADOW));//~ && showblobs; if(flags&(MDL_CULL_VFC|MDL_CULL_DIST|MDL_CULL_OCCLUDED|MDL_CULL_QUERY|MDL_SHADOW|MDL_DYNSHADOW)) { @@ -937,13 +924,6 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl return; } - if(shadow && !reflecting && refracting<=0) - { - renderblob(flags&MDL_DYNSHADOW ? BLOB_DYNAMIC : BLOB_STATIC, d && d->ragdoll ? center : o, d ? d->radius : max(bbradius.x, bbradius.y), trans); - flushblobs(); - if((flags&MDL_CULL_VFC) && refracting<0 && center.z-radius>=reflectz) return; - } - m->startrender(); if(shadowmapping) diff --git a/src/engine/smd.h b/src/engine/smd.h deleted file mode 100644 index 771ec9a..0000000 --- a/src/engine/smd.h +++ /dev/null @@ -1,447 +0,0 @@ -struct smd; - -struct smdbone -{ - string name; - int parent; - smdbone() : parent(-1) { name[0] = '\0'; } -}; - -struct smd : skelloader<smd> -{ - smd(const char *name) : skelloader(name) {} - - static const char *formatname() { return "smd"; } - int type() const { return MDL_SMD; } - - struct smdmesh : skelmesh - { - }; - - struct smdmeshgroup : skelmeshgroup - { - smdmeshgroup() - { - } - - bool skipcomment(char *&curbuf) - { - while(*curbuf && isspace(*curbuf)) curbuf++; - switch(*curbuf) - { - case '#': - case ';': - case '\r': - case '\n': - case '\0': - return true; - case '/': - if(curbuf[1] == '/') return true; - break; - } - return false; - } - - void skipsection(stream *f, char *buf, size_t bufsize) - { - while(f->getline(buf, bufsize)) - { - char *curbuf = buf; - if(skipcomment(curbuf)) continue; - if(!strncmp(curbuf, "end", 3)) break; - } - } - - void readname(char *&curbuf, char *name, size_t namesize) - { - char *curname = name; - while(*curbuf && isspace(*curbuf)) curbuf++; - bool allowspace = false; - if(*curbuf == '"') { curbuf++; allowspace = true; } - while(*curbuf) - { - char c = *curbuf++; - if(c == '"') break; - if(isspace(c) && !allowspace) break; - if(curname < &name[namesize-1]) *curname++ = c; - } - *curname = '\0'; - } - - void readnodes(stream *f, char *buf, size_t bufsize, vector<smdbone> &bones) - { - while(f->getline(buf, bufsize)) - { - char *curbuf = buf; - if(skipcomment(curbuf)) continue; - if(!strncmp(curbuf, "end", 3)) break; - int id = strtol(curbuf, &curbuf, 10); - string name; - readname(curbuf, name, sizeof(name)); - int parent = strtol(curbuf, &curbuf, 10); - if(id < 0 || id > 255 || parent > 255 || !name[0]) continue; - while(!bones.inrange(id)) bones.add(); - smdbone &bone = bones[id]; - copystring(bone.name, name); - bone.parent = parent; - } - } - - void readmaterial(char *&curbuf, char *name, size_t namesize) - { - char *curname = name; - while(*curbuf && isspace(*curbuf)) curbuf++; - while(*curbuf) - { - char c = *curbuf++; - if(isspace(c)) break; - if(c == '.') - { - while(*curbuf && !isspace(*curbuf)) curbuf++; - break; - } - if(curname < &name[namesize-1]) *curname++ = c; - } - *curname = '\0'; - } - - struct smdmeshdata - { - smdmesh *mesh; - vector<vert> verts; - vector<tri> tris; - - void finalize() - { - if(verts.empty() || tris.empty()) return; - vert *mverts = new vert[mesh->numverts + verts.length()]; - if(mesh->numverts) - { - memcpy(mverts, mesh->verts, mesh->numverts*sizeof(vert)); - delete[] mesh->verts; - } - memcpy(&mverts[mesh->numverts], verts.getbuf(), verts.length()*sizeof(vert)); - mesh->numverts += verts.length(); - mesh->verts = mverts; - tri *mtris = new tri[mesh->numtris + tris.length()]; - if(mesh->numtris) - { - memcpy(mtris, mesh->tris, mesh->numtris*sizeof(tri)); - delete[] mesh->tris; - } - memcpy(&mtris[mesh->numtris], tris.getbuf(), tris.length()*sizeof(tri)); - mesh->numtris += tris.length(); - mesh->tris = mtris; - } - }; - - struct smdvertkey : vert - { - smdmeshdata *mesh; - - smdvertkey(smdmeshdata *mesh) : mesh(mesh) {} - }; - - void readtriangles(stream *f, char *buf, size_t bufsize) - { - smdmeshdata *curmesh = NULL; - hashtable<const char *, smdmeshdata> materials(1<<6); - hashset<int> verts(1<<12); - while(f->getline(buf, bufsize)) - { - char *curbuf = buf; - if(skipcomment(curbuf)) continue; - if(!strncmp(curbuf, "end", 3)) break; - string material; - readmaterial(curbuf, material, sizeof(material)); - if(!curmesh || strcmp(curmesh->mesh->name, material)) - { - curmesh = materials.access(material); - if(!curmesh) - { - smdmesh *m = new smdmesh; - m->group = this; - m->name = newstring(material); - meshes.add(m); - curmesh = &materials[m->name]; - curmesh->mesh = m; - } - } - tri curtri; - loopi(3) - { - char *curbuf; - do - { - if(!f->getline(buf, bufsize)) goto endsection; - curbuf = buf; - } while(skipcomment(curbuf)); - smdvertkey key(curmesh); - int parent = -1, numlinks = 0, len = 0; - if(sscanf(curbuf, " %d %f %f %f %f %f %f %f %f %d%n", &parent, &key.pos.x, &key.pos.y, &key.pos.z, &key.norm.x, &key.norm.y, &key.norm.z, &key.tc.x, &key.tc.y, &numlinks, &len) < 9) goto endsection; - curbuf += len; - key.pos.y = -key.pos.y; - key.norm.y = -key.norm.y; - key.tc.y = 1 - key.tc.y; - blendcombo c; - int sorted = 0; - float pweight = 0, tweight = 0; - for(; numlinks > 0; numlinks--) - { - int bone = -1, len = 0; - float weight = 0; - if(sscanf(curbuf, " %d %f%n", &bone, &weight, &len) < 2) break; - curbuf += len; - tweight += weight; - if(bone == parent) pweight += weight; - else sorted = c.addweight(sorted, weight, bone); - } - if(tweight < 1) pweight += 1 - tweight; - if(pweight > 0) sorted = c.addweight(sorted, pweight, parent); - c.finalize(sorted); - key.blend = curmesh->mesh->addblendcombo(c); - int index = verts.access(key, curmesh->verts.length()); - if(index == curmesh->verts.length()) curmesh->verts.add(key); - curtri.vert[2-i] = index; - } - curmesh->tris.add(curtri); - } - endsection: - enumerate(materials, smdmeshdata, data, data.finalize()); - } - - void readskeleton(stream *f, char *buf, size_t bufsize) - { - int frame = -1; - while(f->getline(buf, bufsize)) - { - char *curbuf = buf; - if(skipcomment(curbuf)) continue; - if(sscanf(curbuf, " time %d", &frame) == 1) continue; - else if(!strncmp(curbuf, "end", 3)) break; - else if(frame != 0) continue; - int bone; - vec pos, rot; - if(sscanf(curbuf, " %d %f %f %f %f %f %f", &bone, &pos.x, &pos.y, &pos.z, &rot.x, &rot.y, &rot.z) != 7) - continue; - if(bone < 0 || bone >= skel->numbones) - continue; - rot.x = -rot.x; - rot.z = -rot.z; - float cx = cosf(rot.x/2), sx = sinf(rot.x/2), - cy = cosf(rot.y/2), sy = sinf(rot.y/2), - cz = cosf(rot.z/2), sz = sinf(rot.z/2); - pos.y = -pos.y; - dualquat dq(quat(sx*cy*cz - cx*sy*sz, - cx*sy*cz + sx*cy*sz, - cx*cy*sz - sx*sy*cz, - cx*cy*cz + sx*sy*sz), - pos); - boneinfo &b = skel->bones[bone]; - if(b.parent < 0) b.base = dq; - else b.base.mul(skel->bones[b.parent].base, dq); - (b.invbase = b.base).invert(); - } - } - - bool loadmesh(const char *filename) - { - stream *f = openfile(filename, "r"); - if(!f) return false; - - char buf[512]; - int version = -1; - while(f->getline(buf, sizeof(buf))) - { - char *curbuf = buf; - if(skipcomment(curbuf)) continue; - if(sscanf(curbuf, " version %d", &version) == 1) - { - if(version != 1) { delete f; return false; } - } - else if(!strncmp(curbuf, "nodes", 5)) - { - if(skel->numbones > 0) { skipsection(f, buf, sizeof(buf)); continue; } - vector<smdbone> bones; - readnodes(f, buf, sizeof(buf), bones); - if(bones.empty()) continue; - skel->numbones = bones.length(); - skel->bones = new boneinfo[skel->numbones]; - loopv(bones) - { - boneinfo &dst = skel->bones[i]; - smdbone &src = bones[i]; - dst.name = newstring(src.name); - dst.parent = src.parent; - } - skel->linkchildren(); - } - else if(!strncmp(curbuf, "triangles", 9)) - readtriangles(f, buf, sizeof(buf)); - else if(!strncmp(curbuf, "skeleton", 8)) - { - if(skel->shared > 1) skipsection(f, buf, sizeof(buf)); - else readskeleton(f, buf, sizeof(buf)); - } - else if(!strncmp(curbuf, "vertexanimation", 15)) - skipsection(f, buf, sizeof(buf)); - } - - sortblendcombos(); - - delete f; - return true; - } - - int readframes(stream *f, char *buf, size_t bufsize, vector<dualquat> &animbones) - { - int frame = -1, numframes = 0, lastbone = skel->numbones; - while(f->getline(buf, bufsize)) - { - char *curbuf = buf; - if(skipcomment(curbuf)) continue; - int nextframe = -1; - if(sscanf(curbuf, " time %d", &nextframe) == 1) - { - for(; lastbone < skel->numbones; lastbone++) animbones[frame*skel->numbones + lastbone] = animbones[lastbone]; - if(nextframe >= numframes) - { - databuf<dualquat> framebones = animbones.reserve(skel->numbones * (nextframe + 1 - numframes)); - loopi(nextframe - numframes) framebones.put(animbones.getbuf(), skel->numbones); - animbones.addbuf(framebones); - animbones.advance(skel->numbones); - numframes = nextframe + 1; - } - frame = nextframe; - lastbone = 0; - continue; - } - else if(!strncmp(curbuf, "end", 3)) break; - int bone; - vec pos, rot; - if(sscanf(curbuf, " %d %f %f %f %f %f %f", &bone, &pos.x, &pos.y, &pos.z, &rot.x, &rot.y, &rot.z) != 7) - continue; - if(bone < 0 || bone >= skel->numbones) - continue; - for(; lastbone < bone; lastbone++) animbones[frame*skel->numbones + lastbone] = animbones[lastbone]; - lastbone++; - float cx = cosf(rot.x/2), sx = sinf(rot.x/2), - cy = cosf(rot.y/2), sy = sinf(rot.y/2), - cz = cosf(rot.z/2), sz = sinf(rot.z/2); - pos.y = -pos.y; - dualquat dq(quat(-(sx*cy*cz - cx*sy*sz), - cx*sy*cz + sx*cy*sz, - -(cx*cy*sz - sx*sy*cz), - cx*cy*cz + sx*sy*sz), - pos); - if(adjustments.inrange(bone)) adjustments[bone].adjust(dq); - dq.mul(skel->bones[bone].invbase); - dualquat &dst = animbones[frame*skel->numbones + bone]; - if(skel->bones[bone].parent < 0) dst = dq; - else dst.mul(skel->bones[skel->bones[bone].parent].base, dq); - dst.fixantipodal(skel->numframes > 0 ? skel->framebones[bone] : animbones[bone]); - } - for(; lastbone < skel->numbones; lastbone++) animbones[frame*skel->numbones + lastbone] = animbones[lastbone]; - return numframes; - } - - skelanimspec *loadanim(const char *filename) - { - skelanimspec *sa = skel->findskelanim(filename); - if(sa || skel->numbones <= 0) return sa; - - stream *f = openfile(filename, "r"); - if(!f) return NULL; - - char buf[512]; - int version = -1; - vector<dualquat> animbones; - while(f->getline(buf, sizeof(buf))) - { - char *curbuf = buf; - if(skipcomment(curbuf)) continue; - if(sscanf(curbuf, " version %d", &version) == 1) - { - if(version != 1) { delete f; return NULL; } - } - else if(!strncmp(curbuf, "nodes", 5)) - { - vector<smdbone> bones; - readnodes(f, buf, sizeof(buf), bones); - if(bones.length() != skel->numbones) { delete f; return NULL; } - } - else if(!strncmp(curbuf, "triangles", 9)) - skipsection(f, buf, sizeof(buf)); - else if(!strncmp(curbuf, "skeleton", 8)) - readframes(f, buf, sizeof(buf), animbones); - else if(!strncmp(curbuf, "vertexanimation", 15)) - skipsection(f, buf, sizeof(buf)); - } - int numframes = animbones.length() / skel->numbones; - dualquat *framebones = new dualquat[(skel->numframes+numframes)*skel->numbones]; - if(skel->framebones) - { - memcpy(framebones, skel->framebones, skel->numframes*skel->numbones*sizeof(dualquat)); - delete[] skel->framebones; - } - memcpy(&framebones[skel->numframes*skel->numbones], animbones.getbuf(), numframes*skel->numbones*sizeof(dualquat)); - skel->framebones = framebones; - sa = &skel->addskelanim(filename); - sa->frame = skel->numframes; - sa->range = numframes; - skel->numframes += numframes; - - delete f; - - return sa; - } - - bool load(const char *meshfile) - { - name = newstring(meshfile); - - if(!loadmesh(meshfile)) return false; - - return true; - } - }; - - meshgroup *loadmeshes(const char *name, va_list args) - { - smdmeshgroup *group = new smdmeshgroup; - group->shareskeleton(va_arg(args, char *)); - if(!group->load(name)) { delete group; return NULL; } - return group; - } - - bool loaddefaultparts() - { - skelpart &mdl = addpart(); - mdl.pitchscale = mdl.pitchoffset = mdl.pitchmin = mdl.pitchmax = 0; - adjustments.setsize(0); - const char *fname = name + strlen(name); - do --fname; while(fname >= name && *fname!='/' && *fname!='\\'); - fname++; - defformatstring(meshname, "packages/models/%s/%s.smd", name, fname); - mdl.meshes = sharemeshes(path(meshname), NULL); - if(!mdl.meshes) return false; - mdl.initanimparts(); - mdl.initskins(); - return true; - } -}; - -static inline uint hthash(const smd::smdmeshgroup::smdvertkey &k) -{ - return hthash(k.pos); -} - -static inline bool htcmp(const smd::smdmeshgroup::smdvertkey &k, int index) -{ - if(!k.mesh->verts.inrange(index)) return false; - const smd::vert &v = k.mesh->verts[index]; - return k.pos == v.pos && k.norm == v.norm && k.tc == v.tc && k.blend == v.blend; -} - -skelcommands<smd> smdcommands; - |
