1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
enum { MDL_MD2 = 0, MDL_MD3, MDL_MD5, MDL_OBJ, MDL_SMD, MDL_IQM, NUMMODELTYPES };
struct model
{
float spinyaw, spinpitch, offsetyaw, offsetpitch;
bool collide, ellipsecollide, shadow, alphadepth, depthoffset;
float scale;
vec translate;
BIH *bih;
vec bbcenter, bbradius, bbextend;
float eyeheight, collideradius, collideheight;
int batch;
model() : 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(0, 0, 0), bbextend(0, 0, 0), eyeheight(0.9f), collideradius(0), collideheight(0), batch(-1) {}
virtual ~model() { DELETEP(bih); }
virtual void calcbb(int frame, vec ¢er, vec &radius) = 0;
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;
virtual bool load() = 0;
virtual const char *name() const = 0;
virtual int type() const = 0;
virtual BIH *setBIH() { return 0; }
virtual bool envmapped() { return false; }
virtual bool skeletal() const { return false; }
virtual void setshader(Shader *shader) {}
virtual void setenvmap(float envmapmin, float envmapmax, Texture *envmap) {}
virtual void setspec(float spec) {}
virtual void setambient(float ambient) {}
virtual void setglow(float glow, float glowdelta, float glowpulse) {}
virtual void setglare(float specglare, float glowglare) {}
virtual void setalphatest(float alpha) {}
virtual void setalphablend(bool blend) {}
virtual void setfullbright(float fullbright) {}
virtual void setcullface(bool cullface) {}
virtual void preloadBIH() { if(!bih) setBIH(); }
virtual void preloadshaders() {}
virtual void preloadmeshes() {}
virtual void cleanup() {}
virtual void startrender() {}
virtual void endrender() {}
void boundbox(int frame, vec ¢er, vec &radius)
{
if(frame) calcbb(frame, center, radius);
else
{
if(bbradius.iszero()) calcbb(0, bbcenter, bbradius);
center = bbcenter;
radius = bbradius;
}
radius.add(bbextend);
}
void collisionbox(int frame, vec ¢er, vec &radius)
{
boundbox(frame, center, radius);
if(collideradius)
{
center[0] = center[1] = 0;
radius[0] = radius[1] = collideradius;
}
if(collideheight)
{
center[2] = radius[2] = collideheight/2;
}
}
float boundsphere(int frame, vec ¢er)
{
vec radius;
boundbox(frame, center, radius);
return radius.magnitude();
}
float above(int frame = 0)
{
vec center, radius;
boundbox(frame, center, radius);
return center.z+radius.z;
}
};
|