Skip to content

Commit 330667f

Browse files
committed
renderer: particles: using weak_ptr for storing the camera
1 parent 6bec900 commit 330667f

File tree

10 files changed

+75
-61
lines changed

10 files changed

+75
-61
lines changed

examples/demo/include/demo/callbacks/camera_mouse.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
#include <brenta/renderer/camera.hpp>
99
#include <brenta/mouse.hpp>
1010

11-
void init_camera_mouse_callback(brenta::Camera *cam, brenta::Mouse *mouse);
11+
void init_camera_mouse_callback(tenno::weak_ptr<brenta::Camera> cam,
12+
brenta::Mouse *mouse);

examples/demo/include/demo/resources/camera.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ using namespace viotecs;
1313

1414
struct CameraResource : Resource
1515
{
16-
brenta::Camera *cam;
17-
CameraResource(brenta::Camera *c) : cam(c)
16+
tenno::shared_ptr<brenta::Camera> cam;
17+
CameraResource(tenno::shared_ptr<brenta::Camera> c) : cam(c)
1818
{
1919
}
2020
};

examples/demo/include/demo/systems/debug_text.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ struct DebugTextSystem : System<None>
2323
{
2424
auto color = Color::yellow();
2525
const float offset = 20.0f;
26-
brenta::Camera *cam = World::get_resource<CameraResource>()->cam;
26+
auto cam = World::get_resource<CameraResource>()->cam;
2727
auto camera_world_pos = cam->get_transform().get_pos();
2828
auto font = AssetManager::get<Font>("TextFont");
2929

examples/demo/include/demo/systems/renderer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct RendererSystem : System<ModelComponent, TransformComponent>
3636
return;
3737
}
3838

39-
brenta::Camera *cam = World::get_resource<CameraResource>()->cam;
39+
auto cam = World::get_resource<CameraResource>()->cam;
4040

