No more shared pointers

This commit is contained in:
Dynamitos
2023-11-01 23:12:30 +01:00
parent 5a9cb13e74
commit 4746c0f838
69 changed files with 524 additions and 681 deletions
+12 -6
View File
@@ -10,20 +10,20 @@ Material::Material()
}
Material::Material(Gfx::PGraphics graphics,
Array<PShaderParameter> parameter,
Gfx::PDescriptorLayout layout,
Array<OShaderParameter> parameter,
Gfx::ODescriptorLayout layout,
uint32 uniformDataSize,
uint32 uniformBinding,
std::string materialName,
Array<PShaderExpression> expressions,
Array<OShaderExpression> expressions,
MaterialNode brdf)
: graphics(graphics)
, parameters(parameter)
, parameters(std::move(parameter))
, uniformDataSize(uniformDataSize)
, uniformBinding(uniformBinding)
, layout(layout)
, layout(std::move(layout))
, materialName(materialName)
, codeExpressions(expressions)
, codeExpressions(std::move(expressions))
, brdf(brdf)
, instanceId(0)
{
@@ -59,6 +59,7 @@ void Material::save(ArchiveBuffer& buffer) const
Serialization::save(buffer, binding.descriptorType);
Serialization::save(buffer, binding.shaderStages);
}
Serialization::save(buffer, instances);
}
void Material::load(ArchiveBuffer& buffer)
@@ -97,6 +98,11 @@ void Material::load(ArchiveBuffer& buffer)
layout->addDescriptorBinding(binding, descriptorType, descriptorCount, bindingFlags, shaderStages);
}
layout->create();
Serialization::load(buffer, instances);
for (auto& instance : instances)
{
instance->setBaseMaterial(this);
}
}
void Material::compile()
+10 -8
View File
@@ -10,17 +10,18 @@ class Material
public:
Material();
Material(Gfx::PGraphics graphics,
Array<PShaderParameter> parameter,
Gfx::PDescriptorLayout layout,
Array<OShaderParameter> parameter,
Gfx::ODescriptorLayout layout,
uint32 uniformDataSize,
uint32 uniformBinding,
std::string materialName,
Array<PShaderExpression> expressions,
Array<OShaderExpression> expressions,
MaterialNode brdf);
~Material();
Gfx::PDescriptorLayout getDescriptorLayout() const { return layout; }
const Gfx::PDescriptorLayout getDescriptorLayout() const { return layout; }
PMaterialInstance instantiate();
const std::string& getName() { return materialName; }
PMaterialInstance getInstance(uint64 instance) { return instances[instance]; }
const std::string& getName() const { return materialName; }
void save(ArchiveBuffer& buffer) const;
void load(ArchiveBuffer& buffer);
@@ -33,10 +34,11 @@ private:
uint32 uniformDataSize;
uint32 uniformBinding;
uint64 instanceId;
Gfx::PDescriptorLayout layout;
Gfx::ODescriptorLayout layout;
std::string materialName;
Array<PShaderExpression> codeExpressions;
Array<PShaderParameter> parameters;
Array<OShaderExpression> codeExpressions;
Array<OShaderParameter> parameters;
Array<OMaterialInstance> instances;
MaterialNode brdf;
};
DEFINE_REF(Material)
+20 -9
View File
@@ -4,11 +4,15 @@
using namespace Seele;
MaterialInstance::MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout descriptor, Array<PShaderParameter> params, uint32 uniformBinding, uint32 uniformSize)
MaterialInstance::MaterialInstance()
{
}
MaterialInstance::MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout layout, Array<OShaderParameter> params, uint32 uniformBinding, uint32 uniformSize)
: id(id), graphics(graphics), baseMaterial(baseMaterial), layout(layout), parameters(params), uniformBinding(uniformBinding)
{
uniformBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{
.resourceData = {
.sourceData = {
.size = uniformSize,
},
.bDynamic = true,
@@ -25,7 +29,7 @@ MaterialInstance::~MaterialInstance()
void MaterialInstance::updateDescriptor()
{
descriptor = layout->allocateDescriptorSet();
for (auto param : parameters)
for (auto& param : parameters)
{
param->updateDescriptorSet(descriptor, uniformData.data());
}
@@ -43,20 +47,27 @@ void MaterialInstance::save(ArchiveBuffer& buffer) const
Serialization::save(buffer, uniformBinding);
Serialization::save(buffer, uniformBuffer);
Serialization::save(buffer, parameters);
Serialization::save(buffer, layout);
Serialization::save(buffer, descriptor);
Serialization::save(buffer, baseMaterial);
Serialization::save(buffer, id);
}
void MaterialInstance::load(ArchiveBuffer& buffer)
{
graphics = buffer.getGraphics();
Serialization::load(buffer, uniformData);
Serialization::load(buffer, uniformBinding);
Serialization::load(buffer, uniformBuffer);
Serialization::load(buffer, parameters);
Serialization::load(buffer, layout);
Serialization::load(buffer, descriptor);
Serialization::load(buffer, baseMaterial);
Serialization::load(buffer, id);
}
void MaterialInstance::setBaseMaterial(PMaterial material)
{
layout = material->getDescriptorLayout();
baseMaterial = material;
descriptor = layout->allocateDescriptorSet();
for (auto& param : parameters)
{
param->updateDescriptorSet(descriptor, uniformData.data());
}
descriptor->writeChanges();
}
+5 -3
View File
@@ -7,7 +7,8 @@ namespace Seele
class MaterialInstance
{
public:
MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout descriptor, Array<PShaderParameter> params, uint32 uniformBinding, uint32 uniformSize);
MaterialInstance();
MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout descriptor, Array<OShaderParameter> params, uint32 uniformBinding, uint32 uniformSize);
~MaterialInstance();
void updateDescriptor();
Gfx::PDescriptorSet getDescriptorSet() const;
@@ -16,13 +17,14 @@ public:
void save(ArchiveBuffer& buffer) const;
void load(ArchiveBuffer& buffer);
void setBaseMaterial(PMaterial material);
private:
Gfx::PGraphics graphics;
Array<uint8> uniformData;
uint32 uniformBinding;
Gfx::PUniformBuffer uniformBuffer;
Array<PShaderParameter> parameters;
Gfx::OUniformBuffer uniformBuffer;
Array<OShaderParameter> parameters;
Gfx::PDescriptorLayout layout;
Gfx::PDescriptorSet descriptor;
PMaterial baseMaterial;
+5 -5
View File
@@ -208,21 +208,21 @@ DEFINE_REF(SampleExpression)
struct MaterialNode
{
std::string profile;
Map<std::string, PShaderExpression> variables;
Map<std::string, OShaderExpression> variables;
MaterialNode() {}
~MaterialNode() {}
void save(ArchiveBuffer& buffer) const;
void load(ArchiveBuffer& buffer);
};
template<>
static void Serialization::save(ArchiveBuffer& buffer, const PShaderExpression& parameter)
static void Serialization::save(ArchiveBuffer& buffer, const OShaderExpression& parameter)
{
Serialization::save(buffer, parameter->getIdentifier());
parameter->save(buffer);
}
template<>
static void Serialization::load(ArchiveBuffer& buffer, PShaderExpression& parameter)
static void Serialization::load(ArchiveBuffer& buffer, OShaderExpression& parameter)
{
uint64 identifier = 0;
Serialization::load(buffer, identifier);
@@ -268,14 +268,14 @@ static void Serialization::load(ArchiveBuffer& buffer, PShaderExpression& parame
}
template<>
static void Serialization::save(ArchiveBuffer& buffer, const PShaderParameter& parameter)
static void Serialization::save(ArchiveBuffer& buffer, const OShaderParameter& parameter)
{
Serialization::save(buffer, parameter->getIdentifier());
parameter->save(buffer);
}
template<>
static void Serialization::load(ArchiveBuffer& buffer, PShaderParameter& parameter)
static void Serialization::load(ArchiveBuffer& buffer, OShaderParameter& parameter)
{
uint64 identifier = 0;
Serialization::load(buffer, identifier);