def ogreViewportCreatedCallback(self):
     self.viewportGrid = ViewportGrid(self.OgreMainWinSceneMgr, self.ogreWidget.viewport)
     self.viewportGrid.enable()
class OgreMainWindow(QWidget):
    def __init__(self, moduleManager,  ogreRoot, OgreMainWinSceneMgr,  parent):
        QWidget.__init__(self, parent)
        self.moduleManager = moduleManager

        self.ogreRoot = ogreRoot
        self.OgreMainWinSceneMgr = OgreMainWinSceneMgr

        self.ogreWidget = None

        self.leftMouseDown = False
        self.middleMouseDown = False
        self.rightMouseDown = False

        self.mDollyCamera = False

        self.moveCamForward = False
        self.moveCamBackward = False
        self.strafeCamLeft = False
        self.strafeCamRight = False

        self.camUpdateTimer = QTimer(self)
        self.camUpdateTimer.connect(self.camUpdateTimer, SIGNAL("timeout()"), self.updateCamera)

        self.lastSelectionClick = None # Qpoint wich saves the last selection click mouse position
        
        self.setupUi(self)

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(QSize(QRect(0,0,935,843).size()).expandedTo(Form.minimumSizeHint()))

        self.gridlayout = QGridLayout(Form)
        self.gridlayout.setContentsMargins(0, 2, 0, 0)
        self.gridlayout.setObjectName("gridlayout")

        # create the vertical splitter ( contains the preferences buttons and the horizontal splitter with the two render windows )
        self.splitterV = QSplitter(Form)

        sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding,QSizePolicy.MinimumExpanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.splitterV.sizePolicy().hasHeightForWidth())
        self.splitterV.setSizePolicy(sizePolicy)
        self.splitterV.setOrientation(Qt.Vertical)
        self.splitterV.setObjectName("splitter")

        # create the horizontal splitter wich contains the two ogre render windows and add it to the vertical splitter

        ##################################
        self.ogreWidget = OgreWidget.OgreWidget("OgreMainWin", self.ogreRoot, self.OgreMainWinSceneMgr, "MainCam", self.splitterV,  0)
        self.ogreWidget.setMinimumSize(QSize(250,250))

        sizePolicy = QSizePolicy(QSizePolicy.Maximum,QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.ogreWidget.sizePolicy().hasHeightForWidth())
        self.ogreWidget.setSizePolicy(sizePolicy)
        self.ogreWidget.setObjectName("ogreWidget")
        self.splitterV.addWidget(self.ogreWidget)
        self.ogreWidget.setBackgroundColor(og.ColourValue(0, 1, 1))
        ####################################

        self.gridlayout.addWidget(self.splitterV,0,0,1,1)

        # register the eventfilters for the render windows
        # this is needed to catch mouse enter and mouse leave events for these windows
        self.ogreWidget.installEventFilter(self)
        self.ogreWidget.setAcceptDrops(True)
        self.lastMousePosX = 0
        self.lastMousePosY = 0

        self.retranslateUi(Form)
        QMetaObject.connectSlotsByName(Form)
        
        self.ogreWidget.setOgreViewportCreatedCallback(self.ogreViewportCreatedCallback)
        
    def ogreViewportCreatedCallback(self):
        self.viewportGrid = ViewportGrid(self.OgreMainWinSceneMgr, self.ogreWidget.viewport)
        self.viewportGrid.enable()
        
    def retranslateUi(self, Form):
        Form.setWindowTitle(QApplication.translate("Form", "Form", None, QApplication.UnicodeUTF8))

    def keyPressEvent(self,  event):
        if event.key() == Qt.Key_W:
            self.moveCamForward = True
        elif event.key() == Qt.Key_S:
            self.moveCamBackward = True
        elif event.key() == Qt.Key_A:
            self.strafeCamLeft = True
        elif event.key() == Qt.Key_D:
            self.strafeCamRight= True

    def keyReleaseEvent(self,  event):
        if event.key() == Qt.Key_W:
            self.moveCamForward = False
        elif event.key() == Qt.Key_S:
            self.moveCamBackward = False
        elif event.key() == Qt.Key_A:
            self.strafeCamLeft = False
        elif event.key() == Qt.Key_D:
            self.strafeCamRight= False

    def eventFilter(self, obj, event):
