2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/event/dynamics/dynamics-body-impl.h>
24 #include <dali/public-api/math/math-utils.h>
27 #include <dali/integration-api/debug.h>
28 #include <dali/integration-api/dynamics/dynamics-body-settings.h>
29 #include <dali/internal/event/actors/actor-impl.h>
30 #include <dali/internal/event/common/stage-impl.h>
31 #include <dali/internal/event/dynamics/dynamics-body-config-impl.h>
32 #include <dali/internal/event/dynamics/dynamics-shape-impl.h>
33 #include <dali/internal/event/dynamics/dynamics-world-impl.h>
34 #include <dali/internal/update/dynamics/scene-graph-dynamics-body.h>
35 #include <dali/internal/update/dynamics/scene-graph-dynamics-world.h>
43 DynamicsBody::DynamicsBody(const std::string& name, DynamicsBodyConfigPtr config, Actor& actor, SceneGraph::Node& node )
44 : mDynamicsBody(NULL),
52 DALI_ASSERT_DEBUG(config);
54 StagePtr stage( Stage::GetCurrent() );
56 DynamicsWorldPtr world( stage->GetDynamicsWorld() );
58 mDynamicsBody = new SceneGraph::DynamicsBody( *(world->GetSceneObject()), node );
60 mShape = config->GetShape();
62 Integration::DynamicsBodySettings* settings( new Integration::DynamicsBodySettings(*config->GetSettings()) ); // copy settings
63 SceneGraph::DynamicsShape* sceneShape( mShape->GetSceneObject() );
64 InitializeDynamicsBodyMessage( stage->GetUpdateInterface(), *mDynamicsBody, settings, *sceneShape );
66 SetMass( config->GetMass() );
67 SetElasticity( config->GetElasticity() );
69 short int collisionGroup( config->GetCollisionGroup() );
70 short int collisionMask( config->GetCollisionMask() );
71 if( !config->IsCollisionFilterSet() )
73 if( EqualsZero( config->GetMass() ) )
75 // static body and default collision filter has not been overwritten
76 collisionGroup = Dali::DynamicsBodyConfig::COLLISION_FILTER_STATIC;
77 collisionMask = Dali::DynamicsBodyConfig::COLLISION_FILTER_ALL ^ Dali::DynamicsBodyConfig::COLLISION_FILTER_STATIC;
81 SetCollisionGroupMessage( stage->GetUpdateInterface(), *mDynamicsBody, collisionGroup );
82 SetCollisionMaskMessage( stage->GetUpdateInterface(), *mDynamicsBody, collisionMask );
84 world->MapActor(mDynamicsBody, actor);
87 DynamicsBody::~DynamicsBody()
89 DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s - %s\n", __PRETTY_FUNCTION__, mName.c_str());
91 if( Stage::IsInstalled() )
93 DeleteBodyMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()) );
95 DynamicsWorldPtr world( Stage::GetCurrent()->GetDynamicsWorld() );
99 world->UnmapActor(mDynamicsBody);
106 const std::string& DynamicsBody::GetName() const
111 float DynamicsBody::GetMass() const
121 void DynamicsBody::SetMass(const float mass)
123 DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s - Mass:%f\n", __PRETTY_FUNCTION__, mass);
125 if( fabsf(mMass - mass) >= GetRangedEpsilon(mMass, mass) )
130 SetMassMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), mMass );
135 float DynamicsBody::GetElasticity() const
140 void DynamicsBody::SetElasticity(const float elasticity)
142 if( fabsf(mElasticity - elasticity) >= GetRangedEpsilon(mElasticity, elasticity) )
144 mElasticity = elasticity;
145 SetElasticityMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), mElasticity );
149 void DynamicsBody::SetLinearVelocity(const Vector3& velocity)
151 SetLinearVelocityMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), velocity );
154 Vector3 DynamicsBody::GetCurrentLinearVelocity() const
156 return GetSceneObject()->GetLinearVelocity( Stage::GetCurrent()->GetEventBufferIndex() );
159 void DynamicsBody::SetAngularVelocity(const Vector3& velocity)
161 SetAngularVelocityMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), velocity );
164 Vector3 DynamicsBody::GetCurrentAngularVelocity() const
166 return GetSceneObject()->GetAngularVelocity( Stage::GetCurrent()->GetEventBufferIndex() );
169 void DynamicsBody::SetKinematic( const bool flag )
171 if( mKinematic != flag )
173 // kinematic objects have zero mass
174 if( flag && ( ! EqualsZero( mMass ) ) )
176 SetMassMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), 0.0f );
180 SetKinematicMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), flag );
182 if( !flag && ( ! EqualsZero( mMass ) ) )
184 SetMassMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), mMass );
189 SetSleepEnabledMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), mSleepEnabled );
194 bool DynamicsBody::IsKinematic() const
199 void DynamicsBody::SetSleepEnabled( const bool flag )
201 if( mSleepEnabled != flag )
203 mSleepEnabled = flag;
207 SetSleepEnabledMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), flag );
212 bool DynamicsBody::GetSleepEnabled() const
214 return mSleepEnabled;
217 void DynamicsBody::WakeUp()
219 WakeUpMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()) );
222 void DynamicsBody::AddAnchor(const unsigned int index, DynamicsBodyPtr body, const bool collisions)
224 AddAnchorMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), index, *(body->GetSceneObject()), collisions );
227 void DynamicsBody::ConserveVolume(const bool flag)
229 ConserveVolumeMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), flag );
232 void DynamicsBody::ConserveShape(const bool flag)
234 ConserveShapeMessage( Stage::GetCurrent()->GetUpdateInterface(), *(GetSceneObject()), flag );
237 Actor& DynamicsBody::GetActor() const
242 void DynamicsBody::Connect(Stage& stage)
244 DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s - %s\n", __PRETTY_FUNCTION__, mName.c_str());
246 ConnectMessage( stage.GetUpdateInterface(), *(GetSceneObject()) );
249 void DynamicsBody::Disconnect(Stage& stage)
251 DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s - %s\n", __PRETTY_FUNCTION__, mName.c_str());
253 if( stage.IsInstalled() )
255 DisconnectMessage( stage.GetUpdateInterface(), *(GetSceneObject()) );
260 } // namespace Internal