[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-physics / internal / bullet-impl / bullet-physics-actor-impl.cpp
1 /*
2  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 // Class Header
18 #include <dali-physics/internal/physics-actor-impl.h>
19
20 #include <btBulletDynamicsCommon.h>
21 #include <dali-physics/internal/physics-adaptor-impl.h>
22
23 namespace Dali::Toolkit::Physics::Internal
24 {
25 namespace
26 {
27 inline btVector3 fromVec3(Dali::Vector3 vec3)
28 {
29   return btVector3(vec3.x, vec3.y, vec3.z);
30 }
31 inline Dali::Vector3 toVec3(btVector3 vec3)
32 {
33   return Dali::Vector3(vec3.x(), vec3.y(), vec3.z());
34 }
35
36 inline btQuaternion fromQuat(Dali::Quaternion q)
37 {
38   return btQuaternion(q.mVector.x, q.mVector.y, q.mVector.z, q.mVector.w);
39 }
40 inline Dali::Quaternion toQuat(btQuaternion q)
41 {
42   return Dali::Quaternion(q.w(), q.x(), q.y(), q.z());
43 }
44
45 } //Anonymous namespace
46
47 PhysicsActorPtr PhysicsActor::New(Dali::Actor actor, Dali::Any body, Dali::Toolkit::Physics::Internal::PhysicsAdaptor& adaptor)
48 {
49   PhysicsActorPtr physicsActor(new Internal::PhysicsActor(actor, body, adaptor));
50   physicsActor->Initialize();
51   return physicsActor;
52 }
53
54 PhysicsActor::PhysicsActor(Dali::Actor actor, Dali::Any body, PhysicsAdaptor& adaptor)
55 : mAdaptor(adaptor),
56   mActorId(actor.GetProperty<int>(Dali::Actor::Property::ID)),
57   mBody(body)
58 {
59 }
60
61 PhysicsActor::~PhysicsActor() = default;
62
63 void PhysicsActor::Initialize(void)
64 {
65 }
66
67 void PhysicsActor::AsyncSetPhysicsPosition(Dali::Vector3 actorPosition)
68 {
69   // Queue task
70   btRigidBody* body = mBody.Get<btRigidBody*>();
71   auto         pos  = fromVec3(mAdaptor.TranslateToPhysicsSpace(actorPosition));
72   mAdaptor.Queue([body, pos] { body->getWorldTransform().setOrigin(pos); });
73 }
74
75 void PhysicsActor::AsyncSetPhysicsRotation(Dali::Quaternion rotation)
76 {
77   // Queue task
78   btRigidBody* body = mBody.Get<btRigidBody*>();
79   auto         q    = fromQuat(mAdaptor.TranslateToPhysicsSpace(rotation));
80   mAdaptor.Queue([body, q]() { body->getWorldTransform().setRotation(q); });
81 }
82
83 Dali::Vector3 PhysicsActor::GetPhysicsPosition() const
84 {
85   btRigidBody* body = mBody.Get<btRigidBody*>();
86   return toVec3(body->getWorldTransform().getOrigin());
87 }
88
89 Dali::Quaternion PhysicsActor::GetPhysicsRotation() const
90 {
91   btRigidBody* body = mBody.Get<btRigidBody*>();
92   return toQuat(body->getWorldTransform().getRotation());
93 }
94
95 Dali::Vector3 PhysicsActor::GetActorPosition() const
96 {
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()));
101 }
102
103 Dali::Quaternion PhysicsActor::GetActorRotation() const
104 {
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()));
109 }
110
111 } // namespace Dali::Toolkit::Physics::Internal