12 float x,
float y,
float z)
noexcept
15 const float outX =
m[0] *
x +
m[4] *
y +
m[8] *
z +
m[12];
16 const float outY =
m[1] *
x +
m[5] *
y +
m[9] *
z +
m[13];
17 const float outZ =
m[2] *
x +
m[6] *
y +
m[10] *
z +
m[14];
18 const float outW =
m[3] *
x +
m[7] *
y +
m[11] *
z +
m[15];
19 if (
outW == 0.0F)
return {};
22 std::array<float, 3>
difference(
const std::array<float, 3>&
a,
23 const std::array<float, 3>&
b)
noexcept
24 {
return {
a[0] -
b[0],
a[1] -
b[1],
a[2] -
b[2]}; }
25 std::array<float, 3>
normalized(
const std::array<float, 3>&
value)
noexcept
29 if (
length == 0.0F)
return {};
37 const auto location =
sequencePoint(camera.worldTransform, 0.0F, 0.0F, 0.0F);
43 camera.nearPlane, camera.farPlane};
50 if (command.cameraNumber == 0)
52 command.fieldOfView, command.nearPlane, command.farPlane};
54 const auto camera =
runtime.cameraForLabel(command.cameraNumber);
55 if (!camera)
return std::nullopt;
59 void SequenceWorld3DSlot::refreshBounds(SequenceWorld3DObject&
object)
noexcept
61 object.screenBounds.reset();
62 if (!view_ || !
object.asset)
return;
63 const auto renderData =
64 object.renderData ?
object.renderData :
object.asset->renderData;
65 if (!renderData)
return;
67 if (
object.sequenceBounds)
69 bounds.
minimum =
object.sequenceBounds->minimum;
70 bounds.
maximum =
object.sequenceBounds->maximum;
73 bounds,
object.worldTransform, *view_);
76 void SequenceWorld3DSlot::refreshAllBounds()
noexcept
78 for (
auto& [node,
object] : objects_)
81 refreshBounds(
object);
85 std::expected<SequenceWorld3DSyncStats, SequenceWorld3DSlotError>
87 const std::vector<sequence::SequenceMeshRenderItem>& items)
89 std::set<sequence::SequenceNodeId>
incoming;
90 for (
const auto& item : items)
92 if (!
incoming.insert(item.node).second)
109 for (
const auto& item : items)
116 item.priority, item.clock, item.worldTransform,
117 item.asset, item.bounds, std::nullopt, item.renderData});
125 found->second.contentsDataId != item.contentsDataId ||
126 found->second.asset != item.asset ||
127 found->second.sequenceBounds != item.bounds ||
128 found->second.renderData != item.renderData ||
129 found->second.worldTransform.values != item.worldTransform.values;
130 found->second.contentsDataId = item.contentsDataId;
131 found->second.priority = item.priority;
132 found->second.clock = item.clock;
133 found->second.worldTransform = item.worldTransform;
134 found->second.asset = item.asset;
135 found->second.sequenceBounds = item.bounds;
136 found->second.renderData = item.renderData;
139 refreshBounds(
found->second);
145 objects_ = std::move(
next);
147 order_.reserve(items.size());
148 for (
const auto& item : items) order_.
push_back(item.node);
152 std::expected<std::size_t, World3DProjectionError>
156 if (!
next)
return std::unexpected(
next.error());
157 view_ = std::move(*
next);
159 return objects_.size();
165 for (
auto& [node,
object] : objects_)
168 object.screenBounds.reset();
179 {
return objects_.size(); }
184 const auto found = objects_.find(node);
188 std::vector<sequence::SequenceNodeId> SequenceWorld3DSlot::order()
const
191 std::vector<sequence::SequenceNodeId> SequenceWorld3DSlot::visibleOrder()
const
193 std::vector<sequence::SequenceNodeId> result;
194 result.reserve(order_.size());
195 for (
const auto node : order_)
197 const auto found = objects_.find(node);
198 if (
found != objects_.end() &&
found->second.screenBounds)
199 result.push_back(node);
204 const std::optional<World3DProjectionState>&
208 bool SequenceWorld3DSlot::boundsVisible(
212 if (!view_)
return true;
215 meshBounds, worldTransform, *view_).has_value();
std::expected< SequenceWorld3DSyncStats, SequenceWorld3DSlotError > sync(const std::vector< sequence::SequenceMeshRenderItem > &items)
std::optional< World3DRect > world3DMeshScreenRect(const data::MeshBounds &bounds, const sequence::Matrix3D &worldTransform, const World3DProjectionState &projection) noexcept
std::optional< World3DCamera > resolveWorld3DCamera(const sequence::SetCameraCommand &command, const sequence::SequenceRuntime &runtime) noexcept
std::expected< World3DProjectionState, World3DProjectionError > makeWorld3DProjectionState(World3DRect viewport, World3DCamera camera)
World3DCamera world3DCameraFromSequence(const sequence::SequenceCamera3DView &camera) noexcept
std::uint64_t SequenceNodeId
std::array< float, 3 > maximum
std::array< float, 3 > minimum
sequence::SequenceNodeId node
sequence::SequenceNodeId node
std::array< float, 3 > up