1212
1313using 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 }
0 commit comments