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,
|
2023-11-11 22:39:17 +01:00
|
|
|
Array<OShaderExpression>& expressions,
|
2023-11-05 10:36:01 +01:00
|
|
|
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-11 22:39:17 +01:00
|
|
|
const std::string& name = params[i];
|
|
|
|
|
Serialization::save(buffer, *expressions.find([&name](const OShaderExpression& p) {return p->key == name; }));
|
2023-11-05 10:36:01 +01:00
|
|
|
buffer.rewind();
|
|
|
|
|
OShaderParameter param;
|
|
|
|
|
Serialization::load(buffer, param);
|
|
|
|
|
parameters.add(std::move(param));
|
2023-11-12 14:46:22 +01:00
|
|
|
buffer.rewind();
|
2023-11-05 10:36:01 +01:00
|
|
|
}
|
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();
|
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
|
|
|
}
|