No more shared pointers
This commit is contained in:
@@ -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,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)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user