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.cpp450
1 files changed, 145 insertions, 305 deletions
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<mapmodelinfo> 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<model *> models;
vector<const char *> 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<extentity *> &ents = entities::getents();
vector<int> 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 &center, float radius)
-{
+bool modeloccluded(const vec &center, 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<batchedmodel> batched;
@@ -512,20 +452,16 @@ static vector<modelattach> 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->batch<numbatches && batches[m->batch]->m==m) b = batches[m->batch];
- else
- {
- if(numbatches<batches.length())
- {
+ else {
+ if(numbatches<batches.length()) {
b = batches[numbatches];
b->batched.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<transparentmodel> 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 &center, float radius)
-{
+static inline void rendercullmodelquery(model *m, dynent *d, const vec &center, 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 &center,
endquery(d->query);
}
-static inline void disablecullmodelquery()
-{
+static inline void disablecullmodelquery() {
endbb();
}
-static inline int cullmodel(model *m, const vec &center, float radius, int flags, dynent *d = NULL, bool shadow = false)
-{
+static inline int cullmodel(model *m, const vec &center, 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->occluded<OCCLUDE_BB) d->occluded++;
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<int> &anims)
-{
+void findanims(const char *pattern, vector<int> &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<int> anims;
findanims(name, anims);
vector<char> 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)<<ANIM_SECONDARY;
else if(d->timeinair>100) anim |= (ANIM_JUMP|ANIM_END)<<ANIM_SECONDARY;
- else if(game::allowmove(d) && (d->move || d->strafe))
- {
+ else if(game::allowmove(d) && (d->move || d->strafe)) {
if(d->move>0) anim |= (ANIM_FORWARD|ANIM_LOOP)<<ANIM_SECONDARY;
- else if(d->strafe)
- {
+ else if(d->strafe) {
if(d->move<0) anim |= ((d->strafe>0 ? ANIM_RIGHT : ANIM_LEFT)|ANIM_REVERSE|ANIM_LOOP)<<ANIM_SECONDARY;
else anim |= ((d->strafe>0 ? ANIM_LEFT : ANIM_RIGHT)|ANIM_LOOP)<<ANIM_SECONDARY;
}
else if(d->move<0) anim |= (ANIM_BACKWARD|ANIM_LOOP)<<ANIM_SECONDARY;
}
-
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);
@@ -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;