⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sampleframework.py

📁 使用stl技术,(还没看,是听说的)
💻 PY
字号:
import localogre as ogre

# Big bug: Vector.ZERO is returned as a reference. If modified, then the static is modified !

class Application:
    def __init__( self ):
        self.frameListener = None
        self.root = None
        self.camera = None
        self.renderWindow = None
        self.sceneManager = None

    def __del__( self ):
        self.frameListener = None
        self.root = None
        self.camera = None
        self.renderWindow = None
        self.sceneManager = None

    def go( self ):
        if not self._setUp():
            return
        self.root.startRendering()


    def _setUp( self ):
        self.root = ogre.Root()

        self._setUpResources()
        carryOn = self._configure()
        if not carryOn:
            return False
        
        self._chooseSceneManager()
        self._createCamera()
        self._createViewports()

        #ogre.TextureManager.getSingleton().setDefaultNumMipMaps(5)

        self._createScene()
        self._createFrameListener()
        return True

    def _setUpResources( self ):
        config = ogre.ConfigFile()
        config.load( 'resources.cfg'  )
        for key, path in config.getSettingsIterator():
            ogre.ResourceManager.addCommonArchiveEx( path, key )

    def _configure( self ):
        carryOn = self.root.showConfigDialog()
        if carryOn:
            self.renderWindow = self.root.initialise( True )
        return carryOn

    def _chooseSceneManager( self ):
        self.sceneManager = self.root.getSceneManager( ogre.SceneType.ST_GENERIC )

    def _createCamera( self ):
        self.camera = self.sceneManager.createCamera( 'PlayerCam' )
        self.camera.setPosition( ogre.Vector3( 0, 0, 500 ) )
        self.camera.lookAt( ogre.Vector3( 0, 0, -300 ) )
        self.camera.setNearClipDistance( 5 )

    def _createViewports( self ):
        self.viewport = self.renderWindow.addViewport( self.camera, 0, 0.0, 0.0, 1.0, 1.0 )  # virtual with policy overload issue
        self.viewport.setBackgroundColour( ogre.ColourValue(0,0,0) )
        
    def _createScene( self ):
        pass

    def _createFrameListener( self ):
        self.frameListener = FrameListener( self.renderWindow, self.camera )
        self.frameListener.showDebugOverlay( True )
        self.root.addFrameListener( self.frameListener )

