Skip to content

Commit b48a14a

Browse files
committed
fix imgui with new texture handling (wip)
1 parent ea632e3 commit b48a14a

File tree

17 files changed

+289
-56
lines changed

17 files changed

+289
-56
lines changed

examples/15-imgui.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ int main()
6464
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
6565
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
6666
io.IniFilename = nullptr;
67-
io.Fonts->AddFontFromFileTTF(font_file.string().c_str(), 20);
67+
io.Fonts->AddFontFromFileTTF(font_file.string().c_str());
6868

6969
ImguiScene scene(&scene_manager);
7070
return scene_manager.run(&scene);

examples/events.cc

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// SPDX-License-Identifier: Zlib
2+
// Copyright (c) 2023-2025 Julien Bernard
3+
4+
#include <gf2/core/Log.h>
5+
6+
#include <gf2/graphics/Scene.h>
7+
#include <gf2/graphics/SceneManager.h>
8+
9+
namespace {
10+
11+
class EventScene : public gf::Scene {
12+
public:
13+
EventScene()
14+
{
15+
set_world_size({ 1000.0f, 1000.0f });
16+
set_world_center({ 0.0f, 0.0f });
17+
}
18+
19+
private:
20+
void do_process_event(const gf::Event& event) override
21+
{
22+
switch (event.type()) {
23+
// case gf::EventType::MouseMoved:
24+
// {
25+
// const auto& mouse_motion_event = event.from<gf::EventType::MouseMoved>();
26+
// auto mouse_position = mouse_motion_event.position;
27+
// auto mouse_location = position_to_world_location(mouse_position);
28+
//
29+
// gf::Log::info("mouse: position = ({},{}), location = ({},{})", mouse_position.x, mouse_position.y, mouse_location.x, mouse_location.y);
30+
// }
31+
// break;
32+
33+
case gf::EventType::MouseButtonPressed:
34+
{
35+
const auto& event_data = event.from<gf::EventType::MouseButtonPressed>();
36+
auto mouse_position = event_data.position;
37+
auto mouse_location = position_to_world_location(mouse_position);
38+
39+
gf::Log::info("mouse: position = ({},{}), location = ({},{})", mouse_position.x, mouse_position.y, mouse_location.x, mouse_location.y);
40+
}
41+
break;
42+
43+
default:
44+
break;
45+
}
46+
}
47+
};
48+
49+
}
50+
51+
int main()
52+
{
53+
gf::SingleSceneManager scene_manager("events | gf2", gf::vec(1600, 900));
54+
EventScene scene;
55+
return scene_manager.run(&scene);
56+
}

examples/hud.cc

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// SPDX-License-Identifier: Zlib
2+
// Copyright (c) 2023-2025 Julien Bernard
3+
4+
#include <gf2/core/ShapeBuffer.h>
5+
6+
#include <gf2/core/Log.h>
7+
8+
#include <gf2/graphics/Entity.h>
9+
#include <gf2/graphics/RenderManager.h>
10+
#include <gf2/graphics/RenderRecorder.h>
11+
#include <gf2/graphics/Scene.h>
12+
#include <gf2/graphics/SceneManager.h>
13+
#include <gf2/graphics/ShapeEntity.h>
14+
15+
namespace {
16+
17+
class HUD : public gf::HudEntity {
18+
public:
19+
HUD(gf::RenderManager* render_manager)
20+
: m_render_manager(render_manager)
21+
, m_entity({}, render_manager)
22+
{
23+
resize(render_manager->surface_size());
24+
}
25+
26+
void resize(gf::Vec2I surface_size) override
27+
{
28+
const gf::RectF surface = gf::RectF::from_size(surface_size);
29+
30+
auto shape_at = [surface](gf::Orientation orientation) {
31+
constexpr gf::Vec2F Size = { 50.0f, 50.0f };
32+
const gf::Vec2F position = surface.position_at(orientation);
33+
const gf::RectF rectangle = gf::RectF::from_center_size(position, Size);
34+
gf::ShapeBuffer shape = gf::ShapeBuffer::make_rectangle(rectangle);
35+
shape.color = gf::Red;
36+
return shape;
37+
};
38+
39+
gf::ShapeGroupBuffer buffer;
40+
41+
buffer.shapes.push_back(shape_at(gf::Orientation::NorthWest));
42+
buffer.shapes.push_back(shape_at(gf::Orientation::North));
43+
buffer.shapes.push_back(shape_at(gf::Orientation::NorthEast));
44+
buffer.shapes.push_back(shape_at(gf::Orientation::East));
45+
buffer.shapes.push_back(shape_at(gf::Orientation::SouthEast));
46+
buffer.shapes.push_back(shape_at(gf::Orientation::South));
47+
buffer.shapes.push_back(shape_at(gf::Orientation::SouthWest));
48+
buffer.shapes.push_back(shape_at(gf::Orientation::West));
49+
buffer.shapes.push_back(shape_at(gf::Orientation::Center));
50+
51+
m_entity.shape_group().update(buffer, m_render_manager);
52+
m_entity.set_origin({ 0.5f, 0.5f });
53+
m_entity.set_location(surface_size / 2.0f);
54+
}
55+
56+
void render(gf::RenderRecorder& recorder) override
57+
{
58+
m_entity.render(recorder);
59+
}
60+
61+
private:
62+
gf::RenderManager* m_render_manager;
63+
gf::ShapeGroupEntity m_entity;
64+
};
65+
66+
}
67+
68+
69+
int main()
70+
{
71+
gf::SingleSceneManager scene_manager("events | gf2", gf::vec(1600, 900));
72+
gf::Scene scene;
73+
scene.set_world_center({ 0.0f, 0.0f });
74+
scene.set_world_size({ 1000.0f, 1000.0f });
75+
76+
HUD hud(scene_manager.render_manager());
77+
scene.add_hud_entity(&hud);
78+
79+
return scene_manager.run(&scene);
80+
}

