tools/ai/agents/skills/filament_lifetime/SKILL.md
Filament manages its own native allocations. To prevent segmentation faults and memory leaks, follow these rules:
EntityManager directly from the Engine instance:
utils::EntityManager& em = engine->getEntityManager();Engine pointer is inaccessible:
utils::EntityManager& em = utils::EntityManager::get();utils::Entity entity = engine->getEntityManager().create();engine->getEntityManager().destroy(entity);RenderableManager::Builder or LightManager::Builder on the entity:
RenderableManager::Builder(1)
.geometry(0, RenderableManager::PrimitiveType::TRIANGLES, vb, ib)
.material(0, matInstance)
.build(*engine, entity);
Camera* camera = engine->createCamera(entity);engine->destroy(entity);
Second, free the Entity ID:
engine->getEntityManager().destroy(entity);
// Correct Entity Cleanup
engine->destroy(myEntity);
engine->getEntityManager().destroy(myEntity);
engine->destroyCameraComponent(entity);engine->getTransformManager().destroy(entity);engine->getRenderableManager().destroy(entity);Native GPU objects are created using the Engine factory or nested Builder patterns.
delete: Never call standard C++ delete on pointers returned by Engine.Engine instance.
View, Scene, Renderer, SwapChain.View* view = engine->createView();
// ...
engine->destroy(view);
Builder class, passing the engine instance to build(*engine).
VertexBuffer, IndexBuffer, Texture, Material, IndirectLight, Skybox, RenderTarget.VertexBuffer* vb = VertexBuffer::Builder()
.vertexCount(count)
.bufferCount(1)
.attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3)
.build(*engine);
// ...
engine->destroy(vb);