Graphics/MaterialInstance: Add Build method
This commit is contained in:
parent
7ae76b32b0
commit
e8a362b695
|
|
@ -65,7 +65,6 @@ namespace Nz
|
||||||
|
|
||||||
std::shared_ptr<MaterialInstance> Instantiate() const;
|
std::shared_ptr<MaterialInstance> Instantiate() const;
|
||||||
|
|
||||||
static std::shared_ptr<Material> Build(const ParameterList& materialData);
|
|
||||||
static std::shared_ptr<Material> Get(MaterialType lightingType);
|
static std::shared_ptr<Material> Get(MaterialType lightingType);
|
||||||
static std::shared_ptr<Material> LoadFromFile(const std::filesystem::path& filePath, const MaterialParams& params = MaterialParams());
|
static std::shared_ptr<Material> LoadFromFile(const std::filesystem::path& filePath, const MaterialParams& params = MaterialParams());
|
||||||
static std::shared_ptr<Material> LoadFromMemory(const void* data, std::size_t size, const MaterialParams& params = MaterialParams());
|
static std::shared_ptr<Material> LoadFromMemory(const void* data, std::size_t size, const MaterialParams& params = MaterialParams());
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,7 @@ namespace Nz
|
||||||
|
|
||||||
static constexpr std::size_t InvalidPropertyIndex = MaterialSettings::InvalidPropertyIndex;
|
static constexpr std::size_t InvalidPropertyIndex = MaterialSettings::InvalidPropertyIndex;
|
||||||
|
|
||||||
|
static std::shared_ptr<MaterialInstance> Build(const ParameterList& materialData);
|
||||||
static std::shared_ptr<MaterialInstance> GetDefault(MaterialType materialType, MaterialInstancePreset preset = MaterialInstancePreset::Default);
|
static std::shared_ptr<MaterialInstance> GetDefault(MaterialType materialType, MaterialInstancePreset preset = MaterialInstancePreset::Default);
|
||||||
static std::shared_ptr<MaterialInstance> LoadFromFile(const std::filesystem::path& filePath, const MaterialInstanceParams& params = MaterialInstanceParams());
|
static std::shared_ptr<MaterialInstance> LoadFromFile(const std::filesystem::path& filePath, const MaterialInstanceParams& params = MaterialInstanceParams());
|
||||||
static std::shared_ptr<MaterialInstance> LoadFromMemory(const void* data, std::size_t size, const MaterialInstanceParams& params = MaterialInstanceParams());
|
static std::shared_ptr<MaterialInstance> LoadFromMemory(const void* data, std::size_t size, const MaterialInstanceParams& params = MaterialInstanceParams());
|
||||||
|
|
|
||||||
|
|
@ -199,11 +199,6 @@ namespace Nz
|
||||||
return std::make_shared<MaterialInstance>(shared_from_this());
|
return std::make_shared<MaterialInstance>(shared_from_this());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Material> Material::Build(const ParameterList& materialData)
|
|
||||||
{
|
|
||||||
return std::shared_ptr<Material>();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<Material> Material::Get(MaterialType lightingType)
|
std::shared_ptr<Material> Material::Get(MaterialType lightingType)
|
||||||
{
|
{
|
||||||
Graphics* graphics = Graphics::Instance();
|
Graphics* graphics = Graphics::Instance();
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
#include <Nazara/Renderer/CommandBufferBuilder.hpp>
|
#include <Nazara/Renderer/CommandBufferBuilder.hpp>
|
||||||
#include <Nazara/Renderer/RenderResources.hpp>
|
#include <Nazara/Renderer/RenderResources.hpp>
|
||||||
#include <Nazara/Renderer/UploadPool.hpp>
|
#include <Nazara/Renderer/UploadPool.hpp>
|
||||||
|
#include <Nazara/Utility/MaterialData.hpp>
|
||||||
#include <Nazara/Graphics/Debug.hpp>
|
#include <Nazara/Graphics/Debug.hpp>
|
||||||
|
|
||||||
namespace Nz
|
namespace Nz
|
||||||
|
|
@ -345,6 +346,105 @@ namespace Nz
|
||||||
OnTransferRequired(this);
|
OnTransferRequired(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<MaterialInstance> MaterialInstance::Build(const ParameterList& materialData)
|
||||||
|
{
|
||||||
|
MaterialType matType = MaterialType::Basic;
|
||||||
|
if (auto value = materialData.GetStringViewParameter(MaterialData::Type))
|
||||||
|
{
|
||||||
|
std::string_view valueStr = value.GetValue();
|
||||||
|
if (valueStr == "Basic")
|
||||||
|
matType = MaterialType::Basic;
|
||||||
|
else if (valueStr == "Phong")
|
||||||
|
matType = MaterialType::Phong;
|
||||||
|
else if (valueStr == "PhysicallyBased")
|
||||||
|
matType = MaterialType::PhysicallyBased;
|
||||||
|
else
|
||||||
|
NazaraWarningFmt("unknown material type: {}", valueStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<MaterialInstance> matInstance = Instantiate(matType, MaterialInstancePreset::Default);
|
||||||
|
|
||||||
|
auto ConvertBool = [&](const char* paramKey, std::string_view matKey)
|
||||||
|
{
|
||||||
|
if (auto value = materialData.GetBooleanParameter(paramKey))
|
||||||
|
matInstance->SetValueProperty(matKey, value.GetValue());
|
||||||
|
};
|
||||||
|
|
||||||
|
auto ConvertColor = [&](const char* paramKey, std::string_view matKey)
|
||||||
|
{
|
||||||
|
if (auto value = materialData.GetColorParameter(paramKey))
|
||||||
|
matInstance->SetValueProperty(matKey, value.GetValue());
|
||||||
|
};
|
||||||
|
|
||||||
|
auto ConvertFloat = [&](const char* paramKey, std::string_view matKey)
|
||||||
|
{
|
||||||
|
if (auto value = materialData.GetDoubleParameter(paramKey))
|
||||||
|
matInstance->SetValueProperty(matKey, SafeCast<float>(value.GetValue()));
|
||||||
|
};
|
||||||
|
|
||||||
|
auto ConvertTexture = [&](const char* paramKey, std::string_view matKey, const char* paramFilterKey, const char* paramWrapKey)
|
||||||
|
{
|
||||||
|
if (auto value = materialData.GetStringViewParameter(paramKey))
|
||||||
|
{
|
||||||
|
matInstance->SetTextureProperty(matKey, Texture::LoadFromFile(Utf8Path(value.GetValue())));
|
||||||
|
}
|
||||||
|
|
||||||
|
Nz::TextureSamplerInfo samplerInfo;
|
||||||
|
if (auto value = materialData.GetIntegerParameter(paramFilterKey))
|
||||||
|
{
|
||||||
|
long long filterInt = value.GetValue();
|
||||||
|
if (filterInt >= 0 || filterInt <= SafeCast<long long>(SamplerFilter::Max))
|
||||||
|
samplerInfo.magFilter = samplerInfo.minFilter = static_cast<SamplerFilter>(filterInt);
|
||||||
|
else
|
||||||
|
NazaraErrorFmt("invalid value for {0} sampler filter: {1}", paramFilterKey, filterInt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto value = materialData.GetIntegerParameter(paramWrapKey))
|
||||||
|
{
|
||||||
|
long long wrapInt = value.GetValue();
|
||||||
|
if (wrapInt >= 0 || wrapInt <= SafeCast<long long>(SamplerWrap::Max))
|
||||||
|
samplerInfo.wrapModeU = samplerInfo.wrapModeV = samplerInfo.wrapModeW = static_cast<SamplerWrap>(wrapInt);
|
||||||
|
else
|
||||||
|
NazaraErrorFmt("invalid value for {0} sampler wrap: {1}", paramWrapKey, wrapInt);
|
||||||
|
}
|
||||||
|
|
||||||
|
matInstance->SetTextureSamplerProperty(matKey, samplerInfo);
|
||||||
|
};
|
||||||
|
|
||||||
|
ConvertColor(MaterialData::BaseColor, "BaseColor");
|
||||||
|
ConvertBool(MaterialData::AlphaTest, "AlphaTest");
|
||||||
|
ConvertFloat(MaterialData::AlphaThreshold, "AlphaTestThreshold");
|
||||||
|
ConvertTexture(MaterialData::BaseColorTexturePath, "BaseColorMap", MaterialData::BaseColorTextureFilter, MaterialData::BaseColorTextureWrap);
|
||||||
|
ConvertTexture(MaterialData::AlphaTexturePath, "AlphaMap", MaterialData::AlphaTextureFilter, MaterialData::AlphaTextureWrap);
|
||||||
|
|
||||||
|
switch (matType)
|
||||||
|
{
|
||||||
|
case MaterialType::Basic:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MaterialType::Phong:
|
||||||
|
ConvertColor(MaterialData::AmbientColor, "AmbientColor");
|
||||||
|
ConvertColor(MaterialData::SpecularColor, "SpecularColor");
|
||||||
|
ConvertFloat(MaterialData::Shininess, "Shininess");
|
||||||
|
ConvertTexture(MaterialData::EmissiveTexturePath, "EmissiveMap", MaterialData::EmissiveTextureFilter, MaterialData::EmissiveTextureWrap);
|
||||||
|
ConvertTexture(MaterialData::HeightTexturePath, "HeightMap", MaterialData::HeightTextureFilter, MaterialData::HeightTextureWrap);
|
||||||
|
ConvertTexture(MaterialData::NormalTexturePath, "NormalMap", MaterialData::NormalTextureFilter, MaterialData::NormalTextureWrap);
|
||||||
|
ConvertTexture(MaterialData::SpecularTexturePath, "SpecularMap", MaterialData::SpecularTextureFilter, MaterialData::SpecularTextureWrap);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MaterialType::PhysicallyBased:
|
||||||
|
ConvertTexture(MaterialData::EmissiveTexturePath, "EmissiveMap", MaterialData::EmissiveTextureFilter, MaterialData::EmissiveTextureWrap);
|
||||||
|
ConvertTexture(MaterialData::HeightTexturePath, "HeightMap", MaterialData::HeightTextureFilter, MaterialData::HeightTextureWrap);
|
||||||
|
ConvertTexture(MaterialData::MetallicTexturePath, "MetallicMap", MaterialData::MetallicTextureFilter, MaterialData::MetallicTextureWrap);
|
||||||
|
ConvertTexture(MaterialData::NormalTexturePath, "NormalMap", MaterialData::NormalTextureFilter, MaterialData::NormalTextureWrap);
|
||||||
|
ConvertTexture(MaterialData::RoughnessTexturePath, "RoughnessMap", MaterialData::RoughnessTextureFilter, MaterialData::RoughnessTextureWrap);
|
||||||
|
ConvertTexture(MaterialData::SpecularTexturePath, "SpecularMap", MaterialData::SpecularTextureFilter, MaterialData::SpecularTextureWrap);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return matInstance;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<MaterialInstance> MaterialInstance::GetDefault(MaterialType materialType, MaterialInstancePreset preset)
|
std::shared_ptr<MaterialInstance> MaterialInstance::GetDefault(MaterialType materialType, MaterialInstancePreset preset)
|
||||||
{
|
{
|
||||||
Graphics* graphics = Graphics::Instance();
|
Graphics* graphics = Graphics::Instance();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue