1 enum { MDL_MD2 = 0, MDL_MD3, MDL_MD5, MDL_OBJ, MDL_SMD, MDL_IQM, NUMMODELTYPES };
2 
3 struct model
4 {
5     char *name;
6     float spinyaw, spinpitch, offsetyaw, offsetpitch;
7     bool collide, ellipsecollide, shadow, alphadepth, depthoffset;
8     float scale;
9     vec translate;
10     BIH *bih;
11     vec bbcenter, bbradius, bbextend, collidecenter, collideradius;
12     float rejectradius, eyeheight, collidexyradius, collideheight;
13     int batch;
14 
modelmodel15     model(const char *name) : name(name ? newstring(name) : NULL), spinyaw(0), spinpitch(0), offsetyaw(0), offsetpitch(0), collide(true), ellipsecollide(false), shadow(true), alphadepth(true), depthoffset(false), scale(1.0f), translate(0, 0, 0), bih(0), bbcenter(0, 0, 0), bbradius(-1, -1, -1), bbextend(0, 0, 0), collidecenter(0, 0, 0), collideradius(-1, -1, -1), rejectradius(-1), eyeheight(0.9f), collidexyradius(0), collideheight(0), batch(-1) {}
~modelmodel16     virtual ~model() { DELETEA(name); DELETEP(bih); }
17     virtual void calcbb(vec &center, vec &radius) = 0;
18     virtual void render(int anim, int basetime, int basetime2, const vec &o, float yaw, float pitch, dynent *d, modelattach *a = NULL, const vec &color = vec(0, 0, 0), const vec &dir = vec(0, 0, 0), float transparent = 1) = 0;
19     virtual bool load() = 0;
20     virtual int type() const = 0;
setBIHmodel21     virtual BIH *setBIH() { return 0; }
envmappedmodel22     virtual bool envmapped() { return false; }
skeletalmodel23     virtual bool skeletal() const { return false; }
24 
setshadermodel25     virtual void setshader(Shader *shader) {}
setenvmapmodel26     virtual void setenvmap(float envmapmin, float envmapmax, Texture *envmap) {}
setspecmodel27     virtual void setspec(float spec) {}
setambientmodel28     virtual void setambient(float ambient) {}
setglowmodel29     virtual void setglow(float glow, float glowdelta, float glowpulse) {}
setglaremodel30     virtual void setglare(float specglare, float glowglare) {}
setalphatestmodel31     virtual void setalphatest(float alpha) {}
setalphablendmodel32     virtual void setalphablend(bool blend) {}
setfullbrightmodel33     virtual void setfullbright(float fullbright) {}
setcullfacemodel34     virtual void setcullface(bool cullface) {}
35 
preloadBIHmodel36     virtual void preloadBIH() { if(!bih) setBIH(); }
37     virtual void preloadshaders(bool force = false) {}
preloadmeshesmodel38     virtual void preloadmeshes() {}
cleanupmodel39     virtual void cleanup() {}
40 
startrendermodel41     virtual void startrender() {}
endrendermodel42     virtual void endrender() {}
43 
boundboxmodel44     void boundbox(vec &center, vec &radius)
45     {
46         if(bbradius.x < 0)
47         {
48             calcbb(bbcenter, bbradius);
49             bbradius.add(bbextend);
50         }
51         center = bbcenter;
52         radius = bbradius;
53     }
54 
collisionboxmodel55     float collisionbox(vec &center, vec &radius)
56     {
57         if(collideradius.x < 0)
58         {
59             boundbox(collidecenter, collideradius);
60             if(collidexyradius)
61             {
62                 collidecenter.x = collidecenter.y = 0;
63                 collideradius.x = collideradius.y = collidexyradius;
64             }
65             if(collideheight)
66             {
67                 collidecenter.z = collideradius.z = collideheight/2;
68             }
69             rejectradius = vec(collidecenter).abs().add(collideradius).magnitude();
70         }
71         center = collidecenter;
72         radius = collideradius;
73         return rejectradius;
74     }
75 
boundspheremodel76     float boundsphere(vec &center)
77     {
78         vec radius;
79         boundbox(center, radius);
80         return radius.magnitude();
81     }
82 
abovemodel83     float above()
84     {
85         vec center, radius;
86         boundbox(center, radius);
87         return center.z+radius.z;
88     }
89 };
90 
91