# HG changeset patch # User Simon Cross # Date 1378553406 -7200 # Node ID a64d894aa1bd81ef6bae1b6110371bddffe8b65f # Parent eb1a4a269d37e18e563c731b90cdc48eb344b790 Actually snap to grid. diff -r eb1a4a269d37 -r a64d894aa1bd tools/area_editor.py --- 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