Skip to content

Commit f6e9722

Browse files
committed
add HudEntity
1 parent 8d73e10 commit f6e9722

File tree

6 files changed

+82
-31
lines changed

6 files changed

+82
-31
lines changed

games/HOME/bits/BackpackEntity.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace home {
1414

1515
class GameHub;
1616

17-
class BackpackEntity : public gf::Entity {
17+
class BackpackEntity : public gf::HudEntity {
1818
public:
1919
BackpackEntity(GameHub* hub, const WorldResources& resources);
2020

include/gf2/graphics/Entity.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define GF_ENTITY_H
55

66
#include <gf2/core/Time.h>
7+
#include <gf2/core/Vec2.h>
78

89
#include "GraphicsApi.h"
910

@@ -37,6 +38,11 @@ namespace gf {
3738
int32_t m_priority = 0;
3839
};
3940

41+
class HudEntity : public Entity {
42+
public:
43+
virtual void resize(Vec2I surface_size);
44+
};
45+
4046
}
4147

4248
#endif // GF_ENTITY_H

include/gf2/graphics/Scene.h

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include <gf2/core/SceneTypes.h>
1010
#include <gf2/core/Time.h>
1111

12-
#include "EntityContainer.h"
12+
#include "Entity.h"
1313
#include "Event.h"
1414
#include "GraphicsApi.h"
1515

@@ -49,14 +49,20 @@ namespace gf {
4949
void render(RenderRecorder& recorder);
5050

5151
protected:
52-
struct ScenePart {
53-
EntityContainer entities;
54-
Camera camera;
55-
};
52+
template<typename EntityType>
53+
void render_part(RenderRecorder& recorder, std::vector<EntityType*>& entities, Camera& camera)
54+
{
55+
render_part_start(recorder, camera);
5656

57-
void render_part(RenderRecorder& recorder, ScenePart& part);
57+
for (Entity* entity : entities) {
58+
entity->render(recorder);
59+
}
60+
}
5861

5962
private:
63+
void render_part_start(RenderRecorder& recorder, Camera& camera);
64+
65+
virtual void on_resize(Vec2I surface_size);
6066
virtual void on_rank_change(SceneRank old_rank, SceneRank new_rank);
6167

6268
virtual void do_pause();
@@ -88,7 +94,7 @@ namespace gf {
8894
void add_model(Model* model);
8995

9096
void add_world_entity(Entity* entity);
91-
void add_hud_entity(Entity* entity);
97+
void add_hud_entity(HudEntity* entity);
9298

9399
Vec2F position_to_world_location(Vec2I position);
94100
Vec2I world_location_to_position(Vec2F location);
@@ -99,16 +105,20 @@ namespace gf {
99105

100106
Camera* world_camera()
101107
{
102-
return &m_world.camera;
108+
return &m_world_camera;
103109
}
104110

105111
private:
112+
void on_resize(Vec2I surface_size) override;
113+
106114
void do_update(Time time) override;
107115
void do_render(RenderRecorder& recorder) override;
108116

109117
ModelContainer m_models;
110-
ScenePart m_world;
111-
ScenePart m_hud;
118+
std::vector<Entity*> m_world_entities;
119+
Camera m_world_camera;
120+
std::vector<HudEntity*> m_hud_entities;
121+
Camera m_hud_camera;
112122
};
113123

114124
}

include/gf2/imgui/ImguiEntity.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct ImDrawData;
1717

1818
namespace gf {
1919

20-
class GF_IMGUI_API ImguiEntity : public Entity {
20+
class GF_IMGUI_API ImguiEntity : public HudEntity {
2121
public:
2222
ImguiEntity();
2323

library/graphics/Entity.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
namespace gf {
77

8+
/*
9+
* Entity
10+
*/
11+
812
Entity::Entity(int32_t priority)
913
: m_priority(priority)
1014
{
@@ -22,4 +26,13 @@ namespace gf {
2226
// do nothing by default
2327
}
2428

29+
/*
30+
* HudEntity
31+
*/
32+
33+
void HudEntity::resize([[maybe_unused]] Vec2I surface_size)
34+
{
35+
// do nothing by default
36+
}
37+
2538
}

library/graphics/Scene.cc

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace gf {
1616
void BasicScene::set_surface_size(Vec2I size)
1717
{
1818
m_surface_size = size;
19+
on_resize(size);
1920
}
2021

2122
Vec2I BasicScene::surface_size() const
@@ -110,11 +111,15 @@ namespace gf {
110111
do_render(recorder);
111112
}
112113

113-
void BasicScene::render_part(RenderRecorder& recorder, ScenePart& part)
114+
void BasicScene::render_part_start(RenderRecorder& recorder, Camera& camera)
114115
{
115-
part.camera.update(m_surface_size);
116-
recorder.update_view(part.camera.compute_view_matrix(), part.camera.compute_viewport(m_surface_size));
117-
part.entities.render(recorder);
116+
camera.update(m_surface_size);
117+
recorder.update_view(camera.compute_view_matrix(), camera.compute_viewport(m_surface_size));
118+
}
119+
120+
void BasicScene::on_resize([[maybe_unused]] Vec2I surface_size)
121+
{
122+
// do nothing by default
118123
}
119124

120125
void BasicScene::on_rank_change([[maybe_unused]] SceneRank old_rank, [[maybe_unused]] SceneRank new_rank)
@@ -174,18 +179,18 @@ namespace gf {
174179

175180
Scene::Scene()
176181
{
177-
m_world.camera.type = CameraType::Extend;
178-
m_hud.camera.type = CameraType::Window;
182+
m_world_camera.type = CameraType::Extend;
183+
m_hud_camera.type = CameraType::Window;
179184
}
180185

181186
void Scene::set_world_center(Vec2F center)
182187
{
183-
m_world.camera.center = center;
188+
m_world_camera.center = center;
184189
}
185190

186191
void Scene::set_world_size(Vec2F size)
187192
{
188-
m_world.camera.size = size;
193+
m_world_camera.size = size;
189194
}
190195

191196
void Scene::add_model(Model* model)
@@ -195,39 +200,56 @@ namespace gf {
195200

196201
void Scene::add_world_entity(Entity* entity)
197202
{
198-
m_world.entities.add_entity(entity);
203+
if (entity != nullptr) {
204+
m_world_entities.push_back(entity);
205+
}
199206
}
200207

201-
void Scene::add_hud_entity(Entity* entity)
208+
void Scene::add_hud_entity(HudEntity* entity)
202209
{
203-
m_hud.entities.add_entity(entity);
210+
if (entity != nullptr) {
211+
m_hud_entities.push_back(entity);
212+
}
204213
}
205214

206215
Vec2F Scene::position_to_world_location(Vec2I position)
207216
{
208-
return m_world.camera.position_to_location(position, surface_size());
217+
return m_world_camera.position_to_location(position, surface_size());
209218
}
210219

211220
Vec2I Scene::world_location_to_position(Vec2F location)
212221
{
213-
return m_world.camera.location_to_position(location, surface_size());
222+
return m_world_camera.location_to_position(location, surface_size());
214223
}
215224

216225
void Scene::update_entities(Time time)
217226
{
218227
m_models.update(time);
219-
m_world.entities.update(time);
220-
m_hud.entities.update(time);
228+
229+
for (Entity* entity : m_world_entities) {
230+
entity->update(time);
231+
}
232+
233+
for (HudEntity* entity : m_hud_entities) {
234+
entity->update(time);
235+
}
221236
}
222237

223238
void Scene::render_entities(RenderRecorder& recorder)
224239
{
225-
if (!m_world.entities.empty()) {
226-
render_part(recorder, m_world);
240+
if (!m_world_entities.empty()) {
241+
render_part(recorder, m_world_entities, m_world_camera);
227242
}
228243

229-
if (!m_hud.entities.empty()) {
230-
render_part(recorder, m_hud);
244+
if (!m_hud_entities.empty()) {
245+
render_part(recorder, m_hud_entities, m_hud_camera);
246+
}
247+
}
248+
249+
void Scene::on_resize(Vec2I surface_size)
250+
{
251+
for (HudEntity* entity : m_hud_entities) {
252+
entity->resize(surface_size);
231253
}
232254
}
233255

0 commit comments

Comments
 (0)