From bb2f8d133eea10914d1d4e94bd35adb6bc785c13 Mon Sep 17 00:00:00 2001
From: Artur Wasmut <awasmut@uni-koblenz.de>
Date: Wed, 9 Jun 2021 01:14:54 +0200
Subject: [PATCH] WIP: pbrMaterial skeleton class.

---
 include/vkcv/ShaderProgram.hpp                |  3 +-
 modules/material/CMakeLists.txt               |  2 +
 .../vkcv/material/pbrMetallicRoughness.hpp    | 49 +++++++++++++++++++
 .../vkcv/material/pbrMetallicRoughness.cpp    | 30 ++++++++++++
 4 files changed, 83 insertions(+), 1 deletion(-)
 create mode 100644 modules/material/include/vkcv/material/pbrMetallicRoughness.hpp
 create mode 100644 modules/material/src/vkcv/material/pbrMetallicRoughness.cpp

diff --git a/include/vkcv/ShaderProgram.hpp b/include/vkcv/ShaderProgram.hpp
index 459125bb..896f84d3 100644
--- a/include/vkcv/ShaderProgram.hpp
+++ b/include/vkcv/ShaderProgram.hpp
@@ -22,7 +22,8 @@ namespace vkcv {
         TESS_EVAL,
         GEOMETRY,
         FRAGMENT,
-        COMPUTE
+        COMPUTE,
+        ALL
     };
 
     struct Shader
diff --git a/modules/material/CMakeLists.txt b/modules/material/CMakeLists.txt
index 660f59b4..c7b204db 100644
--- a/modules/material/CMakeLists.txt
+++ b/modules/material/CMakeLists.txt
@@ -12,6 +12,8 @@ set(vkcv_material_include ${PROJECT_SOURCE_DIR}/include)
 set(vkcv_material_sources
 		${vkcv_material_include}/vkcv/material/Material.hpp
 		${vkcv_material_source}/vkcv/material/Material.cpp
+		${vkcv_material_include}/vkcv/material/pbrMetallicRoughness.hpp
+		${vkcv_material_source}/vkcv/material/pbrMetallicRoughness.cpp
 )
 
 # adding source files to the module
diff --git a/modules/material/include/vkcv/material/pbrMetallicRoughness.hpp b/modules/material/include/vkcv/material/pbrMetallicRoughness.hpp
new file mode 100644
index 00000000..db8c200a
--- /dev/null
+++ b/modules/material/include/vkcv/material/pbrMetallicRoughness.hpp
@@ -0,0 +1,49 @@
+#pragma once
+
+#include <vector>
+
+#include "Material.hpp"
+#include "vkcv/Handles.hpp"
+#include "vkcv/DescriptorConfig.hpp"
+
+namespace vkcv
+{
+    class pbrMaterial : Material
+    {
+    public:
+        pbrMaterial() = delete;
+        pbrMaterial(const ImageHandle           &colorImg,
+                    const SamplerHandle         &colorSmp,
+                    const ImageHandle           &normalImg,
+                    const SamplerHandle         &normalSmp,
+                    const ImageHandle           &metRoughImg,
+                    const SamplerHandle         &metRoughSmp,
+                    const DescriptorSetHandle   &setHandle) noexcept;
+
+        const ImageHandle   m_ColorTexture;
+        const SamplerHandle m_ColorSampler;
+
+        const ImageHandle   m_NormalTexture;
+        const SamplerHandle m_NormalSampler;
+
+        const ImageHandle   m_MetRoughTexture;
+        const SamplerHandle m_MetRoughSampler;
+
+        // ImageHandle m_OcclusionTexture;
+        // SamplerHandle m_EmissiveTexture;
+
+        const DescriptorSetHandle m_DescriptorSetHandle;
+
+        /*
+        * Returns the material's necessary descriptor bindings which serves as its descriptor layout
+        * The binding is in the following order:
+        * 0 - diffuse texture
+        * 1 - diffuse sampler
+        * 2 - normal texture
+        * 3 - normal sampler
+        * 4 - metallic roughness texture
+        * 5 - metallic roughness sampler
+        */
+        static std::vector<DescriptorBinding> getDescriptorBindings() noexcept;
+    };
+}
\ No newline at end of file
diff --git a/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp b/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp
new file mode 100644
index 00000000..d644113a
--- /dev/null
+++ b/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp
@@ -0,0 +1,30 @@
+#include "vkcv/material/pbrMetallicRoughness.hpp"
+
+namespace vkcv
+{
+    pbrMaterial::pbrMaterial(const ImageHandle          &colorImg,
+                             const SamplerHandle        &colorSmp,
+                             const ImageHandle          &normalImg,
+                             const SamplerHandle        &normalSmp,
+                             const ImageHandle          &metRoughImg,
+                             const SamplerHandle        &metRoughSmp,
+                             const DescriptorSetHandle  &setHandle) noexcept :
+    m_ColorTexture(colorImg),
+    m_ColorSampler(colorSmp),
+    m_NormalTexture(normalImg),
+    m_NormalSampler(normalSmp),
+    m_MetRoughTexture(metRoughImg),
+    m_MetRoughSampler(metRoughSmp),
+    m_DescriptorSetHandle(setHandle)
+    {}
+
+    std::vector<DescriptorBinding> pbrMaterial::getDescriptorBindings() noexcept
+    {
+        return {{DescriptorType::IMAGE_SAMPLED, 1, ShaderStage::FRAGMENT},
+                {DescriptorType::SAMPLER      , 1, ShaderStage::FRAGMENT},
+                {DescriptorType::IMAGE_SAMPLED, 1, ShaderStage::FRAGMENT},
+                {DescriptorType::SAMPLER      , 1, ShaderStage::FRAGMENT},
+                {DescriptorType::IMAGE_SAMPLED, 1, ShaderStage::FRAGMENT},
+                {DescriptorType::SAMPLER      , 1, ShaderStage::FRAGMENT}};
+    }
+}
\ No newline at end of file
-- 
GitLab