9c1644aec8a3395d598a2ed1920521a173be1573
[platform/core/uifw/dali-toolkit.git] / dali-physics / internal / physics-adaptor-impl.h
1 #ifndef DALI_TOOLKIT_PHYSICS_INTERNAL_ADAPTOR_H
2 #define DALI_TOOLKIT_PHYSICS_INTERNAL_ADAPTOR_H
3
4 /*
5  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or adaptoried.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 // EXTERNAL INCLUDES
21 #include <dali/public-api/object/base-object.h>
22 #include <memory>
23 #include <unordered_map>
24
25 // INTERNAL INCLUDES
26 #include <dali-physics/internal/physics-actor-impl.h>
27 #include <dali-physics/internal/physics-debug-renderer.h>
28 #include <dali-physics/internal/physics-world-impl.h>
29 #include <dali-physics/public-api/physics-adaptor.h>
30
31 namespace Dali::Toolkit::Physics
32 {
33 namespace Internal
34 {
35 class PhysicsAdaptor;
36 using PhysicsAdaptorPtr = IntrusivePtr<PhysicsAdaptor>;
37
38 class PhysicsAdaptor : public BaseObject
39 {
40 public:
41   PhysicsAdaptor();
42
43   /**
44    * A reference counted object may only be deleted by calling Unreference()
45    */
46   ~PhysicsAdaptor() override;
47
48   // Remove copy constructor and copy assignment
49   PhysicsAdaptor(const PhysicsAdaptor& handle) = delete;
50   PhysicsAdaptor& operator=(const PhysicsAdaptor& handle) = delete;
51
52   static PhysicsAdaptorPtr New(const Dali::Matrix& transform, Uint16Pair size);
53
54   /**
55    * 2nd stage initialization
56    */
57   void Initialize(const Dali::Matrix& transform, Uint16Pair size);
58
59   /**
60    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetTimestep
61    */
62   void SetTimestep(float timestep);
63
64   /**
65    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetTimestep
66    */
67   float GetTimestep();
68
69   /**
70    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetPhysicsAccessor
71    */
72   Physics::PhysicsAdaptor::ScopedPhysicsAccessorPtr GetPhysicsAccessor();
73
74   /**
75    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::CreateDebugLayer
76    */
77   Dali::Layer CreateDebugLayer(Dali::Window window);
78
79   /**
80    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateToPhysicsSpace
81    */
82   Dali::Vector3 TranslateToPhysicsSpace(Dali::Vector3 vector);
83
84   /**
85    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateToPhysicsSpace
86    */
87   Dali::Quaternion TranslateToPhysicsSpace(Dali::Quaternion rotation);
88
89   /**
90    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateFromPhysicsSpace
91    */
92   Dali::Vector3 TranslateFromPhysicsSpace(Dali::Vector3 vector);
93
94   /**
95    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateFromPhysicsSpace
96    */
97   Dali::Quaternion TranslateFromPhysicsSpace(Quaternion rotation);
98
99   /**
100    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ConvertVectorToPhysicsSpace
101    */
102   Dali::Vector3 ConvertVectorToPhysicsSpace(Dali::Vector3 vector);
103
104   /**
105    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ConvertVectorFromPhysicsSpace
106    */
107   Dali::Vector3 ConvertVectorFromPhysicsSpace(Dali::Vector3 vector);
108
109   /**
110    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetTransformAndSize
111    */
112   void SetTransformAndSize(const Dali::Matrix& transform, Uint16Pair size);
113
114   /**
115    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetIntegrationState
116    */
117   void SetIntegrationState(Physics::PhysicsAdaptor::IntegrationState state);
118
119   /**
120    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetIntegrationState
121    */
122   Physics::PhysicsAdaptor::IntegrationState GetIntegrationState();
123
124   /**
125    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetDebugState
126    */
127   void SetDebugState(Physics::PhysicsAdaptor::DebugState state);
128
129   /**
130    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetDebugState
131    */
132   Physics::PhysicsAdaptor::DebugState GetDebugState();
133
134   /**
135    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::AddActorBody
136    */
137   PhysicsActorPtr AddActorBody(Dali::Actor actor, Dali::Any body);
138
139   /**
140    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetPhysicsActor
141    */
142   PhysicsActorPtr GetPhysicsActor(Dali::Any body);
143
144   /**
145    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetRootActor
146    */
147   Dali::Actor GetRootActor();
148
149   /**
150    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::BuildPickingRay
151    */
152   void BuildPickingRay(Dali::Vector3 origin, Dali::Vector3 direction, Dali::Vector3& rayFromWorld, Dali::Vector3& rayToWorld);
153
154   /**
155    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ProjectPoint
156    */
157   Dali::Vector3 ProjectPoint(Dali::Vector3 origin, Dali::Vector3 direction, float distance);
158
159   /**
160    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::Queue
161    */
162   void Queue(std::function<void(void)> function);
163
164   /**
165    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::Queue
166    */
167   void CreateSyncPoint();
168
169 private:
170   /**
171    * Handle the update of all of the known bound actors
172    */
173   void OnUpdateActors(Dali::UpdateProxy* updateProxy);
174
175 private:
176   std::unique_ptr<PhysicsWorld>                 mPhysicsWorld;
177   std::unordered_map<uint32_t, PhysicsActorPtr> mPhysicsActors;
178   Dali::Actor                                   mRootActor;
179   Dali::Actor                                   mDebugActor;
180
181   Dali::Matrix     mTransform;
182   Dali::Matrix     mInverseTransform;
183   Dali::Uint16Pair mSize;
184
185   std::unique_ptr<PhysicsDebugRenderer> mDebugRenderer;
186   Dali::SlotDelegate<PhysicsAdaptor>    mSlotDelegate;
187 };
188
189 } //namespace Internal
190
191 inline Internal::PhysicsAdaptor& GetImplementation(Dali::Toolkit::Physics::PhysicsAdaptor& handle)
192 {
193   DALI_ASSERT_ALWAYS(handle && "Physics adaptor handle is empty");
194   BaseObject& object = handle.GetBaseObject();
195   return static_cast<Internal::PhysicsAdaptor&>(object);
196 }
197
198 inline const Internal::PhysicsAdaptor& GetImplementation(const Dali::Toolkit::Physics::PhysicsAdaptor& handle)
199 {
200   DALI_ASSERT_ALWAYS(handle && "Physics adaptor handle is empty");
201   const BaseObject& object = handle.GetBaseObject();
202   return static_cast<const Internal::PhysicsAdaptor&>(object);
203 }
204
205 } // namespace Dali::Toolkit::Physics
206
207 #endif //DALI_TOOLKIT_PHYSICS_INTERNAL_ADAPTOR_H