Add offscreen render targets and rename AssetRegistry to ResourceRegistry #8

Merged
burkkyy merged 26 commits from dev into main 2026-09-25 20:39:26 -07:00
4 changed files with 62 additions and 63 deletions
Showing only changes of commit 6a50cdb4e8 - Show all commits
+3 -2
View File
@@ -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
View File
@@ -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
+39 -37
View File
@@ -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
+3 -3
View File
@@ -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;