Revision: 8394 http://playerstage.svn.sourceforge.net/playerstage/?rev=8394&view=rev Author: natepak Date: 2009-11-12 15:28:37 +0000 (Thu, 12 Nov 2009)
Log Message: ----------- Got map shape to work again Modified Paths: -------------- code/gazebo/trunk/server/physics/CMakeLists.txt code/gazebo/trunk/server/physics/Geom.cc code/gazebo/trunk/server/physics/MapShape.cc code/gazebo/trunk/server/physics/MapShape.hh code/gazebo/trunk/server/physics/TrimeshShape.cc code/gazebo/trunk/server/physics/bullet/BulletPhysics.cc code/gazebo/trunk/server/physics/bullet/BulletTrimeshShape.cc code/gazebo/trunk/server/physics/bullet/BulletTrimeshShape.hh code/gazebo/trunk/server/physics/bullet/CMakeLists.txt code/gazebo/trunk/server/physics/ode/ODEPhysics.cc code/gazebo/trunk/server/physics/ode/ODETrimeshShape.cc code/gazebo/trunk/server/physics/ode/ODETrimeshShape.hh code/gazebo/trunk/server/rendering/UserCamera.cc code/gazebo/trunk/worlds/map.world Modified: code/gazebo/trunk/server/physics/CMakeLists.txt =================================================================== --- code/gazebo/trunk/server/physics/CMakeLists.txt 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/CMakeLists.txt 2009-11-12 15:28:37 UTC (rev 8394) @@ -23,8 +23,8 @@ RayShape.cc MultiRayShape.cc TrimeshShape.cc + MapShape.cc #HeightmapGeom.cc - #MapGeom.cc ) set (headers BallJoint.hh @@ -41,13 +41,13 @@ Geom.hh BoxShape.hh CylinderShape.hh - #HeightmapShape.hh - #MapShape.hh + MapShape.hh PlaneShape.hh RayShape.hh MultiRayShape.hh SphereShape.hh TrimeshShape.hh + #HeightmapShape.hh ) #add_library(gazebo_physics STATIC ${sources}) Modified: code/gazebo/trunk/server/physics/Geom.cc =================================================================== --- code/gazebo/trunk/server/physics/Geom.cc 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/Geom.cc 2009-11-12 15:28:37 UTC (rev 8394) @@ -156,7 +156,7 @@ void Geom::CreateBoundingBox() { // Create the bounding box - if (this->GetType() != Shape::PLANE) + if (this->GetType() != Shape::PLANE && this->GetType() != Shape::MAP) { Vector3 min; Vector3 max; Modified: code/gazebo/trunk/server/physics/MapShape.cc =================================================================== --- code/gazebo/trunk/server/physics/MapShape.cc 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/MapShape.cc 2009-11-12 15:28:37 UTC (rev 8394) @@ -18,38 +18,39 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ -/* Desc: Map geometry +/* Desc: Map shape * Author: Nate Koenig * Date: 14 July 2008 - * CVS: $Id$ + * SVN: $Id$ */ #include <iostream> #include <string.h> #include <math.h> +#include "PhysicsEngine.hh" #include "GazeboConfig.hh" #include "OgreVisual.hh" #include "Image.hh" -#include "BoxGeom.hh" +#include "BoxShape.hh" #include "GazeboError.hh" #include "Simulator.hh" #include "Global.hh" #include "Body.hh" -#include "MapGeom.hh" +#include "Geom.hh" +#include "MapShape.hh" using namespace gazebo; -unsigned int MapGeom::geomCounter = 0; +unsigned int MapShape::geomCounter = 0; ////////////////////////////////////////////////////////////////////////////// // Constructor -MapGeom::MapGeom(Body *body) - : Geom(body) +MapShape::MapShape(Geom *parent) + : Shape(parent) { + this->type = Shape::MAP; - this->type = Geom::MAP; - this->root = new QuadNode(NULL); Param::Begin(&this->parameters); @@ -61,12 +62,13 @@ this->granularityP = new ParamT<int>("granularity", 5, 0); Param::End(); + this->visualNode = parent->GetVisualNode(); } ////////////////////////////////////////////////////////////////////////////// // Destructor -MapGeom::~MapGeom() +MapShape::~MapShape() { if (this->root) delete this->root; @@ -85,15 +87,14 @@ ////////////////////////////////////////////////////////////////////////////// /// Update function. -void MapGeom::UpdateChild() +void MapShape::Update() { } //////////////////////////////////////////////////////////////////////////////// /// Load the heightmap -void MapGeom::LoadChild(XMLConfigNode *node) +void MapShape::Load(XMLConfigNode *node) { - std::string imageFilename = node->GetString("image","",1); this->negativeP->Load(node); @@ -139,7 +140,7 @@ ////////////////////////////////////////////////////////////////////////////// // Create the ODE boxes -void MapGeom::CreateBoxes(QuadNode *node) +void MapShape::CreateBoxes(QuadNode *node) { if (node->leaf) { @@ -149,7 +150,7 @@ std::ostringstream stream; // Create the box geometry - BoxGeom* newBox = new BoxGeom( this->body ); + Geom *geom = this->physicsEngine->CreateGeom("box",this->parent->GetBody()); XMLConfig *boxConfig = new XMLConfig(); @@ -166,7 +167,6 @@ sprintf(geomName,"map_geom_%d",geomCounter++); stream << "<geom:box name='" << geomName << "'>"; - stream << " <mass>0.0</mass>"; stream << " <xyz>" << x << " " << y << " " << z << "</xyz>"; stream << " <rpy>0 0 0</rpy>"; stream << " <size>" << xSize << " " << ySize << " " << zSize << "</size>"; @@ -180,7 +180,9 @@ boxConfig->LoadString( stream.str() ); - newBox->Load( boxConfig->GetRootNode()->GetChild() ); + geom->Load( boxConfig->GetRootNode()->GetChild() ); + geom->SetStatic(true); + delete boxConfig; } else @@ -195,7 +197,7 @@ ////////////////////////////////////////////////////////////////////////////// // Reduce the size of the quad tree -void MapGeom::ReduceTree(QuadNode *node) +void MapShape::ReduceTree(QuadNode *node) { std::deque<QuadNode*>::iterator iter; @@ -254,7 +256,7 @@ ////////////////////////////////////////////////////////////////////////////// // Merege quad tree cells -void MapGeom::Merge(QuadNode *nodeA, QuadNode *nodeB) +void MapShape::Merge(QuadNode *nodeA, QuadNode *nodeB) { std::deque<QuadNode*>::iterator iter; @@ -304,7 +306,7 @@ ////////////////////////////////////////////////////////////////////////////// // Construct the quad tree -void MapGeom::BuildTree(QuadNode *node) +void MapShape::BuildTree(QuadNode *node) { QuadNode *newNode = NULL; unsigned int freePixels, occPixels; @@ -379,7 +381,7 @@ ////////////////////////////////////////////////////////////////////////////// // Get a count of pixels within a given area -void MapGeom::GetPixelCount(unsigned int xStart, unsigned int yStart, +void MapShape::GetPixelCount(unsigned int xStart, unsigned int yStart, unsigned int width, unsigned int height, unsigned int &freePixels, unsigned int &occPixels ) @@ -410,7 +412,7 @@ ////////////////////////////////////////////////////////////////////////////// /// Save child parameters -void MapGeom::SaveChild(std::string &prefix, std::ostream &stream) +void MapShape::Save(std::string &prefix, std::ostream &stream) { stream << prefix << *(this->negativeP) << "\n"; stream << prefix << *(this->thresholdP) << "\n"; Modified: code/gazebo/trunk/server/physics/MapShape.hh =================================================================== --- code/gazebo/trunk/server/physics/MapShape.hh 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/MapShape.hh 2009-11-12 15:28:37 UTC (rev 8394) @@ -24,8 +24,8 @@ * CVS: $Id$ */ -#ifndef MAPGEOM_HH -#define MAPGEOM_HH +#ifndef MAPSHAPE_HH +#define MAPSHAPE_HH #include <deque> @@ -88,22 +88,22 @@ class QuadNode; /// \brief Map geom - class MapGeom : public Geom + class MapShape : public Shape { /// \brief Constructor - public: MapGeom(Body *body); + public: MapShape(Geom *parent); /// \brief Destructor - public: virtual ~MapGeom(); + public: virtual ~MapShape(); /// \brief Update function - public: void UpdateChild(); + public: void Update(); - /// \brief Load the heightmap - protected: virtual void LoadChild(XMLConfigNode *node); + /// \brief Load the map + protected: virtual void Load(XMLConfigNode *node); - /// \brief Save child parameters - protected: void SaveChild(std::string &prefix, std::ostream &stream); + /// \brief Save parameters + protected: void Save(std::string &prefix, std::ostream &stream); /// \brief Build the quadtree private: void BuildTree(QuadNode *node); @@ -148,6 +148,7 @@ private: bool merged; private: static unsigned int geomCounter; + private: OgreVisual *visualNode; }; Modified: code/gazebo/trunk/server/physics/TrimeshShape.cc =================================================================== --- code/gazebo/trunk/server/physics/TrimeshShape.cc 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/TrimeshShape.cc 2009-11-12 15:28:37 UTC (rev 8394) @@ -45,12 +45,6 @@ this->meshNameP = new ParamT<std::string>("mesh","",1); this->scaleP = new ParamT<Vector3>("scale",Vector3(1,1,1),0); Param::End(); - - /*this->numVertices = 0; - this->numIndices = 0; - this->vertices = NULL; - this->indices = NULL; - */ } @@ -122,24 +116,6 @@ delete config; } } - - /*const Mesh *mesh = meshManager->Load( **this->meshNameP ); - - if (!mesh) - gzthrow("Invalid mesh"); - - mesh->FillArrays(&this->vertices, &this->indices); - - this->numIndices = mesh->GetIndexCount(); - this->numVertices = mesh->GetVertexCount(); - - for (unsigned int i=0; i < this->numVertices; i++) - { - this->vertices[i*3+0] = this->vertices[i*3+0] * (**this->scaleP).x; - this->vertices[i*3+1] = this->vertices[i*3+1] * (**this->scaleP).y; - this->vertices[i*3+2] = this->vertices[i*3+2] * (**this->scaleP).z; - } - */ } ////////////////////////////////////////////////////////////////////////////// Modified: code/gazebo/trunk/server/physics/bullet/BulletPhysics.cc =================================================================== --- code/gazebo/trunk/server/physics/bullet/BulletPhysics.cc 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/bullet/BulletPhysics.cc 2009-11-12 15:28:37 UTC (rev 8394) @@ -29,7 +29,8 @@ #include "BulletSphereShape.hh" #include "BulletBoxShape.hh" #include "BulletCylinderShape.hh" -//#include "BulletTrimeshShape.hh" +#include "BulletTrimeshShape.hh" +#include "MapShape.hh" #include "BulletHingeJoint.hh" #include "BulletHinge2Joint.hh" @@ -216,6 +217,12 @@ case Shape::PLANE: shape = new BulletPlaneShape(geom); break; + case Shape::TRIMESH: + shape = new BulletTrimeshShape(geom); + break; + case Shape::MAP: + shape = new MapShape(geom); + break; default: gzthrow("Unable to create a geom of type[" << type << "]"); } Modified: code/gazebo/trunk/server/physics/bullet/BulletTrimeshShape.cc =================================================================== --- code/gazebo/trunk/server/physics/bullet/BulletTrimeshShape.cc 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/bullet/BulletTrimeshShape.cc 2009-11-12 15:28:37 UTC (rev 8394) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ -/* Desc: Trimesh geometry +/* Desc: Trimesh shape * Author: Nate Keonig * Date: 21 May 2009 * SVN: $Id:$ @@ -27,53 +27,36 @@ #include "BulletPhysics.hh" #include "OgreVisual.hh" #include "Body.hh" -#include "BulletTrimeshGeom.hh" #include "GazeboError.hh" #include "Simulator.hh" #include "OgreAdaptor.hh" +#include "BulletTrimeshShape.hh" + using namespace gazebo; ////////////////////////////////////////////////////////////////////////////// // Constructor -BulletTrimeshGeom::BulletTrimeshGeom(Body *body) - : BulletGeom(body) +BulletTrimeshShape::BulletTrimeshShape(Geom *parent) + : TrimeshShape(parent) { - Param::Begin(&this->parameters); - this->meshNameP = new ParamT<std::string>("mesh","",1); - this->scaleP = new ParamT<Vector3>("scale",Vector3(1,1,1),0); - Param::End(); } ////////////////////////////////////////////////////////////////////////////// // Destructor -BulletTrimeshGeom::~BulletTrimeshGeom() +BulletTrimeshShape::~BulletTrimeshShape() { - delete this->meshNameP; - delete this->scaleP; } ////////////////////////////////////////////////////////////////////////////// /// Update function. -void BulletTrimeshGeom::Update() +void BulletTrimeshShape::Update() { - BulletGeom::Update(); } ////////////////////////////////////////////////////////////////////////////// /// Load the trimesh -void BulletTrimeshGeom::Load(XMLConfigNode *node) +void BulletTrimeshShape::Load(XMLConfigNode *node) { - BulletGeom::Load(node); } - -////////////////////////////////////////////////////////////////////////////// -/// Save child parameters -void BulletTrimeshGeom::Save(std::string &prefix, std::ostream &stream) -{ - BulletGeom::Save(prefix, stream); - stream << prefix << *(this->meshNameP) << "\n"; - stream << prefix << *(this->scaleP) << "\n"; -} - Modified: code/gazebo/trunk/server/physics/bullet/BulletTrimeshShape.hh =================================================================== --- code/gazebo/trunk/server/physics/bullet/BulletTrimeshShape.hh 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/bullet/BulletTrimeshShape.hh 2009-11-12 15:28:37 UTC (rev 8394) @@ -24,10 +24,10 @@ * SVN: $Id:$ */ -#ifndef BULLETTRIMESHGEOM_HH -#define BULLETTRIMESHGEOM_HH +#ifndef BULLETTRIMESHSHAPE_HH +#define BULLETTRIMESHSHAPE_HH -#include "BulletGeom.hh" +#include "TrimeshShape.hh" namespace gazebo { @@ -68,27 +68,19 @@ /// \brief Triangle mesh geom - class BulletTrimeshGeom : public BulletGeom + class BulletTrimeshShape : public TrimeshShape { /// \brief Constructor - public: BulletTrimeshGeom(Body *body); + public: BulletTrimeshShape(Geom *parent); /// \brief Destructor - public: virtual ~BulletTrimeshGeom(); + public: virtual ~BulletTrimeshShape(); /// \brief Update function public: void Update(); /// \brief Load the trimesh public: virtual void Load(XMLConfigNode *node); - - /// \brief Save child parameters - public: void Save(std::string &prefix, std::ostream &stream); - - /// name of the mesh - private: ParamT<std::string> *meshNameP; - - private: ParamT<Vector3> *scaleP; }; /// \} Modified: code/gazebo/trunk/server/physics/bullet/CMakeLists.txt =================================================================== --- code/gazebo/trunk/server/physics/bullet/CMakeLists.txt 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/bullet/CMakeLists.txt 2009-11-12 15:28:37 UTC (rev 8394) @@ -10,6 +10,7 @@ BulletHinge2Joint.cc BulletUniversalJoint.cc BulletBallJoint.cc + BulletTrimeshShape.cc #BulletRayGeom.cc ) Modified: code/gazebo/trunk/server/physics/ode/ODEPhysics.cc =================================================================== --- code/gazebo/trunk/server/physics/ode/ODEPhysics.cc 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/ode/ODEPhysics.cc 2009-11-12 15:28:37 UTC (rev 8394) @@ -50,6 +50,7 @@ #include "ODEPlaneShape.hh" #include "ODETrimeshShape.hh" #include "ODEMultiRayShape.hh" +#include "MapShape.hh" #include "ODEPhysics.hh" @@ -340,6 +341,9 @@ case Shape::TRIMESH: shape = new ODETrimeshShape(geom); break; + case Shape::MAP: + shape = new MapShape(geom); + break; default: gzerr(0) << "Unable to create geom of type["<<type<<"]\n"; } Modified: code/gazebo/trunk/server/physics/ode/ODETrimeshShape.cc =================================================================== --- code/gazebo/trunk/server/physics/ode/ODETrimeshShape.cc 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/ode/ODETrimeshShape.cc 2009-11-12 15:28:37 UTC (rev 8394) @@ -50,7 +50,7 @@ /// Update function. void ODETrimeshShape::Update() { - /*ODEGeom *ogeom = ((ODEGeom*)this->parent); + ODEGeom *ogeom = ((ODEGeom*)this->parent); /// FIXME: use below to update trimesh geometry for collision without using above Ogre codes // tell the tri-tri collider the current transform of the trimesh -- @@ -83,7 +83,6 @@ dGeomTriMeshSetLastTransform( ogeom->GetGeomId(), *(dMatrix4*)( this->matrix_dblbuff + this->last_matrix_index * 16) ); - */ } ////////////////////////////////////////////////////////////////////////////// @@ -97,56 +96,49 @@ TrimeshShape::Load(node); - /*if (this->mesh->GetSubMeshCount() > 1) - { - printf("ODETrimesh submesh count >1\n"); - return; - }*/ - mass = this->parent->GetMass(); unsigned int i =0; - dTriMeshDataID odeData; + dTriMeshDataID odeData; - const SubMesh *subMesh = mesh->GetSubMesh(i); - if (subMesh->GetVertexCount() < 3) - { - printf("ODETrimesh invalid mesh\n"); - return; - } + const SubMesh *subMesh = mesh->GetSubMesh(i); + if (subMesh->GetVertexCount() < 3) + { + gzerr(0) << "ODETrimesh invalid mesh\n"; + return; + } - /// This will hold the vertex data of the triangle mesh - odeData = dGeomTriMeshDataCreate(); + /// This will hold the vertex data of the triangle mesh + odeData = dGeomTriMeshDataCreate(); - unsigned int numVertices = 0; - unsigned int numIndices = 0; - float *vertices = NULL; - unsigned int *indices = NULL; + unsigned int numVertices = 0; + unsigned int numIndices = 0; + float *vertices = NULL; + unsigned int *indices = NULL; - subMesh->FillArrays(&vertices, &indices); + subMesh->FillArrays(&vertices, &indices); - numIndices = subMesh->GetIndexCount(); - numVertices = subMesh->GetVertexCount(); + numIndices = subMesh->GetIndexCount(); + numVertices = subMesh->GetVertexCount(); - for (unsigned int j=0; j < numVertices; j++) - { - vertices[j*3+0] = vertices[j*3+0] * (**this->scaleP).x; - vertices[j*3+1] = vertices[j*3+1] * (**this->scaleP).y; - vertices[j*3+2] = vertices[j*3+2] * (**this->scaleP).z; - } + for (unsigned int j=0; j < numVertices; j++) + { + vertices[j*3+0] = vertices[j*3+0] * (**this->scaleP).x; + vertices[j*3+1] = vertices[j*3+1] * (**this->scaleP).y; + vertices[j*3+2] = vertices[j*3+2] * (**this->scaleP).z; + } - // Build the ODE triangle mesh - dGeomTriMeshDataBuildSingle( odeData, - (float*)vertices, 3*sizeof(float), numVertices, - (int*)indices, numIndices, 3*sizeof(int)); + // Build the ODE triangle mesh + dGeomTriMeshDataBuildSingle( odeData, + (float*)vertices, 3*sizeof(float), numVertices, + (int*)indices, numIndices, 3*sizeof(int)); - pgeom->SetSpaceId( dSimpleSpaceCreate(pgeom->GetSpaceId()) ); - pgeom->SetGeom( dCreateTriMesh(pgeom->GetSpaceId(), odeData,0,0,0 ), true); + pgeom->SetSpaceId( dSimpleSpaceCreate(pgeom->GetSpaceId()) ); + pgeom->SetGeom( dCreateTriMesh(pgeom->GetSpaceId(), odeData,0,0,0 ), true); - if (!pgeom->IsStatic()) - dMassSetTrimeshTotal(&odeMass, mass.GetAsDouble(), pgeom->GetGeomId()); - //} + if (!pgeom->IsStatic()) + dMassSetTrimeshTotal(&odeMass, mass.GetAsDouble(), pgeom->GetGeomId()); physics->ConvertMass(&mass, &odeMass); this->parent->SetMass(mass); Modified: code/gazebo/trunk/server/physics/ode/ODETrimeshShape.hh =================================================================== --- code/gazebo/trunk/server/physics/ode/ODETrimeshShape.hh 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/physics/ode/ODETrimeshShape.hh 2009-11-12 15:28:37 UTC (rev 8394) @@ -80,8 +80,6 @@ /// \brief Load the trimesh protected: virtual void Load(XMLConfigNode *node); - //private: dTriMeshDataID odeData; - private: dReal matrix_dblbuff[16*2]; private: int last_matrix_index; }; Modified: code/gazebo/trunk/server/rendering/UserCamera.cc =================================================================== --- code/gazebo/trunk/server/rendering/UserCamera.cc 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/server/rendering/UserCamera.cc 2009-11-12 15:28:37 UTC (rev 8394) @@ -83,11 +83,11 @@ this->InitCam(); this->visual = new OgreVisual(this->pitchNode); + + // The lines draw a visualization of the camera OgreDynamicLines *line = OgreCreator::Instance()->CreateDynamicLine( OgreDynamicRenderable::OT_LINE_LIST); - float d = 0.5; - float b = 0.01; float f = 0.2; // Create the front face Modified: code/gazebo/trunk/worlds/map.world =================================================================== --- code/gazebo/trunk/worlds/map.world 2009-11-12 04:36:21 UTC (rev 8393) +++ code/gazebo/trunk/worlds/map.world 2009-11-12 15:28:37 UTC (rev 8394) @@ -42,6 +42,7 @@ <linearStart>10</linearStart> <linearEnd>100</linearEnd> </fog> + <grid>false</grid> </rendering:ogre> <!-- Ground Plane --> @@ -55,13 +56,12 @@ <normal>0 0 1</normal> <size>2000 2000</size> <segments>10 10</segments> - <uvTile>100 100</uvTile> - <material>Gazebo/Grey</material> + <uvTile>1000 1000</uvTile> + <material>Gazebo/GrayGrid</material> </geom:plane> </body:plane> </model:physical> - <model:physical name="map"> <static>true</static> <body:map name="map_body"> @@ -76,20 +76,6 @@ </body:map> </model:physical> - <model:renderable name="directional_white"> - <static>true</static> - <light> - <type>directional</type> - <direction>0 -0.6 -0.4</direction> - <diffuseColor>1.0 1.0 1.0</diffuseColor> - <specularColor>0.2 0.2 0.2</specularColor> - <range>100</range> - - <!-- Constant(0-1) Linear(0-1) Quadratic --> - <attenuation>1.0 0.0 0</attenuation> - </light> - </model:renderable> - <model:physical name="pioneer2dx_model1"> <xyz>0 0 0.145</xyz> <rpy>0.0 0.0 0.0</rpy> @@ -112,5 +98,21 @@ </include> </model:physical> + <!-- White Point light --> + <model:renderable name="point_white"> + <xyz>-4 4 5</xyz> + <static>true</static> + <light> + <type>point</type> + <diffuseColor>0.4 0.4 0.4</diffuseColor> + <specularColor>.1 .1 .1</specularColor> + <range>20</range> + + <!-- Constant(0-1) Linear(0-1) Quadratic --> + <attenuation>0.5 0.01 0.001</attenuation> + </light> + </model:renderable> + + </gazebo:world> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Playerstage-commit mailing list Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit