changeset 424:a64d894aa1bd

Actually snap to grid.
author Simon Cross <hodgestar@gmail.com>
date Sat, 07 Sep 2013 13:30:06 +0200
parents eb1a4a269d37
children 1a85044f81a8 3ee839f227ad
files tools/area_editor.py
diffstat 1 files changed, 22 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/tools/area_editor.py	Sat Sep 07 13:05:41 2013 +0200
+++ b/tools/area_editor.py	Sat Sep 07 13:30:06 2013 +0200
@@ -73,9 +73,6 @@
         self.lookup = {}
         self._move_poly = None
 
-    def round_point(self, pos):
-        return (10 * (pos[0] // 10), 10 * (pos[1] // 10))
-
     def load(self, space):
         super(EditorLevel, self).load(space)
         # Needed to fill in the lookup dict
@@ -90,44 +87,12 @@
     def add_point(self, poly_index, pos):
         self.polygons.setdefault(poly_index, [])
         if not self.polygons[poly_index]:
-            point = self.point_to_pymunk(self.round_point(pos))
+            point = self.point_to_pymunk(pos)
             self.polygons[poly_index].append(point)
         else:
-            add_pos = self.fix_poly_angle(poly_index, pos)
+            add_pos = self.point_to_pymunk(pos)
             self.polygons[poly_index].append(add_pos)
 
-    def _fix_angle(self, point1, pos):
-        # We want the line (point1 to pos) to be an angle of
-        # 0, 45, 90, 135, 180, 225, 270, 305
-        # However, we only need to consider half the circle
-        # This is a hack to approximate the right thing
-        pos0 = (pos[0], point1[1])
-        pos90 = (point1[0], pos[1])
-        dist = max(abs(point1[0] - pos[0]), abs(point1[1] - pos[1]))
-        pos45 = (point1[0] + dist, point1[1] + dist)
-        pos135 = (point1[0] + dist, point1[1] - dist)
-        pos225 = (point1[0] - dist, point1[1] - dist)
-        pos305 = (point1[0] - dist, point1[1] + dist)
-        min_dist = 9999999
-        new_pos = point1
-        for cand in [pos0, pos90, pos45, pos135, pos225, pos305]:
-            dist = distance(pos, cand)
-            if dist < min_dist:
-                new_pos = cand
-                min_dist = dist
-        return self.point_to_pymunk(new_pos)
-
-    def fix_line_angle(self, start_pos, pos):
-        start_pos = self.round_point(start_pos)
-        pos = self.round_point(pos)
-        return self._fix_angle(start_pos, pos)
-
-    def fix_poly_angle(self, index, pos):
-        # Last point
-        point1 = self.point_to_pygame(self.polygons[index][-1])
-        pos = self.round_point(pos)
-        return self._fix_angle(point1, pos)
-
     def delete_point(self, index):
         if index in self.polygons and len(self.polygons[index]) > 0:
             self.polygons[index].pop()
@@ -141,33 +106,12 @@
             # Too small
             return False
         first = self.polygons[index][0]
-        if self.fix_poly_angle(index, self.point_to_pygame(first)) == first:
-            self.add_point(index, self.point_to_pygame(first))
-            return True
-        candidates = [(first[0] + 10 * i, first[1]) for
-                      i in (-3, -2, -1, 1, 2, 3)]
-        candidates.extend([(first[0], first[1] + 10 * i) for
-                          i in (-3, -2, -1, 1, 2, 3)])
-        candidates.extend([(first[0] + 10 * i, first[1] + 10 * i) for
-                          i in (-3, -2, -1, 1, 2, 3)])
-        candidates.extend([(first[0] + 10 * i, first[1] - 10 * i) for
-                          i in (-3, -2, -1, 1, 2, 3)])
-        min_dist = 99999
-        poss = None
-        for cand in candidates:
-            if self.fix_poly_angle(index, self.point_to_pygame(cand)) == cand:
-                dist = distance(first, cand)
-                if dist < min_dist:
-                    poss = cand
-        if poss is not None:
-            self.add_point(index, self.point_to_pygame(poss))
-            self.add_point(index, self.point_to_pygame(first))
-            return True
-        return False
+        self.add_point(index, self.point_to_pygame(first))
+        return True
 
     def add_line(self, start_pos, end_pos):
-        endpoint = self.fix_line_angle(start_pos, end_pos)
-        startpoint = self.point_to_pymunk(self.round_point(start_pos))
+        startpoint = self.point_to_pymunk(start_pos)
+        endpoint = self.point_to_pymunk(end_pos)
         self.lines.append([startpoint, endpoint])
 
     def draw(self, mouse_pos, mouse_poly, filled, draw_cand_line, start_pos,
@@ -188,7 +132,7 @@
                 pointlist = [self.point_to_pygame(p) for p in polygon]
                 pygame.draw.lines(self._surface, color, False, pointlist, 2)
             if index == mouse_poly and mouse_pos:
-                endpoint = self.fix_poly_angle(index, mouse_pos)
+                endpoint = self.point_to_pymunk(mouse_pos)
                 pygame.draw.line(self._surface, color,
                                  self.point_to_pygame(polygon[-1]),
                                  self.point_to_pygame(endpoint))
@@ -202,8 +146,8 @@
                     pointlist.append(mouse_pos)
             pygame.draw.lines(self._surface, LINE_COLOR, False, pointlist, 2)
         if draw_cand_line and start_pos and mouse_pos:
-            endpoint = self.fix_line_angle(start_pos, mouse_pos)
-            pointlist = [self.round_point(start_pos),
+            endpoint = self.snap_to_grid(mouse_pos)
+            pointlist = [start_pos,
                          self.point_to_pygame(endpoint)]
             pygame.draw.lines(self._surface, LINE_COLOR, False, pointlist, 1)
         return self._surface.copy()
@@ -483,6 +427,11 @@
     def inc_grid_size(self, amount):
         self.grid_size = max(1, self.grid_size + amount)
 
+    def snap_to_grid(self, pos):
+        x = pos[0] - (pos[0] % self.grid_size)
+        y = pos[1] - (pos[1] % self.grid_size)
+        return (x, y)
+
     def set_objects(self, value):
         if self._draw_objects != value:
             self._draw_objects = value
@@ -508,11 +457,14 @@
                 and len(self.level.polygons[self.cur_poly])):
             # We have an active polygon
             mouse_pos = self._level_coordinates(self.mouse_pos)
+            mouse_pos = self.snap_to_grid(mouse_pos)
         elif self._draw_lines:
             # Interior wall mode
             mouse_pos = self._level_coordinates(self.mouse_pos)
+            mouse_pos = self.snap_to_grid(mouse_pos)
         elif self._move_point_mode:
             mouse_pos = self._level_coordinates(self.mouse_pos)
+            mouse_pos = self.snap_to_grid(mouse_pos)
         else:
             mouse_pos = None
         level_surface = level.draw(mouse_pos, self.cur_poly, self.filled_mode,
@@ -605,6 +557,7 @@
 
     def mouse_down(self, ev):
         corrected_pos = self._level_coordinates(ev.pos)
+        snapped_pos = self.snap_to_grid(corrected_pos)
         if self.sel_mode and ev.button == 1:
             obj = self.level.find_obj_at_pos(corrected_pos)
             if obj is not None:
@@ -612,18 +565,18 @@
         elif self._move_point_mode and ev.button == 1:
             if self._move_point:
                 # Place the current point
-                self.level.replace_vertex(self._move_point, corrected_pos)
+                self.level.replace_vertex(self._move_point, snapped_pos)
                 self._move_point = None
                 self.invalidate()
             else:
                 # find the current point
-                self._move_point = self.level.find_vertex(corrected_pos)
+                self._move_point = self.level.find_vertex(snapped_pos)
         elif ev.button == 1:
             if self._draw_lines:
                 if self._start_pos is None:
                     self._start_pos = corrected_pos
                 else:
-                    self.level.add_line(self._start_pos, corrected_pos)
+                    self.level.add_line(self._start_pos, snapped_pos)
                     self._start_pos = None
             else:
                 print "Click: %r" % (
@@ -638,7 +591,7 @@
             self._move_view((10, 0))
         elif self.cur_poly and ev.button == 1:
             # Add a point
-            self.level.add_point(self.cur_poly, corrected_pos)
+            self.level.add_point(self.cur_poly, snapped_pos)
         elif ev.button == 3:
             self._mouse_drag = True