diff options
| author | xolatile | 2025-08-17 18:28:28 +0200 |
|---|---|---|
| committer | xolatile | 2025-08-17 18:28:28 +0200 |
| commit | bffe8d11bd1dfec49280fb64a17f0ae529ac3f5d (patch) | |
| tree | 9f4f7b6f5003585e5a170bd55ccaa335b8f26f90 /src/engine/rendermodel.cpp | |
| parent | bec4167d29a68efd0cd2da36143e7f1c78a119a0 (diff) | |
| download | xolatile-badassbug-master.tar.xz xolatile-badassbug-master.tar.zst | |
Diffstat (limited to 'src/engine/rendermodel.cpp')
| -rw-r--r-- | src/engine/rendermodel.cpp | 203 |
1 files changed, 33 insertions, 170 deletions
diff --git a/src/engine/rendermodel.cpp b/src/engine/rendermodel.cpp index 8174e22..eb75b69 100644 --- a/src/engine/rendermodel.cpp +++ b/src/engine/rendermodel.cpp @@ -5,7 +5,6 @@ VAR(animationinterpolationtime, 0, 150, 1000); model *loadingmodel = NULL; -#include "ragdoll.h" #include "animmodel.h" #include "skelmodel.h" @@ -152,13 +151,6 @@ void mdlpitch(float *angle) { COMMAND(mdlpitch, "f"); -void mdlshadow(int *shadow) { - checkmdl; - loadingmodel->shadow = *shadow!=0; -} - -COMMAND(mdlshadow, "i"); - void mdlbb(float *rad, float *h, float *eyeheight) { checkmdl; loadingmodel->collidexyradius = *rad; @@ -182,79 +174,6 @@ void mdlname() { COMMAND(mdlname, ""); -#define checkragdoll \ - checkmdl; \ - if(!loadingmodel->skeletal()) { conoutf(CON_ERROR, "not loading a skeletal model"); return; } \ - skelmodel *m = (skelmodel *)loadingmodel; \ - if(m->parts.empty()) return; \ - skelmodel::skelmeshgroup *meshes = (skelmodel::skelmeshgroup *)m->parts.last()->meshes; \ - if(!meshes) return; \ - skelmodel::skeleton *skel = meshes->skel; \ - if(!skel->ragdoll) skel->ragdoll = new ragdollskel; \ - ragdollskel *ragdoll = skel->ragdoll; \ - if(ragdoll->loaded) return; - -void rdvert(float *x, float *y, float *z, float *radius) { - checkragdoll; - ragdollskel::vert &v = ragdoll->verts.add(); - v.pos = vec(*x, *y, *z); - v.radius = *radius > 0 ? *radius : 1; -} -COMMAND(rdvert, "ffff"); - -void rdeye(int *v) { - checkragdoll; - ragdoll->eye = *v; -} -COMMAND(rdeye, "i"); - -void rdtri(int *v1, int *v2, int *v3) { - checkragdoll; - ragdollskel::tri &t = ragdoll->tris.add(); - t.vert[0] = *v1; - t.vert[1] = *v2; - t.vert[2] = *v3; -} -COMMAND(rdtri, "iii"); - -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(); - j.bone = *n; - j.tri = *t; - j.vert[0] = *v1; - j.vert[1] = *v2; - j.vert[2] = *v3; -} -COMMAND(rdjoint, "iibbb"); - -void rdlimitdist(int *v1, int *v2, float *mindist, float *maxdist) { - checkragdoll; - ragdollskel::distlimit &d = ragdoll->distlimits.add(); - d.vert[0] = *v1; - d.vert[1] = *v2; - d.mindist = *mindist; - d.maxdist = max(*maxdist, *mindist); -} -COMMAND(rdlimitdist, "iiff"); - -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; - r.tri[1] = *t2; - r.maxangle = *maxangle * RAD; - r.middle = matrix3(quat(*qx, *qy, *qz, *qw)); -} -COMMAND(rdlimitrot, "iifffff"); - -void rdanimjoints(int *on) { - checkragdoll; - ragdoll->animjoints = *on!=0; -} -COMMAND(rdanimjoints, "i"); - // mapmodels vector<mapmodelinfo> mapmodels; @@ -303,7 +222,7 @@ void flushpreloadedmodels(bool msg) { loadprogress = 0; } -void preloadusedmapmodels(bool msg, bool bih) { +void preloadusedmapmodels(bool msg) { vector<extentity *> &ents = entities::getents(); vector<int> mapmodels; loopv(ents) { @@ -317,7 +236,6 @@ void preloadusedmapmodels(bool msg, bool bih) { 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) { - if(bih) mmi->m->preloadBIH(); mmi->m->preloadmeshes(); } } @@ -471,14 +389,8 @@ void renderbatchedmodel(model *m, batchedmodel &b) { modelattach *a = NULL; if(b.attached>=0) a = &modelattached[b.attached]; int anim = b.anim; - if(shadowmapping) { - anim |= ANIM_NOSKIN; - GLOBALPARAMF(shadowintensity, b.transparent); - } - else { - if(b.flags&MDL_FULLBRIGHT) anim |= ANIM_FULLBRIGHT; - if(b.flags&MDL_GHOST) anim |= ANIM_GHOST; - } + 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); } @@ -519,11 +431,10 @@ void endmodelbatches() { 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)) { transparentmodel &tm = transparent.add(); tm.m = b.m; tm.batched = &bm; - tm.dist = camera1->o.dist(bm.d && bm.d->ragdoll ? bm.d->ragdoll->center : bm.pos); continue; } if(!rendered) { b.m->startrender(); rendered = true; } @@ -617,17 +528,7 @@ static inline void disablecullmodelquery() { static inline int cullmodel(const vec ¢er, float radius, int flags, dynent *d = NULL) { if(flags&MDL_CULL_DIST && center.dist(camera1->o)/radius>maxmodelradiusdistance) return MDL_CULL_DIST; - if(flags&MDL_CULL_VFC) { - if(shadowmapping && !isshadowmapcaster(center, radius)) return MDL_CULL_VFC; - } - 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)) { + if(flags&MDL_CULL_OCCLUDED && modeloccluded(center, radius)) { if(d) d->occluded = OCCLUDE_PARENT; return MDL_CULL_OCCLUDED; } @@ -639,26 +540,18 @@ static inline int cullmodel(const vec ¢er, float radius, int flags, dynent * } 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_VFC|MDL_CULL_DIST|MDL_CULL_OCCLUDED|MDL_CULL_QUERY)) { if(flags&MDL_CULL_QUERY) { if(!oqfrags || !oqdynent || !d) flags &= ~MDL_CULL_QUERY; } m->boundbox(center, bbradius); radius = bbradius.magnitude(); - if(d && d->ragdoll) { - radius = max(radius, d->ragdoll->radius); - center = d->ragdoll->center; - } - else { - center.rotate_around_z(yaw*RAD); - center.add(o); - } + center.rotate_around_z(yaw*RAD); + center.add(o); int culled = cullmodel(center, radius, flags, d); if(culled) { if(culled&(MDL_CULL_OCCLUDED|MDL_CULL_QUERY) && flags&MDL_CULL_QUERY) { @@ -668,10 +561,9 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl } return; } - if(shadowmapping) flags &= ~MDL_CULL_QUERY; } if(flags&MDL_NORENDER) anim |= ANIM_NORENDER; - else if(showboundingbox && !shadowmapping && editmode) { + else if(showboundingbox && editmode) { notextureshader->set(); if(d && showboundingbox==1) { render3dbox(d->o, d->eyeheight, d->aboveeye, d->radius); @@ -687,32 +579,26 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl } } vec lightcolor(1, 1, 1), lightdir(0, 0, 1); - if(!shadowmapping) { - vec pos = o; - if(d) { - d->occluded = OCCLUDE_NOTHING; - if(!light) light = &d->light; - if(flags&MDL_LIGHT && light->millis!=lastmillis) { - if(d->ragdoll) { - pos = d->ragdoll->center; - pos.z += radius/2; - } - else if(d->type < ENT_CAMERA) pos.z += 0.75f*(d->eyeheight + d->aboveeye); - lightreaching(pos, light->color, light->dir); - light->millis = lastmillis; - } + vec pos = o; + if(d) { + d->occluded = OCCLUDE_NOTHING; + if(!light) light = &d->light; + if(flags&MDL_LIGHT && light->millis!=lastmillis) { + if(d->type < ENT_CAMERA) pos.z += 0.75f*(d->eyeheight + d->aboveeye); + lightreaching(pos, light->color, light->dir); + light->millis = lastmillis; } - else if(flags&MDL_LIGHT) { - if(!light) { - lightreaching(pos, lightcolor, lightdir); - } - else if(light->millis!=lastmillis) { - lightreaching(pos, light->color, light->dir); - light->millis = lastmillis; - } + } + else if(flags&MDL_LIGHT) { + if(!light) { + lightreaching(pos, lightcolor, lightdir); + } + else if(light->millis!=lastmillis) { + lightreaching(pos, light->color, light->dir); + light->millis = lastmillis; } - if(light) { lightcolor = light->color; lightdir = light->dir; } } + if(light) { lightcolor = light->color; lightdir = light->dir; } 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; @@ -731,10 +617,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) { - b.flags &= ~(MDL_SHADOW|MDL_DYNSHADOW); - if(flags&MDL_CULL_VFC) b.flags |= MDL_CULL_VFC; - } + if(flags&MDL_CULL_VFC) b.flags |= MDL_CULL_VFC; mb.flags |= b.flags; b.d = d; b.attached = a ? modelattached.length() : -1; @@ -743,14 +626,8 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl return; } m->startrender(); - if(shadowmapping) { - anim |= ANIM_NOSKIN; - GLOBALPARAMF(shadowintensity, trans); - } - else { - if(flags&MDL_FULLBRIGHT) anim |= ANIM_FULLBRIGHT; - if(flags&MDL_GHOST) anim |= ANIM_GHOST; - } + if(flags&MDL_FULLBRIGHT) anim |= ANIM_FULLBRIGHT; + if(flags&MDL_GHOST) anim |= ANIM_GHOST; if(flags&MDL_CULL_QUERY) { d->query = newquery(d); if(d->query) startquery(d->query); @@ -760,12 +637,6 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl m->endrender(); } -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++) { const char *s = name; @@ -831,7 +702,7 @@ 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) { int anim = hold ? hold : ANIM_IDLE|ANIM_LOOP; float yaw = testanims && d==player ? 0 : d->yaw+90, pitch = testpitch && d==player ? testpitch : d->pitch; @@ -841,13 +712,7 @@ void renderclient(dynent *d, const char *mdlname, modelattach *attachments, int else if(d->state==CS_DEAD) { anim = ANIM_DYING|ANIM_NOPITCH; basetime = lastpain; - if(ragdoll) { - if(!d->ragdoll || d->ragdoll->millis < basetime) { - DELETEP(d->ragdoll); - anim |= ANIM_RAGDOLL; - } - } - else if(lastmillis-basetime>1000) anim = ANIM_DEAD|ANIM_LOOP|ANIM_NOPITCH; + if(lastmillis-basetime>1000) anim = ANIM_DEAD|ANIM_LOOP|ANIM_NOPITCH; } 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; @@ -872,15 +737,13 @@ void renderclient(dynent *d, const char *mdlname, modelattach *attachments, int } if((anim&ANIM_INDEX)==ANIM_IDLE && (anim>>ANIM_SECONDARY)&ANIM_INDEX) anim >>= ANIM_SECONDARY; } - if(d->ragdoll && (!ragdoll || (anim&ANIM_INDEX)!=ANIM_DYING)) DELETEP(d->ragdoll); if(!((anim>>ANIM_SECONDARY)&ANIM_INDEX)) anim |= (ANIM_IDLE|ANIM_LOOP)<<ANIM_SECONDARY; int flags = MDL_LIGHT; - if(d!=player && !(anim&ANIM_RAGDOLL)) flags |= MDL_CULL_VFC | MDL_CULL_OCCLUDED | MDL_CULL_QUERY; + if(d!=player) flags |= MDL_CULL_VFC | MDL_CULL_OCCLUDED | MDL_CULL_QUERY; if(d->type==ENT_PLAYER) flags |= MDL_FULLBRIGHT; else flags |= MDL_CULL_DIST; if(d->state==CS_LAGGED) fade = min(fade, 0.3f); - else flags |= MDL_DYNSHADOW; - if(drawtex == DRAWTEX_MODELPREVIEW) flags &= ~(MDL_LIGHT | MDL_FULLBRIGHT | MDL_CULL_VFC | MDL_CULL_OCCLUDED | MDL_CULL_QUERY | MDL_CULL_DIST | MDL_DYNSHADOW); + if(drawtex == DRAWTEX_MODELPREVIEW) flags &= ~(MDL_LIGHT | MDL_FULLBRIGHT | MDL_CULL_VFC | MDL_CULL_OCCLUDED | MDL_CULL_QUERY | MDL_CULL_DIST); rendermodel(NULL, mdlname, anim, o, yaw, pitch, flags, d, attachments, basetime, 0, fade); } |