4141
for (auto match : matches)
4242
{

examples/demo/src/callbacks/camera_mouse.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
using namespace brenta;
1414

15-
void init_camera_mouse_callback(Camera *cam, Mouse *mouse)
15+
void init_camera_mouse_callback(tenno::weak_ptr<Camera> cam, Mouse *mouse)
1616
{
1717
auto camera_mouse_callback = [cam, mouse](double xpos, double ypos)
1818
{
@@ -35,7 +35,10 @@ void init_camera_mouse_callback(Camera *cam, Mouse *mouse)
3535
xoffset *= sensitivity;
3636
yoffset *= sensitivity;
3737

38-
auto new_cam = cam->get_pos();
38+
auto camera = cam.lock();
39+
if (!camera) return;
40+
41+
auto new_cam = camera->get_pos();
3942
try {
4043
Camera::Spherical scam = std::get<Camera::Spherical>(new_cam);
4144
scam.theta += yoffset * sensitivity;
@@ -44,7 +47,7 @@ void init_camera_mouse_callback(Camera *cam, Mouse *mouse)
4447
if (scam.theta <= 0.01f) scam.theta = 0.01f;
4548
if (scam.theta >= 3.13f) scam.theta = 3.13f;
4649

47-
cam->set_pos(scam);
50+
camera->set_pos(scam);
4851

4952
} catch ([[maybe_unused]] const std::bad_variant_access& ex) {
5053
return;
@@ -69,23 +72,26 @@ void init_camera_mouse_callback(Camera *cam, Mouse *mouse)
6972
xoffset *= sensitivity * 0.3f;
7073
yoffset *= sensitivity * 0.3f;
7174

72-
auto new_cam = cam->get_pos();
75+
auto camera = cam.lock();
76+
if (!camera) return;
77+
78+
auto new_cam = camera->get_pos();
7379
try {
7480
Camera::Spherical scam = std::get<Camera::Spherical>(new_cam);
75-
glm::vec3 world_pos = cam->get_transform().get_pos();
81+
glm::vec3 world_pos = camera->get_transform().get_pos();
7682
// Local coordinate system
7783
glm::vec3 fixed_center =
7884
glm::vec3(scam.center.x, world_pos.y, scam.center.z);
7985
// Unit vectors
8086
glm::vec3 front =
8187
glm::normalize(world_pos - fixed_center);
8288
glm::vec3 right =
83-
glm::normalize(glm::cross(front, cam->get_world_up()));
89+
glm::normalize(glm::cross(front, camera->get_world_up()));
8490

8591
scam.center += right * glm::vec3(xoffset);
86-
scam.center -= cam->get_world_up() * glm::vec3(yoffset);
92+
scam.center -= camera->get_world_up() * glm::vec3(yoffset);
8793

88-
cam->set_pos(scam);
94+
camera->set_pos(scam);
8995
} catch ([[maybe_unused]] const std::bad_variant_access& ex) {
9096
return;
9197
}
@@ -107,15 +113,18 @@ void init_camera_mouse_callback(Camera *cam, Mouse *mouse)
107113

108114
xoffset *= mouse->get_sensitivity();
109115
yoffset *= mouse->get_sensitivity();
116+
117+
auto camera = cam.lock();
118+
if (!camera) return;
110119

111-
auto new_cam = cam->get_pos();
120+
auto new_cam = camera->get_pos();
112121
try {
113122
Camera::Spherical scam = std::get<Camera::Spherical>(new_cam);
114123

115124
scam.radius -= yoffset;
116125
if (scam.radius <= 0.1f) scam.radius = 0.1f;
117126

118-
cam->set_pos(scam);
127+
camera->set_pos(scam);
119128
} catch ([[maybe_unused]] const std::bad_variant_access& ex) {
120129
return;
121130
}

examples/demo/src/main.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,17 @@ int main()
5151
engine.initialize();
5252
///auto engine = Engine::managed();
5353

54-
auto camera = Camera::Builder()
55-
.projection_type(Camera::ProjectionType::Perspective)
56-
.position(Camera::Spherical::Builder()
57-
.center({0.0f, 2.0f, 0.0f})
58-
.phi(1.25f)
59-
.theta(1.25f)
60-
.radius(30.0f)
61-
.build())
62-
.fov(45.0f)
63-
.build();
54+
auto camera =
55+
tenno::shared_ptr<Camera>(Camera::Builder()
56+
.projection_type(Camera::ProjectionType::Perspective)
57+
.position(Camera::Spherical::Builder()
58+
.center({0.0f, 2.0f, 0.0f})
59+
.phi(1.25f)
60+
.theta(1.25f)
61+
.radius(30.0f)
62+
.build())
63+
.fov(45.0f)
64+
.build());
6465

6566
Mouse mouse = {};
6667
mouse.set_sensitivity(0.05f);
@@ -76,11 +77,11 @@ int main()
7677

7778
init_toggle_wireframe_callback();
7879
init_close_window_callback();
79-
init_camera_mouse_callback(&camera, &mouse);
80+
init_camera_mouse_callback(camera, &mouse);
8081
init_play_guitar_callback();
8182

8283
World::add_resource<WireframeResource>(false);
83-
World::add_resource<CameraResource>(&camera);
84+
World::add_resource<CameraResource>(camera);
8485
World::register_systems<RendererSystem,
8586
PointLightsSystem,
8687
DebugTextSystem,
@@ -98,7 +99,7 @@ int main()
9899
.size(40));
99100

100101
auto emitter = ParticleEmitter::Builder()
101-
.with_camera(&camera)
102+
.with_camera(camera)
102103
.starting_position(glm::vec3(0.0f, 0.0f, 5.0f))
103104
.starting_velocity(glm::vec3(0.0f, 5.0f, 0.0f))
104105
.starting_spread(glm::vec3(3.0f, 10.0f, 3.0f))

examples/particles.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,20 @@ int main()
4646
.build();
4747
auto engine = Engine::managed();
4848

49-
auto camera = Camera::Builder()
50-
.position(Camera::Spherical::Builder()
51-
.center({0.0f, 2.0f, 0.0f})
52-
.theta(1.25f)
53-
.phi(1.25f)
54-
.radius(10.0f)
55-
.build())
56-
.projection_type(Camera::ProjectionType::Perspective)
57-
.fov(45.0f)
58-
.build();
49+
auto camera =
50+
tenno::make_shared<Camera>(Camera::Builder()
51+
.position(Camera::Spherical::Builder()
52+
.center({0.0f, 2.0f, 0.0f})
53+
.theta(1.25f)
54+
.phi(1.25f)
55+
.radius(10.0f)
56+
.build())
57+
.projection_type(Camera::ProjectionType::Perspective)
58+
.fov(45.0f)
59+
.build());
5960

6061
auto emitter = ParticleEmitter::Builder()
61-
.with_camera(&camera)
62+
.with_camera(camera)
6263
.starting_position(glm::vec3(0.0f, 0.0f, 0.0f))
6364
.starting_velocity(glm::vec3(0.0f, 5.0f, 0.0f))
6465
.starting_spread(glm::vec3(3.0f, 10.0f, 3.0f))

include/brenta/renderer/particles.hpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
#pragma once
77

8-
#define MAX_PARTICLES 1000
8+
#define BRENTA_MAX_PARTICLES 1000
99

1010
#include <brenta/renderer/camera.hpp>
1111
#include <brenta/renderer/opengl/texture.hpp>
@@ -67,26 +67,26 @@ class ParticleEmitter
6767

6868
private:
6969

70-
Camera *cam;
71-
tenno::shared_ptr<Shader> shader_update;
72-
tenno::shared_ptr<Shader> shader_render;
70+
tenno::weak_ptr<Camera> cam;
71+
tenno::shared_ptr<Shader> shader_update;
72+
tenno::shared_ptr<Shader> shader_render;
7373

7474
};
7575

7676
struct ParticleEmitter::Config
7777
{
78-
glm::vec3 starting_position = {};
79-
glm::vec3 starting_velocity = {};
80-
glm::vec3 starting_spread = {};
81-
float starting_time_to_live = 1.0f;
82-
int num_particles = MAX_PARTICLES;
83-
float spawn_rate = 0.01f;
84-
float scale = 1.0f;
85-
std::filesystem::path atlas_path = "";
86-
int atlas_width = 8;
87-
int atlas_height = 8;
88-
int atlas_index = 0;
89-
Camera *cam = nullptr;
78+
glm::vec3 starting_position = {};
79+
glm::vec3 starting_velocity = {};
80+
glm::vec3 starting_spread = {};
81+
float starting_time_to_live = 1.0f;
82+
int num_particles = BRENTA_MAX_PARTICLES;
83+
float spawn_rate = 0.01f;
84+
float scale = 1.0f;
85+
std::filesystem::path atlas_path = "";
86+
int atlas_width = 8;
87+
int atlas_height = 8;
88+
int atlas_index = 0;
89+
tenno::weak_ptr<Camera> cam = {};
9090
};
9191

9292
class ParticleEmitter::Builder
@@ -107,7 +107,7 @@ class ParticleEmitter::Builder
107107
Builder &atlas_width(int atlas_width);
108108
Builder &atlas_height(int atlas_height);
109109
Builder &atlas_index(int atlas_index);
110-
Builder &with_camera(Camera *cam);
110+
Builder &with_camera(tenno::weak_ptr<Camera> cam);
111111

112112
ParticleEmitter build();
113113
};

src/renderer/particles.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ void ParticleEmitter::update(float delta_time)
184184
// Render particles
185185
void ParticleEmitter::render()
186186
{
187-
if (!this->cam)
187+
tenno::shared_ptr<Camera> camera = this->cam.lock();
188+
if (!camera)
188189
{
189190
ERROR("ParticleEmitter::render_particles: Camera not set or null for emitter");
190191
return;
@@ -208,10 +209,10 @@ void ParticleEmitter::render()
208209
int window_width = Window::get_width();
209210
int window_height = Window::get_height();
210211
auto projection =
211-
this->cam->get_projection_matrix(window_width, window_height);
212+
camera->get_projection_matrix(window_width, window_height);
212213

213214
shader_render->use();
214-
shader_render->set_mat4("view", this->cam->get_view_matrix());
215+
shader_render->set_mat4("view", camera->get_view_matrix());
215216
shader_render->set_mat4("projection", projection);
216217
shader_render->set_mat4("model", glm::mat4(1.0f));
217218
shader_render->set_int("atlas_width", this->atlas_width);
@@ -316,7 +317,8 @@ ParticleEmitter::Builder::atlas_index(int atlas_index)
316317
return *this;
317318
}
318319

319-
ParticleEmitter::Builder &ParticleEmitter::Builder::with_camera(Camera *cam)
320+
ParticleEmitter::Builder &
321+
ParticleEmitter::Builder::with_camera(tenno::weak_ptr<Camera> cam)
320322
{
321323
this->conf.cam = cam;
322324
return *this;

0 commit comments

Comments
 (0)