class FrameListener(ogre.FrameListener):
    def __init__( self, renderWindow, camera ):
        ogre.FrameListener.__init__( self )
        self.camera = camera
        self.renderWindow = renderWindow
        self.statisticsOn = True
        self.numScreenShots = 0
        self.timeUntilNextToggle = 0
        self.sceneDetailIndex = 0
        self.moveScale = 0.0
        self.rotationScale = 0.0
        self.translateVector = ogre.Vector3(0,0,0)
        self.aniso = 1
        self.filtering = ogre.TextureFilterOptions.TFO_BILINEAR
        self.showDebugOverlay( True )
        self.moveSpeed = 100.0
        self.rotationSpeed = 8.0

        # ignore buffered input stuff
        self.inputDevice = ogre.PlatformManager.getSingleton().createInputReader()
        self.inputDevice.initialise( renderWindow, True, True, False ) #too much boolean

    def __del__(self): 
        #ogre.PlatformManager.getSingleton().destroyInputReader( self.inputDevice )  # PlatformManager already killed when called...
        pass

    def frameStarted( self, frameEvent ):
        self.inputDevice.capture()
        if self.timeUntilNextToggle >= 0:
            self.timeUntilNextToggle -= frameEvent.timeSinceLastFrame

        if frameEvent.timeSinceLastFrame == 0:
            self.moveScale = 1
            self.rotationScale = 0.1
        else:
            self.moveScale = self.moveSpeed * frameEvent.timeSinceLastFrame
            self.rotationScale = self.rotationSpeed * frameEvent.timeSinceLastFrame

        self.rotationX = 0.0            
        self.rotationY = 0.0
        self.translateVector = ogre.Vector3(0,0,0)

        if not self._processUnbufferedKeyInput( frameEvent ):
            return False

        self._processUnbufferedMouseInput( frameEvent )

        self._moveCamera()
        return True

    def frameEnded(self, frameEvent):
        self._updateStatistics()
        return True

    def showDebugOverlay( self, show ):
        overlay = ogre.OverlayManager.getSingleton().getByName( 'Core/DebugOverlay' )
        if overlay is None:
            raise "Could not find overlay Core/DebugOverlay"        # need to look into exception integration with ogre python
        if show:
            overlay.show()
        else:
            overlay.hide()

    def _processUnbufferedKeyInput( self, frameEvent ):
        if self.inputDevice.isKeyDown( ogre.KeyCode.KC_A ):
            self.translateVector.x = -self.moveScale
        if self.inputDevice.isKeyDown( ogre.KeyCode.KC_D ):
            self.translateVector.x = self.moveScale
        if self.inputDevice.isKeyDown( ogre.KeyCode.KC_UP ) or self.inputDevice.isKeyDown( ogre.KeyCode.KC_W ):
            self.translateVector.z = -self.moveScale
        if self.inputDevice.isKeyDown( ogre.KeyCode.KC_DOWN ) or self.inputDevice.isKeyDown( ogre.KeyCode.KC_S ):
            self.translateVector.z = self.moveScale
        if self.inputDevice.isKeyDown( ogre.KeyCode.KC_PGUP ):
            self.translateVector.y = self.moveScale
        if self.inputDevice.isKeyDown( ogre.KeyCode.KC_PGDOWN ):
            self.translateVector.y = - self.moveScale

        if self.inputDevice.isKeyDown( ogre.KeyCode.KC_RIGHT ):
            self.rotationX = - self.rotationScale
        if self.inputDevice.isKeyDown( ogre.KeyCode.KC_LEFT ):
            self.rotationX = self.rotationScale

        if self._isToggleKeyDown( ogre.KeyCode.KC_F ):
            self.statisticsOn = not self.statisticsOn
            self.showDebugOverlay( self.statisticsOn )

        if self._isToggleKeyDown( ogre.KeyCode.KC_T ):
            if self.filtering == ogre.TextureFilterOptions.TFO_BILINEAR:
                self.filtering = ogre.TextureFilterOptions.TFO_TRILINEAR
                self.aniso = 1
            elif self.filtering == ogre.TextureFilterOptions.TFO_TRILINEAR:
                self.filtering = ogre.TextureFilterOptions.TFO_ANISOTROPIC
                self.aniso = 8
            else:
                self.filtering = ogre.TextureFilterOptions.TFO_BILINEAR
                self.aniso = 1
            ogre.MaterialManager.getSingleton().setDefaultTextureFiltering( self.filtering )
            ogre.MaterialManager.getSingleton().setDefaultAnisotropy( self.aniso )
            self.showDebugOverlay( self.statisticsOn )

        if self._isToggleKeyDown( ogre.KeyCode.KC_SYSRQ, 0.5 ):
            path = 'screenshot_%d.png' % self.numScreenShots
            self.numScreenShots += 1
            self.renderWindow.writeContentsToFile( path )
            self.renderWindow.setDebugText( 'screenshot taken: ' + path  )

        if self._isToggleKeyDown( ogre.KeyCode.KC_R, 0.5 ):
            detailsLevel = [ ogre.SceneDetailLevel.SDL_SOLID,
                             ogre.SceneDetailLevel.SDL_WIREFRAME,
                             ogre.SceneDetailLevel.SDL_POINTS ]
            self.sceneDetailIndex = (self.sceneDetailIndex + 1) % len(detailsLevel)
            self.camera.setDetailLevel( detailsLevel[self.sceneDetailIndex] )

        if self.inputDevice.isKeyDown( ogre.KeyCode.KC_ESCAPE ):
            return False    # stop rendering

        return True        
        
    def _isToggleKeyDown( self, keyCode, toggleTime = 1.0 ):
        if self.inputDevice.isKeyDown( keyCode )and self.timeUntilNextToggle <=0:
            self.timeUntilNextToggle = toggleTime
            return True
        return False

    def _processUnbufferedMouseInput( self, frameEvent ):
        if self.inputDevice.getMouseButton( 1 ):
            self.translateVector.x += self.inputDevice.getMouseRelativeX() * 0.13
            self.translateVector.y -= self.inputDevice.getMouseRelativeY() * 0.13
        else:
            self.rotationX = - self.inputDevice.getMouseRelativeX() * 0.13
            self.rotationY = - self.inputDevice.getMouseRelativeY() * 0.13

        if self.inputDevice.getMouseRelativeZ() > 0:
            self.translateVector.z = - self.moveScale * 8.0
        if self.inputDevice.getMouseRelativeZ() < 0:
            self.translateVector.z = self.moveScale * 8.0

    def _moveCamera( self ):
        self.camera.yaw( self.rotationX )
        self.camera.pitch( self.rotationY )
        self.camera.moveRelative( self.translateVector )

    def _updateStatistics( self ):
        statistics = self.renderWindow.getStatistics()
        self._setGuiCaption( 'Core/AverageFps', 'Average FPS: %f' % statistics.avgFPS )
        self._setGuiCaption( 'Core/CurrFps', 'Current FPS: %f' % statistics.lastFPS )
        self._setGuiCaption( 'Core/BestFps',
                             'Best FPS: %f %d ms' % (statistics.bestFPS, statistics.bestFrameTime) )
        self._setGuiCaption( 'Core/WorstFps',
                             'Worst FPS: %f %d ms' % (statistics.worstFPS, statistics.worstFrameTime) )
        self._setGuiCaption( 'Core/NumTris', 'Triangle Count: %d' % statistics.triangleCount )
        self._setGuiCaption( 'Core/DebugText', self.renderWindow.getDebugText() )

    def _setGuiCaption( self, elementName, text ):        
        guiElement = ogre.GuiManager.getSingleton().getGuiElement( elementName, False )
        guiElement.setCaption( text  )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -