def render(self, attn_list=None, mode='human', close=False): # attn_list = [[teamates_attn, opp_attn] for each team] self.shot = False if mode == 'human': alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' message = '' for agent in self.world.agents: comm = [] for other in self.agents: if other is agent: continue if np.all(other.state.c == 0): word = '_' else: word = alphabet[np.argmax(other.state.c)] message += (other.name + ' to ' + agent.name + ': ' + word + ' ') # print(message) for i in range(len(self.viewers)): # create viewers (if necessary) if self.viewers[i] is None: # import rendering only if we need it (and don't import for headless machines) # from gym.envs.classic_control import rendering from gym_fortattack import rendering self.viewers[i] = rendering.Viewer(700, 700) # create rendering geometry and text for the scene if self.render_geoms is None or True: # import rendering only if we need it (and don't import for headless machines) # from gym.envs.classic_control import rendering from gym_fortattack import rendering self.render_geoms = [] self.render_geoms_xform = [] self.render_texts = [] self.render_texts_xforms = [] # add black background for active world, border of active region/world xMin, xMax, yMin, yMax = self.world.wall_pos borPts = np.array([[xMin, yMin], [xMax, yMin], [xMax, yMax], [xMin, yMax]]) geom = rendering.make_polygon(borPts) xform = rendering.Transform() geom.add_attr(xform) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) geom = rendering.make_circle(self.world.fortDim) geom.set_color(*[0, 1, 1], alpha=1) xform = rendering.Transform() geom.add_attr(xform) xform.set_translation(*self.world.doorLoc) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) # ---------------- visualize attention ---------------- # # select reference, show attn wrt this agent for i, agent in enumerate(self.world.agents): if agent.alive or i == self.world.numGuards - 1: k = i break if self.world.vizAttn and attn_list is not None: # will plot attention for dead agents as well, we would know if the agents are able disregard the dead agents based of alive flag = 0 # print('inside attn viz') for i, agent in enumerate(self.world.agents): if agent.alive or self.world.vizDead: # alive agents are always visualized, dead are visualized if asked if i != k: # if it is in the same team if i < self.world.numGuards: attn = attn_list[0][0][k, i] else: # if opponent attn = attn_list[0][1][k, i - self.world.numGuards] # print('attacker') geom = rendering.make_circle(agent.size * (1 + attn)) xform = rendering.Transform() geom.add_attr(xform) xform.set_translation(*agent.state.p_pos) alpha = 0.9 if agent.alive else 0.3 geom.set_color(*[1, 1, 0], alpha=alpha) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) # visualize the dead agents if self.world.vizDead: for agent in self.world.agents: # print(agent.name, agent.alive) if not agent.alive: geom = rendering.make_circle(agent.size) xform = rendering.Transform() geom.add_attr(xform) xform.set_translation(*agent.state.p_pos) geom.set_color(*agent.color, alpha=1) head = rendering.make_circle(0.5 * agent.size) head.set_color(*agent.color, alpha=1) headXform = rendering.Transform() head.add_attr(headXform) shift = 0.8 * agent.size * np.array([ np.cos(agent.state.p_ang), np.sin(agent.state.p_ang) ]) headLoc = agent.state.p_pos + shift headXform.set_translation(*headLoc) self.render_geoms.append(head) self.render_geoms_xform.append(headXform) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) self.render_texts.append(agent.name[5:]) self.render_texts_xforms.append(agent.state.p_pos) # visualize alive agents for entity in self.world.active_entities: ## won't work with obstacles geom = rendering.make_circle(entity.size) xform = rendering.Transform() geom.add_attr(xform) xform.set_translation(*entity.state.p_pos) if 'agent' in entity.name: geom.set_color(*entity.color, alpha=1) head = rendering.make_circle(0.5 * entity.size) head.set_color(*entity.color, alpha=1) headXform = rendering.Transform() head.add_attr(headXform) shift = 0.8 * entity.size * np.array([ np.cos(entity.state.p_ang), np.sin(entity.state.p_ang) ]) headLoc = entity.state.p_pos + shift headXform.set_translation(*headLoc) self.render_geoms.append(head) self.render_geoms_xform.append(headXform) self.render_texts.append(entity.name[5:]) self.render_texts_xforms.append(entity.state.p_pos) # print(entity.name) if entity.action.shoot: self.shot = True ## render the laser shots, maybe add extra delay when there is a laser shot v = self.world.get_tri_pts_arr( entity)[:2, :].transpose() laser = rendering.make_polygon(v) laser.set_color(*entity.color, alpha=0.3) laserXform = rendering.Transform() laser.add_attr(laserXform) self.render_geoms.append(laser) self.render_geoms_xform.append(laserXform) else: geom.set_color(*entity.color) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) # dot for reference agent if self.world.vizAttn and attn_list is not None: # will plot attention for dead agents as well, we would know if the agents are able disregard the dead agents based of alive flag = 0 # print('inside attn viz') for i, agent in enumerate(self.world.agents): if agent.alive or self.world.vizDead: # alive agents are always visualized, dead are visualized if asked # select reference agent for attention viz if i == k: # simply put a black dot at the center of this agent geom = rendering.make_circle(0.5 * agent.size) xform = rendering.Transform() geom.add_attr(xform) xform.set_translation(*agent.state.p_pos) geom.set_color(*0.5 * agent.color, alpha=1) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) # add grey strips, corners of visualization window corPtsArr = [ np.array([[xMin, yMax], [xMax, yMax], [xMax, 1], [xMin, 1]]), np.array([[xMin, -1], [xMax, -1], [xMax, yMin], [xMin, yMin]]) ] for corPts in corPtsArr: geom = rendering.make_polygon(corPts) geom.set_color(*[0.5, 0.5, 0.5], alpha=1) xform = rendering.Transform() geom.add_attr(xform) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) # add geoms to viewer ## viewer is object of class Viewer defined in rendering.py file inside gym_fortattack for viewer in self.viewers: viewer.geoms = [] viewer.texts = [] viewer.text_poses = [] for geom in self.render_geoms: viewer.add_geom(geom) for text, xform in zip(self.render_texts, self.render_texts_xforms): viewer.add_text(text, xform) results = [] for i in range(len(self.viewers)): from gym_fortattack import rendering # update bounds to center around agent cam_range = 1 if self.shared_viewer: pos = np.zeros(self.world.dim_p) else: pos = self.agents[i].state.p_pos self.viewers[i].set_bounds(pos[0] - cam_range, pos[0] + cam_range, pos[1] - cam_range, pos[1] + cam_range) self.viewers[i].render(return_rgb_array=False) self.prevShot = self.shot return results ## this thing is really doing nothing
def render(self, mode='human', close=False): self.shot = False if mode == 'human': alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' message = '' for agent in self.world.agents: comm = [] for other in self.agents: if other is agent: continue if np.all(other.state.c == 0): word = '_' else: word = alphabet[np.argmax(other.state.c)] message += (other.name + ' to ' + agent.name + ': ' + word + ' ') # print(message) for i in range(len(self.viewers)): # create viewers (if necessary) if self.viewers[i] is None: # import rendering only if we need it (and don't import for headless machines) #from gym.envs.classic_control import rendering from gym_fortattack import rendering self.viewers[i] = rendering.Viewer(700,700) # create rendering geometry if self.render_geoms is None or True: # import rendering only if we need it (and don't import for headless machines) #from gym.envs.classic_control import rendering from gym_fortattack import rendering self.render_geoms = [] self.render_geoms_xform = [] # add black background doorPts = np.array([[-1,1], [1,1], [1,-1], [-1,-1]]) geom = rendering.make_polygon(doorPts) # geom.set_color(*[0.35,0.35,0.85], alpha=0.5) xform = rendering.Transform() geom.add_attr(xform) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) ## add the fort door doorPts = np.array([[-0.2,1], [0.2,1], [0.2,0.9], [-0.2,0.9]]) geom = rendering.make_polygon(doorPts) geom.set_color(*[0,1,1], alpha=1) xform = rendering.Transform() geom.add_attr(xform) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) for entity in self.world.entities: ## won't work with obstacles geom = rendering.make_circle(entity.size) xform = rendering.Transform() geom.add_attr(xform) xform.set_translation(*entity.state.p_pos) if 'agent' in entity.name: geom.set_color(*entity.color, alpha=1) head = rendering.make_circle(0.5*entity.size) head.set_color(*entity.color, alpha=1) headXform = rendering.Transform() head.add_attr(headXform) shift = 0.8*entity.size*np.array([np.cos(entity.state.p_ang), np.sin(entity.state.p_ang)]) headLoc = entity.state.p_pos+shift headXform.set_translation(*headLoc) self.render_geoms.append(head) self.render_geoms_xform.append(headXform) if entity.action.shoot: self.shot = True ## render the laser shots, maybe add extra delay when there is a laser shot v = self.world.get_tri_pts_arr(entity)[:2,:].transpose() laser = rendering.make_polygon(v) laser.set_color(*entity.color, alpha=0.3) laserXform = rendering.Transform() laser.add_attr(laserXform) self.render_geoms.append(laser) self.render_geoms_xform.append(laserXform) else: geom.set_color(*entity.color) self.render_geoms.append(geom) self.render_geoms_xform.append(xform) # add geoms to viewer for viewer in self.viewers: viewer.geoms = [] for geom in self.render_geoms: viewer.add_geom(geom) results = [] for i in range(len(self.viewers)): from gym_fortattack import rendering # update bounds to center around agent cam_range = 1 if self.shared_viewer: pos = np.zeros(self.world.dim_p) else: pos = self.agents[i].state.p_pos self.viewers[i].set_bounds(pos[0]-cam_range,pos[0]+cam_range,pos[1]-cam_range,pos[1]+cam_range) results.append(self.viewers[i].render(return_rgb_array = mode=='rgb_array')) if self.shot and not self.prevShot: mixer.music.play() self.prevShot = self.shot return results