From a2a0e6bd54862cb51e69fc27c0339bda9ff8cb4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 10 Aug 2021 10:36:16 +0200 Subject: [PATCH] Graphics: Add DepthMaterial --- examples/PhysicsDemo/main.cpp | 11 +- include/Nazara/Graphics.hpp | 1 + include/Nazara/Graphics/BasicMaterial.hpp | 9 +- include/Nazara/Graphics/DepthMaterial.hpp | 38 +++++ include/Nazara/Graphics/DepthMaterial.inl | 16 +++ include/Nazara/Graphics/MaterialSettings.hpp | 5 +- include/Nazara/Graphics/MaterialSettings.inl | 26 ++++ src/Nazara/Graphics/BasicMaterial.cpp | 130 ++++++++++-------- src/Nazara/Graphics/DepthMaterial.cpp | 44 ++++++ src/Nazara/Graphics/MaterialPipeline.cpp | 3 + .../Resources/Shaders/depth_material.nzsl | 3 +- 11 files changed, 213 insertions(+), 73 deletions(-) create mode 100644 include/Nazara/Graphics/DepthMaterial.hpp create mode 100644 include/Nazara/Graphics/DepthMaterial.inl create mode 100644 src/Nazara/Graphics/DepthMaterial.cpp rename bin/resources/depth_pass.nzsl => src/Nazara/Graphics/Resources/Shaders/depth_material.nzsl (94%) diff --git a/examples/PhysicsDemo/main.cpp b/examples/PhysicsDemo/main.cpp index 8b5ec3efd..0fee85707 100644 --- a/examples/PhysicsDemo/main.cpp +++ b/examples/PhysicsDemo/main.cpp @@ -77,14 +77,9 @@ int main() std::shared_ptr material = std::make_shared(); - auto customSettings = Nz::BasicMaterial::GetSettings()->GetBuilderData(); - customSettings.shaders.clear(); - customSettings.shaders.emplace_back(std::make_shared(Nz::ShaderStageType::Fragment | Nz::ShaderStageType::Vertex, Nz::ShaderLang::Parse(resourceDir / "depth_pass.nzsl"))); - - auto depthSettings = std::make_shared(std::move(customSettings)); - - std::shared_ptr depthPass = std::make_shared(depthSettings); + std::shared_ptr depthPass = std::make_shared(Nz::DepthMaterial::GetSettings()); depthPass->EnableDepthBuffer(true); + depthPass->EnableDepthClamp(true); depthPass->EnableFaceCulling(true); std::shared_ptr materialPass = std::make_shared(Nz::BasicMaterial::GetSettings()); @@ -104,7 +99,7 @@ int main() basicMat.SetDiffuseMap(Nz::Texture::LoadFromFile(resourceDir / "Spaceship/Texture/diffuse.png", texParams)); basicMat.SetDiffuseSampler(samplerInfo); - Nz::BasicMaterial basicMatDepth(*depthPass); + Nz::DepthMaterial basicMatDepth(*depthPass); basicMatDepth.SetAlphaMap(Nz::Texture::LoadFromFile(resourceDir / "alphatile.png", texParams)); std::shared_ptr model = std::make_shared(std::move(gfxMesh)); diff --git a/include/Nazara/Graphics.hpp b/include/Nazara/Graphics.hpp index 78a68da9c..0bfeb7b60 100644 --- a/include/Nazara/Graphics.hpp +++ b/include/Nazara/Graphics.hpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include diff --git a/include/Nazara/Graphics/BasicMaterial.hpp b/include/Nazara/Graphics/BasicMaterial.hpp index 4e2d27022..99acdf8c1 100644 --- a/include/Nazara/Graphics/BasicMaterial.hpp +++ b/include/Nazara/Graphics/BasicMaterial.hpp @@ -12,6 +12,8 @@ namespace Nz { + class FieldOffsets; + class NAZARA_GRAPHICS_API BasicMaterial { friend class MaterialPipeline; @@ -56,7 +58,7 @@ namespace Nz std::size_t totalSize; }; - private: + protected: struct OptionIndexes { std::size_t alphaTest; @@ -70,6 +72,11 @@ namespace Nz std::size_t diffuse; }; + static MaterialSettings::Builder Build(const UniformOffsets& offsets, std::vector defaultValues, std::vector> uberShaders, std::size_t* uniformBlockIndex = nullptr, OptionIndexes* optionIndexes = nullptr, TextureIndexes* textureIndexes = nullptr); + static std::vector> BuildShaders(); + static std::pair BuildUniformOffsets(); + + private: static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Graphics/DepthMaterial.hpp b/include/Nazara/Graphics/DepthMaterial.hpp new file mode 100644 index 000000000..7cb95be45 --- /dev/null +++ b/include/Nazara/Graphics/DepthMaterial.hpp @@ -0,0 +1,38 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Graphics module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_DEPTH_MATERIAL_HPP +#define NAZARA_DEPTH_MATERIAL_HPP + +#include +#include + +namespace Nz +{ + class NAZARA_GRAPHICS_API DepthMaterial : public BasicMaterial + { + friend class MaterialPipeline; + + public: + using BasicMaterial::BasicMaterial; + ~DepthMaterial() = default; + + static inline const std::shared_ptr& GetSettings(); + + protected: + static std::vector> BuildShaders(); + + private: + static bool Initialize(); + static void Uninitialize(); + + static std::shared_ptr s_materialSettings; + }; +} + +#include + +#endif diff --git a/include/Nazara/Graphics/DepthMaterial.inl b/include/Nazara/Graphics/DepthMaterial.inl new file mode 100644 index 000000000..9807b660f --- /dev/null +++ b/include/Nazara/Graphics/DepthMaterial.inl @@ -0,0 +1,16 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Graphics module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + inline const std::shared_ptr& DepthMaterial::GetSettings() + { + return s_materialSettings; + } +} + +#include diff --git a/include/Nazara/Graphics/MaterialSettings.hpp b/include/Nazara/Graphics/MaterialSettings.hpp index 98955f976..6f06f83cf 100644 --- a/include/Nazara/Graphics/MaterialSettings.hpp +++ b/include/Nazara/Graphics/MaterialSettings.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -19,8 +20,6 @@ namespace Nz { - class UberShader; - class MaterialSettings { public: @@ -56,6 +55,8 @@ namespace Nz static constexpr std::size_t InvalidIndex = std::numeric_limits::max(); + static void BuildOption(std::vector