Browse Source

Adds a new VR pipeline called MultiView to RPI Mesh sample (#549)

- Adds a new pipeline to the RPI/Mesh sample for the purposes of prototyping and debugging.
- Adds a new Base material type for testing purposes

Core engine - https://github.com/o3de/o3de/pull/13141
O3de-Extra - o3de/o3de-extras#60

Signed-off-by: moudgils <[email protected]>
moudgils 2 years ago
parent
commit
d0c8137528

+ 50 - 1
Gem/Code/Source/MeshExampleComponent.cpp

@@ -115,6 +115,22 @@ namespace AtomSampleViewer
         m_deferredPipeline = nullptr;
     }
 
+    void MeshExampleComponent::CreateMultiViewXRPipeline()
+    {
+        AZ::RPI::RenderPipelineDescriptor pipelineDesc;
+        pipelineDesc.m_mainViewTagName = "MainCamera";
+        pipelineDesc.m_name = "MultiViewPipeline";
+        pipelineDesc.m_rootPassTemplate = "MultiViewPipelineTemplate";
+        pipelineDesc.m_renderSettings.m_multisampleState.m_samples = 1;
+
+        m_multiViewXRPipeline = AZ::RPI::RenderPipeline::CreateRenderPipelineForWindow(pipelineDesc, *m_windowContext);
+    }
+
+    void MeshExampleComponent::DestroyMultiViewXRPipeline()
+    {
+        m_multiViewXRPipeline = nullptr;
+    }
+
     void MeshExampleComponent::ActivateLowEndPipeline()
     {
         AZ::RPI::RenderPipelinePtr prevPipeline = m_scene->GetDefaultRenderPipeline();
@@ -162,6 +178,24 @@ namespace AtomSampleViewer
         m_scene->RemoveRenderPipeline(prevPipeline->GetId());
     }
 