#        print event.type()
        
        if event.type() == 2:
            self.ogreWidget.setFocus()
            if event.button() == 1: # left mouse button is pressed
                self.leftMouseDown = True
                self.moduleManager.setLeftMouseDown()
                
                if self.rightMouseDown: #if right mouse button is already pressed dolly the camera
                    self.mDollyCamera = True
                else:
                    self.calculateSelectionRay(event)

            elif event.button() == 2: # right mouse button is pressed
                self.rightMouseDown = True
                self.moduleManager.rightMouseDown = True
                QTimer.singleShot(50, self.onContextMenuTimer)

            elif event.button() == 4: # middle mouse button is pressed
                self.middleMouseDown = True
                self.moduleManager.middleMouseDown = True

            self.camUpdateTimer.start(15)

        elif event.type() == 3:
            if event.button() == 1: # left mouse button is released
                self.leftMouseDown = False
                self.moduleManager.setLeftMouseUp()
                self.moduleManager.myTerrainManager.leftMouseUp()
                
                if self.mDollyCamera == True: #if we dolly the camera set it to false
                    self.mDollyCamera = False

            elif event.button() == 2: # right mouse button is released
                self.rightMouseDown = False
                self.moduleManager.rightMouseDown = False
                
            elif event.button() == 4: # middle mouse button is released
                self.middleMouseDown = False
                self.moduleManager.middleMouseDown = False

            if not self.rightMouseDown:
                self.mDollyCamera = False
                self.camUpdateTimer.stop()

            self.lastMousePosX = 0
            self.lastMousePosY = 0

        elif event.type() == 5: #mouse moved while button down
            if self.lastMousePosX == 0: # check to avoid to huge values which may happen when the user clicks and lastMousePosX/Y is zero
                self.lastMousePosX = event.globalX()
            if self.lastMousePosY == 0:# check to avoid to huge values which may happen when the user clicks and lastMousePosX/Y is zero
                self.lastMousePosY = event.globalY()

            incX =  (event.globalX() - self.lastMousePosX)
            incY =  (event.globalY() - self.lastMousePosY)

            if self.moduleManager.pivot is not None and  self.leftMouseDown and not self.middleMouseDown and not self.rightMouseDown:
                self.moduleManager.pivot.onMouseMoved(event.globalX,  event.globalY,  incX,  incY)
                
            if self.leftMouseDown is True and not self.rightMouseDown and not self.middleMouseDown:
                self.moduleManager.myTerrainManager.isEditing = True
            else:
                self.moduleManager.myTerrainManager.isEditing = False 
            
            rotX = incX * 0.01
            rotY = incY * 0.01

            if self.mDollyCamera:
                obj.dollyCamera(og.Vector3(rotX, -rotY,  0) * 3)
            elif self.rightMouseDown:
                obj.orbitCamera(-rotX,  rotY)

            self.lastMousePosX = event.globalX()
            self.lastMousePosY = event.globalY()


        if event.type() == 60: #drag enter
            self.dragEnterEvent(event)
        if event.type() == 61: #drag move
            self.dragMoveEvent(event)
