def _onMouseMoved(self, _evt): """Mouse moved event """ mstate = _evt.get_state() prev_pos = self.mouse_pos self.mouse_pos = (mstate.X.abs, mstate.Y.abs) # move object if self.state is SCgEditMode.ES_Move: pos = self.move_obj.getPosition() #self.move_obj.setPosition((pos[0] + dpos[0], pos[1] + dpos[1])) if render_engine.viewMode is render_engine.Mode_Isometric: self.move_obj.setPosition( render_engine.pos2dTo3dIsoPos(self.mouse_pos)) else: self.move_obj.setPosition( render_engine.pos2dToViewPortRay( self.mouse_pos).getPoint(25.0)) # if self.vis_menu.isShow(): self.vis_menu.move(self.mouse_pos) return True elif self.state is SCgEditMode.ES_LineCreate: pos = render_engine.pos2dTo3dIsoPos(self.mouse_pos) self.line_mode_obj.setPosition(pos) self._updateLineCreationObjects() self._highlight() return True elif self.state is SCgEditMode.ES_BusCreate: pos = render_engine.pos2dTo3dIsoPos(self.mouse_pos) self.line_mode_obj.setPosition(pos) self._updateLineCreationObjects() self._highlight() return True elif self.state is SCgEditMode.ES_Translate: if render_engine.viewMode is render_engine.Mode_Isometric: render_engine._ogreCameraNode.translate( -mstate.X.rel / float(render_engine.scale2d), mstate.Y.rel / float(render_engine.scale2d), 0.0) self._logic._getSheet()._updateChildTexts() else: self.rotX = ogre.Degree(-mstate.X.rel * 0.13) self.rotY = ogre.Degree(-mstate.Y.rel * 0.13) #FIXME: add perspective mode # scaling if self._ctrl and mstate.Z.rel != 0 and render_engine.viewMode == render_engine.Mode_Isometric: sc = 1.0 + mstate.Z.rel / 1200.0 sheet = self._logic._getSheet() sheet.setScale(sheet.getScale() * sc) self._highlight() return False
def _getObjectsUnderMouse(self, sortDistance=True, forced=False, mpos=None): """Returns objects under mouse. By default it's caching results for frame, but if you need to find objects anyway, then set forced parameter to True. @warning: You must be accurate with using this function. It's not thread safe, because it gets mouse state @param forced: flag to force finding @type forced: bool @param sortDistance: flag to sort founded object by distance from near to far @type sortDistance: bool @param mpos: mouse position. If you set it to None, then mouse position will be given for current mouse state. If you set parameters to None, then it will be work in forced mode automatically. @type mpos: tuple (x, y) @return: list of tuples (distance, object) @rtype: tuple """ founded = [] if forced or mpos is not None: # building intersection ray if mpos is None: mstate = render_engine._getMouseState() self.ray = render_engine.pos2dToViewPortRay( (mstate.X.abs, mstate.Y.abs)) else: self.ray = render_engine.pos2dToViewPortRay(mpos) #x = mstate.X.abs / float(mstate.width) #y = mstate.Y.abs / float(mstate.height) # iterating through objects and finding intersections for child in self.__childObjects: founded = founded + child._getObjectsUnderMouse(True, True) res, dist = child._checkRayIntersect(self.ray) if res: founded.append((dist, child)) if sortDistance: founded.sort() return founded
def _onMouseMoved(self, _evt): """Mouse moved event """ mstate = _evt.get_state() prev_pos = self.mouse_pos self.mouse_pos = (mstate.X.abs, mstate.Y.abs) # move object if self.state is SCgEditMode.ES_Move: pos = self.move_obj.getPosition() #self.move_obj.setPosition((pos[0] + dpos[0], pos[1] + dpos[1])) if render_engine.viewMode is render_engine.Mode_Isometric: self.move_obj.setPosition(render_engine.pos2dTo3dIsoPos(self.mouse_pos)) else: self.move_obj.setPosition(render_engine.pos2dToViewPortRay(self.mouse_pos).getPoint(25.0)) # if self.vis_menu.isShow(): self.vis_menu.move(self.mouse_pos) return True elif self.state is SCgEditMode.ES_LineCreate: pos = render_engine.pos2dTo3dIsoPos(self.mouse_pos) self.line_mode_obj.setPosition(pos) self._updateLineCreationObjects() self._highlight() return True elif self.state is SCgEditMode.ES_BusCreate: pos = render_engine.pos2dTo3dIsoPos(self.mouse_pos) self.line_mode_obj.setPosition(pos) self._updateLineCreationObjects() self._highlight() return True elif self.state is SCgEditMode.ES_Translate: if render_engine.viewMode is render_engine.Mode_Isometric: render_engine._ogreCameraNode.translate(-mstate.X.rel / float(render_engine.scale2d), mstate.Y.rel / float(render_engine.scale2d), 0.0) self._logic._getSheet()._updateChildTexts() else: self.rotX = ogre.Degree(-mstate.X.rel * 0.13) self.rotY = ogre.Degree(-mstate.Y.rel * 0.13) #FIXME: add perspective mode # scaling if self._ctrl and mstate.Z.rel != 0 and render_engine.viewMode == render_engine.Mode_Isometric: sc = 1.0 + mstate.Z.rel / 1200.0 sheet = self._logic._getSheet() sheet.setScale(sheet.getScale() * sc) self._highlight() return False
def _createNode(self, _pos, _type = "node/const/elem"): """Creates node in specified position @param _pos: position tuple (x,y) @type _pos: tuple @param _type: node type @type _type: str @return: created node """ node = scg_alphabet.createSCgNode(_type) node.setState(objects.Object.OS_Normal) sheet = self._getSheet() sheet.addChild(node) if render_engine.viewMode == render_engine.Mode_Isometric: node.setPosition(render_engine.pos2dTo3dIsoPos(_pos)) else: # raise RuntimeError("Not implemented 3d mode in scg editor") node.setPosition(render_engine.pos2dToViewPortRay(_pos).getPoint(25.0)) return node
def _onMousePressed(self, _evt, _id): """Mouse button pressed event """ if BaseEditMode._onMousePressed(self, _evt, _id): return True # getting objects under mouse mobjects = self._logic._getSheet()._getObjectsUnderMouse(True, True, self.mouse_pos) if _id == ois.MB_Right: if len(mobjects) == 0: if render_engine.viewMode is render_engine.Mode_Perspective: self._logic.addAtom(render_engine.pos2dToViewPortRay(self.mouse_pos).getPoint(10.0), "H") else: self._logic.addAtom(render_engine.pos2dTo3dIsoPos(self.mouse_pos), "H") elif _id == ois.MB_Left: if len(mobjects) > 0: self._selectObject(mobjects[0][1]) else: if render_engine.viewMode is render_engine.Mode_Perspective: self.navigation = True return False