Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
BoundsComponent.cpp
Go to the documentation of this file.
1
2
6
9
10namespace Divide {
11
14{
15 _refBoundingBox.set(sgn->getNode().getBounds());
16 _worldOffset.set(sgn->getNode().getWorldOffset());
17
20
22
23 EditorComponentField bbField = {};
24 bbField._name = "Bounding Box";
25 bbField._data = &_boundingBox;
27 bbField._readOnly = true;
28 bbField._serialise = false;
29 _editorComponent.registerField(MOV(bbField));
30
31 EditorComponentField rbbField = {};
32 rbbField._name = "Ref Bounding Box";
33 rbbField._data = &_refBoundingBox;
35 rbbField._readOnly = true;
36 rbbField._serialise = false;
37 _editorComponent.registerField(MOV(rbbField));
38
39 EditorComponentField bsField = {};
40 bsField._name = "Bounding Sphere";
41 bsField._data = &_boundingSphere;
43 bsField._readOnly = true;
44 bsField._serialise = false;
45 _editorComponent.registerField(MOV(bsField));
46
47 EditorComponentField obsField = {};
48 obsField._name = "Oriented Bouding Box";
49 obsField._data = &_obb;
51 obsField._readOnly = true;
52 obsField._serialise = false;
53 _editorComponent.registerField(MOV(obsField));
54
55 EditorComponentField vbbField = {};
56 vbbField._name = "Show AABB";
57 vbbField._dataGetter = [this](void* dataOut) { *static_cast<bool*>(dataOut) = _showAABB; };
58 vbbField._dataSetter = [this](const void* data) { showAABB(*static_cast<const bool*>(data)); };
61 vbbField._readOnly = false;
62
63 _editorComponent.registerField(MOV(vbbField));
64
65 EditorComponentField vobbField = {};
66 vobbField._name = "Show OBB";
67 vobbField._dataGetter = [this](void* dataOut) { *static_cast<bool*>(dataOut) = _showOBB; };
68 vobbField._dataSetter = [this](const void* data) { showOBB(*static_cast<const bool*>(data)); };
71 vobbField._readOnly = false;
72
73 _editorComponent.registerField(MOV(vobbField));
74
75 EditorComponentField vbsField = {};
76 vbsField._name = "Show Bounding Sphere";
77 vbsField._dataGetter = [this](void* dataOut) { *static_cast<bool*>(dataOut) = _showBS; };
78 vbsField._dataSetter = [this](const void* data) { showBS(*static_cast<const bool*>(data)); };
81 vbsField._readOnly = false;
82 _editorComponent.registerField(MOV(vbsField));
83
84 EditorComponentField recomputeBoundsField = {};
85 recomputeBoundsField._name = "Recompute Bounds";
86 recomputeBoundsField._range = { to_F32(recomputeBoundsField._name.length()) * 10, 20.0f };//dimensions
87 recomputeBoundsField._type = EditorComponentFieldType::BUTTON;
88 recomputeBoundsField._readOnly = false; //disabled/enabled
89 _editorComponent.registerField(MOV(recomputeBoundsField));
90
91 _editorComponent.onChangedCbk([this](const std::string_view field) {
92 if (field == "Recompute Bounds") {
94 }
95 });
96}
97
98void BoundsComponent::showAABB(const bool state) {
99 if (_showAABB != state) {
100 _showAABB = state;
101
102 _parentSGN->SendEvent(
103 {
105 ._sourceCmp = this
106 });
107 }
108}
109
110void BoundsComponent::showOBB(const bool state) {
111 if (_showOBB != state) {
112 _showOBB = state;
113
114 _parentSGN->SendEvent(
115 {
117 ._sourceCmp = this
118 });
119 }
120}
121
122void BoundsComponent::showBS(const bool state) {
123 if (_showBS != state) {
124 _showBS = state;
125
126 _parentSGN->SendEvent(
127 {
129 ._sourceCmp = this
130 });
131 }
132}
133
134void BoundsComponent::flagBoundingBoxDirty(const U32 transformMask, const bool recursive) {
136
137 if (_transformUpdatedMask.exchange(transformMask) != 0u) {
138 // already dirty
139 return;
140 }
141
142 if (recursive) {
143 const SceneGraphNode* parent = _parentSGN->parent();
144 if (parent != nullptr) {
145 // We stop if the parent sgn doesn't have a bounds component.
146 if (parent->HasComponents(ComponentType::BOUNDS)) {
147 parent->get<BoundsComponent>()->flagBoundingBoxDirty(transformMask, true);
148 }
149 }
150 }
151}
152
155
157 flagBoundingBoxDirty(data._flag, true);
158 }
159}
160
161void BoundsComponent::setRefBoundingBox(const BoundingBox& nodeBounds) noexcept {
162 // All the parents should already be dirty thanks to the bounds system
163 _refBoundingBox.set(nodeBounds);
164 _transformUpdatedMask.store(to_base(TransformType::ALL));
165}
166
169
170 if (_transformUpdatedMask == 0u) {
171 return;
172 }
173
174 const mat4<F32> mat = _parentSGN->get<TransformComponent>()->getWorldMatrix();
176}
177
180
181 const SceneGraphNode::ChildContainer& children = _parentSGN->getChildren();
182
183 SharedLock<SharedMutex> w_lock(children._lock);
184 const U32 childCount = children._count;
185 BoundingBox temp{};
186 for (U32 i = 0u; i < childCount; ++i) {
187 if (children._data[i]->HasComponents(ComponentType::BOUNDS)) {
188 BoundsComponent* const bComp = children._data[i]->get<BoundsComponent>();
189 bComp->appendChildRefBBs();
190 temp = bComp->_refBoundingBox;
191 temp.translate(bComp->_worldOffset);
192 _refBoundingBox.add(temp);
193 }
194 }
195}
196
199
200 if (_transformUpdatedMask.exchange(0u) == 0u) {
201 return;
202 }
203
204 const SceneGraphNode::ChildContainer& children = _parentSGN->getChildren();
205
206 SharedLock<SharedMutex> w_lock(children._lock);
207 const U32 childCount = children._count;
208 for (U32 i = 0u; i < childCount; ++i) {
209 if (children._data[i]->HasComponents(ComponentType::BOUNDS)) {
210 BoundsComponent* const bComp = children._data[i]->get<BoundsComponent>();
211 // This will also clear our transform flag so subsequent calls will be fast
212 bComp->appendChildBBs();
214 }
215 }
217 _obbDirty.store(true);
218}
219
221 if (_obbDirty.exchange(false)) {
222 const TransformComponent* transform = _parentSGN->get<TransformComponent>();
224 //_obb.fromBoundingBox(_refBoundingBox, transform->getWorldPosition(), transform->getWorldOrientation(), transform->getWorldScale());
226 }
227
228 return _obb;
229}
230
231bool Collision( const BoundsComponent& lhs, const BoundsComponent& rhs ) noexcept
232{
233 return lhs.parentSGN()->getGUID() != rhs.parentSGN()->getGUID() &&
234 lhs.getBoundingSphere().collision( rhs.getBoundingSphere() ) &&
235 lhs.getBoundingBox().collision( rhs.getBoundingBox() );
236}
237
238}
#define MOV(...)
#define PROFILE_SCOPE_AUTO(CATEGORY)
Definition: Profiler.h:87
void set(const BoundingBox &bb) noexcept
void add(const vec3< F32 > &v) noexcept
Definition: BoundingBox.inl:72
void transform(vec3< F32 > initialMin, vec3< F32 > initialMax, const mat4< F32 > &mat) noexcept
const vec3< F32 > & getMax() const noexcept
const vec3< F32 > & getMin() const noexcept
void translate(const vec3< F32 > &v) noexcept
void fromBoundingBox(const BoundingBox &bBox) noexcept
void OnData(const ECS::CustomEvent &data) override
std::atomic_uint _transformUpdatedMask
void showAABB(bool state)
void flagBoundingBoxDirty(U32 transformMask, bool recursive)
BoundsComponent(SceneGraphNode *sgn, PlatformContext &context)
std::atomic_bool _obbDirty
void setRefBoundingBox(const BoundingBox &nodeBounds) noexcept
BoundingSphere _boundingSphere
void fromBoundingBox(const BoundingBox &aabb) noexcept
Definition: OBB.cpp:41
BoundingSphere toEnclosingSphere() const noexcept
Definition: OBB.cpp:111
ProjectManager & parent() noexcept
virtual void OnData(const ECS::CustomEvent &data)
T & getNode() noexcept
void getWorldMatrix(mat4< F32 > &matOut) const
void set(const T *v) noexcept
set the 3 components of the vector manually using a source pointer to a (large enough) array
Definition: MathVectors.h:707
constexpr Optick::Category::Type Scene
Definition: Profiler.h:66
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
bool Collision(const BoundsComponent &lhs, const BoundsComponent &rhs) noexcept
constexpr F32 to_F32(const T value)
std::shared_lock< mutex > SharedLock
Definition: SharedMutex.h:49
Project & parent
Definition: DefaultScene.h:41
SGNComponent::Registrar< T, C > BaseComponentType
Definition: SGNComponent.h:207
uint32_t U32
constexpr auto to_base(const Type value) -> Type
DELEGATE_STD< void, void * > _dataGetter
DELEGATE_STD< void, const void * > _dataSetter
vec2< F32 > _range
Used by slider_type as a min / max range or dropdown as selected_index / count.
EditorComponentFieldType _type
eastl::fixed_vector< SceneGraphNode *, 32, true > _data
Divide::U32 _flag
Definition: SGNComponent.h:67