Add offscreen render targets and rename AssetRegistry to ResourceRegistry #8
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace sophia {
|
||||
|
||||
Entity::Entity(entt::entity handle, Scene* scene) : handle(handle), scene(scene) {}
|
||||
Entity::Entity(entt::entity handle, Scene* scene)
|
||||
: handle(handle), scene(scene) {}
|
||||
|
||||
} // namespace sophia
|
||||
} // namespace sophia
|
||||
|
||||
+17
-21
@@ -1,44 +1,42 @@
|
||||
#pragma once
|
||||
|
||||
#include <sophia/scene.hpp>
|
||||
#include <entt/entt.hpp>
|
||||
#include <sophia/util/assert.hpp>
|
||||
#include <sophia/scene.hpp>
|
||||
#include <sophia/types.hpp>
|
||||
#include <sophia/util/assert.hpp>
|
||||
|
||||
namespace sophia {
|
||||
|
||||
class Entity {
|
||||
public:
|
||||
public:
|
||||
Entity(const Entity&) = default;
|
||||
Entity& operator=(const Entity&) = default;
|
||||
|
||||
Entity() = default;
|
||||
Entity(entt::entity handle, Scene* scene);
|
||||
Entity(entt::entity handle, Scene* scene);
|
||||
|
||||
template<typename T, typename... Args>
|
||||
template <typename T, typename... Args>
|
||||
T& addComponent(Args&&... args) {
|
||||
SOPHIA_ASSERT(!hasComponent<T>(), "Entity already has component!");
|
||||
T& component = scene->registry.emplace<T>(handle, std::forward<Args>(args)...);
|
||||
T& component =
|
||||
scene->registry.emplace<T>(handle, std::forward<Args>(args)...);
|
||||
// scene->OnComponentAdded<T>(*this, component);
|
||||
return component;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T& getComponent()
|
||||
{
|
||||
template <typename T>
|
||||
T& getComponent() {
|
||||
SOPHIA_ASSERT(hasComponent<T>(), "Entity does not have component!");
|
||||
return scene->registry.get<T>(handle);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool hasComponent()
|
||||
{
|
||||
template <typename T>
|
||||
bool hasComponent() {
|
||||
return scene->registry.all_of<T>(handle);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void removeComponent()
|
||||
{
|
||||
template <typename T>
|
||||
void removeComponent() {
|
||||
SOPHIA_ASSERT(hasComponent<T>(), "Entity does not have component!");
|
||||
scene->registry.remove<T>(handle);
|
||||
}
|
||||
@@ -54,13 +52,11 @@ public:
|
||||
return handle == other.handle && scene == other.scene;
|
||||
}
|
||||
|
||||
bool operator!=(const Entity& other) const {
|
||||
return !(*this == other);
|
||||
}
|
||||
bool operator!=(const Entity& other) const { return !(*this == other); }
|
||||
|
||||
private:
|
||||
entt::entity handle { entt::null};
|
||||
private:
|
||||
entt::entity handle{entt::null};
|
||||
Scene* scene = nullptr;
|
||||
};
|
||||
|
||||
} // namespace sophia
|
||||
} // namespace sophia
|
||||
|
||||
@@ -1,61 +1,63 @@
|
||||
#include "rendering/scene_renderer.hpp"
|
||||
|
||||
#include <sophia/util/assert.hpp>
|
||||
#include <sophia/components.hpp>
|
||||
#include <sophia/util/assert.hpp>
|
||||
|
||||
namespace sophia {
|
||||
|
||||
namespace {
|
||||
struct PushConstantData {
|
||||
glm::mat4 transform{1.f};
|
||||
glm::vec4 color{1.f};
|
||||
};
|
||||
}
|
||||
struct PushConstantData {
|
||||
glm::mat4 transform{1.f};
|
||||
glm::vec4 color{1.f};
|
||||
};
|
||||
} // namespace
|
||||
|
||||
SceneRenderer::SceneRenderer(ResourceRegistry& resources)
|
||||
: resources{resources} {}
|
||||
|
||||
SceneRenderer::~SceneRenderer() {}
|
||||
|
||||
void SceneRenderer::render(const Scene& scene, Entity camera, RenderTargetHandle target) {
|
||||
SOPHIA_ASSERT(camera.hasComponent<CameraComponent>(), "camera does not have camera component!");
|
||||
void SceneRenderer::render(const Scene& scene, Entity camera,
|
||||
RenderTargetHandle target) {
|
||||
SOPHIA_ASSERT(camera.hasComponent<CameraComponent>(),
|
||||
"camera does not have camera component!");
|
||||
|
||||
auto& R = scene.registry;
|
||||
auto& registry = scene.registry;
|
||||
|
||||
// Get all mesh
|
||||
// For each mesh, get all entities(ES) that have a transform and that mesh
|
||||
// For e in ES: add e's transform component to a list
|
||||
// Get all mesh
|
||||
// For each mesh, get all entities(ES) that have a transform and that mesh
|
||||
// For e in ES: add e's transform component to a list
|
||||
|
||||
// We now have
|
||||
/*
|
||||
M = mesh
|
||||
T = transform
|
||||
// We now have
|
||||
/*
|
||||
M = mesh
|
||||
T = transform
|
||||
|
||||
Work Batch
|
||||
|- M0
|
||||
| |- T0
|
||||
| \- T2
|
||||
|
|
||||
|- M1
|
||||
| |- T1
|
||||
| \- T5
|
||||
|
|
||||
\- M2
|
||||
|- T3
|
||||
\- T4
|
||||
Work Batch
|
||||
|- M0
|
||||
| |- T0
|
||||
| \- T2
|
||||
|
|
||||
|- M1
|
||||
| |- T1
|
||||
| \- T5
|
||||
|
|
||||
\- M2
|
||||
|- T3
|
||||
\- T4
|
||||
|
||||
*/
|
||||
*/
|
||||
|
||||
/*
|
||||
for batch in Work Batch:
|
||||
batch.mesh.bind()
|
||||
/*
|
||||
for batch in Work Batch:
|
||||
batch.mesh.bind()
|
||||
|
||||
for transform in batch.transforms:
|
||||
commandBuffer.pushConstants(transform)
|
||||
batch.mesh.draw(commandBuffer)
|
||||
for transform in batch.transforms:
|
||||
commandBuffer.pushConstants(transform)
|
||||
batch.mesh.draw(commandBuffer)
|
||||
|
||||
NOTE: Use instanced rendering?
|
||||
*/
|
||||
NOTE: Use instanced rendering?
|
||||
*/
|
||||
}
|
||||
|
||||
} // namespace sophia
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
|
||||
namespace sophia {
|
||||
|
||||
/**
|
||||
* !TEMP to be decoupled once scene batching and rendering impl
|
||||
*/
|
||||
/**
|
||||
* !TEMP to be decoupled once scene batching and rendering impl
|
||||
*/
|
||||
class SceneRenderer {
|
||||
public:
|
||||
SceneRenderer(const SceneRenderer&) = delete;
|
||||
|
||||
Reference in New Issue
Block a user