Files
Seele/src/Engine/Material/MaterialInstance.cpp
T

105 lines
2.6 KiB
C++
Raw Normal View History

2023-01-21 18:43:21 +01:00
#include "MaterialInstance.h"
#include "Material.h"
#include "Graphics/Graphics.h"
using namespace Seele;
2023-11-01 23:12:30 +01:00
MaterialInstance::MaterialInstance()
{
}
2023-11-05 10:36:01 +01:00
MaterialInstance::MaterialInstance(uint64 id,
Gfx::PGraphics graphics,
Map<std::string, OShaderExpression>& expressions,
Array<std::string> params,
uint32 uniformBinding,
uint32 uniformSize)
2023-11-06 14:47:21 +01:00
: graphics(graphics)
2023-11-05 10:36:01 +01:00
, uniformBinding(uniformBinding)
2023-11-06 14:47:21 +01:00
, id(id)
2023-01-21 18:43:21 +01:00
{
2023-11-06 14:47:21 +01:00
if(uniformSize > 0)
{
uniformBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{
.sourceData = {
.size = uniformSize,
},
.dynamic = true,
}
);
}
2023-10-24 15:01:09 +02:00
uniformData.resize(uniformSize);
2023-11-05 10:36:01 +01:00
ArchiveBuffer buffer(graphics);
parameters.reserve(params.size());
2023-11-06 14:47:21 +01:00
for (size_t i = 0; i < params.size(); ++i)
2023-11-05 10:36:01 +01:00
{
2023-11-05 11:47:22 +01:00
Serialization::save(buffer, expressions[params[i]]);
2023-11-05 10:36:01 +01:00
buffer.rewind();
OShaderParameter param;
Serialization::load(buffer, param);
parameters.add(std::move(param));
}
2023-01-21 18:43:21 +01:00
}
MaterialInstance::~MaterialInstance()
{
2023-10-26 18:37:29 +02:00
}
2023-11-01 13:38:49 +01:00
void MaterialInstance::updateDescriptor()
2023-10-26 18:37:29 +02:00
{
2023-11-05 10:36:01 +01:00
Gfx::PDescriptorLayout layout = baseMaterial->getMaterial()->getDescriptorLayout();
layout->reset();
2023-11-01 13:38:49 +01:00
descriptor = layout->allocateDescriptorSet();
2023-11-01 23:12:30 +01:00
for (auto& param : parameters)
2023-11-01 13:38:49 +01:00
{
param->updateDescriptorSet(descriptor, uniformData.data());
}
2023-11-06 14:47:21 +01:00
if(uniformData.size() > 0)
{
uniformBuffer->updateContents(DataSource{
.size = uniformData.size(),
.data = uniformData.data(),
});
descriptor->updateBuffer(uniformBinding, uniformBuffer);
}
2023-11-01 13:38:49 +01:00
descriptor->writeChanges();
}
2023-11-05 10:36:01 +01:00
Gfx::PDescriptorSet MaterialInstance::getDescriptorSet() const
2023-11-01 13:38:49 +01:00
{
return descriptor;
}
2023-11-05 10:36:01 +01:00
void MaterialInstance::setBaseMaterial(PMaterialAsset asset)
{
2023-11-06 14:47:21 +01:00
if(uniformData.size() > 0)
{
uniformBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{
.sourceData = {
.size = uniformData.size(),
},
.dynamic = true,
}
);
}
2023-11-05 10:36:01 +01:00
baseMaterial = asset;
}
2023-11-01 13:38:49 +01:00
void MaterialInstance::save(ArchiveBuffer& buffer) const
{
Serialization::save(buffer, uniformData);
Serialization::save(buffer, uniformBinding);
Serialization::save(buffer, parameters);
Serialization::save(buffer, id);
}
void MaterialInstance::load(ArchiveBuffer& buffer)
{
2023-11-01 23:12:30 +01:00
graphics = buffer.getGraphics();
2023-11-01 13:38:49 +01:00
Serialization::load(buffer, uniformData);
Serialization::load(buffer, uniformBinding);
Serialization::load(buffer, parameters);
Serialization::load(buffer, id);
2023-10-26 18:37:29 +02:00
}