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 &center, 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 &center, 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