00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #include "construo_error.hxx"
00021 #include "controller.hxx"
00022 
00023 Controller* Controller::instance_ = 0;
00024 
00025 Controller::Controller ()
00026 {
00027   instance_  = this;
00028   running    = false;
00029   slow_down  = false;
00030   action_cam = false;
00031   hide_dots  = false;
00032   world      = new World ();
00033 }
00034 
00035 Controller::Controller (const std::string& filename)
00036 {
00037   instance_  = this;
00038   running    = false;
00039   slow_down  = false;
00040   action_cam = false;
00041   hide_dots  = false;
00042   world     = new World (filename);
00043 }
00044 
00045 Controller::~Controller ()
00046 {
00047   instance_ = 0;
00048 }
00049 
00050 void
00051 Controller::load_world (const std::string& filename)
00052 {
00053   if (world)
00054     undo_world_stack.push_back(world);
00055 
00056   std::cout << "Loading World..." << std::endl;
00057   world = new World (filename);
00058   running = false;
00059   std::cout << "Loading World... DONE" << std::endl; 
00060 }
00061 
00062 void
00063 Controller::save_world (const std::string& filename)
00064 {
00065   std::cout << "Saving World..." << std::endl;
00066   world->write_lisp (filename);
00067   std::cout << "Saving World... DONE" << std::endl;
00068 }
00069 
00070 
00071 std::string
00072 Controller::get_slot_filename(int n)
00073 {
00074   return "/user/" + std::string("quicksave") + char('0' + n) + ".construo";
00075 }
00076 
00077 void
00078 Controller::save_to_slot (int n)
00079 {
00080   try {
00081     save_world (get_slot_filename (n));
00082   } catch (ConstruoError& err) {
00083     std::cout << "Controller: Error: " << err.msg << std::endl;
00084   }
00085 }
00086 
00087 void
00088 Controller::load_from_slot (int n)
00089 {
00090   try {
00091     load_world (get_slot_filename (n));
00092   } catch (ConstruoError& err) {
00093     std::cout << "Controller: Error: " << err.msg << std::endl;
00094   }
00095 }
00096 
00097 void
00098 Controller::update ()
00099 {
00100   float delta = delta_manager.getset ();
00101 
00102   if (running)
00103     {
00104       float min_skip;
00105 
00106       if (slow_down)
00107         {
00108           delta /= 50.0f/20.0f;
00109           min_skip = 0.0007f;
00110         }
00111       else
00112         {
00113           delta /= 5.0f/20.0f;
00114           min_skip = 0.02;
00115         }
00116       
00117       float i = 0.0f;
00118       while (i < delta)
00119         {
00120           world->update (min_skip);
00121           i += min_skip;
00122         }
00123     }
00124 }
00125 
00126 void
00127 Controller::start_simulation ()
00128 {
00129   if (!running)
00130     undo_world_stack.push_back(world->duplicate());
00131 
00132   if (undo_world_stack.size() > 100)
00133     {
00134       
00135       
00136       
00137     }
00138 
00139   running = !running;
00140 }
00141 
00142 void
00143 Controller::push_undo()
00144 {
00145   undo_world_stack.push_back(world->duplicate());
00146 }
00147 
00148 void
00149 Controller::clear_world ()
00150 {
00151   std::cout << "Controller: Clear" << std::endl;
00152   undo_world_stack.push_back(world);
00153   world = new World ();
00154   running = false;                
00155 }
00156 
00157 void
00158 Controller::undo ()
00159 {
00160   std::cout << "Controller::undo (): undostack: " << undo_world_stack.size() 
00161             << " redostack: " << redo_world_stack.size() << std::endl;
00162 
00163   if (!undo_world_stack.empty())
00164     {
00165       
00166       redo_world_stack.push_back (world);
00167       world = undo_world_stack.back();
00168       undo_world_stack.pop_back();
00169       running = false;
00170     }
00171   else
00172     {
00173       std::cout << "Undo stack empty" << std::endl;
00174     }
00175 }
00176 
00177 void
00178 Controller::redo ()
00179 {
00180   if (!redo_world_stack.empty())
00181     {
00182       undo_world_stack.push_back (world);
00183       world = redo_world_stack.back();
00184       redo_world_stack.pop_back();
00185       running = false;
00186     }
00187   else
00188     {
00189       std::cout << "Redo stack empty" << std::endl;
00190     }
00191 }
00192 
00193 void
00194 Controller::set_action_cam(bool a)
00195 {
00196   action_cam = a;
00197 }
00198 
00199 bool
00200 Controller::get_action_cam()
00201 {
00202   return action_cam;
00203 }
00204 
00205 void
00206 Controller::set_hide_dots (bool d)
00207 {
00208   hide_dots = d;
00209 }
00210 
00211 bool
00212 Controller::get_hide_dots ()
00213 {
00214   return hide_dots;
00215 }
00216 
00217