From 0a1172b75f571685c264a8b9d8ee224bbf11381f Mon Sep 17 00:00:00 2001 From: xolatile Date: Wed, 6 Aug 2025 22:54:55 +0200 Subject: Please do not hate me, it makes sense... --- src/engine/rendermodel.cpp | 450 +++++++++++++++------------------------------ 1 file changed, 145 insertions(+), 305 deletions(-) (limited to 'src/engine/rendermodel.cpp') diff --git a/src/engine/rendermodel.cpp b/src/engine/rendermodel.cpp index 9f2aba9..bc93caa 100644 --- a/src/engine/rendermodel.cpp +++ b/src/engine/rendermodel.cpp @@ -7,60 +7,52 @@ model *loadingmodel = NULL; #include "ragdoll.h" #include "animmodel.h" -#include "vertmodel.h" #include "skelmodel.h" static model *(__cdecl *modeltypes[NUMMODELTYPES])(const char *); -static int addmodeltype(int type, model *(__cdecl *loader)(const char *)) -{ +static int addmodeltype(int type, model *(__cdecl *loader)(const char *)) { modeltypes[type] = loader; return type; } #define MODELTYPE(modeltype, modelclass) \ -static model *__loadmodel__##modelclass(const char *filename) \ -{ \ +static model *__loadmodel__##modelclass(const char *filename) { \ + \ return new modelclass(filename); \ } \ UNUSED static int __dummy__##modelclass = addmodeltype((modeltype), __loadmodel__##modelclass); -#include "md3.h" #include "md5.h" #include "iqm.h" -MODELTYPE(MDL_MD3, md3); MODELTYPE(MDL_MD5, md5); MODELTYPE(MDL_IQM, iqm); #define checkmdl if(!loadingmodel) { conoutf(CON_ERROR, "not loading a model"); return; } -void mdlcullface(int *cullface) -{ +void mdlcullface(int *cullface) { checkmdl; loadingmodel->setcullface(*cullface!=0); } COMMAND(mdlcullface, "i"); -void mdlcollide(int *collide) -{ +void mdlcollide(int *collide) { checkmdl; loadingmodel->collide = *collide!=0; } COMMAND(mdlcollide, "i"); -void mdlellipsecollide(int *collide) -{ +void mdlellipsecollide(int *collide) { checkmdl; loadingmodel->ellipsecollide = *collide!=0; } COMMAND(mdlellipsecollide, "i"); -void mdlspec(int *percent) -{ +void mdlspec(int *percent) { checkmdl; float spec = 1.0f; if(*percent>0) spec = *percent/100.0f; @@ -70,8 +62,7 @@ void mdlspec(int *percent) COMMAND(mdlspec, "i"); -void mdlambient(int *percent) -{ +void mdlambient(int *percent) { checkmdl; float ambient = 0.3f; if(*percent>0) ambient = *percent/100.0f; @@ -81,56 +72,49 @@ void mdlambient(int *percent) COMMAND(mdlambient, "i"); -void mdlalphatest(float *cutoff) -{ +void mdlalphatest(float *cutoff) { checkmdl; loadingmodel->setalphatest(max(0.0f, min(1.0f, *cutoff))); } COMMAND(mdlalphatest, "f"); -void mdlalphablend(int *blend) -{ +void mdlalphablend(int *blend) { checkmdl; loadingmodel->setalphablend(*blend!=0); } COMMAND(mdlalphablend, "i"); -void mdlalphadepth(int *depth) -{ +void mdlalphadepth(int *depth) { checkmdl; loadingmodel->alphadepth = *depth!=0; } COMMAND(mdlalphadepth, "i"); -void mdldepthoffset(int *offset) -{ +void mdldepthoffset(int *offset) { checkmdl; loadingmodel->depthoffset = *offset!=0; } COMMAND(mdldepthoffset, "i"); -void mdlfullbright(float *fullbright) -{ +void mdlfullbright(float *fullbright) { checkmdl; loadingmodel->setfullbright(*fullbright); } COMMAND(mdlfullbright, "f"); -void mdlshader(char *shader) -{ +void mdlshader(char *shader) { checkmdl; loadingmodel->setshader(lookupshaderbyname(shader)); } COMMAND(mdlshader, "s"); -void mdlspin(float *yaw, float *pitch) -{ +void mdlspin(float *yaw, float *pitch) { checkmdl; loadingmodel->spinyaw = *yaw; loadingmodel->spinpitch = *pitch; @@ -138,8 +122,7 @@ void mdlspin(float *yaw, float *pitch) COMMAND(mdlspin, "ff"); -void mdlscale(int *percent) -{ +void mdlscale(int *percent) { checkmdl; float scale = 1.0f; if(*percent>0) scale = *percent/100.0f; @@ -148,40 +131,35 @@ void mdlscale(int *percent) COMMAND(mdlscale, "i"); -void mdltrans(float *x, float *y, float *z) -{ +void mdltrans(float *x, float *y, float *z) { checkmdl; loadingmodel->translate = vec(*x, *y, *z); } COMMAND(mdltrans, "fff"); -void mdlyaw(float *angle) -{ +void mdlyaw(float *angle) { checkmdl; loadingmodel->offsetyaw = *angle; } COMMAND(mdlyaw, "f"); -void mdlpitch(float *angle) -{ +void mdlpitch(float *angle) { checkmdl; loadingmodel->offsetpitch = *angle; } COMMAND(mdlpitch, "f"); -void mdlshadow(int *shadow) -{ +void mdlshadow(int *shadow) { checkmdl; loadingmodel->shadow = *shadow!=0; } COMMAND(mdlshadow, "i"); -void mdlbb(float *rad, float *h, float *eyeheight) -{ +void mdlbb(float *rad, float *h, float *eyeheight) { checkmdl; loadingmodel->collidexyradius = *rad; loadingmodel->collideheight = *h; @@ -190,16 +168,14 @@ void mdlbb(float *rad, float *h, float *eyeheight) COMMAND(mdlbb, "fff"); -void mdlextendbb(float *x, float *y, float *z) -{ +void mdlextendbb(float *x, float *y, float *z) { checkmdl; loadingmodel->bbextend = vec(*x, *y, *z); } COMMAND(mdlextendbb, "fff"); -void mdlname() -{ +void mdlname() { checkmdl; result(loadingmodel->name); } @@ -219,8 +195,7 @@ COMMAND(mdlname, ""); if(ragdoll->loaded) return; -void rdvert(float *x, float *y, float *z, float *radius) -{ +void rdvert(float *x, float *y, float *z, float *radius) { checkragdoll; ragdollskel::vert &v = ragdoll->verts.add(); v.pos = vec(*x, *y, *z); @@ -228,15 +203,13 @@ void rdvert(float *x, float *y, float *z, float *radius) } COMMAND(rdvert, "ffff"); -void rdeye(int *v) -{ +void rdeye(int *v) { checkragdoll; ragdoll->eye = *v; } COMMAND(rdeye, "i"); -void rdtri(int *v1, int *v2, int *v3) -{ +void rdtri(int *v1, int *v2, int *v3) { checkragdoll; ragdollskel::tri &t = ragdoll->tris.add(); t.vert[0] = *v1; @@ -245,8 +218,7 @@ void rdtri(int *v1, int *v2, int *v3) } COMMAND(rdtri, "iii"); -void rdjoint(int *n, int *t, int *v1, int *v2, int *v3) -{ +void rdjoint(int *n, int *t, int *v1, int *v2, int *v3) { checkragdoll; if(*n < 0 || *n >= skel->numbones) return; ragdollskel::joint &j = ragdoll->joints.add(); @@ -258,8 +230,7 @@ void rdjoint(int *n, int *t, int *v1, int *v2, int *v3) } COMMAND(rdjoint, "iibbb"); -void rdlimitdist(int *v1, int *v2, float *mindist, float *maxdist) -{ +void rdlimitdist(int *v1, int *v2, float *mindist, float *maxdist) { checkragdoll; ragdollskel::distlimit &d = ragdoll->distlimits.add(); d.vert[0] = *v1; @@ -269,8 +240,7 @@ void rdlimitdist(int *v1, int *v2, float *mindist, float *maxdist) } COMMAND(rdlimitdist, "iiff"); -void rdlimitrot(int *t1, int *t2, float *maxangle, float *qx, float *qy, float *qz, float *qw) -{ +void rdlimitrot(int *t1, int *t2, float *maxangle, float *qx, float *qy, float *qz, float *qw) { checkragdoll; ragdollskel::rotlimit &r = ragdoll->rotlimits.add(); r.tri[0] = *t1; @@ -280,8 +250,7 @@ void rdlimitrot(int *t1, int *t2, float *maxangle, float *qx, float *qy, float * } COMMAND(rdlimitrot, "iifffff"); -void rdanimjoints(int *on) -{ +void rdanimjoints(int *on) { checkragdoll; ragdoll->animjoints = *on!=0; } @@ -291,20 +260,17 @@ COMMAND(rdanimjoints, "i"); vector mapmodels; -void mmodel(char *name) -{ +void mmodel(char *name) { mapmodelinfo &mmi = mapmodels.add(); copystring(mmi.name, name); mmi.m = NULL; } -void mapmodelcompat(int *rad, int *h, int *tex, char *name, char *shadow) -{ +void mapmodelcompat(int *rad, int *h, int *tex, char *name, char *shadow) { mmodel(name); } -void mapmodelreset(int *n) -{ +void mapmodelreset(int *n) { if(!(identflags&IDF_OVERRIDDEN) && !game::allowedittoggle()) return; mapmodels.shrink(clamp(*n, 0, mapmodels.length())); } @@ -325,21 +291,17 @@ ICOMMAND(mapmodelfind, "s", (char *name), { int found = -1; loopv(mapmodels) if( hashnameset models; vector preloadmodels; -void preloadmodel(const char *name) -{ +void preloadmodel(const char *name) { if(!name || !name[0] || models.access(name)) return; preloadmodels.add(newstring(name)); } -void flushpreloadedmodels(bool msg) -{ - loopv(preloadmodels) - { +void flushpreloadedmodels(bool msg) { + loopv(preloadmodels) { loadprogress = float(i+1)/preloadmodels.length(); model *m = loadmodel(preloadmodels[i], -1, msg); if(!m) { if(msg) conoutf(CON_WARN, "could not load model: %s", preloadmodels[i]); } - else - { + else { m->preloadmeshes(); } } @@ -347,25 +309,20 @@ void flushpreloadedmodels(bool msg) loadprogress = 0; } -void preloadusedmapmodels(bool msg, bool bih) -{ +void preloadusedmapmodels(bool msg, bool bih) { vector &ents = entities::getents(); vector mapmodels; - loopv(ents) - { + loopv(ents) { extentity &e = *ents[i]; if(e.type==ET_MAPMODEL && e.attr2 >= 0 && mapmodels.find(e.attr2) < 0) mapmodels.add(e.attr2); } - - loopv(mapmodels) - { + loopv(mapmodels) { loadprogress = float(i+1)/mapmodels.length(); int mmindex = mapmodels[i]; mapmodelinfo *mmi = getmminfo(mmindex); if(!mmi) { if(msg) conoutf(CON_WARN, "could not find map model: %d", mmindex); } else if(mmi->name[0] && !loadmodel(NULL, mmindex, msg)) { if(msg) conoutf(CON_WARN, "could not load model: %s", mmi->name); } - else if(mmi->m) - { + else if(mmi->m) { if(bih) mmi->m->preloadBIH(); mmi->m->preloadmeshes(); } @@ -373,15 +330,12 @@ void preloadusedmapmodels(bool msg, bool bih) loadprogress = 0; } -bool modelloaded(const char *name) -{ +bool modelloaded(const char *name) { return models.find(name, NULL) != NULL; } -model *loadmodel(const char *name, int i, bool msg) -{ - if(!name) - { +model *loadmodel(const char *name, int i, bool msg) { + if(!name) { if(!mapmodels.inrange(i)) return NULL; mapmodelinfo &mmi = mapmodels[i]; if(mmi.m) return mmi.m; @@ -390,16 +344,13 @@ model *loadmodel(const char *name, int i, bool msg) model **mm = models.access(name); model *m; if(mm) m = *mm; - else - { + else { if(!name[0] || loadingmodel || lightmapping > 1) return NULL; - if(msg) - { + if(msg) { defformatstring(filename, "packages/models/%s", name); renderprogress(loadprogress, filename); } - loopi(NUMMODELTYPES) - { + loopi(NUMMODELTYPES) { m = modeltypes[i](name); if(!m) continue; loadingmodel = m; @@ -415,24 +366,20 @@ model *loadmodel(const char *name, int i, bool msg) return m; } -void preloadmodelshaders(bool force) -{ +void preloadmodelshaders() { if(initing) return; - enumerate(models, model *, m, m->preloadshaders(force)); + enumerate(models, model *, m, m->preloadshaders()); } -void clear_mdls() -{ +void clear_mdls() { enumerate(models, model *, m, delete m); } -void cleanupmodels() -{ +void cleanupmodels() { enumerate(models, model *, m, m->cleanup()); } -void clearmodel(char *name) -{ +void clearmodel(char *name) { model **m = models.access(name); if(!m) { conoutf(CON_WARN, "model %s is not loaded", name); return; } loopv(mapmodels) if(mapmodels[i].m==*m) mapmodels[i].m = NULL; @@ -444,16 +391,14 @@ void clearmodel(char *name) COMMAND(clearmodel, "s"); -bool modeloccluded(const vec ¢er, float radius) -{ +bool modeloccluded(const vec ¢er, float radius) { ivec bbmin(vec(center).sub(radius)), bbmax(ivec(center).add(radius+1)); return bboccluded(bbmin, bbmax); } VAR(showboundingbox, 0, 0, 2); -void render2dbox(vec &o, float x, float y, float z) -{ +void render2dbox(vec &o, float x, float y, float z) { gle::begin(GL_LINE_LOOP); gle::attribf(o.x, o.y, o.z); gle::attribf(o.x, o.y, o.z+z); @@ -462,8 +407,7 @@ void render2dbox(vec &o, float x, float y, float z) xtraverts += gle::end(); } -void render3dbox(vec &o, float tofloor, float toceil, float xradius, float yradius) -{ +void render3dbox(vec &o, float tofloor, float toceil, float xradius, float yradius) { if(yradius<=0) yradius = xradius; vec c = o; c.sub(vec(xradius, yradius, tofloor)); @@ -478,21 +422,18 @@ void render3dbox(vec &o, float tofloor, float toceil, float xradius, float yradi render2dbox(c, 0, -ysz, h); } -void renderellipse(vec &o, float xradius, float yradius, float yaw) -{ +void renderellipse(vec &o, float xradius, float yradius, float yaw) { gle::colorf(0.5f, 0.5f, 0.5f); gle::defvertex(); gle::begin(GL_LINE_LOOP); - loopi(15) - { + loopi(15) { const vec2 &sc = sincos360[i*(360/15)]; gle::attrib(vec(xradius*sc.x, yradius*sc.y, 0).rotate_around_z((yaw+90)*RAD).add(o)); } xtraverts += gle::end(); } -struct batchedmodel -{ +struct batchedmodel { vec pos, color, dir; int anim; float yaw, pitch, transparent; @@ -501,8 +442,7 @@ struct batchedmodel int attached; occludequery *query; }; -struct modelbatch -{ +struct modelbatch { model *m; int flags; vector batched; @@ -512,20 +452,16 @@ static vector modelattached; static int numbatches = -1; static occludequery *modelquery = NULL; -void startmodelbatches() -{ +void startmodelbatches() { numbatches = 0; modelattached.setsize(0); } -modelbatch &addbatchedmodel(model *m) -{ +modelbatch &addbatchedmodel(model *m) { modelbatch *b = NULL; if(m->batch>=0 && m->batchbatch]->m==m) b = batches[m->batch]; - else - { - if(numbatchesbatched.setsize(0); } @@ -537,75 +473,59 @@ modelbatch &addbatchedmodel(model *m) return *b; } -void renderbatchedmodel(model *m, batchedmodel &b) -{ +void renderbatchedmodel(model *m, batchedmodel &b) { modelattach *a = NULL; if(b.attached>=0) a = &modelattached[b.attached]; - int anim = b.anim; - if(shadowmapping) - { + if(shadowmapping) { anim |= ANIM_NOSKIN; GLOBALPARAMF(shadowintensity, b.transparent); } - else - { + else { if(b.flags&MDL_FULLBRIGHT) anim |= ANIM_FULLBRIGHT; if(b.flags&MDL_GHOST) anim |= ANIM_GHOST; } - m->render(anim, b.basetime, b.basetime2, b.pos, b.yaw, b.pitch, b.d, a, b.color, b.dir, b.transparent); } -struct transparentmodel -{ +struct transparentmodel { model *m; batchedmodel *batched; float dist; }; -static inline bool sorttransparentmodels(const transparentmodel &x, const transparentmodel &y) -{ +static inline bool sorttransparentmodels(const transparentmodel &x, const transparentmodel &y) { return x.dist < y.dist; } -void endmodelbatches() -{ +void endmodelbatches() { vector transparent; - loopi(numbatches) - { + loopi(numbatches) { modelbatch &b = *batches[i]; if(b.batched.empty()) continue; - bool rendered = false; occludequery *query = NULL; - if(b.flags&MDL_GHOST) - { - loopvj(b.batched) - { + if(b.flags&MDL_GHOST) { + loopvj(b.batched) { batchedmodel &bm = b.batched[j]; if((bm.flags&(MDL_CULL_VFC|MDL_GHOST))!=MDL_GHOST || bm.query) continue; if(!rendered) { b.m->startrender(); rendered = true; } renderbatchedmodel(b.m, bm); } - if(rendered) - { + if(rendered) { b.m->endrender(); rendered = false; } } - loopvj(b.batched) - { + loopvj(b.batched) { batchedmodel &bm = b.batched[j]; if(bm.flags&(MDL_CULL_VFC|MDL_GHOST)) continue; - if(bm.query!=query) - { + if(bm.query!=query) { if(query) endquery(query); query = bm.query; if(query) startquery(query); } - if(bm.transparent < 1 && (!query || query->owner==bm.d) && !shadowmapping) - { + if(bm.transparent < 1 && (!query || query->owner==bm.d) && !shadowmapping) { transparentmodel &tm = transparent.add(); tm.m = b.m; tm.batched = &bm; @@ -618,21 +538,17 @@ void endmodelbatches() if(query) endquery(query); if(rendered) b.m->endrender(); } - if(transparent.length()) - { + if(transparent.length()) { transparent.sort(sorttransparentmodels); model *lastmodel = NULL; occludequery *query = NULL; - loopv(transparent) - { + loopv(transparent) { transparentmodel &tm = transparent[i]; - if(lastmodel!=tm.m) - { + if(lastmodel!=tm.m) { if(lastmodel) lastmodel->endrender(); (lastmodel = tm.m)->startrender(); } - if(query!=tm.batched->query) - { + if(query!=tm.batched->query) { if(query) endquery(query); query = tm.batched->query; if(query) startquery(query); @@ -645,35 +561,29 @@ void endmodelbatches() numbatches = -1; } -void startmodelquery(occludequery *query) -{ +void startmodelquery(occludequery *query) { modelquery = query; } -void endmodelquery() -{ +void endmodelquery() { int querybatches = 0; - loopi(numbatches) - { + loopi(numbatches) { modelbatch &b = *batches[i]; if(b.batched.empty() || b.batched.last().query!=modelquery) continue; querybatches++; } - if(querybatches<=1) - { + if(querybatches<=1) { if(!querybatches) modelquery->fragments = 0; modelquery = NULL; return; } int minattached = modelattached.length(); startquery(modelquery); - loopi(numbatches) - { + loopi(numbatches) { modelbatch &b = *batches[i]; if(b.batched.empty() || b.batched.last().query!=modelquery) continue; b.m->startrender(); - do - { + do { batchedmodel &bm = b.batched.pop(); if(bm.attached>=0) minattached = min(minattached, bm.attached); renderbatchedmodel(b.m, bm); @@ -688,17 +598,14 @@ void endmodelquery() VAR(maxmodelradiusdistance, 10, 200, 1000); -static inline void enablecullmodelquery() -{ +static inline void enablecullmodelquery() { startbb(); } -static inline void rendercullmodelquery(model *m, dynent *d, const vec ¢er, float radius) -{ +static inline void rendercullmodelquery(model *m, dynent *d, const vec ¢er, float radius) { if(fabs(camera1->o.x-center.x) < radius+1 && fabs(camera1->o.y-center.y) < radius+1 && - fabs(camera1->o.z-center.z) < radius+1) - { + fabs(camera1->o.z-center.z) < radius+1) { d->query = NULL; return; } @@ -710,95 +617,73 @@ static inline void rendercullmodelquery(model *m, dynent *d, const vec ¢er, endquery(d->query); } -static inline void disablecullmodelquery() -{ +static inline void disablecullmodelquery() { endbb(); } -static inline int cullmodel(model *m, const vec ¢er, float radius, int flags, dynent *d = NULL, bool shadow = false) -{ +static inline int cullmodel(model *m, const vec ¢er, float radius, int flags, dynent *d = NULL, bool shadow = false) { if(flags&MDL_CULL_DIST && center.dist(camera1->o)/radius>maxmodelradiusdistance) return MDL_CULL_DIST; - if(flags&MDL_CULL_VFC) - { + if(flags&MDL_CULL_VFC) { if(shadowmapping && !isshadowmapcaster(center, radius)) return MDL_CULL_VFC; } - if(shadowmapping) - { - if(d) - { + if(shadowmapping) { + if(d) { if(flags&MDL_CULL_OCCLUDED && d->occluded>=OCCLUDE_PARENT) return MDL_CULL_OCCLUDED; if(flags&MDL_CULL_QUERY && d->occluded+1>=OCCLUDE_BB && d->query && d->query->owner==d && checkquery(d->query)) return MDL_CULL_QUERY; } if(!addshadowmapcaster(center, radius, radius)) return MDL_CULL_VFC; } - else if(flags&MDL_CULL_OCCLUDED && modeloccluded(center, radius)) - { + else if(flags&MDL_CULL_OCCLUDED && modeloccluded(center, radius)) { if(d) d->occluded = OCCLUDE_PARENT; return MDL_CULL_OCCLUDED; } - else if(flags&MDL_CULL_QUERY && d->query && d->query->owner==d && checkquery(d->query)) - { + else if(flags&MDL_CULL_QUERY && d->query && d->query->owner==d && checkquery(d->query)) { if(d->occludedoccluded++; return MDL_CULL_QUERY; } return 0; } -void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, float yaw, float pitch, int flags, dynent *d, modelattach *a, int basetime, int basetime2, float trans) -{ +void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, float yaw, float pitch, int flags, dynent *d, modelattach *a, int basetime, int basetime2, float trans) { if(shadowmapping && !(flags&(MDL_SHADOW|MDL_DYNSHADOW))) return; model *m = loadmodel(mdl); if(!m) return; vec center(0, 0, 0), bbradius(0, 0, 0); float radius = 0; bool shadow = !shadowmap && (flags&(MDL_SHADOW|MDL_DYNSHADOW)); - - if(flags&(MDL_CULL_VFC|MDL_CULL_DIST|MDL_CULL_OCCLUDED|MDL_CULL_QUERY|MDL_SHADOW|MDL_DYNSHADOW)) - { - if(flags&MDL_CULL_QUERY) - { + if(flags&(MDL_CULL_VFC|MDL_CULL_DIST|MDL_CULL_OCCLUDED|MDL_CULL_QUERY|MDL_SHADOW|MDL_DYNSHADOW)) { + if(flags&MDL_CULL_QUERY) { if(!oqfrags || !oqdynent || !d) flags &= ~MDL_CULL_QUERY; } - m->boundbox(center, bbradius); radius = bbradius.magnitude(); - if(d && d->ragdoll) - { + if(d && d->ragdoll) { radius = max(radius, d->ragdoll->radius); center = d->ragdoll->center; } - else - { + else { center.rotate_around_z(yaw*RAD); center.add(o); } - int culled = cullmodel(m, center, radius, flags, d, shadow); - if(culled) - { - if(culled&(MDL_CULL_OCCLUDED|MDL_CULL_QUERY) && flags&MDL_CULL_QUERY) - { + if(culled) { + if(culled&(MDL_CULL_OCCLUDED|MDL_CULL_QUERY) && flags&MDL_CULL_QUERY) { enablecullmodelquery(); rendercullmodelquery(m, d, center, radius); disablecullmodelquery(); } return; } - if(shadowmapping) flags &= ~MDL_CULL_QUERY; } - if(flags&MDL_NORENDER) anim |= ANIM_NORENDER; - else if(showboundingbox && !shadowmapping && editmode) - { + else if(showboundingbox && !shadowmapping && editmode) { notextureshader->set(); - if(d && showboundingbox==1) - { + if(d && showboundingbox==1) { render3dbox(d->o, d->eyeheight, d->aboveeye, d->radius); renderellipse(d->o, d->xradius, d->yradius, d->yaw); } - else - { + else { vec center, radius; if(showboundingbox==1) m->collisionbox(center, radius); else m->boundbox(center, radius); @@ -807,19 +692,14 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl render3dbox(center, radius.z, radius.z, radius.x, radius.y); } } - vec lightcolor(1, 1, 1), lightdir(0, 0, 1); - if(!shadowmapping) - { + if(!shadowmapping) { vec pos = o; - if(d) - { + if(d) { d->occluded = OCCLUDE_NOTHING; if(!light) light = &d->light; - if(flags&MDL_LIGHT && light->millis!=lastmillis) - { - if(d->ragdoll) - { + if(flags&MDL_LIGHT && light->millis!=lastmillis) { + if(d->ragdoll) { pos = d->ragdoll->center; pos.z += radius/2; } @@ -830,15 +710,12 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl light->millis = lastmillis; } } - else if(flags&MDL_LIGHT) - { - if(!light) - { + else if(flags&MDL_LIGHT) { + if(!light) { lightreaching(pos, lightcolor, lightdir, (flags&MDL_LIGHT_FAST)!=0); dynlightreaching(pos, lightcolor, lightdir, (flags&MDL_HUD)!=0); } - else if(light->millis!=lastmillis) - { + else if(light->millis!=lastmillis) { lightreaching(pos, light->color, light->dir, (flags&MDL_LIGHT_FAST)!=0); dynlightreaching(pos, light->color, light->dir, (flags&MDL_HUD)!=0); light->millis = lastmillis; @@ -847,15 +724,11 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl if(light) { lightcolor = light->color; lightdir = light->dir; } if(flags&MDL_DYNLIGHT) dynlightreaching(pos, lightcolor, lightdir, (flags&MDL_HUD)!=0); } - - if(a) for(int i = 0; a[i].tag; i++) - { + if(a) for(int i = 0; a[i].tag; i++) { if(a[i].name) a[i].m = loadmodel(a[i].name); //if(a[i].m && a[i].m->type()!=m->type()) a[i].m = NULL; } - - if(numbatches>=0) - { + if(numbatches>=0) { modelbatch &mb = addbatchedmodel(m); batchedmodel &b = mb.batched.add(); b.query = modelquery; @@ -869,8 +742,7 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl b.basetime2 = basetime2; b.transparent = trans; b.flags = flags & ~(MDL_CULL_VFC | MDL_CULL_DIST | MDL_CULL_OCCLUDED); - if(!shadow) - { + if(!shadow) { b.flags &= ~(MDL_SHADOW|MDL_DYNSHADOW); if(flags&MDL_CULL_VFC) b.flags |= MDL_CULL_VFC; } @@ -881,52 +753,38 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl if(flags&MDL_CULL_QUERY) d->query = b.query = newquery(d); return; } - m->startrender(); - - if(shadowmapping) - { + if(shadowmapping) { anim |= ANIM_NOSKIN; GLOBALPARAMF(shadowintensity, trans); } - else - { + else { if(flags&MDL_FULLBRIGHT) anim |= ANIM_FULLBRIGHT; if(flags&MDL_GHOST) anim |= ANIM_GHOST; } - - if(flags&MDL_CULL_QUERY) - { + if(flags&MDL_CULL_QUERY) { d->query = newquery(d); if(d->query) startquery(d->query); } - m->render(anim, basetime, basetime2, o, yaw, pitch, d, a, lightcolor, lightdir, trans); - if(flags&MDL_CULL_QUERY && d->query) endquery(d->query); - m->endrender(); } -void abovemodel(vec &o, const char *mdl) -{ +void abovemodel(vec &o, const char *mdl) { model *m = loadmodel(mdl); if(!m) return; o.z += m->above(); } -bool matchanim(const char *name, const char *pattern) -{ - for(;; pattern++) - { +bool matchanim(const char *name, const char *pattern) { + for(;; pattern++) { const char *s = name; char c; - for(;; pattern++) - { + for(;; pattern++) { c = *pattern; if(!c || c=='|') break; - else if(c=='*') - { + else if(c=='*') { if(!*s || iscubespace(*s)) break; do s++; while(*s && !iscubespace(*s)); } @@ -940,19 +798,16 @@ bool matchanim(const char *name, const char *pattern) return false; } -void findanims(const char *pattern, vector &anims) -{ +void findanims(const char *pattern, vector &anims) { loopi(sizeof(animnames)/sizeof(animnames[0])) if(matchanim(animnames[i], pattern)) anims.add(i); } -ICOMMAND(findanims, "s", (char *name), -{ +ICOMMAND(findanims, "s", (char *name), { vector anims; findanims(name, anims); vector buf; string num; - loopv(anims) - { + loopv(anims) { formatstring(num, "%d", anims[i]); if(i > 0) buf.add(' '); buf.put(num, strlen(num)); @@ -961,21 +816,19 @@ ICOMMAND(findanims, "s", (char *name), result(buf.getbuf()); }); -void loadskin(const char *dir, const char *altdir, Texture *&skin, Texture *&masks) // model skin sharing -{ +void loadskin(const char *dir, const char *altdir, Texture *&skin, Texture *&masks) { // model skin sharing { #define ifnoload(tex, path) if((tex = textureload(path, 0, true, false))==notexture) #define tryload(tex, prefix, cmd, name) \ - ifnoload(tex, makerelpath(mdir, name ".jpg", prefix, cmd)) \ - { \ - ifnoload(tex, makerelpath(mdir, name ".png", prefix, cmd)) \ - { \ - ifnoload(tex, makerelpath(maltdir, name ".jpg", prefix, cmd)) \ - { \ + ifnoload(tex, makerelpath(mdir, name ".jpg", prefix, cmd)) { \ + \ + ifnoload(tex, makerelpath(mdir, name ".png", prefix, cmd)) { \ + \ + ifnoload(tex, makerelpath(maltdir, name ".jpg", prefix, cmd)) { \ + \ ifnoload(tex, makerelpath(maltdir, name ".png", prefix, cmd)) return; \ } \ } \ } - defformatstring(mdir, "packages/models/%s", dir); defformatstring(maltdir, "packages/models/%s", altdir); masks = notexture; @@ -989,22 +842,18 @@ VAR(animoverride, -1, 0, NUMANIMS-1); VAR(testanims, 0, 0, 1); VAR(testpitch, -90, 0, 90); -void renderclient(dynent *d, const char *mdlname, modelattach *attachments, int hold, int attack, int attackdelay, int lastaction, int lastpain, float fade, bool ragdoll) -{ +void renderclient(dynent *d, const char *mdlname, modelattach *attachments, int hold, int attack, int attackdelay, int lastaction, int lastpain, float fade, bool ragdoll) { int anim = hold ? hold : ANIM_IDLE|ANIM_LOOP; float yaw = testanims && d==player ? 0 : d->yaw+90, pitch = testpitch && d==player ? testpitch : d->pitch; vec o = d->feetpos(); int basetime = 0; if(animoverride) anim = (animoverride<0 ? ANIM_ALL : animoverride)|ANIM_LOOP; - else if(d->state==CS_DEAD) - { + else if(d->state==CS_DEAD) { anim = ANIM_DYING|ANIM_NOPITCH; basetime = lastpain; - if(ragdoll) - { - if(!d->ragdoll || d->ragdoll->millis < basetime) - { + if(ragdoll) { + if(!d->ragdoll || d->ragdoll->millis < basetime) { DELETEP(d->ragdoll); anim |= ANIM_RAGDOLL; } @@ -1013,32 +862,25 @@ void renderclient(dynent *d, const char *mdlname, modelattach *attachments, int } else if(d->state==CS_EDITING || d->state==CS_SPECTATOR) anim = ANIM_EDIT|ANIM_LOOP; else if(d->state==CS_LAGGED) anim = ANIM_LAG|ANIM_LOOP; - else - { - if(lastmillis-lastpain < 300) - { + else { + if(lastmillis-lastpain < 300) { anim = ANIM_PAIN; basetime = lastpain; } - else if(lastpain < lastaction && (attack < 0 || (d->type != ENT_AI && lastmillis-lastaction < attackdelay))) - { + else if(lastpain < lastaction && (attack < 0 || (d->type != ENT_AI && lastmillis-lastaction < attackdelay))) { anim = attack < 0 ? -attack : attack; basetime = lastaction; } - if(d->inwater && d->physstate<=PHYS_FALL) anim |= (((game::allowmove(d) && (d->move || d->strafe)) || d->vel.z+d->falling.z>0 ? ANIM_SWIM : ANIM_SINK)|ANIM_LOOP)<timeinair>100) anim |= (ANIM_JUMP|ANIM_END)<move || d->strafe)) - { + else if(game::allowmove(d) && (d->move || d->strafe)) { if(d->move>0) anim |= (ANIM_FORWARD|ANIM_LOOP)<strafe) - { + else if(d->strafe) { if(d->move<0) anim |= ((d->strafe>0 ? ANIM_RIGHT : ANIM_LEFT)|ANIM_REVERSE|ANIM_LOOP)<strafe>0 ? ANIM_LEFT : ANIM_RIGHT)|ANIM_LOOP)<move<0) anim |= (ANIM_BACKWARD|ANIM_LOOP)<>ANIM_SECONDARY)&ANIM_INDEX) anim >>= ANIM_SECONDARY; } if(d->ragdoll && (!ragdoll || (anim&ANIM_INDEX)!=ANIM_DYING)) DELETEP(d->ragdoll); @@ -1053,8 +895,7 @@ void renderclient(dynent *d, const char *mdlname, modelattach *attachments, int rendermodel(NULL, mdlname, anim, o, yaw, pitch, flags, d, attachments, basetime, 0, fade); } -void setbbfrommodel(dynent *d, const char *mdl) -{ +void setbbfrommodel(dynent *d, const char *mdl) { model *m = loadmodel(mdl); if(!m) return; vec center, radius; @@ -1066,8 +907,7 @@ void setbbfrommodel(dynent *d, const char *mdl) d->radius = d->collidetype==COLLIDE_OBB ? sqrtf(d->xradius*d->xradius + d->yradius*d->yradius) : max(d->xradius, d->yradius); d->eyeheight = (center.z-radius.z) + radius.z*2*m->eyeheight; d->aboveeye = radius.z*2*(1.0f-m->eyeheight); - if (d->aboveeye + d->eyeheight <= 0.5f) - { + if (d->aboveeye + d->eyeheight <= 0.5f) { float zrad = (0.5f - (d->aboveeye + d->eyeheight)) / 2; d->aboveeye += zrad; d->eyeheight += zrad; -- cgit v1.2.3