summaryrefslogtreecommitdiff
path: root/src/engine/rendermodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/rendermodel.cpp')
-rw-r--r--src/engine/rendermodel.cpp203
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 &center, 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 &center, 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);
}