Add material render metadata and loader parsing
This commit is contained in:
@@ -11,6 +11,9 @@ Material::~Material() = default;
|
||||
|
||||
void Material::Release() {
|
||||
m_shader.Reset();
|
||||
m_renderQueue = static_cast<Core::int32>(MaterialRenderQueue::Geometry);
|
||||
m_shaderPass.Clear();
|
||||
m_tags.Clear();
|
||||
m_properties.Clear();
|
||||
m_textureBindings.Clear();
|
||||
m_constantBufferData.Clear();
|
||||
@@ -23,6 +26,73 @@ void Material::SetShader(const ResourceHandle<Shader>& shader) {
|
||||
UpdateMemorySize();
|
||||
}
|
||||
|
||||
void Material::SetRenderQueue(Core::int32 renderQueue) {
|
||||
m_renderQueue = renderQueue;
|
||||
}
|
||||
|
||||
void Material::SetRenderQueue(MaterialRenderQueue renderQueue) {
|
||||
SetRenderQueue(static_cast<Core::int32>(renderQueue));
|
||||
}
|
||||
|
||||
void Material::SetShaderPass(const Containers::String& shaderPass) {
|
||||
m_shaderPass = shaderPass;
|
||||
UpdateMemorySize();
|
||||
}
|
||||
|
||||
void Material::SetTag(const Containers::String& name, const Containers::String& value) {
|
||||
for (TagEntry& tag : m_tags) {
|
||||
if (tag.name == name) {
|
||||
tag.value = value;
|
||||
UpdateMemorySize();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
TagEntry tag;
|
||||
tag.name = name;
|
||||
tag.value = value;
|
||||
m_tags.PushBack(tag);
|
||||
UpdateMemorySize();
|
||||
}
|
||||
|
||||
Containers::String Material::GetTag(const Containers::String& name) const {
|
||||
for (const TagEntry& tag : m_tags) {
|
||||
if (tag.name == name) {
|
||||
return tag.value;
|
||||
}
|
||||
}
|
||||
|
||||
return Containers::String();
|
||||
}
|
||||
|
||||
bool Material::HasTag(const Containers::String& name) const {
|
||||
for (const TagEntry& tag : m_tags) {
|
||||
if (tag.name == name) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Material::RemoveTag(const Containers::String& name) {
|
||||
for (size_t tagIndex = 0; tagIndex < m_tags.Size(); ++tagIndex) {
|
||||
if (m_tags[tagIndex].name == name) {
|
||||
if (tagIndex != m_tags.Size() - 1) {
|
||||
m_tags[tagIndex] = std::move(m_tags.Back());
|
||||
}
|
||||
m_tags.PopBack();
|
||||
UpdateMemorySize();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Material::ClearTags() {
|
||||
m_tags.Clear();
|
||||
UpdateMemorySize();
|
||||
}
|
||||
|
||||
void Material::SetFloat(const Containers::String& name, float value) {
|
||||
MaterialProperty prop;
|
||||
prop.name = name;
|
||||
@@ -175,6 +245,10 @@ void Material::UpdateConstantBuffer() {
|
||||
UpdateMemorySize();
|
||||
}
|
||||
|
||||
void Material::RecalculateMemorySize() {
|
||||
UpdateMemorySize();
|
||||
}
|
||||
|
||||
bool Material::HasProperty(const Containers::String& name) const {
|
||||
return m_properties.Contains(name);
|
||||
}
|
||||
@@ -193,11 +267,18 @@ void Material::ClearAllProperties() {
|
||||
|
||||
void Material::UpdateMemorySize() {
|
||||
m_memorySize = m_constantBufferData.Size() +
|
||||
m_shaderPass.Length() +
|
||||
m_tags.Size() * sizeof(TagEntry) +
|
||||
m_textureBindings.Size() * sizeof(TextureBinding) +
|
||||
m_properties.Size() * sizeof(MaterialProperty) +
|
||||
m_name.Length() +
|
||||
m_path.Length();
|
||||
|
||||
for (const TagEntry& tag : m_tags) {
|
||||
m_memorySize += tag.name.Length();
|
||||
m_memorySize += tag.value.Length();
|
||||
}
|
||||
|
||||
for (const auto& binding : m_textureBindings) {
|
||||
m_memorySize += binding.name.Length();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user