#        if event.type() == 62:
#            self.finishDropEvent(event)
        if event.type() == 63:
            self.finishDropEvent(event)

        return False

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat("application/x-static_model"):
            data = event.mimeData().data("application/x-static_model")
            stream = QDataStream(data, QIODevice.ReadOnly)
            text = QString()
            stream >> text

            self.moduleManager.startDropModelAction(str(text), self.getCameraToViewportRay()) #start the model draging

            event.setDropAction(Qt.CopyAction)
            event.accept()

        elif event.mimeData().hasFormat("application/x-game_object"):
            data = event.mimeData().data("application/x-game_object")
            stream = QDataStream(data, QIODevice.ReadOnly)
            text = QString()
            stream >> text

            self.moduleManager.startDropGameObjectAction(str(text), self.getCameraToViewportRay()) #start the model draging

            event.setDropAction(Qt.CopyAction)
            event.accept()
        elif event.mimeData().hasFormat("application/x-material"):
            data = event.mimeData().data("application/x-material")
            stream = QDataStream(data, QIODevice.ReadOnly)
            text = QString()
            stream >> text

            self.moduleManager.startDropMaterialAction(str(text)) #start the material draging

            event.setDropAction(Qt.CopyAction)
            event.accept()
        else:
            event.ignore()


    def dragMoveEvent(self, event):
        if event.mimeData().hasFormat("application/x-static_model"):
            self.moduleManager.moveDropModelAction(self.getCameraToViewportRay()) #move it with the mouse
            event.accept()
        elif event.mimeData().hasFormat("application/x-game_object"):
            self.moduleManager.moveDropGameObjectAction(self.getCameraToViewportRay()) #move it with the mouse
            event.accept()
        elif event.mimeData().hasFormat("application/x-material"):
            self.moduleManager.moveDropMaterialAction(event) #move it with the mouse
            event.accept()
        else:
            event.ignore()

    def finishDropEvent(self, event):
        if event.mimeData().hasFormat("application/x-static_model"):
            self.moduleManager.finishDropModelAction(self.getCameraToViewportRay())
            event.accept()
        elif event.mimeData().hasFormat("application/x-game_object"):
            self.moduleManager.finishDropGameObjectAction(self.getCameraToViewportRay()) 
            event.accept()
        elif event.mimeData().hasFormat("application/x-material"):
            relMousePos = self.ogreWidget.mapFromGlobal(QCursor.pos())
            self.moduleManager.finishDropMaterialAction(relMousePos.x(), relMousePos.y()) 
            event.accept()
        else:
            event.ignore()

    def getCameraToViewportRay(self):
        relMousePos = self.ogreWidget.mapFromGlobal(QCursor.pos())

        screenX = relMousePos.x()/float(self.ogreWidget.viewport.getActualWidth())
        screenY = relMousePos.y()/float(self.ogreWidget.viewport.getActualHeight())

        return self.ogreWidget.getCamera().getCameraToViewportRay(screenX, screenY)

    #calculates the the selection ray and notifies the ModuleManager that something is about to be selected
    def calculateSelectionRay(self,  event):
        relMousePos = self.ogreWidget.mapFromGlobal(QPoint(event.globalX(),  event.globalY())) # get the mose position relative to the ogre window

#        if self.lastSelectionClick != None:
#            if self.lastSelectionClick.x() == relMousePos.x() and self.lastSelectionClick.y() == relMousePos.y(): # mouse didn't move
#                # we don't initiate a new selection based on bounding boxes here, we just iterate through the list generated last time a selection was made
#                # this is based on how far the distance of the object is from the camera (as returned by ogre)
#                self.moduleManager.iterateEntityUnderMouse() # don't select something new, switch through the currently selected models
#                return

        self.lastSelectionClick = relMousePos
        screenX = relMousePos.x()/float(self.ogreWidget.viewport.getActualWidth())
        screenY = relMousePos.y()/float(self.ogreWidget.viewport.getActualHeight())

        mouseRay = self.ogreWidget.getCamera().getCameraToViewportRay(screenX, screenY)

        if event.modifiers() == Qt.ControlModifier:
            self.moduleManager.selectionClick(relMousePos.x(), relMousePos.y(), mouseRay,  True,  False)
        elif event.modifiers() == Qt.ShiftModifier:
            self.moduleManager.selectionClick(relMousePos.x(), relMousePos.y(), mouseRay,  False,  True)
        else:
            self.moduleManager.selectionClick(relMousePos.x(), relMousePos.y(), mouseRay)

    def getWidth():
        return self.ogreWidget.getWidth()
        
    def getHeight():
        return self.ogreWidget.getHeight()

    def updateCamera(self):        
        if self.moveCamForward:
            self.ogreWidget.dollyCamera(og.Vector3( 0, 0,-0.2))
        if self.moveCamBackward:
            self.ogreWidget.dollyCamera(og.Vector3( 0, 0, 0.2))
        if self.strafeCamLeft:
            self.ogreWidget.dollyCamera(og.Vector3(-0.2, 0 , 0))
        if self.strafeCamRight:
            self.ogreWidget.dollyCamera(og.Vector3( 0.2, 0, 0))
        
        if self.moduleManager.pivot:
            self.moduleManager.pivot.update()
            
    def updateRenderWindow(self):
        self.ogreWidget.update()
        
    def onContextMenuTimer(self):
        if not self.rightMouseDown:
            relMousePos = self.ogreWidget.mapFromGlobal(QCursor.pos()) # get the mose position relative to the ogre window
            
            screenX = relMousePos.x()/float(self.ogreWidget.viewport.getActualWidth())
            screenY = relMousePos.y()/float(self.ogreWidget.viewport.getActualHeight())
            mouseRay = self.ogreWidget.getCamera().getCameraToViewportRay(screenX, screenY)

            self.moduleManager.onContextMenu(relMousePos.x(), relMousePos.y(), mouseRay)
            
    def toggleViewportGrid(self):
        if self.viewportGrid.isEnabled():
            self.viewportGrid.disable()
        else:
            self.viewportGrid.enable()
