TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
C-api.cpp
Go to the documentation of this file.
1/*
2 SOLID - Software Library for Interference Detection
3 Copyright (C) 1997-1998 Gino van den Bergen
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free
17 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19 Please send remarks, questions and bug reports to gino@win.tue.nl,
20 or write to:
21 Gino van den Bergen
22 Department of Mathematics and Computing Science
23 Eindhoven University of Technology
24 P.O. Box 513, 5600 MB Eindhoven, The Netherlands
25*/
26
27#ifdef _MSC_VER
28#pragma warning(disable:4786) // identifier was truncated to '255'
29#endif // _MSC_VER
30
31#include <SOLID/solid.h>
32
33#include <algorithm>
34
35#include "Box.h"
36#include "Cone.h"
37#include "Cylinder.h"
38#include "Sphere.h"
39#include "Complex.h"
40#include "Encounter.h"
41#include "Object.h"
42#include "Simplex.h"
43#include "Polygon.h"
44#include "Polyhedron.h"
45#include "Response.h"
46#include "RespTable.h"
47#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
48# include <sys/types.h>
49#endif
50
51#include <map>
52#include <set>
53#include <vector>
54
55typedef vector<Point> PointBuf;
56typedef vector<unsigned int> IndexBuf;
57typedef vector<const Polytope *> PolyList;
58typedef vector<Complex *> ComplexList;
59typedef map<DtObjectRef, Object *> ObjectList;
60typedef set<Encounter> ProxList;
61
62#ifdef WIN32
63#define uint unsigned int
64#endif
65
73
77bool caching = true;
78
79extern Scalar rel_error;
80
81inline void move() { if (caching && currentObject) currentObject->move(); }
82
83
85 return new Box(x, y, z);
86}
87
89 return new Cone(radius, height);
90}
91
93 return new Cylinder(radius, height);
94}
95
97 return new Sphere(radius);
98}
99
104
106 if (currentComplex->getBase().getPointer() == 0) {
107 Point *ptr = new Point[pointBuf.size()];
108 copy(pointBuf.begin(), pointBuf.end(), ptr);
109 currentComplex->setBase(ptr, true);
110 pointBuf.erase(pointBuf.begin(), pointBuf.end());
111 }
112 currentComplex->finish(polyList.size(), &polyList[0]);
113 polyList.erase(polyList.begin(), polyList.end());
114 complexList.push_back(currentComplex);
115 currentComplex = 0;
116}
117
118void dtBegin(DtPolyType type) { currentType = type; }
119void dtEnd() {
121 indexBuf.erase(indexBuf.begin(), indexBuf.end());
122}
123
125 Point p(x, y, z);
126 int i = pointBuf.size()-20;
127 if (i < 0) i = 0;
128 while ((uint)i < pointBuf.size() && !(pointBuf[i] == p)) ++i;
129 if ((uint)i == pointBuf.size()) pointBuf.push_back(p);
130 indexBuf.push_back(i);
131}
132
133void dtVertexBase(const Point *base) {
134 currentComplex->setBase(base);
135}
136
137void dtVertexIndex(DtIndex index) { indexBuf.push_back(index); }
138
140 const DtIndex *indices) {
141 if (currentComplex) {
142 const Polytope *poly;
143 switch (type) {
144 case DT_SIMPLEX:
145 poly = new Simplex(currentComplex->getBase(), count, indices);
146 break;
147 case DT_POLYGON:
148 poly = new Polygon(currentComplex->getBase(), count, indices);
149 break;
150 case DT_POLYHEDRON:
151 if (currentComplex->getBase().getPointer() == 0) {
152 currentComplex->setBase(&pointBuf[0]);
153 poly = new Polyhedron(currentComplex->getBase(), count, indices);
154 currentComplex->setBase(0);
155 }
156 else poly = new Polyhedron(currentComplex->getBase(), count, indices);
157 break;
158 default:
159 return;
160 }
161 polyList.push_back(poly);
162 }
163}
164
165void dtVertexRange(DtPolyType type, DtIndex first, DtCount count) {
166 DtIndex *indices = new DtIndex[count];
167 for (uint i = 0; i < count; ++i) indices[i] = first + i;
168 dtVertexIndices(type, count, indices);
169 delete [] indices;
170}
171
173 if (((Shape *)shape)->getType() == COMPLEX) {
174 ComplexList::iterator i =
175 find(complexList.begin(), complexList.end(), (Complex *)shape);
176 if (i != complexList.end()) complexList.erase(i);
177 }
178 delete (Shape *)shape;
179}
180
181void dtChangeVertexBase(DtShapeRef shape, const Point *base) {
182 if (((Shape *)shape)->getType() == COMPLEX)
183 ((Complex *)shape)->changeBase(base);
184 for (ObjectList::const_iterator i = objectList.begin();
185 i != objectList.end(); ++i) {
186 if ((*i).second->shapePtr == (Shape *)shape) {
187 (*i).second->move();
188 }
189 }
190}
191
192
193// Object instantiation
194
196 move();
197 currentObject = objectList[object] = new Object(object, (Shape *)shape);
198}
199
201 ObjectList::iterator i = objectList.find(object);
202 if (i != objectList.end()) {
203 move();
204 currentObject = (*i).second;
205 }
206}
207
209 ObjectList::iterator i = objectList.find(object);
210 if (i != objectList.end()) {
211 if (currentObject == (*i).second) currentObject = 0;
212 delete (*i).second;
213 objectList.erase(i);
214 }
215 respTable.cleanObject(object);
216}
217
219 if (currentObject) currentObject->translate(Vector(x, y, z));
220}
221
223 if (currentObject) currentObject->rotate(Quaternion(x, y, z, w));
224}
225
227 if (currentObject) currentObject->scale(x, y, z);
228}
229
231 if (currentObject) currentObject->setIdentity();
232}
233
234void dtLoadMatrixf(const float *m) {
235 if (currentObject) currentObject->setMatrix(m);
236}
237
238void dtLoadMatrixd(const double *m) {
239 if (currentObject) currentObject->setMatrix(m);
240}
241
242void dtMultMatrixf(const float *m) {
243 if (currentObject) currentObject->multMatrix(m);
244}
245
246void dtMultMatrixd(const double *m) {
247 if (currentObject) currentObject->multMatrix(m);
248}
249
250// Response
251
253 void *client_data) {
254 respTable.setDefault(Response(response, type, client_data));
255}
256
258 respTable.setDefault(Response());
259}
260
262 DtResponseType type, void *client_data) {
263 respTable.setSingle(object, Response(response, type, client_data));
264}
265
267 respTable.setSingle(object, Response());
268}
269
271 respTable.resetSingle(object);
272}
273
275 DtResponse response, DtResponseType type,
276 void * client_data) {
277 respTable.setPair(object1, object2, Response(response, type, client_data));
278}
279
281 respTable.setPair(object1, object2, Response());
282}
283
285 respTable.resetPair(object1, object2);
286}
287
288// Runtime
289
290void dtProceed() {
291 for (ComplexList::iterator i = complexList.begin();
292 i != complexList.end(); ++i)
293 (*i)->proceed();
294 for (ObjectList::const_iterator j = objectList.begin();
295 j != objectList.end(); ++j)
296 (*j).second->proceed();
297}
298
300 for (ObjectList::const_iterator i = objectList.begin();
301 i != objectList.end(); ++i)
302 (*i).second->move();
303 caching = true;
304}
305
306void dtDisableCaching() { caching = false; }
307
309
310void addPair(ObjectPtr object1, ObjectPtr object2) {
311 proxList.insert(Encounter(object1, object2));
312}
313
314void removePair(ObjectPtr object1, ObjectPtr object2) {
315 proxList.erase(Encounter(object1, object2));
316}
317
319 static Point p1, p2;
320 const Response& resp = respTable.find(e.obj1->ref, e.obj2->ref);
321 switch (resp.type) {
323 if (intersect(*e.obj1, *e.obj2, e.sep_axis)) {
324 resp(e.obj1->ref, e.obj2->ref);
325 return true;
326 }
327 break;
329 if (prev_closest_points(*e.obj1, *e.obj2, e.sep_axis, p1, p2)) {
330 Vector v = e.obj1->prev(p1) - e.obj2->prev(p2);
331 resp(e.obj1->ref, e.obj2->ref, p1, p2, v);
332 return true;
333 }
334 break;
336 if (common_point(*e.obj1, *e.obj2, e.sep_axis, p1, p2)) {
337 resp(e.obj1->ref, e.obj2->ref, p1, p2, Vector(0, 0, 0));
338 return true;
339 }
340 break;
341 // Eric Espie: warning
342 case DT_NO_RESPONSE:
343 break;
344 }
345 return false;
346}
347
349 move();
350 DtCount count = 0;
351 if (caching) {
352 for (ProxList::iterator i = proxList.begin(); i != proxList.end(); ++i)
353 if (object_test((Encounter &)*i)) ++count;
354 }
355 else {
356 for (ObjectList::const_iterator j = objectList.begin();
357 j != objectList.end(); ++j)
358 for (ObjectList::const_iterator i = objectList.begin();
359 i != j; ++i) {
360 Encounter e((*i).second, (*j).second);
361 if (object_test(e)) ++count;
362 }
363 }
364 return count;
365}
bool intersect(const BBox &a, const BBox &b)
Definition BBox.h:92
bool common_point(const BBoxNode *tree, const Convex &c, const BBox &bb, const Transform &b2a, Vector &v, Point &pa, Point &pb)
Definition BBoxTree.cpp:204
#define Scalar
Definition Basic.h:34
Object * currentObject
Definition C-api.cpp:76
void dtLoadMatrixd(const double *m)
Definition C-api.cpp:238
void addPair(ObjectPtr object1, ObjectPtr object2)
Definition C-api.cpp:310
void dtVertex(DtScalar x, DtScalar y, DtScalar z)
Definition C-api.cpp:124
void dtSetObjectResponse(DtObjectRef object, DtResponse response, DtResponseType type, void *client_data)
Definition C-api.cpp:261
vector< const Polytope * > PolyList
Definition C-api.cpp:57
DtShapeRef dtBox(DtScalar x, DtScalar y, DtScalar z)
Definition C-api.cpp:84
void dtEnableCaching()
Definition C-api.cpp:299
void dtCreateObject(DtObjectRef object, DtShapeRef shape)
Definition C-api.cpp:195
void dtResetPairResponse(DtObjectRef object1, DtObjectRef object2)
Definition C-api.cpp:284
ObjectList objectList
Definition C-api.cpp:70
vector< unsigned int > IndexBuf
Definition C-api.cpp:56
vector< Complex * > ComplexList
Definition C-api.cpp:58
void dtVertexBase(const Point *base)
Definition C-api.cpp:133
DtPolyType currentType
Definition C-api.cpp:74
map< DtObjectRef, Object * > ObjectList
Definition C-api.cpp:59
void dtBegin(DtPolyType type)
Definition C-api.cpp:118
void dtVertexIndex(DtIndex index)
Definition C-api.cpp:137
void dtClearDefaultResponse()
Definition C-api.cpp:257
Scalar rel_error
Definition Convex.cpp:35
void dtEnd()
Definition C-api.cpp:119
void dtLoadIdentity()
Definition C-api.cpp:230
void dtDeleteShape(DtShapeRef shape)
Definition C-api.cpp:172
void move()
Definition C-api.cpp:81
RespTable respTable
Definition C-api.cpp:71
void dtSetTolerance(DtScalar tol)
Definition C-api.cpp:308
DtShapeRef dtCone(DtScalar radius, DtScalar height)
Definition C-api.cpp:88
void dtSelectObject(DtObjectRef object)
Definition C-api.cpp:200
void dtClearPairResponse(DtObjectRef object1, DtObjectRef object2)
Definition C-api.cpp:280
void dtVertexRange(DtPolyType type, DtIndex first, DtCount count)
Definition C-api.cpp:165
void dtSetDefaultResponse(DtResponse response, DtResponseType type, void *client_data)
Definition C-api.cpp:252
bool object_test(Encounter &e)
Definition C-api.cpp:318
void dtVertexIndices(DtPolyType type, DtCount count, const DtIndex *indices)
Definition C-api.cpp:139
DtShapeRef dtSphere(DtScalar radius)
Definition C-api.cpp:96
void dtScale(DtScalar x, DtScalar y, DtScalar z)
Definition C-api.cpp:226
void dtTranslate(DtScalar x, DtScalar y, DtScalar z)
Definition C-api.cpp:218
void removePair(ObjectPtr object1, ObjectPtr object2)
Definition C-api.cpp:314
set< Encounter > ProxList
Definition C-api.cpp:60
Complex * currentComplex
Definition C-api.cpp:75
ProxList proxList
Definition C-api.cpp:72
void dtEndComplexShape()
Definition C-api.cpp:105
void dtMultMatrixf(const float *m)
Definition C-api.cpp:242
DtShapeRef dtNewComplexShape()
Definition C-api.cpp:100
IndexBuf indexBuf
Definition C-api.cpp:67
DtShapeRef dtCylinder(DtScalar radius, DtScalar height)
Definition C-api.cpp:92
vector< Point > PointBuf
Definition C-api.cpp:55
bool caching
Definition C-api.cpp:77
void dtRotate(DtScalar x, DtScalar y, DtScalar z, DtScalar w)
Definition C-api.cpp:222
void dtProceed()
Definition C-api.cpp:290
void dtLoadMatrixf(const float *m)
Definition C-api.cpp:234
PolyList polyList
Definition C-api.cpp:68
PointBuf pointBuf
Definition C-api.cpp:66
void dtMultMatrixd(const double *m)
Definition C-api.cpp:246
DtCount dtTest()
Definition C-api.cpp:348
void dtResetObjectResponse(DtObjectRef object)
Definition C-api.cpp:270
void dtDeleteObject(DtObjectRef object)
Definition C-api.cpp:208
void dtClearObjectResponse(DtObjectRef object)
Definition C-api.cpp:266
void dtDisableCaching()
Definition C-api.cpp:306
ComplexList complexList
Definition C-api.cpp:69
void dtSetPairResponse(DtObjectRef object1, DtObjectRef object2, DtResponse response, DtResponseType type, void *client_data)
Definition C-api.cpp:274
void dtChangeVertexBase(DtShapeRef shape, const Point *base)
Definition C-api.cpp:181
static Point p[4]
Definition Convex.cpp:54
static Vector y[4]
Definition Convex.cpp:56
const Object * ObjectPtr
Definition Encounter.h:37
bool prev_closest_points(const Object &a, const Object &b, Vector &v, Point &pa, Point &pb)
Definition Object.cpp:138
@ COMPLEX
Definition Shape.h:40
Definition Box.h:36
Definition Cone.h:36
Vector sep_axis
Definition Encounter.h:43
ObjectPtr obj2
Definition Encounter.h:42
ObjectPtr obj1
Definition Encounter.h:41
DtObjectRef ref
Definition Object.h:64
Transform prev
Definition Object.h:63
Definition Point.h:34
DtResponseType type
Definition Response.h:43
Definition Shape.h:44
void(* DtResponse)(void *client_data, DtObjectRef object1, DtObjectRef object2, const DtCollData *coll_data)
Definition solid.h:61
unsigned int DtCount
Definition solid.h:37
DtResponseType
Definition solid.h:48
@ DT_SMART_RESPONSE
Definition solid.h:51
@ DT_NO_RESPONSE
Definition solid.h:49
@ DT_WITNESSED_RESPONSE
Definition solid.h:52
@ DT_SIMPLE_RESPONSE
Definition solid.h:50
void * DtObjectRef
Definition solid.h:39
DtPolyType
Definition solid.h:42
@ DT_POLYGON
Definition solid.h:44
@ DT_POLYHEDRON
Definition solid.h:45
@ DT_SIMPLEX
Definition solid.h:43
double DtScalar
Definition solid.h:34
void * DtShapeRef
Definition solid.h:40
unsigned int DtIndex
Definition solid.h:36