// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequesites.hpp #include #include #include #include #include #include namespace Ndk { /*! * \ingroup NDK * \class Ndk::CollisionComponent3D * \brief NDK class that represents the component for collision (meant for static objects) */ /*! * \brief Sets geometry for the entity * * \param geom Geometry used for collisions * * \remark Produces a NazaraAssert if the entity has no physics component and has no static body */ void CollisionComponent3D::SetGeom(Nz::Collider3DRef geom) { m_geom = std::move(geom); if (m_entity->HasComponent()) { // We update the geometry of the PhysiscsObject linked to the PhysicsComponent3D PhysicsComponent3D& physComponent = m_entity->GetComponent(); physComponent.GetPhysObject().SetGeom(m_geom); } else { NazaraAssert(m_staticBody, "An entity without physics component should have a static body"); m_staticBody->SetGeom(m_geom); } } /*! * \brief Initializes the static body * * \remark Produces a NazaraAssert if entity is invalid * \remark Produces a NazaraAssert if entity is not linked to a world, or the world has no physics system */ void CollisionComponent3D::InitializeStaticBody() { NazaraAssert(m_entity, "Invalid entity"); World* entityWorld = m_entity->GetWorld(); NazaraAssert(entityWorld, "Entity must have world"); NazaraAssert(entityWorld->HasSystem(), "World must have a physics system"); Nz::PhysWorld3D& physWorld = entityWorld->GetSystem().GetWorld(); m_staticBody.reset(new Nz::RigidBody3D(&physWorld, m_geom)); m_staticBody->EnableAutoSleep(false); } /*! * \brief Operation to perform when component is attached to an entity */ void CollisionComponent3D::OnAttached() { if (!m_entity->HasComponent()) InitializeStaticBody(); } /*! * \brief Operation to perform when component is attached to this component * * \param component Component being attached */ void CollisionComponent3D::OnComponentAttached(BaseComponent& component) { if (IsComponent(component)) m_staticBody.reset(); } /*! * \brief Operation to perform when component is detached from this component * * \param component Component being detached */ void CollisionComponent3D::OnComponentDetached(BaseComponent& component) { if (IsComponent(component)) InitializeStaticBody(); } /*! * \brief Operation to perform when component is detached from an entity */ void CollisionComponent3D::OnDetached() { m_staticBody.reset(); } ComponentIndex CollisionComponent3D::componentIndex; }