internal: use std::vector for geometry material instances

This commit is contained in:
Nick Fisher
2025-01-06 11:17:13 +08:00
parent 8653ca8398
commit 86ecd53de7
2 changed files with 15 additions and 8 deletions

View File

@@ -51,12 +51,12 @@ namespace thermion
MaterialInstance **getMaterialInstances() override MaterialInstance **getMaterialInstances() override
{ {
return _materialInstances; return _materialInstances.data();
} }
size_t getMaterialInstanceCount() override size_t getMaterialInstanceCount() override
{ {
return _materialInstanceCount; return _materialInstances.size();
} }
VertexBuffer *getVertexBuffer() const { return _vertexBuffer; } VertexBuffer *getVertexBuffer() const { return _vertexBuffer; }
@@ -135,8 +135,7 @@ namespace thermion
Engine *_engine = nullptr; Engine *_engine = nullptr;
VertexBuffer *_vertexBuffer = nullptr; VertexBuffer *_vertexBuffer = nullptr;
IndexBuffer *_indexBuffer = nullptr; IndexBuffer *_indexBuffer = nullptr;
MaterialInstance **_materialInstances = nullptr; std::vector<MaterialInstance*> _materialInstances;
size_t _materialInstanceCount = 0;
Box _boundingBox; Box _boundingBox;
GeometrySceneAsset *_instanceOwner = std::nullptr_t(); GeometrySceneAsset *_instanceOwner = std::nullptr_t();
utils::Entity _entity; utils::Entity _entity;

View File

@@ -27,8 +27,15 @@ namespace thermion
RenderableManager::PrimitiveType primitiveType, RenderableManager::PrimitiveType primitiveType,
Box boundingBox, Box boundingBox,
GeometrySceneAsset *instanceOwner) GeometrySceneAsset *instanceOwner)
: _engine(engine), _vertexBuffer(vertexBuffer), _indexBuffer(indexBuffer), _materialInstances(materialInstances), _materialInstanceCount(materialInstanceCount), _primitiveType(primitiveType), _boundingBox(boundingBox), _instanceOwner(instanceOwner) : _engine(engine),
_vertexBuffer(vertexBuffer),
_indexBuffer(indexBuffer),
_primitiveType(primitiveType),
_boundingBox(boundingBox),
_instanceOwner(instanceOwner)
{ {
_materialInstances.insert(_materialInstances.begin(), materialInstances, materialInstances + materialInstanceCount);
_entity = utils::EntityManager::get().create(); _entity = utils::EntityManager::get().create();
RenderableManager::Builder builder(1); RenderableManager::Builder builder(1);
@@ -63,9 +70,10 @@ namespace thermion
return nullptr; return nullptr;
} }
if(materialInstanceCount == 0) { if(materialInstanceCount == 0 && _materialInstances.size() > 0) {
materialInstanceCount = _materialInstanceCount; materialInstanceCount = _materialInstances.size();
materialInstances = _materialInstances; materialInstances = _materialInstances.data();
TRACE("No material instances provided, re-using %d existing material instances", materialInstanceCount);
} }
std::unique_ptr<GeometrySceneAsset> instance = std::make_unique<GeometrySceneAsset>( std::unique_ptr<GeometrySceneAsset> instance = std::make_unique<GeometrySceneAsset>(