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-debug-renderer.h>
28 #include <dali-physics/internal/physics-world-impl.h>
29 #include <dali-physics/public-api/physics-adaptor.h>
31 namespace Dali::Toolkit::Physics
36 using PhysicsAdaptorPtr = IntrusivePtr<PhysicsAdaptor>;
38 class PhysicsAdaptor : public BaseObject
44 * A reference counted object may only be deleted by calling Unreference()
46 ~PhysicsAdaptor() override;
48 // Remove copy constructor and copy assignment
49 PhysicsAdaptor(const PhysicsAdaptor& handle) = delete;
50 PhysicsAdaptor& operator=(const PhysicsAdaptor& handle) = delete;
52 static PhysicsAdaptorPtr New(const Dali::Matrix& transform, Uint16Pair size);
55 * 2nd stage initialization
57 void Initialize(const Dali::Matrix& transform, Uint16Pair size);
60 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetTimestep
62 void SetTimestep(float timestep);
65 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetTimestep
70 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetPhysicsAccessor
72 Physics::PhysicsAdaptor::ScopedPhysicsAccessorPtr GetPhysicsAccessor();
75 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::CreateDebugLayer
77 Dali::Layer CreateDebugLayer(Dali::Window window);
80 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateToPhysicsSpace
82 Dali::Vector3 TranslateToPhysicsSpace(Dali::Vector3 vector);
85 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateToPhysicsSpace
87 Dali::Quaternion TranslateToPhysicsSpace(Dali::Quaternion rotation);
90 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateFromPhysicsSpace
92 Dali::Vector3 TranslateFromPhysicsSpace(Dali::Vector3 vector);
95 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::TranslateFromPhysicsSpace
97 Dali::Quaternion TranslateFromPhysicsSpace(Quaternion rotation);
100 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ConvertVectorToPhysicsSpace
102 Dali::Vector3 ConvertVectorToPhysicsSpace(Dali::Vector3 vector);
105 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ConvertVectorFromPhysicsSpace
107 Dali::Vector3 ConvertVectorFromPhysicsSpace(Dali::Vector3 vector);
110 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetTransformAndSize
112 void SetTransformAndSize(const Dali::Matrix& transform, Uint16Pair size);
115 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetIntegrationState
117 void SetIntegrationState(Physics::PhysicsAdaptor::IntegrationState state);
120 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetIntegrationState
122 Physics::PhysicsAdaptor::IntegrationState GetIntegrationState();
125 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetDebugState
127 void SetDebugState(Physics::PhysicsAdaptor::DebugState state);
130 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetDebugState
132 Physics::PhysicsAdaptor::DebugState GetDebugState();
135 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::AddActorBody
137 PhysicsActorPtr AddActorBody(Dali::Actor actor, Dali::Any body);
140 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetPhysicsActor
142 PhysicsActorPtr GetPhysicsActor(Dali::Any body);
145 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::GetRootActor
147 Dali::Actor GetRootActor();
150 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::BuildPickingRay
152 void BuildPickingRay(Dali::Vector3 origin, Dali::Vector3 direction, Dali::Vector3& rayFromWorld, Dali::Vector3& rayToWorld);
155 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::ProjectPoint
157 Dali::Vector3 ProjectPoint(Dali::Vector3 origin, Dali::Vector3 direction, float distance);
160 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::Queue
162 void Queue(std::function<void(void)> function);
165 * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::Queue
167 void CreateSyncPoint();
171 * Handle the update of all of the known bound actors
173 void OnUpdateActors(Dali::UpdateProxy* updateProxy);
176 std::unique_ptr<PhysicsWorld> mPhysicsWorld;
177 std::unordered_map<uint32_t, PhysicsActorPtr> mPhysicsActors;
178 Dali::Actor mRootActor;
179 Dali::Actor mDebugActor;
181 Dali::Matrix mTransform;
182 Dali::Matrix mInverseTransform;
183 Dali::Uint16Pair mSize;
185 std::unique_ptr<PhysicsDebugRenderer> mDebugRenderer;
186 Dali::SlotDelegate<PhysicsAdaptor> mSlotDelegate;
189 } //namespace Internal
191 inline Internal::PhysicsAdaptor& GetImplementation(Dali::Toolkit::Physics::PhysicsAdaptor& handle)
193 DALI_ASSERT_ALWAYS(handle && "Physics adaptor handle is empty");
194 BaseObject& object = handle.GetBaseObject();
195 return static_cast<Internal::PhysicsAdaptor&>(object);
198 inline const Internal::PhysicsAdaptor& GetImplementation(const Dali::Toolkit::Physics::PhysicsAdaptor& handle)
200 DALI_ASSERT_ALWAYS(handle && "Physics adaptor handle is empty");
201 const BaseObject& object = handle.GetBaseObject();
202 return static_cast<const Internal::PhysicsAdaptor&>(object);
205 } // namespace Dali::Toolkit::Physics
207 #endif //DALI_TOOLKIT_PHYSICS_INTERNAL_ADAPTOR_H