diff --git a/include/Nazara/Physics/Geom.hpp b/include/Nazara/Physics/Geom.hpp index 5c851ee30..489043f3a 100644 --- a/include/Nazara/Physics/Geom.hpp +++ b/include/Nazara/Physics/Geom.hpp @@ -8,8 +8,12 @@ #define NAZARA_GEOM_HPP #include -#include #include +#include +#include +#include +#include +#include #include #include #include @@ -21,14 +25,21 @@ ///TODO: SceneGeom ///TODO: TreeGeom +class NzPhysGeom; class NzPhysWorld; struct NewtonCollision; -class NAZARA_API NzBaseGeom : NzNonCopyable +using NzPhysGeomConstListener = NzObjectListenerWrapper; +using NzPhysGeomConstRef = NzObjectRef; +using NzPhysGeomLibrary = NzObjectLibrary; +using NzPhysGeomListener = NzObjectListenerWrapper; +using NzPhysGeomRef = NzObjectRef; + +class NAZARA_API NzPhysGeom : public NzRefCounted, NzNonCopyable { public: - NzBaseGeom(NzPhysWorld* physWorld); - virtual ~NzBaseGeom(); + NzPhysGeom(NzPhysWorld* physWorld); + virtual ~NzPhysGeom(); virtual NzBoxf ComputeAABB(const NzVector3f& translation, const NzQuaternionf& rotation, const NzVector3f& scale) const; virtual NzBoxf ComputeAABB(const NzMatrix4f& offsetMatrix = NzMatrix4f::Identity()) const; @@ -40,14 +51,23 @@ class NAZARA_API NzBaseGeom : NzNonCopyable NzPhysWorld* GetWorld() const; - static NzBaseGeom* Build(NzPhysWorld* physWorld, const NzPrimitiveList& list); + static NzPhysGeomRef Build(NzPhysWorld* physWorld, const NzPrimitiveList& list); protected: NewtonCollision* m_collision; NzPhysWorld* m_world; + + static NzPhysGeomLibrary::LibraryMap s_library; }; -class NAZARA_API NzBoxGeom : public NzBaseGeom +class NzBoxGeom; + +using NzBoxGeomConstListener = NzObjectListenerWrapper; +using NzBoxGeomConstRef = NzObjectRef; +using NzBoxGeomListener = NzObjectListenerWrapper; +using NzBoxGeomRef = NzObjectRef; + +class NAZARA_API NzBoxGeom : public NzPhysGeom { public: NzBoxGeom(NzPhysWorld* physWorld, const NzVector3f& lengths, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); @@ -56,11 +76,20 @@ class NAZARA_API NzBoxGeom : public NzBaseGeom NzVector3f GetLengths() const; nzGeomType GetType() const override; + template static NzBoxGeomRef New(Args&&... args); + private: NzVector3f m_lengths; }; -class NAZARA_API NzCapsuleGeom : public NzBaseGeom +class NzCapsuleGeom; + +using NzCapsuleGeomConstListener = NzObjectListenerWrapper; +using NzCapsuleGeomConstRef = NzObjectRef; +using NzCapsuleGeomListener = NzObjectListenerWrapper; +using NzCapsuleGeomRef = NzObjectRef; + +class NAZARA_API NzCapsuleGeom : public NzPhysGeom { public: NzCapsuleGeom(NzPhysWorld* physWorld, float length, float radius, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); @@ -70,20 +99,38 @@ class NAZARA_API NzCapsuleGeom : public NzBaseGeom float GetRadius() const; nzGeomType GetType() const override; + template static NzCapsuleGeomRef New(Args&&... args); + private: float m_length; float m_radius; }; -class NAZARA_API NzCompoundGeom : public NzBaseGeom +class NzCompoundGeom; + +using NzCompoundGeomConstListener = NzObjectListenerWrapper; +using NzCompoundGeomConstRef = NzObjectRef; +using NzCompoundGeomListener = NzObjectListenerWrapper; +using NzCompoundGeomRef = NzObjectRef; + +class NAZARA_API NzCompoundGeom : public NzPhysGeom { public: - NzCompoundGeom(NzPhysWorld* physWorld, NzBaseGeom** geoms, unsigned int geomCount); + NzCompoundGeom(NzPhysWorld* physWorld, NzPhysGeom** geoms, unsigned int geomCount); nzGeomType GetType() const override; + + template static NzCompoundGeomRef New(Args&&... args); }; -class NAZARA_API NzConeGeom : public NzBaseGeom +class NzConeGeom; + +using NzConeGeomConstListener = NzObjectListenerWrapper; +using NzConeGeomConstRef = NzObjectRef; +using NzConeGeomListener = NzObjectListenerWrapper; +using NzConeGeomRef = NzObjectRef; + +class NAZARA_API NzConeGeom : public NzPhysGeom { public: NzConeGeom(NzPhysWorld* physWorld, float length, float radius, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); @@ -93,21 +140,39 @@ class NAZARA_API NzConeGeom : public NzBaseGeom float GetRadius() const; nzGeomType GetType() const override; + template static NzConeGeomRef New(Args&&... args); + private: float m_length; float m_radius; }; -class NAZARA_API NzConvexHullGeom : public NzBaseGeom +class NzConvexHullGeom; + +using NzConvexHullGeomConstListener = NzObjectListenerWrapper; +using NzConvexHullGeomConstRef = NzObjectRef; +using NzConvexHullGeomListener = NzObjectListenerWrapper; +using NzConvexHullGeomRef = NzObjectRef; + +class NAZARA_API NzConvexHullGeom : public NzPhysGeom { public: NzConvexHullGeom(NzPhysWorld* physWorld, const void* vertices, unsigned int vertexCount, unsigned int stride = sizeof(NzVector3f), float tolerance = 0.002f, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); NzConvexHullGeom(NzPhysWorld* physWorld, const void* vertices, unsigned int vertexCount, unsigned int stride, float tolerance, const NzVector3f& translation, const NzQuaternionf& rotation = NzQuaternionf::Identity()); nzGeomType GetType() const override; + + template static NzConvexHullGeomRef New(Args&&... args); }; -class NAZARA_API NzCylinderGeom : public NzBaseGeom +class NzCylinderGeom; + +using NzCylinderGeomConstListener = NzObjectListenerWrapper; +using NzCylinderGeomConstRef = NzObjectRef; +using NzCylinderGeomListener = NzObjectListenerWrapper; +using NzCylinderGeomRef = NzObjectRef; + +class NAZARA_API NzCylinderGeom : public NzPhysGeom { public: NzCylinderGeom(NzPhysWorld* physWorld, float length, float radius, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); @@ -117,20 +182,38 @@ class NAZARA_API NzCylinderGeom : public NzBaseGeom float GetRadius() const; nzGeomType GetType() const override; + template static NzCylinderGeomRef New(Args&&... args); + private: float m_length; float m_radius; }; -class NAZARA_API NzNullGeom : public NzBaseGeom +class NzNullGeom; + +using NzNullGeomConstListener = NzObjectListenerWrapper; +using NzNullGeomConstRef = NzObjectRef; +using NzNullGeomListener = NzObjectListenerWrapper; +using NzNullGeomRef = NzObjectRef; + +class NAZARA_API NzNullGeom : public NzPhysGeom { public: NzNullGeom(NzPhysWorld* physWorld); nzGeomType GetType() const override; + + template static NzNullGeomRef New(Args&&... args); }; -class NAZARA_API NzSphereGeom : public NzBaseGeom +class NzSphereGeom; + +using NzSphereGeomConstListener = NzObjectListenerWrapper; +using NzSphereGeomConstRef = NzObjectRef; +using NzSphereGeomListener = NzObjectListenerWrapper; +using NzSphereGeomRef = NzObjectRef; + +class NAZARA_API NzSphereGeom : public NzPhysGeom { public: NzSphereGeom(NzPhysWorld* physWorld, float radius, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); @@ -139,8 +222,12 @@ class NAZARA_API NzSphereGeom : public NzBaseGeom NzVector3f GetRadius() const; nzGeomType GetType() const override; + template static NzSphereGeomRef New(Args&&... args); + private: NzVector3f m_radius; }; +#include + #endif // NAZARA_PHYSWORLD_HPP diff --git a/include/Nazara/Physics/Geom.inl b/include/Nazara/Physics/Geom.inl new file mode 100644 index 000000000..6254feea8 --- /dev/null +++ b/include/Nazara/Physics/Geom.inl @@ -0,0 +1,80 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzBoxGeomRef NzBoxGeom::New(Args&&... args) +{ + std::unique_ptr object(new NzBoxGeom(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +template +NzCapsuleGeomRef NzCapsuleGeom::New(Args&&... args) +{ + std::unique_ptr object(new NzCapsuleGeom(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +template +NzCompoundGeomRef NzCompoundGeom::New(Args&&... args) +{ + std::unique_ptr object(new NzCompoundGeom(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +template +NzConeGeomRef NzConeGeom::New(Args&&... args) +{ + std::unique_ptr object(new NzConeGeom(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +template +NzConvexHullGeomRef NzConvexHullGeom::New(Args&&... args) +{ + std::unique_ptr object(new NzConvexHullGeom(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +template +NzCylinderGeomRef NzCylinderGeom::New(Args&&... args) +{ + std::unique_ptr object(new NzCylinderGeom(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +template +NzNullGeomRef NzNullGeom::New(Args&&... args) +{ + std::unique_ptr object(new NzNullGeom(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +template +NzSphereGeomRef NzSphereGeom::New(Args&&... args) +{ + std::unique_ptr object(new NzSphereGeom(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Physics/PhysObject.hpp b/include/Nazara/Physics/PhysObject.hpp index 10e0bece9..a00a7ed96 100644 --- a/include/Nazara/Physics/PhysObject.hpp +++ b/include/Nazara/Physics/PhysObject.hpp @@ -13,8 +13,8 @@ #include #include #include +#include -class NzBaseGeom; class NzPhysWorld; struct NewtonBody; @@ -22,7 +22,7 @@ class NAZARA_API NzPhysObject : NzNonCopyable { public: NzPhysObject(NzPhysWorld* world, const NzMatrix4f& mat = NzMatrix4f::Identity()); - NzPhysObject(NzPhysWorld* world, const NzBaseGeom* geom, const NzMatrix4f& mat = NzMatrix4f::Identity()); + NzPhysObject(NzPhysWorld* world, NzPhysGeomRef geom, const NzMatrix4f& mat = NzMatrix4f::Identity()); ~NzPhysObject(); void AddForce(const NzVector3f& force, nzCoordSys coordSys = nzCoordSys_Global); @@ -31,7 +31,9 @@ class NAZARA_API NzPhysObject : NzNonCopyable void EnableAutoSleep(bool autoSleep); + NzBoxf GetAABB() const; NzVector3f GetAngularVelocity() const; + const NzPhysGeomRef& GetGeom() const; float GetGravityFactor() const; NewtonBody* GetHandle() const; float GetMass() const; @@ -45,6 +47,7 @@ class NAZARA_API NzPhysObject : NzNonCopyable bool IsMoveable() const; bool IsSleeping() const; + void SetGeom(NzPhysGeomRef geom); void SetGravityFactor(float gravityFactor); void SetMass(float mass); void SetMassCenter(const NzVector3f& center); @@ -60,9 +63,8 @@ class NAZARA_API NzPhysObject : NzNonCopyable NzVector3f m_forceAccumulator; NzVector3f m_torqueAccumulator; NewtonBody* m_body; - const NzBaseGeom* m_geom; + NzPhysGeomRef m_geom; NzPhysWorld* m_world; - bool m_ownsGeom; float m_gravityFactor; float m_mass; }; diff --git a/src/Nazara/Physics/Geom.cpp b/src/Nazara/Physics/Geom.cpp index 8bb344ba4..9e2f59e99 100644 --- a/src/Nazara/Physics/Geom.cpp +++ b/src/Nazara/Physics/Geom.cpp @@ -10,22 +10,22 @@ namespace { - NzBaseGeom* CreateGeomFromPrimitive(NzPhysWorld* physWorld, const NzPrimitive& primitive) + NzPhysGeom* CreateGeomFromPrimitive(NzPhysWorld* physWorld, const NzPrimitive& primitive) { switch (primitive.type) { case nzPrimitiveType_Box: - return new NzBoxGeom(physWorld, primitive.box.lengths, primitive.matrix); + return NzBoxGeom::New(physWorld, primitive.box.lengths, primitive.matrix); case nzPrimitiveType_Cone: - return new NzConeGeom(physWorld, primitive.cone.length, primitive.cone.radius, primitive.matrix); + return NzConeGeom::New(physWorld, primitive.cone.length, primitive.cone.radius, primitive.matrix); case nzPrimitiveType_Plane: - return new NzBoxGeom(physWorld, NzVector3f(primitive.plane.size.x, 0.01f, primitive.plane.size.y), primitive.matrix); + return NzBoxGeom::New(physWorld, NzVector3f(primitive.plane.size.x, 0.01f, primitive.plane.size.y), primitive.matrix); ///TODO: PlaneGeom? case nzPrimitiveType_Sphere: - return new NzSphereGeom(physWorld, primitive.sphere.size, primitive.matrix.GetTranslation()); + return NzSphereGeom::New(physWorld, primitive.sphere.size, primitive.matrix.GetTranslation()); } NazaraError("Primitive type not handled (0x" + NzString::Number(primitive.type, 16) + ')'); @@ -33,17 +33,17 @@ namespace } } -NzBaseGeom::NzBaseGeom(NzPhysWorld* physWorld) : +NzPhysGeom::NzPhysGeom(NzPhysWorld* physWorld) : m_world(physWorld) { } -NzBaseGeom::~NzBaseGeom() +NzPhysGeom::~NzPhysGeom() { NewtonDestroyCollision(m_collision); } -NzBoxf NzBaseGeom::ComputeAABB(const NzVector3f& translation, const NzQuaternionf& rotation, const NzVector3f& scale) const +NzBoxf NzPhysGeom::ComputeAABB(const NzVector3f& translation, const NzQuaternionf& rotation, const NzVector3f& scale) const { NzVector3f min, max; NewtonCollisionCalculateAABB(m_collision, NzMatrix4f::Transform(translation, rotation), min, max); @@ -52,7 +52,7 @@ NzBoxf NzBaseGeom::ComputeAABB(const NzVector3f& translation, const NzQuaternion return NzBoxf(scale*min, scale*max); } -NzBoxf NzBaseGeom::ComputeAABB(const NzMatrix4f& offsetMatrix) const +NzBoxf NzPhysGeom::ComputeAABB(const NzMatrix4f& offsetMatrix) const { NzVector3f min, max; NewtonCollisionCalculateAABB(m_collision, offsetMatrix, min, max); @@ -60,7 +60,7 @@ NzBoxf NzBaseGeom::ComputeAABB(const NzMatrix4f& offsetMatrix) const return NzBoxf(min, max); } -void NzBaseGeom::ComputeInertialMatrix(NzVector3f* inertia, NzVector3f* center) const +void NzPhysGeom::ComputeInertialMatrix(NzVector3f* inertia, NzVector3f* center) const { float inertiaMatrix[3]; float origin[3]; @@ -74,22 +74,22 @@ void NzBaseGeom::ComputeInertialMatrix(NzVector3f* inertia, NzVector3f* center) center->Set(origin); } -float NzBaseGeom::ComputeVolume() const +float NzPhysGeom::ComputeVolume() const { return NewtonConvexCollisionCalculateVolume(m_collision); } -NewtonCollision* NzBaseGeom::GetHandle() const +NewtonCollision* NzPhysGeom::GetHandle() const { return m_collision; } -NzPhysWorld* NzBaseGeom::GetWorld() const +NzPhysWorld* NzPhysGeom::GetWorld() const { return m_world; } -NzBaseGeom* NzBaseGeom::Build(NzPhysWorld* physWorld, const NzPrimitiveList& list) +NzPhysGeomRef NzPhysGeom::Build(NzPhysWorld* physWorld, const NzPrimitiveList& list) { unsigned int primitiveCount = list.GetSize(); @@ -103,21 +103,23 @@ NzBaseGeom* NzBaseGeom::Build(NzPhysWorld* physWorld, const NzPrimitiveList& lis if (primitiveCount > 1) { - std::vector geoms(primitiveCount); + std::vector geoms(primitiveCount); for (unsigned int i = 0; i < primitiveCount; ++i) geoms[i] = CreateGeomFromPrimitive(physWorld, list.GetPrimitive(i)); - return new NzCompoundGeom(physWorld, &geoms[0], primitiveCount); + return NzCompoundGeom::New(physWorld, &geoms[0], primitiveCount); } else return CreateGeomFromPrimitive(physWorld, list.GetPrimitive(0)); } +NzPhysGeomLibrary::LibraryMap NzPhysGeom::s_library; + /********************************** BoxGeom **********************************/ NzBoxGeom::NzBoxGeom(NzPhysWorld* physWorld, const NzVector3f& lengths, const NzMatrix4f& transformMatrix) : -NzBaseGeom(physWorld), +NzPhysGeom(physWorld), m_lengths(lengths) { m_collision = NewtonCreateBox(physWorld->GetHandle(), lengths.x, lengths.y, lengths.z, 0, transformMatrix); @@ -141,7 +143,7 @@ nzGeomType NzBoxGeom::GetType() const /******************************** CapsuleGeom ********************************/ NzCapsuleGeom::NzCapsuleGeom(NzPhysWorld* physWorld, float length, float radius, const NzMatrix4f& transformMatrix) : -NzBaseGeom(physWorld), +NzPhysGeom(physWorld), m_length(length), m_radius(radius) { @@ -170,8 +172,8 @@ nzGeomType NzCapsuleGeom::GetType() const /******************************* CompoundGeom ********************************/ -NzCompoundGeom::NzCompoundGeom(NzPhysWorld* physWorld, NzBaseGeom** geoms, unsigned int geomCount) : -NzBaseGeom(physWorld) +NzCompoundGeom::NzCompoundGeom(NzPhysWorld* physWorld, NzPhysGeom** geoms, unsigned int geomCount) : +NzPhysGeom(physWorld) { m_collision = NewtonCreateCompoundCollision(physWorld->GetHandle(), 0); NewtonCompoundCollisionBeginAddRemove(m_collision); @@ -195,7 +197,7 @@ nzGeomType NzCompoundGeom::GetType() const /********************************* ConeGeom **********************************/ NzConeGeom::NzConeGeom(NzPhysWorld* physWorld, float length, float radius, const NzMatrix4f& transformMatrix) : -NzBaseGeom(physWorld), +NzPhysGeom(physWorld), m_length(length), m_radius(radius) { @@ -225,7 +227,7 @@ nzGeomType NzConeGeom::GetType() const /****************************** ConvexHullGeom *******************************/ NzConvexHullGeom::NzConvexHullGeom(NzPhysWorld* physWorld, const void* vertices, unsigned int vertexCount, unsigned int stride, float tolerance, const NzMatrix4f& transformMatrix) : -NzBaseGeom(physWorld) +NzPhysGeom(physWorld) { m_collision = NewtonCreateConvexHull(physWorld->GetHandle(), vertexCount, reinterpret_cast(vertices), stride, tolerance, 0, transformMatrix); } @@ -243,7 +245,7 @@ nzGeomType NzConvexHullGeom::GetType() const /******************************* CylinderGeom ********************************/ NzCylinderGeom::NzCylinderGeom(NzPhysWorld* physWorld, float length, float radius, const NzMatrix4f& transformMatrix) : -NzBaseGeom(physWorld), +NzPhysGeom(physWorld), m_length(length), m_radius(radius) { @@ -273,7 +275,7 @@ nzGeomType NzCylinderGeom::GetType() const /********************************* NullGeom **********************************/ NzNullGeom::NzNullGeom(NzPhysWorld* physWorld) : -NzBaseGeom(physWorld) +NzPhysGeom(physWorld) { m_collision = NewtonCreateNull(physWorld->GetHandle()); } @@ -286,7 +288,7 @@ nzGeomType NzNullGeom::GetType() const /******************************** SphereGeom *********************************/ NzSphereGeom::NzSphereGeom(NzPhysWorld* physWorld, float radius, const NzMatrix4f& transformMatrix) : -NzBaseGeom(physWorld), +NzPhysGeom(physWorld), m_radius(radius) { m_collision = NewtonCreateSphere(physWorld->GetHandle(), radius, 0, transformMatrix); diff --git a/src/Nazara/Physics/PhysObject.cpp b/src/Nazara/Physics/PhysObject.cpp index bde930811..4131802bc 100644 --- a/src/Nazara/Physics/PhysObject.cpp +++ b/src/Nazara/Physics/PhysObject.cpp @@ -4,55 +4,35 @@ #include #include -#include #include #include +#include #include NzPhysObject::NzPhysObject(NzPhysWorld* world, const NzMatrix4f& mat) : -m_matrix(mat), -m_forceAccumulator(NzVector3f::Zero()), -m_torqueAccumulator(NzVector3f::Zero()), -m_world(world), -m_ownsGeom(true), -m_gravityFactor(1.f), -m_mass(0.f) +NzPhysObject(world, NzNullGeom::New(world), mat) { - #if NAZARA_PHYSICS_SAFE - if (!world) - NazaraError("Invalid physics world"); ///TODO: Unexcepted - #endif - - m_geom = new NzNullGeom(world); - m_body = NewtonCreateDynamicBody(world->GetHandle(), m_geom->GetHandle(), mat); - NewtonBodySetUserData(m_body, this); } -NzPhysObject::NzPhysObject(NzPhysWorld* world, const NzBaseGeom* geom, const NzMatrix4f& mat) : +NzPhysObject::NzPhysObject(NzPhysWorld* world, NzPhysGeomRef geom, const NzMatrix4f& mat) : m_matrix(mat), m_forceAccumulator(NzVector3f::Zero()), m_torqueAccumulator(NzVector3f::Zero()), -m_geom(geom), +m_geom(std::move(geom)), m_world(world), -m_ownsGeom(false), m_gravityFactor(1.f), m_mass(0.f) { - #if NAZARA_PHYSICS_SAFE - if (!world) - NazaraError("Invalid physics world"); ///TODO: Unexcepted - #endif + NazaraAssert(m_world, "Invalid world"); + NazaraAssert(m_geom, "Invalid geometry"); - m_body = NewtonCreateDynamicBody(world->GetHandle(), geom->GetHandle(), mat); + m_body = NewtonCreateDynamicBody(world->GetHandle(), m_geom->GetHandle(), mat); NewtonBodySetUserData(m_body, this); } NzPhysObject::~NzPhysObject() { NewtonDestroyBody(m_world->GetHandle(), m_body); - - if (m_ownsGeom) - delete m_geom; } void NzPhysObject::AddForce(const NzVector3f& force, nzCoordSys coordSys) @@ -112,6 +92,14 @@ void NzPhysObject::EnableAutoSleep(bool autoSleep) NewtonBodySetAutoSleep(m_body, autoSleep); } +NzBoxf NzPhysObject::GetAABB() const +{ + NzVector3f min, max; + NewtonBodyGetAABB(m_body, min, max); + + return NzBoxf(min, max); +} + NzVector3f NzPhysObject::GetAngularVelocity() const { NzVector3f angularVelocity; @@ -120,6 +108,11 @@ NzVector3f NzPhysObject::GetAngularVelocity() const return angularVelocity; } +const NzPhysGeomRef& NzPhysObject::GetGeom() const +{ + return m_geom; +} + float NzPhysObject::GetGravityFactor() const { return m_gravityFactor; @@ -191,6 +184,14 @@ bool NzPhysObject::IsSleeping() const return NewtonBodyGetSleepState(m_body) != 0; } +void NzPhysObject::SetGeom(NzPhysGeomRef geom) +{ + if (geom) + m_geom = geom; + else + m_geom = NzNullGeom::New(m_world); +} + void NzPhysObject::SetGravityFactor(float gravityFactor) { m_gravityFactor = gravityFactor; @@ -240,6 +241,7 @@ void NzPhysObject::SetRotation(const NzQuaternionf& rotation) void NzPhysObject::UpdateBody() { NewtonBodySetMatrix(m_body, m_matrix); + /*for (std::set::iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) (*it)->PhysObjectOnUpdate(this);*/ }