34 using namespace Opcode;
40 m_pCollisionModel = 0;
43 TreeCollider.SetFirstContact(
true);
44 TreeCollider.SetFullBoxBoxTest(
false);
45 TreeCollider.SetTemporalCoherence(
false);
46 opcMeshInt.SetCallback (&MeshCallback,
this);
47 GeometryInitialize (polygons);
49 rCollider.SetFirstContact(
true);
54 inline float min3 (
float a,
float b,
float c)
55 {
return (a < b ? (a < c ? a : (c < b ? c : b)) : (b < c ? b : c)); }
56 inline float max3(
float a,
float b,
float c)
57 {
return (a > b ? (a > c ? a : (c > b ? c : b)) : (b > c ? b : c)); }
59 void csOPCODECollider::GeometryInitialize (
const std::vector <mesh_polygon> &polygons )
62 unsigned int tri_count = 0;
63 std::vector<Vector>::size_type vert_count = 0;
64 for(std::vector<mesh_polygon>::size_type i = 0;
i <polygons.size();++
i) {
65 vert_count += polygons[
i].v.size();
67 tri_count = vert_count / 3;
70 if (!m_pCollisionModel)
73 vertholder =
new Point [vert_count];
77 unsigned int last = 0;
81 for (std::vector<mesh_polygon>::size_type i = 0;
i < polygons.size(); ++
i) {
83 for(std::vector<Vector>::size_type j = 0;
j < p->
v.size();++
j) {
84 vertholder[last++].Set (p->
v[j].i , p->
v[j].j , p->
v[j].k);
90 opcMeshInt.SetNbTriangles (tri_count);
91 opcMeshInt.SetNbVertices (last);
104 m_pCollisionModel->Build (OPCC);
111 if (m_pCollisionModel) {
112 delete m_pCollisionModel;
113 m_pCollisionModel = 0;
120 void csOPCODECollider::MeshCallback (
udword triangle_index,
125 Point *vertholder = collider->vertholder;
126 int index = 3 * triangle_index;
128 triangle.
Vertex[1] = &vertholder [index + 1];
129 triangle.
Vertex[2] = &vertholder [index + 2];
134 rCollider.SetHitCallback(&csOPCODECollider::RayCallback);
135 rCollider.SetUserData(
this);
136 rCollider.SetFirstContact(
false);
138 collFace.mDistance=FLT_MAX;
139 bool retval=rCollider.Collide(boltbeam,*m_pCollisionModel);
140 rCollider.SetUserData(NULL);
142 retval=collFace.mDistance!=FLT_MAX;
144 distance=collFace.mDistance;
146 printf(
"Opcode actually reported a hit at %f meters!\n",distance);
156 void csOPCODECollider::RayCallback (
const CollisionFace &faceHit,
void* user_data)
161 collider->collFace = faceHit;
170 ColCache.Model0 = this->m_pCollisionModel;
171 ColCache.Model1 = col2->m_pCollisionModel;
173 if (trans1) m1 = trans1->
GetT2O ();
175 if (trans2) m2 = trans2->
GetT2O ();
178 transform1.
m[0][3] = 0;
179 transform1.
m[1][3] = 0;
180 transform1.
m[2][3] = 0;
181 transform1.
m[3][3] = 1;
183 transform2.
m[0][3] = 0;
184 transform2.
m[1][3] = 0;
185 transform2.
m[2][3] = 0;
186 transform2.
m[3][3] = 1;
188 transform1.
m[0][0] = u.
x;
189 transform1.
m[1][0] = u.
y;
190 transform1.
m[2][0] = u.
z;
192 transform2.
m[0][0] = u.
x;
193 transform2.
m[1][0] = u.
y;
194 transform2.
m[2][0] = u.
z;
196 transform1.
m[0][1] = u.
x;
197 transform1.
m[1][1] = u.
y;
198 transform1.
m[2][1] = u.
z;
200 transform2.
m[0][1] = u.
x;
201 transform2.
m[1][1] = u.
y;
202 transform2.
m[2][1] = u.
z;
204 transform1.
m[0][2] = u.
x;
205 transform1.
m[1][2] = u.
y;
206 transform1.
m[2][2] = u.
z;
208 transform2.
m[0][2] = u.
x;
209 transform2.
m[1][2] = u.
y;
210 transform2.
m[2][2] = u.
z;
212 else u.
Set (0, 0, 0);
213 transform1.
m[3][0] = u.
x;
214 transform1.
m[3][1] = u.
y;
215 transform1.
m[3][2] = u.
z;
218 else u.
Set (0, 0, 0);
219 transform2.
m[3][0] = u.
x;
220 transform2.
m[3][1] = u.
y;
221 transform2.
m[3][2] = u.
z;
222 if (TreeCollider.Collide (ColCache, &transform1, &transform2)) {
223 bool status = (TreeCollider.GetContactStatus () !=
FALSE);
225 CopyCollisionPairs (
this, col2);
240 return(pairs.GetArray());
245 return(pairs.Length());
251 TreeCollider.SetFirstContact(on);
252 rCollider.SetFirstContact(on);
261 return(
Vector(vertholder[which].
x,vertholder[which].
y,vertholder[which].
z));
268 if(!col1 || !col2)
return;
270 unsigned int N_pairs = TreeCollider.GetNbPairs ();
271 if (N_pairs == 0)
return;
273 const Pair* colPairs=TreeCollider.GetPairs ();
274 Point* vertholder0 = col1->vertholder;
275 Point* vertholder1 = col2->vertholder;
277 size_t oldlen = pairs.Length ();
278 pairs.SetLength (oldlen + N_pairs);
280 for (
unsigned int i = 0 ;
i < N_pairs ; ++
i) {
281 j = 3 * colPairs[
i].
id0;
282 pairs[oldlen].a1 = vertholder0[j];
283 pairs[oldlen].b1 = vertholder0[j+1];
284 pairs[oldlen].c1 = vertholder0[j+2];
285 j = 3 * colPairs[
i].
id1;
286 pairs[oldlen].a2 = vertholder1[j];
287 pairs[oldlen].b2 = vertholder1[j+1];
288 pairs[oldlen].c2 = vertholder1[j+2];