Revision: 6900
          http://playerstage.svn.sourceforge.net/playerstage/?rev=6900&view=rev
Author:   natepak
Date:     2008-07-22 16:14:59 +0000 (Tue, 22 Jul 2008)

Log Message:
-----------
Added mouse picking.

Modified Paths:
--------------
    code/gazebo/trunk/server/Entity.cc
    code/gazebo/trunk/server/Model.cc
    code/gazebo/trunk/server/Model.hh
    code/gazebo/trunk/server/Simulator.cc
    code/gazebo/trunk/server/Simulator.hh
    code/gazebo/trunk/server/gui/GLWindow.cc
    code/gazebo/trunk/server/gui/GLWindow.hh
    code/gazebo/trunk/server/physics/Body.cc
    code/gazebo/trunk/server/physics/Body.hh
    code/gazebo/trunk/server/physics/Geom.cc
    code/gazebo/trunk/server/physics/ode/ODEPhysics.cc
    code/gazebo/trunk/server/physics/ode/ODEPhysics.hh
    code/gazebo/trunk/server/rendering/OgreAdaptor.cc
    code/gazebo/trunk/server/rendering/OgreAdaptor.hh
    code/gazebo/trunk/server/rendering/OgreVisual.cc
    code/gazebo/trunk/server/rendering/OgreVisual.hh
    code/gazebo/trunk/server/rendering/UserCamera.cc
    code/gazebo/trunk/worlds/simpleshapes.world

Modified: code/gazebo/trunk/server/Entity.cc
===================================================================
--- code/gazebo/trunk/server/Entity.cc  2008-07-21 23:39:22 UTC (rev 6899)
+++ code/gazebo/trunk/server/Entity.cc  2008-07-22 16:14:59 UTC (rev 6900)
@@ -24,6 +24,8 @@
  * Date: 03 Apr 2007
  * SVN: $Id$
  */
+
+#include "Body.hh"
 #include "GazeboError.hh"
 #include "Global.hh"
 #include "OgreVisual.hh"
@@ -134,7 +136,19 @@
 // Set whether this entity is static: immovable
 void Entity::SetStatic(bool s)
 {
+  std::vector< Entity *>::iterator iter;
+  Body *body = NULL;
+
   this->isStatic = s;
+
+  for (iter = this->children.begin(); iter != this->children.end(); iter++)
+  {
+    (*iter)->SetStatic(s);
+    body = dynamic_cast<Body*>(*iter);
+    if (body)
+      body->SetEnabled(!s);
+  }
+
 }
 
 
////////////////////////////////////////////////////////////////////////////////

Modified: code/gazebo/trunk/server/Model.cc
===================================================================
--- code/gazebo/trunk/server/Model.cc   2008-07-21 23:39:22 UTC (rev 6899)
+++ code/gazebo/trunk/server/Model.cc   2008-07-22 16:14:59 UTC (rev 6900)
@@ -174,11 +174,6 @@
 
 }
 
