aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ode-0.9/contrib/dRay/dRay_Box.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ode-0.9/contrib/dRay/dRay_Box.cpp')
-rw-r--r--libraries/ode-0.9/contrib/dRay/dRay_Box.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/libraries/ode-0.9/contrib/dRay/dRay_Box.cpp b/libraries/ode-0.9/contrib/dRay/dRay_Box.cpp
new file mode 100644
index 0000000..d2a0d9c
--- /dev/null
+++ b/libraries/ode-0.9/contrib/dRay/dRay_Box.cpp
@@ -0,0 +1,134 @@
1// Ripped from Magic Software
2
3#include "Include\dRay.h"
4#include "dxRay.h"
5
6bool Clip(dReal Denom, dReal Numer, dReal& T0, dReal& T1){
7 // Return value is 'true' if line segment intersects the current test
8 // plane. Otherwise 'false' is returned in which case the line segment
9 // is entirely clipped.
10
11 if (Denom > REAL(0.0)){
12 if (Numer > Denom * T1){
13 return false;
14 }
15
16 if (Numer > Denom * T0){
17 T0 = Numer / Denom;
18 }
19 return true;
20 }
21 else if (Denom < REAL(0.0)){
22 if (Numer > Denom * T0){
23 return false;
24 }
25
26 if (Numer > Denom * T1){
27 T1 = Numer / Denom;
28 }
29 return true;
30 }
31 else return Numer <= REAL(0.0);
32}
33
34bool FindIntersection(const dVector3 Origin, const dVector3 Direction, const dVector3 Extents, dReal& T0, dReal& T1){
35 dReal SaveT0 = T0;
36 dReal SaveT1 = T1;
37
38 bool NotEntirelyClipped =
39 Clip(+Direction[0], -Origin[0] - Extents[0], T0, T1) &&
40 Clip(-Direction[0], +Origin[0] - Extents[0], T0, T1) &&
41 Clip(+Direction[1], -Origin[1] - Extents[1], T0, T1) &&
42 Clip(-Direction[1], +Origin[1] - Extents[1], T0, T1) &&
43 Clip(+Direction[2], -Origin[2] - Extents[2], T0, T1) &&
44 Clip(-Direction[2], +Origin[2] - Extents[2], T0, T1);
45
46 return NotEntirelyClipped && (T0 != SaveT0 || T1 != SaveT1);
47}
48
49int dCollideBR(dxGeom* RayGeom, dxGeom* BoxGeom, int Flags, dContactGeom* Contacts, int Stride){
50 const dVector3& Position = *(const dVector3*)dGeomGetPosition(BoxGeom);
51 const dMatrix3& Rotation = *(const dMatrix3*)dGeomGetRotation(BoxGeom);
52 dVector3 Extents;
53 dGeomBoxGetLengths(BoxGeom, Extents);
54 Extents[0] /= 2;
55 Extents[1] /= 2;
56 Extents[2] /= 2;
57 Extents[3] /= 2;
58
59 dVector3 Origin, Direction;
60 dGeomRayGet(RayGeom, Origin, Direction);
61 dReal Length = dGeomRayGetLength(RayGeom);
62
63 dVector3 Diff;
64 Diff[0] = Origin[0] - Position[0];
65 Diff[1] = Origin[1] - Position[1];
66 Diff[2] = Origin[2] - Position[2];
67 Diff[3] = Origin[3] - Position[3];
68
69 Direction[0] *= Length;
70 Direction[1] *= Length;
71 Direction[2] *= Length;
72 Direction[3] *= Length;
73
74 dVector3 Rot[3];
75 Decompose(Rotation, Rot);
76
77 dVector3 TransOrigin;
78 TransOrigin[0] = dDOT(Diff, Rot[0]);
79 TransOrigin[1] = dDOT(Diff, Rot[1]);
80 TransOrigin[2] = dDOT(Diff, Rot[2]);
81 TransOrigin[3] = REAL(0.0);
82
83 dVector3 TransDirection;
84 TransDirection[0] = dDOT(Direction, Rot[0]);
85 TransDirection[1] = dDOT(Direction, Rot[1]);
86 TransDirection[2] = dDOT(Direction, Rot[2]);
87 TransDirection[3] = REAL(0.0);
88
89 dReal T[2];
90 T[0] = 0.0f;
91 T[1] = dInfinity;
92
93 bool Intersect = FindIntersection(TransOrigin, TransDirection, Extents, T[0], T[1]);
94
95 if (Intersect){
96 if (T[0] > REAL(0.0)){
97 dContactGeom* Contact0 = CONTACT(Flags, Contacts, 0, Stride);
98 Contact0->pos[0] = Origin[0] + T[0] * Direction[0];
99 Contact0->pos[1] = Origin[1] + T[0] * Direction[1];
100 Contact0->pos[2] = Origin[2] + T[0] * Direction[2];
101 Contact0->pos[3] = Origin[3] + T[0] * Direction[3];
102 //Contact0->normal = 0;
103 Contact0->depth = 0.0f;
104 Contact0->g1 = RayGeom;
105 Contact0->g2 = BoxGeom;
106
107 dContactGeom* Contact1 = CONTACT(Flags, Contacts, 1, Stride);
108 Contact1->pos[0] = Origin[0] + T[1] * Direction[0];
109 Contact1->pos[1] = Origin[1] + T[1] * Direction[1];
110 Contact1->pos[2] = Origin[2] + T[1] * Direction[2];
111 Contact1->pos[3] = Origin[3] + T[1] * Direction[3];
112 //Contact1->normal = 0;
113 Contact1->depth = 0.0f;
114 Contact1->g1 = RayGeom;
115 Contact1->g2 = BoxGeom;
116
117 return 2;
118 }
119 else{
120 dContactGeom* Contact = CONTACT(Flags, Contacts, 0, Stride);
121 Contact->pos[0] = Origin[0] + T[1] * Direction[0];
122 Contact->pos[1] = Origin[1] + T[1] * Direction[1];
123 Contact->pos[2] = Origin[2] + T[1] * Direction[2];
124 Contact->pos[3] = Origin[3] + T[1] * Direction[3];
125 //Contact->normal = 0;
126 Contact->depth = 0.0f;
127 Contact->g1 = RayGeom;
128 Contact->g2 = BoxGeom;
129
130 return 1;
131 }
132 }
133 else return 0;
134} \ No newline at end of file