Revision: 8424
          http://playerstage.svn.sourceforge.net/playerstage/?rev=8424&view=rev
Author:   natepak
Date:     2009-11-20 02:52:19 +0000 (Fri, 20 Nov 2009)

Log Message:
-----------
Added beginning of replay

Modified Paths:
--------------
    code/gazebo/trunk/server/World.cc
    code/gazebo/trunk/server/World.hh
    code/gazebo/trunk/server/gui/Gui.cc
    code/gazebo/trunk/server/gui/Gui.hh
    code/gazebo/trunk/server/physics/Body.cc

Modified: code/gazebo/trunk/server/World.cc
===================================================================
--- code/gazebo/trunk/server/World.cc   2009-11-19 19:18:09 UTC (rev 8423)
+++ code/gazebo/trunk/server/World.cc   2009-11-20 02:52:19 UTC (rev 8424)
@@ -29,6 +29,7 @@
 #include <fstream>
 #include <sys/time.h> //gettimeofday
 
+#include "Body.hh"
 #include "Factory.hh"
 #include "GraphicsIfaceHandler.hh"
 #include "Global.hh"
@@ -72,6 +73,11 @@
   this->threadsP = new ParamT<int>("threads",2,0);
   Param::End();
 #endif
+
+  this->worldStates.resize(10000);
+  this->worldStatesInsertIter = this->worldStates.begin();
+  this->worldStatesEndIter = this->worldStates.end()-1;
+  this->worldStatesCurrentIter = this->worldStatesInsertIter;
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -326,6 +332,8 @@
        Simulator::Instance()->GetPhysicsEnabled())
   {
     this->physicsEngine->UpdatePhysics();
+
+    this->SaveState();
   }
 
   this->factory->Update();
@@ -602,13 +610,20 @@
 }
 
 
////////////////////////////////////////////////////////////////////////////////
-// The plane and heighweighmap will not be registered
+// Register a geom
 void World::RegisterGeom(Geom *geom)
 {
   this->geometries.push_back(geom);
 }
 
 
////////////////////////////////////////////////////////////////////////////////
+// Register a body
+void World::RegisterBody( Body *body )
+{
+  this->bodies.push_back(body);
+}
+
+////////////////////////////////////////////////////////////////////////////////
 // True if the bounding boxes of the models are being shown
 bool World::GetShowBoundingBoxes()
 {
@@ -1302,25 +1317,93 @@
   this->toDeleteModels.clear();
 }
 
