Test font pas fini
This commit is contained in:
@@ -9,7 +9,13 @@
|
||||
#include "../../Utils/Factory/CEntityFactory.hpp"
|
||||
#include "../../Utils/Factory/ComponentFactory.hpp"
|
||||
|
||||
#include "Core/Component/Camera/CCamera2D.hpp"
|
||||
#include "Core/Component/Collider/CCollider2D.hpp"
|
||||
#include "Core/Component/Geometry/CTransform2D.hpp"
|
||||
#include "Core/Component/Graphics/CRenderer2D.hpp"
|
||||
#include "Core/Component/Graphics/CTextRenderer.hpp"
|
||||
#include "Core/Component/Light/CLight.hpp"
|
||||
#include "Core/Entity/EntityComponentManager.hpp"
|
||||
#include "glm/ext/vector_float3.hpp"
|
||||
#include "glm/gtc/type_ptr.hpp"
|
||||
#include "nlohmann/json_fwd.hpp"
|
||||
@@ -32,6 +38,11 @@ namespace CosmicCore {
|
||||
m_audioWorld.initWorld();
|
||||
m_scriptWorld.initWorld();
|
||||
m_lightsBuffer.init();
|
||||
//m_uiWorld.init();
|
||||
|
||||
m_ecManager.registry.sort<CTransform2D>([](const CTransform2D& lhs, const CTransform2D& rhs) {
|
||||
return lhs.getZOrder() > rhs.getZOrder();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +55,8 @@ namespace CosmicCore {
|
||||
m_tangibleWorld.destroy();
|
||||
m_audioWorld.destroy();
|
||||
m_scriptWorld.destroy();
|
||||
m_lightsBuffer.destroy();
|
||||
//m_uiWorld.destroy();
|
||||
}
|
||||
|
||||
CEntity CScene::createEntity(){
|
||||
@@ -92,66 +105,165 @@ namespace CosmicCore {
|
||||
m_lightsBuffer.update(frameIndex, lightsData);
|
||||
}
|
||||
|
||||
|
||||
void CScene::render(vk::raii::CommandBuffer& cmd, uint32_t frameIndex){
|
||||
void CScene::render3D(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());
|
||||
|
||||
collectLights(cmd, frameIndex);
|
||||
|
||||
camera.updateUniformBuffer(frameIndex, transform);
|
||||
|
||||
cmd.bindDescriptorSets(
|
||||
vk::PipelineBindPoint::eGraphics,
|
||||
api->getDefaultPipelineLayout(), // layout du pipeline
|
||||
0,
|
||||
*camera.getDescriptorSet(frameIndex),
|
||||
{}
|
||||
);
|
||||
|
||||
//bind lumières (set 3)
|
||||
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics,
|
||||
api->getDefaultPipelineLayout(), 3,
|
||||
*m_lightsBuffer.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)
|
||||
if(entities.begin() != entities.end())
|
||||
{
|
||||
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());
|
||||
|
||||
collectLights(cmd, frameIndex);
|
||||
|
||||
camera.updateUniformBuffer(frameIndex, transform);
|
||||
|
||||
cmd.bindDescriptorSets(
|
||||
vk::PipelineBindPoint::eGraphics,
|
||||
api->getDefaultPipelineLayout(), // layout du pipeline
|
||||
1, // set = 1
|
||||
*transform.getDescriptorSet(frameIndex),
|
||||
0,
|
||||
*camera.getDescriptorSet(frameIndex),
|
||||
{}
|
||||
);
|
||||
|
||||
//bind lumières (set 3)
|
||||
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics,
|
||||
api->getDefaultPipelineLayout(), 3,
|
||||
*m_lightsBuffer.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& mm : model->getMeshMaterials()) {
|
||||
// ne rebind le pipeline que si le material change
|
||||
//if (mesh.getMaterial() != boundMaterial) {
|
||||
//boundMaterial = mesh.getMaterial();
|
||||
cmd.bindPipeline(vk::PipelineBindPoint::eGraphics,
|
||||
*mm.material->getPipeline());
|
||||
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics,
|
||||
*mm.material->getPipelineLayout(),
|
||||
2,
|
||||
*mm.material->getDescriptorSet(frameIndex),
|
||||
{});
|
||||
//}
|
||||
|
||||
cmd.bindVertexBuffers(0, vk::Buffer(mm.mesh->getVertexIndexBuffer().buffer), mm.mesh->getVertexOffset());
|
||||
cmd.bindIndexBuffer(vk::Buffer(mm.mesh->getVertexIndexBuffer().buffer), mm.mesh->getIndexOffset(), vk::IndexType::eUint32);
|
||||
cmd.drawIndexed(mm.mesh->getIndexCount(), 1, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& mm : model->getMeshMaterials()) {
|
||||
// ne rebind le pipeline que si le material change
|
||||
//if (mesh.getMaterial() != boundMaterial) {
|
||||
//boundMaterial = mesh.getMaterial();
|
||||
cmd.bindPipeline(vk::PipelineBindPoint::eGraphics,
|
||||
*mm.material->getPipeline());
|
||||
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics,
|
||||
*mm.material->getPipelineLayout(),
|
||||
2,
|
||||
*mm.material->getDescriptorSet(frameIndex),
|
||||
{});
|
||||
//}
|
||||
|
||||
cmd.bindVertexBuffers(0, vk::Buffer(mm.mesh->getVertexIndexBuffer().buffer), mm.mesh->getVertexOffset());
|
||||
cmd.bindIndexBuffer(vk::Buffer(mm.mesh->getVertexIndexBuffer().buffer), mm.mesh->getIndexOffset(), vk::IndexType::eUint32);
|
||||
cmd.drawIndexed(mm.mesh->getIndexCount(), 1, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
void CScene::render2D(vk::raii::CommandBuffer& cmd, uint32_t frameIndex){
|
||||
auto entities = m_ecManager.registry.view<CRenderer2D, CTransform2D>();
|
||||
auto textEntities = m_ecManager.registry.view<CTextRenderer, CTransform2D>();
|
||||
|
||||
if(entities.begin() != entities.end())
|
||||
{
|
||||
VulkanImpl* api = dynamic_cast<VulkanImpl*>(GraphicsAPI::getAPI().get());
|
||||
auto cam = m_ecManager.registry.view<CCamera2D>();
|
||||
auto& camera = m_ecManager.registry.get<CCamera2D>(cam.front());
|
||||
auto& trCam = m_ecManager.registry.get<CTransform2D>(cam.front());
|
||||
|
||||
camera.updateUniformBuffer(frameIndex, trCam);
|
||||
//
|
||||
cmd.bindDescriptorSets(
|
||||
vk::PipelineBindPoint::eGraphics,
|
||||
api->getDefault2DPipelineLayout(), // layout du pipeline
|
||||
2,
|
||||
*camera.getDescriptorSet(frameIndex),
|
||||
{}
|
||||
);
|
||||
|
||||
for (auto& entity : entities) {
|
||||
auto model = m_ecManager.registry.get<CRenderer2D>(entity).getModel();
|
||||
auto& transform = m_ecManager.registry.get<CTransform2D>(entity);
|
||||
|
||||
transform.updateUniformBuffer(frameIndex);
|
||||
|
||||
// bind transform UBO (set = 1)
|
||||
cmd.bindDescriptorSets(
|
||||
vk::PipelineBindPoint::eGraphics,
|
||||
api->getDefault2DPipelineLayout(), // layout du pipeline
|
||||
0, // set = 1
|
||||
*transform.getDescriptorSet(frameIndex),
|
||||
{}
|
||||
);
|
||||
|
||||
for (auto& mm : model->getMeshMaterials()) {
|
||||
// ne rebind le pipeline que si le material change
|
||||
//if (mesh.getMaterial() != boundMaterial) {
|
||||
//boundMaterial = mesh.getMaterial();
|
||||
cmd.bindPipeline(vk::PipelineBindPoint::eGraphics,
|
||||
*mm.material->getPipeline());
|
||||
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics,
|
||||
*mm.material->getPipelineLayout(),
|
||||
1,
|
||||
*mm.material->getDescriptorSet(frameIndex),
|
||||
{});
|
||||
//}
|
||||
|
||||
cmd.bindVertexBuffers(0, vk::Buffer(mm.mesh->getVertexIndexBuffer().buffer), mm.mesh->getVertexOffset());
|
||||
cmd.bindIndexBuffer(vk::Buffer(mm.mesh->getVertexIndexBuffer().buffer), mm.mesh->getIndexOffset(), vk::IndexType::eUint32);
|
||||
cmd.drawIndexed(mm.mesh->getIndexCount(), 1, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& entity : textEntities) {
|
||||
auto& textRenderer = m_ecManager.registry.get<CTextRenderer>(entity);
|
||||
auto& transform = m_ecManager.registry.get<CTransform2D>(entity);
|
||||
auto model = textRenderer.getModel();
|
||||
transform.updateUniformBuffer(frameIndex);
|
||||
|
||||
// bind transform UBO (set = 1)
|
||||
cmd.bindDescriptorSets(
|
||||
vk::PipelineBindPoint::eGraphics,
|
||||
api->getDefault2DPipelineLayout(), // layout du pipeline
|
||||
0, // set = 1
|
||||
*transform.getDescriptorSet(frameIndex),
|
||||
{}
|
||||
);
|
||||
|
||||
for (auto& mm : model->getMeshMaterials()) {
|
||||
// ne rebind le pipeline que si le material change
|
||||
//if (mesh.getMaterial() != boundMaterial) {
|
||||
//boundMaterial = mesh.getMaterial();
|
||||
cmd.bindPipeline(vk::PipelineBindPoint::eGraphics,
|
||||
*mm.material->getPipeline());
|
||||
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics,
|
||||
*mm.material->getPipelineLayout(),
|
||||
1,
|
||||
*mm.material->getDescriptorSet(frameIndex),
|
||||
{});
|
||||
//}
|
||||
cmd.bindVertexBuffers(0, vk::Buffer(mm.mesh->getVertexIndexBuffer().buffer), mm.mesh->getVertexOffset());
|
||||
cmd.bindIndexBuffer(vk::Buffer(mm.mesh->getVertexIndexBuffer().buffer), mm.mesh->getIndexOffset(), vk::IndexType::eUint32);
|
||||
cmd.drawIndexed(mm.mesh->getIndexCount(), 1, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void CScene::render(vk::raii::CommandBuffer& cmd, uint32_t frameIndex){
|
||||
render3D(cmd, frameIndex);
|
||||
render2D(cmd, frameIndex);
|
||||
}
|
||||
|
||||
nlohmann::json CScene::to_json()
|
||||
@@ -285,6 +397,59 @@ namespace CosmicCore {
|
||||
}
|
||||
}
|
||||
|
||||
nlohmann::json& entities2D = sceneJson[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Scene_Entities2D)];
|
||||
for(auto& entity : entities2D.items())
|
||||
{
|
||||
nlohmann::json& entityObj = entity.value();
|
||||
auto ref = entityObj[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Entity2D_Ref)].get<unsigned int>();
|
||||
|
||||
nlohmann::json& components = entityObj[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Entity2D_Components)];
|
||||
nlohmann::json& transform = components[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Component_Transform2D)];
|
||||
nlohmann::json& camera = components[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Component_Camera2D)];
|
||||
nlohmann::json& collider = components[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Component_Collider2D)];
|
||||
nlohmann::json& renderer = components[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Component_Renderer2D)];
|
||||
nlohmann::json& script = components[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Component_Script)];
|
||||
|
||||
auto trConfig(!transform.is_null() ? std::optional<CosmicUtils::ComponentFactory::Transform2DConfig>({
|
||||
glm::make_vec2(transform[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Transform_Position2D)].get<std::vector<float>>().data()),
|
||||
glm::make_vec2(transform[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Transform_Size2D)].get<std::vector<float>>().data()),
|
||||
glm::make_vec2(transform[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Transform_Scale2D)].get<std::vector<float>>().data()),
|
||||
glm::make_vec2(transform[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Transform_Pivot2D)].get<std::vector<float>>().data()),
|
||||
transform[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Transform_Rotation2D)].get<float>(),
|
||||
transform[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Transform_zOrder2D)].get<float>(),
|
||||
transform[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Transform_Visible2D)].get<bool>()
|
||||
}) : std::nullopt);
|
||||
|
||||
auto camConfig(!camera.is_null() ? std::optional<CosmicUtils::ComponentFactory::Camera2DConfig>({
|
||||
camera[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Camera_Zoom2D)].get<float>()
|
||||
}) : std::nullopt);
|
||||
|
||||
auto colliderConfig(!collider.is_null() ? std::optional<CosmicUtils::ComponentFactory::Collider2DConfig>({
|
||||
static_cast<E2DShape>(collider[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Collider_Shape2D)].get<int>())
|
||||
}) : std::nullopt);
|
||||
|
||||
auto rendererConfig(!renderer.is_null() ? std::optional<CosmicUtils::ComponentFactory::Renderer2DConfig>({
|
||||
renderer[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Renderer_Model2D)].get<std::string>(),
|
||||
renderer[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Renderer_Shader2D)].get<std::string>(),
|
||||
}) : std::nullopt);
|
||||
|
||||
auto scriptConfig(!script.is_null() ? std::optional<CosmicUtils::ComponentFactory::ScriptConfig>({
|
||||
script.get<std::vector<std::string>>()
|
||||
}): std::nullopt);
|
||||
|
||||
CosmicUtils::CEntityFactory::Entity2DConfig config = {
|
||||
entityObj[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Entity2D_Name)],
|
||||
entityObj[CosmicUtils::JsonKeyRegistry::key(CosmicUtils::EJsonKeys::Entity2D_Description)],
|
||||
trConfig,
|
||||
camConfig,
|
||||
rendererConfig,
|
||||
colliderConfig,
|
||||
scriptConfig
|
||||
};
|
||||
|
||||
auto entityHandle = CosmicUtils::CEntityFactory::create(scene.get(), config);
|
||||
}
|
||||
|
||||
//Connect entities to relationships
|
||||
for(auto& [entityNb, handle]: idToHandle)
|
||||
{
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "../Systems/Audio/CAudioWorld.hpp"
|
||||
#include "../Systems/Scripts/CScriptWorld.hpp"
|
||||
#include "Core/Systems/Graphics/Data/Light/CLightsBuffer.hpp"
|
||||
#include "Core/Systems/Graphics/UserInterface/CUIWorld.hpp"
|
||||
|
||||
namespace CosmicCore {
|
||||
class CEntity;
|
||||
@@ -21,6 +22,11 @@ namespace CosmicCore {
|
||||
CAudioWorld m_audioWorld;
|
||||
CScriptWorld m_scriptWorld;
|
||||
CLightsBuffer m_lightsBuffer;
|
||||
//CUIWorld m_uiWorld;
|
||||
|
||||
void render3D(vk::raii::CommandBuffer& cmd, uint32_t frameIndex);
|
||||
void render2D(vk::raii::CommandBuffer& cmd, uint32_t frameIndex);
|
||||
|
||||
public:
|
||||
CScene() = delete;
|
||||
CScene(std::string name);
|
||||
@@ -47,6 +53,7 @@ namespace CosmicCore {
|
||||
|
||||
CScriptWorld& getScriptWorld() {return m_scriptWorld;};
|
||||
|
||||
//CUIWorld& getUIWorld() {return m_uiWorld;};
|
||||
//CEntity* getActiveCamera();
|
||||
//void setActiveCamera(CEntity* newCamera);
|
||||
|
||||
@@ -87,6 +94,7 @@ namespace CosmicCore {
|
||||
//unsigned int getMask();
|
||||
|
||||
void render(vk::raii::CommandBuffer& cmd, uint32_t frameIndex);
|
||||
|
||||
void collectLights(vk::raii::CommandBuffer& cmd, uint32_t frameIndex);
|
||||
//void updateScript();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user