[dali_2.3.21] Merge branch 'devel/master'
[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-world-impl.h>
28 #include <dali-physics/public-api/physics-adaptor.h>
29
30 namespace Dali::Toolkit::Physics
31 {
32 namespace Internal
33 {
34 class PhysicsAdaptor;
35 class PhysicsDebugRenderer;
36
37 using PhysicsAdaptorPtr = IntrusivePtr<PhysicsAdaptor>;
38
39 // Declaration of factory function, implemented by derived class
40 PhysicsAdaptorPtr CreateNewPhysicsAdaptor(const Dali::Matrix& transform, Uint16Pair worldSize);
41
42 class PhysicsAdaptor : public BaseObject
43 {
44 public:
45   PhysicsAdaptor();
46
47   /**
48    * A reference counted object may only be deleted by calling Unreference()
49    */
50   ~PhysicsAdaptor() override;
51
52   // Remove copy constructor and copy assignment
53   PhysicsAdaptor(const PhysicsAdaptor& handle) = delete;
54   PhysicsAdaptor& operator=(const PhysicsAdaptor& handle) = delete;
55
56   /**
57    * 2nd stage initialization
58    */
59   void         Initialize(const Dali::Matrix& transform, Uint16Pair size);
60   virtual void OnInitialize(const Dali::Matrix& transform, Uint16Pair size) = 0;
61
62   /**
63    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetTimestep
64    */
65   void SetTimestep(float timestep);
66
67   /**
68    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetTimestep
69    */
70   float GetTimestep() const;
71
72   /**
73    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetPhysicsAccessor
74    */
75   Physics::PhysicsAdaptor::ScopedPhysicsAccessorPtr GetPhysicsAccessor();
76
77   /**
78    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::CreateDebugLayer
79    */
80   virtual Dali::Layer CreateDebugLayer(Dali::Window window) = 0;
81
82   /**
83    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateToPhysicsSpace
84    */
85   virtual Dali::Vector3 TranslateToPhysicsSpace(Dali::Vector3 vector) const = 0;
86
87   /**
88    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateToPhysicsSpace
89    */
90   virtual Dali::Quaternion TranslateToPhysicsSpace(Dali::Quaternion rotation) const = 0;
91
92   /**
93    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateFromPhysicsSpace
94    */
95   virtual Dali::Vector3 TranslateFromPhysicsSpace(Dali::Vector3 vector) const = 0;
96
97   /**
98    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateFromPhysicsSpace
99    */
100   virtual Dali::Quaternion TranslateFromPhysicsSpace(Quaternion rotation) const = 0;
101
102   /**
103    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ConvertVectorToPhysicsSpace
104    */
105   virtual Dali::Vector3 ConvertVectorToPhysicsSpace(Dali::Vector3 vector) const = 0;
106
107   /**
108    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ConvertVectorFromPhysicsSpace
109    */
110   virtual Dali::Vector3 ConvertVectorFromPhysicsSpace(Dali::Vector3 vector) const = 0;
111
112   /**
113    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetTransformAndSize
114    */
115   virtual void SetTransformAndSize(const Dali::Matrix& transform, Uint16Pair size) = 0;
116
117   /**
118    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetIntegrationState
119    */
120   void SetIntegrationState(Physics::PhysicsAdaptor::IntegrationState state);
121
122   /**
123    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetIntegrationState
124    */
125   Physics::PhysicsAdaptor::IntegrationState GetIntegrationState() const;
126
127   /**
128    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetDebugState
129    */
130   void SetDebugState(Physics::PhysicsAdaptor::DebugState state);
131
132   /**
133    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetDebugState
134    */
135   Physics::PhysicsAdaptor::DebugState GetDebugState() const;
136
137   /**
138    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::AddActorBody
139    */
140   virtual PhysicsActorPtr AddActorBody(Dali::Actor actor, Dali::Any body) = 0;
141
142   /**
143    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::RemoveActorBody
144    */
145   virtual void RemoveActorBody(PhysicsActor& physicsActor) = 0;
146
147   /**
148    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetPhysicsActor
149    */
150   virtual PhysicsActorPtr GetPhysicsActor(Dali::Any body) const = 0;
151
152   /**
153    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetRootActor
154    */
155   Dali::Actor GetRootActor() const;
156
157   /**
158    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::BuildPickingRay
159    */
160   virtual void BuildPickingRay(Dali::Vector3 origin, Dali::Vector3 direction, Dali::Vector3& rayFromWorld, Dali::Vector3& rayToWorld) = 0;
161
162   /**
163    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ProjectPoint
164    */
165   virtual Dali::Vector3 ProjectPoint(Dali::Vector3 origin, Dali::Vector3 direction, float distance) = 0;
166
167   /**
168    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::Queue
169    */
170   void Queue(std::function<void(void)> function);
171
172   /**
173    * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::Queue
174    */
175   void CreateSyncPoint();
176
177   /**
178    * Handle the update of all of the known bound actors
179    */
180   void OnUpdateActors(Dali::UpdateProxy* updateProxy);
181
182   std::unique_ptr<PhysicsWorld>& GetPhysicsWorld();
183
184 protected:
185   std::unique_ptr<PhysicsWorld>                 mPhysicsWorld;
186   std::unordered_map<uint32_t, PhysicsActorPtr> mPhysicsActors;
187   Dali::Actor                                   mRootActor;
188
189   Dali::Matrix     mTransform;
190   Dali::Matrix     mInverseTransform;
191   Dali::Uint16Pair mSize;
192
193   Dali::SlotDelegate<PhysicsAdaptor> mSlotDelegate;
194 };
195
196 } //namespace Internal
197
198 inline Internal::PhysicsAdaptor& GetImplementation(Dali::Toolkit::Physics::PhysicsAdaptor& handle)
199 {
200   DALI_ASSERT_ALWAYS(handle && "Physics adaptor handle is empty");
201   BaseObject& object = handle.GetBaseObject();
202   return static_cast<Internal::PhysicsAdaptor&>(object);
203 }
204
205 inline const Internal::PhysicsAdaptor& GetImplementation(const Dali::Toolkit::Physics::PhysicsAdaptor& handle)
206 {
207   DALI_ASSERT_ALWAYS(handle && "Physics adaptor handle is empty");
208   const BaseObject& object = handle.GetBaseObject();
209   return static_cast<const Internal::PhysicsAdaptor&>(object);
210 }
211
212 } // namespace Dali::Toolkit::Physics
213
214 #endif //DALI_TOOLKIT_PHYSICS_INTERNAL_ADAPTOR_H