]> git.cworth.org Git - akamaru/blobdiff - main.c
Add anchor constraint and use it to lock center point in dock model.
[akamaru] / main.c
diff --git a/main.c b/main.c
index 39cb5ad1158a64535661f33fb6221138f74ca51d..3b1d8d43c108e27e4d431a47d3c930b20e20e1e0 100644 (file)
--- a/main.c
+++ b/main.c
@@ -63,8 +63,6 @@ model_init_snake (Model *model)
       model->sticks[i * 2 + 1].length = random() % 20 + 20;
     }
   }
-
-  model->anchor_object = NULL;
 }
 
 static void
@@ -91,8 +89,6 @@ model_init_rope (Model *model)
       model->sticks[i].length = stick_length;
     }
   }
-
-  model->anchor_object = NULL;
 }
 
 static void
@@ -138,15 +134,13 @@ model_init_curtain (Model *model)
 
     model->offsets[0].objects[i] = &model->objects[i * num_rope_objects];
   }
-
-  model->anchor_object = NULL;
 }
 
 static void
 model_init_grid (Model *model)
 {
-  const int num_ropes = 4;
-  const int num_rope_objects = 4;
+  const int num_ropes = 8;
+  const int num_rope_objects = 8;
   const int num_objects = num_ropes * num_rope_objects;
   const int num_strings = num_ropes * (num_rope_objects - 1) +
     (num_ropes - 1) * num_rope_objects;
@@ -186,8 +180,6 @@ model_init_grid (Model *model)
 
     model->offsets[0].objects[i] = &model->objects[i * num_rope_objects];
   }
-
-  model->anchor_object = NULL;
 }
 
 static void
@@ -281,13 +273,17 @@ model_init_dock (Model *model)
   model->num_springs = num_springs;
   model->spacers = g_new (Spacer, num_spacers);
   model->num_spacers = num_spacers;
+  model->anchors = g_new (Anchor, 1);
+  model->num_anchors = 1;
   model->k = 0.1;
 
-  model_init_polygons (model);
   model->polygons = g_new (Polygon, 1);
-  polygon_init_rectangle (&model->polygons[0], -400, 300, 1400, 350);
   model->num_polygons = 1;
+  polygon_init_rectangle (&model->polygons[0], -400, 300, 1400, 350);
 
+  model->anchors[0].x = 300;
+  model->anchors[0].y = 300;
+  model->anchors[0].object = &model->objects[0];
 
   object = model->objects;
   spring = model->springs;
@@ -528,10 +524,10 @@ button_press_event (GtkWidget        *widget,
   if (event->button != 1)
     return TRUE;
 
-  closure->model->anchor_position.x = event->x;
-  closure->model->anchor_position.y = event->y;
-  closure->model->anchor_object = model_find_nearest (closure->model,
-                                                     event->x, event->y);
+  closure->model->mouse_anchor.x = event->x;
+  closure->model->mouse_anchor.y = event->y;
+  closure->model->mouse_anchor.object =
+    model_find_nearest (closure->model, event->x, event->y);
 
   return TRUE;
 }
@@ -546,7 +542,7 @@ button_release_event (GtkWidget          *widget,
   if ((event->state & GDK_BUTTON1_MASK) == 0)
     return TRUE;
 
-  closure->model->anchor_object = NULL;
+  closure->model->mouse_anchor.object = NULL;
 
   return TRUE;
 }
@@ -562,8 +558,8 @@ motion_notify_event (GtkWidget          *widget,
 
   gdk_window_get_pointer (event->window, &x, &y, &state);
   
-  closure->model->anchor_position.x = x + 0.5;
-  closure->model->anchor_position.y = y + 0.5;
+  closure->model->mouse_anchor.x = x + 0.5;
+  closure->model->mouse_anchor.y = y + 0.5;
 
   return TRUE;
 }