Initial sauer
[SauerbratenRemote.git] / src / engine / model.h
blobe4353f8b035696acc09cfda58dd8733a74ce11cc
1 enum { MDL_MD2 = 1, MDL_MD3 };
3 struct model
5 float spin;
6 bool collide, ellipsecollide, cullface, shadow;
7 float scale;
8 vec translate;
9 BIH *bih;
10 vec bbcenter, bbradius;
11 float eyeheight, collideradius, collideheight;
12 int batch;
14 model() : spin(0), collide(true), ellipsecollide(false), cullface(true), shadow(true), scale(1.0f), translate(0, 0, 0), bih(0), bbcenter(0, 0, 0), bbradius(0, 0, 0), eyeheight(0.9f), collideradius(0), collideheight(0), batch(-1) {}
15 virtual ~model() { DELETEP(bih); }
16 virtual void calcbb(int frame, vec &center, vec &radius) = 0;
17 virtual void extendbb(int frame, vec &center, vec &radius, modelattach &a) {}
18 virtual void render(int anim, int varseed, float speed, int basetime, 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)) = 0;
19 virtual void setskin(int tex = 0) = 0;
20 virtual bool load() = 0;
21 virtual char *name() = 0;
22 virtual int type() = 0;
23 virtual BIH *setBIH() { return 0; }
24 virtual bool envmapped() { return false; }
26 virtual void setshader(Shader *shader) {}
27 virtual void setenvmap(float envmapmin, float envmapmax, Texture *envmap) {}
28 virtual void setspec(float spec) {}
29 virtual void setambient(float ambient) {}
30 virtual void setglow(float glow) {}
31 virtual void setalphatest(float alpha) {}
32 virtual void setalphablend(bool blend) {}
33 virtual void settranslucency(float translucency) {}
34 virtual void setfullbright(float fullbright) {}
36 virtual void startrender() {}
37 virtual void endrender() {}
39 void boundbox(int frame, vec &center, vec &radius, modelattach *a = NULL)
41 if(frame) calcbb(frame, center, radius);
42 else
44 if(bbradius.iszero()) calcbb(0, bbcenter, bbradius);
45 center = bbcenter;
46 radius = bbradius;
48 if(a) for(int i = 0; a[i].name; i++) if(a[i].m) extendbb(frame, center, radius, a[i]);
51 void collisionbox(int frame, vec &center, vec &radius)
53 boundbox(frame, center, radius);
54 if(collideradius)
56 center[0] = center[1] = 0;
57 radius[0] = radius[1] = collideradius;
59 if(collideheight)
61 center[2] = radius[2] = collideheight/2;
65 float boundsphere(int frame, vec &center, modelattach *a = NULL)
67 vec radius;
68 boundbox(frame, center, radius, a);
69 return radius.magnitude();
72 float above(int frame = 0)
74 vec center, radius;
75 boundbox(frame, center, radius);
76 return center.z+radius.z;