Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.06 KB | None | 0 0
  1.  
  2. #include "GraphicsSystem.h"
  3. #include "StereoRenderingGameState.h"
  4.  
  5. #include "OgreSceneManager.h"
  6. #include "OgreCamera.h"
  7. #include "OgreRoot.h"
  8. #include "OgreWindow.h"
  9. #include "Compositor/OgreCompositorManager2.h"
  10.  
  11.  
  12. #include "Compositor/OgreCompositorManager2.h"
  13. #include "Compositor/OgreCompositorWorkspace.h"
  14. #include "Compositor/OgreCompositorShadowNode.h"
  15. #include "Compositor/OgreCompositorChannel.h"
  16. #include "Compositor/Pass/PassClear/OgreCompositorPassClear.h"
  17. #include "Compositor/Pass/PassScene/OgreCompositorPassScene.h"
  18. #include "Compositor/Pass/PassQuad/OgreCompositorPassQuad.h"
  19. #include "Compositor/Pass/PassQuad/OgreCompositorPassQuadDef.h"
  20. #include "OgreDepthBuffer.h"
  21.  
  22. //Declares WinMain / main
  23. #include "MainEntryPointHelper.h"
  24. #include "System/MainEntryPoints.h"
  25.  
  26. #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
  27. INT WINAPI WinMainApp( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR strCmdLine, INT nCmdShow )
  28. #else
  29. int mainApp( int argc, const char *argv[] )
  30. #endif
  31. {
  32.     return Demo::MainEntryPoints::mainAppSingleThreaded( DEMO_MAIN_ENTRY_PARAMS );
  33. }
  34.  
  35. namespace Demo
  36. {
  37.     class StereoGraphicsSystem : public GraphicsSystem
  38.     {
  39.         Ogre::SceneNode             *mCamerasNode;
  40.         Ogre::Camera                *mEyeCameras[2];
  41.         Ogre::CompositorWorkspace   *mEyeWorkspaces[2];
  42.  
  43.         //-------------------------------------------------------------------------------
  44.         virtual void createCamera(void)
  45.         {
  46.             //Use one node to control both cameras
  47.             mCamerasNode = mSceneManager->getRootSceneNode( Ogre::SCENE_DYNAMIC )->
  48.                     createChildSceneNode( Ogre::SCENE_DYNAMIC );
  49.             mCamerasNode->setName( "Cameras Node" );
  50.  
  51.             mCamerasNode->setPosition( 0, 5, 15 );
  52.  
  53.             mEyeCameras[0] = mSceneManager->createCamera( "Left Eye" );
  54.             mEyeCameras[1] = mSceneManager->createCamera( "Right Eye" );
  55.  
  56.             const Ogre::Real eyeDistance        = 0.5f;
  57.             const Ogre::Real eyeFocusDistance   = 0.45f;
  58.  
  59.  
  60.             Ogre::Vector4 eyeFrustumExtents[2];
  61.  
  62.  
  63.             for( int i=0; i<2; ++i )
  64.             {
  65.                 const Ogre::Vector3 camPos( eyeDistance * (i * 2 - 1), 0, 0 );
  66.                 mEyeCameras[i]->setPosition( camPos );
  67.  
  68.                 Ogre::Vector3 lookAt( eyeFocusDistance * (i * 2 - 1), -5, -15 );
  69.                 //Ogre::Vector3 lookAt( 0, 0, 0 );
  70.  
  71.                 // Look back along -Z
  72.                 mEyeCameras[i]->lookAt( lookAt );
  73.                 mEyeCameras[i]->setNearClipDistance( 0.2f );
  74.                 mEyeCameras[i]->setFarClipDistance( 1000.0f );
  75.                 mEyeCameras[i]->setAutoAspectRatio( true );
  76.  
  77.                 //By default cameras are attached to the Root Scene Node.
  78.                 mEyeCameras[i]->detachFromParent();
  79.                 mCamerasNode->attachObject( mEyeCameras[i] );
  80.  
  81.  
  82.                 mEyeCameras[i]->getFrustumExtents(eyeFrustumExtents[i].x, eyeFrustumExtents[i].y, eyeFrustumExtents[i].w, eyeFrustumExtents[i].z, Ogre::FET_TAN_HALF_ANGLES);
  83.             }
  84.  
  85.             mCamera = mEyeCameras[0];
  86.  
  87.  
  88.  
  89.  
  90.  
  91.             //Create a camera for culling data
  92.             Ogre::Camera* mCullCamera = mSceneManager->createCamera("CameraCull");
  93.  
  94.             Ogre::Vector4 cameraCullFrustumExtents;
  95.             cameraCullFrustumExtents.x = std::min(eyeFrustumExtents[0].x, -eyeFrustumExtents[1].y);
  96.             cameraCullFrustumExtents.y = -cameraCullFrustumExtents.x;
  97.             cameraCullFrustumExtents.z = std::max(eyeFrustumExtents[0].z, eyeFrustumExtents[1].z);
  98.             cameraCullFrustumExtents.w = std::min(eyeFrustumExtents[0].w, eyeFrustumExtents[1].w);
  99.  
  100.  
  101.             float mCullCameraOffset = (mEyeCameras[1]->getPosition().x - mEyeCameras[0]->getPosition().x) * 0.5f / cameraCullFrustumExtents.y;
  102.  
  103.             mCullCamera->setPosition(0.0, 0.0, mCullCameraOffset);
  104.             mCullCamera->setNearClipDistance( 0.2f + mCullCameraOffset);
  105.             mCullCamera->setFarClipDistance(1000.0f);
  106.  
  107.             mCullCamera->detachFromParent();
  108.             mCamerasNode->getParentSceneNode()->attachObject(mCullCamera);
  109.  
  110.             mCullCamera->setFrustumExtents(cameraCullFrustumExtents.x, cameraCullFrustumExtents.y, cameraCullFrustumExtents.w, cameraCullFrustumExtents.z, Ogre::FET_TAN_HALF_ANGLES);
  111.         }
  112.  
  113.         virtual Ogre::CompositorWorkspace* setupCompositor()
  114.         {
  115.  
  116.  
  117.             Ogre::CompositorManager2 *compositorManager = mRoot->getCompositorManager2();
  118.  
  119.             //MAIN RENDER NODE DEFINITION
  120.             Ogre::CompositorNodeDef *renderNodeDef = compositorManager->addNodeDefinition("MainEngineRenderingNodeStereo");
  121.  
  122.             renderNodeDef->addTextureSourceName("renderwindow", 0, Ogre::TextureDefinitionBase::TEXTURE_INPUT);
  123.  
  124.             renderNodeDef->setNumLocalTextureDefinitions(1);
  125.  
  126.             Ogre::TextureDefinitionBase::TextureDefinition *renderTex = renderNodeDef->addTextureDefinition("renderAux");
  127.             renderTex->textureFlags = Ogre::TextureFlags::RenderToTexture;
  128.             renderTex->format = Ogre::PFG_RGBA16_FLOAT;
  129.             renderTex->msaa = 1u;
  130.  
  131.             Ogre::RenderTargetViewDef *rtv = renderNodeDef->addRenderTextureView("renderAux");
  132.             Ogre::RenderTargetViewEntry attachment;
  133.             attachment.textureName = "renderAux";
  134.             rtv->colourAttachments.push_back(attachment);
  135.             rtv->depthBufferId = Ogre::DepthBuffer::POOL_DEFAULT;
  136.  
  137.  
  138.             renderNodeDef->setNumTargetPass(3);
  139.             {
  140.                 {
  141.                     Ogre::CompositorTargetDef *targetDef = renderNodeDef->addTargetPass("renderAux");
  142.                     targetDef->setNumPasses(1);
  143.  
  144.                     //SINGLE PASS STEREO PASS (or left eye when no available)
  145.                     Ogre::CompositorPassSceneDef* mPassSceneDef = static_cast<Ogre::CompositorPassSceneDef*>(targetDef->addPass(Ogre::PASS_SCENE));
  146.                     mPassSceneDef->mCameraName = "Left Eye";
  147.                     mPassSceneDef->mCullCameraName = "CameraCull";
  148.                     mPassSceneDef->setAllClearColours(Ogre::ColourValue::Black);
  149.                     mPassSceneDef->setAllLoadActions(Ogre::LoadAction::Clear);
  150.                     mPassSceneDef->mProfilingId = "LEFT_STEREO_SCENE_PASS";
  151.                     mPassSceneDef->mVpLeft = 0.0f;
  152.                     mPassSceneDef->mVpTop = 0.0f;
  153.                     mPassSceneDef->mVpWidth = 0.5f;
  154.                     mPassSceneDef->mVpHeight = 1.0f;
  155.  
  156.                     { //Right eye
  157.                         Ogre::CompositorTargetDef *targetDefRight = renderNodeDef->addTargetPass("renderAux");
  158.                         targetDef->setNumPasses(1);
  159.  
  160.                         //RIGHT EYE
  161.                         Ogre::CompositorPassSceneDef* mPassSceneDefRight = static_cast<Ogre::CompositorPassSceneDef*>(targetDefRight->addPass(Ogre::PASS_SCENE));
  162.                         mPassSceneDefRight->mCameraName = "Right Eye";
  163.                         mPassSceneDefRight->mCullCameraName = "CameraCull";
  164.                         mPassSceneDefRight->mReuseCullData = true;
  165.                         mPassSceneDefRight->mProfilingId = "RIGHT_STEREO_SCENE_PASS";
  166.                         mPassSceneDefRight->mIdentifier = 25001;
  167.                         mPassSceneDefRight->setAllStoreActions(Ogre::StoreAction::Store);
  168.                         mPassSceneDefRight->mVpLeft = 0.5f;
  169.                         mPassSceneDefRight->mVpTop = 0.0f;
  170.                         mPassSceneDefRight->mVpWidth = 0.5f;
  171.                         mPassSceneDefRight->mVpHeight = 1.0f;
  172.                     }
  173.  
  174.                 }
  175.                 //POST PROCESS
  176.                 {
  177.                     Ogre::CompositorTargetDef *targetDef = renderNodeDef->addTargetPass("renderwindow");
  178.                     targetDef->setNumPasses(1);
  179.  
  180.                     //QUAD
  181.                     Ogre::CompositorPassQuadDef *passQuadDef = static_cast<Ogre::CompositorPassQuadDef*>(targetDef->addPass(Ogre::PASS_QUAD));
  182.                     passQuadDef->setAllLoadActions(Ogre::LoadAction::DontCare);
  183.                     passQuadDef->mMaterialName = "Ogre/Copy/4xFP32";
  184.                     passQuadDef->addQuadTextureSource(0, "renderAux");
  185.                     passQuadDef->mProfilingId = "STEREO_FINAL_PROCESSING_QUAD_PASS";
  186.                 }
  187.  
  188.             }
  189.  
  190.             //MAIN WORKSPACE DEFINITION
  191.             Ogre::CompositorWorkspaceDef *workspaceDef = compositorManager->addWorkspaceDefinition("StereoRenderingWorkspace2");
  192.             workspaceDef->connectExternal(0, "MainEngineRenderingNodeStereo", 0);
  193.  
  194.  
  195.  
  196.             const Ogre::IdString workspaceName( "StereoRenderingWorkspace2" );
  197.  
  198.             mEyeWorkspaces[0] = compositorManager->addWorkspace( mSceneManager,
  199.                                                                  mRenderWindow->getTexture(),
  200.                                                                  mEyeCameras[0], workspaceName,
  201.                                                                  true, -1, (Ogre::UavBufferPackedVec*)0,
  202.                                                                  (Ogre::ResourceLayoutMap*)0,
  203.                                                                  (Ogre::ResourceAccessMap*)0 );
  204.  
  205.  
  206.  
  207.             Ogre::uint32 forwardPlusParams[8];
  208.  
  209.             forwardPlusParams[0] = 4; //width
  210.             forwardPlusParams[1] = 4; //height
  211.             forwardPlusParams[2] = 24; //numSlices
  212.             forwardPlusParams[3] = 20; //lightsPerCell
  213.             forwardPlusParams[4] = 0; //decalsPerCell
  214.             forwardPlusParams[5] = 5; //cubemapProbesPerCel
  215.             forwardPlusParams[6] = 5; //minDistance
  216.             forwardPlusParams[7] = 500; //maxDistance
  217.             mSceneManager->setForwardClustered(true, forwardPlusParams[0], forwardPlusParams[1], forwardPlusParams[2],
  218.                 forwardPlusParams[3], forwardPlusParams[4], forwardPlusParams[5], forwardPlusParams[6], forwardPlusParams[7]);
  219.  
  220.  
  221.             return mEyeWorkspaces[0];
  222.         }
  223.  
  224.     public:
  225.         StereoGraphicsSystem( GameState *gameState ) :
  226.             GraphicsSystem( gameState )
  227.         {
  228.         }
  229.     };
  230.  
  231.     void MainEntryPoints::createSystems( GameState **outGraphicsGameState,
  232.                                          GraphicsSystem **outGraphicsSystem,
  233.                                          GameState **outLogicGameState,
  234.                                          LogicSystem **outLogicSystem )
  235.     {
  236.         StereoRenderingGameState *gfxGameState = new StereoRenderingGameState(
  237.         "This tutorial demonstrates the most basic rendering loop: Variable framerate.\n"
  238.         "Variable framerate means the application adapts to the current frame rendering\n"
  239.         "performance and boosts or decreases the movement speed of objects to maintain\n"
  240.         "the appearance that objects are moving at a constant velocity.\n"
  241.         "When framerate is low, it looks 'frame skippy'; when framerate is high,\n"
  242.         "it looks very smooth.\n"
  243.         "Note: If you can't exceed 60 FPS, it's probably because of VSync being turned on.\n"
  244.         "\n"
  245.         "Despite what it seems, this is the most basic form of updating, and a horrible way\n"
  246.         "to update your objects if you want to do any kind of serious game development.\n"
  247.         "Keep going through the Tutorials for superior methods of updating the rendering loop.\n"
  248.         "\n"
  249.         "Note: The cube is black because there is no lighting. We are not focusing on that." );
  250.  
  251.         GraphicsSystem *graphicsSystem = new StereoGraphicsSystem( gfxGameState );
  252.  
  253.         gfxGameState->_notifyGraphicsSystem( graphicsSystem );
  254.  
  255.         *outGraphicsGameState = gfxGameState;
  256.         *outGraphicsSystem = graphicsSystem;
  257.     }
  258.  
  259.     void MainEntryPoints::destroySystems( GameState *graphicsGameState,
  260.                                           GraphicsSystem *graphicsSystem,
  261.                                           GameState *logicGameState,
  262.                                           LogicSystem *logicSystem )
  263.     {
  264.         delete graphicsSystem;
  265.         delete graphicsGameState;
  266.     }
  267.  
  268.     const char* MainEntryPoints::getWindowTitle(void)
  269.     {
  270.         return "Stereo Rendering Sample";
  271.     }
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement