Update.
[universe.git] / main.cc
diff --git a/main.cc b/main.cc
index 405354c..974cbea 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -17,11 +17,20 @@ using namespace std;
 #include "task.h"
 #include "simple_window.h"
 #include "universe.h"
 #include "task.h"
 #include "simple_window.h"
 #include "universe.h"
+#include "plotter.h"
 #include "retina.h"
 #include "manipulator.h"
 #include "intelligence.h"
 #include "retina.h"
 #include "manipulator.h"
 #include "intelligence.h"
+#include "canvas_cairo.h"
+
 #include "xfig_tracer.h"
 
 #include "xfig_tracer.h"
 
+void generate_png(Universe *universe, scalar_t scale, FILE *file) {
+  CanvasCairo canvas(scale, universe->width(), universe->height());
+  universe->draw(&canvas);
+  canvas.write_png(file);
+}
+
 // To train
 // ./main --task hit_shape.task 0 --action-mode=random --nb-ticks=5000 --proportion-for-training=0.5 --save-file=dump.mem --no-window
 
 // To train
 // ./main --task hit_shape.task 0 --action-mode=random --nb-ticks=5000 --proportion-for-training=0.5 --save-file=dump.mem --no-window
 
@@ -142,10 +151,9 @@ int main(int argc, char **argv) {
   }
 
   cout << "FlatLand, a toy universe for goal-planning experiments." << endl;
   }
 
   cout << "FlatLand, a toy universe for goal-planning experiments." << endl;
-  cout << "$Id: main.cc,v 1.89 2007-06-16 13:51:53 fleuret Exp $" << endl;
 
   if(!task) {
 
   if(!task) {
-    task = load_task("dummy.task");
+    task = load_task("dummy.so");
     task_degree = 0;
   }
 
     task_degree = 0;
   }
 
@@ -170,8 +178,11 @@ int main(int argc, char **argv) {
   retina.set_location(manipulator.hand_x(), manipulator.hand_y());
 
   SimpleWindow *window_main = 0, *window_brain = 0;
   retina.set_location(manipulator.hand_x(), manipulator.hand_y());
 
   SimpleWindow *window_main = 0, *window_brain = 0;
+  int window_main_fd = -1;
 
 
-  int winfd = -1;
+#ifdef CAIRO_SUPPORT
+  // cairo_t *window_main_cairo_cr = 0;
+#endif
 
   MapConcatener sensory_map(2);
   sensory_map.add_map(&retina);
 
   MapConcatener sensory_map(2);
   sensory_map.add_map(&retina);
@@ -197,18 +208,21 @@ int main(int argc, char **argv) {
     cout << "done." << endl ;
   }
 
     cout << "done." << endl ;
   }
 
-  if(!no_window) {
+  if(no_window) {
+    cout << "Started without windows." << endl;
+  } else {
     window_main = new SimpleWindow("Universe (main window)", 4, 4, task->width(), task->height());
     window_main = new SimpleWindow("Universe (main window)", 4, 4, task->width(), task->height());
-    winfd = window_main->file_descriptor();
+    window_main_fd = window_main->file_descriptor();
     window_main->map();
     window_main->map();
+#ifdef CAIRO_SUPPORT
+    // window_main_cairo_cr = window_main->get_cairo_context_resource();
+#endif
     cout << "When the main window has the focus, press `q' to quit and click and drag to move" << endl
          << "objects." << endl;
     window_brain = new SimpleWindow("Universe (brain)",
     cout << "When the main window has the focus, press `q' to quit and click and drag to move" << endl
          << "objects." << endl;
     window_brain = new SimpleWindow("Universe (brain)",
-                                     12 + task->width(), 4,
-                                     retina.width(), retina.height() + manipulator.parameter_height());
+                                    12 + task->width(), 4,
+                                    retina.width(), retina.height() + manipulator.parameter_height());
     window_brain->map();
     window_brain->map();
-  } else {
-    cout << "Started without windows." << endl;
   }
 
   int tick = 0;
   }
 
   int tick = 0;
