Add material render metadata and loader parsing

This commit is contained in:
2026-03-27 00:30:49 +08:00
parent c97510ed5b
commit f68da2e3f9
6 changed files with 586 additions and 26 deletions

View File

@@ -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();
}