9bd35f60d4e61eff40d459fc7ff1a38b62854235
[platform/core/uifw/dali-core.git] / dali / internal / event / dynamics / dynamics-world-impl.h
1 #ifndef __DYNAMICS_WORLD_IMPL_H__
2 #define __DYNAMICS_WORLD_IMPL_H__
3
4 /*
5  * Copyright (c) 2014 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 implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // INTERNAL HEADERS
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>
30
31
32 namespace Dali
33 {
34
35 namespace Integration
36 {
37
38 struct DynamicsCollisionData;
39 class  DynamicsBody;
40 class  DynamicsFactory;
41
42 } // namespace Integration
43
44 namespace Internal
45 {
46
47 class Stage;
48
49 namespace SceneGraph
50 {
51 struct DynamicsCollisionData;
52 class DynamicsBody;
53 class DynamicsWorld;
54 } // namespace SceneGraph
55
56 /// @copydoc Dali::DynamicsWorld
57 class DynamicsWorld : public BaseObject
58 {
59 public:
60   static DynamicsWorldPtr New();
61
62 public:
63   /**
64    * Constructor.
65    * @param[in] name    A name for the world
66    */
67   DynamicsWorld(const std::string& name);
68
69 protected:
70   /**
71    * Destructor.
72    * A reference counted object may only be deleted by calling Unreference()
73    */
74   virtual ~DynamicsWorld();
75
76 private:
77   // unimplemented copy constructor and assignment operator
78   DynamicsWorld(const DynamicsWorld&);
79   DynamicsWorld& operator=(const DynamicsWorld&);
80
81 public:
82   /**
83    * Singleton getter
84    * @return A pointer to the dynamics world if it is installed
85    */
86   static DynamicsWorldPtr Get();
87
88   /**
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.
96    */
97   static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor );
98
99   /**
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
104    */
105   void Initialize(Stage& stage, Integration::DynamicsFactory& dynamicsFactory, DynamicsWorldConfigPtr config);
106
107   /**
108    * Terminate the simulation, sends a message to UpdateManager
109    * @param[in] stage   A reference to the stage.
110    */
111   void Terminate(Stage& stage);
112
113   // Methods
114 public:
115   /// @copydoc Dali::SetGravity
116   void SetGravity(const Vector3& gravity);
117
118   /// @copydoc Dali::GetGravity
119   const Vector3& GetGravity() const;
120
121   /// @copydoc Dali::DynamicsWorld::CollisionSignal
122   Dali::DynamicsWorld::CollisionSignalType& CollisionSignal();
123
124   /// @copydoc Dali::DynamicsWorld::GetDebugDrawMode
125   int GetDebugDrawMode() const;
126
127   /// @copydoc Dali::DynamicsWorld::SetDebugDrawMode
128   void SetDebugDrawMode(const int mode);
129
130   /// @copydoc Dali::DynamicsWorld::SetRootActor
131   void SetRootActor(ActorPtr actor);
132
133   /// @copydoc Dali::DynamicsWorld::GetRootActor
134   ActorPtr GetRootActor() const;
135
136   SceneGraph::DynamicsWorld* GetSceneObject() const
137   {
138     return mDynamicsWorld;
139   }
140
141 private:
142   /**
143    * Callback, invoked when the Actor set in SetWorldRoot() is added to the scene graph
144    * @param actor A handle to the root actor.
145    */
146   void RootOnStage( Dali::Actor actor );
147
148   /**
149    * Callback, invoked when the Actor set in SetWorldRoot() is removed from the scene graph
150    * @param actor A handle to the root actor.
151    */
152   void RootOffStage( Dali::Actor actor );
153
154 public:
155
156   // From DynamicsCollisionNotifier
157
158   /**
159    * @copydoc DynamicsNotifier::CollisionImpact
160    */
161   void CollisionImpact( Integration::DynamicsCollisionData* collisionData );
162
163   /**
164    * @copydoc DynamicsNotifier::CollisionScrape
165    */
166   void CollisionScrape( Integration::DynamicsCollisionData* collisionData );
167
168   /**
169    * @copydoc DynamicsNotifier::CollisionDisperse
170    */
171   void CollisionDisperse( Integration::DynamicsCollisionData* collisionData );
172
173   void MapActor(SceneGraph::DynamicsBody* sceneObject, Actor& actor);
174   void UnmapActor(SceneGraph::DynamicsBody* sceneObject);
175   ActorPtr GetMappedActor(SceneGraph::DynamicsBody* sceneObject) const;
176
177 private:
178   typedef std::map< SceneGraph::DynamicsBody*, Actor* > BodyContainer;
179
180   int           mDebugMode;
181   SceneGraph::DynamicsWorld* mDynamicsWorld;
182   Vector3       mGravity; ///< World gravity
183   float         mUnit;
184   BodyContainer mBodies;
185   ActorPtr      mRootActor;
186
187   Dali::DynamicsWorld::CollisionSignalType mCollisionSignal;
188
189   SlotDelegate< DynamicsWorld > mSlotDelegate;
190 };
191
192 // Message helpers
193
194 inline MessageBase* CollisionImpactMessage( DynamicsWorld& dynamicsWorld, Integration::DynamicsCollisionData* collisionData )
195 {
196   return new MessageValue1< DynamicsWorld, Integration::DynamicsCollisionData* >( &dynamicsWorld, &DynamicsWorld::CollisionImpact, collisionData );
197 }
198
199 inline MessageBase* CollisionScrapeMessage( DynamicsWorld& dynamicsWorld, Integration::DynamicsCollisionData* collisionData )
200 {
201   return new MessageValue1< DynamicsWorld, Integration::DynamicsCollisionData* >( &dynamicsWorld, &DynamicsWorld::CollisionScrape, collisionData );
202 }
203
204 inline MessageBase* CollisionDisperseMessage( DynamicsWorld& dynamicsWorld, Integration::DynamicsCollisionData* collisionData )
205 {
206   return new MessageValue1< DynamicsWorld, Integration::DynamicsCollisionData* >( &dynamicsWorld, &DynamicsWorld::CollisionDisperse, collisionData );
207 }
208
209 } // namespace Internal
210
211 // Helpers for public-api forwarding methods
212
213 inline Internal::DynamicsWorld& GetImplementation(DynamicsWorld& object)
214 {
215   DALI_ASSERT_ALWAYS(object && "DynamicsWorld object is uninitialized!");
216
217   Dali::RefObject& handle = object.GetBaseObject();
218
219   return static_cast<Internal::DynamicsWorld&>(handle);
220 }
221
222 inline const Internal::DynamicsWorld& GetImplementation(const DynamicsWorld& object)
223 {
224   DALI_ASSERT_ALWAYS(object && "DynamicsWorld object is uninitialized!");
225
226   const Dali::RefObject& handle = object.GetBaseObject();
227
228   return static_cast<const Internal::DynamicsWorld&>(handle);
229 }
230
231 } // namespace Dali
232
233 #endif // __DYNAMICS_WORLD_IMPL_H__