11 using std::make_unique;
22 BodyHierarchy::BodyHierarchy(
World* world,
const string&
id,
BodyType type, uint16_t collisionTypeId,
bool enabled,
const Transform& transform,
float restitution,
float friction,
float mass,
const Vector3& inertiaTensor)
23 :
Body(world, id, type, collisionTypeId, enabled, transform, restitution, friction, mass, inertiaTensor, {})
29 for (
auto subBody:
bodies) {
39 for (
auto subBody:
bodies) {
46 auto levelParentTransform = parentTransform.
clone();
47 levelParentTransform*= bodyHierarchyLevel->
transform;
48 for (
const auto& [childId, child]: bodyHierarchyLevel->
children) {
50 Body::resetColliders(child->colliders, child->boundingVolumes, levelParentTransform * child->transform);
52 for (
const auto& [childId, child]: bodyHierarchyLevel->
children) {
59 if (_entity !=
nullptr) {
60 Console::println(
"BodyHierarchy::addEntity(): " +
id +
": body already added!");
69 if (parentBodyHierarchyLevel ==
nullptr) {
70 Console::println(
"BodyHierarchy::addBody(): parent '" + parentId +
"': not found");
74 vector<BoundingVolume*> clonedBoundingVolumes;
76 clonedBoundingVolumes.push_back(boundingVolume->clone());
79 for (
auto boundingVolume: clonedBoundingVolumes) {
80 boundingVolume->createCollisionShape(
world);
84 auto bodyHierarchyLevel = make_unique<BodyHierarchyLevel>(
id, parentBodyHierarchyLevel,
transform, clonedBoundingVolumes);
85 parentBodyHierarchyLevel->children[
id] = bodyHierarchyLevel.get();
88 bodies.push_back(bodyHierarchyLevel.get());
91 bodyHierarchyLevel.release();
96 if (bodyHierarchyLevel ==
nullptr || bodyHierarchyLevel->parent ==
nullptr) {
100 bodyHierarchyLevel->transform =
transform;
106 if (bodyHierarchyLevel ==
nullptr || bodyHierarchyLevel->parent ==
nullptr) {
111 vector<string> children;
112 for (
const auto& [childId, child]: bodyHierarchyLevel->children) children.push_back(childId);
116 removeColliders(bodyHierarchyLevel->colliders, bodyHierarchyLevel->boundingVolumes);
120 auto bodyHierarchyLevelIt = bodyHierarchyLevel->parent->children.find(
id);
121 if (bodyHierarchyLevelIt != bodyHierarchyLevel->parent->children.end()) {
122 delete bodyHierarchyLevelIt->second;
123 bodyHierarchyLevel->parent->children.erase(bodyHierarchyLevelIt);
128 vector<SubBody*> subBodies;
130 if (parentBodyHierarchyLevel ==
nullptr) {
133 for (
const auto& [childId, child]: parentBodyHierarchyLevel->children) {
134 subBodies.push_back(child);
void updateBody(const string &id, const Transform &transform)
Updates a body from hierarchy by given unique body id.
void removeBody(const string &id)
Removes a body from hierarchy by given unique body id.
const SubBody * getBody(const string &id)
void updateHierarchy(const Transform &parentTransform, BodyHierarchyLevel *bodyHierarchyLevel, int depth)
Update hierarchy from given body hierarchy level ongoing.
BodyHierarchyLevel * getBodyHierarchyLevel(const string &id)
Get body hierarchy level by given body id.
BodyHierarchyLevel bodyRoot
void resetColliders() override
Reset colliders.
~BodyHierarchy()
Destructor.
void update()
Update body hierarchy.
vector< SubBody * > bodies
void addBody(const string &id, const Transform &transform, const vector< BoundingVolume * > &boundingVolumes, const string &parentId=string())
Adds a body to the hierarchy.
const vector< SubBody * > query(const string &parentId=string())
Query sub bodies of parent body.
vector< BoundingVolume * > boundingVolumes
void setTransform(const Transform &transform)
Set transform.
void removeColliders(vector< reactphysics3d::Collider * > &colliders, vector< BoundingVolume * > &boundingVolumes)
Remove colliders.
virtual void resetColliders()
Reset body colliders.
Dynamic physics world class.
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
Bounding volume interface.
Vector3 class representing vector3 mathematical structure and operations with x, y,...
unordered_map< string, BodyHierarchyLevel * > children