Ejemplo n.º 3
0
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(QSize(QRect(0,0,935,843).size()).expandedTo(Form.minimumSizeHint()))

        self.gridlayout = QGridLayout(Form)
        self.gridlayout.setObjectName("gridlayout")

        # create the vertical splitter ( contains the preferences buttons and the horizontal splitter with the two render windows )
        self.splitterV = QSplitter(Form)

        sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding,QSizePolicy.MinimumExpanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.splitterV.sizePolicy().hasHeightForWidth())
        self.splitterV.setSizePolicy(sizePolicy)
        self.splitterV.setOrientation(Qt.Vertical)
        self.splitterV.setObjectName("splitter")

        # create the preferences buttons and connect the signals
        self.ogreWindowOptions = QToolButton(self)
        QObject.connect(self.ogreWindowOptions, SIGNAL("clicked()"),
                                    self.onPreferencesButton)
        self.ogreWindowOptions.hide()

        sizePolicy = QSizePolicy(QSizePolicy.Maximum,QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.ogreWindowOptions.sizePolicy().hasHeightForWidth())
        self.ogreWindowOptions.setSizePolicy(sizePolicy)
        self.ogreWindowOptions.setObjectName("ogreWindowPreferences")
        self.splitterV.addWidget(self.ogreWindowOptions)

        # create the horizontal splitter wich contains the two ogre render windows and add it to the vertical splitter

        ##################################
        self.ogreWidget = OgreWidget.OgreWidget("OgreMainWin", self.ogreRoot, self.OgreMainWinSceneMgr, "MainCam", self.splitterV,  0)
        self.ogreWidget.setMinimumSize(QSize(250,250))

        sizePolicy = QSizePolicy(QSizePolicy.Maximum,QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.ogreWidget.sizePolicy().hasHeightForWidth())
        self.ogreWidget.setSizePolicy(sizePolicy)
        self.ogreWidget.setObjectName("ogreWidget")
        self.splitterV.addWidget(self.ogreWidget)
        self.ogreWidget.setBackgroundColor(og.ColourValue(0, 1, 1))
        ####################################

        self.gridlayout.addWidget(self.splitterV,0,0,1,1)

        # register the eventfilters for the render windows
        # this is needed to catch mouse enter and mouse leave events for these windows
        self.ogreWidget.installEventFilter(self)
        self.ogreWidget.setAcceptDrops(True)
        self.lastMousePosX = 0
        self.lastMousePosY = 0

        self.retranslateUi(Form)
        QMetaObject.connectSlotsByName(Form)

        self.viewportGrid = ViewportGrid(self.OgreMainWinSceneMgr, self.ogreWidget.viewport)
        self.viewportGrid.enable()