#include <dali-physics/internal/physics-world-impl.h>
// External Headers
-#include <BulletCollision/NarrowPhaseCollision/btRaycastCallback.h>
-#include <btBulletCollisionCommon.h>
-#include <iostream>
-#include <map>
-#include <memory>
-#include <utility>
// Internal Headers
#include <dali/dali.h>
PhysicsWorld& mPhysicsWorld;
};
-using NativeWorld = btDiscreteDynamicsWorld*;
-
-std::unique_ptr<PhysicsWorld> PhysicsWorld::New(Dali::Actor rootActor, Dali::CallbackBase* updateCallback)
-{
- std::unique_ptr<PhysicsWorld> world = std::make_unique<PhysicsWorld>(rootActor, updateCallback);
- world->Initialize();
- return world;
-}
-
PhysicsWorld::PhysicsWorld(Dali::Actor rootActor, Dali::CallbackBase* updateCallback)
: mUpdateCallback(updateCallback),
mRootActor(rootActor)
{
- Initialize();
}
-void PhysicsWorld::Initialize(/*void* dynamicsWorld*/)
+void PhysicsWorld::Initialize()
{
- // @todo Should enable developer to supply their own created DynamicsWorld.
-
- mCollisionConfiguration = new btDefaultCollisionConfiguration();
- mDispatcher = new btCollisionDispatcher(mCollisionConfiguration);
- mBroadphase = new btDbvtBroadphase();
- mSolver = new btSequentialImpulseConstraintSolver;
- mDynamicsWorld = new btDiscreteDynamicsWorld(mDispatcher, mBroadphase, mSolver, mCollisionConfiguration);
+ // Call derived class's initializer
+ OnInitialize();
// Automatically start the frame callback. This means everything should
// be accessed with a mutex lock, which is automatically locked when
Dali::Stage::GetCurrent().KeepRendering(30); // @todo Remove!
}
-Dali::Any PhysicsWorld::GetNative()
-{
- return mDynamicsWorld;
-}
-
PhysicsWorld::~PhysicsWorld()
{
- Dali::DevelStage::RemoveFrameCallback(Dali::Stage::GetCurrent(), *mFrameCallback);
+ // Derived class's destructor should clean down physics objects under mutex lock
+ // On completion, can remove the callback.
- Dali::Mutex::ScopedLock lock(mMutex);
-
- if(mDynamicsWorld)
- {
- int i;
- for(i = mDynamicsWorld->getNumConstraints() - 1; i >= 0; i--)
- {
- mDynamicsWorld->removeConstraint(mDynamicsWorld->getConstraint(i));
- }
- for(i = mDynamicsWorld->getNumCollisionObjects() - 1; i >= 0; i--)
- {
- btCollisionObject* obj = mDynamicsWorld->getCollisionObjectArray()[i];
- btRigidBody* body = btRigidBody::upcast(obj);
- if(body && body->getMotionState())
- {
- delete body->getMotionState();
- }
- mDynamicsWorld->removeCollisionObject(obj);
- delete obj;
- }
- }
-
- /*
- for (int j = 0; j < m_collisionShapes.size(); j++)
- {
- btCollisionShape* shape = mCollisionShapes[j];
- delete shape;
- }
- mCollisionShapes.clear();
- */
-
- delete mDynamicsWorld;
- delete mSolver;
- delete mBroadphase;
- delete mDispatcher;
- delete mCollisionConfiguration;
+ Dali::DevelStage::RemoveFrameCallback(Dali::Stage::GetCurrent(), *mFrameCallback);
}
Dali::Mutex& PhysicsWorld::GetMutex()
if(mNotifySyncPoint != Dali::UpdateProxy::INVALID_SYNC &&
mNotifySyncPoint == updateProxy.PopSyncPoint())
{
- do
+ while(!commandQueue.empty())
{
commandQueue.front()(); // Execute the queued methods
commandQueue.pop();
- } while(!commandQueue.empty());
+ }
mNotifySyncPoint = Dali::UpdateProxy::INVALID_SYNC;
}
return true;
}
-void PhysicsWorld::Integrate(float timestep)
-{
- if(mPhysicsIntegrateState == Physics::PhysicsAdaptor::IntegrationState::ON)
- {
- mDynamicsWorld->stepSimulation(timestep);
- }
- if(mDynamicsWorld->getDebugDrawer() && mPhysicsDebugState == Physics::PhysicsAdaptor::DebugState::ON)
- {
- mDynamicsWorld->debugDrawWorld();
- }
-}
-
void PhysicsWorld::SetTimestep(float timeStep)
{
mPhysicsTimeStep = timeStep;
mNotifySyncPoint = Dali::DevelStage::NotifyFrameCallback(Dali::Stage::GetCurrent(), *mFrameCallback);
}
-inline btVector3 ConvertVector(Dali::Vector3 vector)
-{
- return btVector3(vector.x, vector.y, vector.z);
-}
-
-Dali::Any PhysicsWorld::HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Vector3& localPivot, float& distanceFromCamera)
-{
- btRigidBody* hitBody{nullptr};
-
- btVector3 origin = ConvertVector(rayFromWorld);
- btVector3 end = ConvertVector(rayToWorld);
- btCollisionWorld::ClosestRayResultCallback rayResultCallback(origin, end);
- rayResultCallback.m_flags |= btTriangleRaycastCallback::kF_UseGjkConvexCastRaytest;
-
- mDynamicsWorld->rayTest(origin, end, rayResultCallback);
- if(rayResultCallback.hasHit())
- {
- auto pickPos = rayResultCallback.m_hitPointWorld;
- btRigidBody* body = (btRigidBody*)btRigidBody::upcast(rayResultCallback.m_collisionObject);
- if(body)
- {
- if(!(body->isStaticObject() || body->isKinematicObject()))
- {
- hitBody = body; // Found a dynamic body.
- distanceFromCamera = (pickPos - origin).length();
-
- btVector3 pivot = body->getCenterOfMassTransform().inverse() * pickPos;
- localPivot.x = pivot.x();
- localPivot.y = pivot.y();
- localPivot.z = pivot.z();
- }
- }
- }
- Dali::Any bodyPtr;
- if(hitBody)
- {
- bodyPtr = hitBody;
- }
-
- return bodyPtr;
-}
-
void PhysicsWorld::SetIntegrationState(Physics::PhysicsAdaptor::IntegrationState state)
{
mPhysicsIntegrateState = state;