examples/xmake.lua

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ if has_config("examples") then
1313
add_deps("gf2core0")
1414
set_rundir("$(projectdir)/docs/assets/colors")
1515

16+
target("events")
17+
set_kind("binary")
18+
add_files("events.cc")
19+
add_deps("gf2graphics0")
20+
add_includedirs("$(builddir)/config/examples")
21+
22+
target("hud")
23+
set_kind("binary")
24+
add_files("hud.cc")
25+
add_deps("gf2graphics0")
26+
add_includedirs("$(builddir)/config/examples")
27+
1628
target("10-sprite")
1729
set_kind("binary")
1830
add_files("10-sprite.cc")

include/gf2/graphics/Texture.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ namespace gf {
5858

5959
void update(const Image& image, RenderManager* render_manager);
6060
void update(const Bitmap& bitmap, RenderManager* render_manager);
61+
void update(std::size_t size, const uint8_t* data, RenderManager* render_manager);
6162

6263
Vec2I size() const
6364
{

include/gf2/imgui/ImguiEntity.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
#ifndef GF_IMGUI_ENTITY_H
44
#define GF_IMGUI_ENTITY_H
55

6+
#include <memory>
7+
#include <vector>
8+
69
#include <gf2/core/Rect.h>
710
#include <gf2/core/Transform.h>
811
#include <gf2/core/Vec2.h>
@@ -14,8 +17,10 @@
1417
#include "ImguiApi.h"
1518

1619
struct ImDrawData;
20+
struct ImTextureData;
1721

1822
namespace gf {
23+
class RenderManager;
1924

2025
class GF_IMGUI_API ImguiEntity : public HudEntity {
2126
public:
@@ -26,6 +31,10 @@ namespace gf {
2631
void render(RenderRecorder& recorder) override;
2732

2833
private:
34+
void update_texture(ImTextureData* texture_data, RenderManager* render_manager);
35+
36+
std::vector<std::unique_ptr<Texture>> m_textures;
37+
2938
DynamicBuffer m_vertices;
3039
DynamicBuffer m_indices;
3140

include/gf2/imgui/ImguiManager.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ namespace gf {
3636

3737
void update_mouse_cursor();
3838

39-
Texture m_font_texture;
4039
CursorType m_cursor_type = CursorType::Default;
4140
Cursor m_cursor;
4241
};

library/core/Camera.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ namespace gf {
131131
const Vec2F viewport_size = target_size * viewport.extent;
132132

133133
m_computed_size = viewport_size;
134-
center = viewport_size / 2.0f;
134+
center = viewport.offset + viewport_size / 2.0f;
135+
size = viewport_size;
135136
break;
136137
}
137138
case CameraType::Stretch:

library/graphics/Events.cc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@
33

44
#include <gf2/graphics/Events.h>
55

6-
#include <algorithm>
7-
#include <tuple>
8-
#include <type_traits>
9-
106
#include <SDL3/SDL.h>
117

128
#include <gf2/core/Log.h>

library/graphics/Scene.cc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ namespace gf {
1515

1616
void BasicScene::set_surface_size(Vec2I size)
1717
{
18-
m_surface_size = size;
19-
on_resize(size);
18+
if (m_surface_size != size) {
19+
m_surface_size = size;
20+
on_resize(size);
21+
}
2022
}
2123

2224
Vec2I BasicScene::surface_size() const
@@ -123,7 +125,6 @@ namespace gf {
123125

124126
void BasicScene::render_part_start(RenderRecorder& recorder, Camera& camera)
125127
{
126-
camera.update(m_surface_size);
127128
recorder.update_view(camera.compute_view_matrix(), camera.compute_viewport(m_surface_size));
128129
}
129130

@@ -247,10 +248,14 @@ namespace gf {
247248

248249
void Scene::render_entities(RenderRecorder& recorder)
249250
{
251+
m_world_camera.update(surface_size());
252+
250253
if (!m_world_entities.empty()) {
251254
render_part(recorder, m_world_entities, m_world_camera);
252255
}
253256

257+
m_hud_camera.update(surface_size());
258+
254259
if (!m_hud_entities.empty()) {
255260
render_part(recorder, m_hud_entities, m_hud_camera);
256261
}

0 commit comments

Comments
 (0)