1 #ifndef DALI_TOOLKIT_PHYSICS_INTERNAL_ADAPTOR_H
2 #define DALI_TOOLKIT_PHYSICS_INTERNAL_ADAPTOR_H
5 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <dali/public-api/object/base-object.h>
23 #include <unordered_map>
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>
30 namespace Dali::Toolkit::Physics
35 class PhysicsDebugRenderer;
37 using PhysicsAdaptorPtr = IntrusivePtr<PhysicsAdaptor>;
39 // Declaration of factory function, implemented by derived class
40 PhysicsAdaptorPtr CreateNewPhysicsAdaptor(const Dali::Matrix& transform, Uint16Pair worldSize);
42 class PhysicsAdaptor : public BaseObject
48 * A reference counted object may only be deleted by calling Unreference()
50 ~PhysicsAdaptor() override;
52 // Remove copy constructor and copy assignment
53 PhysicsAdaptor(const PhysicsAdaptor& handle) = delete;
54 PhysicsAdaptor& operator=(const PhysicsAdaptor& handle) = delete;
57 * 2nd stage initialization
59 void Initialize(const Dali::Matrix& transform, Uint16Pair size);
60 virtual void OnInitialize(const Dali::Matrix& transform, Uint16Pair size) = 0;
63 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetTimestep
65 void SetTimestep(float timestep);
68 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetTimestep
70 float GetTimestep() const;
73 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetPhysicsAccessor
75 Physics::PhysicsAdaptor::ScopedPhysicsAccessorPtr GetPhysicsAccessor();
78 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::CreateDebugLayer
80 virtual Dali::Layer CreateDebugLayer(Dali::Window window) = 0;
83 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateToPhysicsSpace
85 virtual Dali::Vector3 TranslateToPhysicsSpace(Dali::Vector3 vector) const = 0;
88 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateToPhysicsSpace
90 virtual Dali::Quaternion TranslateToPhysicsSpace(Dali::Quaternion rotation) const = 0;
93 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateFromPhysicsSpace
95 virtual Dali::Vector3 TranslateFromPhysicsSpace(Dali::Vector3 vector) const = 0;
98 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateFromPhysicsSpace
100 virtual Dali::Quaternion TranslateFromPhysicsSpace(Quaternion rotation) const = 0;
103 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ConvertVectorToPhysicsSpace
105 virtual Dali::Vector3 ConvertVectorToPhysicsSpace(Dali::Vector3 vector) const = 0;
108 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ConvertVectorFromPhysicsSpace
110 virtual Dali::Vector3 ConvertVectorFromPhysicsSpace(Dali::Vector3 vector) const = 0;
113 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetTransformAndSize
115 virtual void SetTransformAndSize(const Dali::Matrix& transform, Uint16Pair size) = 0;
118 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetIntegrationState
120 void SetIntegrationState(Physics::PhysicsAdaptor::IntegrationState state);
123 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetIntegrationState
125 Physics::PhysicsAdaptor::IntegrationState GetIntegrationState() const;
128 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetDebugState
130 void SetDebugState(Physics::PhysicsAdaptor::DebugState state);
133 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetDebugState
135 Physics::PhysicsAdaptor::DebugState GetDebugState() const;
138 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::AddActorBody
140 virtual PhysicsActorPtr AddActorBody(Dali::Actor actor, Dali::Any body) = 0;
143 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::RemoveActorBody
145 virtual void RemoveActorBody(PhysicsActor& physicsActor) = 0;
148 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetPhysicsActor
150 virtual PhysicsActorPtr GetPhysicsActor(Dali::Any body) const = 0;
153 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetRootActor
155 Dali::Actor GetRootActor() const;
158 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::BuildPickingRay
160 virtual void BuildPickingRay(Dali::Vector3 origin, Dali::Vector3 direction, Dali::Vector3& rayFromWorld, Dali::Vector3& rayToWorld) = 0;
163 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ProjectPoint
165 virtual Dali::Vector3 ProjectPoint(Dali::Vector3 origin, Dali::Vector3 direction, float distance) = 0;
168 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::Queue
170 void Queue(std::function<void(void)> function);
173 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::Queue
175 void CreateSyncPoint();
178 * Handle the update of all of the known bound actors
180 void OnUpdateActors(Dali::UpdateProxy* updateProxy);
182 std::unique_ptr<PhysicsWorld>& GetPhysicsWorld();
185 std::unique_ptr<PhysicsWorld> mPhysicsWorld;
186 std::unordered_map<uint32_t, PhysicsActorPtr> mPhysicsActors;
187 Dali::Actor mRootActor;
189 Dali::Matrix mTransform;
190 Dali::Matrix mInverseTransform;
191 Dali::Uint16Pair mSize;
193 Dali::SlotDelegate<PhysicsAdaptor> mSlotDelegate;
196 } //namespace Internal
198 inline Internal::PhysicsAdaptor& GetImplementation(Dali::Toolkit::Physics::PhysicsAdaptor& handle)
200 DALI_ASSERT_ALWAYS(handle && "Physics adaptor handle is empty");
201 BaseObject& object = handle.GetBaseObject();
202 return static_cast<Internal::PhysicsAdaptor&>(object);
205 inline const Internal::PhysicsAdaptor& GetImplementation(const Dali::Toolkit::Physics::PhysicsAdaptor& handle)
207 DALI_ASSERT_ALWAYS(handle && "Physics adaptor handle is empty");
208 const BaseObject& object = handle.GetBaseObject();
209 return static_cast<const Internal::PhysicsAdaptor&>(object);
212 } // namespace Dali::Toolkit::Physics
214 #endif //DALI_TOOLKIT_PHYSICS_INTERNAL_ADAPTOR_H