ToonTownRewritten/toontown/election/InvasionPathVisualizer.py
2014-02-24 21:01:46 -07:00

101 lines
2.9 KiB
Python

from pandac.PandaModules import *
from otp.ai.MagicWordGlobal import *
from InvasionPathDataAI import pathfinder
# This file is a client-side visualizer to help in building invasion navmeshes.
# To use it, just import it from somewhere on the client.
# DO NOT DEPLOY MIRAI WITH THIS INCLUDED -- it pulls in InvasionPathDataAI,
# which is excluded by the publish script, and will result in import errors.
LINK_HEIGHT = 6
class InvasionPathVisualizer(NodePath):
def __init__(self, pathfinder):
NodePath.__init__(self, 'viz')
self.pathfinder = pathfinder
self.showVertices()
self.showBorders()
self.showEdges()
def showVertices(self):
segs = LineSegs('vertices')
segs.setColor(0, 0, 1)
for vertex in self.pathfinder.vertices:
x,y = vertex.pos
segs.moveTo(x, y, -20)
segs.drawTo(x, y, 20)
self.attachNewNode(segs.create())
def showBorders(self):
segs = LineSegs('borders')
segs.setColor(0, 1, 0)
for border in self.pathfinder.borders:
x1, y1, x2, y2 = border
segs.moveTo(x1, y1, LINK_HEIGHT+0.1)
segs.drawTo(x2, y2, LINK_HEIGHT+0.1)
self.attachNewNode(segs.create())
def showEdges(self):
segs = LineSegs('edges')
segs.setColor(1, 0, 0)
for vertex in self.pathfinder.vertices:
x1, y1 = vertex.pos
for neighbor in vertex.getNeighbors():
x2, y2 = neighbor.pos
segs.moveTo(x1, y1, LINK_HEIGHT)
segs.drawTo(x2, y2, LINK_HEIGHT)
self.attachNewNode(segs.create())
invasionViz = None
@magicWord()
def showInvasionPaths():
global invasionViz
invasionViz = InvasionPathVisualizer(pathfinder)
invasionViz.reparentTo(render)
return "Showing invasion paths."
@magicWord()
def hideInvasionPaths():
if invasionViz is None:
return "No invasion paths to hide."
invasionViz.removeNode()
return "Hiding invasion paths."
# HACK MWs for debugging pathfinding
@magicWord()
def planPathFrom():
base.localAvatar._planPos = base.localAvatar.getPos()
return "Set planned path \"from\"."
@magicWord()
def planPathTo():
fromPos = getattr(base.localAvatar, '_planPos', None)
if not fromPos:
return 'No planFrom point set!'
toPos = base.localAvatar.getPos()
path = pathfinder.planPath((fromPos.getX(), fromPos.getY()),
(toPos.getX(), toPos.getY()))
if path is None:
return 'Pathfinding failed -- no path exists.'
segs = LineSegs('plannedPath')
segs.setColor(1, 1, 0)
segs.moveTo(fromPos.getX(), fromPos.getY(), LINK_HEIGHT-0.1)
for x, y in path:
segs.drawTo(x, y, LINK_HEIGHT-0.1)
for np in render.findAllMatches('**/plannedPath'):
np.removeNode()
render.attachNewNode(segs.create())
return "Set planned path \"to\"."