45 halp_meta(name,
"Camera Array")
46 halp_meta(c_name,
"camera_array_avnd")
47 halp_meta(category,
"Visuals/3D/Scene")
48 halp_meta(authors,
"ossia team")
49 halp_meta(uuid,
"7a3e8d2f-1b94-4c6a-b7f5-8e2d0c1a4b93")
59 struct : halp::xyz_spinboxes_f32<
"Origin", halp::range{-10000., 10000., 0.}>
60 {
void update(
CameraArray& n) { n.rebuild(); } } origin;
61 struct : halp::hslider_f32<
"Near", halp::range{0.001, 10., 0.1}>
62 {
void update(
CameraArray& n) { n.rebuild(); } } near_plane;
63 struct : halp::hslider_f32<
"Far", halp::range{1., 100000., 1000.}>
64 {
void update(
CameraArray& n) { n.rebuild(); } } far_plane;
71 halp_meta(name,
"Scene");
72 ossia::scene_spec scene;
88 std::array<ossia::scene_node_id, 6> m_ids{};
89 std::shared_ptr<ossia::scene_state> m_state;
91 uint8_t m_pending_dirty{ossia::scene_port::dirty_transform};
97 m_state = std::make_shared<ossia::scene_state>();
100 const auto base =
reinterpret_cast<std::uintptr_t
>(
this);
101 for(
int i = 0; i < 6; ++i)
102 m_ids[std::size_t(i)].value = (base ^ (std::uintptr_t(i + 1) << 1)) | 0x1u;
105 static constexpr std::array<Face, 6> kFaces{{
106 {{ 1.f, 0.f, 0.f}, {0.f, -1.f, 0.f}},
107 {{-1.f, 0.f, 0.f}, {0.f, -1.f, 0.f}},
108 {{ 0.f, 1.f, 0.f}, {0.f, 0.f, 1.f}},
109 {{ 0.f, -1.f, 0.f}, {0.f, 0.f, -1.f}},
110 {{ 0.f, 0.f, 1.f}, {0.f, -1.f, 0.f}},
111 {{ 0.f, 0.f, -1.f}, {0.f, -1.f, 0.f}},
114 const float near_f = inputs.near_plane.value;
115 const float far_f = inputs.far_plane.value;
117 = {inputs.origin.value.x, inputs.origin.value.y,
118 inputs.origin.value.z};
121 = std::make_shared<std::vector<ossia::scene_node_ptr>>();
124 for(
int i = 0; i < 6; ++i)
126 auto cam = std::make_shared<ossia::camera_component>();
127 cam->projection = ossia::camera_projection::perspective;
128 cam->yfov = float(M_PI) / 2.f;
129 cam->aspect_ratio = 1.f;
133 if(m_array_ref[std::size_t(i)].valid())
135 cam->raw_slot = m_array_ref[std::size_t(i)];
139 ossia::scene_transform xform;
140 xform.translation[0] = eye[0];
141 xform.translation[1] = eye[1];
142 xform.translation[2] = eye[2];
149 kFaces[std::size_t(i)].forward[0], kFaces[std::size_t(i)].forward[1],
150 kFaces[std::size_t(i)].forward[2]);
152 kFaces[std::size_t(i)].up[0], kFaces[std::size_t(i)].up[1],
153 kFaces[std::size_t(i)].up[2]);
154 QQuaternion q = QQuaternion::fromDirection(-fwd, up);
155 xform.rotation[0] = q.x();
156 xform.rotation[1] = q.y();
157 xform.rotation[2] = q.z();
158 xform.rotation[3] = q.scalar();
159 xform.scale[0] = 1.f;
160 xform.scale[1] = 1.f;
161 xform.scale[2] = 1.f;
164 if(m_xform_array_ref[std::size_t(i)].valid())
166 xform.raw_slot = m_xform_array_ref[std::size_t(i)];
172 = std::make_shared<std::vector<ossia::scene_payload>>();
173 children->push_back(xform);
174 children->push_back(ossia::camera_component_ptr(std::move(cam)));
176 auto node = std::make_shared<ossia::scene_node>();
177 node->id = m_ids[std::size_t(i)];
178 node->children = std::move(children);
180 roots->push_back(std::move(node));
183 m_state->roots = std::move(roots);
187 m_state->active_camera_id = m_ids[0];
189 m_state->version = m_version;
190 m_pending_dirty = ossia::scene_port::dirty_transform;
197 outputs.scene_out.scene.state = m_state;
198 outputs.scene_out.dirty = m_pending_dirty;
214 ossia::gpu_slot_ref m_array_ref[6]{};
215 ossia::gpu_slot_ref m_xform_array_ref[6]{};