1 #ifndef __DYNAMICS_WORLD_IMPL_H__
2 #define __DYNAMICS_WORLD_IMPL_H__
5 * Copyright (c) 2014 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 implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/object/base-object.h>
23 #include <dali/devel-api/common/map-wrapper.h>
24 #include <dali/internal/common/message.h>
25 #include <dali/internal/event/actors/actor-declarations.h>
26 #include <dali/internal/event/dynamics/dynamics-declarations.h>
27 #include <dali/internal/event/effects/shader-declarations.h>
28 #include <dali/devel-api/dynamics/dynamics-world.h>
29 #include <dali/public-api/signals/slot-delegate.h>
38 struct DynamicsCollisionData;
40 class DynamicsFactory;
42 } // namespace Integration
51 struct DynamicsCollisionData;
54 } // namespace SceneGraph
56 /// @copydoc Dali::DynamicsWorld
57 class DynamicsWorld : public BaseObject
60 static DynamicsWorldPtr New();
65 * @param[in] name A name for the world
67 DynamicsWorld(const std::string& name);
72 * A reference counted object may only be deleted by calling Unreference()
74 virtual ~DynamicsWorld();
77 // unimplemented copy constructor and assignment operator
78 DynamicsWorld(const DynamicsWorld&);
79 DynamicsWorld& operator=(const DynamicsWorld&);
84 * @return A pointer to the dynamics world if it is installed
86 static DynamicsWorldPtr Get();
89 * Connects a callback function with the object's signals.
90 * @param[in] object The object providing the signal.
91 * @param[in] tracker Used to disconnect the signal.
92 * @param[in] signalName The signal to connect to.
93 * @param[in] functor A newly allocated FunctorDelegate.
94 * @return True if the signal was connected.
95 * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor.
97 static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor );
100 * Initializes the simulation
101 * @param[in] stage A reference to the stage.
102 * @param[in] dynamicsFactory A reference to the factory object which creates instances of dynamics objects
103 * @param[in] config Configuration parameters for the world
105 void Initialize(Stage& stage, Integration::DynamicsFactory& dynamicsFactory, DynamicsWorldConfigPtr config);
108 * Terminate the simulation, sends a message to UpdateManager
109 * @param[in] stage A reference to the stage.
111 void Terminate(Stage& stage);
115 /// @copydoc Dali::SetGravity
116 void SetGravity(const Vector3& gravity);
118 /// @copydoc Dali::GetGravity
119 const Vector3& GetGravity() const;
121 /// @copydoc Dali::DynamicsWorld::CollisionSignal
122 Dali::DynamicsWorld::CollisionSignalType& CollisionSignal();
124 /// @copydoc Dali::DynamicsWorld::GetDebugDrawMode
125 int GetDebugDrawMode() const;
127 /// @copydoc Dali::DynamicsWorld::SetDebugDrawMode
128 void SetDebugDrawMode(const int mode);
130 /// @copydoc Dali::DynamicsWorld::SetRootActor
131 void SetRootActor(ActorPtr actor);
133 /// @copydoc Dali::DynamicsWorld::GetRootActor
134 ActorPtr GetRootActor() const;
136 SceneGraph::DynamicsWorld* GetSceneObject() const
138 return mDynamicsWorld;
143 * Callback, invoked when the Actor set in SetWorldRoot() is added to the scene graph
144 * @param actor A handle to the root actor.
146 void RootOnStage( Dali::Actor actor );
149 * Callback, invoked when the Actor set in SetWorldRoot() is removed from the scene graph
150 * @param actor A handle to the root actor.
152 void RootOffStage( Dali::Actor actor );
156 // From DynamicsCollisionNotifier
159 * @copydoc DynamicsNotifier::CollisionImpact
161 void CollisionImpact( Integration::DynamicsCollisionData* collisionData );
164 * @copydoc DynamicsNotifier::CollisionScrape
166 void CollisionScrape( Integration::DynamicsCollisionData* collisionData );
169 * @copydoc DynamicsNotifier::CollisionDisperse
171 void CollisionDisperse( Integration::DynamicsCollisionData* collisionData );
173 void MapActor(SceneGraph::DynamicsBody* sceneObject, Actor& actor);
174 void UnmapActor(SceneGraph::DynamicsBody* sceneObject);
175 ActorPtr GetMappedActor(SceneGraph::DynamicsBody* sceneObject) const;
178 typedef std::map< SceneGraph::DynamicsBody*, Actor* > BodyContainer;
181 SceneGraph::DynamicsWorld* mDynamicsWorld;
182 Vector3 mGravity; ///< World gravity
184 BodyContainer mBodies;
187 Dali::DynamicsWorld::CollisionSignalType mCollisionSignal;
189 SlotDelegate< DynamicsWorld > mSlotDelegate;
194 inline MessageBase* CollisionImpactMessage( DynamicsWorld& dynamicsWorld, Integration::DynamicsCollisionData* collisionData )
196 return new MessageValue1< DynamicsWorld, Integration::DynamicsCollisionData* >( &dynamicsWorld, &DynamicsWorld::CollisionImpact, collisionData );
199 inline MessageBase* CollisionScrapeMessage( DynamicsWorld& dynamicsWorld, Integration::DynamicsCollisionData* collisionData )
201 return new MessageValue1< DynamicsWorld, Integration::DynamicsCollisionData* >( &dynamicsWorld, &DynamicsWorld::CollisionScrape, collisionData );
204 inline MessageBase* CollisionDisperseMessage( DynamicsWorld& dynamicsWorld, Integration::DynamicsCollisionData* collisionData )
206 return new MessageValue1< DynamicsWorld, Integration::DynamicsCollisionData* >( &dynamicsWorld, &DynamicsWorld::CollisionDisperse, collisionData );
209 } // namespace Internal
211 // Helpers for public-api forwarding methods
213 inline Internal::DynamicsWorld& GetImplementation(DynamicsWorld& object)
215 DALI_ASSERT_ALWAYS(object && "DynamicsWorld object is uninitialized!");
217 Dali::RefObject& handle = object.GetBaseObject();
219 return static_cast<Internal::DynamicsWorld&>(handle);
222 inline const Internal::DynamicsWorld& GetImplementation(const DynamicsWorld& object)
224 DALI_ASSERT_ALWAYS(object && "DynamicsWorld object is uninitialized!");
226 const Dali::RefObject& handle = object.GetBaseObject();
228 return static_cast<const Internal::DynamicsWorld&>(handle);
233 #endif // __DYNAMICS_WORLD_IMPL_H__