42 halp_meta(name,
"Camera")
43 halp_meta(c_name,
"camera_avnd")
44 halp_meta(category,
"Visuals/3D/Scene")
45 halp_meta(authors,
"ossia team")
46 halp_meta(uuid,
"4c91b5e2-8d76-4ab3-9f14-6e0d8b3a2c57")
58 struct Eye : halp::xyz_spinboxes_f32<"Eye", halp::range{-10000., 10000., 0.}>
60 Eye() { value = {0.f, 1.f, 3.f}; }
61 void update(
Camera& n) { n.rebuild(); }
63 struct : halp::xyz_spinboxes_f32<
"Target", halp::range{-10000., 10000., 0.}>
64 {
void update(
Camera& n) { n.rebuild(); } } target;
65 struct : halp::hslider_f32<
"FOV", halp::range{5., 170., 60.}>
66 {
void update(
Camera& n) { n.rebuild(); } } fov;
67 struct : halp::hslider_f32<
"Near", halp::range{0.001, 10., 0.1}>
68 {
void update(
Camera& n) { n.rebuild(); } } near_plane;
69 struct : halp::hslider_f32<
"Far", halp::range{1., 100000., 1000.}>
70 {
void update(
Camera& n) { n.rebuild(); } } far_plane;
77 halp_meta(name,
"Scene");
78 ossia::scene_spec scene;
86 ossia::scene_node_id m_id{};
87 std::shared_ptr<ossia::scene_state> m_state;
94 uint8_t m_pending_dirty{ossia::scene_port::dirty_transform};
97 uint64_t m_xform_stable_id{};
98 uint64_t m_camera_stable_id{};
107 m_state = std::make_shared<ossia::scene_state>();
110 m_id.value =
reinterpret_cast<std::uintptr_t
>(
this) | 0x1u;
112 if(m_camera_stable_id == 0) m_camera_stable_id = ossia::mint_stable_id();
113 if(m_xform_stable_id == 0) m_xform_stable_id = ossia::mint_stable_id();
116 auto cam = std::make_shared<ossia::camera_component>();
117 cam->stable_id = m_camera_stable_id;
118 cam->projection = ossia::camera_projection::perspective;
119 cam->yfov = inputs.fov.value * float(M_PI) / 180.f;
120 cam->znear = inputs.near_plane.value;
121 cam->zfar = inputs.far_plane.value;
123 cam->raw_slot = m_camera_ref;
126 ossia::scene_transform xform;
127 xform.stable_id = m_xform_stable_id;
128 xform.translation[0] = inputs.eye.value.x;
129 xform.translation[1] = inputs.eye.value.y;
130 xform.translation[2] = inputs.eye.value.z;
140 inputs.target.value.x - inputs.eye.value.x,
141 inputs.target.value.y - inputs.eye.value.y,
142 inputs.target.value.z - inputs.eye.value.z);
143 if(forward.lengthSquared() > 1e-8f)
146 QQuaternion q = QQuaternion::fromDirection(
147 -forward, QVector3D(0.f, 1.f, 0.f));
148 xform.rotation[0] = q.x();
149 xform.rotation[1] = q.y();
150 xform.rotation[2] = q.z();
151 xform.rotation[3] = q.scalar();
155 xform.rotation[0] = 0.f;
156 xform.rotation[1] = 0.f;
157 xform.rotation[2] = 0.f;
158 xform.rotation[3] = 1.f;
160 xform.scale[0] = 1.f;
161 xform.scale[1] = 1.f;
162 xform.scale[2] = 1.f;
164 xform.raw_slot = m_xform_ref;
166 auto children = std::make_shared<std::vector<ossia::scene_payload>>();
167 children->push_back(xform);
168 children->push_back(ossia::camera_component_ptr(std::move(cam)));
170 auto node = std::make_shared<ossia::scene_node>();
172 node->children = std::move(children);
175 = std::make_shared<std::vector<ossia::scene_node_ptr>>();
176 roots->push_back(std::move(node));
178 m_state->roots = std::move(roots);
179 m_state->active_camera_id = m_id;
181 m_state->version = m_version;
182 m_pending_dirty = ossia::scene_port::dirty_transform;
189 outputs.scene_out.scene.state = m_state;
190 outputs.scene_out.dirty = m_pending_dirty;
209 ossia::gpu_slot_ref m_camera_ref{};
210 ossia::gpu_slot_ref m_xform_ref{};