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 ¢er, 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 ¢er, 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 ¢er, 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 ¢er) 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