66 halp_meta(name,
"Camera")
67 halp_meta(c_name,
"camera_avnd")
68 halp_meta(category,
"Visuals/3D/Scene")
69 halp_meta(description,
"Create a scene camera with eye, target, field-of-view and clipping controls.")
70 halp_meta(authors,
"ossia team")
71 halp_meta(uuid,
"4c91b5e2-8d76-4ab3-9f14-6e0d8b3a2c57")
83 struct Eye : halp::xyz_spinboxes_f32<"Eye", halp::range{-10000., 10000., 0.}>
85 Eye() { value = {1.f, 1.f, 1.f}; }
86 void update(
Camera& n) { n.rebuild(); }
88 struct : halp::xyz_spinboxes_f32<
"Target", halp::range{-10000., 10000., 0.}>
89 {
void update(
Camera& n) { n.rebuild(); } } target;
90 struct : halp::hslider_f32<
"FOV", halp::range{5., 170., 60.}>
91 {
void update(Camera& n) { n.rebuild(); } } fov;
92 struct : halp::hslider_f32<
"Near", halp::range{0.001, 10., 0.1}>
93 {
void update(Camera& n) { n.rebuild(); } } near_plane;
94 struct : halp::hslider_f32<
"Far", halp::range{1., 100000., 1000.}>
95 {
void update(Camera& n) { n.rebuild(); } } far_plane;
96 struct : halp::hslider_f32<
"Roll", halp::range{-180., 180., 0.}>
97 {
void update(Camera& n) { n.rebuild(); } } roll;
104 halp_meta(name,
"Scene");
105 ossia::scene_spec scene;
113 ossia::scene_node_id m_id{};
114 std::shared_ptr<ossia::scene_state> m_state;
115 int64_t m_version{0};
121 uint8_t m_pending_dirty{ossia::scene_port::dirty_transform};
124 uint64_t m_xform_stable_id{};
125 uint64_t m_camera_stable_id{};
134 m_state = std::make_shared<ossia::scene_state>();
137 m_id.value =
reinterpret_cast<std::uintptr_t
>(
this) | 0x1u;
139 if(m_camera_stable_id == 0) m_camera_stable_id = ossia::mint_stable_id();
140 if(m_xform_stable_id == 0) m_xform_stable_id = ossia::mint_stable_id();
143 auto cam = std::make_shared<ossia::camera_component>();
144 cam->stable_id = m_camera_stable_id;
145 cam->projection = ossia::camera_projection::perspective;
146 cam->yfov = inputs.fov.value * float(M_PI) / 180.f;
147 cam->znear = inputs.near_plane.value;
148 cam->zfar = inputs.far_plane.value;
150 cam->raw_slot = m_camera_ref;
153 ossia::scene_transform xform;
154 xform.stable_id = m_xform_stable_id;
155 xform.translation[0] = inputs.eye.value.x;
156 xform.translation[1] = inputs.eye.value.y;
157 xform.translation[2] = inputs.eye.value.z;
158 const QQuaternion q = orientation();
159 xform.rotation[0] = q.x();
160 xform.rotation[1] = q.y();
161 xform.rotation[2] = q.z();
162 xform.rotation[3] = q.scalar();
163 xform.scale[0] = 1.f;
164 xform.scale[1] = 1.f;
165 xform.scale[2] = 1.f;
167 xform.raw_slot = m_xform_ref;
169 auto children = std::make_shared<std::vector<ossia::scene_payload>>();
170 children->push_back(xform);
171 children->push_back(ossia::camera_component_ptr(std::move(cam)));
173 auto node = std::make_shared<ossia::scene_node>();
175 node->children = std::move(children);
178 = std::make_shared<std::vector<ossia::scene_node_ptr>>();
179 roots->push_back(std::move(node));
181 m_state->roots = std::move(roots);
182 m_state->active_camera_id = m_id;
184 m_state->version = m_version;
185 m_pending_dirty = ossia::scene_port::dirty_transform;
188 QQuaternion orientation() const noexcept
190 return cameraOrientation(
191 QVector3D(inputs.eye.value.x, inputs.eye.value.y, inputs.eye.value.z),
193 inputs.target.value.x, inputs.target.value.y, inputs.target.value.z),
201 outputs.scene_out.scene.state = m_state;
202 outputs.scene_out.dirty = m_pending_dirty;
221 ossia::gpu_slot_ref m_camera_ref{};
222 ossia::gpu_slot_ref m_xform_ref{};