2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://floralicense.org/license/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 * @file FUiEffects_RuntimeModelSurface.cpp
19 * @brief This file contains an implementation of ModelSurface class methods
24 #include "../FUiEffects_EffectErrorMessages.h"
25 #include <FBaseSysLog.h>
26 #include <FBaseErrors.h>
27 #include <FUiEffects_PePointSurface.h>
28 #include <FUiEffects_PeSpringSurface.h>
29 #include <FUiEffects_PeRodSurface.h>
30 #include "FUiEffects_RuntimeModelSurface.h"
31 #include "FUiEffects_RuntimeGraphicalSurface.h"
32 #include "FUiEffects_RuntimeModel.h"
33 #include "FUiEffects_RuntimePropertyCast.h"
35 using namespace Tizen::Ui::Effects::_PhysicsEngine;
36 using namespace Tizen::Ui::Effects::_Utils;
39 namespace Tizen { namespace Ui { namespace Effects { namespace _Runtime
43 ElementsSurfaceContainerDeleter::operator()(TypeElemSurfaceCollection* pElemSurfaceCollection)
45 TypeElemSurfaceCollection::iterator it;
46 for (it = pElemSurfaceCollection->begin(); it != pElemSurfaceCollection->end(); ++it)
50 delete pElemSurfaceCollection;
53 ModelSurface::ModelSurface(long objId,
54 unsigned short iterationCount_,
55 unsigned short modelSpeed_,
57 const Vec3f &gravityAccelerationIdentity_,
58 float gravityAccelerationValue_,
60 : ElementSurface(objId)
61 , __pElemSurfaceCollection(null)
62 , __pGraphicalSurface(null)
63 , __iterationCount(iterationCount_)
64 , __modelSpeed(modelSpeed_)
65 , __envResistance(envResistance_)
66 , __gravityAccelerationIdentity(gravityAccelerationIdentity_)
67 , __gravityAccelerationValue(gravityAccelerationValue_)
68 , __gravityAccelerationVector(gravityAccelerationValue_ * gravityAccelerationIdentity_)
69 , __groundLevel(groundLevel_)
70 , __pPointsCollection(null)
71 , __pSpringsCollection(null)
72 , __pRodsCollection(null)
74 unique_ptr<TypeElemSurfaceCollection, ElementsSurfaceContainerDeleter> pElemSurfaceCollection(new (std::nothrow) TypeElemSurfaceCollection, ElementsSurfaceContainerDeleter());
75 SysTryReturnVoidResult(NID_UI_EFFECT, pElemSurfaceCollection.get() != null, E_OUT_OF_MEMORY, _UiEffectError::OUT_OF_MEMORY);
77 unique_ptr<TypePointSurfaceCollection> pPointsCollection(new (std::nothrow) TypePointSurfaceCollection);
78 SysTryReturnVoidResult(NID_UI_EFFECT, pPointsCollection.get() != null, E_OUT_OF_MEMORY, _UiEffectError::OUT_OF_MEMORY);
79 unique_ptr<TypeSpringSurfaceCollection> pSpringsCollection(new (std::nothrow) TypeSpringSurfaceCollection);
80 SysTryReturnVoidResult(NID_UI_EFFECT, pSpringsCollection.get() != null, E_OUT_OF_MEMORY, _UiEffectError::OUT_OF_MEMORY);
81 unique_ptr<TypeRodSurfaceCollection> pRodsCollection(new (std::nothrow) TypeRodSurfaceCollection);
82 SysTryReturnVoidResult(NID_UI_EFFECT, pRodsCollection.get() != null, E_OUT_OF_MEMORY, _UiEffectError::OUT_OF_MEMORY);
84 __pElemSurfaceCollection = std::move(pElemSurfaceCollection);
85 __pPointsCollection = std::move(pPointsCollection);
86 __pSpringsCollection = std::move(pSpringsCollection);
87 __pRodsCollection = std::move(pRodsCollection);
90 ModelSurface::~ModelSurface(void)
96 ModelSurface::Calculate(float timeStep)
98 TypeElemSurfaceCollection::iterator it;
99 for (int j = 0; j < __modelSpeed; ++j)
101 for (int i = 0; i < __iterationCount; ++i)
103 for (it = __pElemSurfaceCollection->begin(); it != __pElemSurfaceCollection->end(); ++it )
105 (*it)->Calculate(timeStep / __iterationCount);
113 ModelSurface::GetProperty(ElementProperty propName)const
115 PropertyCast propCast = {PropertyCast::NO_PROPERTY, {0}};
118 case N_NUMBER_ITERATIONS:
119 propCast.type = PropertyCast::NUMBER;
120 propCast.value.numberValue = __iterationCount;
123 propCast.type = PropertyCast::NUMBER;
124 propCast.value.numberValue = __modelSpeed;
126 case N_ENV_RESISTANCE:
127 propCast.type = PropertyCast::NUMBER;
128 propCast.value.numberValue = __envResistance;
130 case N_GRAVITY_ACCEL_VALUE:
131 propCast.type = PropertyCast::NUMBER;
132 propCast.value.numberValue = __gravityAccelerationValue;
134 case V_GRAVITY_ACCELERATION:
135 propCast.type = PropertyCast::VEC3;
136 propCast.value.vec3Value = &__gravityAccelerationVector;
139 propCast.type = PropertyCast::NO_PROPERTY;
146 ModelSurface::SetProperty(ElementProperty propName, bool propValue)
152 ModelSurface::SetProperty(ElementProperty propName, LUA_NUMBER propValue)
156 case N_NUMBER_ITERATIONS:
157 __iterationCount = propValue;
160 __modelSpeed = propValue;
162 case N_ENV_RESISTANCE:
163 __envResistance = propValue;
165 case N_GRAVITY_ACCEL_VALUE:
166 __gravityAccelerationValue = propValue;
167 __gravityAccelerationVector = __gravityAccelerationValue * __gravityAccelerationIdentity;
177 ModelSurface::SetProperty(ElementProperty propName, const Vec3f &propValue)
181 case V_GRAVITY_ACCELERATION:
182 __gravityAccelerationIdentity = propValue.getNormalized();
183 __gravityAccelerationVector = __gravityAccelerationValue * __gravityAccelerationIdentity;
194 ModelSurface::SetPropertyGroup(GroupElements group, ElementProperty property, LUA_NUMBER value)
199 return SetPropertyGroup<TypePointSurfaceCollection,
200 TypePointSurfaceCollection::iterator>(__pPointsCollection.get(), property, value);
203 return SetPropertyGroup<TypeSpringSurfaceCollection,
204 TypeSpringSurfaceCollection::iterator>(__pSpringsCollection.get(), property, value);
207 return SetPropertyGroup<TypeRodSurfaceCollection,
208 TypeRodSurfaceCollection::iterator>(__pRodsCollection.get(), property, value);
216 template<typename T, typename TIter> bool
217 ModelSurface::SetPropertyGroup(T* pDataPointer, ElementProperty property, LUA_NUMBER value)
220 TIter itBegin = pDataPointer->begin();
221 TIter itEnd = pDataPointer->end();
223 if (pDataPointer->empty())
228 for (it = itBegin; it != itEnd; ++it)
230 if (!((*it)->SetProperty(property, value)))
239 ModelSurface::Initialize(void)
241 TypeElemSurfaceCollection::iterator it;
242 for (it = __pElemSurfaceCollection->begin(); it != __pElemSurfaceCollection->end(); ++it)
247 __pGraphicalSurface->Initialize();
253 ModelSurface::AddGraphicalSurface(unique_ptr<GraphicalSurface> pGraphicalSurface)
255 __pGraphicalSurface = std::move(pGraphicalSurface);
260 ModelSurface::AddElementSurface(ElementSurface* pElementSurface)
262 __pElemSurfaceCollection->push_back(pElementSurface);
267 ModelSurface::Construct(TypeMapElements* pMapElements, TypeMapGSurface* pMapGSurface, RenderDataSurfaceCollection* pRenderDataSurfaceCollection)
269 pMapElements->insert(std::make_pair(this->GetId(), this));
270 pMapElements->insert(std::make_pair(__pGraphicalSurface->GetId(), __pGraphicalSurface.get()));
271 pMapGSurface->insert(std::make_pair(__pGraphicalSurface->GetId(), __pGraphicalSurface.get()));
272 TypeElemSurfaceCollection::iterator it;
273 for (it = __pElemSurfaceCollection->begin(); it != __pElemSurfaceCollection->end(); ++it)
275 pMapElements->insert(std::make_pair((*it)->GetId(), *it));
277 if ((*it)->GetType() >= ESURFACE_POINT_SURFACE)
279 PointSurface* p = dynamic_cast<PointSurface*>(*it);
280 SysAssertf(p != null, _UiEffectError::INTERNAL_ERROR);
281 bool res = p->Construct(&__envResistance, &__gravityAccelerationVector, &__groundLevel);
282 SysTryReturn(NID_UI_EFFECT, res, false, E_SYSTEM, _UiEffectError::INTERNAL_ERROR);
284 __pPointsCollection->push_back(p);
286 else if ((*it)->GetType() == ESURFACE_SPRING_SURFACE)
288 SpringSurface* p = dynamic_cast<SpringSurface*>(*it);
289 SysAssertf(p != null, _UiEffectError::INTERNAL_ERROR);
290 __pSpringsCollection->push_back(p);
292 else if ((*it)->GetType() == ESURFACE_ROD_SURFACE)
294 RodSurface* p = dynamic_cast<RodSurface*>(*it);
295 SysAssertf(p != null, _UiEffectError::INTERNAL_ERROR);
296 __pRodsCollection->push_back(p);
300 //constructing the collection of pointers to physical points (PointSurfaceNURBS) and
301 //constructing data collection for rendering
302 __pGraphicalSurface->Construct(__pElemSurfaceCollection.get(), pRenderDataSurfaceCollection);
308 ModelSurface::UpdateGraphicalSurface(void)
310 __pGraphicalSurface->Update();
315 ModelSurface::GetType(void)const
317 return ESURFACE_MODEL_SURFACE;
321 ModelSurface::GetDistanceFromGround(void) const
323 TypePointSurfaceCollection::iterator it;
325 for (it = __pPointsCollection->begin(); it != __pPointsCollection->end(); ++it)
327 sum += (*it)->GetPosition().z - __groundLevel;
330 TypePointSurfaceCollection::size_type size = __pPointsCollection->size();
332 return (size == 0 ? sum : sum / size);
335 } } } } // Tizen::Ui::Effects::_Runtime