1 struct BIH 2 { 3 struct node 4 { 5 short split[2]; 6 ushort child[2]; 7 axisBIH::node8 int axis() const { return child[0]>>14; } childindexBIH::node9 int childindex(int which) const { return child[which]&0x3FFF; } isleafBIH::node10 bool isleaf(int which) const { return (child[1]&(1<<(14+which)))!=0; } 11 }; 12 13 struct tri 14 { 15 ushort vert[3]; 16 }; 17 18 struct tribb 19 { 20 svec center, radius; 21 }; 22 23 enum { MESH_RENDER = 1<<1, MESH_NOCLIP = 1<<2, MESH_ALPHA = 1<<3, MESH_COLLIDE = 1<<4 }; 24 25 struct mesh 26 { 27 matrix4x3 xform, invxform; 28 matrix3 xformnorm, invxformnorm; 29 float scale, invscale; 30 node *nodes; 31 int numnodes; 32 const tri *tris; 33 const tribb *tribbs; 34 int numtris; 35 const uchar *pos, *tc; 36 int posstride, tcstride; 37 Texture *tex; 38 int flags; 39 vec bbmin, bbmax; 40 meshBIH::mesh41 mesh() : numnodes(0), numtris(0), tex(NULL), flags(0) {} 42 getposBIH::mesh43 vec getpos(int i) const { return *(const vec *)(pos + i*posstride); } gettcBIH::mesh44 vec2 gettc(int i) const { return *(const vec2 *)(tc + i*tcstride); } 45 }; 46 47 mesh *meshes; 48 int nummeshes; 49 node *nodes; 50 int numnodes; 51 tribb *tribbs; 52 int numtris; 53 vec bbmin, bbmax, center; 54 float radius, entradius; 55 56 BIH(vector<mesh> &buildmeshes); 57 58 ~BIH(); 59 60 void build(mesh &m, ushort *indices, int numindices, const ivec &vmin, const ivec &vmax); 61 62 bool traverse(const vec &o, const vec &ray, float maxdist, float &dist, int mode); 63 bool traverse(const mesh &m, const vec &o, const vec &ray, const vec &invray, float maxdist, float &dist, int mode, node *curnode, float tmin, float tmax); 64 bool triintersect(const mesh &m, int tidx, const vec &mo, const vec &mray, float maxdist, float &dist, int mode); 65 66 bool boxcollide(physent *d, const vec &dir, float cutoff, const vec &o, int yaw, int pitch, int roll, float scale = 1); 67 bool ellipsecollide(physent *d, const vec &dir, float cutoff, const vec &o, int yaw, int pitch, int roll, float scale = 1); 68 69 template<int C> 70 void collide(const mesh &m, physent *d, const vec &dir, float cutoff, const vec ¢er, const vec &radius, const matrix4x3 &orient, float &dist, node *curnode, const ivec &bo, const ivec &br); 71 template<int C> 72 void tricollide(const mesh &m, int tidx, physent *d, const vec &dir, float cutoff, const vec ¢er, const vec &radius, const matrix4x3 &orient, float &dist, const ivec &bo, const ivec &br); 73 74 void preload(); 75 }; 76 77 extern bool mmintersect(const extentity &e, const vec &o, const vec &ray, float maxdist, int mode, float &dist); 78 79