@@ -228,10 +242,10 @@ int main(int argc, char **argv) {
     if(window_main) {
       struct timeval tv;
       FD_ZERO (&fds);
     if(window_main) {
       struct timeval tv;
       FD_ZERO (&fds);
-      FD_SET (winfd, &fds);
+      FD_SET (window_main_fd, &fds);
       tv.tv_sec = 0;
       tv.tv_usec = 5000; // 0.05s
       tv.tv_sec = 0;
       tv.tv_usec = 5000; // 0.05s
-      r = select(winfd + 1, &fds, 0, 0, &tv);
+      r = select(window_main_fd + 1, &fds, 0, 0, &tv);
     } else r = 0;
 
     time_t t = time(0);
     } else r = 0;
 
     time_t t = time(0);
@@ -285,13 +299,24 @@ int main(int argc, char **argv) {
           last_hand_x = manipulator.hand_x();
           last_hand_y = manipulator.hand_y();
           last_grabbing = manipulator.grabbing();
           last_hand_x = manipulator.hand_x();
           last_hand_y = manipulator.hand_y();
           last_grabbing = manipulator.grabbing();
-          retina.set_location(manipulator.hand_x(), manipulator.hand_y());
+
+          retina.set_location(manipulator.hand_x(),
+                              manipulator.hand_y());
 
           if(window_main) {
             window_main->color(0.0, 0.0, 0.0);
 
           if(window_main) {
             window_main->color(0.0, 0.0, 0.0);
+            window_main->color(1.0, 1.0, 1.0);
             window_main->fill();
             window_main->fill();
-            task->draw(window_main);
+
+// #ifdef CAIRO_SUPPORT
+            // CanvasCairo cc;
+            // cc._context_resource = window_main_cairo_cr;
+            // universe.draw(&cc);
+// #else
             universe.draw(window_main);
             universe.draw(window_main);
+// #endif
+
+            task->draw(window_main);
             manipulator.draw_on_universe(window_main);
             retina.draw_on_universe(window_main);
 
             manipulator.draw_on_universe(window_main);
             retina.draw_on_universe(window_main);
 
@@ -318,7 +343,7 @@ int main(int argc, char **argv) {
 
       got_event = true;
 
 
       got_event = true;
 
-      if(FD_ISSET(winfd, &fds)) {
+      if(FD_ISSET(window_main_fd, &fds)) {
 
         SimpleEvent se;
 
 
         SimpleEvent se;
 
@@ -371,18 +396,17 @@ int main(int argc, char **argv) {
 
           case SimpleEvent::MOUSE_MOTION:
             {
 
           case SimpleEvent::MOUSE_MOTION:
             {
-              if(press_shift) manipulator.force_move(se.x, se.y);
-              else {
-                if(grabbed_polygon) {
-                  scalar_t xf, yf, force_x, force_y, f, fmax = 100;
-                  xf = grabbed_polygon->absolute_x(relative_grab_x, relative_grab_y);
-                  yf = grabbed_polygon->absolute_y(relative_grab_x, relative_grab_y);
-                  force_x = se.x - xf;
-                  force_y = se.y - yf;
-                  f = sqrt(sq(force_x) + sq(force_y));
-                  if(f > fmax) { force_x = (force_x * fmax)/f; force_y = (force_y * fmax)/f; }
-                  grabbed_polygon->apply_force(0.1, xf, yf, force_x, force_y);
-                }
+              if(press_shift) {
+                manipulator.force_move(se.x, se.y);
+              } else if(grabbed_polygon) {
+                scalar_t xf, yf, force_x, force_y, f, fmax = 100;
+                xf = grabbed_polygon->absolute_x(relative_grab_x, relative_grab_y);
+                yf = grabbed_polygon->absolute_y(relative_grab_x, relative_grab_y);
+                force_x = se.x - xf;
+                force_y = se.y - yf;
+                f = sqrt(sq(force_x) + sq(force_y));
+                if(f > fmax) { force_x = (force_x * fmax)/f; force_y = (force_y * fmax)/f; }
+                grabbed_polygon->apply_force(0.1, xf, yf, force_x, force_y);
               }
               break;
             }
               }
               break;
             }
@@ -390,23 +414,65 @@ int main(int argc, char **argv) {
 
           case SimpleEvent::KEY_PRESS:
             {
 
           case SimpleEvent::KEY_PRESS:
             {
-              if(strcmp(se.key, "q") == 0) quit = true;
+              if(strcmp(se.key, "q") == 0) {
+                quit = true;
+              }
+
               else if(strcmp(se.key, "s") == 0) {
               else if(strcmp(se.key, "s") == 0) {
+
                 retina.save_as_ppm("/tmp/retina.ppm");
                 cout << "Retina screen shot saved in /tmp/retina.ppm" << endl;
                 retina.save_as_ppm("/tmp/retina.ppm");
                 cout << "Retina screen shot saved in /tmp/retina.ppm" << endl;
+
+                {
+                  Plotter plotter(int(universe.width()), int(universe.height()), 4);
+                  plotter.save_as_ppm(&universe, "/tmp/plotter.ppm", 16);
+                }
+
+#ifdef XFIG_SUPPORT
                 {
                   XFigTracer tracer("/tmp/universe.fig");
                 {
                   XFigTracer tracer("/tmp/universe.fig");
-                  universe.print_fig(&tracer);
+                  universe.print_xfig(&tracer);
                 }
                 }
+#endif
+
+#ifdef CAIRO_SUPPORT
+                {
+                  FILE *file = fopen("/tmp/universe.png", "w");
+                  generate_png(&universe, 0.25, file);
+                  // generate_png(task->width(), task->height(), &universe, "/tmp/universe.png");
+                  cout << "Universe image saved in /tmp/universe.png" << endl;
+                }
+#endif
+
+              }
+
+              else if(strcmp(se.key, "Shift_L") == 0 || strcmp(se.key, "Shift_R") == 0) {
+                press_shift = true;
+              }
+
+              else if(strcmp(se.key, "Up") == 0) {
+                manipulator.do_action(Manipulator::ACTION_MOVE_UP);
+              }
+
+              else if(strcmp(se.key, "Right") == 0) {
+                manipulator.do_action(Manipulator::ACTION_MOVE_RIGHT);
+              }
+
+              else if(strcmp(se.key, "Down") == 0) {
+                manipulator.do_action(Manipulator::ACTION_MOVE_DOWN);
+              }
+
+              else if(strcmp(se.key, "Left") == 0) {
+                manipulator.do_action(Manipulator::ACTION_MOVE_LEFT);
+              }
+
+              else if(strcmp(se.key, "g") == 0) {
+                manipulator.do_action(Manipulator::ACTION_GRAB);
+              }
+
+              else if(strcmp(se.key, "r") == 0) {
+                manipulator.do_action(Manipulator::ACTION_RELEASE);
               }
               }
-              else if(strcmp(se.key, "Shift_L") == 0 || strcmp(se.key, "Shift_R") == 0) press_shift = true;
-
-              else if(strcmp(se.key, "Up") == 0) manipulator.do_action(Manipulator::ACTION_MOVE_UP);
-              else if(strcmp(se.key, "Right") == 0) manipulator.do_action(Manipulator::ACTION_MOVE_RIGHT);
-              else if(strcmp(se.key, "Down") == 0) manipulator.do_action(Manipulator::ACTION_MOVE_DOWN);
-              else if(strcmp(se.key, "Left") == 0) manipulator.do_action(Manipulator::ACTION_MOVE_LEFT);
-              else if(strcmp(se.key, "g") == 0) manipulator.do_action(Manipulator::ACTION_GRAB);
-              else if(strcmp(se.key, "r") == 0) manipulator.do_action(Manipulator::ACTION_RELEASE);
 
               else if(strcmp(se.key, "space") == 0) {
                 switch(action_mode) {
 
               else if(strcmp(se.key, "space") == 0) {
                 switch(action_mode) {