Graphics: Add new functions to get default material types/presets
This commit is contained in:
@@ -47,23 +47,7 @@ namespace Nz
|
||||
// Delete image to free memory
|
||||
image.reset();
|
||||
|
||||
std::shared_ptr<MaterialInstance> 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 = MaterialInstance::Instantiate(parameters.materialType);
|
||||
|
||||
if (enableAlphaTest && hasAlpha)
|
||||
materialInstance->SetValueProperty("AlphaTest", true);
|
||||
|
||||
@@ -251,7 +251,7 @@ namespace Nz
|
||||
shadowPass.states.faceCulling = FaceCulling::Front;
|
||||
settings.AddPass(shadowPassIndex, shadowPass);
|
||||
|
||||
m_defaultMaterials.basicMaterial = std::make_shared<Material>(std::move(settings), "BasicMaterial");
|
||||
m_defaultMaterials.materials[MaterialType::Basic].material = std::make_shared<Material>(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<Material>(std::move(settings), "PhysicallyBasedMaterial");
|
||||
m_defaultMaterials.materials[MaterialType::PhysicallyBased].material = std::make_shared<Material>(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<Material>(std::move(settings), "PhongMaterial");
|
||||
m_defaultMaterials.materials[MaterialType::Phong].material = std::make_shared<Material>(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()
|
||||
|
||||
@@ -192,6 +192,14 @@ namespace Nz
|
||||
return std::shared_ptr<Material>();
|
||||
}
|
||||
|
||||
std::shared_ptr<Material> 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> Material::LoadFromFile(const std::filesystem::path& filePath, const MaterialParams& params)
|
||||
{
|
||||
Graphics* graphics = Graphics::Instance();
|
||||
|
||||
@@ -345,6 +345,14 @@ namespace Nz
|
||||
OnTransferRequired(this);
|
||||
}
|
||||
|
||||
std::shared_ptr<MaterialInstance> 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> 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> MaterialInstance::Instantiate(MaterialType materialType, MaterialInstancePreset preset)
|
||||
{
|
||||
return GetDefault(materialType, preset)->Clone();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#include <Nazara/Graphics/Model.hpp>
|
||||
#include <Nazara/Graphics/ElementRendererRegistry.hpp>
|
||||
#include <Nazara/Graphics/GraphicalMesh.hpp>
|
||||
#include <Nazara/Graphics/Graphics.hpp>
|
||||
#include <Nazara/Graphics/MaterialInstance.hpp>
|
||||
#include <Nazara/Graphics/RenderSubmesh.hpp>
|
||||
#include <Nazara/Graphics/WorldInstance.hpp>
|
||||
@@ -17,13 +16,11 @@ namespace Nz
|
||||
Model::Model(std::shared_ptr<GraphicalMesh> 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,
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
#include <Nazara/Graphics/TextSprite.hpp>
|
||||
#include <Nazara/Graphics/ElementRendererRegistry.hpp>
|
||||
#include <Nazara/Graphics/Graphics.hpp>
|
||||
#include <Nazara/Graphics/MaterialInstance.hpp>
|
||||
#include <Nazara/Graphics/RenderSpriteChain.hpp>
|
||||
#include <Nazara/Graphics/WorldInstance.hpp>
|
||||
@@ -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<RenderElementOwner>& elements) const
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
#include <Nazara/Graphics/Tilemap.hpp>
|
||||
#include <Nazara/Graphics/ElementRendererRegistry.hpp>
|
||||
#include <Nazara/Graphics/Graphics.hpp>
|
||||
#include <Nazara/Graphics/RenderSpriteChain.hpp>
|
||||
#include <Nazara/Graphics/Debug.hpp>
|
||||
|
||||
@@ -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<MaterialInstance> defaultMaterialInstance = Graphics::Instance()->GetDefaultMaterials().basicDefault;
|
||||
std::shared_ptr<MaterialInstance> defaultMaterialInstance = MaterialInstance::GetDefault(MaterialType::Basic);
|
||||
for (auto& layer : m_layers)
|
||||
layer.material = defaultMaterialInstance;
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ namespace Nz
|
||||
|
||||
auto CreateMaterialFromTexture = [&](std::shared_ptr<Texture> texture)
|
||||
{
|
||||
std::shared_ptr<MaterialInstance> material = defaultBasicMaterial.basicMaterial->Instantiate();
|
||||
std::shared_ptr<MaterialInstance> material = MaterialInstance::Instantiate(MaterialType::Basic);
|
||||
material->DisablePass(depthPassIndex);
|
||||
material->UpdatePassStates(forwardPassIndex, [](RenderStates& renderStates)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user