Commit f638920616aff93ba6f8fb81ad5bb25390bd5889
1 parent
14514f29
Added 2d physics benchmark
First 30s, runs N balls using Animation & property notification that don't interact, Second 30s, runs N balls using 2D Physics and collisions. N by default is 500, but can be changed on the command line. FPS tracking is automatically switched on for this benchmark (Also changed CMakeLists.txt to be able to work as a subdirectory in a multi-repo build) Change-Id: Iccee1d40650563e3f45e021b4fb3fff871cc393e
Showing
9 changed files
with
438 additions
and
2 deletions
build/tizen/CMakeLists.txt
| ... | ... | @@ -21,8 +21,8 @@ OPTION(ENABLE_TRACE "Enable Trace" OFF) |
| 21 | 21 | OPTION(ENABLE_PKG_CONFIGURE "Use pkgconfig" ON) |
| 22 | 22 | OPTION(INTERNATIONALIZATION "Internationalization demo string names" ON) |
| 23 | 23 | |
| 24 | -SET(ROOT_SRC_DIR ${CMAKE_SOURCE_DIR}/../..) | |
| 25 | -SET(DEMO_SHARED ${CMAKE_SOURCE_DIR}/../../shared) | |
| 24 | +SET(ROOT_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../..) | |
| 25 | +SET(DEMO_SHARED ${CMAKE_CURRENT_SOURCE_DIR}/../../shared) | |
| 26 | 26 | |
| 27 | 27 | SET(PREFIX ${CMAKE_INSTALL_PREFIX}) |
| 28 | 28 | ... | ... |
com.samsung.dali-demo.xml
| ... | ... | @@ -43,6 +43,9 @@ |
| 43 | 43 | <ui-application appid="benchmark.example" exec="/usr/apps/com.samsung.dali-demo/bin/benchmark.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true"> |
| 44 | 44 | <label>Benchmark</label> |
| 45 | 45 | </ui-application> |
| 46 | + <ui-application appid="benchmark-2dphysics.example" exec="/usr/apps/com.samsung.dali-demo/bin/benchmark-2dphysics.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true"> | |
| 47 | + <label>Benchmark 2D Physics</label> | |
| 48 | + </ui-application> | |
| 46 | 49 | <ui-application appid="bezier-curve.example" exec="/usr/apps/com.samsung.dali-demo/bin/bezier-curve.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true"> |
| 47 | 50 | <label>Alpha Function Curve</label> |
| 48 | 51 | </ui-application> | ... | ... |
examples/benchmark-2dphysics/README.md
0 โ 100644
| 1 | +# 2d Physics benchmark Example | |
| 2 | + | |
| 3 | +This is an example to test the performance of DALI with and without physics enabled. | |
| 4 | +It first measures performance with physics and collisions off, by animating motion using | |
| 5 | +property notifications for 30 seconds. Uses N ImageViews, where N defaults to 500 | |
| 6 | + | |
| 7 | +Then, it creates a PhysicsAdaptor and uses zero gravity and a bounding box to achieve a | |
| 8 | +similar visual result with N ImageViews attached to physics bodies. | |
| 9 | + | |
| 10 | +N can be changed on the command line. | |
| 11 | + | |
| 12 | + | |
| 13 | + | ... | ... |
examples/benchmark-2dphysics/benchmark-2d-physics-controller.cpp
0 โ 100644
| 1 | +/* | |
| 2 | + * Copyright (c) 2023 Samsung Electronics Co., Ltd. | |
| 3 | + * | |
| 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 | |
| 7 | + * | |
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | + * | |
| 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. | |
| 15 | + */ | |
| 16 | + | |
| 17 | +#include <dali-physics/dali-physics.h> | |
| 18 | +#include <dali-toolkit/dali-toolkit.h> | |
| 19 | + | |
| 20 | +#include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h> | |
| 21 | +#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h> | |
| 22 | +#include <dali/devel-api/adaptor-framework/key-devel.h> | |
| 23 | +#include <dali/devel-api/events/hit-test-algorithm.h> | |
| 24 | +#include <dali/integration-api/debug.h> | |
| 25 | + | |
| 26 | +#include <chipmunk/chipmunk.h> | |
| 27 | +#include <cstdlib> | |
| 28 | +#include <iostream> | |
| 29 | +#include <string> | |
| 30 | + | |
| 31 | +using namespace Dali; | |
| 32 | +using namespace Dali::Toolkit::Physics; | |
| 33 | +using namespace Dali::ParentOrigin; | |
| 34 | +using namespace Dali::AnchorPoint; | |
| 35 | + | |
| 36 | +#if defined(DEBUG_ENABLED) | |
| 37 | +Debug::Filter* gPhysicsDemo = Debug::Filter::New(Debug::Concise, false, "LOG_PHYSICS_EXAMPLE"); | |
| 38 | +#endif | |
| 39 | + | |
| 40 | +const float MAX_ANIMATION_DURATION{60.0f}; | |
| 41 | +const uint32_t ANIMATION_TIME{30000}; | |
| 42 | +const uint32_t DEFAULT_BALL_COUNT{500}; | |
| 43 | + | |
| 44 | +#if defined(_ARCH_ARM_) | |
| 45 | +#define DEMO_ICON_DIR "/usr/share/icons" | |
| 46 | +#else | |
| 47 | +#define DEMO_ICON_DIR DEMO_IMAGE_DIR | |
| 48 | +#endif | |
| 49 | + | |
| 50 | +const std::string BALL_IMAGES[] = {DEMO_IMAGE_DIR "/blocks-ball.png", | |
| 51 | + DEMO_ICON_DIR "/dali-tests.png", | |
| 52 | + DEMO_ICON_DIR "/dali-examples.png", | |
| 53 | + DEMO_ICON_DIR "/com.samsung.dali-demo.png"}; | |
| 54 | + | |
| 55 | +const Vector2 BALL_SIZE{26.0f, 26.0f}; | |
| 56 | + | |
| 57 | +// Groups that can collide with each other: | |
| 58 | +const cpGroup BALL_GROUP{1 << 0}; | |
| 59 | +const cpGroup BOUNDS_GROUP{1 << 1}; | |
| 60 | + | |
| 61 | +const cpBitmask COLLISION_MASK{0xfF}; | |
| 62 | + | |
| 63 | +const cpBitmask BALL_COLLIDES_WITH{BALL_GROUP | BOUNDS_GROUP}; | |
| 64 | + | |
| 65 | +/** | |
| 66 | + * @brief The physics demo using Chipmunk2D APIs. | |
| 67 | + */ | |
| 68 | +class Physics2dBenchmarkController : public ConnectionTracker | |
| 69 | +{ | |
| 70 | +public: | |
| 71 | + Physics2dBenchmarkController(Application& app, int numberOfBalls) | |
| 72 | + : mApplication(app), | |
| 73 | + mBallNumber(numberOfBalls) | |
| 74 | + { | |
| 75 | + app.InitSignal().Connect(this, &Physics2dBenchmarkController::OnInit); | |
| 76 | + app.TerminateSignal().Connect(this, &Physics2dBenchmarkController::OnTerminate); | |
| 77 | + } | |
| 78 | + | |
| 79 | + ~Physics2dBenchmarkController() = default; | |
| 80 | + | |
| 81 | + void OnInit(Application& application) | |
| 82 | + { | |
| 83 | + mWindow = application.GetWindow(); | |
| 84 | + mWindow.ResizeSignal().Connect(this, &Physics2dBenchmarkController::OnWindowResize); | |
| 85 | + mWindow.KeyEventSignal().Connect(this, &Physics2dBenchmarkController::OnKeyEv); | |
| 86 | + mWindow.GetRootLayer().TouchedSignal().Connect(this, &Physics2dBenchmarkController::OnTouched); | |
| 87 | + mWindow.SetBackgroundColor(Color::DARK_SLATE_GRAY); | |
| 88 | + | |
| 89 | + CreateAnimationSimulation(); | |
| 90 | + | |
| 91 | + mTimer = Timer::New(ANIMATION_TIME); | |
| 92 | + mTimer.TickSignal().Connect(this, &Physics2dBenchmarkController::AnimationSimFinished); | |
| 93 | + mTimer.Start(); | |
| 94 | + } | |
| 95 | + | |
| 96 | + void CreateAnimationSimulation() | |
| 97 | + { | |
| 98 | + Window::WindowSize windowSize = mWindow.GetSize(); | |
| 99 | + mBallActors.resize(mBallNumber); | |
| 100 | + mBallVelocity.resize(mBallNumber); | |
| 101 | + | |
| 102 | + mAnimationSimRootActor = Layer::New(); | |
| 103 | + mAnimationSimRootActor.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS); | |
| 104 | + mAnimationSimRootActor[Actor::Property::PARENT_ORIGIN] = Dali::ParentOrigin::CENTER; | |
| 105 | + mAnimationSimRootActor[Actor::Property::ANCHOR_POINT] = Dali::AnchorPoint::CENTER; | |
| 106 | + | |
| 107 | + mWindow.Add(mAnimationSimRootActor); | |
| 108 | + std::ostringstream oss; | |
| 109 | + oss << "Animation simulation of " << mBallNumber << " balls"; | |
| 110 | + auto title = Toolkit::TextLabel::New(oss.str()); | |
| 111 | + mAnimationSimRootActor.Add(title); | |
| 112 | + title[Toolkit::TextLabel::Property::TEXT_COLOR] = Color::WHITE; | |
| 113 | + title[Actor::Property::PARENT_ORIGIN] = Dali::ParentOrigin::TOP_CENTER; | |
| 114 | + title[Actor::Property::ANCHOR_POINT] = Dali::AnchorPoint::TOP_CENTER; | |
| 115 | + title[Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT] = HorizontalAlignment::CENTER; | |
| 116 | + title.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS); | |
| 117 | + | |
| 118 | + const float margin(BALL_SIZE.width * 0.5f); | |
| 119 | + | |
| 120 | + for(int i = 0; i < mBallNumber; ++i) | |
| 121 | + { | |
| 122 | + Actor ball = mBallActors[i] = Toolkit::ImageView::New(BALL_IMAGES[rand() % 4]); | |
| 123 | + ball[Actor::Property::PARENT_ORIGIN] = Dali::ParentOrigin::CENTER; | |
| 124 | + ball[Actor::Property::ANCHOR_POINT] = Dali::AnchorPoint::CENTER; | |
| 125 | + | |
| 126 | + ball[Actor::Property::NAME] = "Ball"; | |
| 127 | + ball[Actor::Property::SIZE] = BALL_SIZE; // Halve the image size | |
| 128 | + int width = windowSize.GetWidth() / 2; | |
| 129 | + int height = windowSize.GetHeight() / 2; | |
| 130 | + ball[Actor::Property::POSITION] = Vector3(Random::Range(margin - width, width - margin), Random::Range(margin - height, height - margin), 0.0f); | |
| 131 | + ball.RegisterProperty("index", i); | |
| 132 | + mAnimationSimRootActor.Add(ball); | |
| 133 | + | |
| 134 | + mBallVelocity[i] = Vector3(Random::Range(-25.0f, 25.0f), Random::Range(-25.0f, 25.0f), 0.0f); | |
| 135 | + mBallVelocity[i].Normalize(); | |
| 136 | + mBallVelocity[i] = mBallVelocity[i] * Random::Range(15.0f, 50.0f); | |
| 137 | + | |
| 138 | + PropertyNotification leftNotify = mBallActors[i].AddPropertyNotification(Actor::Property::POSITION_X, LessThanCondition(margin - width)); | |
| 139 | + leftNotify.NotifySignal().Connect(this, &Physics2dBenchmarkController::OnHitLeftWall); | |
| 140 | + | |
| 141 | + PropertyNotification rightNotify = mBallActors[i].AddPropertyNotification(Actor::Property::POSITION_X, GreaterThanCondition(width - margin)); | |
| 142 | + rightNotify.NotifySignal().Connect(this, &Physics2dBenchmarkController::OnHitRightWall); | |
| 143 | + | |
| 144 | + PropertyNotification topNotify = mBallActors[i].AddPropertyNotification(Actor::Property::POSITION_Y, LessThanCondition(margin - height)); | |
| 145 | + topNotify.NotifySignal().Connect(this, &Physics2dBenchmarkController::OnHitTopWall); | |
| 146 | + | |
| 147 | + PropertyNotification bottomNotify = mBallActors[i].AddPropertyNotification(Actor::Property::POSITION_Y, GreaterThanCondition(height - margin)); | |
| 148 | + bottomNotify.NotifySignal().Connect(this, &Physics2dBenchmarkController::OnHitBottomWall); | |
| 149 | + } | |
| 150 | + | |
| 151 | + title.RaiseToTop(); | |
| 152 | + ContinueAnimation(); | |
| 153 | + } | |
| 154 | + | |
| 155 | + bool AnimationSimFinished() | |
| 156 | + { | |
| 157 | + static bool first = true; | |
| 158 | + if(first) | |
| 159 | + { | |
| 160 | + UnparentAndReset(mAnimationSimRootActor); | |
| 161 | + mBallAnimation.Stop(); | |
| 162 | + mBallAnimation.Clear(); | |
| 163 | + first = false; | |
| 164 | + | |
| 165 | + CreatePhysicsSimulation(); | |
| 166 | + return true; | |
| 167 | + } | |
| 168 | + | |
| 169 | + mApplication.Quit(); | |
| 170 | + return false; | |
| 171 | + } | |
| 172 | + | |
| 173 | + void ContinueAnimation() | |
| 174 | + { | |
| 175 | + if(mBallAnimation) | |
| 176 | + { | |
| 177 | + mBallAnimation.Clear(); | |
| 178 | + } | |
| 179 | + mBallAnimation = Animation::New(MAX_ANIMATION_DURATION); | |
| 180 | + for(int i = 0; i < mBallNumber; ++i) | |
| 181 | + { | |
| 182 | + mBallAnimation.AnimateBy(Property(mBallActors[i], Actor::Property::POSITION), mBallVelocity[i] * MAX_ANIMATION_DURATION); | |
| 183 | + } | |
| 184 | + mBallAnimation.Play(); | |
| 185 | + } | |
| 186 | + | |
| 187 | + void OnHitLeftWall(PropertyNotification& source) | |
| 188 | + { | |
| 189 | + auto actor = Actor::DownCast(source.GetTarget()); | |
| 190 | + if(actor) | |
| 191 | + { | |
| 192 | + int index = actor["index"]; | |
| 193 | + mBallVelocity[index].x = fabsf(mBallVelocity[index].x); | |
| 194 | + ContinueAnimation(); | |
| 195 | + } | |
| 196 | + } | |
| 197 | + | |
| 198 | + void OnHitRightWall(PropertyNotification& source) | |
| 199 | + { | |
| 200 | + auto actor = Actor::DownCast(source.GetTarget()); | |
| 201 | + if(actor) | |
| 202 | + { | |
| 203 | + int index = actor["index"]; | |
| 204 | + mBallVelocity[index].x = -fabsf(mBallVelocity[index].x); | |
| 205 | + ContinueAnimation(); | |
| 206 | + } | |
| 207 | + } | |
| 208 | + | |
| 209 | + void OnHitBottomWall(PropertyNotification& source) | |
| 210 | + { | |
| 211 | + auto actor = Actor::DownCast(source.GetTarget()); | |
| 212 | + if(actor) | |
| 213 | + { | |
| 214 | + int index = actor["index"]; | |
| 215 | + mBallVelocity[index].y = -fabsf(mBallVelocity[index].y); | |
| 216 | + ContinueAnimation(); | |
| 217 | + } | |
| 218 | + } | |
| 219 | + | |
| 220 | + void OnHitTopWall(PropertyNotification& source) | |
| 221 | + { | |
| 222 | + auto actor = Actor::DownCast(source.GetTarget()); | |
| 223 | + if(actor) | |
| 224 | + { | |
| 225 | + int index = actor["index"]; | |
| 226 | + mBallVelocity[index].y = fabsf(mBallVelocity[index].y); | |
| 227 | + ContinueAnimation(); | |
| 228 | + } | |
| 229 | + } | |
| 230 | + | |
| 231 | + void CreatePhysicsSimulation() | |
| 232 | + { | |
| 233 | + Window::WindowSize windowSize = mWindow.GetSize(); | |
| 234 | + | |
| 235 | + // Map Physics space (origin bottom left, +ve Y up) | |
| 236 | + // to DALi space (origin center, +ve Y down) | |
| 237 | + mPhysicsTransform.SetIdentityAndScale(Vector3(1.0f, -1.0f, 1.0f)); | |
| 238 | + mPhysicsTransform.SetTranslation(Vector3(windowSize.GetWidth() * 0.5f, | |
| 239 | + windowSize.GetHeight() * 0.5f, | |
| 240 | + 0.0f)); | |
| 241 | + | |
| 242 | + mPhysicsAdaptor = PhysicsAdaptor::New(mPhysicsTransform, windowSize); | |
| 243 | + mPhysicsRoot = mPhysicsAdaptor.GetRootActor(); | |
| 244 | + mWindow.Add(mPhysicsRoot); | |
| 245 | + | |
| 246 | + auto scopedAccessor = mPhysicsAdaptor.GetPhysicsAccessor(); | |
| 247 | + cpSpace* space = scopedAccessor->GetNative().Get<cpSpace*>(); | |
| 248 | + cpSpaceSetGravity(space, cpv(0, 0)); | |
| 249 | + | |
| 250 | + CreateBounds(space, windowSize); | |
| 251 | + | |
| 252 | + for(int i = 0; i < mBallNumber; ++i) | |
| 253 | + { | |
| 254 | + mBalls.push_back(CreateBall(space)); | |
| 255 | + } | |
| 256 | + | |
| 257 | + // Process any async queued methods next frame | |
| 258 | + mPhysicsAdaptor.CreateSyncPoint(); | |
| 259 | + | |
| 260 | + std::ostringstream oss; | |
| 261 | + oss << "Physics simulation of " << mBallNumber << " balls"; | |
| 262 | + auto title = Toolkit::TextLabel::New(oss.str()); | |
| 263 | + mPhysicsRoot.Add(title); | |
| 264 | + title[Toolkit::TextLabel::Property::TEXT_COLOR] = Color::WHITE; | |
| 265 | + title[Actor::Property::PARENT_ORIGIN] = Dali::ParentOrigin::TOP_CENTER; | |
| 266 | + title[Actor::Property::ANCHOR_POINT] = Dali::AnchorPoint::TOP_CENTER; | |
| 267 | + title[Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT] = HorizontalAlignment::CENTER; | |
| 268 | + title.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS); | |
| 269 | + title.RaiseToTop(); | |
| 270 | + } | |
| 271 | + | |
| 272 | + PhysicsActor CreateBall(cpSpace* space) | |
| 273 | + { | |
| 274 | + const float BALL_MASS = 10.0f; | |
| 275 | + const float BALL_RADIUS = BALL_SIZE.x * 0.25f; | |
| 276 | + const float BALL_ELASTICITY = 1.0f; | |
| 277 | + const float BALL_FRICTION = 0.0f; | |
| 278 | + | |
| 279 | + auto ball = Toolkit::ImageView::New(BALL_IMAGES[rand() % 4]); | |
| 280 | + ball[Actor::Property::NAME] = "Ball"; | |
| 281 | + ball[Actor::Property::SIZE] = BALL_SIZE * 0.5f; | |
| 282 | + cpBody* body = cpSpaceAddBody(space, cpBodyNew(BALL_MASS, cpMomentForCircle(BALL_MASS, 0.0f, BALL_RADIUS, cpvzero))); | |
| 283 | + | |
| 284 | + cpShape* shape = cpSpaceAddShape(space, cpCircleShapeNew(body, BALL_RADIUS, cpvzero)); | |
| 285 | + cpShapeSetElasticity(shape, BALL_ELASTICITY); | |
| 286 | + cpShapeSetFriction(shape, BALL_FRICTION); | |
| 287 | + | |
| 288 | + PhysicsActor physicsBall = mPhysicsAdaptor.AddActorBody(ball, body); | |
| 289 | + | |
| 290 | + Window::WindowSize windowSize = mWindow.GetSize(); | |
| 291 | + | |
| 292 | + const float fw = 0.5f * (windowSize.GetWidth() - BALL_RADIUS); | |
| 293 | + const float fh = 0.5f * (windowSize.GetHeight() - BALL_RADIUS); | |
| 294 | + | |
| 295 | + // Example of setting physics property on update thread | |
| 296 | + physicsBall.AsyncSetPhysicsPosition(Vector3(Random::Range(-fw, fw), Random::Range(-fh, -fh * 0.5), 0.0f)); | |
| 297 | + | |
| 298 | + // Example of queuing a chipmunk method to run on the update thread | |
| 299 | + mPhysicsAdaptor.Queue([body]() { | |
| 300 | + cpBodySetVelocity(body, cpv(Random::Range(-100.0, 100.0), Random::Range(-100.0, 100.0))); | |
| 301 | + }); | |
| 302 | + return physicsBall; | |
| 303 | + } | |
| 304 | + | |
| 305 | + void CreateBounds(cpSpace* space, Window::WindowSize size) | |
| 306 | + { | |
| 307 | + // We're working in physics space here - coords are: origin: bottom left, +ve Y: up | |
| 308 | + int32_t xBound = static_cast<int32_t>(static_cast<uint32_t>(size.GetWidth())); | |
| 309 | + int32_t yBound = static_cast<int32_t>(static_cast<uint32_t>(size.GetHeight())); | |
| 310 | + | |
| 311 | + cpBody* staticBody = cpSpaceGetStaticBody(space); | |
| 312 | + | |
| 313 | + if(mLeftBound) | |
| 314 | + { | |
| 315 | + cpSpaceRemoveShape(space, mLeftBound); | |
| 316 | + cpSpaceRemoveShape(space, mRightBound); | |
| 317 | + cpSpaceRemoveShape(space, mTopBound); | |
| 318 | + cpSpaceRemoveShape(space, mBottomBound); | |
| 319 | + cpShapeFree(mLeftBound); | |
| 320 | + cpShapeFree(mRightBound); | |
| 321 | + cpShapeFree(mTopBound); | |
| 322 | + cpShapeFree(mBottomBound); | |
| 323 | + } | |
| 324 | + mLeftBound = AddBound(space, staticBody, cpv(0, 0), cpv(0, yBound)); | |
| 325 | + mRightBound = AddBound(space, staticBody, cpv(xBound, 0), cpv(xBound, yBound)); | |
| 326 | + mTopBound = AddBound(space, staticBody, cpv(0, 0), cpv(xBound, 0)); | |
| 327 | + mBottomBound = AddBound(space, staticBody, cpv(0, yBound), cpv(xBound, yBound)); | |
| 328 | + } | |
| 329 | + | |
| 330 | + cpShape* AddBound(cpSpace* space, cpBody* staticBody, cpVect start, cpVect end) | |
| 331 | + { | |
| 332 | + cpShape* shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, start, end, 0.0f)); | |
| 333 | + cpShapeSetElasticity(shape, 1.0f); | |
| 334 | + cpShapeSetFriction(shape, 1.0f); | |
| 335 | + | |
| 336 | + cpShapeSetFilter(shape, cpShapeFilterNew(BOUNDS_GROUP, COLLISION_MASK, COLLISION_MASK)); | |
| 337 | + return shape; | |
| 338 | + } | |
| 339 | + | |
| 340 | + void OnTerminate(Application& application) | |
| 341 | + { | |
| 342 | + UnparentAndReset(mPhysicsRoot); | |
| 343 | + } | |
| 344 | + | |
| 345 | + void OnWindowResize(Window window, Window::WindowSize newSize) | |
| 346 | + { | |
| 347 | + auto scopedAccessor = mPhysicsAdaptor.GetPhysicsAccessor(); | |
| 348 | + cpSpace* space = scopedAccessor->GetNative().Get<cpSpace*>(); | |
| 349 | + | |
| 350 | + CreateBounds(space, newSize); | |
| 351 | + } | |
| 352 | + | |
| 353 | + bool OnTouched(Dali::Actor actor, const Dali::TouchEvent& touch) | |
| 354 | + { | |
| 355 | + mApplication.Quit(); | |
| 356 | + return false; | |
| 357 | + } | |
| 358 | + | |
| 359 | + void OnKeyEv(const Dali::KeyEvent& event) | |
| 360 | + { | |
| 361 | + if(event.GetState() == KeyEvent::DOWN) | |
| 362 | + { | |
| 363 | + if(IsKey(event, Dali::DALI_KEY_ESCAPE) || IsKey(event, Dali::DALI_KEY_BACK)) | |
| 364 | + { | |
| 365 | + mApplication.Quit(); | |
| 366 | + } | |
| 367 | + } | |
| 368 | + } | |
| 369 | + | |
| 370 | +private: | |
| 371 | + Application& mApplication; | |
| 372 | + Window mWindow; | |
| 373 | + | |
| 374 | + PhysicsAdaptor mPhysicsAdaptor; | |
| 375 | + std::vector<PhysicsActor> mBalls; | |
| 376 | + Matrix mPhysicsTransform; | |
| 377 | + Actor mPhysicsRoot; | |
| 378 | + Layer mPhysicsDebugLayer; | |
| 379 | + Layer mAnimationSimRootActor; | |
| 380 | + cpShape* mLeftBound{nullptr}; | |
| 381 | + cpShape* mRightBound{nullptr}; | |
| 382 | + cpShape* mTopBound{nullptr}; | |
| 383 | + cpShape* mBottomBound{nullptr}; | |
| 384 | + | |
| 385 | + std::vector<Actor> mBallActors; | |
| 386 | + std::vector<Vector3> mBallVelocity; | |
| 387 | + int mBallNumber; | |
| 388 | + Animation mBallAnimation; | |
| 389 | + Timer mTimer; | |
| 390 | +}; | |
| 391 | + | |
| 392 | +int DALI_EXPORT_API main(int argc, char** argv) | |
| 393 | +{ | |
| 394 | + setenv("DALI_FPS_TRACKING", "5", 1); | |
| 395 | + Application application = Application::New(&argc, &argv); | |
| 396 | + | |
| 397 | + int numberOfBalls = DEFAULT_BALL_COUNT; | |
| 398 | + if(argc > 1) | |
| 399 | + { | |
| 400 | + numberOfBalls = atoi(argv[1]); | |
| 401 | + } | |
| 402 | + | |
| 403 | + Physics2dBenchmarkController controller(application, numberOfBalls); | |
| 404 | + application.MainLoop(); | |
| 405 | + return 0; | |
| 406 | +} | ... | ... |
examples/benchmark-2dphysics/dependencies.cmake
0 โ 100644
| 1 | +TARGET_COMPILE_OPTIONS(${EXAMPLE}.example PUBLIC ${DALI_PHYSICS_2D_CFLAGS}) | |
| 2 | +TARGET_LINK_LIBRARIES(${EXAMPLE}.example ${DALI_PHYSICS_2D_LDFLAGS}) | |
| 3 | +MESSAGE(STATUS "Included dependencies for ${EXAMPLE}") | |
| 4 | +MESSAGE(STATUS " Compile options: ${DALI_PHYSICS_2D_CFLAGS}") | |
| 5 | +MESSAGE(STATUS " Link options: ${DALI_PHYSICS_2D_LDFLAGS}") | ... | ... |
resources/po/en_GB.po
| ... | ... | @@ -16,6 +16,9 @@ msgstr "Basic Light" |
| 16 | 16 | msgid "DALI_DEMO_STR_TITLE_BENCHMARK" |
| 17 | 17 | msgstr "ImageView Benchmark" |
| 18 | 18 | |
| 19 | +msgid "DALI_DEMO_STR_TITLE_BENCHMARK_2D_PHYSICS" | |
| 20 | +msgstr "2D Physics Benchmark" | |
| 21 | + | |
| 19 | 22 | msgid "DALI_DEMO_STR_TITLE_BEZIER_CURVE" |
| 20 | 23 | msgstr "Bezier Curve" |
| 21 | 24 | ... | ... |
resources/po/en_US.po
| ... | ... | @@ -16,6 +16,9 @@ msgstr "Basic Light" |
| 16 | 16 | msgid "DALI_DEMO_STR_TITLE_BENCHMARK" |
| 17 | 17 | msgstr "ImageView Benchmark" |
| 18 | 18 | |
| 19 | +msgid "DALI_DEMO_STR_TITLE_BENCHMARK_2D_PHYSICS" | |
| 20 | +msgstr "2D Physics Benchmark" | |
| 21 | + | |
| 19 | 22 | msgid "DALI_DEMO_STR_TITLE_BEZIER_CURVE" |
| 20 | 23 | msgstr "Bezier Curve" |
| 21 | 24 | ... | ... |
shared/dali-demo-strings.h
| ... | ... | @@ -41,6 +41,7 @@ extern "C" |
| 41 | 41 | #define DALI_DEMO_STR_TITLE_ARC_VISUAL dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_ARC_VISUAL") |
| 42 | 42 | #define DALI_DEMO_STR_TITLE_BASIC_LIGHT dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_BASIC_LIGHT") |
| 43 | 43 | #define DALI_DEMO_STR_TITLE_BENCHMARK dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_BENCHMARK") |
| 44 | +#define DALI_DEMO_STR_TITLE_BENCHMARK_2D_PHYSICS dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_BENCHMARK_2D_PHYSICS") | |
| 44 | 45 | #define DALI_DEMO_STR_TITLE_BEZIER_CURVE dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_BEZIER_CURVE") |
| 45 | 46 | #define DALI_DEMO_STR_TITLE_BLOCKS dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_BLOCKS") |
| 46 | 47 | #define DALI_DEMO_STR_TITLE_BLOOM_VIEW dgettext(DALI_DEMO_DOMAIN_LOCAL, "DALI_DEMO_STR_TITLE_BLOOM_VIEW") |
| ... | ... | @@ -163,6 +164,7 @@ extern "C" |
| 163 | 164 | #define DALI_DEMO_STR_TITLE_ARC_VISUAL "Arc Visual" |
| 164 | 165 | #define DALI_DEMO_STR_TITLE_BASIC_LIGHT "Basic Light" |
| 165 | 166 | #define DALI_DEMO_STR_TITLE_BENCHMARK "ImageView Benchmark" |
| 167 | +#define DALI_DEMO_STR_TITLE_BENCHMARK_2D_PHYSICS "2D Physics Benchmark" | |
| 166 | 168 | #define DALI_DEMO_STR_TITLE_BEZIER_CURVE "Alpha Function Bezier Curve" |
| 167 | 169 | #define DALI_DEMO_STR_TITLE_BLOCKS "Blocks" |
| 168 | 170 | #define DALI_DEMO_STR_TITLE_BLOOM_VIEW "Bloom" | ... | ... |
tests-reel/dali-tests-reel.cpp
| ... | ... | @@ -38,6 +38,7 @@ int DALI_EXPORT_API main(int argc, char** argv) |
| 38 | 38 | DaliTableView demo(app); |
| 39 | 39 | |
| 40 | 40 | demo.AddExample(Example("benchmark.example", DALI_DEMO_STR_TITLE_BENCHMARK)); |
| 41 | + demo.AddExample(Example("benchmark-2dphysics.example", DALI_DEMO_STR_TITLE_BENCHMARK_2D_PHYSICS)); | |
| 41 | 42 | demo.AddExample(Example("camera-test.example", DALI_DEMO_STR_TITLE_CAMERA_TEST)); |
| 42 | 43 | demo.AddExample(Example("compressed-texture-formats.example", DALI_DEMO_STR_TITLE_COMPRESSED_TEXTURE_FORMATS)); |
| 43 | 44 | demo.AddExample(Example("homescreen-benchmark.example", DALI_DEMO_STR_TITLE_HOMESCREEN)); | ... | ... |