Spaces:
Running
Running
| import pygame | |
| from pygame import math | |
| from pygame.locals import * | |
| from view import graph | |
| from mesh_display import MeshDisplay | |
| from environment.actions.quadrangular_actions import split_edge_ids, flip_edge_cw_ids, collapse_edge_ids | |
| import sys | |
| color1 = pygame.Color(30, 30, 30) # Dark Grey | |
| color2 = pygame.Color(255, 255, 255) # White | |
| color3 = pygame.Color(128, 128, 128) # Grey | |
| color4 = pygame.Color(255, 0, 0) # Red | |
| color5 = pygame.Color(0, 255, 0) # Green | |
| edge_color_normal = color1 | |
| node_color_normal = color4 | |
| edge_color_select = color5 | |
| node_color_select = color3 | |
| class window_data: | |
| def __init__(self): | |
| self.options = pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.RESIZABLE | |
| self.center = pygame.math.Vector2(250, 250) | |
| self.size = (1024, 1024) | |
| self.stretch = 10.0 | |
| self.scene_center = pygame.math.Vector2(0, 0) | |
| self.scene_xmin = -250 | |
| self.scene_xmax = 250 | |
| self.scene_ymin = -250 | |
| self.scene_ymax = 250 | |
| self.node_size = 15 | |
| self.edge_thickness = 2 | |
| self.font_size = 25 | |
| self.edge_picking_pixel_tolerance = 5 | |
| class Game: | |
| win_data = window_data() | |
| def __init__(self, cmap, mesh_disp: MeshDisplay): | |
| scores = mesh_disp.get_scores() | |
| self.graph = graph.Graph(mesh_disp.get_nodes_coordinates(), mesh_disp.get_edges(), scores) | |
| self.model = cmap | |
| self.mesh_disp = mesh_disp | |
| pygame.init() | |
| self.window = pygame.display.set_mode(Game.win_data.size, Game.win_data.options) | |
| pygame.display.set_caption('TriGame') | |
| self.window.fill((255, 255, 255)) | |
| self.font = pygame.font.SysFont(None, Game.win_data.font_size) | |
| self.clock = pygame.time.Clock() | |
| self.clock.tick(60) | |
| Game.win_data.scene_xmin, Game.win_data.scene_ymin, Game.win_data.scene_xmax, Game.win_data.scene_ymax = self.graph.bounding_box() | |
| Game.win_data.scene_center = math.Vector2((Game.win_data.scene_xmax + Game.win_data.scene_xmin) / 2.0, | |
| (Game.win_data.scene_ymax + Game.win_data.scene_ymin) / 2.0) | |
| def draw(self): | |
| for e in self.graph.edges: | |
| e.draw(self.window, Game.win_data) | |
| for n in self.graph.vertices: | |
| n.draw(self.window, self.font, Game.win_data) | |
| def control_events(self): | |
| for event in pygame.event.get(): | |
| if event.type == QUIT: | |
| pygame.quit() | |
| sys.exit() | |
| if event.type == VIDEORESIZE or event.type == VIDEOEXPOSE: # handles window minimising/maximising | |
| x, y = self.window.get_size() | |
| Game.win_data.center.x = x / 2 | |
| Game.win_data.center.y = y / 2 | |
| ratio = float(x) / float(Game.win_data.scene_xmax - Game.win_data.scene_xmin) | |
| ratio_y = float(y) / float(Game.win_data.scene_ymax - Game.win_data.scene_ymin) | |
| if ratio_y < ratio: | |
| ratio = ratio_y | |
| Game.win_data.node_size = max(ratio / 100, 10) | |
| Game.win_data.stretch = 0.75 * ratio | |
| self.window.fill((255, 255, 255)) | |
| pygame.display.flip() | |
| if event.type == pygame.MOUSEBUTTONDOWN: | |
| x, y = pygame.mouse.get_pos() | |
| # only edges can be selected, and just one at a time | |
| already_selected = False | |
| for e in self.graph.edges: | |
| if e.collide_point(x, y, self.win_data) and not already_selected: | |
| if pygame.key.get_pressed()[pygame.K_f]: | |
| if flip_edge_cw_ids(self.model, e.start.idx, e.end.idx): | |
| self.graph.clear() | |
| self.graph.update(self.mesh_disp.get_nodes_coordinates(), self.mesh_disp.get_edges(), self.mesh_disp.get_scores()) | |
| already_selected = True | |
| elif pygame.key.get_pressed()[pygame.K_s]: | |
| if split_edge_ids(self.model, e.start.idx, e.end.idx): | |
| self.graph.clear() | |
| self.graph.update(self.mesh_disp.get_nodes_coordinates(),self.mesh_disp.get_edges(), self.mesh_disp.get_scores()) | |
| already_selected = True | |
| elif pygame.key.get_pressed()[pygame.K_c]: | |
| if collapse_edge_ids(self.model, e.start.idx, e.end.idx): | |
| self.graph.clear() | |
| self.graph.update(self.mesh_disp.get_nodes_coordinates(),self.mesh_disp.get_edges(), self.mesh_disp.get_scores()) | |
| already_selected = True | |
| def run(self): | |
| print("TriGame is starting!!") | |
| print("- Press f and the mouse button to flip an edge") | |
| print("- Press s and the mouse button to split an edge") | |
| while True: | |
| self.control_events() | |
| self.window.fill((255, 255, 255)) | |
| self.draw() | |
| pygame.display.flip() | |