From d48ea5bb797037069d641da41da0f195f0124491 Mon Sep 17 00:00:00 2001 From: dan miller Date: Fri, 19 Oct 2007 05:20:48 +0000 Subject: one more for the gipper --- .../contrib/TerrainAndCone/test_boxstackb.cpp | 1375 ++++++++++++++++++++ 1 file changed, 1375 insertions(+) create mode 100644 libraries/ode-0.9/contrib/TerrainAndCone/test_boxstackb.cpp (limited to 'libraries/ode-0.9/contrib/TerrainAndCone/test_boxstackb.cpp') diff --git a/libraries/ode-0.9/contrib/TerrainAndCone/test_boxstackb.cpp b/libraries/ode-0.9/contrib/TerrainAndCone/test_boxstackb.cpp new file mode 100644 index 0000000..f1fa592 --- /dev/null +++ b/libraries/ode-0.9/contrib/TerrainAndCone/test_boxstackb.cpp @@ -0,0 +1,1375 @@ +/************************************************************************* + + +* * + + +* Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * + + +* All rights reserved. Email: russ@q12.org Web: www.q12.org * + + +* * + + +* This library is free software; you can redistribute it and/or * + + +* modify it under the terms of EITHER: * + + +* (1) The GNU Lesser General Public License as published by the Free * + + +* Software Foundation; either version 2.1 of the License, or (at * + + +* your option) any later version. The text of the GNU Lesser * + + +* General Public License is included with this library in the * + + +* file LICENSE.TXT. * + + +* (2) The BSD-style license that is included with this library in * + + +* the file LICENSE-BSD.TXT. * + + +* * + + +* This library is distributed in the hope that it will be useful, * + + +* but WITHOUT ANY WARRANTY; without even the implied warranty of * + + +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * + + +* LICENSE.TXT and LICENSE-BSD.TXT for more details. * + + +* * + + +*************************************************************************/ + + + + + +#include + + +#include + + + + + +#ifdef _MSC_VER + + +#pragma warning(disable:4244 4305) // for VC++, no precision loss complaints + + +#endif + + + + + +// select correct drawing functions + + + + + +#ifdef dDOUBLE + + +#define dsDrawBox dsDrawBoxD + + +#define dsDrawSphere dsDrawSphereD + + +#define dsDrawCylinder dsDrawCylinderD + + +#define dsDrawCappedCylinder dsDrawCappedCylinderD + + +#endif + + + + + + + + +// some constants + + + + + +const dReal vTerrainLength = 4.f; + + +const dReal vTerrainHeight = 0.5f; + + +const int TERRAINNODES = 4; + + +dReal pTerrainHeights[TERRAINNODES*TERRAINNODES]; + + + + + +dGeomID terrainZ = NULL; + + +dGeomID terrainY = NULL; + + + + + +#define NUM 20 // max number of objects + + +#define DENSITY (5.0) // density of all objects + + +#define GPB 3 // maximum number of geometries per body + + +#define MAX_CONTACTS 4 // maximum number of contact points per body + + + + + + + + +// dynamics and collision objects + + + + + +struct MyObject { + + + dBodyID body; // the body + + + dGeomID geom[GPB]; // geometries representing this body + + +}; + + + + + +static int num=0; // number of objects in simulation + + +static int nextobj=0; // next object to recycle if num==NUM + + +static dWorldID world; + + +static dSpaceID space; + + +static MyObject obj[NUM]; + + +static dJointGroupID contactgroup; + + +static int selected = -1; // selected object + + +static int show_aabb = 0; // show geom AABBs? + + +static int show_contacts = 0; // show contact points? + + +static int random_pos = 1; // drop objects from random position? + + + + + + + + +// this is called by dSpaceCollide when two objects in space are + + +// potentially colliding. + + + + + +static void nearCallback (void *data, dGeomID o1, dGeomID o2) + + +{ + + + int i; + + + // if (o1->body && o2->body) return; + + + + + + // exit without doing anything if the two bodies are connected by a joint + + + dBodyID b1 = dGeomGetBody(o1); + + + dBodyID b2 = dGeomGetBody(o2); + + + if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return; + + + + + + dContact contact[MAX_CONTACTS]; // up to MAX_CONTACTS contacts per box-box + + + for (i=0; i= 'A' && c <= 'Z') return c - ('a'-'A'); + + + else return c; + + +} + + + + + + + + +// called when a key pressed + + + + + +static void command (int cmd) + + +{ + + + int i,j,k; + + + dReal sides[3]; + + + dMass m; + + + + + + cmd = locase (cmd); + + + if (cmd == 'b' || cmd == 's' || cmd == 'c' || cmd == 'x' + + + /* || cmd == 'l' */) { + + + if (num < NUM) { + + + i = num; + + + num++; + + + } + + + else { + + + i = nextobj; + + + nextobj++; + + + if (nextobj >= num) nextobj = 0; + + + + + + // destroy the body and geoms for slot i + + + dBodyDestroy (obj[i].body); + + + for (k=0; k < GPB; k++) { + + + if (obj[i].geom[k]) dGeomDestroy (obj[i].geom[k]); + + + } + + + memset (&obj[i],0,sizeof(obj[i])); + + + } + + + + + + obj[i].body = dBodyCreate (world); + + + for (k=0; k<3; k++) sides[k] = dRandReal()*0.5+0.1; + + + + + + dMatrix3 R; + + + if (random_pos) { + + + dBodySetPosition (obj[i].body, + + + dRandReal()*2-1,dRandReal()*2+1,dRandReal()+3); + + + dRFromAxisAndAngle (R,dRandReal()*2.0-1.0,dRandReal()*2.0-1.0, + + + dRandReal()*2.0-1.0,dRandReal()*10.0-5.0); + + + } + + + else { + + + dReal maxheight = 0; + + + for (k=0; k maxheight) maxheight = pos[2]; + + + } + + + dBodySetPosition (obj[i].body, 0,maxheight+1,maxheight+3); + + + dRFromAxisAndAngle (R,0,0,1,dRandReal()*10.0-5.0); + + + } + + + dBodySetRotation (obj[i].body,R); + + + dBodySetData (obj[i].body,(void*) i); + + + + + + if (cmd == 'b') { + + + dMassSetBox (&m,DENSITY,sides[0],sides[1],sides[2]); + + + obj[i].geom[0] = dCreateBox (space,sides[0],sides[1],sides[2]); + + + } + + + else if (cmd == 'c') { + + + sides[0] *= 0.5; + + + dMassSetCappedCylinder (&m,DENSITY,3,sides[0],sides[1]); + + + obj[i].geom[0] = dCreateCCylinder (space,sides[0],sides[1]); + + + } + + + /* + + + // cylinder option not yet implemented + + + else if (cmd == 'l') { + + + sides[1] *= 0.5; + + + dMassSetCappedCylinder (&m,DENSITY,3,sides[0],sides[1]); + + + obj[i].geom[0] = dCreateCylinder (space,sides[0],sides[1]); + + + } + + + */ + + + else if (cmd == 's') { + + + sides[0] *= 0.5; + + + dMassSetSphere (&m,DENSITY,sides[0]); + + + obj[i].geom[0] = dCreateSphere (space,sides[0]); + + + } + + + else if (cmd == 'x') { + + + dGeomID g2[GPB]; // encapsulated geometries + + + dReal dpos[GPB][3]; // delta-positions for encapsulated geometries + + + + + + // start accumulating masses for the encapsulated geometries + + + dMass m2; + + + dMassSetZero (&m); + + + + + + // set random delta positions + + + for (j=0; j= num) selected = 0; + + + if (selected < 0) selected = 0; + + + } + + + else if (cmd == 'd' && selected >= 0 && selected < num) { + + + dBodyDisable (obj[selected].body); + + + } + + + else if (cmd == 'e' && selected >= 0 && selected < num) { + + + dBodyEnable (obj[selected].body); + + + } + + + else if (cmd == 'a') { + + + show_aabb ^= 1; + + + } + + + else if (cmd == 't') { + + + show_contacts ^= 1; + + + } + + + else if (cmd == 'r') { + + + random_pos ^= 1; + + + } + + +} + + + + + + + + +// draw a geom + + + + + +void drawGeom (dGeomID g, const dReal *pos, const dReal *R, int show_aabb) + + +{ + + + int i; + + + + + + if (!g) return; + + + if (!pos) pos = dGeomGetPosition (g); + + + if (!R) R = dGeomGetRotation (g); + + + + + + int type = dGeomGetClass (g); + + + if (type == dBoxClass) { + + + dVector3 sides; + + + dGeomBoxGetLengths (g,sides); + + + dsDrawBox (pos,R,sides); + + + } + + + else if (type == dSphereClass) { + + + dsDrawSphere (pos,R,dGeomSphereGetRadius (g)); + + + } + + + else if (type == dCCylinderClass) { + + + dReal radius,length; + + + dGeomCCylinderGetParams (g,&radius,&length); + + + dsDrawCappedCylinder (pos,R,length,radius); + + + } + + + /* + + + // cylinder option not yet implemented + + + else if (type == dCylinderClass) { + + + dReal radius,length; + + + dGeomCylinderGetParams (g,&radius,&length); + + + dsDrawCylinder (pos,R,length,radius); + + + } + + + */ + + + else if (type == dGeomTransformClass) { + + + dGeomID g2 = dGeomTransformGetGeom (g); + + + const dReal *pos2 = dGeomGetPosition (g2); + + + const dReal *R2 = dGeomGetRotation (g2); + + + dVector3 actual_pos; + + + dMatrix3 actual_R; + + + dMULTIPLY0_331 (actual_pos,R,pos2); + + + actual_pos[0] += pos[0]; + + + actual_pos[1] += pos[1]; + + + actual_pos[2] += pos[2]; + + + dMULTIPLY0_333 (actual_R,R,R2); + + + drawGeom (g2,actual_pos,actual_R,0); + + + } + + + + + + if (show_aabb) { + + + // draw the bounding box for this geom + + + dReal aabb[6]; + + + dGeomGetAABB (g,aabb); + + + dVector3 bbpos; + + + for (i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); + + + dVector3 bbsides; + + + for (i=0; i<3; i++) bbsides[i] = aabb[i*2+1] - aabb[i*2]; + + + dMatrix3 RI; + + + dRSetIdentity (RI); + + + dsSetColorAlpha (1,0,0,0.5); + + + dsDrawBox (bbpos,RI,bbsides); + + + } + + +} + + + + + + + + +// simulation loop + + + + + +static void simLoop (int pause) + + +{ + + + dsSetColor (0,0,2); + + + dSpaceCollide (space,0,&nearCallback); + + + if (!pause) dWorldStep (world,0.05); + + + + + + dAASSERT(terrainY); + + + dAASSERT(terrainZ); + + + dsSetColor (0,1,0); + + + dsDrawTerrainY(0,0,vTerrainLength,vTerrainLength/TERRAINNODES,TERRAINNODES,pTerrainHeights,dGeomGetRotation(terrainY),dGeomGetPosition(terrainY)); + + + dsDrawTerrainZ(0,0,vTerrainLength,vTerrainLength/TERRAINNODES,TERRAINNODES,pTerrainHeights,dGeomGetRotation(terrainZ),dGeomGetPosition(terrainZ)); + + + + + + if (show_aabb) + + + { + + + dReal aabb[6]; + + + dGeomGetAABB (terrainY,aabb); + + + dVector3 bbpos; + + + int i; + + + for (i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); + + + dVector3 bbsides; + + + for (i=0; i<3; i++) bbsides[i] = aabb[i*2+1] - aabb[i*2]; + + + dMatrix3 RI; + + + dRSetIdentity (RI); + + + dsSetColorAlpha (1,0,0,0.5); + + + dsDrawBox (bbpos,RI,bbsides); + + + + + + dGeomGetAABB (terrainZ,aabb); + + + for (i=0; i<3; i++) bbpos[i] = 0.5*(aabb[i*2] + aabb[i*2+1]); + + + for (i=0; i<3; i++) bbsides[i] = aabb[i*2+1] - aabb[i*2]; + + + dsDrawBox (bbpos,RI,bbsides); + + + } + + + + + + dsSetColor (1,1,0); + + + + + + // remove all contact joints + + + dJointGroupEmpty (contactgroup); + + + + + + dsSetColor (1,1,0); + + + dsSetTexture (DS_WOOD); + + + for (int i=0; i