+    void MeshExampleComponent::ActivateMultiViewXRPipeline()
+    {
+        AZ::RPI::RenderPipelinePtr prevPipeline = m_scene->GetDefaultRenderPipeline();
+
+        if (!m_originalPipeline)
+        {
+            m_originalPipeline = prevPipeline;
+        }
+
+        m_multiViewXRPipeline->GetRootPass()->SetEnabled(true);
+        m_scene->AddRenderPipeline(m_multiViewXRPipeline);
+        m_multiViewXRPipeline->SetDefaultView(prevPipeline->GetDefaultView());
+        m_scene->RemoveRenderPipeline(prevPipeline->GetId());
+
+        m_imguiScope = {};
+        m_imguiScope = AZ::Render::ImGuiActiveContextScope::FromPass({ m_multiViewXRPipeline->GetId().GetCStr(), "ImGuiPass" });
+    }
+
     void MeshExampleComponent::Activate()
     {
         UseArcBallCameraController();
@@ -202,16 +236,18 @@ namespace AtomSampleViewer
         AZ::Render::Bootstrap::DefaultWindowNotificationBus::Handler::BusConnect();
         CreateLowEndPipeline();
         CreateDeferredPipeline();
+        CreateMultiViewXRPipeline();
     }
 
     void MeshExampleComponent::Deactivate()
     {
-        if (m_useLowEndPipeline || m_useDeferredPipeline)
+        if (m_useLowEndPipeline || m_useDeferredPipeline || m_useMultiViewXRPipeline)
         {
             ActivateOriginalPipeline();
         }
         DestroyLowEndPipeline();
         DestroyDeferredPipeline();
+        DestroyMultiViewXRPipeline();
 
         AZ::Render::Bootstrap::DefaultWindowNotificationBus::Handler::BusDisconnect();
         AZ::TickBus::Handler::BusDisconnect();
@@ -249,6 +285,10 @@ namespace AtomSampleViewer
             {
                 ActivateDeferredPipeline();
             }
+            else if (m_useMultiViewXRPipeline)
+            {
+                ActivateMultiViewXRPipeline();
+            }
             else
             {
                 ActivateOriginalPipeline();
@@ -267,14 +307,23 @@ namespace AtomSampleViewer
             {
                 m_switchPipeline = true;
                 m_useDeferredPipeline = false;
+                m_useMultiViewXRPipeline = false;
             }
 
             if (ScriptableImGui::Checkbox("Use Deferred Pipeline", &m_useDeferredPipeline))
             {
                 m_switchPipeline = true;
                 m_useLowEndPipeline = false;
+                m_useMultiViewXRPipeline = false;
             }
 
+            if (ScriptableImGui::Checkbox("Use MultiViewXR Pipeline", &m_useMultiViewXRPipeline))
+            {
+                m_switchPipeline = true;
+                m_useLowEndPipeline = false;
+                m_useDeferredPipeline = false;
+            }
+			
             modelNeedsUpdate |= ScriptableImGui::Checkbox("Enable Material Override", &m_enableMaterialOverride);
            
             if (ScriptableImGui::Checkbox("Show Ground Plane", &m_showGroundPlane))

+ 8 - 4
Gem/Code/Source/MeshExampleComponent.h

@@ -66,11 +66,13 @@ namespace AtomSampleViewer
 
         void CreateLowEndPipeline();
         void DestroyLowEndPipeline();
-
         void CreateDeferredPipeline();
         void DestroyDeferredPipeline();
+        void CreateMultiViewXRPipeline();
+        void DestroyMultiViewXRPipeline();
 
         void ActivateLowEndPipeline();
+        void ActivateMultiViewXRPipeline();
         void ActivateDeferredPipeline();
         void ActivateOriginalPipeline();
 
@@ -82,9 +84,10 @@ namespace AtomSampleViewer
         };
         Pipeline m_currentPipeline = Pipeline::Original;
 
-        AZ::RPI::RenderPipelinePtr m_lowEndPipeline;
-        AZ::RPI::RenderPipelinePtr m_deferredPipeline;
-        AZ::RPI::RenderPipelinePtr m_originalPipeline;
+        AZ::RPI::RenderPipelinePtr m_lowEndPipeline = nullptr;
+        AZ::RPI::RenderPipelinePtr m_deferredPipeline = nullptr;
+        AZ::RPI::RenderPipelinePtr m_multiViewXRPipeline = nullptr;
+        AZ::RPI::RenderPipelinePtr m_originalPipeline = nullptr;
 
         AZStd::shared_ptr<AZ::RPI::WindowContext> m_windowContext;
         AZ::Render::ImGuiActiveContextScope m_imguiScope;
@@ -120,6 +123,7 @@ namespace AtomSampleViewer
 
         bool m_useLowEndPipeline = false;
         bool m_useDeferredPipeline = false;
+        bool m_useMultiViewXRPipeline = false;
         bool m_switchPipeline = false;
 
         AZ::Data::Instance<AZ::RPI::Material> m_materialOverrideInstance; //< Holds a copy of the material instance being used when m_enableMaterialOverride is true.

+ 9 - 0
Materials/BasePBR.material

@@ -0,0 +1,9 @@
+{
+    "materialType": "Materials/Types/BasePBR.materialtype",
+    "materialTypeVersion": 5,
+    "propertyValues": {
+        "baseColor.textureMap": "Textures/Default/default_basecolor.tif",
+        "normal.textureMap": "Textures/Default/default_normal.tif",
+        "roughness.textureMap": "Textures/Default/default_roughness.tif"
+    }
+}

+ 1 - 0
Registry/material_pipelines.setreg

@@ -5,6 +5,7 @@
                 "MaterialPipelineFiles": [
                     "@gemroot:Atom_Feature_Common@/Assets/Materials/Pipelines/MainPipeline/MainPipeline.materialpipeline",
                     "@gemroot:Atom_Feature_Common@/Assets/Materials/Pipelines/LowEndPipeline/LowEndPipeline.materialpipeline",
+                    "@gemroot:Atom_Feature_Common@/Assets/Materials/Pipelines/MultiView/MultiViewPipeline.materialpipeline",
                     "@projectroot@/Materials/Pipelines/PrototypeDeferredPipeline/DeferredPipeline.materialpipeline"
                 ]
             }