aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ode-0.9/ode/demo/demo_moving_trimesh.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ode-0.9/ode/demo/demo_moving_trimesh.cpp')
-rw-r--r--libraries/ode-0.9/ode/demo/demo_moving_trimesh.cpp1944
1 files changed, 1944 insertions, 0 deletions
diff --git a/libraries/ode-0.9/ode/demo/demo_moving_trimesh.cpp b/libraries/ode-0.9/ode/demo/demo_moving_trimesh.cpp
new file mode 100644
index 0000000..3d03020
--- /dev/null
+++ b/libraries/ode-0.9/ode/demo/demo_moving_trimesh.cpp
@@ -0,0 +1,1944 @@
1/*************************************************************************
2 * *
3 * Open Dynamics Engine, Copyright (C) 2001-2003 Russell L. Smith. *
4 * All rights reserved. Email: russ@q12.org Web: www.q12.org *
5 * *
6 * This library is free software; you can redistribute it and/or *
7 * modify it under the terms of EITHER: *
8 * (1) The GNU Lesser General Public License as published by the Free *
9 * Software Foundation; either version 2.1 of the License, or (at *
10 * your option) any later version. The text of the GNU Lesser *
11 * General Public License is included with this library in the *
12 * file LICENSE.TXT. *
13 * (2) The BSD-style license that is included with this library in *
14 * the file LICENSE-BSD.TXT. *
15 * *
16 * This library is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files *
19 * LICENSE.TXT and LICENSE-BSD.TXT for more details. *
20 * *
21 *************************************************************************/
22
23#include <ode/ode.h>
24#include <drawstuff/drawstuff.h>
25
26#ifdef _MSC_VER
27#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints
28#endif
29
30// select correct drawing functions
31
32#ifdef dDOUBLE
33#define dsDrawBox dsDrawBoxD
34#define dsDrawSphere dsDrawSphereD
35#define dsDrawCylinder dsDrawCylinderD
36#define dsDrawCapsule dsDrawCapsuleD
37#define dsDrawLine dsDrawLineD
38#define dsDrawTriangle dsDrawTriangleD
39#endif
40
41
42// some constants
43
44#define NUM 200 // max number of objects
45#define DENSITY (5.0) // density of all objects
46#define GPB 3 // maximum number of geometries per body
47#define MAX_CONTACTS 64 // maximum number of contact points per body
48
49
50// dynamics and collision objects
51
52struct MyObject {
53 dBodyID body; // the body
54 dGeomID geom[GPB]; // geometries representing this body
55
56 // Trimesh only - double buffered matrices for 'last transform' setup
57 dReal matrix_dblbuff[ 16 * 2 ];
58 int last_matrix_index;
59};
60
61static int num=0; // number of objects in simulation
62static int nextobj=0; // next object to recycle if num==NUM
63static dWorldID world;
64static dSpaceID space;
65static MyObject obj[NUM];
66static dJointGroupID contactgroup;
67static int selected = -1; // selected object
68static int show_aabb = 0; // show geom AABBs?
69static int show_contacts = 0; // show contact points?
70static int random_pos = 1; // drop objects from random position?
71
72// Bunny mesh ripped from Opcode
73const int VertexCount = 453;
74const int IndexCount = 902 * 3;
75
76typedef dReal dVector3R[3];
77
78dGeomID TriMesh1;
79dGeomID TriMesh2;
80static dTriMeshDataID TriData1, TriData2; // reusable static trimesh data
81
82float Vertices[VertexCount * 3] = {
83 REAL(-0.334392), REAL(0.133007), REAL(0.062259),
84 REAL(-0.350189), REAL(0.150354), REAL(-0.147769),
85 REAL(-0.234201), REAL(0.343811), REAL(-0.174307),
86 REAL(-0.200259), REAL(0.285207), REAL(0.093749),
87 REAL(0.003520), REAL(0.475208), REAL(-0.159365),
88 REAL(0.001856), REAL(0.419203), REAL(0.098582),
89 REAL(-0.252802), REAL(0.093666), REAL(0.237538),
90 REAL(-0.162901), REAL(0.237984), REAL(0.206905),
91 REAL(0.000865), REAL(0.318141), REAL(0.235370),
92 REAL(-0.414624), REAL(0.164083), REAL(-0.278254),
93 REAL(-0.262213), REAL(0.357334), REAL(-0.293246),
94 REAL(0.004628), REAL(0.482694), REAL(-0.338626),
95 REAL(-0.402162), REAL(0.133528), REAL(-0.443247),
96 REAL(-0.243781), REAL(0.324275), REAL(-0.436763),
97 REAL(0.005293), REAL(0.437592), REAL(-0.458332),
98 REAL(-0.339884), REAL(-0.041150), REAL(-0.668211),
99 REAL(-0.248382), REAL(0.255825), REAL(-0.627493),
100 REAL(0.006261), REAL(0.376103), REAL(-0.631506),
101 REAL(-0.216201), REAL(-0.126776), REAL(-0.886936),
102 REAL(-0.171075), REAL(0.011544), REAL(-0.881386),
103 REAL(-0.181074), REAL(0.098223), REAL(-0.814779),
104 REAL(-0.119891), REAL(0.218786), REAL(-0.760153),
105 REAL(-0.078895), REAL(0.276780), REAL(-0.739281),
106 REAL(0.006801), REAL(0.310959), REAL(-0.735661),
107 REAL(-0.168842), REAL(0.102387), REAL(-0.920381),
108 REAL(-0.104072), REAL(0.177278), REAL(-0.952530),
109 REAL(-0.129704), REAL(0.211848), REAL(-0.836678),
110 REAL(-0.099875), REAL(0.310931), REAL(-0.799381),
111 REAL(0.007237), REAL(0.361687), REAL(-0.794439),
112 REAL(-0.077913), REAL(0.258753), REAL(-0.921640),
113 REAL(0.007957), REAL(0.282241), REAL(-0.931680),
114 REAL(-0.252222), REAL(-0.550401), REAL(-0.557810),
115 REAL(-0.267633), REAL(-0.603419), REAL(-0.655209),
116 REAL(-0.446838), REAL(-0.118517), REAL(-0.466159),
117 REAL(-0.459488), REAL(-0.093017), REAL(-0.311341),
118 REAL(-0.370645), REAL(-0.100108), REAL(-0.159454),
119 REAL(-0.371984), REAL(-0.091991), REAL(-0.011044),
120 REAL(-0.328945), REAL(-0.098269), REAL(0.088659),
121 REAL(-0.282452), REAL(-0.018862), REAL(0.311501),
122 REAL(-0.352403), REAL(-0.131341), REAL(0.144902),
123 REAL(-0.364126), REAL(-0.200299), REAL(0.202388),
124 REAL(-0.283965), REAL(-0.231869), REAL(0.023668),
125 REAL(-0.298943), REAL(-0.155218), REAL(0.369716),
126 REAL(-0.293787), REAL(-0.121856), REAL(0.419097),
127 REAL(-0.290163), REAL(-0.290797), REAL(0.107824),
128 REAL(-0.264165), REAL(-0.272849), REAL(0.036347),
129 REAL(-0.228567), REAL(-0.372573), REAL(0.290309),
130 REAL(-0.190431), REAL(-0.286997), REAL(0.421917),
131 REAL(-0.191039), REAL(-0.240973), REAL(0.507118),
132 REAL(-0.287272), REAL(-0.276431), REAL(-0.065444),
133 REAL(-0.295675), REAL(-0.280818), REAL(-0.174200),
134 REAL(-0.399537), REAL(-0.313131), REAL(-0.376167),
135 REAL(-0.392666), REAL(-0.488581), REAL(-0.427494),
136 REAL(-0.331669), REAL(-0.570185), REAL(-0.466054),
137 REAL(-0.282290), REAL(-0.618140), REAL(-0.589220),
138 REAL(-0.374238), REAL(-0.594882), REAL(-0.323298),
139 REAL(-0.381071), REAL(-0.629723), REAL(-0.350777),
140 REAL(-0.382112), REAL(-0.624060), REAL(-0.221577),
141 REAL(-0.272701), REAL(-0.566522), REAL(0.259157),
142 REAL(-0.256702), REAL(-0.663406), REAL(0.286079),
143 REAL(-0.280948), REAL(-0.428359), REAL(0.055790),
144 REAL(-0.184974), REAL(-0.508894), REAL(0.326265),
145 REAL(-0.279971), REAL(-0.526918), REAL(0.395319),
146 REAL(-0.282599), REAL(-0.663393), REAL(0.412411),
147 REAL(-0.188329), REAL(-0.475093), REAL(0.417954),
148 REAL(-0.263384), REAL(-0.663396), REAL(0.466604),
149 REAL(-0.209063), REAL(-0.663393), REAL(0.509344),
150 REAL(-0.002044), REAL(-0.319624), REAL(0.553078),
151 REAL(-0.001266), REAL(-0.371260), REAL(0.413296),
152 REAL(-0.219753), REAL(-0.339762), REAL(-0.040921),
153 REAL(-0.256986), REAL(-0.282511), REAL(-0.006349),
154 REAL(-0.271706), REAL(-0.260881), REAL(0.001764),
155 REAL(-0.091191), REAL(-0.419184), REAL(-0.045912),
156 REAL(-0.114944), REAL(-0.429752), REAL(-0.124739),
157 REAL(-0.113970), REAL(-0.382987), REAL(-0.188540),
158 REAL(-0.243012), REAL(-0.464942), REAL(-0.242850),
159 REAL(-0.314815), REAL(-0.505402), REAL(-0.324768),
160 REAL(0.002774), REAL(-0.437526), REAL(-0.262766),
161 REAL(-0.072625), REAL(-0.417748), REAL(-0.221440),
162 REAL(-0.160112), REAL(-0.476932), REAL(-0.293450),
163 REAL(0.003859), REAL(-0.453425), REAL(-0.443916),
164 REAL(-0.120363), REAL(-0.581567), REAL(-0.438689),
165 REAL(-0.091499), REAL(-0.584191), REAL(-0.294511),
166 REAL(-0.116469), REAL(-0.599861), REAL(-0.188308),
167 REAL(-0.208032), REAL(-0.513640), REAL(-0.134649),
168 REAL(-0.235749), REAL(-0.610017), REAL(-0.040939),
169 REAL(-0.344916), REAL(-0.622487), REAL(-0.085380),
170 REAL(-0.336401), REAL(-0.531864), REAL(-0.212298),
171 REAL(0.001961), REAL(-0.459550), REAL(-0.135547),
172 REAL(-0.058296), REAL(-0.430536), REAL(-0.043440),
173 REAL(0.001378), REAL(-0.449511), REAL(-0.037762),
174 REAL(-0.130135), REAL(-0.510222), REAL(0.079144),
175 REAL(0.000142), REAL(-0.477549), REAL(0.157064),
176 REAL(-0.114284), REAL(-0.453206), REAL(0.304397),
177 REAL(-0.000592), REAL(-0.443558), REAL(0.285401),
178 REAL(-0.056215), REAL(-0.663402), REAL(0.326073),
179 REAL(-0.026248), REAL(-0.568010), REAL(0.273318),
180 REAL(-0.049261), REAL(-0.531064), REAL(0.389854),
181 REAL(-0.127096), REAL(-0.663398), REAL(0.479316),
182 REAL(-0.058384), REAL(-0.663401), REAL(0.372891),
183 REAL(-0.303961), REAL(0.054199), REAL(0.625921),
184 REAL(-0.268594), REAL(0.193403), REAL(0.502766),
185 REAL(-0.277159), REAL(0.126123), REAL(0.443289),
186 REAL(-0.287605), REAL(-0.005722), REAL(0.531844),
187 REAL(-0.231396), REAL(-0.121289), REAL(0.587387),
188 REAL(-0.253475), REAL(-0.081797), REAL(0.756541),
189 REAL(-0.195164), REAL(-0.137969), REAL(0.728011),
190 REAL(-0.167673), REAL(-0.156573), REAL(0.609388),
191 REAL(-0.145917), REAL(-0.169029), REAL(0.697600),
192 REAL(-0.077776), REAL(-0.214247), REAL(0.622586),
193 REAL(-0.076873), REAL(-0.214971), REAL(0.696301),
194 REAL(-0.002341), REAL(-0.233135), REAL(0.622859),
195 REAL(-0.002730), REAL(-0.213526), REAL(0.691267),
196 REAL(-0.003136), REAL(-0.192628), REAL(0.762731),
197 REAL(-0.056136), REAL(-0.201222), REAL(0.763806),
198 REAL(-0.114589), REAL(-0.166192), REAL(0.770723),
199 REAL(-0.155145), REAL(-0.129632), REAL(0.791738),
200 REAL(-0.183611), REAL(-0.058705), REAL(0.847012),
201 REAL(-0.165562), REAL(0.001980), REAL(0.833386),
202 REAL(-0.220084), REAL(0.019914), REAL(0.768935),
203 REAL(-0.255730), REAL(0.090306), REAL(0.670782),
204 REAL(-0.255594), REAL(0.113833), REAL(0.663389),
205 REAL(-0.226380), REAL(0.212655), REAL(0.617740),
206 REAL(-0.003367), REAL(-0.195342), REAL(0.799680),
207 REAL(-0.029743), REAL(-0.210508), REAL(0.827180),
208 REAL(-0.003818), REAL(-0.194783), REAL(0.873636),
209 REAL(-0.004116), REAL(-0.157907), REAL(0.931268),
210 REAL(-0.031280), REAL(-0.184555), REAL(0.889476),
211 REAL(-0.059885), REAL(-0.184448), REAL(0.841330),
212 REAL(-0.135333), REAL(-0.164332), REAL(0.878200),
213 REAL(-0.085574), REAL(-0.170948), REAL(0.925547),
214 REAL(-0.163833), REAL(-0.094170), REAL(0.897114),
215 REAL(-0.138444), REAL(-0.104250), REAL(0.945975),
216 REAL(-0.083497), REAL(-0.084934), REAL(0.979607),
217 REAL(-0.004433), REAL(-0.146642), REAL(0.985872),
218 REAL(-0.150715), REAL(0.032650), REAL(0.884111),
219 REAL(-0.135892), REAL(-0.035520), REAL(0.945455),
220 REAL(-0.070612), REAL(0.036849), REAL(0.975733),
221 REAL(-0.004458), REAL(-0.042526), REAL(1.015670),
222 REAL(-0.004249), REAL(0.046042), REAL(1.003240),
223 REAL(-0.086969), REAL(0.133224), REAL(0.947633),
224 REAL(-0.003873), REAL(0.161605), REAL(0.970499),
225 REAL(-0.125544), REAL(0.140012), REAL(0.917678),
226 REAL(-0.125651), REAL(0.250246), REAL(0.857602),
227 REAL(-0.003127), REAL(0.284070), REAL(0.878870),
228 REAL(-0.159174), REAL(0.125726), REAL(0.888878),
229 REAL(-0.183807), REAL(0.196970), REAL(0.844480),
230 REAL(-0.159890), REAL(0.291736), REAL(0.732480),
231 REAL(-0.199495), REAL(0.207230), REAL(0.779864),
232 REAL(-0.206182), REAL(0.164608), REAL(0.693257),
233 REAL(-0.186315), REAL(0.160689), REAL(0.817193),
234 REAL(-0.192827), REAL(0.166706), REAL(0.782271),
235 REAL(-0.175112), REAL(0.110008), REAL(0.860621),
236 REAL(-0.161022), REAL(0.057420), REAL(0.855111),
237 REAL(-0.172319), REAL(0.036155), REAL(0.816189),
238 REAL(-0.190318), REAL(0.064083), REAL(0.760605),
239 REAL(-0.195072), REAL(0.129179), REAL(0.731104),
240 REAL(-0.203126), REAL(0.410287), REAL(0.680536),
241 REAL(-0.216677), REAL(0.309274), REAL(0.642272),
242 REAL(-0.241515), REAL(0.311485), REAL(0.587832),
243 REAL(-0.002209), REAL(0.366663), REAL(0.749413),
244 REAL(-0.088230), REAL(0.396265), REAL(0.678635),
245 REAL(-0.170147), REAL(0.109517), REAL(0.840784),
246 REAL(-0.160521), REAL(0.067766), REAL(0.830650),
247 REAL(-0.181546), REAL(0.139805), REAL(0.812146),
248 REAL(-0.180495), REAL(0.148568), REAL(0.776087),
249 REAL(-0.180255), REAL(0.129125), REAL(0.744192),
250 REAL(-0.186298), REAL(0.078308), REAL(0.769352),
251 REAL(-0.167622), REAL(0.060539), REAL(0.806675),
252 REAL(-0.189876), REAL(0.102760), REAL(0.802582),
253 REAL(-0.108340), REAL(0.455446), REAL(0.657174),
254 REAL(-0.241585), REAL(0.527592), REAL(0.669296),
255 REAL(-0.265676), REAL(0.513366), REAL(0.634594),
256 REAL(-0.203073), REAL(0.478550), REAL(0.581526),
257 REAL(-0.266772), REAL(0.642330), REAL(0.602061),
258 REAL(-0.216961), REAL(0.564846), REAL(0.535435),
259 REAL(-0.202210), REAL(0.525495), REAL(0.475944),
260 REAL(-0.193888), REAL(0.467925), REAL(0.520606),
261 REAL(-0.265837), REAL(0.757267), REAL(0.500933),
262 REAL(-0.240306), REAL(0.653440), REAL(0.463215),
263 REAL(-0.309239), REAL(0.776868), REAL(0.304726),
264 REAL(-0.271009), REAL(0.683094), REAL(0.382018),
265 REAL(-0.312111), REAL(0.671099), REAL(0.286687),
266 REAL(-0.268791), REAL(0.624342), REAL(0.377231),
267 REAL(-0.302457), REAL(0.533996), REAL(0.360289),
268 REAL(-0.263656), REAL(0.529310), REAL(0.412564),
269 REAL(-0.282311), REAL(0.415167), REAL(0.447666),
270 REAL(-0.239201), REAL(0.442096), REAL(0.495604),
271 REAL(-0.220043), REAL(0.569026), REAL(0.445877),
272 REAL(-0.001263), REAL(0.395631), REAL(0.602029),
273 REAL(-0.057345), REAL(0.442535), REAL(0.572224),
274 REAL(-0.088927), REAL(0.506333), REAL(0.529106),
275 REAL(-0.125738), REAL(0.535076), REAL(0.612913),
276 REAL(-0.126251), REAL(0.577170), REAL(0.483159),
277 REAL(-0.149594), REAL(0.611520), REAL(0.557731),
278 REAL(-0.163188), REAL(0.660791), REAL(0.491080),
279 REAL(-0.172482), REAL(0.663387), REAL(0.415416),
280 REAL(-0.160464), REAL(0.591710), REAL(0.370659),
281 REAL(-0.156445), REAL(0.536396), REAL(0.378302),
282 REAL(-0.136496), REAL(0.444358), REAL(0.425226),
283 REAL(-0.095564), REAL(0.373768), REAL(0.473659),
284 REAL(-0.104146), REAL(0.315912), REAL(0.498104),
285 REAL(-0.000496), REAL(0.384194), REAL(0.473817),
286 REAL(-0.000183), REAL(0.297770), REAL(0.401486),
287 REAL(-0.129042), REAL(0.270145), REAL(0.434495),
288 REAL(0.000100), REAL(0.272963), REAL(0.349138),
289 REAL(-0.113060), REAL(0.236984), REAL(0.385554),
290 REAL(0.007260), REAL(0.016311), REAL(-0.883396),
291 REAL(0.007865), REAL(0.122104), REAL(-0.956137),
292 REAL(-0.032842), REAL(0.115282), REAL(-0.953252),
293 REAL(-0.089115), REAL(0.108449), REAL(-0.950317),
294 REAL(-0.047440), REAL(0.014729), REAL(-0.882756),
295 REAL(-0.104458), REAL(0.013137), REAL(-0.882070),
296 REAL(-0.086439), REAL(-0.584866), REAL(-0.608343),
297 REAL(-0.115026), REAL(-0.662605), REAL(-0.436732),
298 REAL(-0.071683), REAL(-0.665372), REAL(-0.606385),
299 REAL(-0.257884), REAL(-0.665381), REAL(-0.658052),
300 REAL(-0.272542), REAL(-0.665381), REAL(-0.592063),
301 REAL(-0.371322), REAL(-0.665382), REAL(-0.353620),
302 REAL(-0.372362), REAL(-0.665381), REAL(-0.224420),
303 REAL(-0.335166), REAL(-0.665380), REAL(-0.078623),
304 REAL(-0.225999), REAL(-0.665375), REAL(-0.038981),
305 REAL(-0.106719), REAL(-0.665374), REAL(-0.186351),
306 REAL(-0.081749), REAL(-0.665372), REAL(-0.292554),
307 REAL(0.006943), REAL(-0.091505), REAL(-0.858354),
308 REAL(0.006117), REAL(-0.280985), REAL(-0.769967),
309 REAL(0.004495), REAL(-0.502360), REAL(-0.559799),
310 REAL(-0.198638), REAL(-0.302135), REAL(-0.845816),
311 REAL(-0.237395), REAL(-0.542544), REAL(-0.587188),
312 REAL(-0.270001), REAL(-0.279489), REAL(-0.669861),
313 REAL(-0.134547), REAL(-0.119852), REAL(-0.959004),
314 REAL(-0.052088), REAL(-0.122463), REAL(-0.944549),
315 REAL(-0.124463), REAL(-0.293508), REAL(-0.899566),
316 REAL(-0.047616), REAL(-0.289643), REAL(-0.879292),
317 REAL(-0.168595), REAL(-0.529132), REAL(-0.654931),
318 REAL(-0.099793), REAL(-0.515719), REAL(-0.645873),
319 REAL(-0.186168), REAL(-0.605282), REAL(-0.724690),
320 REAL(-0.112970), REAL(-0.583097), REAL(-0.707469),
321 REAL(-0.108152), REAL(-0.665375), REAL(-0.700408),
322 REAL(-0.183019), REAL(-0.665378), REAL(-0.717630),
323 REAL(-0.349529), REAL(-0.334459), REAL(-0.511985),
324 REAL(-0.141182), REAL(-0.437705), REAL(-0.798194),
325 REAL(-0.212670), REAL(-0.448725), REAL(-0.737447),
326 REAL(-0.261111), REAL(-0.414945), REAL(-0.613835),
327 REAL(-0.077364), REAL(-0.431480), REAL(-0.778113),
328 REAL(0.005174), REAL(-0.425277), REAL(-0.651592),
329 REAL(0.089236), REAL(-0.431732), REAL(-0.777093),
330 REAL(0.271006), REAL(-0.415749), REAL(-0.610577),
331 REAL(0.223981), REAL(-0.449384), REAL(-0.734774),
332 REAL(0.153275), REAL(-0.438150), REAL(-0.796391),
333 REAL(0.358414), REAL(-0.335529), REAL(-0.507649),
334 REAL(0.193434), REAL(-0.665946), REAL(-0.715325),
335 REAL(0.118363), REAL(-0.665717), REAL(-0.699021),
336 REAL(0.123515), REAL(-0.583454), REAL(-0.706020),
337 REAL(0.196851), REAL(-0.605860), REAL(-0.722345),
338 REAL(0.109788), REAL(-0.516035), REAL(-0.644590),
339 REAL(0.178656), REAL(-0.529656), REAL(-0.652804),
340 REAL(0.061157), REAL(-0.289807), REAL(-0.878626),
341 REAL(0.138234), REAL(-0.293905), REAL(-0.897958),
342 REAL(0.066933), REAL(-0.122643), REAL(-0.943820),
343 REAL(0.149571), REAL(-0.120281), REAL(-0.957264),
344 REAL(0.280989), REAL(-0.280321), REAL(-0.666487),
345 REAL(0.246581), REAL(-0.543275), REAL(-0.584224),
346 REAL(0.211720), REAL(-0.302754), REAL(-0.843303),
347 REAL(0.086966), REAL(-0.665627), REAL(-0.291520),
348 REAL(0.110634), REAL(-0.665702), REAL(-0.185021),
349 REAL(0.228099), REAL(-0.666061), REAL(-0.036201),
350 REAL(0.337743), REAL(-0.666396), REAL(-0.074503),
351 REAL(0.376722), REAL(-0.666513), REAL(-0.219833),
352 REAL(0.377265), REAL(-0.666513), REAL(-0.349036),
353 REAL(0.281411), REAL(-0.666217), REAL(-0.588670),
354 REAL(0.267564), REAL(-0.666174), REAL(-0.654834),
355 REAL(0.080745), REAL(-0.665602), REAL(-0.605452),
356 REAL(0.122016), REAL(-0.662963), REAL(-0.435280),
357 REAL(0.095767), REAL(-0.585141), REAL(-0.607228),
358 REAL(0.118944), REAL(0.012799), REAL(-0.880702),
359 REAL(0.061944), REAL(0.014564), REAL(-0.882086),
360 REAL(0.104725), REAL(0.108156), REAL(-0.949130),
361 REAL(0.048513), REAL(0.115159), REAL(-0.952753),
362 REAL(0.112696), REAL(0.236643), REAL(0.386937),
363 REAL(0.128177), REAL(0.269757), REAL(0.436071),
364 REAL(0.102643), REAL(0.315600), REAL(0.499370),
365 REAL(0.094535), REAL(0.373481), REAL(0.474824),
366 REAL(0.136270), REAL(0.443946), REAL(0.426895),
367 REAL(0.157071), REAL(0.535923), REAL(0.380222),
368 REAL(0.161350), REAL(0.591224), REAL(0.372630),
369 REAL(0.173035), REAL(0.662865), REAL(0.417531),
370 REAL(0.162808), REAL(0.660299), REAL(0.493077),
371 REAL(0.148250), REAL(0.611070), REAL(0.559555),
372 REAL(0.125719), REAL(0.576790), REAL(0.484702),
373 REAL(0.123489), REAL(0.534699), REAL(0.614440),
374 REAL(0.087621), REAL(0.506066), REAL(0.530188),
375 REAL(0.055321), REAL(0.442365), REAL(0.572915),
376 REAL(0.219936), REAL(0.568361), REAL(0.448571),
377 REAL(0.238099), REAL(0.441375), REAL(0.498528),
378 REAL(0.281711), REAL(0.414315), REAL(0.451121),
379 REAL(0.263833), REAL(0.528513), REAL(0.415794),
380 REAL(0.303284), REAL(0.533081), REAL(0.363998),
381 REAL(0.269687), REAL(0.623528), REAL(0.380528),
382 REAL(0.314255), REAL(0.670153), REAL(0.290524),
383 REAL(0.272023), REAL(0.682273), REAL(0.385343),
384 REAL(0.311480), REAL(0.775931), REAL(0.308527),
385 REAL(0.240239), REAL(0.652714), REAL(0.466159),
386 REAL(0.265619), REAL(0.756464), REAL(0.504187),
387 REAL(0.192562), REAL(0.467341), REAL(0.522972),
388 REAL(0.201605), REAL(0.524885), REAL(0.478417),
389 REAL(0.215743), REAL(0.564193), REAL(0.538084),
390 REAL(0.264969), REAL(0.641527), REAL(0.605317),
391 REAL(0.201031), REAL(0.477940), REAL(0.584002),
392 REAL(0.263086), REAL(0.512567), REAL(0.637832),
393 REAL(0.238615), REAL(0.526867), REAL(0.672237),
394 REAL(0.105309), REAL(0.455123), REAL(0.658482),
395 REAL(0.183993), REAL(0.102195), REAL(0.804872),
396 REAL(0.161563), REAL(0.060042), REAL(0.808692),
397 REAL(0.180748), REAL(0.077754), REAL(0.771600),
398 REAL(0.175168), REAL(0.128588), REAL(0.746368),
399 REAL(0.175075), REAL(0.148030), REAL(0.778264),
400 REAL(0.175658), REAL(0.139265), REAL(0.814333),
401 REAL(0.154191), REAL(0.067291), REAL(0.832578),
402 REAL(0.163818), REAL(0.109013), REAL(0.842830),
403 REAL(0.084760), REAL(0.396004), REAL(0.679695),
404 REAL(0.238888), REAL(0.310760), REAL(0.590775),
405 REAL(0.213380), REAL(0.308625), REAL(0.644905),
406 REAL(0.199666), REAL(0.409678), REAL(0.683003),
407 REAL(0.190143), REAL(0.128597), REAL(0.733463),
408 REAL(0.184833), REAL(0.063516), REAL(0.762902),
409 REAL(0.166070), REAL(0.035644), REAL(0.818261),
410 REAL(0.154361), REAL(0.056943), REAL(0.857042),
411 REAL(0.168542), REAL(0.109489), REAL(0.862725),
412 REAL(0.187387), REAL(0.166131), REAL(0.784599),
413 REAL(0.180428), REAL(0.160135), REAL(0.819438),
414 REAL(0.201823), REAL(0.163991), REAL(0.695756),
415 REAL(0.194206), REAL(0.206635), REAL(0.782275),
416 REAL(0.155438), REAL(0.291260), REAL(0.734412),
417 REAL(0.177696), REAL(0.196424), REAL(0.846693),
418 REAL(0.152305), REAL(0.125256), REAL(0.890786),
419 REAL(0.119546), REAL(0.249876), REAL(0.859104),
420 REAL(0.118369), REAL(0.139643), REAL(0.919173),
421 REAL(0.079410), REAL(0.132973), REAL(0.948652),
422 REAL(0.062419), REAL(0.036648), REAL(0.976547),
423 REAL(0.127847), REAL(-0.035919), REAL(0.947070),
424 REAL(0.143624), REAL(0.032206), REAL(0.885913),
425 REAL(0.074888), REAL(-0.085173), REAL(0.980577),
426 REAL(0.130184), REAL(-0.104656), REAL(0.947620),
427 REAL(0.156201), REAL(-0.094653), REAL(0.899074),
428 REAL(0.077366), REAL(-0.171194), REAL(0.926545),
429 REAL(0.127722), REAL(-0.164729), REAL(0.879810),
430 REAL(0.052670), REAL(-0.184618), REAL(0.842019),
431 REAL(0.023477), REAL(-0.184638), REAL(0.889811),
432 REAL(0.022626), REAL(-0.210587), REAL(0.827500),
433 REAL(0.223089), REAL(0.211976), REAL(0.620493),
434 REAL(0.251444), REAL(0.113067), REAL(0.666494),
435 REAL(0.251419), REAL(0.089540), REAL(0.673887),
436 REAL(0.214360), REAL(0.019258), REAL(0.771595),
437 REAL(0.158999), REAL(0.001490), REAL(0.835374),
438 REAL(0.176696), REAL(-0.059249), REAL(0.849218),
439 REAL(0.148696), REAL(-0.130091), REAL(0.793599),
440 REAL(0.108290), REAL(-0.166528), REAL(0.772088),
441 REAL(0.049820), REAL(-0.201382), REAL(0.764454),
442 REAL(0.071341), REAL(-0.215195), REAL(0.697209),
443 REAL(0.073148), REAL(-0.214475), REAL(0.623510),
444 REAL(0.140502), REAL(-0.169461), REAL(0.699354),
445 REAL(0.163374), REAL(-0.157073), REAL(0.611416),
446 REAL(0.189466), REAL(-0.138550), REAL(0.730366),
447 REAL(0.247593), REAL(-0.082554), REAL(0.759610),
448 REAL(0.227468), REAL(-0.121982), REAL(0.590197),
449 REAL(0.284702), REAL(-0.006586), REAL(0.535347),
450 REAL(0.275741), REAL(0.125287), REAL(0.446676),
451 REAL(0.266650), REAL(0.192594), REAL(0.506044),
452 REAL(0.300086), REAL(0.053287), REAL(0.629620),
453 REAL(0.055450), REAL(-0.663935), REAL(0.375065),
454 REAL(0.122854), REAL(-0.664138), REAL(0.482323),
455 REAL(0.046520), REAL(-0.531571), REAL(0.391918),
456 REAL(0.024824), REAL(-0.568450), REAL(0.275106),
457 REAL(0.053855), REAL(-0.663931), REAL(0.328224),
458 REAL(0.112829), REAL(-0.453549), REAL(0.305788),
459 REAL(0.131265), REAL(-0.510617), REAL(0.080746),
460 REAL(0.061174), REAL(-0.430716), REAL(-0.042710),
461 REAL(0.341019), REAL(-0.532887), REAL(-0.208150),
462 REAL(0.347705), REAL(-0.623533), REAL(-0.081139),
463 REAL(0.238040), REAL(-0.610732), REAL(-0.038037),
464 REAL(0.211764), REAL(-0.514274), REAL(-0.132078),
465 REAL(0.120605), REAL(-0.600219), REAL(-0.186856),
466 REAL(0.096985), REAL(-0.584476), REAL(-0.293357),
467 REAL(0.127621), REAL(-0.581941), REAL(-0.437170),
468 REAL(0.165902), REAL(-0.477425), REAL(-0.291453),
469 REAL(0.077720), REAL(-0.417975), REAL(-0.220519),
470 REAL(0.320892), REAL(-0.506363), REAL(-0.320874),
471 REAL(0.248214), REAL(-0.465684), REAL(-0.239842),
472 REAL(0.118764), REAL(-0.383338), REAL(-0.187114),
473 REAL(0.118816), REAL(-0.430106), REAL(-0.123307),
474 REAL(0.094131), REAL(-0.419464), REAL(-0.044777),
475 REAL(0.274526), REAL(-0.261706), REAL(0.005110),
476 REAL(0.259842), REAL(-0.283292), REAL(-0.003185),
477 REAL(0.222861), REAL(-0.340431), REAL(-0.038210),
478 REAL(0.204445), REAL(-0.664380), REAL(0.513353),
479 REAL(0.259286), REAL(-0.664547), REAL(0.471281),
480 REAL(0.185402), REAL(-0.476020), REAL(0.421718),
481 REAL(0.279163), REAL(-0.664604), REAL(0.417328),
482 REAL(0.277157), REAL(-0.528122), REAL(0.400208),
483 REAL(0.183069), REAL(-0.509812), REAL(0.329995),
484 REAL(0.282599), REAL(-0.429210), REAL(0.059242),
485 REAL(0.254816), REAL(-0.664541), REAL(0.290687),
486 REAL(0.271436), REAL(-0.567707), REAL(0.263966),
487 REAL(0.386561), REAL(-0.625221), REAL(-0.216870),
488 REAL(0.387086), REAL(-0.630883), REAL(-0.346073),
489 REAL(0.380021), REAL(-0.596021), REAL(-0.318679),
490 REAL(0.291269), REAL(-0.619007), REAL(-0.585707),
491 REAL(0.339280), REAL(-0.571198), REAL(-0.461946),
492 REAL(0.400045), REAL(-0.489778), REAL(-0.422640),
493 REAL(0.406817), REAL(-0.314349), REAL(-0.371230),
494 REAL(0.300588), REAL(-0.281718), REAL(-0.170549),
495 REAL(0.290866), REAL(-0.277304), REAL(-0.061905),
496 REAL(0.187735), REAL(-0.241545), REAL(0.509437),
497 REAL(0.188032), REAL(-0.287569), REAL(0.424234),
498 REAL(0.227520), REAL(-0.373262), REAL(0.293102),
499 REAL(0.266526), REAL(-0.273650), REAL(0.039597),
500 REAL(0.291592), REAL(-0.291676), REAL(0.111386),
501 REAL(0.291914), REAL(-0.122741), REAL(0.422683),
502 REAL(0.297574), REAL(-0.156119), REAL(0.373368),
503 REAL(0.286603), REAL(-0.232731), REAL(0.027162),
504 REAL(0.364663), REAL(-0.201399), REAL(0.206850),
505 REAL(0.353855), REAL(-0.132408), REAL(0.149228),
506 REAL(0.282208), REAL(-0.019715), REAL(0.314960),
507 REAL(0.331187), REAL(-0.099266), REAL(0.092701),
508 REAL(0.375463), REAL(-0.093120), REAL(-0.006467),
509 REAL(0.375917), REAL(-0.101236), REAL(-0.154882),
510 REAL(0.466635), REAL(-0.094416), REAL(-0.305669),
511 REAL(0.455805), REAL(-0.119881), REAL(-0.460632),
512 REAL(0.277465), REAL(-0.604242), REAL(-0.651871),
513 REAL(0.261022), REAL(-0.551176), REAL(-0.554667),
514 REAL(0.093627), REAL(0.258494), REAL(-0.920589),
515 REAL(0.114248), REAL(0.310608), REAL(-0.798070),
516 REAL(0.144232), REAL(0.211434), REAL(-0.835001),
517 REAL(0.119916), REAL(0.176940), REAL(-0.951159),
518 REAL(0.184061), REAL(0.101854), REAL(-0.918220),
519 REAL(0.092431), REAL(0.276521), REAL(-0.738231),
520 REAL(0.133504), REAL(0.218403), REAL(-0.758602),
521 REAL(0.194987), REAL(0.097655), REAL(-0.812476),
522 REAL(0.185542), REAL(0.011005), REAL(-0.879202),
523 REAL(0.230315), REAL(-0.127450), REAL(-0.884202),
524 REAL(0.260471), REAL(0.255056), REAL(-0.624378),
525 REAL(0.351567), REAL(-0.042194), REAL(-0.663976),
526 REAL(0.253742), REAL(0.323524), REAL(-0.433716),
527 REAL(0.411612), REAL(0.132299), REAL(-0.438264),
528 REAL(0.270513), REAL(0.356530), REAL(-0.289984),
529 REAL(0.422146), REAL(0.162819), REAL(-0.273130),
530 REAL(0.164724), REAL(0.237490), REAL(0.208912),
531 REAL(0.253806), REAL(0.092900), REAL(0.240640),
532 REAL(0.203608), REAL(0.284597), REAL(0.096223),
533 REAL(0.241006), REAL(0.343093), REAL(-0.171396),
534 REAL(0.356076), REAL(0.149288), REAL(-0.143443),
535 REAL(0.337656), REAL(0.131992), REAL(0.066374)
536};
537
538int Indices[IndexCount / 3][3] = {
539 {126,134,133},
540 {342,138,134},
541 {133,134,138},
542 {126,342,134},
543 {312,316,317},
544 {169,163,162},
545 {312,317,319},
546 {312,319,318},
547 {169,162,164},
548 {169,168,163},
549 {312,314,315},
550 {169,164,165},
551 {169,167,168},
552 {312,315,316},
553 {312,313,314},
554 {169,165,166},
555 {169,166,167},
556 {312,318,313},
557 {308,304,305},
558 {308,305,306},
559 {179,181,188},
560 {177,173,175},
561 {177,175,176},
562 {302,293,300},
563 {322,294,304},
564 {188,176,175},
565 {188,175,179},
566 {158,177,187},
567 {305,293,302},
568 {305,302,306},
569 {322,304,308},
570 {188,181,183},
571 {158,173,177},
572 {293,298,300},
573 {304,294,296},
574 {304,296,305},
575 {185,176,188},
576 {185,188,183},
577 {187,177,176},
578 {187,176,185},
579 {305,296,298},
580 {305,298,293},
581 {436,432, 28},
582 {436, 28, 23},
583 {434,278,431},
584 { 30,208,209},
585 { 30,209, 29},
586 { 19, 20, 24},
587 {208,207,211},
588 {208,211,209},
589 { 19,210,212},
590 {433,434,431},
591 {433,431,432},
592 {433,432,436},
593 {436,437,433},
594 {277,275,276},
595 {277,276,278},
596 {209,210, 25},
597 { 21, 26, 24},
598 { 21, 24, 20},
599 { 25, 26, 27},
600 { 25, 27, 29},
601 {435,439,277},
602 {439,275,277},
603 {432,431, 30},
604 {432, 30, 28},
605 {433,437,438},
606 {433,438,435},
607 {434,277,278},
608 { 24, 25,210},
609 { 24, 26, 25},
610 { 29, 27, 28},
611 { 29, 28, 30},
612 { 19, 24,210},
613 {208, 30,431},
614 {208,431,278},
615 {435,434,433},
616 {435,277,434},
617 { 25, 29,209},
618 { 27, 22, 23},
619 { 27, 23, 28},
620 { 26, 22, 27},
621 { 26, 21, 22},
622 {212,210,209},
623 {212,209,211},
624 {207,208,278},
625 {207,278,276},
626 {439,435,438},
627 { 12, 9, 10},
628 { 12, 10, 13},
629 { 2, 3, 5},
630 { 2, 5, 4},
631 { 16, 13, 14},
632 { 16, 14, 17},
633 { 22, 21, 16},
634 { 13, 10, 11},
635 { 13, 11, 14},
636 { 1, 0, 3},
637 { 1, 3, 2},
638 { 15, 12, 16},
639 { 19, 18, 15},
640 { 19, 15, 16},
641 { 19, 16, 20},
642 { 9, 1, 2},
643 { 9, 2, 10},
644 { 3, 7, 8},
645 { 3, 8, 5},
646 { 16, 17, 23},
647 { 16, 23, 22},
648 { 21, 20, 16},
649 { 10, 2, 4},
650 { 10, 4, 11},
651 { 0, 6, 7},
652 { 0, 7, 3},
653 { 12, 13, 16},
654 {451,446,445},
655 {451,445,450},
656 {442,440,439},
657 {442,439,438},
658 {442,438,441},
659 {421,420,422},
660 {412,411,426},
661 {412,426,425},
662 {408,405,407},
663 {413, 67, 68},
664 {413, 68,414},
665 {391,390,412},
666 { 80,384,386},
667 {404,406,378},
668 {390,391,377},
669 {390,377, 88},
670 {400,415,375},
671 {398,396,395},
672 {398,395,371},
673 {398,371,370},
674 {112,359,358},
675 {112,358,113},
676 {351,352,369},
677 {125,349,348},
678 {345,343,342},
679 {342,340,339},
680 {341,335,337},
681 {328,341,327},
682 {331,323,333},
683 {331,322,323},
684 {327,318,319},
685 {327,319,328},
686 {315,314,324},
687 {302,300,301},
688 {302,301,303},
689 {320,311,292},
690 {285,284,289},
691 {310,307,288},
692 {310,288,290},
693 {321,350,281},
694 {321,281,282},
695 {423,448,367},
696 {272,273,384},
697 {272,384,274},
698 {264,265,382},
699 {264,382,383},
700 {440,442,261},
701 {440,261,263},
702 {252,253,254},
703 {252,254,251},
704 {262,256,249},
705 {262,249,248},
706 {228,243,242},
707 {228, 31,243},
708 {213,215,238},
709 {213,238,237},
710 { 19,212,230},
711 {224,225,233},
712 {224,233,231},
713 {217,218, 56},
714 {217, 56, 54},
715 {217,216,239},
716 {217,239,238},
717 {217,238,215},
718 {218,217,215},
719 {218,215,214},
720 { 6,102,206},
721 {186,199,200},
722 {197,182,180},
723 {170,171,157},
724 {201,200,189},
725 {170,190,191},
726 {170,191,192},
727 {175,174,178},
728 {175,178,179},
729 {168,167,155},
730 {122,149,158},
731 {122,158,159},
732 {135,153,154},
733 {135,154,118},
734 {143,140,141},
735 {143,141,144},
736 {132,133,136},
737 {130,126,133},
738 {124,125,127},
739 {122,101,100},
740 {122,100,121},
741 {110,108,107},
742 {110,107,109},
743 { 98, 99, 97},
744 { 98, 97, 64},
745 { 98, 64, 66},
746 { 87, 55, 57},
747 { 83, 82, 79},
748 { 83, 79, 84},
749 { 78, 74, 50},
750 { 49, 71, 41},
751 { 49, 41, 37},
752 { 49, 37, 36},
753 { 58, 44, 60},
754 { 60, 59, 58},
755 { 51, 34, 33},
756 { 39, 40, 42},
757 { 39, 42, 38},
758 {243,240, 33},
759 {243, 33,229},
760 { 39, 38, 6},
761 { 44, 46, 40},
762 { 55, 56, 57},
763 { 64, 62, 65},
764 { 64, 65, 66},
765 { 41, 71, 45},
766 { 75, 50, 51},
767 { 81, 79, 82},
768 { 77, 88, 73},
769 { 93, 92, 94},
770 { 68, 47, 46},
771 { 96, 97, 99},
772 { 96, 99, 95},
773 {110,109,111},
774 {111,112,110},
775 {114,113,123},
776 {114,123,124},
777 {132,131,129},
778 {133,137,136},
779 {135,142,145},
780 {145,152,135},
781 {149,147,157},
782 {157,158,149},
783 {164,150,151},
784 {153,163,168},
785 {153,168,154},
786 {185,183,182},
787 {185,182,184},
788 {161,189,190},
789 {200,199,191},
790 {200,191,190},
791 {180,178,195},
792 {180,195,196},
793 {102,101,204},
794 {102,204,206},
795 { 43, 48,104},
796 { 43,104,103},
797 {216,217, 54},
798 {216, 54, 32},
799 {207,224,231},
800 {230,212,211},
801 {230,211,231},
802 {227,232,241},
803 {227,241,242},
804 {235,234,241},
805 {235,241,244},
806 {430,248,247},
807 {272,274,253},
808 {272,253,252},
809 {439,260,275},
810 {225,224,259},
811 {225,259,257},
812 {269,270,407},
813 {269,407,405},
814 {270,269,273},
815 {270,273,272},
816 {273,269,268},
817 {273,268,267},
818 {273,267,266},
819 {273,266,265},
820 {273,265,264},
821 {448,279,367},
822 {281,350,368},
823 {285,286,301},
824 {290,323,310},
825 {290,311,323},
826 {282,281,189},
827 {292,311,290},
828 {292,290,291},
829 {307,306,302},
830 {307,302,303},
831 {316,315,324},
832 {316,324,329},
833 {331,351,350},
834 {330,334,335},
835 {330,335,328},
836 {341,337,338},
837 {344,355,354},
838 {346,345,348},
839 {346,348,347},
840 {364,369,352},
841 {364,352,353},
842 {365,363,361},
843 {365,361,362},
844 {376,401,402},
845 {373,372,397},
846 {373,397,400},
847 {376, 92,377},
848 {381,378,387},
849 {381,387,385},
850 {386, 77, 80},
851 {390,389,412},
852 {416,417,401},
853 {403,417,415},
854 {408,429,430},
855 {419,423,418},
856 {427,428,444},
857 {427,444,446},
858 {437,436,441},
859 {450,445, 11},
860 {450, 11, 4},
861 {447,449, 5},
862 {447, 5, 8},
863 {441,438,437},
864 {425,426,451},
865 {425,451,452},
866 {417,421,415},
867 {408,407,429},
868 {399,403,400},
869 {399,400,397},
870 {394,393,416},
871 {389,411,412},
872 {386,383,385},
873 {408,387,378},
874 {408,378,406},
875 {377,391,376},
876 { 94,375,415},
877 {372,373,374},
878 {372,374,370},
879 {359,111,360},
880 {359,112,111},
881 {113,358,349},
882 {113,349,123},
883 {346,343,345},
884 {343,340,342},
885 {338,336,144},
886 {338,144,141},
887 {327,341,354},
888 {327,354,326},
889 {331,350,321},
890 {331,321,322},
891 {314,313,326},
892 {314,326,325},
893 {300,298,299},
894 {300,299,301},
895 {288,287,289},
896 {189,292,282},
897 {287,288,303},
898 {284,285,297},
899 {368,280,281},
900 {448,447,279},
901 {274,226,255},
902 {267,268,404},
903 {267,404,379},
904 {429,262,430},
905 {439,440,260},
906 {257,258,249},
907 {257,249,246},
908 {430,262,248},
909 {234,228,242},
910 {234,242,241},
911 {237,238,239},
912 {237,239,236},
913 { 15, 18,227},
914 { 15,227,229},
915 {222,223, 82},
916 {222, 82, 83},
917 {214,215,213},
918 {214,213, 81},
919 { 38,102, 6},
920 {122,159,200},
921 {122,200,201},
922 {174,171,192},
923 {174,192,194},
924 {197,193,198},
925 {190,170,161},
926 {181,179,178},
927 {181,178,180},
928 {166,156,155},
929 {163,153,152},
930 {163,152,162},
931 {120,156,149},
932 {120,149,121},
933 {152,153,135},
934 {140,143,142},
935 {135,131,132},
936 {135,132,136},
937 {130,129,128},
938 {130,128,127},
939 {100,105,119},
940 {100,119,120},
941 {106,104,107},
942 {106,107,108},
943 { 91, 95, 59},
944 { 93, 94, 68},
945 { 91, 89, 92},
946 { 76, 53, 55},
947 { 76, 55, 87},
948 { 81, 78, 79},
949 { 74, 73, 49},
950 { 69, 60, 45},
951 { 58, 62, 64},
952 { 58, 64, 61},
953 { 53, 31, 32},
954 { 32, 54, 53},
955 { 42, 43, 38},
956 { 35, 36, 0},
957 { 35, 0, 1},
958 { 34, 35, 1},
959 { 34, 1, 9},
960 { 44, 40, 41},
961 { 44, 41, 45},
962 { 33,240, 51},
963 { 63, 62, 58},
964 { 63, 58, 59},
965 { 45, 71, 70},
966 { 76, 75, 51},
967 { 76, 51, 52},
968 { 86, 85, 84},
969 { 86, 84, 87},
970 { 89, 72, 73},
971 { 89, 73, 88},
972 { 91, 92, 96},
973 { 91, 96, 95},
974 { 72, 91, 60},
975 { 72, 60, 69},
976 {104,106,105},
977 {119,105,117},
978 {119,117,118},
979 {124,127,128},
980 {117,116,129},
981 {117,129,131},
982 {118,117,131},
983 {135,140,142},
984 {146,150,152},
985 {146,152,145},
986 {149,122,121},
987 {166,165,151},
988 {166,151,156},
989 {158,172,173},
990 {161,160,189},
991 {199,198,193},
992 {199,193,191},
993 {204,201,202},
994 {178,174,194},
995 {200,159,186},
996 {109, 48, 67},
997 { 48,107,104},
998 {216, 32,236},
999 {216,236,239},
1000 {223,214, 81},
1001 {223, 81, 82},
1002 { 33, 12, 15},
1003 { 32,228,234},
1004 { 32,234,236},
1005 {240, 31, 52},
1006 {256,255,246},
1007 {256,246,249},
1008 {258,263,248},
1009 {258,248,249},
1010 {275,260,259},
1011 {275,259,276},
1012 {207,276,259},
1013 {270,271,429},
1014 {270,429,407},
1015 {413,418,366},
1016 {413,366,365},
1017 {368,367,279},
1018 {368,279,280},
1019 {303,301,286},
1020 {303,286,287},
1021 {283,282,292},
1022 {283,292,291},
1023 {320,292,189},
1024 {298,296,297},
1025 {298,297,299},
1026 {318,327,326},
1027 {318,326,313},
1028 {329,330,317},
1029 {336,333,320},
1030 {326,354,353},
1031 {334,332,333},
1032 {334,333,336},
1033 {342,339,139},
1034 {342,139,138},
1035 {345,342,126},
1036 {347,357,356},
1037 {369,368,351},
1038 {363,356,357},
1039 {363,357,361},
1040 {366,367,368},
1041 {366,368,369},
1042 {375,373,400},
1043 { 92, 90,377},
1044 {409,387,408},
1045 {386,385,387},
1046 {386,387,388},
1047 {412,394,391},
1048 {396,398,399},
1049 {408,406,405},
1050 {415,421,419},
1051 {415,419,414},
1052 {425,452,448},
1053 {425,448,424},
1054 {444,441,443},
1055 {448,452,449},
1056 {448,449,447},
1057 {446,444,443},
1058 {446,443,445},
1059 {250,247,261},
1060 {250,261,428},
1061 {421,422,423},
1062 {421,423,419},
1063 {427,410,250},
1064 {417,403,401},
1065 {403,402,401},
1066 {420,392,412},
1067 {420,412,425},
1068 {420,425,424},
1069 {386,411,389},
1070 {383,382,381},
1071 {383,381,385},
1072 {378,379,404},
1073 {372,371,395},
1074 {372,395,397},
1075 {371,372,370},
1076 {361,359,360},
1077 {361,360,362},
1078 {368,350,351},
1079 {349,347,348},
1080 {356,355,344},
1081 {356,344,346},
1082 {344,341,340},
1083 {344,340,343},
1084 {338,337,336},
1085 {328,335,341},
1086 {324,352,351},
1087 {324,351,331},
1088 {320,144,336},
1089 {314,325,324},
1090 {322,308,309},
1091 {310,309,307},
1092 {287,286,289},
1093 {203,280,279},
1094 {203,279,205},
1095 {297,295,283},
1096 {297,283,284},
1097 {447,205,279},
1098 {274,384, 80},
1099 {274, 80,226},
1100 {266,267,379},
1101 {266,379,380},
1102 {225,257,246},
1103 {225,246,245},
1104 {256,254,253},
1105 {256,253,255},
1106 {430,247,250},
1107 {226,235,244},
1108 {226,244,245},
1109 {232,233,244},
1110 {232,244,241},
1111 {230, 18, 19},
1112 { 32, 31,228},
1113 {219,220, 86},
1114 {219, 86, 57},
1115 {226,213,235},
1116 {206, 7, 6},
1117 {122,201,101},
1118 {201,204,101},
1119 {180,196,197},
1120 {170,192,171},
1121 {200,190,189},
1122 {194,193,195},
1123 {183,181,180},
1124 {183,180,182},
1125 {155,154,168},
1126 {149,156,151},
1127 {149,151,148},
1128 {155,156,120},
1129 {145,142,143},
1130 {145,143,146},
1131 {136,137,140},
1132 {133,132,130},
1133 {128,129,116},
1134 {100,120,121},
1135 {110,112,113},
1136 {110,113,114},
1137 { 66, 65, 63},
1138 { 66, 63, 99},
1139 { 66, 99, 98},
1140 { 96, 46, 61},
1141 { 89, 88, 90},
1142 { 86, 87, 57},
1143 { 80, 78, 81},
1144 { 72, 69, 49},
1145 { 67, 48, 47},
1146 { 67, 47, 68},
1147 { 56, 55, 53},
1148 { 50, 49, 36},
1149 { 50, 36, 35},
1150 { 40, 39, 41},
1151 {242,243,229},
1152 {242,229,227},
1153 { 6, 37, 39},
1154 { 42, 47, 48},
1155 { 42, 48, 43},
1156 { 61, 46, 44},
1157 { 45, 70, 69},
1158 { 69, 70, 71},
1159 { 69, 71, 49},
1160 { 74, 78, 77},
1161 { 83, 84, 85},
1162 { 73, 74, 77},
1163 { 93, 96, 92},
1164 { 68, 46, 93},
1165 { 95, 99, 63},
1166 { 95, 63, 59},
1167 {115,108,110},
1168 {115,110,114},
1169 {125,126,127},
1170 {129,130,132},
1171 {137,133,138},
1172 {137,138,139},
1173 {148,146,143},
1174 {148,143,147},
1175 {119,118,154},
1176 {161,147,143},
1177 {165,164,151},
1178 {158,157,171},
1179 {158,171,172},
1180 {159,158,187},
1181 {159,187,186},
1182 {194,192,191},
1183 {194,191,193},
1184 {189,202,201},
1185 {182,197,184},
1186 {205, 8, 7},
1187 { 48,109,107},
1188 {218,219, 57},
1189 {218, 57, 56},
1190 {207,231,211},
1191 {232,230,231},
1192 {232,231,233},
1193 { 53, 52, 31},
1194 {388,411,386},
1195 {409,430,250},
1196 {262,429,254},
1197 {262,254,256},
1198 {442,444,428},
1199 {273,264,383},
1200 {273,383,384},
1201 {429,271,251},
1202 {429,251,254},
1203 {413,365,362},
1204 { 67,413,360},
1205 {282,283,295},
1206 {285,301,299},
1207 {202,281,280},
1208 {284,283,291},
1209 {284,291,289},
1210 {320,189,160},
1211 {308,306,307},
1212 {307,309,308},
1213 {319,317,330},
1214 {319,330,328},
1215 {353,352,324},
1216 {332,331,333},
1217 {340,341,338},
1218 {354,341,344},
1219 {349,358,357},
1220 {349,357,347},
1221 {364,355,356},
1222 {364,356,363},
1223 {364,365,366},
1224 {364,366,369},
1225 {374,376,402},
1226 {375, 92,373},
1227 { 77,389,390},
1228 {382,380,381},
1229 {389, 77,386},
1230 {393,394,412},
1231 {393,412,392},
1232 {401,394,416},
1233 {415,400,403},
1234 {411,410,427},
1235 {411,427,426},
1236 {422,420,424},
1237 {247,248,263},
1238 {247,263,261},
1239 {445,443, 14},
1240 {445, 14, 11},
1241 {449,450, 4},
1242 {449, 4, 5},
1243 {443,441, 17},
1244 {443, 17, 14},
1245 {436, 23, 17},
1246 {436, 17,441},
1247 {424,448,422},
1248 {448,423,422},
1249 {414,419,418},
1250 {414,418,413},
1251 {406,404,405},
1252 {399,397,395},
1253 {399,395,396},
1254 {420,416,392},
1255 {388,410,411},
1256 {386,384,383},
1257 {390, 88, 77},
1258 {375, 94, 92},
1259 {415,414, 68},
1260 {415, 68, 94},
1261 {370,374,402},
1262 {370,402,398},
1263 {361,357,358},
1264 {361,358,359},
1265 {125,348,126},
1266 {346,344,343},
1267 {340,338,339},
1268 {337,335,334},
1269 {337,334,336},
1270 {325,353,324},
1271 {324,331,332},
1272 {324,332,329},
1273 {323,322,309},
1274 {323,309,310},
1275 {294,295,297},
1276 {294,297,296},
1277 {289,286,285},
1278 {202,280,203},
1279 {288,307,303},
1280 {282,295,321},
1281 { 67,360,111},
1282 {418,423,367},
1283 {418,367,366},
1284 {272,252,251},
1285 {272,251,271},
1286 {272,271,270},
1287 {255,253,274},
1288 {265,266,380},
1289 {265,380,382},
1290 {442,428,261},
1291 {440,263,258},
1292 {440,258,260},
1293 {409,250,410},
1294 {255,226,245},
1295 {255,245,246},
1296 { 31,240,243},
1297 {236,234,235},
1298 {236,235,237},
1299 {233,225,245},
1300 {233,245,244},
1301 {220,221, 85},
1302 {220, 85, 86},
1303 { 81,213,226},
1304 { 81,226, 80},
1305 { 7,206,205},
1306 {186,184,198},
1307 {186,198,199},
1308 {204,203,205},
1309 {204,205,206},
1310 {195,193,196},
1311 {171,174,172},
1312 {173,174,175},
1313 {173,172,174},
1314 {155,167,166},
1315 {160,161,143},
1316 {160,143,144},
1317 {119,154,155},
1318 {148,151,150},
1319 {148,150,146},
1320 {140,137,139},
1321 {140,139,141},
1322 {127,126,130},
1323 {114,124,128},
1324 {114,128,115},
1325 {117,105,106},
1326 {117,106,116},
1327 {104,105,100},
1328 {104,100,103},
1329 { 59, 60, 91},
1330 { 97, 96, 61},
1331 { 97, 61, 64},
1332 { 91, 72, 89},
1333 { 87, 84, 79},
1334 { 87, 79, 76},
1335 { 78, 80, 77},
1336 { 49, 50, 74},
1337 { 60, 44, 45},
1338 { 61, 44, 58},
1339 { 51, 50, 35},
1340 { 51, 35, 34},
1341 { 39, 37, 41},
1342 { 33, 34, 9},
1343 { 33, 9, 12},
1344 { 0, 36, 37},
1345 { 0, 37, 6},
1346 { 40, 46, 47},
1347 { 40, 47, 42},
1348 { 53, 54, 56},
1349 { 65, 62, 63},
1350 { 72, 49, 73},
1351 { 79, 78, 75},
1352 { 79, 75, 76},
1353 { 52, 53, 76},
1354 { 92, 89, 90},
1355 { 96, 93, 46},
1356 {102,103,100},
1357 {102,100,101},
1358 {116,106,108},
1359 {116,108,115},
1360 {123,125,124},
1361 {116,115,128},
1362 {118,131,135},
1363 {140,135,136},
1364 {148,147,149},
1365 {120,119,155},
1366 {164,162,152},
1367 {164,152,150},
1368 {157,147,161},
1369 {157,161,170},
1370 {186,187,185},
1371 {186,185,184},
1372 {193,197,196},
1373 {202,203,204},
1374 {194,195,178},
1375 {198,184,197},
1376 { 67,111,109},
1377 { 38, 43,103},
1378 { 38,103,102},
1379 {214,223,222},
1380 {214,222,221},
1381 {214,221,220},
1382 {214,220,219},
1383 {214,219,218},
1384 {213,237,235},
1385 {221,222, 83},
1386 {221, 83, 85},
1387 { 15,229, 33},
1388 {227, 18,230},
1389 {227,230,232},
1390 { 52, 51,240},
1391 { 75, 78, 50},
1392 {408,430,409},
1393 {260,258,257},
1394 {260,257,259},
1395 {224,207,259},
1396 {268,269,405},
1397 {268,405,404},
1398 {413,362,360},
1399 {447, 8,205},
1400 {299,297,285},
1401 {189,281,202},
1402 {290,288,289},
1403 {290,289,291},
1404 {322,321,295},
1405 {322,295,294},
1406 {333,323,311},
1407 {333,311,320},
1408 {317,316,329},
1409 {320,160,144},
1410 {353,325,326},
1411 {329,332,334},
1412 {329,334,330},
1413 {339,338,141},
1414 {339,141,139},
1415 {348,345,126},
1416 {347,356,346},
1417 {123,349,125},
1418 {364,353,354},
1419 {364,354,355},
1420 {365,364,363},
1421 {376,391,394},
1422 {376,394,401},
1423 { 92,376,374},
1424 { 92,374,373},
1425 {377, 90, 88},
1426 {380,379,378},
1427 {380,378,381},
1428 {388,387,409},
1429 {388,409,410},
1430 {416,393,392},
1431 {399,398,402},
1432 {399,402,403},
1433 {250,428,427},
1434 {421,417,416},
1435 {421,416,420},
1436 {426,427,446},
1437 {426,446,451},
1438 {444,442,441},
1439 {452,451,450},
1440 {452,450,449}
1441};
1442
1443
1444// this is called by dSpaceCollide when two objects in space are
1445// potentially colliding.
1446
1447static void nearCallback (void *data, dGeomID o1, dGeomID o2)
1448{
1449 int i;
1450 // if (o1->body && o2->body) return;
1451
1452 // exit without doing anything if the two bodies are connected by a joint
1453 dBodyID b1 = dGeomGetBody(o1);
1454 dBodyID b2 = dGeomGetBody(o2);
1455 if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return;
1456
1457 dContact contact[MAX_CONTACTS]; // up to MAX_CONTACTS contacts per box-box
1458 for (i=0; i<MAX_CONTACTS; i++) {
1459 contact[i].surface.mode = dContactBounce | dContactSoftCFM;
1460 contact[i].surface.mu = dInfinity;
1461 contact[i].surface.mu2 = 0;
1462 contact[i].surface.bounce = 0.1;
1463 contact[i].surface.bounce_vel = 0.1;
1464 contact[i].surface.soft_cfm = 0.01;
1465 }
1466 if (int numc = dCollide (o1,o2,MAX_CONTACTS,&contact[0].geom,
1467 sizeof(dContact))) {
1468 dMatrix3 RI;
1469 dRSetIdentity (RI);
1470 const dReal ss[3] = {0.02,0.02,0.02};
1471 for (i=0; i<numc; i++) {
1472 dJointID c = dJointCreateContact (world,contactgroup,contact+i);
1473 dJointAttach (c,b1,b2);
1474 if (show_contacts) dsDrawBox (contact[i].geom.pos,RI,ss);
1475 }
1476 }
1477}
1478
1479
1480// start simulation - set viewpoint
1481
1482static void start()
1483{
1484 static float xyz[3] = {2.1640f,-1.3079f,1.7600f};
1485 static float hpr[3] = {125.5000f,-17.0000f,0.0000f};
1486 dsSetViewpoint (xyz,hpr);
1487 printf ("To drop another object, press:\n");
1488 printf (" b for box.\n");
1489 printf (" s for sphere.\n");
1490 printf (" y for cylinder.\n");
1491 printf (" c for capsule.\n");
1492 printf (" x for a composite object.\n");
1493 printf (" m for a trimesh.\n");
1494 printf ("To select an object, press space.\n");
1495 printf ("To disable the selected object, press d.\n");
1496 printf ("To enable the selected object, press e.\n");
1497 printf ("To toggle showing the geom AABBs, press a.\n");
1498 printf ("To toggle showing the contact points, press t.\n");
1499 printf ("To toggle dropping from random position/orientation, press r.\n");
1500}
1501
1502
1503char locase (char c)
1504{
1505 if (c >= 'A' && c <= 'Z') return c - ('a'-'A');
1506 else return c;
1507}
1508
1509
1510// called when a key pressed
1511
1512static void command (int cmd)
1513{
1514 int i,j,k;
1515 dReal sides[3];
1516 dMass m;
1517
1518 cmd = locase (cmd);
1519 if (cmd == 'b' || cmd == 's' || cmd == 'c' || cmd == 'x' || cmd == 'm' || cmd == 'y' ) {
1520 if (num < NUM) {
1521 i = num;
1522 num++;
1523 }
1524 else {
1525 i = nextobj;
1526 nextobj++;
1527 if (nextobj >= num) nextobj = 0;
1528
1529 // destroy the body and geoms for slot i
1530 dBodyDestroy (obj[i].body);
1531 for (k=0; k < GPB; k++) {
1532 if (obj[i].geom[k]) dGeomDestroy (obj[i].geom[k]);
1533 }
1534 memset (&obj[i],0,sizeof(obj[i]));
1535 }
1536
1537 obj[i].body = dBodyCreate (world);
1538 for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1;
1539
1540 dMatrix3 R;
1541 if (random_pos) {
1542 dBodySetPosition (obj[i].body,
1543 dRandReal()*2-1,dRandReal()*2-1,dRandReal()+3);
1544 dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0,
1545 dRandReal()*2.0-1.0,dRandReal()*10.0-5.0);
1546 }
1547 else {
1548 dReal maxheight = 0;
1549 for (k=0; k<num; k++) {
1550 const dReal *pos = dBodyGetPosition (obj[k].body);
1551 if (pos[2] > maxheight) maxheight = pos[2];
1552 }
1553 dBodySetPosition (obj[i].body, 0,0,maxheight+1);
1554 dRFromAxisAndAngle (R,0,0,1,dRandReal()*10.0-5.0);
1555 }
1556 dBodySetRotation (obj[i].body,R);
1557 dBodySetData (obj[i].body,(void*)(size_t)i);
1558
1559 if (cmd == 'b') {
1560 dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]);
1561 obj[i].geom[0] = dCreateBox (space,sides[0],sides[1],sides[2]);
1562 }
1563 else if (cmd == 'c') {
1564 sides[0] *= 0.5;
1565 dMassSetCapsule (&m,DENSITY,3,sides[0],sides[1]);
1566 obj[i].geom[0] = dCreateCapsule (space,sides[0],sides[1]);
1567 }
1568 else if (cmd == 'y') {
1569 sides[1] *= 0.5;
1570 dMassSetCylinder (&m,DENSITY,3,sides[0],sides[1]);
1571 obj[i].geom[0] = dCreateCylinder (space,sides[0],sides[1]);
1572 }
1573 else if (cmd == 's') {
1574 sides[0] *= 0.5;
1575 dMassSetSphere (&m,DENSITY,sides[0]);
1576 obj[i].geom[0] = dCreateSphere (space,sides[0]);
1577 }
1578 else if (cmd == 'm') {
1579 dTriMeshDataID new_tmdata = dGeomTriMeshDataCreate();
1580 dGeomTriMeshDataBuildSingle(new_tmdata, &Vertices[0], 3 * sizeof(float), VertexCount, (int*)&Indices[0], IndexCount, 3 * sizeof(int));
1581
1582 obj[i].geom[0] = dCreateTriMesh(space, new_tmdata, 0, 0, 0);
1583
1584 // remember the mesh's dTriMeshDataID on its userdata for convenience.
1585 dGeomSetData(obj[i].geom[0], new_tmdata);
1586
1587 dMassSetTrimesh( &m, DENSITY, obj[i].geom[0] );
1588 printf("mass at %f %f %f\n", m.c[0], m.c[1], m.c[2]);
1589 dGeomSetPosition(obj[i].geom[0], -m.c[0], -m.c[1], -m.c[2]);
1590 dMassTranslate(&m, -m.c[0], -m.c[1], -m.c[2]);
1591 }
1592 else if (cmd == 'x') {
1593 dGeomID g2[GPB]; // encapsulated geometries
1594 dReal dpos[GPB][3]; // delta-positions for encapsulated geometries
1595
1596 // start accumulating masses for the encapsulated geometries
1597 dMass m2;
1598 dMassSetZero (&m);
1599
1600 // set random delta positions
1601 for (j=0; j<GPB; j++) {
1602 for (k=0; k<3; k++) dpos[j][k] = dRandReal()*0.3-0.15;
1603 }
1604
1605 for (k=0; k<GPB; k++) {
1606 obj[i].geom[k] = dCreateGeomTransform (space);
1607 dGeomTransformSetCleanup (obj[i].geom[k],1);
1608 if (k==0) {
1609 dReal radius = dRandReal()*0.25+0.05;
1610 g2[k] = dCreateSphere (0,radius);
1611 dMassSetSphere (&m2,DENSITY,radius);
1612 }
1613 else if (k==1) {
1614 g2[k] = dCreateBox (0,sides[0],sides[1],sides[2]);
1615 dMassSetBox (&m2,DENSITY,sides[0],sides[1],sides[2]);
1616 }
1617 else {
1618 dReal radius = dRandReal()*0.1+0.05;
1619 dReal length = dRandReal()*1.0+0.1;
1620 g2[k] = dCreateCapsule (0,radius,length);
1621 dMassSetCapsule (&m2,DENSITY,3,radius,length);
1622 }
1623 dGeomTransformSetGeom (obj[i].geom[k],g2[k]);
1624
1625 // set the transformation (adjust the mass too)
1626 dGeomSetPosition (g2[k],dpos[k][0],dpos[k][1],dpos[k][2]);
1627 dMassTranslate (&m2,dpos[k][0],dpos[k][1],dpos[k][2]);
1628 dMatrix3 Rtx;
1629 dRFromAxisAndAngle (Rtx,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0,
1630 dRandReal()*2.0-1.0,dRandReal()*10.0-5.0);
1631 dGeomSetRotation (g2[k],Rtx);
1632 dMassRotate (&m2,Rtx);
1633
1634 // add to the total mass
1635 dMassAdd (&m,&m2);
1636 }
1637
1638 // move all encapsulated objects so that the center of mass is (0,0,0)
1639 for (k=0; k<2; k++) {
1640 dGeomSetPosition (g2[k],
1641 dpos[k][0]-m.c[0],
1642 dpos[k][1]-m.c[1],
1643 dpos[k][2]-m.c[2]);
1644 }
1645 dMassTranslate (&m,-m.c[0],-m.c[1],-m.c[2]);
1646 }
1647
1648 for (k=0; k < GPB; k++) {
1649 if (obj[i].geom[k]) dGeomSetBody (obj[i].geom[k],obj[i].body);
1650 }
1651
1652 dBodySetMass (obj[i].body,&m);
1653 }
1654
1655 if (cmd == ' ') {
1656 selected++;
1657 if (selected >= num) selected = 0;
1658 if (selected < 0) selected = 0;
1659 }
1660 else if (cmd == 'd' && selected >= 0 && selected < num) {
1661 dBodyDisable (obj[selected].body);
1662 }
1663 else if (cmd == 'e' && selected >= 0 && selected < num) {
1664 dBodyEnable (obj[selected].body);
1665 }
1666 else if (cmd == 'a') {
1667 show_aabb ^= 1;
1668 }
1669 else if (cmd == 't') {
1670 show_contacts ^= 1;
1671 }
1672 else if (cmd == 'r') {
1673 random_pos ^= 1;
1674 }
1675}
1676
1677
1678// draw a geom
1679
1680void drawGeom (dGeomID g, const dReal *pos, const dReal *R, int show_aabb)
1681{
1682 if (!g) return;
1683 if (!pos) pos = dGeomGetPosition (g);
1684 if (!R) R = dGeomGetRotation (g);
1685
1686 int type = dGeomGetClass (g);
1687 if (type == dBoxClass) {
1688 dVector3 sides;
1689 dGeomBoxGetLengths (g,sides);
1690 dsDrawBox (pos,R,sides);
1691 }
1692 else if (type == dSphereClass) {
1693 dsDrawSphere (pos,R,dGeomSphereGetRadius (g));
1694 }
1695 else if (type == dCapsuleClass) {
1696 dReal radius,length;
1697 dGeomCapsuleGetParams (g,&radius,&length);
1698 dsDrawCapsule (pos,R,length,radius);
1699 }
1700 else if (type == dCylinderClass) {
1701 dReal radius,length;
1702 dGeomCylinderGetParams (g,&radius,&length);
1703 dsDrawCylinder (pos,R,length,radius);
1704 }
1705
1706 else if (type == dGeomTransformClass) {
1707 dGeomID g2 = dGeomTransformGetGeom (g);
1708 const dReal *pos2 = dGeomGetPosition (g2);
1709 const dReal *R2 = dGeomGetRotation (g2);
1710 dVector3 actual_pos;
1711 dMatrix3 actual_R;
1712 dMULTIPLY0_331 (actual_pos,R,pos2);
1713 actual_pos[0] += pos[0];
1714 actual_pos[1] += pos[1];
1715 actual_pos[2] += pos[2];
1716 dMULTIPLY0_333 (actual_R,R,R2);
1717 drawGeom (g2,actual_pos,actual_R,0);
1718 }
1719
1720 if (show_aabb) {
1721 // draw the bounding box for this geom
1722 dReal aabb[6];
1723 dGeomGetAABB (g,aabb);
1724 dVector3 bbpos;
1725 for (int i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]);
1726 dVector3 bbsides;
1727 for (int j=0; j<3; j++) bbsides[j] = aabb[j*2+1] - aabb[j*2];
1728 dMatrix3 RI;
1729 dRSetIdentity (RI);
1730 dsSetColorAlpha (1,0,0,0.5);
1731 dsDrawBox (bbpos,RI,bbsides);
1732 }
1733}
1734
1735
1736// set previous transformation matrix for trimesh
1737void setCurrentTransform(dGeomID geom)
1738{
1739 const dReal* Pos = dGeomGetPosition(geom);
1740 const dReal* Rot = dGeomGetRotation(geom);
1741
1742 const dReal Transform[16] =
1743 {
1744 Rot[0], Rot[4], Rot[8], 0,
1745 Rot[1], Rot[5], Rot[9], 0,
1746 Rot[2], Rot[6], Rot[10], 0,
1747 Pos[0], Pos[1], Pos[2], 1
1748 };
1749
1750 dGeomTriMeshSetLastTransform( geom, *(dMatrix4*)(&Transform) );
1751
1752}
1753
1754
1755// simulation loop
1756
1757static void simLoop (int pause)
1758{
1759 dsSetColor (0,0,2);
1760 dSpaceCollide (space,0,&nearCallback);
1761
1762
1763#if 0
1764 // What is this for??? - Bram
1765 if (!pause)
1766 {
1767 for (int i=0; i<num; i++)
1768 for (int j=0; j < GPB; j++)
1769 if (obj[i].geom[j])
1770 if (dGeomGetClass(obj[i].geom[j]) == dTriMeshClass)
1771 setCurrentTransform(obj[i].geom[j]);
1772
1773 setCurrentTransform(TriMesh1);
1774 setCurrentTransform(TriMesh2);
1775 }
1776#endif
1777
1778 //if (!pause) dWorldStep (world,0.05);
1779 if (!pause) dWorldStepFast1 (world,0.05, 5);
1780
1781 for (int j = 0; j < dSpaceGetNumGeoms(space); j++){
1782 dSpaceGetGeom(space, j);
1783 }
1784
1785 // remove all contact joints
1786 dJointGroupEmpty (contactgroup);
1787
1788 dsSetColor (1,1,0);
1789 dsSetTexture (DS_WOOD);
1790 for (int i=0; i<num; i++) {
1791 for (int j=0; j < GPB; j++) {
1792 if (obj[i].geom[j]) {
1793 if (i==selected) {
1794 dsSetColor (0,0.7,1);
1795 }
1796 else if (! dBodyIsEnabled (obj[i].body)) {
1797 dsSetColor (1,0,0);
1798 }
1799 else {
1800 dsSetColor (1,1,0);
1801 }
1802
1803 if (dGeomGetClass(obj[i].geom[j]) == dTriMeshClass) {
1804 int* Indices = (int*)::Indices;
1805
1806 // assume all trimeshes are drawn as bunnies
1807 const dReal* Pos = dGeomGetPosition(obj[i].geom[j]);
1808 const dReal* Rot = dGeomGetRotation(obj[i].geom[j]);
1809
1810 for (int ii = 0; ii < IndexCount / 3; ii++) {
1811 const dReal v[9] = { // explicit conversion from float to dReal
1812 Vertices[Indices[ii * 3 + 0] * 3 + 0],
1813 Vertices[Indices[ii * 3 + 0] * 3 + 1],
1814 Vertices[Indices[ii * 3 + 0] * 3 + 2],
1815 Vertices[Indices[ii * 3 + 1] * 3 + 0],
1816 Vertices[Indices[ii * 3 + 1] * 3 + 1],
1817 Vertices[Indices[ii * 3 + 1] * 3 + 2],
1818 Vertices[Indices[ii * 3 + 2] * 3 + 0],
1819 Vertices[Indices[ii * 3 + 2] * 3 + 1],
1820 Vertices[Indices[ii * 3 + 2] * 3 + 2]
1821 };
1822 dsDrawTriangle(Pos, Rot, &v[0], &v[3], &v[6], 1);
1823 }
1824
1825 // tell the tri-tri collider the current transform of the trimesh --
1826 // this is fairly important for good results.
1827
1828 // Fill in the (4x4) matrix.
1829 dReal* p_matrix = obj[i].matrix_dblbuff + ( obj[i].last_matrix_index * 16 );
1830
1831 p_matrix[ 0 ] = Rot[ 0 ]; p_matrix[ 1 ] = Rot[ 1 ]; p_matrix[ 2 ] = Rot[ 2 ]; p_matrix[ 3 ] = 0;
1832 p_matrix[ 4 ] = Rot[ 4 ]; p_matrix[ 5 ] = Rot[ 5 ]; p_matrix[ 6 ] = Rot[ 6 ]; p_matrix[ 7 ] = 0;
1833 p_matrix[ 8 ] = Rot[ 8 ]; p_matrix[ 9 ] = Rot[ 9 ]; p_matrix[10 ] = Rot[10 ]; p_matrix[11 ] = 0;
1834 p_matrix[12 ] = Pos[ 0 ]; p_matrix[13 ] = Pos[ 1 ]; p_matrix[14 ] = Pos[ 2 ]; p_matrix[15 ] = 1;
1835
1836 // Flip to other matrix.
1837 obj[i].last_matrix_index = !obj[i].last_matrix_index;
1838
1839 dGeomTriMeshSetLastTransform( obj[i].geom[j],
1840 *(dMatrix4*)( obj[i].matrix_dblbuff + obj[i].last_matrix_index * 16 ) );
1841
1842 } else {
1843 drawGeom (obj[i].geom[j],0,0,show_aabb);
1844 }
1845 }
1846 }
1847 }
1848
1849 int* Indices = (int*)::Indices;
1850
1851 {const dReal* Pos = dGeomGetPosition(TriMesh1);
1852 const dReal* Rot = dGeomGetRotation(TriMesh1);
1853
1854 {for (int i = 0; i < IndexCount / 3; i++){
1855 const dReal v[9] = { // explicit conversion from float to dReal
1856 Vertices[Indices[i * 3 + 0] * 3 + 0],
1857 Vertices[Indices[i * 3 + 0] * 3 + 1],
1858 Vertices[Indices[i * 3 + 0] * 3 + 2],
1859 Vertices[Indices[i * 3 + 1] * 3 + 0],
1860 Vertices[Indices[i * 3 + 1] * 3 + 1],
1861 Vertices[Indices[i * 3 + 1] * 3 + 2],
1862 Vertices[Indices[i * 3 + 2] * 3 + 0],
1863 Vertices[Indices[i * 3 + 2] * 3 + 1],
1864 Vertices[Indices[i * 3 + 2] * 3 + 2]
1865 };
1866 dsDrawTriangle(Pos, Rot, &v[0], &v[3], &v[6], 0);
1867 }}}
1868
1869 {const dReal* Pos = dGeomGetPosition(TriMesh2);
1870 const dReal* Rot = dGeomGetRotation(TriMesh2);
1871
1872 {for (int i = 0; i < IndexCount / 3; i++){
1873 const dReal v[9] = { // explicit conversion from float to dReal
1874 Vertices[Indices[i * 3 + 0] * 3 + 0],
1875 Vertices[Indices[i * 3 + 0] * 3 + 1],
1876 Vertices[Indices[i * 3 + 0] * 3 + 2],
1877 Vertices[Indices[i * 3 + 1] * 3 + 0],
1878 Vertices[Indices[i * 3 + 1] * 3 + 1],
1879 Vertices[Indices[i * 3 + 1] * 3 + 2],
1880 Vertices[Indices[i * 3 + 2] * 3 + 0],
1881 Vertices[Indices[i * 3 + 2] * 3 + 1],
1882 Vertices[Indices[i * 3 + 2] * 3 + 2]
1883 };
1884 dsDrawTriangle(Pos, Rot, &v[0], &v[3], &v[6], 1);
1885 }}}
1886}
1887
1888
1889int main (int argc, char **argv)
1890{
1891 // setup pointers to drawstuff callback functions
1892 dsFunctions fn;
1893 fn.version = DS_VERSION;
1894 fn.start = &start;
1895 fn.step = &simLoop;
1896 fn.command = &command;
1897 fn.stop = 0;
1898 fn.path_to_textures = "../../drawstuff/textures";
1899 if(argc==2)
1900 {
1901 fn.path_to_textures = argv[1];
1902 }
1903
1904 // create world
1905 dInitODE();
1906 world = dWorldCreate();
1907
1908 space = dSimpleSpaceCreate(0);
1909 contactgroup = dJointGroupCreate (0);
1910 dWorldSetGravity (world,0,0,-0.5);
1911 dWorldSetCFM (world,1e-5);
1912 dCreatePlane (space,0,0,1,0);
1913 memset (obj,0,sizeof(obj));
1914
1915 // note: can't share tridata if intending to trimesh-trimesh collide
1916 TriData1 = dGeomTriMeshDataCreate();
1917 dGeomTriMeshDataBuildSingle(TriData1, &Vertices[0], 3 * sizeof(float), VertexCount, (int*)&Indices[0], IndexCount, 3 * sizeof(int));
1918 TriData2 = dGeomTriMeshDataCreate();
1919 dGeomTriMeshDataBuildSingle(TriData2, &Vertices[0], 3 * sizeof(float), VertexCount, (int*)&Indices[0], IndexCount, 3 * sizeof(int));
1920
1921 TriMesh1 = dCreateTriMesh(space, TriData1, 0, 0, 0);
1922 TriMesh2 = dCreateTriMesh(space, TriData2, 0, 0, 0);
1923 dGeomSetData(TriMesh1, TriData1);
1924 dGeomSetData(TriMesh2, TriData2);
1925
1926 {dGeomSetPosition(TriMesh1, 0, 0, 0.9);
1927 dMatrix3 Rotation;
1928 dRFromAxisAndAngle(Rotation, 1, 0, 0, M_PI / 2);
1929 dGeomSetRotation(TriMesh1, Rotation);}
1930
1931 {dGeomSetPosition(TriMesh2, 1, 0, 0.9);
1932 dMatrix3 Rotation;
1933 dRFromAxisAndAngle(Rotation, 1, 0, 0, M_PI / 2);
1934 dGeomSetRotation(TriMesh2, Rotation);}
1935
1936 // run simulation
1937 dsSimulationLoop (argc,argv,352,288,&fn);
1938
1939 dJointGroupDestroy (contactgroup);
1940 dSpaceDestroy (space);
1941 dWorldDestroy (world);
1942 dCloseODE();
1943 return 0;
1944}