2 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <dali-physics/internal/physics-actor-impl.h>
20 #include <btBulletDynamicsCommon.h>
21 #include <dali-physics/internal/physics-adaptor-impl.h>
23 namespace Dali::Toolkit::Physics::Internal
27 inline btVector3 fromVec3(Dali::Vector3 vec3)
29 return btVector3(vec3.x, vec3.y, vec3.z);
31 inline Dali::Vector3 toVec3(btVector3 vec3)
33 return Dali::Vector3(vec3.x(), vec3.y(), vec3.z());
36 inline btQuaternion fromQuat(Dali::Quaternion q)
38 return btQuaternion(q.mVector.x, q.mVector.y, q.mVector.z, q.mVector.w);
40 inline Dali::Quaternion toQuat(btQuaternion q)
42 return Dali::Quaternion(q.w(), q.x(), q.y(), q.z());
45 } //Anonymous namespace
47 PhysicsActorPtr PhysicsActor::New(Dali::Actor actor, Dali::Any body, Dali::Toolkit::Physics::Internal::PhysicsAdaptor& adaptor)
49 PhysicsActorPtr physicsActor(new Internal::PhysicsActor(actor, body, adaptor));
50 physicsActor->Initialize();
54 PhysicsActor::PhysicsActor(Dali::Actor actor, Dali::Any body, PhysicsAdaptor& adaptor)
56 mActorId(actor.GetProperty<int>(Dali::Actor::Property::ID)),
61 PhysicsActor::~PhysicsActor() = default;
63 void PhysicsActor::Initialize(void)
67 void PhysicsActor::AsyncSetPhysicsPosition(Dali::Vector3 actorPosition)
70 btRigidBody* body = mBody.Get<btRigidBody*>();
71 auto pos = fromVec3(mAdaptor.TranslateToPhysicsSpace(actorPosition));
72 mAdaptor.Queue([body, pos] { body->getWorldTransform().setOrigin(pos); });
75 void PhysicsActor::AsyncSetPhysicsRotation(Dali::Quaternion rotation)
78 btRigidBody* body = mBody.Get<btRigidBody*>();
79 auto q = fromQuat(mAdaptor.TranslateToPhysicsSpace(rotation));
80 mAdaptor.Queue([body, q]() { body->getWorldTransform().setRotation(q); });
83 Dali::Vector3 PhysicsActor::GetPhysicsPosition() const
85 btRigidBody* body = mBody.Get<btRigidBody*>();
86 return toVec3(body->getWorldTransform().getOrigin());
89 Dali::Quaternion PhysicsActor::GetPhysicsRotation() const
91 btRigidBody* body = mBody.Get<btRigidBody*>();
92 return toQuat(body->getWorldTransform().getRotation());
95 Dali::Vector3 PhysicsActor::GetActorPosition() const
97 btRigidBody* body = mBody.Get<btRigidBody*>();
98 const btTransform& transform = body->getWorldTransform();
99 const btVector3& position = transform.getOrigin();
100 return mAdaptor.TranslateFromPhysicsSpace(Vector3(position.getX(), position.getY(), position.getZ()));
103 Dali::Quaternion PhysicsActor::GetActorRotation() const
105 btRigidBody* body = mBody.Get<btRigidBody*>();
106 const btTransform& transform = body->getWorldTransform();
107 btQuaternion q = transform.getRotation();
108 return mAdaptor.TranslateFromPhysicsSpace(Quaternion(q.w(), q.x(), q.y(), q.z()));
111 } // namespace Dali::Toolkit::Physics::Internal