2026-02-13 19:15:05 +01:00
|
|
|
#include "CScene.hpp"
|
2026-03-14 20:24:17 +01:00
|
|
|
#include "../Entity/CEntity.hpp"
|
|
|
|
|
#include "../Component/Graphics/CRenderer.hpp"
|
|
|
|
|
#include "../Component/Meta/CMetaData.hpp"
|
|
|
|
|
#include "../Component/Geometry/CTransform.hpp"
|
|
|
|
|
#include "../Component/Camera/CCamera.hpp"
|
|
|
|
|
#include "../Graphics/API/GraphicsAPI.hpp"
|
2026-02-13 19:15:05 +01:00
|
|
|
|
2026-03-14 20:24:17 +01:00
|
|
|
#include <memory>
|
2026-02-13 19:15:05 +01:00
|
|
|
namespace CosmicCore {
|
|
|
|
|
|
|
|
|
|
CScene::CScene(std::string name) : CSerializable(),
|
2026-03-22 00:28:03 +01:00
|
|
|
m_name(std::move(name)), m_tangibleWorld(this)
|
|
|
|
|
{
|
|
|
|
|
m_tangibleWorld.initWorld();
|
2026-02-13 19:15:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string CScene::getName(void) const {
|
|
|
|
|
return m_name;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-22 00:28:03 +01:00
|
|
|
CScene::~CScene()
|
|
|
|
|
{
|
|
|
|
|
m_tangibleWorld.destroy();
|
|
|
|
|
}
|
2026-03-14 20:24:17 +01:00
|
|
|
|
2026-03-22 00:28:03 +01:00
|
|
|
CEntity CScene::createEntity(){
|
2026-03-14 20:24:17 +01:00
|
|
|
auto handle = m_ecManager.registry.create();
|
|
|
|
|
CEntity handler(m_ecManager, handle, this);
|
|
|
|
|
return handler;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-13 19:15:05 +01:00
|
|
|
unsigned int CScene::getNumEntity(void) const {
|
2026-03-14 20:24:17 +01:00
|
|
|
return m_ecManager().view<CMetaData>()->size();
|
2026-02-13 19:15:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CScene::removeEntity(unsigned int index, bool destroy)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-14 20:24:17 +01:00
|
|
|
void CScene::render(vk::raii::CommandBuffer& cmd, uint32_t frameIndex){
|
|
|
|
|
auto entities = m_ecManager.registry.view<CRenderer, CTransform>();
|
|
|
|
|
VulkanImpl* api = dynamic_cast<VulkanImpl*>(GraphicsAPI::getAPI().get());
|
|
|
|
|
auto cam = m_ecManager.registry.view<CCamera, CTransform>();
|
|
|
|
|
auto& camera = m_ecManager.registry.get<CCamera>(cam.front());
|
|
|
|
|
auto& transform = m_ecManager.registry.get<CTransform>(cam.front());
|
|
|
|
|
|
|
|
|
|
camera.updateUniformBuffer(frameIndex, transform);
|
|
|
|
|
|
|
|
|
|
cmd.bindDescriptorSets(
|
|
|
|
|
vk::PipelineBindPoint::eGraphics,
|
|
|
|
|
api->getDefaultPipelineLayout(), // layout du pipeline
|
|
|
|
|
0,
|
|
|
|
|
*camera.getDescriptorSet(frameIndex),
|
|
|
|
|
{}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
for (auto& entity : entities) {
|
|
|
|
|
auto model = m_ecManager.registry.get<CRenderer>(entity).getModel();
|
|
|
|
|
auto& transform = m_ecManager.registry.get<CTransform>(entity);
|
|
|
|
|
|
|
|
|
|
transform.updateUniformBuffer(frameIndex);
|
|
|
|
|
//trier meshes par matérial ?
|
|
|
|
|
|
|
|
|
|
// bind transform UBO (set = 1)
|
|
|
|
|
cmd.bindDescriptorSets(
|
|
|
|
|
vk::PipelineBindPoint::eGraphics,
|
|
|
|
|
api->getDefaultPipelineLayout(), // layout du pipeline
|
|
|
|
|
1, // set = 1
|
|
|
|
|
*transform.getDescriptorSet(frameIndex),
|
|
|
|
|
{}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
for (auto& mesh : model->getMeshes()) {
|
|
|
|
|
// ne rebind le pipeline que si le material change
|
|
|
|
|
//if (mesh.getMaterial() != boundMaterial) {
|
|
|
|
|
//boundMaterial = mesh.getMaterial();
|
|
|
|
|
cmd.bindPipeline(vk::PipelineBindPoint::eGraphics,
|
|
|
|
|
*mesh->getMaterial()->getPipeline());
|
|
|
|
|
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics,
|
|
|
|
|
*mesh->getMaterial()->getPipelineLayout(),
|
|
|
|
|
2,
|
|
|
|
|
*mesh->getMaterial()->getDescriptorSet(frameIndex),
|
|
|
|
|
{});
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
cmd.bindVertexBuffers(0, vk::Buffer(mesh->getVertexIndexBuffer().buffer), mesh->getVertexOffset());
|
|
|
|
|
cmd.bindIndexBuffer(vk::Buffer(mesh->getVertexIndexBuffer().buffer), mesh->getIndexOffset(), vk::IndexType::eUint32);
|
|
|
|
|
cmd.drawIndexed(mesh->getIndexCount(), 1, 0, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-02-13 19:15:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nlohmann::json CScene::to_json()
|
|
|
|
|
{
|
|
|
|
|
return nlohmann::json();
|
|
|
|
|
}
|
|
|
|
|
}
|