2023-01-21 18:43:21 +01:00
|
|
|
#include "MaterialInstance.h"
|
|
|
|
|
#include "Graphics/Graphics.h"
|
2024-06-09 12:20:04 +02:00
|
|
|
#include "Material.h"
|
|
|
|
|
|
2023-01-21 18:43:21 +01:00
|
|
|
using namespace Seele;
|
|
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
MaterialInstance::MaterialInstance() {}
|
2023-11-01 23:12:30 +01:00
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
MaterialInstance::MaterialInstance(uint64 id, Gfx::PGraphics graphics, Array<OShaderExpression>& expressions, Array<std::string> params,
|
2024-06-18 19:19:05 +02:00
|
|
|
uint32 numTextures, uint32 numSamplers, uint32 numFloats)
|
|
|
|
|
: graphics(graphics), numTextures(numTextures), numSamplers(numSamplers), numFloats(numFloats), id(id) {
|
|
|
|
|
texturesOffset = Material::addTextures(numTextures);
|
|
|
|
|
samplersOffset = Material::addSamplers(numSamplers);
|
|
|
|
|
floatBufferOffset = Material::addFloats(numFloats);
|
2023-11-05 10:36:01 +01:00
|
|
|
ArchiveBuffer buffer(graphics);
|
|
|
|
|
parameters.reserve(params.size());
|
2024-06-09 12:20:04 +02:00
|
|
|
for (size_t i = 0; i < params.size(); ++i) {
|
2023-11-11 22:39:17 +01:00
|
|
|
const std::string& name = params[i];
|
2024-06-09 12:20:04 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
MaterialInstance::~MaterialInstance() {}
|
2023-10-26 18:37:29 +02:00
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
void MaterialInstance::updateDescriptor() {
|
2024-06-18 19:19:05 +02:00
|
|
|
for (auto& p : parameters) {
|
|
|
|
|
p->updateDescriptorSet(texturesOffset, samplersOffset, floatBufferOffset);
|
2023-11-01 13:38:49 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-07 21:19:33 +02:00
|
|
|
void MaterialInstance::setBaseMaterial(PMaterialAsset asset) { baseMaterial = asset; }
|
2023-11-05 10:36:01 +01:00
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
void MaterialInstance::save(ArchiveBuffer& buffer) const {
|
2024-06-18 19:19:05 +02:00
|
|
|
Serialization::save(buffer, numTextures);
|
|
|
|
|
Serialization::save(buffer, numSamplers);
|
|
|
|
|
Serialization::save(buffer, numFloats);
|
2023-11-01 13:38:49 +01:00
|
|
|
Serialization::save(buffer, parameters);
|
|
|
|
|
Serialization::save(buffer, id);
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
void MaterialInstance::load(ArchiveBuffer& buffer) {
|
2024-06-18 19:19:05 +02:00
|
|
|
Serialization::load(buffer, numTextures);
|
|
|
|
|
Serialization::load(buffer, numSamplers);
|
|
|
|
|
Serialization::load(buffer, numFloats);
|
2023-11-01 13:38:49 +01:00
|
|
|
Serialization::load(buffer, parameters);
|
|
|
|
|
Serialization::load(buffer, id);
|
2024-06-18 19:19:05 +02:00
|
|
|
texturesOffset = Material::addTextures(numTextures);
|
|
|
|
|
samplersOffset = Material::addSamplers(numSamplers);
|
|
|
|
|
floatBufferOffset = Material::addFloats(numFloats);
|
2023-10-26 18:37:29 +02:00
|
|
|
}
|
2024-08-07 21:19:33 +02:00
|
|
|
|
|
|
|
|
uint64 MaterialInstance::getCPUSize() const {
|
|
|
|
|
uint64 result = sizeof(MaterialInstance);
|
|
|
|
|
for (size_t i = 0; i < parameters.size(); ++i) {
|
|
|
|
|
result += parameters[i]->getCPUSize();
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint64 MaterialInstance::getGPUSize() const {
|
|
|
|
|
uint64 result = 0;
|
|
|
|
|
for (size_t i = 0; i < parameters.size(); ++i) {
|
|
|
|
|
result += parameters[i]->getGPUSize();
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|