def _saveLayout(self): if self.modButtons.isDown(KeyboardButton.control()): self.modButtons.buttonUp(KeyboardButton.control()) self.modButtons.buttonUp(KeyboardButton.asciiKey('s')) filename = asksaveasfilename(filetypes=[('plist files', '*.plist')]) if filename: self.layout.save(filename) AppPreferences.set('last_layout', filename)
def _saveLayout(self): if self.modButtons.isDown(KeyboardButton.control()): self.modButtons.buttonUp(KeyboardButton.control()) self.modButtons.buttonUp(KeyboardButton.asciiKey('s')) filename = asksaveasfilename(filetypes=[('plist files', '*.plist')]) if filename: self.layout.save(filename) AppPreferences.set('last_layout', filename)
def __init__(self): self.instructionText = addInstructions(0.95, '[ESC]: Leave Mouselook mode.') self.eventDispatcher = EventDispatcher() self.cameraMode = None self.clickPos = Vec2() self.lastMousePos = Vec2() self.focus = Vec3() self.mouseDown = False self.initialPos = Vec3() self.initialHpr = Vec3() self.initialMat = None # Disable the built-in mouse camera control (it sucks). base.disableMouse() self.setCameraMode(TRACKBALL) # Set the camera's initial position. base.camera.setPosHpr(0, 12, 30, 180, -70, 0) # Turn off events generated with modifier buttons, e.g. 'shift-a' # This is to keep keyboard control working after you alt-tab out # of the app. base.mouseWatcherNode.setModifierButtons(ModifierButtons()) base.buttonThrowers[0].node().setModifierButtons(ModifierButtons()) # This is a diagonal matrix that keeps track of movement key # state. The first three diagonal entries can be 1, 0, or -1. self.mouseLookTransMat = Mat4.scaleMat(Vec3(0.0, 0.0, 0.0)) # Keep track of how many movement keys are currently pressed. This # lets us short-circuit past a lot of math when no keys are held. self.keysHeld = 0 # Handle events for the movement keys. for key, value in key2MatArgs.items(): self.accept(key, self._moveKeyHandler, value) self.accept('escape', self._escKeyHandler) self.accept('m', self._mKeyHandler) self.accept('mouse1', self._mouseDownHandler, [1]) self.accept('mouse1-up', self._mouseUpHandler, [1]) self.accept('mouse2', self._mouseDownHandler, [2]) self.accept('mouse2-up', self._mouseUpHandler, [2]) self.accept('wheel_up', self._mouseWheelHandler, [1]) self.accept('wheel_down', self._mouseWheelHandler, [-1]) self.modButtons = ModifierButtons() self.modButtons.addButton(KeyboardButton.control()) self.accept('control', self.modButtons.buttonDown, [KeyboardButton.control()]) self.accept('control-up', self.modButtons.buttonUp, [KeyboardButton.control()]) self.accept(base.win.getWindowEvent(), self._windowHandler)
def __init__(self): self.instructionText = addInstructions(0.95, '[ESC]: Leave Mouselook mode.') self.eventDispatcher = EventDispatcher() self.cameraMode = None self.clickPos = Vec2() self.lastMousePos = Vec2() self.focus = Vec3() self.mouseDown = False self.initialPos = Vec3() self.initialHpr = Vec3() self.initialMat = None # Disable the built-in mouse camera control (it sucks). base.disableMouse() self.setCameraMode(TRACKBALL) # Set the camera's initial position. base.camera.setPosHpr(0, 12, 30, 180, -70, 0) # Turn off events generated with modifier buttons, e.g. 'shift-a' # This is to keep keyboard control working after you alt-tab out # of the app. base.mouseWatcherNode.setModifierButtons(ModifierButtons()) base.buttonThrowers[0].node().setModifierButtons(ModifierButtons()) # This is a diagonal matrix that keeps track of movement key # state. The first three diagonal entries can be 1, 0, or -1. self.mouseLookTransMat = Mat4.scaleMat(Vec3(0.0, 0.0, 0.0)) # Keep track of how many movement keys are currently pressed. This # lets us short-circuit past a lot of math when no keys are held. self.keysHeld = 0 # Handle events for the movement keys. for key, value in key2MatArgs.items(): self.accept(key, self._moveKeyHandler, value) self.accept('escape', self._escKeyHandler) self.accept('m', self._mKeyHandler) self.accept('mouse1', self._mouseDownHandler, [1]) self.accept('mouse1-up', self._mouseUpHandler, [1]) self.accept('mouse2', self._mouseDownHandler, [2]) self.accept('mouse2-up', self._mouseUpHandler, [2]) self.accept('wheel_up', self._mouseWheelHandler, [1]) self.accept('wheel_down', self._mouseWheelHandler, [-1]) self.modButtons = ModifierButtons() self.modButtons.addButton(KeyboardButton.control()) self.accept('control', self.modButtons.buttonDown, [KeyboardButton.control()]) self.accept('control-up', self.modButtons.buttonUp, [KeyboardButton.control()]) self.accept(base.win.getWindowEvent(), self._windowHandler)
def _openLayout(self): if self.modButtons.isDown(KeyboardButton.control()): self.modButtons.buttonUp(KeyboardButton.control()) self.modButtons.buttonUp(KeyboardButton.asciiKey('o')) filename = askopenfilename(filetypes=[('plist files', '*.plist')]) if filename: if self.layout: NodePath(self.layout).detachNode() self.layout = MissionLayout.loadLayout(filename) render.attachNewNode(self.layout) AppPreferences.set('last_layout', filename)
def _openLayout(self): if self.modButtons.isDown(KeyboardButton.control()): self.modButtons.buttonUp(KeyboardButton.control()) self.modButtons.buttonUp(KeyboardButton.asciiKey('o')) filename = askopenfilename(filetypes=[('plist files', '*.plist')]) if filename: if self.layout: NodePath(self.layout).detachNode() self.layout = MissionLayout.loadLayout(filename) render.attachNewNode(self.layout) AppPreferences.set('last_layout', filename)
def __init__(self): render.setAntialias(AntialiasAttrib.MAuto) # Enable physics - perhaps this should go someplace else, but it must # be done before the Vehicle is initialized. base.enableParticles() aei = AngularEulerIntegrator() base.physicsMgr.attachAngularIntegrator(aei) SelectionEngine.getDefault().enable() SelectionManager.getDefault().enable() # Make the environment and the vehicle model. makeEnvironment() self.vehicle = Vehicle(render) MissionElement.loadElementConfig('mission_elements.plist') #layoutName = AppPreferences.get('last_layout', 'defaultLayout.plist') if len(sys.argv) == 2: layoutName = sys.argv[1] print "Using command line argument %s for layout" %layoutName else: print "Using default layout file" print "Use ./sim2.py [layout file] to use a different layout" print "Or press Ctrl+O to open a new layout in the simulator" layoutName = 'defaultLayout.plist' self.layout = MissionLayout.loadLayout(layoutName) render.attachNewNode(self.layout) self.vehicle.setLayout(self.layout) #Link the layout # Set up render buffer viewer, to aide debugging. self.accept("v", base.bufferViewer.toggleEnable) self.accept("V", base.bufferViewer.toggleEnable) base.bufferViewer.setPosition("llcorner") # Set up file saver self.accept('s', self._saveLayout) self.accept('o', self._openLayout) self.accept('f', self._setFreq) root = Tk() root.withdraw() self.modButtons = ModifierButtons() self.modButtons.addButton(KeyboardButton.control()) self.accept('control', self.modButtons.buttonDown, [KeyboardButton.control()]) self.accept('control-up', self.modButtons.buttonUp, [KeyboardButton.control()]) # Add GUI Controls '''
def __init__(self): render.setAntialias(AntialiasAttrib.MAuto) # Enable physics - perhaps this should go someplace else, but it must # be done before the Vehicle is initialized. base.enableParticles() aei = AngularEulerIntegrator() base.physicsMgr.attachAngularIntegrator(aei) SelectionEngine.getDefault().enable() SelectionManager.getDefault().enable() # Make the environment and the vehicle model. makeEnvironment() self.vehicle = Vehicle(render) MissionElement.loadElementConfig('mission_elements.plist') #layoutName = AppPreferences.get('last_layout', 'defaultLayout.plist') if len(sys.argv) == 2: layoutName = sys.argv[1] print "Using command line argument %s for layout" % layoutName else: print "Using default layout file" print "Use ./sim2.py [layout file] to use a different layout" print "Or press Ctrl+O to open a new layout in the simulator" layoutName = 'defaultLayout.plist' self.layout = MissionLayout.loadLayout(layoutName) render.attachNewNode(self.layout) self.vehicle.setLayout(self.layout) #Link the layout # Set up render buffer viewer, to aide debugging. self.accept("v", base.bufferViewer.toggleEnable) self.accept("V", base.bufferViewer.toggleEnable) base.bufferViewer.setPosition("llcorner") # Set up file saver self.accept('s', self._saveLayout) self.accept('o', self._openLayout) self.accept('f', self._setFreq) root = Tk() root.withdraw() self.modButtons = ModifierButtons() self.modButtons.addButton(KeyboardButton.control()) self.accept('control', self.modButtons.buttonDown, [KeyboardButton.control()]) self.accept('control-up', self.modButtons.buttonUp, [KeyboardButton.control()]) # Add GUI Controls '''
def mousePressed(self, event): print 'got mouse pressed event from', event.sender if (not self.enabled or event.modifiers.isDown(KeyboardButton.control())): print 'short circuiting' return shiftDown = event.modifiers.isDown(KeyboardButton.shift()) if event.sender == self.engine: if not shiftDown: self.deselectAll() else: self._setEditMode(event.modifiers.isDown(MouseButton.three())) node = event.sender if shiftDown: # Shift-clicking a node toggles its selected state. if node.isSelected(): self.selection.remove(node) node.setSelected(False) else: self.selection.append(node) node.setSelected(True) elif len(self.selection) == 1 and node.isSelected(): # This is already the only node selected. return else: print 'selecting', node self.deselectAll() node.setSelected(True) self.selection.append(node) if self.editMode: self.handle.setClients([NodePath(n) for n in self.selection], self.getSelectionCenter()) else: self.handle.setClients([])
def mousePressed(self, event): print 'got mouse pressed event from', event.sender if (not self.enabled or event.modifiers.isDown(KeyboardButton.control())): print 'short circuiting' return shiftDown = event.modifiers.isDown(KeyboardButton.shift()) if event.sender == self.engine: if not shiftDown: self.deselectAll() else: self._setEditMode(event.modifiers.isDown(MouseButton.three())) node = event.sender if shiftDown: # Shift-clicking a node toggles its selected state. if node.isSelected(): self.selection.remove(node) node.setSelected(False) else: self.selection.append(node) node.setSelected(True) elif len(self.selection) == 1 and node.isSelected(): # This is already the only node selected. return else: print 'selecting', node self.deselectAll() node.setSelected(True) self.selection.append(node) if self.editMode: self.handle.setClients([NodePath(n) for n in self.selection], self.getSelectionCenter()) else: self.handle.setClients([])
def _mouseDownHandler(self, button): if base.mouseWatcherNode.hasMouse(): if button == 2 or self.modButtons.isDown(KeyboardButton.control()): self.clickPos = Vec2(base.mouseWatcherNode.getMouse()) self.mouseDown = True offset = self.focus - base.camera.getPos() self.initialTranslation = offset.length() self.initialHpr = base.camera.getHpr()
def _mouseDownHandler(self, button): if base.mouseWatcherNode.hasMouse(): if button == 2 or self.modButtons.isDown(KeyboardButton.control()): self.clickPos = Vec2(base.mouseWatcherNode.getMouse()) self.mouseDown = True offset = self.focus - base.camera.getPos() self.initialTranslation = offset.length() self.initialHpr = base.camera.getHpr()
class InputMapperTecladoMouse(InputMapper): # teclas accion defecto TeclasAccionDefecto = { KeyboardButton.enter(): InputMapper.AccionArrojar, KeyboardButton.space(): InputMapper.AccionAscender, KeyboardButton.tab(): InputMapper.AccionUsar, KeyboardButton.control(): InputMapper.AccionAgachar, KeyboardButton.alt(): InputMapper.AccionAgarrar, KeyboardButton.asciiKey(b"c"): InputMapper.AccionFlotar, KeyboardButton.asciiKey(b"x"): InputMapper.AccionSoltar, KeyboardButton.asciiKey(b"z"): InputMapper.AccionFrenar, KeyboardButton.asciiKey(b"w"): InputMapper.AccionAvanzar, KeyboardButton.asciiKey(b"a"): InputMapper.AccionAvanzar, KeyboardButton.asciiKey(b"s"): InputMapper.AccionAvanzar, KeyboardButton.asciiKey(b"d"): InputMapper.AccionAvanzar, KeyboardButton.asciiKey(b"r"): InputMapper.AccionAvanzar, KeyboardButton.asciiKey(b"f"): InputMapper.AccionAvanzar } # teclas parametro defecto TeclasParamDefecto = { KeyboardButton.asciiKey(b"w"): InputMapper.ParametroAdelante, KeyboardButton.asciiKey(b"a"): InputMapper.ParametroIzquierda, KeyboardButton.asciiKey(b"s"): InputMapper.ParametroAtras, KeyboardButton.asciiKey(b"d"): InputMapper.ParametroDerecha, KeyboardButton.asciiKey(b"r"): InputMapper.ParametroArriba, KeyboardButton.asciiKey(b"f"): InputMapper.ParametroAbajo, KeyboardButton.asciiKey(b"q"): InputMapper.ParametroGirando | InputMapper.ParametroIzquierda, KeyboardButton.asciiKey(b"e"): InputMapper.ParametroGirando | InputMapper.ParametroDerecha, KeyboardButton.shift(): InputMapper.ParametroRapido, KeyboardButton.asciiKey(b"v"): InputMapper.ParametroLento } def __init__(self, base): InputMapper.__init__(self, base) def update(self): # parametros self.parametros = InputMapper.ParametroNulo for tecla, parametro in InputMapperTecladoMouse.TeclasParamDefecto.items( ): if self.isButtonDown(tecla): self.parametros |= parametro # acciones self.accion = InputMapper.AccionNula for tecla, accion in InputMapperTecladoMouse.TeclasAccionDefecto.items( ): if self.isButtonDown(tecla): self.accion = accion break
def __init__(self, sb, mouse_magnitude=30, min_pitch=-60, max_pitch=60): self.base = sb self.mouse_magnitude = mouse_magnitude self.min_pitch = min_pitch self.max_pitch = max_pitch props = WindowProperties() props.set_cursor_hidden(True) props.set_mouse_mode(WindowProperties.MRelative) self.base.win.requestProperties(props) self.accept('mouse1', self.mouse1) tm = self.base.task_mgr tm.add(self.mouse_move, 'fp-mouse-move') tm.add(self.kb_move, 'fp-kb-move') self.keys = { 'forward': KeyboardButton.ascii_key(b'w'), 'left': KeyboardButton.ascii_key(b'a'), 'right': KeyboardButton.ascii_key(b'd'), 'backward': KeyboardButton.ascii_key(b's'), 'up': KeyboardButton.space(), 'down': KeyboardButton.control() }
def getResizedBoxCoordinates(self, vp): if self.state.action != BoxAction.Resizing and self.state.action != BoxAction.Drawing: return [self.state.boxStart, self.state.boxEnd] now = base.snapToGrid(vp.viewportToWorld(vp.getMouse())) cstart = vp.flatten(self.state.boxStart) cend = vp.flatten(self.state.boxEnd) # Proportional scaling ostart = vp.flatten(self.state.preTransformBoxStart if self.state. preTransformBoxStart else Vec3.zero()) oend = vp.flatten(self.state.preTransformBoxEnd if self.state. preTransformBoxEnd else Vec3.zero()) owidth = oend.x - ostart.x oheight = oend.z - ostart.z proportional = vp.mouseWatcher.isButtonDown(KeyboardButton.control()) and \ self.state.action == BoxAction.Resizing and owidth != 0 and oheight != 0 if self.state.handle == ResizeHandle.TopLeft: cstart.x = now.x cend.z = now.z elif self.state.handle == ResizeHandle.Top: cend.z = now.z elif self.state.handle == ResizeHandle.TopRight: cend.x = now.x cend.z = now.z elif self.state.handle == ResizeHandle.Left: cstart.x = now.x elif self.state.handle == ResizeHandle.Center: cdiff = cend - cstart distance = self.getResizeDistance(vp) if not distance: cstart = vp.flatten(self.state.preTransformBoxStart) + now \ - base.snapToGrid(self.state.moveStart) else: cstart = vp.flatten(self.state.preTransformBoxStart) + distance cend = cstart + cdiff elif self.state.handle == ResizeHandle.Right: cend.x = now.x elif self.state.handle == ResizeHandle.BottomLeft: cstart.x = now.x cstart.z = now.z elif self.state.handle == ResizeHandle.Bottom: cstart.z = now.z elif self.state.handle == ResizeHandle.BottomRight: cend.x = now.x cstart.z = now.z if proportional: nwidth = cend.x - cstart.x nheight = cend.z - cstart.z mult = max(nwidth / owidth, nheight / oheight) pwidth = owidth * mult pheight = oheight * mult wdiff = pwidth - nwidth hdiff = pheight - nheight if self.state.handle == ResizeHandle.TopLeft: cstart.x -= wdiff cend.z += hdiff elif self.state.handle == ResizeHandle.TopRight: cend.x += wdiff cend.z += hdiff elif self.state.handle == ResizeHandle.BottomLeft: cstart.x -= wdiff cstart.z -= hdiff elif self.state.handle == ResizeHandle.BottomRight: cend.x += wdiff cstart.z -= hdiff cstart = vp.expand(cstart) + vp.getUnusedCoordinate( self.state.boxStart) cend = vp.expand(cend) + vp.getUnusedCoordinate(self.state.boxEnd) return [cstart, cend]
def __init__(self, mainWin=base.win, mainCam=base.cam, scene=render): self.lastMousePos = Vec2(-2, -2) self.lastId = 0 self.pressedNode = None self.mDownId = 0 self.idStack = range(1, 256) self.idTable = {} self.aspectRatio = 1 self.checkCursorTask = Task(self.checkCursor, 'checkCursorTask') self.enabled = True self.mouseListeners = [] self.mainCam = mainCam mainCam.node().setCameraMask(BitMask32(1)) tempnode = NodePath(PandaNode('temp node')) tempnode.setShaderAuto() tempnode.setShaderInput('hi_id', Vec4(0, 0, 0, 0), 2) mainCam.node().setInitialState(tempnode.getState()) # Set up a node with the silhouetteGen shader. We'll apply this node's # state to custom cameras below. tempnode.setShader(loader.loadShader('silhouetteGen.sha'), 100) tempnode.setShaderInput('hi_id', Vec4(0, 0, 0, 0), 0) tempnode.setAntialias(AntialiasAttrib.MNone, 100) tempnode.setBin('inactive', 0, 1) initialState = tempnode.getState() tempnode.setBin('opaque', 0, 1) selnodeState = tempnode.getState() # We'll be using this a few times, so make an easy name for it. mainLens = mainCam.node().getLens() # Set up a buffer to which we draw a silhouette of any geometry that # we want to outline. We draw the outline by applying a Sobel edge # detection shader to the contents of this buffer. silhouetteBuffer = mainWin.makeTextureBuffer('silhouetteBuffer', 0, 0) silhouetteBuffer.setClearColor(Vec4(0, 0, 0, 1)) self.silhouetteBuffer = silhouetteBuffer silhouetteCamera = base.makeCamera(silhouetteBuffer, lens=mainLens) silhouetteCamera.node().setScene(scene) silhouetteCamera.node().setInitialState(initialState) silhouetteCamera.node().setTagState('sel', selnodeState) silhouetteCamera.node().setTagStateKey('sel') silhouetteCamera.node().setCameraMask(BitMask32(8)) tempnode.setShader(loader.loadShader('mousePicker.sha'), 100) selnodeState = tempnode.getState() tempnode.setBin('inactive', 0, 1) initialState = tempnode.getState() # Set up a 1-by-1 buffer to which we'll just render the pixel under # the mouse. selectBuffer = mainWin.makeTextureBuffer('selectBuffer', 1, 1) selectBuffer.setClearColor(Vec4(0, 0, 0, 1)) self.selectBuffer = selectBuffer selectLens = PerspectiveLens() selectLens.setNearFar(mainLens.getNear(), mainLens.getFar()) selectLens.setFocalLength(mainLens.getFocalLength()) selectCamera = base.makeCamera(selectBuffer, lens=selectLens) selectCamera.node().setScene(scene) selectCamera.node().setInitialState(initialState) selectCamera.node().setTagState('sel', selnodeState) selectCamera.node().setTagStateKey('sel') selectCamera.node().setCameraMask(BitMask32(16)) self.selectLens = selectLens self.selectTex = selectBuffer.getTexture() self.selectTex.makeRamImage() self.gsg = mainWin.getGsg() # Set up a texture card to render the silhouette texture with the # Sobel shader, which will draw the edges of the silhouettes. silhouetteCard = silhouetteBuffer.getTextureCard() silhouetteCard.setTransparency(1) inkGen = loader.loadShader('sobel.sha') silhouetteCard.setShader(inkGen) silhouetteCard.setShaderInput('separation', 0.001, 0) silhouetteCard.reparentTo(render2d) self.silhouetteCard = silhouetteCard self.accept(mainWin.getWindowEvent(), self.windowEventHandler) self.accept('mouse1', self.mouseDownHandler, ['l']) self.accept('mouse1-up', self.mouseUpHandler, ['l']) self.accept('mouse3', self.mouseDownHandler, ['r']) self.accept('mouse3-up', self.mouseUpHandler, ['r']) self.buttonWatcher = ButtonWatcher([ KeyboardButton.shift(), KeyboardButton.control(), MouseButton.one(), MouseButton.three(), ]) CameraController.getInstance().addEventHandler(EVT_CAMERA_MODE, self._cameraModeHandler) self.enable(False)
def __init__(self, mainWin=base.win, mainCam=base.cam, scene=render): self.lastMousePos = Vec2(-2, -2) self.lastId = 0 self.pressedNode = None self.mDownId = 0 self.idStack = range(1, 256) self.idTable = {} self.aspectRatio = 1 self.checkCursorTask = Task(self.checkCursor, 'checkCursorTask') self.enabled = True self.mouseListeners = [] self.mainCam = mainCam mainCam.node().setCameraMask(BitMask32(1)) tempnode = NodePath(PandaNode('temp node')) tempnode.setShaderAuto() tempnode.setShaderInput('hi_id', Vec4(0, 0, 0, 0), 2) mainCam.node().setInitialState(tempnode.getState()) # Set up a node with the silhouetteGen shader. We'll apply this node's # state to custom cameras below. tempnode.setShader(loader.loadShader('silhouetteGen.sha'), 100) tempnode.setShaderInput('hi_id', Vec4(0, 0, 0, 0), 0) tempnode.setAntialias(AntialiasAttrib.MNone, 100) tempnode.setBin('inactive', 0, 1) initialState = tempnode.getState() tempnode.setBin('opaque', 0, 1) selnodeState = tempnode.getState() # We'll be using this a few times, so make an easy name for it. mainLens = mainCam.node().getLens() # Set up a buffer to which we draw a silhouette of any geometry that # we want to outline. We draw the outline by applying a Sobel edge # detection shader to the contents of this buffer. silhouetteBuffer = mainWin.makeTextureBuffer('silhouetteBuffer', 0, 0) silhouetteBuffer.setClearColor(Vec4(0, 0, 0, 1)) self.silhouetteBuffer = silhouetteBuffer silhouetteCamera = base.makeCamera(silhouetteBuffer, lens=mainLens) silhouetteCamera.node().setScene(scene) silhouetteCamera.node().setInitialState(initialState) silhouetteCamera.node().setTagState('sel', selnodeState) silhouetteCamera.node().setTagStateKey('sel') silhouetteCamera.node().setCameraMask(BitMask32(8)) tempnode.setShader(loader.loadShader('mousePicker.sha'), 100) selnodeState = tempnode.getState() tempnode.setBin('inactive', 0, 1) initialState = tempnode.getState() # Set up a 1-by-1 buffer to which we'll just render the pixel under # the mouse. selectBuffer = mainWin.makeTextureBuffer('selectBuffer', 1, 1) selectBuffer.setClearColor(Vec4(0, 0, 0, 1)) self.selectBuffer = selectBuffer selectLens = PerspectiveLens() selectLens.setNearFar(mainLens.getNear(), mainLens.getFar()) selectLens.setFocalLength(mainLens.getFocalLength()) selectCamera = base.makeCamera(selectBuffer, lens=selectLens) selectCamera.node().setScene(scene) selectCamera.node().setInitialState(initialState) selectCamera.node().setTagState('sel', selnodeState) selectCamera.node().setTagStateKey('sel') selectCamera.node().setCameraMask(BitMask32(16)) self.selectLens = selectLens self.selectTex = selectBuffer.getTexture() self.selectTex.makeRamImage() self.gsg = mainWin.getGsg() # Set up a texture card to render the silhouette texture with the # Sobel shader, which will draw the edges of the silhouettes. silhouetteCard = silhouetteBuffer.getTextureCard() silhouetteCard.setTransparency(1) inkGen = loader.loadShader('sobel.sha') silhouetteCard.setShader(inkGen) silhouetteCard.setShaderInput('separation', 0.001, 0) silhouetteCard.reparentTo(render2d) self.silhouetteCard = silhouetteCard self.accept(mainWin.getWindowEvent(), self.windowEventHandler) self.accept('mouse1', self.mouseDownHandler, ['l']) self.accept('mouse1-up', self.mouseUpHandler, ['l']) self.accept('mouse3', self.mouseDownHandler, ['r']) self.accept('mouse3-up', self.mouseUpHandler, ['r']) self.buttonWatcher = ButtonWatcher([ KeyboardButton.shift(), KeyboardButton.control(), MouseButton.one(), MouseButton.three(), ]) CameraController.getInstance().addEventHandler(EVT_CAMERA_MODE, self._cameraModeHandler) self.enable(False)
def initialize(self): self.lens = self.makeLens() self.camera = self.doc.render.attachNewNode( ModelNode("viewportCameraParent")) self.camNode = Camera("viewportCamera") self.camNode.setLens(self.lens) self.camNode.setCameraMask(self.getViewportMask()) self.cam = self.camera.attachNewNode(self.camNode) winprops = WindowProperties.getDefault() winprops.setParentWindow(int(self.winId())) winprops.setForeground(False) winprops.setUndecorated(True) gsg = self.doc.gsg output = base.graphicsEngine.makeOutput( base.pipe, "viewportOutput", 0, FrameBufferProperties.getDefault(), winprops, (GraphicsPipe.BFFbPropsOptional | GraphicsPipe.BFRequireWindow), gsg) self.qtWindow = QtGui.QWindow.fromWinId( output.getWindowHandle().getIntHandle()) self.qtWidget = QtWidgets.QWidget.createWindowContainer( self.qtWindow, self, QtCore.Qt.WindowDoesNotAcceptFocus | QtCore.Qt.WindowTransparentForInput | QtCore.Qt.WindowStaysOnBottomHint | QtCore.Qt.BypassWindowManagerHint | QtCore.Qt.SubWindow) #, #(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowDoesNotAcceptFocus #| QtCore.Qt.WindowTransparentForInput | QtCore.Qt.BypassWindowManagerHint #| QtCore.Qt.SubWindow | QtCore.Qt.WindowStaysOnBottomHint)) self.qtWidget.setFocusPolicy(QtCore.Qt.NoFocus) self.inputDevice = output.getInputDevice(0) assert output is not None, "Unable to create viewport output!" dr = output.makeDisplayRegion() dr.disableClears() dr.setCamera(self.cam) self.displayRegion = dr output.disableClears() output.setClearColor(Viewport.ClearColor) output.setClearColorActive(True) output.setClearDepthActive(True) output.setActive(True) self.win = output # keep track of the mouse in this viewport mak = MouseAndKeyboard(self.win, 0, "mouse") mouse = base.dataRoot.attachNewNode(mak) self.mouseAndKeyboard = mouse self.mouseWatcher = MouseWatcher() self.mouseWatcher.setDisplayRegion(self.displayRegion) mw = mouse.attachNewNode(self.mouseWatcher) self.mouseWatcherNp = mw # listen for keyboard and mouse events in this viewport bt = ButtonThrower("kbEvents") bt.setButtonDownEvent("btndown") bt.setButtonUpEvent("btnup") mods = ModifierButtons() mods.addButton(KeyboardButton.shift()) mods.addButton(KeyboardButton.control()) mods.addButton(KeyboardButton.alt()) mods.addButton(KeyboardButton.meta()) bt.setModifierButtons(mods) self.buttonThrower = mouse.attachNewNode(bt) # collision objects for clicking on objects from this viewport self.clickRay = CollisionRay() self.clickNode = CollisionNode("viewportClickRay") self.clickNode.addSolid(self.clickRay) self.clickNp = NodePath(self.clickNode) self.clickQueue = CollisionHandlerQueue() self.setupRender2d() self.setupCamera2d() self.gizmo = ViewportGizmo(self) self.doc.viewportMgr.addViewport(self) self.makeGrid()