Rework API graphique Vulkan - EnTT pour ECS + Chargement modèle 3D assimp + SDL3 pour events input et fenetre + mesh texture camera transform ok + attention tous les assets nouveaus ne sont pas commités et il y a du code test en dur dans scene addentity + restructuration globale
This commit is contained in:
@@ -1,9 +1,15 @@
|
||||
#include "CScene.hpp"
|
||||
#include "nlohmann/json_fwd.hpp"
|
||||
#include "../Component/Graphics/CTestRenderer.hpp"
|
||||
//#include "../../Controller/Exception/CRuntimeException.hpp"
|
||||
//#include "Components/CAbstractScript.hpp"
|
||||
#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 "../Component/Relationships/CRelationship.hpp"
|
||||
#include "../Graphics/API/GraphicsAPI.hpp"
|
||||
#include "../Graphics/Data/CModelLoader.hpp"
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
namespace CosmicCore {
|
||||
|
||||
CScene::CScene(std::string name) : CSerializable(),
|
||||
@@ -15,8 +21,52 @@ namespace CosmicCore {
|
||||
return m_name;
|
||||
}
|
||||
|
||||
CEntity CScene::addEntity(std::string name, std::string description){
|
||||
VulkanImpl* api = dynamic_cast<VulkanImpl*>(GraphicsAPI::getAPI().get());
|
||||
|
||||
auto handle = m_ecManager.registry.create();
|
||||
CEntity handler(m_ecManager, handle, this);
|
||||
m_ecManager().emplace<CTransform>(handle, handler);
|
||||
m_ecManager().emplace<CMetaData>(handle, handler, std::move(name), std::move(description));
|
||||
|
||||
auto& rM = GraphicsAPI::getAPI()->getResourceManager();
|
||||
|
||||
auto model = CModelLoader::loadModel("assets/models/cube.glb", rM);
|
||||
|
||||
rM.getTextureManager().loadedTextures.push_back(std::make_unique<CTexture>("assets/shrekt.png"));
|
||||
auto texture = rM.getTextureManager().loadedTextures.back().get();
|
||||
texture->init();
|
||||
for(auto& mesh : model->getMeshes())
|
||||
{
|
||||
mesh->getMaterial()->textureAlbedo = texture;
|
||||
mesh->getMaterial()->build();
|
||||
}
|
||||
|
||||
m_ecManager().emplace<CRenderer>(handle, handler, model);
|
||||
auto& tr = m_ecManager.registry.get<CTransform>(handle);
|
||||
tr.initUniformBuffer(dynamic_cast<VulkanImpl*>(GraphicsAPI::getAPI().get())->getAllocator());
|
||||
tr.updateUniformBuffer(0);
|
||||
tr.updateUniformBuffer(1);
|
||||
|
||||
auto camHandle = m_ecManager.registry.create();
|
||||
CEntity handlerCam(m_ecManager, camHandle, this);
|
||||
|
||||
auto& transform = m_ecManager().emplace<CTransform>(camHandle, handlerCam);
|
||||
auto& cam = m_ecManager.registry.emplace<CCamera>(camHandle, handlerCam);
|
||||
|
||||
m_ecManager.registry.emplace<CRelationship>(camHandle, handlerCam, std::vector<EntityId>{handle});
|
||||
m_ecManager.registry.emplace<CRelationship>(handle, handler, camHandle);
|
||||
|
||||
transform.setCenter({0.0f, 0.9f, 3.0f});
|
||||
cam.setAspect((float)api->getSwapChainExtent().width / api->getSwapChainExtent().height);
|
||||
cam.initUniformBuffer(api->getAllocator());
|
||||
cam.updateUniformBuffer(0, transform);
|
||||
cam.updateUniformBuffer(1, transform);
|
||||
return handler;
|
||||
}
|
||||
|
||||
unsigned int CScene::getNumEntity(void) const {
|
||||
return this->m_ecManager.view<CMetaData>()->size();
|
||||
return m_ecManager().view<CMetaData>()->size();
|
||||
}
|
||||
|
||||
void CScene::removeEntity(unsigned int index, bool destroy)
|
||||
@@ -24,24 +74,57 @@ namespace CosmicCore {
|
||||
|
||||
}
|
||||
|
||||
void CScene::render(){
|
||||
auto renderers = m_ecManager.view<CTestRenderer>();
|
||||
for(auto beg = renderers->begin(); beg != renderers->end(); ++beg)
|
||||
{
|
||||
beg->render();
|
||||
}
|
||||
//std::chrono::steady_clock::time_point begin1 = std::chrono::steady_clock::now();
|
||||
//auto eh = m_ecManager.create();
|
||||
//m_ecManager.emplace<CTestRenderer>(eh, nullptr);
|
||||
//std::chrono::steady_clock::time_point end1 = std::chrono::steady_clock::now();
|
||||
//std::cout << "added entity and comptest : " <<std::chrono::duration_cast<std::chrono::seconds>(end1 - begin1).count() << std::endl;
|
||||
//static unsigned int entitynb = 0;
|
||||
//entitynb++;
|
||||
//std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
|
||||
//m_ecManager.view<CTestRenderer>().each([](auto e, CTestRenderer& comp){comp.render();});
|
||||
//std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
|
||||
//std::cout << "render func : " << std::chrono::duration_cast<std::chrono::seconds>(end - begin).count() << std::endl;
|
||||
//std::cout << "nb : " << entitynb << std::endl;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// void CScene::setMask(unsigned int mask)
|
||||
|
||||
Reference in New Issue
Block a user