-void World::GetInterfaceNames(Entity* en, std::vector<std::string>& list){
-               
-       
+void World::GetInterfaceNames(Entity* en, std::vector<std::string>& list)
+{
        Model* m = dynamic_cast<Model*>(en);
-       if(m){
+
+       if(m)
                m->GetModelInterfaceNames(list);
-       }
        
        std::vector<Entity*>::iterator citer;
-       for (citer=en->GetChildren().begin();  citer!=en->GetChildren().end(); 
citer++)
-       {
-
-       
+       for (citer=en->GetChildren().begin(); citer!=en->GetChildren().end(); 
citer++)
                this->GetInterfaceNames((*citer),list);
-       
+}
 
-       }
+////////////////////////////////////////////////////////////////////////////////
+// Save the state of the world
+void World::SaveState()
+{
+  std::vector<Model*>::iterator mIter;
+  std::vector<Body*>::iterator bIter;
+  std::vector<Geom*>::iterator gIter;
 
+  WorldState *ws = &(*this->worldStatesInsertIter);
+  for (mIter = this->models.begin(); mIter != this->models.end(); mIter++)
+    ws->modelPoses[(*mIter)->GetName()] = (*mIter)->GetRelativePose();
+
+  for (bIter = this->bodies.begin(); bIter !=this->bodies.end(); bIter++)
+    ws->bodyPoses[(*bIter)->GetName()] = (*bIter)->GetRelativePose();
+
+  for (gIter = this->geometries.begin(); gIter !=this->geometries.end(); 
+       gIter++)
+    ws->geomPoses[(*gIter)->GetName()] = (*gIter)->GetRelativePose();
+
+  this->worldStatesInsertIter++;
+  if (this->worldStatesInsertIter == this->worldStates.end())
+    this->worldStatesInsertIter = this->worldStates.begin();
+
+  if (this->worldStatesInsertIter == this->worldStatesEndIter)
+  {
+    this->worldStatesEndIter++;
+    if (this->worldStatesEndIter == this->worldStates.end())
+      this->worldStatesEndIter = this->worldStates.begin();
+  }
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// Set the state of the world to the pos pointed to by the iterator
+void World::SetState(std::deque<WorldState>::iterator iter)
+{
+  std::vector<Model*>::iterator mIter;
+  std::vector<Body*>::iterator bIter;
+  std::vector<Geom*>::iterator gIter;
 
+  WorldState *ws = &(*iter);
+  for (mIter = this->models.begin(); mIter != this->models.end(); mIter++)
+    (*mIter)->SetRelativePose( ws->modelPoses[(*mIter)->GetName()] );
 
+  for (bIter = this->bodies.begin(); bIter !=this->bodies.end(); bIter++)
+    (*bIter)->SetRelativePose( ws->bodyPoses[(*bIter)->GetName()] );
+
+  for (gIter = this->geometries.begin(); gIter !=this->geometries.end(); 
+       gIter++)
+    (*gIter)->SetRelativePose( ws->geomPoses[(*gIter)->GetName()] );
+
+  this->worldStatesCurrentIter = iter;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+/// Goto a position in time
+void World::GotoTime(double pos)
+{
+  Simulator::Instance()->SetPaused(true);
+
+  this->worldStatesCurrentIter = this->worldStatesInsertIter;
+
+  int i = (int)(this->worldStates.size() * (1.0-pos));
+
+  if (this->worldStatesCurrentIter == this->worldStates.begin())
+    this->worldStatesCurrentIter = this->worldStates.end()--;
+
+  for (;i>=0;i--, this->worldStatesCurrentIter--)
+  {
+    if (this->worldStatesCurrentIter == this->worldStates.begin())
+      this->worldStatesCurrentIter = this->worldStates.end()-1;
+
+    if (this->worldStatesCurrentIter == this->worldStatesEndIter)
+      break;
+  }
+
+  this->SetState(this->worldStatesCurrentIter);
+}

Modified: code/gazebo/trunk/server/World.hh
===================================================================
--- code/gazebo/trunk/server/World.hh   2009-11-19 19:18:09 UTC (rev 8423)
+++ code/gazebo/trunk/server/World.hh   2009-11-20 02:52:19 UTC (rev 8424)
@@ -29,6 +29,10 @@
 
 #include <iostream>
 #include <vector>
+#include <deque>
+#include <map>
+#include <string>
+
 #include <boost/tuple/tuple.hpp>
 #include <boost/signal.hpp>
 
@@ -59,6 +63,7 @@
   class GraphicsIfaceHandler;
   class OpenAL;
   class Factory;
+  class WorldState;
    
 /// \brief The World
 /*
@@ -154,9 +159,12 @@
   /// \brief Reset the simulation to the initial settings
   public: void Reset();
 
-  /// \brief register a geom This method is no more than a manually-done 
signal system
+  /// \brief register a geom
   public: void RegisterGeom(Geom *geom);
 
+  /// \brief Register a body 
+  public: void RegisterBody(Body *body);
+
   // User control of how the world is viewed 
   // If this section grows it may become a model-view structure ...
   /// \brief Return true if the bounding boxes should be shown
@@ -183,6 +191,15 @@
   /// \brief Get whether to view as wireframe
   public: bool GetShowPhysics();
 
+  /// \brief Goto a position in time
+  public: void GotoTime(double pos);
+
+  /// \brief Save the state of the world
+  private: void SaveState();
+
+  /// \breif Set the state of the world to the pos pointed to by the iterator
+  private: void SetState(std::deque<WorldState>::iterator iter);
+
   /// Set to true to show bounding boxes
   private: bool showBoundingBoxes;
 
@@ -228,6 +245,9 @@
   /// List of all the registered geometries
   private: std::vector< Geom* > geometries;
 
+  /// List of all the registered bodies
+  private: std::vector< Body* > bodies;
+
   /// List of models to delete from the world
   private: std::vector< Model* > toDeleteModels;
 
@@ -259,8 +279,19 @@
   private: friend class SingletonT<World>;
 
   private: boost::signal<void (Entity*)> addEntitySignal;
+
+  private: std::deque<WorldState> worldStates;
+  private: std::deque<WorldState>::iterator worldStatesInsertIter;
+  private: std::deque<WorldState>::iterator worldStatesEndIter;
+  private: std::deque<WorldState>::iterator worldStatesCurrentIter;
 };
 
+class WorldState
+{
+  public: std::map<std::string, Pose3d> modelPoses;
+  public: std::map<std::string, Pose3d> bodyPoses;
+  public: std::map<std::string, Pose3d> geomPoses;
+};
 
 /// \}
 }

Modified: code/gazebo/trunk/server/gui/Gui.cc
===================================================================
--- code/gazebo/trunk/server/gui/Gui.cc 2009-11-19 19:18:09 UTC (rev 8423)
+++ code/gazebo/trunk/server/gui/Gui.cc 2009-11-20 02:52:19 UTC (rev 8424)
@@ -32,6 +32,7 @@
 #include <FL/Fl_Gl_Window.H>
 #include <FL/fl_draw.H>
 
+#include "World.hh"
 #include "Global.hh"
 #include "XMLConfig.hh"
 #include "GLFrameManager.hh"
@@ -69,12 +70,19 @@
     new MainMenu(0, 0, w(), 20, (char *)"MainMenu");
 
     this->toolbar = new Toolbar(0, 20, this->w(), 30);
-    this->sidebar = new Sidebar(0, 60, toolbarWidth, this->h() - 90);
+    this->sidebar = new Sidebar(0, 60, toolbarWidth, this->h() - 115);
 
     // Create the frame mamanger
     this->frameMgr = new GLFrameManager(toolbarWidth, 60, 
-                         this->w()-toolbarWidth, this->h()-90, "");
+                         this->w()-toolbarWidth, this->h()-115, "");
 
+    this->timeSlider = new Fl_Slider(35,this->h()-50,this->w()-35,20,"Time:" );
+    this->timeSlider->type(FL_HOR_NICE_SLIDER);
+    this->timeSlider->align(FL_ALIGN_LEFT);
+    this->timeSlider->labelsize(10);
+    this->timeSlider->callback(&Gui::TimeSliderCB, this);
+    this->timeSlider->value(1.0);
+
     // Create the status bar
     this->statusbar = new StatusBar(0, this->h()-30, 
                          width, 30);
@@ -156,6 +164,9 @@
   this->toolbar->Update();
   this->statusbar->Update();
   this->frameMgr->Update();
+  
+  if (!Simulator::Instance()->IsPaused())
+    this->timeSlider->value(1.0);
 
   Fl::check();
 
@@ -204,4 +215,11 @@
   return this->frameMgr->GetFPS();
 }
 
-
+////////////////////////////////////////////////////////////////////////////////
+// Time slider CB
+void Gui::TimeSliderCB( Fl_Widget * w, void *data)
+{
+  //Gui *self = (Gui*)(data);
+  Fl_Slider *slider = (Fl_Slider*)(w);
+  World::Instance()->GotoTime( slider->value() );
+}

Modified: code/gazebo/trunk/server/gui/Gui.hh
===================================================================
--- code/gazebo/trunk/server/gui/Gui.hh 2009-11-19 19:18:09 UTC (rev 8423)
+++ code/gazebo/trunk/server/gui/Gui.hh 2009-11-20 02:52:19 UTC (rev 8424)
@@ -32,17 +32,18 @@
 
 #include <FL/Fl.H>
 #include <FL/Fl_Double_Window.H>
+#include <FL/Fl_Slider.H>
 #include <string>
 #include <iostream>
 
 #include "Param.hh"
 #include "Vector2.hh"
 
-#define BG_COLOR fl_rgb_color(235,225,208 )
+//#define BG_COLOR fl_rgb_color(235,225,208 )
+#define BG_COLOR FL_BACKGROUND_COLOR
 
 namespace gazebo
 {
-
   class GLWindow;
   class Sidebar;
   class Toolbar;
@@ -85,6 +86,9 @@
     /// \brief Get the average FPS
     public: float GetAvgFPS() const;
 
+    /// \brief Time slider cb
+    private: static void TimeSliderCB( Fl_Widget * w, void *data);
+
     private: Toolbar *toolbar;
     private: Sidebar *sidebar;
     private: StatusBar *statusbar;
@@ -95,8 +99,9 @@
     private: ParamT<Vector2<int> > *sizeP;
     private: ParamT<Vector2<int> > *posP;
     private: std::vector<Param*> parameters;
+
+    private: Fl_Slider *timeSlider;
   };
-
 }
 
 #endif

Modified: code/gazebo/trunk/server/physics/Body.cc
===================================================================
--- code/gazebo/trunk/server/physics/Body.cc    2009-11-19 19:18:09 UTC (rev 
8423)
+++ code/gazebo/trunk/server/physics/Body.cc    2009-11-20 02:52:19 UTC (rev 
8424)
@@ -206,6 +206,8 @@
     this->LoadSensor(childNode);
     childNode = childNode->GetNextByNSPrefix("sensor");
   }
+
+  World::Instance()->RegisterBody(this);
 }
 
 
////////////////////////////////////////////////////////////////////////////////


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

Reply via email to