From cf6fdf258f11e5b0b744f4e25219bb9d82798efa Mon Sep 17 00:00:00 2001 From: SirLynix Date: Tue, 8 Aug 2023 18:17:58 +0200 Subject: [PATCH] Graphics: Add new functions to get default material types/presets --- examples/PhysicallyBasedRendering/main.cpp | 4 +- examples/Physics2DDemo/main.cpp | 4 +- examples/PhysicsDemo/main.cpp | 6 +- examples/PhysicsPlayground/main.cpp | 10 ++-- examples/Showcase/main.cpp | 14 ++--- examples/WidgetDemo/main.cpp | 4 +- include/Nazara/Graphics/Enums.hpp | 17 +++++- include/Nazara/Graphics/Graphics.hpp | 12 ++-- include/Nazara/Graphics/Material.hpp | 1 + include/Nazara/Graphics/MaterialInstance.hpp | 4 +- src/Nazara/Graphics/Formats/TextureLoader.cpp | 18 +----- src/Nazara/Graphics/Graphics.cpp | 57 ++++++++++--------- src/Nazara/Graphics/Material.cpp | 8 +++ src/Nazara/Graphics/MaterialInstance.cpp | 13 +++++ src/Nazara/Graphics/Model.cpp | 5 +- src/Nazara/Graphics/TextSprite.cpp | 3 +- src/Nazara/Graphics/Tilemap.cpp | 3 +- src/Nazara/Widgets/DefaultWidgetTheme.cpp | 2 +- src/Nazara/Widgets/Widgets.cpp | 37 ++++-------- tests/GraphicsTest/main.cpp | 6 +- 20 files changed, 111 insertions(+), 117 deletions(-) diff --git a/examples/PhysicallyBasedRendering/main.cpp b/examples/PhysicallyBasedRendering/main.cpp index 68956e09d..880e4a158 100644 --- a/examples/PhysicallyBasedRendering/main.cpp +++ b/examples/PhysicallyBasedRendering/main.cpp @@ -46,9 +46,7 @@ int main(int argc, char* argv[]) std::shared_ptr normalMap = Nz::Texture::LoadFromFile(resourceDir / "Rusty/rustediron2_normal.png", texParams); - std::shared_ptr material = Nz::Graphics::Instance()->GetDefaultMaterials().pbrMaterial; - - std::shared_ptr materialInstance = std::make_shared(material); + std::shared_ptr materialInstance = Nz::MaterialInstance::Instantiate(Nz::MaterialType::PhysicallyBased); materialInstance->SetTextureProperty("AlphaMap", Nz::Texture::LoadFromFile(resourceDir / "alphatile.png", texParams)); materialInstance->SetTextureProperty("BaseColorMap", Nz::Texture::LoadFromFile(resourceDir / "Rusty/rustediron2_basecolor.png", texParams)); materialInstance->SetTextureProperty("MetallicMap", Nz::Texture::LoadFromFile(resourceDir / "Rusty/rustediron2_metallic.png", texParams)); diff --git a/examples/Physics2DDemo/main.cpp b/examples/Physics2DDemo/main.cpp index 899baa92f..27debfb5d 100644 --- a/examples/Physics2DDemo/main.cpp +++ b/examples/Physics2DDemo/main.cpp @@ -56,7 +56,7 @@ int main(int argc, char* argv[]) texParams.renderDevice = device; texParams.loadFormat = Nz::PixelFormat::RGBA8; - std::shared_ptr spriteMaterial = Nz::Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); + std::shared_ptr spriteMaterial = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Phong); spriteMaterial->SetTextureProperty("BaseColorMap", Nz::Texture::LoadFromFile(resourceDir / "box.png", texParams)); Nz::ChipmunkRigidBody2DComponent::DynamicSettings boxSettings; @@ -89,7 +89,7 @@ int main(int argc, char* argv[]) tilemap->SetOrigin({ 0.5f, 0.5f }); for (std::size_t i = 0; i < 18; ++i) { - std::shared_ptr tileMaterial = Nz::Graphics::Instance()->GetDefaultMaterials().basicTransparent->Clone(); + std::shared_ptr tileMaterial = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Basic, Nz::MaterialInstancePreset::Transparent); tileMaterial->SetTextureProperty("BaseColorMap", Nz::Texture::LoadFromFile(resourceDir / "tiles" / (std::to_string(i + 1) + ".png"), texParams)); tilemap->SetMaterial(i, tileMaterial); diff --git a/examples/PhysicsDemo/main.cpp b/examples/PhysicsDemo/main.cpp index b8cb1ac6c..b1a6513a0 100644 --- a/examples/PhysicsDemo/main.cpp +++ b/examples/PhysicsDemo/main.cpp @@ -60,7 +60,7 @@ int main(int argc, char* argv[]) texParams.renderDevice = device; texParams.loadFormat = Nz::PixelFormat::RGBA8_SRGB; - std::shared_ptr material = Nz::Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); + std::shared_ptr material = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Phong); for (std::string_view passName : { "DepthPass", "ForwardPass" }) { material->UpdatePassStates(passName, [](Nz::RenderStates& states) @@ -77,7 +77,7 @@ int main(int argc, char* argv[]) for (std::size_t i = 0; i < model->GetSubMeshCount(); ++i) model->SetMaterial(i, material); - std::shared_ptr textMaterial = Nz::Graphics::Instance()->GetDefaultMaterials().basicTransparent->Clone(); + std::shared_ptr textMaterial = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Basic, Nz::MaterialInstancePreset::Transparent); textMaterial->UpdatePassFlags("ForwardPass", Nz::MaterialPassFlag::SortByDistance); textMaterial->UpdatePassStates("ForwardPass", [](Nz::RenderStates& states) { @@ -103,7 +103,7 @@ int main(int argc, char* argv[]) auto shipCollider = std::make_shared(vertices, vertexMapper.GetVertexCount()); - std::shared_ptr colliderMat = Nz::Graphics::Instance()->GetDefaultMaterials().basicMaterial->Instantiate(); + std::shared_ptr colliderMat = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Basic); colliderMat->SetValueProperty("BaseColor", Nz::Color::Green()); colliderMat->UpdatePassesStates([](Nz::RenderStates& states) { diff --git a/examples/PhysicsPlayground/main.cpp b/examples/PhysicsPlayground/main.cpp index 6145ddbf6..44207df14 100644 --- a/examples/PhysicsPlayground/main.cpp +++ b/examples/PhysicsPlayground/main.cpp @@ -60,7 +60,7 @@ int main(int argc, char* argv[]) Nz::Vector3f target = Nz::Vector3f::Zero(); - std::shared_ptr colliderMat = Nz::Graphics::Instance()->GetDefaultMaterials().basicMaterial->Instantiate(); + std::shared_ptr colliderMat = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Basic); colliderMat->SetValueProperty("BaseColor", Nz::Color::Green()); colliderMat->UpdatePassesStates([](Nz::RenderStates& states) { @@ -77,7 +77,7 @@ int main(int argc, char* argv[]) planeSampler.wrapModeU = Nz::SamplerWrap::Repeat; planeSampler.wrapModeV = Nz::SamplerWrap::Repeat; - std::shared_ptr boxMat = Nz::Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); + std::shared_ptr boxMat = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Phong); boxMat->SetTextureProperty("BaseColorMap", fs.Load("assets/dev_grey.png"), planeSampler); boxMat->DisablePass("ShadowPass"); boxMat->UpdatePassesStates([&](Nz::RenderStates& states) @@ -168,7 +168,7 @@ int main(int argc, char* argv[]) entt::handle ballEntity = world.CreateEntity(); - std::shared_ptr ballMaterial = Nz::Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); + std::shared_ptr ballMaterial = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Phong); ballMaterial->SetValueProperty("BaseColor", Nz::Color::FromHSV(colorDis(rd), 1.f, 1.f)); std::shared_ptr sphereModel = std::make_shared(sphereMesh); @@ -208,7 +208,7 @@ int main(int argc, char* argv[]) entt::handle boxEntity = world.CreateEntity(); - std::shared_ptr boxMaterial = Nz::Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); + std::shared_ptr boxMaterial = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Phong); boxMaterial->SetValueProperty("BaseColor", Nz::Color::FromHSV(colorDis(rd), 1.f, 1.f)); std::shared_ptr sphereModel = std::make_shared(boxMesh); @@ -264,7 +264,7 @@ int main(int argc, char* argv[]) Nz::TextureSamplerInfo samplerInfo; samplerInfo.anisotropyLevel = 8; - std::shared_ptr material = Nz::Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); + std::shared_ptr material = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Phong); Nz::TextureParams texParams; texParams.loadFormat = Nz::PixelFormat::RGBA8_SRGB; diff --git a/examples/Showcase/main.cpp b/examples/Showcase/main.cpp index 209641cac..f56f03d1b 100644 --- a/examples/Showcase/main.cpp +++ b/examples/Showcase/main.cpp @@ -83,7 +83,7 @@ int main(int argc, char* argv[]) std::shared_ptr colliderMesh = Nz::Mesh::Build(playerCollider->GenerateDebugMesh()); std::shared_ptr colliderGraphicalMesh = Nz::GraphicalMesh::BuildFromMesh(*colliderMesh); - std::shared_ptr colliderMat = Nz::Graphics::Instance()->GetDefaultMaterials().basicMaterial->Instantiate(); + std::shared_ptr colliderMat = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Basic); colliderMat->SetValueProperty("BaseColor", Nz::Color::Green()); colliderMat->UpdatePassesStates([](Nz::RenderStates& states) { @@ -155,14 +155,14 @@ int main(int argc, char* argv[]) if (!matPath.empty()) { Nz::MaterialInstanceParams params; - params.lightingType = Nz::MaterialLightingType::Phong; + params.materialType = Nz::MaterialType::Phong; if (alphaMaterials.test(i)) params.custom.SetParameter("EnableAlphaBlending", true); materials[i] = Nz::MaterialInstance::LoadFromFile(matPath, params); } else - materials[i] = Nz::Graphics::Instance()->GetDefaultMaterials().basicDefault; + materials[i] = Nz::MaterialInstance::GetDefault(Nz::MaterialType::Basic); } for (std::size_t i = 0; i < bobMesh->GetSubMeshCount(); ++i) @@ -246,7 +246,7 @@ int main(int argc, char* argv[]) Nz::TextureParams srgbTexParams; srgbTexParams.loadFormat = Nz::PixelFormat::RGBA8_SRGB; - std::shared_ptr sphereMat = Nz::Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); + std::shared_ptr sphereMat = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Phong); sphereMat->SetTextureProperty("BaseColorMap", fs.Load("assets/Rusty/rustediron2_basecolor.png", srgbTexParams)); std::shared_ptr sphereModel = std::make_shared(std::move(gfxMesh)); @@ -288,7 +288,7 @@ int main(int argc, char* argv[]) } } - std::shared_ptr textMat = Nz::Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); + std::shared_ptr textMat = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Phong); textMat->UpdatePassesStates([](Nz::RenderStates& renderStates) { renderStates.faceCulling = Nz::FaceCulling::None; @@ -338,7 +338,7 @@ int main(int argc, char* argv[]) planeSampler.wrapModeU = Nz::SamplerWrap::Repeat; planeSampler.wrapModeV = Nz::SamplerWrap::Repeat; - std::shared_ptr planeMat = Nz::Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); + std::shared_ptr planeMat = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Phong); planeMat->SetTextureProperty("BaseColorMap", fs.Load("assets/dev_grey.png"), planeSampler); std::shared_ptr planeModel = std::make_shared(std::move(planeMeshGfx)); @@ -369,7 +369,7 @@ int main(int argc, char* argv[]) std::shared_ptr colliderModel; { - std::shared_ptr colliderMat = Nz::Graphics::Instance()->GetDefaultMaterials().basicMaterial->Instantiate(); + std::shared_ptr colliderMat = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Basic); colliderMat->SetValueProperty("BaseColor", Nz::Color::Green()); colliderMat->UpdatePassesStates([](Nz::RenderStates& states) { diff --git a/examples/WidgetDemo/main.cpp b/examples/WidgetDemo/main.cpp index 3e636bc08..616b2b37f 100644 --- a/examples/WidgetDemo/main.cpp +++ b/examples/WidgetDemo/main.cpp @@ -52,12 +52,10 @@ int main(int argc, char* argv[]) labelWidget->UpdateText(Nz::SimpleTextDrawer::Draw("You clicked the button " + std::to_string(++clickCount) + " times", 72)); }); - std::shared_ptr material = Nz::Graphics::Instance()->GetDefaultMaterials().basicMaterial; - Nz::TextureSamplerInfo samplerInfo; samplerInfo.anisotropyLevel = 8; - std::shared_ptr materialInstance = material->Instantiate(); + std::shared_ptr materialInstance = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Basic); materialInstance->SetTextureProperty("BaseColorMap", fs.Load("assets/lynix.jpg")); Nz::ImageWidget* imageWidget = canvas2D.Add(materialInstance); diff --git a/include/Nazara/Graphics/Enums.hpp b/include/Nazara/Graphics/Enums.hpp index 3631357cd..51c9892e8 100644 --- a/include/Nazara/Graphics/Enums.hpp +++ b/include/Nazara/Graphics/Enums.hpp @@ -62,11 +62,22 @@ namespace Nz UInt4 }; - enum class MaterialLightingType + enum class MaterialInstancePreset { - None, + Default, + NoDepth, + Transparent, + + Max = Transparent + }; + + enum class MaterialType + { + Basic, Phong, - PhysicallyBased + PhysicallyBased, + + Max = PhysicallyBased }; enum class MaterialPassFlag diff --git a/include/Nazara/Graphics/Graphics.hpp b/include/Nazara/Graphics/Graphics.hpp index 45a88573e..cbc0a6bc0 100644 --- a/include/Nazara/Graphics/Graphics.hpp +++ b/include/Nazara/Graphics/Graphics.hpp @@ -70,13 +70,13 @@ namespace Nz struct DefaultMaterials { - std::shared_ptr basicMaterial; - std::shared_ptr phongMaterial; - std::shared_ptr pbrMaterial; + struct MaterialData + { + std::shared_ptr material; + EnumArray> presets; + }; - std::shared_ptr basicDefault; - std::shared_ptr basicNoDepth; - std::shared_ptr basicTransparent; + EnumArray materials; }; struct DefaultTextures diff --git a/include/Nazara/Graphics/Material.hpp b/include/Nazara/Graphics/Material.hpp index 45e3c4ead..3c4fb34b4 100644 --- a/include/Nazara/Graphics/Material.hpp +++ b/include/Nazara/Graphics/Material.hpp @@ -65,6 +65,7 @@ namespace Nz std::shared_ptr Instantiate() const; static std::shared_ptr Build(const ParameterList& materialData); + static std::shared_ptr Get(MaterialType lightingType); static std::shared_ptr LoadFromFile(const std::filesystem::path& filePath, const MaterialParams& params = MaterialParams()); static std::shared_ptr LoadFromMemory(const void* data, std::size_t size, const MaterialParams& params = MaterialParams()); static std::shared_ptr LoadFromStream(Stream& stream, const MaterialParams& params = MaterialParams()); diff --git a/include/Nazara/Graphics/MaterialInstance.hpp b/include/Nazara/Graphics/MaterialInstance.hpp index 7118e7e95..2647a65d9 100644 --- a/include/Nazara/Graphics/MaterialInstance.hpp +++ b/include/Nazara/Graphics/MaterialInstance.hpp @@ -24,7 +24,7 @@ namespace Nz { struct NAZARA_GRAPHICS_API MaterialInstanceParams : ResourceParameters { - MaterialLightingType lightingType = MaterialLightingType::None; + MaterialType materialType = MaterialType::Basic; bool IsValid() const; }; @@ -115,9 +115,11 @@ namespace Nz static constexpr std::size_t InvalidPropertyIndex = MaterialSettings::InvalidPropertyIndex; + static std::shared_ptr GetDefault(MaterialType materialType, MaterialInstancePreset preset = MaterialInstancePreset::Default); static std::shared_ptr LoadFromFile(const std::filesystem::path& filePath, const MaterialInstanceParams& params = MaterialInstanceParams()); static std::shared_ptr LoadFromMemory(const void* data, std::size_t size, const MaterialInstanceParams& params = MaterialInstanceParams()); static std::shared_ptr LoadFromStream(Stream& stream, const MaterialInstanceParams& params = MaterialInstanceParams()); + static std::shared_ptr Instantiate(MaterialType materialType, MaterialInstancePreset preset = MaterialInstancePreset::Default); NazaraSignal(OnMaterialInstancePipelineInvalidated, const MaterialInstance* /*matInstance*/, std::size_t /*passIndex*/); NazaraSignal(OnMaterialInstanceShaderBindingInvalidated, const MaterialInstance* /*matInstance*/); diff --git a/src/Nazara/Graphics/Formats/TextureLoader.cpp b/src/Nazara/Graphics/Formats/TextureLoader.cpp index c60a002ac..0cf6538fd 100644 --- a/src/Nazara/Graphics/Formats/TextureLoader.cpp +++ b/src/Nazara/Graphics/Formats/TextureLoader.cpp @@ -47,23 +47,7 @@ namespace Nz // Delete image to free memory image.reset(); - std::shared_ptr materialInstance; - switch (parameters.lightingType) - { - case MaterialLightingType::Phong: - materialInstance = Graphics::Instance()->GetDefaultMaterials().phongMaterial->Instantiate(); - break; - - case MaterialLightingType::PhysicallyBased: - materialInstance = Graphics::Instance()->GetDefaultMaterials().pbrMaterial->Instantiate(); - break; - - case MaterialLightingType::None: - break; - } - - if (!materialInstance) - materialInstance = Graphics::Instance()->GetDefaultMaterials().basicMaterial->Instantiate(); + std::shared_ptr materialInstance = MaterialInstance::Instantiate(parameters.materialType); if (enableAlphaTest && hasAlpha) materialInstance->SetValueProperty("AlphaTest", true); diff --git a/src/Nazara/Graphics/Graphics.cpp b/src/Nazara/Graphics/Graphics.cpp index 5a45ebb0c..e27f5b1f8 100644 --- a/src/Nazara/Graphics/Graphics.cpp +++ b/src/Nazara/Graphics/Graphics.cpp @@ -251,7 +251,7 @@ namespace Nz shadowPass.states.faceCulling = FaceCulling::Front; settings.AddPass(shadowPassIndex, shadowPass); - m_defaultMaterials.basicMaterial = std::make_shared(std::move(settings), "BasicMaterial"); + m_defaultMaterials.materials[MaterialType::Basic].material = std::make_shared(std::move(settings), "BasicMaterial"); } // PbrMaterial @@ -273,7 +273,7 @@ namespace Nz shadowPass.states.faceCulling = FaceCulling::Front; settings.AddPass(shadowPassIndex, shadowPass); - m_defaultMaterials.pbrMaterial = std::make_shared(std::move(settings), "PhysicallyBasedMaterial"); + m_defaultMaterials.materials[MaterialType::PhysicallyBased].material = std::make_shared(std::move(settings), "PhysicallyBasedMaterial"); } // PhongMaterial @@ -298,35 +298,38 @@ namespace Nz shadowPass.states.depthBiasSlopeFactor = 0.05f; settings.AddPass(shadowPassIndex, shadowPass); - m_defaultMaterials.phongMaterial = std::make_shared(std::move(settings), "PhongMaterial"); + m_defaultMaterials.materials[MaterialType::Phong].material = std::make_shared(std::move(settings), "PhongMaterial"); } - m_defaultMaterials.basicDefault = m_defaultMaterials.basicMaterial->GetDefaultInstance(); - - m_defaultMaterials.basicNoDepth = m_defaultMaterials.basicMaterial->Instantiate(); - m_defaultMaterials.basicNoDepth->DisablePass(depthPassIndex); - m_defaultMaterials.basicNoDepth->DisablePass(shadowPassIndex); - m_defaultMaterials.basicNoDepth->UpdatePassStates(forwardPassIndex, [](RenderStates& states) + for (auto&& [materialType, materialData] : m_defaultMaterials.materials.iter_kv()) { - states.depthBuffer = false; - }); + materialData.presets[MaterialInstancePreset::Default] = materialData.material->GetDefaultInstance(); - m_defaultMaterials.basicTransparent = m_defaultMaterials.basicMaterial->Instantiate(); - m_defaultMaterials.basicTransparent->DisablePass(depthPassIndex); - m_defaultMaterials.basicTransparent->DisablePass(shadowPassIndex); - m_defaultMaterials.basicTransparent->UpdatePassFlags(forwardPassIndex, MaterialPassFlag::SortByDistance); - m_defaultMaterials.basicTransparent->UpdatePassStates(forwardPassIndex, [](RenderStates& renderStates) - { - renderStates.depthBuffer = true; - renderStates.depthWrite = false; - renderStates.blending = true; - renderStates.blend.modeColor = BlendEquation::Add; - renderStates.blend.modeAlpha = BlendEquation::Add; - renderStates.blend.srcColor = BlendFunc::SrcAlpha; - renderStates.blend.dstColor = BlendFunc::InvSrcAlpha; - renderStates.blend.srcAlpha = BlendFunc::One; - renderStates.blend.dstAlpha = BlendFunc::One; - }); + materialData.presets[MaterialInstancePreset::NoDepth] = materialData.material->Instantiate(); + materialData.presets[MaterialInstancePreset::NoDepth]->DisablePass(depthPassIndex); + materialData.presets[MaterialInstancePreset::NoDepth]->DisablePass(shadowPassIndex); + materialData.presets[MaterialInstancePreset::NoDepth]->UpdatePassStates(forwardPassIndex, [](RenderStates& states) + { + states.depthBuffer = false; + }); + + materialData.presets[MaterialInstancePreset::Transparent] = materialData.material->Instantiate(); + materialData.presets[MaterialInstancePreset::Transparent]->DisablePass(depthPassIndex); + materialData.presets[MaterialInstancePreset::Transparent]->DisablePass(shadowPassIndex); + materialData.presets[MaterialInstancePreset::Transparent]->UpdatePassFlags(forwardPassIndex, MaterialPassFlag::SortByDistance); + materialData.presets[MaterialInstancePreset::Transparent]->UpdatePassStates(forwardPassIndex, [](RenderStates& renderStates) + { + renderStates.depthBuffer = true; + renderStates.depthWrite = false; + renderStates.blending = true; + renderStates.blend.modeColor = BlendEquation::Add; + renderStates.blend.modeAlpha = BlendEquation::Add; + renderStates.blend.srcColor = BlendFunc::SrcAlpha; + renderStates.blend.dstColor = BlendFunc::InvSrcAlpha; + renderStates.blend.srcAlpha = BlendFunc::One; + renderStates.blend.dstAlpha = BlendFunc::One; + }); + } } void Graphics::BuildDefaultTextures() diff --git a/src/Nazara/Graphics/Material.cpp b/src/Nazara/Graphics/Material.cpp index fec5e6478..339e38651 100644 --- a/src/Nazara/Graphics/Material.cpp +++ b/src/Nazara/Graphics/Material.cpp @@ -192,6 +192,14 @@ namespace Nz return std::shared_ptr(); } + std::shared_ptr Material::Get(MaterialType lightingType) + { + Graphics* graphics = Graphics::Instance(); + NazaraAssert(graphics, "Utility module has not been initialized"); + + return graphics->GetDefaultMaterials().materials[lightingType].material; + } + std::shared_ptr Material::LoadFromFile(const std::filesystem::path& filePath, const MaterialParams& params) { Graphics* graphics = Graphics::Instance(); diff --git a/src/Nazara/Graphics/MaterialInstance.cpp b/src/Nazara/Graphics/MaterialInstance.cpp index 61a86d9ce..4d3158cad 100644 --- a/src/Nazara/Graphics/MaterialInstance.cpp +++ b/src/Nazara/Graphics/MaterialInstance.cpp @@ -345,6 +345,14 @@ namespace Nz OnTransferRequired(this); } + std::shared_ptr MaterialInstance::GetDefault(MaterialType materialType, MaterialInstancePreset preset) + { + Graphics* graphics = Graphics::Instance(); + NazaraAssert(graphics, "Utility module has not been initialized"); + + return graphics->GetDefaultMaterials().materials[materialType].presets[preset]; + } + std::shared_ptr MaterialInstance::LoadFromFile(const std::filesystem::path& filePath, const MaterialInstanceParams& params) { Graphics* graphics = Graphics::Instance(); @@ -368,4 +376,9 @@ namespace Nz return graphics->GetMaterialInstanceLoader().LoadFromStream(stream, params); } + + std::shared_ptr MaterialInstance::Instantiate(MaterialType materialType, MaterialInstancePreset preset) + { + return GetDefault(materialType, preset)->Clone(); + } } diff --git a/src/Nazara/Graphics/Model.cpp b/src/Nazara/Graphics/Model.cpp index 4b289dad0..fc273fb0b 100644 --- a/src/Nazara/Graphics/Model.cpp +++ b/src/Nazara/Graphics/Model.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -17,13 +16,11 @@ namespace Nz Model::Model(std::shared_ptr graphicalMesh) : m_graphicalMesh(std::move(graphicalMesh)) { - Graphics* graphics = Graphics::Instance(); - m_submeshes.reserve(m_graphicalMesh->GetSubMeshCount()); for (std::size_t i = 0; i < m_graphicalMesh->GetSubMeshCount(); ++i) { auto& subMeshData = m_submeshes.emplace_back(); - subMeshData.material = graphics->GetDefaultMaterials().basicDefault; + subMeshData.material = MaterialInstance::GetDefault(MaterialType::Basic); subMeshData.vertexBufferData = { { 0, diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index 2c410d7bd..71a96706b 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include #include @@ -19,7 +18,7 @@ namespace Nz m_material(std::move(material)) { if (!m_material) - m_material = Graphics::Instance()->GetDefaultMaterials().basicTransparent; + m_material = MaterialInstance::GetDefault(MaterialType::Basic, MaterialInstancePreset::Transparent); } void TextSprite::BuildElement(ElementRendererRegistry& registry, const ElementData& elementData, std::size_t passIndex, std::vector& elements) const diff --git a/src/Nazara/Graphics/Tilemap.cpp b/src/Nazara/Graphics/Tilemap.cpp index 0ef6c4897..1f4ff8f6b 100644 --- a/src/Nazara/Graphics/Tilemap.cpp +++ b/src/Nazara/Graphics/Tilemap.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include @@ -35,7 +34,7 @@ namespace Nz NazaraAssert(m_tileSize.x > 0 && m_tileSize.y > 0, "Invalid tile size"); NazaraAssert(m_layers.size() != 0U, "Invalid material count"); - std::shared_ptr defaultMaterialInstance = Graphics::Instance()->GetDefaultMaterials().basicDefault; + std::shared_ptr defaultMaterialInstance = MaterialInstance::GetDefault(MaterialType::Basic); for (auto& layer : m_layers) layer.material = defaultMaterialInstance; diff --git a/src/Nazara/Widgets/DefaultWidgetTheme.cpp b/src/Nazara/Widgets/DefaultWidgetTheme.cpp index cb417e084..14e4a4a73 100644 --- a/src/Nazara/Widgets/DefaultWidgetTheme.cpp +++ b/src/Nazara/Widgets/DefaultWidgetTheme.cpp @@ -132,7 +132,7 @@ namespace Nz auto CreateMaterialFromTexture = [&](std::shared_ptr texture) { - std::shared_ptr material = defaultBasicMaterial.basicMaterial->Instantiate(); + std::shared_ptr material = MaterialInstance::Instantiate(MaterialType::Basic); material->DisablePass(depthPassIndex); material->UpdatePassStates(forwardPassIndex, [](RenderStates& renderStates) { diff --git a/src/Nazara/Widgets/Widgets.cpp b/src/Nazara/Widgets/Widgets.cpp index 312960c39..35c58a0d7 100644 --- a/src/Nazara/Widgets/Widgets.cpp +++ b/src/Nazara/Widgets/Widgets.cpp @@ -22,35 +22,18 @@ namespace Nz void Widgets::CreateDefaultMaterials() { - const auto& defaultMaterials = Graphics::Instance()->GetDefaultMaterials(); - - const MaterialPassRegistry& materialPassRegistry = Graphics::Instance()->GetMaterialPassRegistry(); - std::size_t depthPassIndex = materialPassRegistry.GetPassIndex("DepthPass"); - std::size_t forwardPassIndex = materialPassRegistry.GetPassIndex("ForwardPass"); - - m_opaqueMaterial = defaultMaterials.basicMaterial->Instantiate(); - for (std::size_t passIndex : { depthPassIndex, forwardPassIndex }) + m_opaqueMaterial = MaterialInstance::Instantiate(MaterialType::Basic); + m_opaqueMaterial->UpdatePassesStates([](RenderStates& renderStates) { - m_opaqueMaterial->UpdatePassStates(passIndex, [](RenderStates& renderStates) - { - renderStates.scissorTest = true; - }); - } - - m_transparentMaterial = defaultMaterials.basicMaterial->Instantiate(); - m_transparentMaterial->DisablePass(depthPassIndex); - - m_transparentMaterial->UpdatePassStates(forwardPassIndex, [](RenderStates& renderStates) - { - renderStates.blending = true; - renderStates.blend.modeColor = BlendEquation::Add; - renderStates.blend.modeAlpha = BlendEquation::Add; - renderStates.blend.srcColor = BlendFunc::SrcAlpha; - renderStates.blend.dstColor = BlendFunc::InvSrcAlpha; - renderStates.blend.srcAlpha = BlendFunc::One; - renderStates.blend.dstAlpha = BlendFunc::One; - renderStates.depthWrite = false; renderStates.scissorTest = true; + return true; + }); + + m_transparentMaterial = MaterialInstance::Instantiate(MaterialType::Basic, MaterialInstancePreset::Transparent); + m_transparentMaterial->UpdatePassesStates([](RenderStates& renderStates) + { + renderStates.scissorTest = true; + return true; }); } diff --git a/tests/GraphicsTest/main.cpp b/tests/GraphicsTest/main.cpp index 51ba0d417..5087295dd 100644 --- a/tests/GraphicsTest/main.cpp +++ b/tests/GraphicsTest/main.cpp @@ -63,13 +63,11 @@ int main() std::shared_ptr diffuseTexture = Nz::Texture::LoadFromFile(resourceDir / "Spaceship/Texture/diffuse.png", texParams); - std::shared_ptr material = Nz::Graphics::Instance()->GetDefaultMaterials().basicMaterial; - - std::shared_ptr materialInstance = std::make_shared(material); + std::shared_ptr materialInstance = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Basic); materialInstance->SetTextureProperty(0, diffuseTexture); materialInstance->SetValueProperty(0, Nz::Color::White()); - std::shared_ptr materialInstance2 = std::make_shared(material); + std::shared_ptr materialInstance2 = Nz::MaterialInstance::Instantiate(Nz::MaterialType::Basic); materialInstance2->SetValueProperty(0, Nz::Color::Green()); Nz::Model model(std::move(gfxMesh));