reimplement grid as SceneAsset
This commit is contained in:
@@ -1,31 +1,36 @@
|
||||
#ifdef _WIN32
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <cmath>
|
||||
#endif
|
||||
|
||||
#include "scene/GridOverlay.hpp"
|
||||
|
||||
#include <filament/Engine.h>
|
||||
#include <utils/Entity.h>
|
||||
#include <utils/EntityManager.h>
|
||||
#include <filament/RenderableManager.h>
|
||||
#include <filament/TransformManager.h>
|
||||
#include <gltfio/math.h>
|
||||
|
||||
#include "material/grid.h"
|
||||
#include "scene/SceneManager.hpp"
|
||||
#include "material/grid.h"
|
||||
#include "Log.hpp"
|
||||
|
||||
namespace thermion
|
||||
{
|
||||
|
||||
using namespace filament::gltfio;
|
||||
|
||||
GridOverlay::GridOverlay(Engine &engine) : _engine(engine)
|
||||
{
|
||||
auto &entityManager = EntityManager::get();
|
||||
auto &transformManager = engine.getTransformManager();
|
||||
createGrid();
|
||||
createSphere();
|
||||
_childEntities[0] = _gridEntity;
|
||||
_childEntities[1] = _sphereEntity;
|
||||
}
|
||||
|
||||
GridOverlay::~GridOverlay()
|
||||
{
|
||||
auto &rm = _engine.getRenderableManager();
|
||||
auto &tm = _engine.getTransformManager();
|
||||
|
||||
rm.destroy(_sphereEntity);
|
||||
rm.destroy(_gridEntity);
|
||||
tm.destroy(_sphereEntity);
|
||||
tm.destroy(_gridEntity);
|
||||
_engine.destroy(_sphereEntity);
|
||||
_engine.destroy(_gridEntity);
|
||||
_engine.destroy(_materialInstance);
|
||||
_engine.destroy(_material);
|
||||
}
|
||||
|
||||
void GridOverlay::createGrid()
|
||||
{
|
||||
const int gridSize = 100;
|
||||
const float gridSpacing = 1.0f;
|
||||
int vertexCount = (gridSize + 1) * 4; // 2 axes, 2 vertices per line
|
||||
@@ -61,10 +66,10 @@ namespace thermion
|
||||
.vertexCount(vertexCount)
|
||||
.bufferCount(1)
|
||||
.attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3)
|
||||
.build(engine);
|
||||
.build(_engine);
|
||||
|
||||
vb->setBufferAt(engine, 0, VertexBuffer::BufferDescriptor(gridVertices, vertexCount * sizeof(filament::math::float3), [](void *buffer, size_t size, void *)
|
||||
{ delete[] static_cast<float *>(buffer); }));
|
||||
vb->setBufferAt(_engine, 0, VertexBuffer::BufferDescriptor(gridVertices, vertexCount * sizeof(math::float3), [](void *buffer, size_t size, void *)
|
||||
{ delete[] static_cast<float *>(buffer); }));
|
||||
|
||||
uint32_t *gridIndices = new uint32_t[vertexCount];
|
||||
for (uint32_t i = 0; i < vertexCount; ++i)
|
||||
@@ -75,22 +80,22 @@ namespace thermion
|
||||
auto ib = IndexBuffer::Builder()
|
||||
.indexCount(vertexCount)
|
||||
.bufferType(IndexBuffer::IndexType::UINT)
|
||||
.build(engine);
|
||||
.build(_engine);
|
||||
|
||||
ib->setBuffer(engine, IndexBuffer::BufferDescriptor(
|
||||
gridIndices, vertexCount * sizeof(uint32_t),
|
||||
[](void *buffer, size_t size, void *)
|
||||
{ delete[] static_cast<uint32_t *>(buffer); }));
|
||||
ib->setBuffer(_engine, IndexBuffer::BufferDescriptor(
|
||||
gridIndices,
|
||||
vertexCount * sizeof(uint32_t),
|
||||
[](void *buffer, size_t size, void *)
|
||||
{ delete[] static_cast<uint32_t *>(buffer); }));
|
||||
|
||||
_gridEntity = entityManager.create();
|
||||
_gridEntity = utils::EntityManager::get().create();
|
||||
_material = Material::Builder()
|
||||
.package(GRID_PACKAGE, GRID_GRID_SIZE)
|
||||
.build(engine);
|
||||
.build(_engine);
|
||||
|
||||
_materialInstance = _material->createInstance();
|
||||
|
||||
_materialInstance->setParameter("maxDistance", 50.0f); // Adjust as needed
|
||||
_materialInstance->setParameter("color", math::float3{0.05f, 0.05f, 0.05f}); // Gray color for the grid
|
||||
_materialInstance->setParameter("maxDistance", 50.0f);
|
||||
_materialInstance->setParameter("color", math::float3{0.05f, 0.05f, 0.05f});
|
||||
|
||||
RenderableManager::Builder(1)
|
||||
.boundingBox({{-gridSize * gridSpacing / 2, 0, -gridSize * gridSpacing / 2},
|
||||
@@ -102,12 +107,16 @@ namespace thermion
|
||||
.culling(true)
|
||||
.receiveShadows(false)
|
||||
.castShadows(false)
|
||||
.build(engine, _gridEntity);
|
||||
.build(_engine, _gridEntity);
|
||||
}
|
||||
|
||||
void GridOverlay::createSphere()
|
||||
{
|
||||
const float sphereRadius = 0.05f;
|
||||
const int sphereSegments = 16;
|
||||
const int sphereRings = 16;
|
||||
|
||||
vertexCount = (sphereRings + 1) * (sphereSegments + 1);
|
||||
int vertexCount = (sphereRings + 1) * (sphereSegments + 1);
|
||||
int indexCount = sphereRings * sphereSegments * 6;
|
||||
|
||||
math::float3 *vertices = new math::float3[vertexCount];
|
||||
@@ -158,22 +167,23 @@ namespace thermion
|
||||
.vertexCount(vertexCount)
|
||||
.bufferCount(1)
|
||||
.attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3)
|
||||
.build(engine);
|
||||
.build(_engine);
|
||||
|
||||
sphereVb->setBufferAt(engine, 0, VertexBuffer::BufferDescriptor(vertices, vertexCount * sizeof(math::float3), [](void *buffer, size_t size, void *)
|
||||
{ delete[] static_cast<math::float3 *>(buffer); }));
|
||||
sphereVb->setBufferAt(_engine, 0, VertexBuffer::BufferDescriptor(vertices, vertexCount * sizeof(math::float3), [](void *buffer, size_t size, void *)
|
||||
{ delete[] static_cast<math::float3 *>(buffer); }));
|
||||
|
||||
auto sphereIb = IndexBuffer::Builder()
|
||||
.indexCount(indexCount)
|
||||
.bufferType(IndexBuffer::IndexType::UINT)
|
||||
.build(engine);
|
||||
.build(_engine);
|
||||
|
||||
sphereIb->setBuffer(engine, IndexBuffer::BufferDescriptor(
|
||||
indices, indexCount * sizeof(uint32_t),
|
||||
[](void *buffer, size_t size, void *)
|
||||
{ delete[] static_cast<uint32_t *>(buffer); }));
|
||||
sphereIb->setBuffer(_engine, IndexBuffer::BufferDescriptor(
|
||||
indices,
|
||||
indexCount * sizeof(uint32_t),
|
||||
[](void *buffer, size_t size, void *)
|
||||
{ delete[] static_cast<uint32_t *>(buffer); }));
|
||||
|
||||
_sphereEntity = entityManager.create();
|
||||
_sphereEntity = utils::EntityManager::get().create();
|
||||
|
||||
RenderableManager::Builder(1)
|
||||
.boundingBox({{-sphereRadius, -sphereRadius, -sphereRadius},
|
||||
@@ -184,19 +194,70 @@ namespace thermion
|
||||
.culling(true)
|
||||
.receiveShadows(false)
|
||||
.castShadows(false)
|
||||
.build(engine, _sphereEntity);
|
||||
.build(_engine, _sphereEntity);
|
||||
}
|
||||
|
||||
void GridOverlay::destroy()
|
||||
SceneAsset *GridOverlay::createInstance(MaterialInstance **materialInstances, size_t materialInstanceCount)
|
||||
{
|
||||
auto &rm = _engine.getRenderableManager();
|
||||
auto &tm = _engine.getTransformManager();
|
||||
rm.destroy(_sphereEntity);
|
||||
rm.destroy(_gridEntity);
|
||||
tm.destroy(_sphereEntity);
|
||||
tm.destroy(_gridEntity);
|
||||
_engine.destroy(_sphereEntity);
|
||||
_engine.destroy(_gridEntity);
|
||||
auto instance = std::make_unique<GridOverlay>(_engine);
|
||||
auto *raw = instance.get();
|
||||
_instances.push_back(std::move(instance));
|
||||
return reinterpret_cast<SceneAsset*>(raw);
|
||||
}
|
||||
|
||||
void GridOverlay::addAllEntities(Scene *scene)
|
||||
{
|
||||
scene->addEntity(_gridEntity);
|
||||
scene->addEntity(_sphereEntity);
|
||||
}
|
||||
|
||||
void GridOverlay::removeAllEntities(Scene *scene)
|
||||
{
|
||||
scene->remove(_gridEntity);
|
||||
scene->remove(_sphereEntity);
|
||||
}
|
||||
|
||||
void GridOverlay::setPriority(RenderableManager &rm, int priority)
|
||||
{
|
||||
auto gridInstance = rm.getInstance(_gridEntity);
|
||||
rm.setPriority(gridInstance, priority);
|
||||
auto sphereInstance = rm.getInstance(_sphereEntity);
|
||||
rm.setPriority(sphereInstance, priority);
|
||||
}
|
||||
|
||||
void GridOverlay::setLayer(RenderableManager &rm, int layer)
|
||||
{
|
||||
auto gridInstance = rm.getInstance(_gridEntity);
|
||||
rm.setLayerMask(gridInstance, 0xFF, 1u << (uint8_t)layer);
|
||||
auto sphereInstance = rm.getInstance(_sphereEntity);
|
||||
rm.setLayerMask(sphereInstance, 0xFF, 1u << (uint8_t)layer);
|
||||
}
|
||||
|
||||
SceneAsset *GridOverlay::getInstanceByEntity(utils::Entity entity)
|
||||
{
|
||||
for (auto &instance : _instances)
|
||||
{
|
||||
if (instance->_gridEntity == entity || instance->_sphereEntity == entity)
|
||||
{
|
||||
return instance.get();
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
SceneAsset *GridOverlay::getInstanceAt(size_t index)
|
||||
{
|
||||
return _instances[index].get();
|
||||
}
|
||||
|
||||
const Entity *GridOverlay::getChildEntities()
|
||||
{
|
||||
return _childEntities;
|
||||
}
|
||||
|
||||
Entity GridOverlay::findEntityByName(const char *name)
|
||||
{
|
||||
return Entity(); // Not implemented
|
||||
}
|
||||
|
||||
} // namespace thermion
|
||||
Reference in New Issue
Block a user