-void Model::Test()
-{
-  std::cout << "this is a test\n";
-}
-
 void Model::Save()
 {
   /*std::map<std::string, Body* >::iterator bodyIter;
@@ -290,11 +285,9 @@
     boost::python::call<void>(this->pFuncUpdate, this);
   }*/
 
-  Body *b = NULL;
   if (!this->canonicalBodyName.empty())
   {
     this->pose = this->bodies[this->canonicalBodyName]->GetPose();
-    b = this->bodies[this->canonicalBodyName];
   }
 
   return this->UpdateChild();

Modified: code/gazebo/trunk/server/Model.hh
===================================================================
--- code/gazebo/trunk/server/Model.hh   2008-07-21 23:39:22 UTC (rev 6899)
+++ code/gazebo/trunk/server/Model.hh   2008-07-22 16:14:59 UTC (rev 6900)
@@ -66,7 +66,6 @@
   
     /// \brief Save the model
     public: void Save();
-    public: void Test();
 
     /// \brief Initialize the model
     public: int Init();

Modified: code/gazebo/trunk/server/Simulator.cc
===================================================================
--- code/gazebo/trunk/server/Simulator.cc       2008-07-21 23:39:22 UTC (rev 
6899)
+++ code/gazebo/trunk/server/Simulator.cc       2008-07-22 16:14:59 UTC (rev 
6900)
@@ -28,6 +28,9 @@
 #include <fstream>
 #include <sys/time.h>
 
+#include "Model.hh"
+#include "Entity.hh"
+#include "OgreVisual.hh"
 #include "World.hh"
 #include "Gui.hh"
 #include "XMLConfig.hh"
@@ -466,3 +469,33 @@
 {
   return this->physicsEnabled;
 }
+
+////////////////////////////////////////////////////////////////////////////////
+/// Set the selected entity
+void Simulator::SetSelectedEntity( Entity *ent )
+{
+  if (this->selectedEntity)
+  {
+    this->selectedEntity->GetVisualNode()->ShowSelectionBox(false);
+    this->selectedEntity->SetStatic(false);
+  }
+
+  if (this->selectedEntity != ent)
+  {
+    this->selectedEntity = ent;
+    this->selectedEntity->GetVisualNode()->ShowSelectionBox(true);
+    this->selectedEntity->SetStatic(true);
+  }
+  else
+    this->selectedEntity = NULL;
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Get the selected entity
+Entity *Simulator::GetSelectedEntity() const
+{
+  return this->selectedEntity;
+}
+
+

Modified: code/gazebo/trunk/server/Simulator.hh
===================================================================
--- code/gazebo/trunk/server/Simulator.hh       2008-07-21 23:39:22 UTC (rev 
6899)
+++ code/gazebo/trunk/server/Simulator.hh       2008-07-22 16:14:59 UTC (rev 
6900)
@@ -44,6 +44,7 @@
   class XMLConfigNode;
   class GazeboConfig;
   class OgreAdaptor;
+  class Entity;
 
 /// \brief The World
 /*
@@ -157,6 +158,12 @@
     /// \brief Get the physics enabled/disabled
     public: bool GetPhysicsEnabled() const;
 
+    /// \brief Set the selected entity
+    public: void SetSelectedEntity( Entity *ent );
+
+    /// \brief Get the selected entity
+    public: Entity *GetSelectedEntity() const;
+
     ///pointer to the XML Data
     private: XMLConfig *xmlFile;
 
@@ -213,6 +220,9 @@
     /// Length of time the simulation should run
     private: double timeout;
 
+    /// The entity currently selected by the user
+    private: Entity *selectedEntity;
+
     //Singleton implementation
     private: friend class DestroyerT<Simulator>;
     private: friend class SingletonT<Simulator>;

Modified: code/gazebo/trunk/server/gui/GLWindow.cc
===================================================================
--- code/gazebo/trunk/server/gui/GLWindow.cc    2008-07-21 23:39:22 UTC (rev 
6899)
+++ code/gazebo/trunk/server/gui/GLWindow.cc    2008-07-22 16:14:59 UTC (rev 
6900)
@@ -24,6 +24,7 @@
  * SVN: $Id:$
  */
 
+#include "Model.hh"
 #include <X11/keysym.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
@@ -32,6 +33,7 @@
 
 #include <GL/glx.h>
 
+#include "Entity.hh"
 #include "OgreCamera.hh"
 #include "OgreCreator.hh"
 #include "Simulator.hh"
@@ -195,7 +197,11 @@
 
   if (!this->mouseDrag)
   {
-    //Entity *ent = World::Instance()->GetEntityAt(this->mousePos);
+    Entity *ent = OgreAdaptor::Instance()->GetEntityAt(this->activeCamera, 
this->mousePos);
+    if (ent)
+    {
+      Simulator::Instance()->SetSelectedEntity( ent );
+    }
   }
 
   this->mouseDrag = false;
@@ -207,18 +213,44 @@
 {
   if (this->activeCamera && this->activeCamera->GetUserMovable())
   {
+    Vector2<int> d = this->mousePos - this->prevMousePos;
     if (this->leftMousePressed)
     {
-      Vector2<int> d = this->mousePos - this->prevMousePos;
       this->activeCamera->RotateYaw(DTOR(-d.x * this->rotateAmount));
       this->activeCamera->RotatePitch(DTOR(d.y * this->rotateAmount));
     }
+    else if (this->rightMousePressed)
+    {
+      Model *model = 
dynamic_cast<Model*>(Simulator::Instance()->GetSelectedEntity());
+      if (model)
+      {
+        Pose3d pose = model->GetPose();
+        pose.pos.y -= d.x * 0.05;
+        pose.pos.x -= d.y * 0.05;
+        model->SetPose(pose);
+      }
+    }
+
   }
 
   this->mouseDrag = true;
 }
 
 
////////////////////////////////////////////////////////////////////////////////
+// Handle mouse wheel movement
+void GLWindow::HandleMouseWheel(int dx, int dy)
+{
+  Model *model = 
dynamic_cast<Model*>(Simulator::Instance()->GetSelectedEntity());
+  if (model)
+  {
+    Pose3d pose = model->GetPose();
+    pose.pos.z += dy * 0.05;
+    model->SetPose(pose);
+  }
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
 /// Handle a key press
 void GLWindow::HandleKeyPress(int keyNum)
 {
@@ -380,6 +412,11 @@
       handled = true;
       break;
 
+    case FL_MOUSEWHEEL:
+      this->HandleMouseWheel(Fl::event_dx(), Fl::event_dy());
+      handled = true;
+      break;
+
     default:
       break;
   }

Modified: code/gazebo/trunk/server/gui/GLWindow.hh
===================================================================
--- code/gazebo/trunk/server/gui/GLWindow.hh    2008-07-21 23:39:22 UTC (rev 
6899)
+++ code/gazebo/trunk/server/gui/GLWindow.hh    2008-07-22 16:14:59 UTC (rev 
6900)
@@ -113,6 +113,8 @@
     /// \brief Handle a key release
     private: void HandleKeyRelease(int keyNum);
 
+    /// \brief Handle mouse wheel movement
+    private: void HandleMouseWheel(int dx, int dy);
 
     /// ID of the window
     private: Window windowId;

Modified: code/gazebo/trunk/server/physics/Body.cc
===================================================================
--- code/gazebo/trunk/server/physics/Body.cc    2008-07-21 23:39:22 UTC (rev 
6899)
+++ code/gazebo/trunk/server/physics/Body.cc    2008-07-22 16:14:59 UTC (rev 
6900)
@@ -51,16 +51,11 @@
 Body::Body(Entity *parent, dWorldID worldId)
     : Entity(parent)
 {
-  if (!this->IsStatic())
-  {
-    this->bodyId = dBodyCreate(worldId);
+  this->bodyId = dBodyCreate(worldId);
 
-    dMassSetZero( &this->mass );
-  }
-  else
-  {
-    this->bodyId = NULL;
-  }
+  dMassSetZero( &this->mass );
+
+  this->SetEnabled(!this->IsStatic());
 }
 
 
@@ -163,8 +158,7 @@
 // Set whether gravity affects this body
 void Body::SetGravityMode(bool mode)
 {
-  if (this->bodyId)
-    dBodySetGravityMode(this->bodyId, mode);
+  dBodySetGravityMode(this->bodyId, mode);
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -191,11 +185,16 @@
 
   if (!this->IsStatic())
   {
+    //this->SetEnabled(true);
     Pose3d pose = this->GetPose();
 
     // Set the pose of the scene node
     this->visualNode->SetPose(pose);
   }
+  else
+  {
+    this->SetEnabled(false);
+  }
 
   for (geomIter=this->geoms.begin();
        geomIter!=this->geoms.end(); geomIter++)
@@ -214,7 +213,7 @@
 // Attach a geom to this body
 void Body::AttachGeom( Geom *geom )
 {
-  if (this->bodyId)
+  //if (this->bodyId)
   {
     if (geom->IsPlaceable())
     {
@@ -232,73 +231,35 @@
 // Set the pose of the body
 void Body::SetPose(const Pose3d &pose)
 {
-  if (this->IsStatic())
-  {
-    std::vector< Geom* >::iterator giter;
-    PlaneGeom *plane = NULL;
-    this->staticPose = pose;
+  Pose3d localPose;
 
-    this->SetPosition(this->staticPose.pos);
-    this->SetRotation(this->staticPose.rot);
+  // Compute pose of CoM
+  localPose = this->comPose + pose;
 
-    // Hack to fix the altitude of the ODE plane
-    for (giter = this->geoms.begin(); giter != this->geoms.end(); giter++)
-    {
-      if ((*giter)->GetGeomClass() == dPlaneClass)
-      {
-        plane = dynamic_cast<PlaneGeom*>(*giter);
-        plane->SetAltitude(pose.pos);
-      }
-      else
-        (*giter)->SetImmovableBasePose(this->staticPose);
-    }
-  }
-  else
-  {
-    Pose3d localPose;
-
-    // Compute pose of CoM
-    localPose =this->comPose + pose;
-
-    this->SetPosition(localPose.pos);
-    this->SetRotation(localPose.rot);
-  }
+  this->SetPosition(localPose.pos);
+  this->SetRotation(localPose.rot);
 }
 
 
////////////////////////////////////////////////////////////////////////////////
 // Return the pose of the body
 Pose3d Body::GetPose() const
 {
-  if (this->IsStatic())
-    return this->staticPose;
-  else
-  {
-    Pose3d pose;
+  Pose3d pose;
 
-    pose.pos = this->GetPosition();
-    pose.rot = this->GetRotation();
+  pose.pos = this->GetPosition();
+  pose.rot = this->GetRotation();
 
-    pose = this->comPose.CoordPoseSolve(pose);
+  pose = this->comPose.CoordPoseSolve(pose);
 
-    return pose;
-  }
+  return pose;
 }
 
 
////////////////////////////////////////////////////////////////////////////////
 // Set the position of the body
 void Body::SetPosition(const Vector3 &pos)
 {
+  dBodySetPosition(this->bodyId, pos.x, pos.y, pos.z);
 
-  if (!this->IsStatic())
-  {
-    // Set the position of the ODE body
-    dBodySetPosition(this->bodyId, pos.x, pos.y, pos.z);
-  }
-  else
-  {
-    this->staticPose.pos = pos;
-  }
-
   // Set the position of the scene node
   this->visualNode->SetPosition(pos);
 }
@@ -307,23 +268,15 @@
 // Set the rotation of the body
 void Body::SetRotation(const Quatern &rot)
 {
-  if (!this->IsStatic())
-  {
-    dQuaternion q;
-    q[0] = rot.u;
-    q[1] = rot.x;
-    q[2] = rot.y;
-    q[3] = rot.z;
+  dQuaternion q;
+  q[0] = rot.u;
+  q[1] = rot.x;
+  q[2] = rot.y;
+  q[3] = rot.z;
 
-    // Set the rotation of the ODE body
-    dBodySetQuaternion(this->bodyId, q);
+  // Set the rotation of the ODE body
+  dBodySetQuaternion(this->bodyId, q);
 
-  }
-  else
-  {
-    this->staticPose.rot = rot;
-  }
-
   // Set the orientation of the scene node
   this->visualNode->SetRotation(rot);
 }
@@ -332,22 +285,16 @@
 // Return the position of the body. in global CS
 Vector3 Body::GetPosition() const
 {
+  Vector3 pos;
+  const dReal *p;
 
-  if (!this->IsStatic())
-  {
-    Vector3 pos;
-    const dReal *p;
+  p = dBodyGetPosition(this->bodyId);
 
-    p = dBodyGetPosition(this->bodyId);
+  pos.x = p[0];
+  pos.y = p[1];
+  pos.z = p[2];
 
-    pos.x = p[0];
-    pos.y = p[1];
-    pos.z = p[2];
-
-    return pos;
-  }
-  else
-    return this->staticPose.pos;
+  return pos;
 }
 
 
@@ -355,23 +302,17 @@
 // Return the rotation
 Quatern Body::GetRotation() const
 {
-  if (!this->IsStatic())
-  {
-    Quatern rot;
-    const dReal *r;
+  Quatern rot;
+  const dReal *r;
 
-    r = dBodyGetQuaternion(this->bodyId);
+  r = dBodyGetQuaternion(this->bodyId);
 
-    rot.u = r[0];
-    rot.x = r[1];
-    rot.y = r[2];
-    rot.z = r[3];
+  rot.u = r[0];
+  rot.x = r[1];
+  rot.y = r[2];
+  rot.z = r[3];
 
-    return rot;
-  }
-  else
-    return this->staticPose.rot;
-
+  return rot;
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -477,10 +418,6 @@
   Pose3d oldPose, newPose, pose;
   std::vector< Geom* >::iterator giter;
 
-  // Dummy bodies dont have mass
-  if (!this->bodyId)
-    return;
-
   // Construct the mass matrix by combining all the geoms
   dMassSetZero( &this->mass );
 
@@ -552,12 +489,7 @@
 /// Set the velocity of the body
 void Body::SetLinearVel(const Vector3 &vel)
 {
-  if (!this->bodyId)
-  {
-    gzmsg(0) << "Invalid ODE body\n";
-  }
-  else
-    dBodySetLinearVel(this->bodyId, vel.x, vel.y, vel.z);
+  dBodySetLinearVel(this->bodyId, vel.x, vel.y, vel.z);
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -567,12 +499,6 @@
   Vector3 vel;
   const dReal *dvel;
 
-  if (!this->bodyId)
-  {
-    gzmsg(0) << "Invalid ODE body\n";
-    return vel;
-  }
-
   dvel = dBodyGetLinearVel(this->bodyId);
 
   vel.x = dvel[0];
@@ -586,12 +512,7 @@
 /// Set the velocity of the body
 void Body::SetAngularVel(const Vector3 &vel)
 {
-  if (!this->bodyId)
-  {
-    gzmsg(0) << "Invalid ODE body\n";
-  }
-  else
-    dBodySetAngularVel(this->bodyId, vel.x, vel.y, vel.z);
+  dBodySetAngularVel(this->bodyId, vel.x, vel.y, vel.z);
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -601,12 +522,6 @@
   Vector3 vel;
   const dReal *dvel;
 
-  if (!this->bodyId)
-  {
-    gzmsg(0) << "Invalid ODE body\n";
-    return vel;
-  }
-
   dvel = dBodyGetAngularVel(this->bodyId);
 
   vel.x = dvel[0];
@@ -619,12 +534,7 @@
 /// \brief Set the force applied to the body
 void Body::SetForce(const Vector3 &force)
 {
-  if (!this->bodyId)
-  {
-    gzmsg(0) << "Invalid ODE body\n";
-  }
-  else
-    dBodySetForce(this->bodyId, force.x, force.y, force.z);
+  dBodySetForce(this->bodyId, force.x, force.y, force.z);
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -634,12 +544,6 @@
   Vector3 force;
   const dReal *dforce;
 
-  if (!this->bodyId)
-  {
-    gzmsg(0) << "Invalid ODE body\n";
-    return force;
-  }
-
   dforce = dBodyGetForce(this->bodyId);
 
   force.x = dforce[0];
@@ -653,12 +557,7 @@
 /// \brief Set the torque applied to the body
 void Body::SetTorque(const Vector3 &torque)
 {
-  if (!this->bodyId)
-  {
-    gzmsg(0) << "Invalid ODE body\n";
-  }
-  else
-    dBodySetTorque(this->bodyId, torque.x, torque.y, torque.z);
+  dBodySetTorque(this->bodyId, torque.x, torque.y, torque.z);
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -668,13 +567,6 @@
   Vector3 torque;
   const dReal *dtorque;
 
-  if (!this->bodyId)
-  {
-    gzmsg(0) << "Invalid ODE body\n";
-    return torque;
-  }
-
-
   dtorque = dBodyGetTorque(this->bodyId);
 
   torque.x = dtorque[0];

Modified: code/gazebo/trunk/server/physics/Body.hh
===================================================================
--- code/gazebo/trunk/server/physics/Body.hh    2008-07-21 23:39:22 UTC (rev 
6899)
+++ code/gazebo/trunk/server/physics/Body.hh    2008-07-22 16:14:59 UTC (rev 
6900)
@@ -168,7 +168,6 @@
   private: bool isStatic;
 
   private: Pose3d comPose;
-  private: Pose3d staticPose;
 };
 
 /// \}

Modified: code/gazebo/trunk/server/physics/Geom.cc
===================================================================
--- code/gazebo/trunk/server/physics/Geom.cc    2008-07-21 23:39:22 UTC (rev 
6899)
+++ code/gazebo/trunk/server/physics/Geom.cc    2008-07-22 16:14:59 UTC (rev 
6900)
@@ -122,7 +122,7 @@
   childNode = node->GetChild("visual");
   while (childNode)
   {
-    OgreVisual *visual = new OgreVisual(this->visualNode);
+    OgreVisual *visual = new OgreVisual(this->visualNode, this);
     visual->Load(childNode);
     this->visuals.push_back(visual);
     childNode = childNode->GetNext("visual");

Modified: code/gazebo/trunk/server/physics/ode/ODEPhysics.cc
===================================================================
--- code/gazebo/trunk/server/physics/ode/ODEPhysics.cc  2008-07-21 23:39:22 UTC 
(rev 6899)
+++ code/gazebo/trunk/server/physics/ode/ODEPhysics.cc  2008-07-22 16:14:59 UTC 
(rev 6900)
@@ -165,15 +165,12 @@
   {
     entity->spaceId = entity->GetParent()->spaceId;
   }
-
-  this->entities[entity->GetId()] = entity;
 }
 
 
////////////////////////////////////////////////////////////////////////////////
 // Remove an entity from the physics engine
 void ODEPhysics::RemoveEntity(Entity *entity)
 {
-  this->entities.erase(entity->GetId());
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -262,25 +259,24 @@
         double h, kp, kd;
 
         contact.geom = contactGeoms[i];
-        contact.surface.mode = 0;
+        contact.surface.mode = dContactSoftERP | dContactSoftCFM | 
+                               dContactBounce | dContactMu2;
 
+
         // Compute the CFM and ERP by assuming the two bodies form a
         // spring-damper system.
         h = self->stepTime;
         kp = 1 / (1 / geom1->contact->kp + 1 / geom2->contact->kp);
         kd = geom1->contact->kd + geom2->contact->kd;
-        contact.surface.mode |= dContactSoftERP | dContactSoftCFM;
         contact.surface.soft_erp = h * kp / (h * kp + kd);
         contact.surface.soft_cfm = 1 / (h * kp + kd);
 
 
-        //contacts[i].surface.mode |= dContactBounce | dContactSoftCFM;
-        contact.surface.mode |= dContactApprox1;
         contact.surface.mu = MIN(geom1->contact->mu1, geom2->contact->mu1);
-        contact.surface.mu2 = 0;
+        contact.surface.mu2 = MIN(geom1->contact->mu2, geom2->contact->mu2);
         contact.surface.bounce = 0.1;
         contact.surface.bounce_vel = 0.1;
-        //contacts[i].surface.soft_cfm = 0.01;
+        contact.surface.soft_cfm = 0.01;
 
         dJointID c = dJointCreateContact (self->worldId,
                                           self->contactGroup, &contact);

Modified: code/gazebo/trunk/server/physics/ode/ODEPhysics.hh
===================================================================
--- code/gazebo/trunk/server/physics/ode/ODEPhysics.hh  2008-07-21 23:39:22 UTC 
(rev 6899)
+++ code/gazebo/trunk/server/physics/ode/ODEPhysics.hh  2008-07-22 16:14:59 UTC 
(rev 6900)
@@ -28,11 +28,9 @@
 #define ODEPHYSICS_HH
 
 #include <ode/ode.h>
-#include <map>
 
 #include "PhysicsEngine.hh"
 
-
 namespace gazebo
 {
   class SphereGeom;
@@ -131,9 +129,6 @@
   /// \brief Collision attributes
   private: dJointGroupID contactGroup;
           
-  /// List of all the entities
-  private: std::map<int, Entity* > entities;
-
   private: double globalCFM;
   private: double globalERP; 
 };

Modified: code/gazebo/trunk/server/rendering/OgreAdaptor.cc
===================================================================
--- code/gazebo/trunk/server/rendering/OgreAdaptor.cc   2008-07-21 23:39:22 UTC 
(rev 6899)
+++ code/gazebo/trunk/server/rendering/OgreAdaptor.cc   2008-07-22 16:14:59 UTC 
(rev 6900)
@@ -34,6 +34,8 @@
 #include <iostream>
 #include <string.h>
 
+#include "Model.hh"
+#include "OgreVisual.hh"
 #include "UserCamera.hh"
 #include "MovableText.hh"
 #include "OgreHUD.hh"
@@ -273,6 +275,8 @@
   this->updateRate = node->GetDouble("maxUpdateRate",0,0);
 
   this->raySceneQuery = this->sceneMgr->createRayQuery( Ogre::Ray() );
+  this->raySceneQuery->setSortByDistance(true);
+  this->raySceneQuery->setQueryMask(Ogre::SceneManager::ENTITY_TYPE_MASK);
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -466,30 +470,50 @@
 
 
////////////////////////////////////////////////////////////////////////////////
 /// Get an entity at a pixel location using a camera. Used for mouse picking. 
-Entity *OgreAdaptor::GetEntityAt(OgreCamera *camera, int x, int y)
+Entity *OgreAdaptor::GetEntityAt(OgreCamera *camera, Vector2<int> mousePos) 
 {
-  /*
-  Ogre::Vector3 camPos = camera->getPosition();
+  Entity *entity = NULL;
+  Ogre::Camera *ogreCam = camera->GetOgreCamera();
+  Ogre::Vector3 camPos = ogreCam->getPosition();
 
-  Ogre::Ray mouseRay = camera->getCameraToViewportRay(
-      x/camera->GetViewportWidth(), y/camera->GetViewportHeight());
+  Ogre::Ray mouseRay = ogreCam->getCameraToViewportRay(
+      (float)mousePos.x / ogreCam->getViewport()->getActualWidth(), 
+      (float)mousePos.y / ogreCam->getViewport()->getActualHeight() );
 
   this->raySceneQuery->setRay( mouseRay );
 
   // Perform the scene query
   Ogre::RaySceneQueryResult &result = this->raySceneQuery->execute();
   Ogre::RaySceneQueryResult::iterator iter = result.begin();
-   
-  // Get the results, set the camera height
-  if (iter != result.end() && iter->worldFragment)
+
+  for (iter = result.begin(); iter != result.end(); iter++)
   {
-    Ogre::Real terrainHeight = iter->worldFragment->singleIntersection.y;
-    if ((terrainHeight + 10.0f) > camPos.y)
-        camera->setPosition( camPos.x, terrainHeight + 10.0f, camPos.z);
+    if (iter->movable)
+    {
+
+      OgreVisual *vis = 
dynamic_cast<OgreVisual*>(iter->movable->getUserObject());
+      if (vis && vis->GetEntity())
+      {
+        entity = vis->GetEntity();
+        entity->GetVisualNode()->ShowSelectionBox(true);
+        Model *model = NULL;
+        
+        do 
+        {
+          model = dynamic_cast<Model*>(entity);
+          entity = entity->GetParent();
+        } while (model == NULL);
+
+        return model;
+      }
+    }
+
   }
-  */
+
+  return NULL;
 }
 
+
 
////////////////////////////////////////////////////////////////////////////////
 /// Get the desired update rate
 double OgreAdaptor::GetUpdateRate()

Modified: code/gazebo/trunk/server/rendering/OgreAdaptor.hh
===================================================================
--- code/gazebo/trunk/server/rendering/OgreAdaptor.hh   2008-07-21 23:39:22 UTC 
(rev 6899)
+++ code/gazebo/trunk/server/rendering/OgreAdaptor.hh   2008-07-22 16:14:59 UTC 
(rev 6900)
@@ -31,6 +31,7 @@
 #include <X11/Xutil.h>
 #include <GL/glx.h>
 
+#include "Vector2.hh"
 #include "SingletonT.hh"
 
 namespace Ogre
@@ -97,7 +98,7 @@
 
     /// \brief Get an entity at a pixel location using a camera. Used for
     ///        mouse picking. 
-    public: Entity *GetEntityAt(OgreCamera *camera, int x, int y);
+    public: Entity *GetEntityAt(OgreCamera *camera, Vector2<int> mousePos);
 
     private: void LoadPlugins();
     private: void SetupResources();

Modified: code/gazebo/trunk/server/rendering/OgreVisual.cc
===================================================================
--- code/gazebo/trunk/server/rendering/OgreVisual.cc    2008-07-21 23:39:22 UTC 
(rev 6899)
+++ code/gazebo/trunk/server/rendering/OgreVisual.cc    2008-07-22 16:14:59 UTC 
(rev 6900)
@@ -24,6 +24,7 @@
  * SVN: $Id:$
  */
 #include <Ogre.h>
+#include "Entity.hh"
 #include "Global.hh"
 #include "GazeboMessage.hh"
 #include "GazeboError.hh"
@@ -37,7 +38,7 @@
 
 
////////////////////////////////////////////////////////////////////////////////
 // Constructor
-OgreVisual::OgreVisual(OgreVisual *node)
+OgreVisual::OgreVisual(OgreVisual *node, Entity *owner)
 {
   std::ostringstream stream;
 
@@ -52,10 +53,10 @@
   //FIXME: what if we add the capability to delete and add new children?
   stream << this->parentNode->getName() << "_VISUAL_" << visualCounter++;
   
-
   // Create the scene node
   this->sceneNode = this->parentNode->createChildSceneNode( stream.str() );
 
+  this->entity = owner;
 
   this->staticGeometry = NULL;
   this->boundingBoxNode = NULL;
@@ -100,7 +101,7 @@
   try
   {
     // Create the entity
-    stream << this->sceneNode->getName() << "_ENTITY";
+    stream << "ENTITY_" << this->sceneNode->getName();
     obj = 
(Ogre::MovableObject*)this->sceneNode->getCreator()->createEntity(stream.str(), 
meshName);
   }
   catch (Ogre::Exception e)
@@ -171,6 +172,7 @@
 void OgreVisual::AttachObject( Ogre::MovableObject *obj)
 {
   this->sceneNode->attachObject(obj);
+  obj->setUserObject( this );
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -524,3 +526,26 @@
   this->boundingBoxNode->setVisible(false);
 
 }
+
+////////////////////////////////////////////////////////////////////////////////
+/// Get the entity that manages this visual
+Entity *OgreVisual::GetEntity() const
+{
+  return this->entity;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Set to true to show a white bounding box, used to indicate user selection
+void OgreVisual::ShowSelectionBox( bool value )
+{
+  Ogre::SceneNode *node = this->sceneNode;
+
+  while (node && node->numAttachedObjects() == 0)
+  {
+    node = dynamic_cast<Ogre::SceneNode*>(node->getChild(0));
+  }
+  if (node)
+    node->showBoundingBox(value);
+}
+
+

Modified: code/gazebo/trunk/server/rendering/OgreVisual.hh
===================================================================
--- code/gazebo/trunk/server/rendering/OgreVisual.hh    2008-07-21 23:39:22 UTC 
(rev 6899)
+++ code/gazebo/trunk/server/rendering/OgreVisual.hh    2008-07-22 16:14:59 UTC 
(rev 6900)
@@ -38,12 +38,13 @@
 { 
 
   class XMLConfigNode;
-  
+  class Entity;
+
   /// \brief Ogre Visual Object
-  class OgreVisual
+  class OgreVisual : public Ogre::UserDefinedObject
   {
     /// \brief Constructor
-    public: OgreVisual (OgreVisual *node);
+    public: OgreVisual (OgreVisual *node, Entity *owner = NULL);
 
     /// \brief Destructor
     public: virtual ~OgreVisual();
@@ -117,6 +118,14 @@
     /// \brief Make the visual objects static renderables
     public: void MakeStatic();
 
+    /// \brief Get the entity that manages this visual
+    public: Entity *GetEntity() const;
+
+    /// \brief Set to true to show a white bounding box, used to indicate 
+    //         user selection
+    public: void ShowSelectionBox( bool value );
+
+
     private: Ogre::MaterialPtr origMaterial;
     private: Ogre::MaterialPtr myMaterial;
     private: Ogre::SceneBlendType sceneBlendType;
@@ -134,6 +143,7 @@
 
     private: static unsigned int visualCounter;
 
+    private: Entity *entity;
   };
 }
 

Modified: code/gazebo/trunk/server/rendering/UserCamera.cc
===================================================================
--- code/gazebo/trunk/server/rendering/UserCamera.cc    2008-07-21 23:39:22 UTC 
(rev 6899)
+++ code/gazebo/trunk/server/rendering/UserCamera.cc    2008-07-22 16:14:59 UTC 
(rev 6900)
@@ -39,7 +39,7 @@
 
////////////////////////////////////////////////////////////////////////////////
 /// Constructor
 UserCamera::UserCamera(GLWindow *parentWindow)
-  : OgreCamera("User")
+  : OgreCamera("UserCamera")
 {
   this->window = OgreCreator::CreateWindow(parentWindow, 
                      parentWindow->w(), parentWindow->h());

Modified: code/gazebo/trunk/worlds/simpleshapes.world
===================================================================
--- code/gazebo/trunk/worlds/simpleshapes.world 2008-07-21 23:39:22 UTC (rev 
6899)
+++ code/gazebo/trunk/worlds/simpleshapes.world 2008-07-22 16:14:59 UTC (rev 
6900)
@@ -15,10 +15,10 @@
   <verbosity>5</verbosity>
 
   <physics:ode>
-    <stepTime>0.03</stepTime>
+    <stepTime>0.01</stepTime>
     <gravity>0 0 -9.8</gravity>
-    <cfm>0.008</cfm>
-    <erp>0.2</erp>
+    <cfm>10e-5</cfm>
+    <erp>0.3</erp>
   </physics:ode>
 
   <rendering:gui>
@@ -32,18 +32,21 @@
     <sky>
       <material>Gazebo/CloudySky</material>
     </sky>
+    <grid>false</grid>
   </rendering:ogre>
 
   <model:physical name="sphere1_model">
-    <xyz>1 0 1.5</xyz>
+    <xyz>1 0 0.25</xyz>
     <rpy>0.0 0.0 0.0</rpy>
     <static>false</static>
 
     <body:sphere name="sphere1_body">
       <geom:sphere name="sphere1_geom">
         <size>0.5</size>
-        <mass>1.0</mass>
+        <mass>0.0</mass>
 
+        <mu1>109999.0</mu1>
+
         <visual>
           <scale>0.5 0.5 0.5</scale>
           <mesh>unit_sphere</mesh>
@@ -62,7 +65,7 @@
 
       <geom:box name="box1_geom">
         <size>1 1 1</size>
-        <mass>1.0</mass>
+        <mass>0.1</mass>
         <visual>
           <mesh>unit_box</mesh>
           <material>Gazebo/Rocky</material>
@@ -79,6 +82,8 @@
       <geom:cylinder name="cylinder1_geom">
         <size>0.5 1</size>
         <mass>1.0</mass>
+        <mu1>1000.0</mu1>
+
         <visual>
           <mesh>unit_cylinder</mesh>
           <material>Gazebo/RustyBarrel</material>
@@ -100,6 +105,8 @@
         <segments>10 10</segments>
         <uvTile>100 100</uvTile>
         <material>Gazebo/Grey</material>
+        <mu1>109999.0</mu1>
+        <mu2>1000.0</mu2>
       </geom:plane>
     </body:plane>
   </model:physical>


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to