Commit 9974fa3d4b3fce0494bdba524a0660a73e6ec323
1 parent
2aa32342
Test application to check context loss
This application sets up a number of images, meshes, models and text actors with a variety of effects, and can be used to visually check that they are all still running after context loss and regain. Change-Id: I3e07be5442a249a8f09e5f1919e46552413c6824 Signed-off-by: David Steele <david.steele@partner.samsung.com>
Showing
3 changed files
with
530 additions
and
0 deletions
build/tizen/examples/Makefile.am
| ... | ... | @@ -26,6 +26,7 @@ bin_PROGRAMS = \ |
| 26 | 26 | magnifier.example \ |
| 27 | 27 | motion-blur.example \ |
| 28 | 28 | motion-stretch.example \ |
| 29 | + new-window.example \ | |
| 29 | 30 | page-turn-view.example \ |
| 30 | 31 | radial-menu.example \ |
| 31 | 32 | scroll-view.example \ |
| ... | ... | @@ -112,6 +113,11 @@ motion_stretch_example_CXXFLAGS = $(EXAMPLE_CXXFLAGS) |
| 112 | 113 | motion_stretch_example_DEPENDENCIES = $(EXAMPLE_DEPS) |
| 113 | 114 | motion_stretch_example_LDADD = $(EXAMPLE_LDADD) |
| 114 | 115 | |
| 116 | +new_window_example_SOURCES = $(examples_src_dir)/new-window/new-window-example.cpp | |
| 117 | +new_window_example_CXXFLAGS = $(EXAMPLE_CXXFLAGS) | |
| 118 | +new_window_example_DEPENDENCIES = $(EXAMPLE_DEPS) | |
| 119 | +new_window_example_LDADD = $(EXAMPLE_LDADD) | |
| 120 | + | |
| 115 | 121 | page_turn_view_example_SOURCES = $(examples_src_dir)/page-turn-view/page-turn-view-example.cpp |
| 116 | 122 | page_turn_view_example_CXXFLAGS = $(EXAMPLE_CXXFLAGS) |
| 117 | 123 | page_turn_view_example_DEPENDENCIES = $(EXAMPLE_DEPS) | ... | ... |
com.samsung.dali-demo.xml
| ... | ... | @@ -13,6 +13,9 @@ |
| 13 | 13 | <ui-application appid="hello-world.example" exec="/usr/apps/com.samsung.dali-demo/bin/hello-world.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true"> |
| 14 | 14 | <label>Hello World</label> |
| 15 | 15 | </ui-application> |
| 16 | + <ui-application appid="new-window.example" exec="/usr/apps/com.samsung.dali-demo/bin/new-window.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true"> | |
| 17 | + <label>New Window</label> | |
| 18 | + </ui-application> | |
| 16 | 19 | <ui-application appid="page-turn-view.example" exec="/usr/apps/com.samsung.dali-demo/bin/page-turn-view.example" nodisplay="true" multiple="false" type="c++app" taskmanage="true"> |
| 17 | 20 | <label>PageTurnView Example</label> |
| 18 | 21 | </ui-application> | ... | ... |
examples/new-window/new-window-example.cpp
0 → 100644
| 1 | +/* | |
| 2 | + * Copyright (c) 2014 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-toolkit/dali-toolkit.h> | |
| 18 | +#include "../shared/view.h" | |
| 19 | + | |
| 20 | +using namespace Dali; | |
| 21 | +using namespace Dali::Toolkit; | |
| 22 | + | |
| 23 | +class NewWindowController; | |
| 24 | + | |
| 25 | +namespace | |
| 26 | +{ | |
| 27 | +const char * gModelFile = DALI_MODEL_DIR "AlbumCute.dae"; | |
| 28 | +const char * const BACKGROUND_IMAGE( DALI_IMAGE_DIR "background-2.jpg" ); | |
| 29 | +const char * const TOOLBAR_IMAGE( DALI_IMAGE_DIR "top-bar.png" ); | |
| 30 | +const char * const LOSE_CONTEXT_IMAGE( DALI_IMAGE_DIR "icon-cluster-wobble.png" ); | |
| 31 | +const char * const BASE_IMAGE( DALI_IMAGE_DIR "gallery-large-14.jpg" ); | |
| 32 | +const char * const EFFECT_IMAGE( DALI_IMAGE_DIR "gallery-large-18.jpg" ); | |
| 33 | + | |
| 34 | +const float EXPLOSION_DURATION(1.2f); | |
| 35 | +const unsigned int EMIT_INTERVAL_IN_MS(80); | |
| 36 | +const float TRACK_DURATION_IN_MS(970); | |
| 37 | + | |
| 38 | +Application gApplication; | |
| 39 | +NewWindowController* gNewWindowController(NULL); | |
| 40 | + | |
| 41 | +const char*const FRAG_SHADER= | |
| 42 | + "uniform float alpha;\n" | |
| 43 | + "\n" | |
| 44 | + "void main()\n" | |
| 45 | + "{\n" | |
| 46 | + " vec4 fragColor = texture2D(sTexture, vTexCoord);\n" | |
| 47 | + " vec4 fxColor = texture2D(sEffect, vTexCoord);\n" | |
| 48 | + " gl_FragColor = mix(fragColor,fxColor, alpha);\n" | |
| 49 | + "}\n"; | |
| 50 | + | |
| 51 | +}; // anonymous namespace | |
| 52 | + | |
| 53 | + | |
| 54 | +class NewWindowController : public ConnectionTracker | |
| 55 | +{ | |
| 56 | +public: | |
| 57 | + NewWindowController( Application& app ); | |
| 58 | + void Create( Application& app ); | |
| 59 | + void Destroy( Application& app ); | |
| 60 | + void OnKeyEvent(const KeyEvent& event); | |
| 61 | + bool OnLoseContextButtonClicked( Toolkit::Button button ); | |
| 62 | + static void NewWindow(void); | |
| 63 | + | |
| 64 | + void OnContextLost(); | |
| 65 | + void OnContextRegained(); | |
| 66 | + void CreateMeshActor(); | |
| 67 | + Mesh CreateMesh(bool, Material); | |
| 68 | + void CreateBubbles(Vector2 stageSize); | |
| 69 | + void CreateBlending(); | |
| 70 | + void CreateText(); | |
| 71 | + void CreateModel(); | |
| 72 | + void OnModelLoaded(Model model); | |
| 73 | + bool OnTrackTimerTick(); | |
| 74 | + bool OnExplodeTimerTick(); | |
| 75 | + void SetUpAnimation( Vector2 emitPosition, Vector2 direction ); | |
| 76 | + FrameBufferImage CreateMirrorImage(const char* imageName); | |
| 77 | + ImageActor CreateBlurredMirrorImage(const char* imageName); | |
| 78 | + FrameBufferImage CreateFrameBufferForImage(const char* imageName, Image image, ShaderEffect shaderEffect); | |
| 79 | + | |
| 80 | + | |
| 81 | +private: | |
| 82 | + Application mApplication; | |
| 83 | + Animation mModelAnimation; | |
| 84 | + Actor mModelActor; | |
| 85 | + Actor mCastingLight; | |
| 86 | + TextActor mTextActor; | |
| 87 | + ImageActor mImageActor; | |
| 88 | + ImageActor mBlendActor; | |
| 89 | + Image mEffectImage; | |
| 90 | + Image mBaseImage; | |
| 91 | + LightActor mKeyLightActor; | |
| 92 | + MeshActor mMeshActor; | |
| 93 | + MeshActor mAnimatedMeshActor; | |
| 94 | + Model mModel; | |
| 95 | + | |
| 96 | + Toolkit::View mView; ///< The View instance. | |
| 97 | + Toolkit::ToolBar mToolBar; ///< The View's Toolbar. | |
| 98 | + TextView mTitleActor; ///< The Toolbar's Title. | |
| 99 | + Layer mContentLayer; ///< Content layer (scrolling cluster content) | |
| 100 | + Toolkit::PushButton mLoseContextButton; | |
| 101 | + Vector3 mHSVDelta; | |
| 102 | + Toolkit::BubbleEmitter mEmitter; | |
| 103 | + | |
| 104 | + Timer mEmitTrackTimer; | |
| 105 | + Timer mExplodeTimer; | |
| 106 | + bool mNeedNewAnimation; | |
| 107 | + | |
| 108 | + unsigned int mAnimateComponentCount; | |
| 109 | + Animation mEmitAnimation; | |
| 110 | +}; | |
| 111 | + | |
| 112 | + | |
| 113 | +NewWindowController::NewWindowController( Application& application ) | |
| 114 | +: mApplication(application), | |
| 115 | + mHSVDelta(0.5f, 0.0f, 0.5f), | |
| 116 | + mNeedNewAnimation(true) | |
| 117 | +{ | |
| 118 | + mApplication.InitSignal().Connect(this, &NewWindowController::Create); | |
| 119 | + mApplication.TerminateSignal().Connect(this, &NewWindowController::Destroy); | |
| 120 | +} | |
| 121 | + | |
| 122 | +void NewWindowController::Create( Application& app ) | |
| 123 | +{ | |
| 124 | + Stage stage = Stage::GetCurrent(); | |
| 125 | + stage.SetBackgroundColor(Color::YELLOW); | |
| 126 | + | |
| 127 | + stage.KeyEventSignal().Connect(this, &NewWindowController::OnKeyEvent); | |
| 128 | + | |
| 129 | + // The Init signal is received once (only) during the Application lifetime | |
| 130 | + | |
| 131 | + // Hide the indicator bar | |
| 132 | + mApplication.GetWindow().ShowIndicator( Dali::Window::INVISIBLE ); | |
| 133 | + | |
| 134 | + mContentLayer = DemoHelper::CreateView( app, | |
| 135 | + mView, | |
| 136 | + mToolBar, | |
| 137 | + BACKGROUND_IMAGE, | |
| 138 | + TOOLBAR_IMAGE, | |
| 139 | + "Context recovery" ); | |
| 140 | + | |
| 141 | + // Point the default render task at the view | |
| 142 | + RenderTaskList taskList = stage.GetRenderTaskList(); | |
| 143 | + RenderTask defaultTask = taskList.GetTask( 0u ); | |
| 144 | + if ( defaultTask ) | |
| 145 | + { | |
| 146 | + defaultTask.SetSourceActor( mView ); | |
| 147 | + } | |
| 148 | + | |
| 149 | + mLoseContextButton = Toolkit::PushButton::New(); | |
| 150 | + mLoseContextButton.SetBackgroundImage( Image::New( LOSE_CONTEXT_IMAGE ) ); | |
| 151 | + mLoseContextButton.ClickedSignal().Connect( this, &NewWindowController::OnLoseContextButtonClicked ); | |
| 152 | + mToolBar.AddControl( mLoseContextButton, DemoHelper::DEFAULT_VIEW_STYLE.mToolBarButtonPercentage, Toolkit::Alignment::HorizontalRight, DemoHelper::DEFAULT_MODE_SWITCH_PADDING ); | |
| 153 | + | |
| 154 | + | |
| 155 | + Actor logoLayoutActor = Actor::New(); | |
| 156 | + logoLayoutActor.SetParentOrigin(ParentOrigin::CENTER); | |
| 157 | + logoLayoutActor.SetPosition(0.0f, -200.0f, 0.0f); | |
| 158 | + logoLayoutActor.SetScale(0.5f); | |
| 159 | + mContentLayer.Add(logoLayoutActor); | |
| 160 | + | |
| 161 | + Image image = Image::New(DALI_IMAGE_DIR "dali-logo.png"); | |
| 162 | + mImageActor = ImageActor::New(image); | |
| 163 | + mImageActor.SetName("dali-logo"); | |
| 164 | + mImageActor.SetParentOrigin(ParentOrigin::CENTER); | |
| 165 | + mImageActor.SetAnchorPoint(AnchorPoint::BOTTOM_CENTER); | |
| 166 | + logoLayoutActor.Add(mImageActor); | |
| 167 | + | |
| 168 | + ImageActor mirrorImageActor = CreateBlurredMirrorImage(DALI_IMAGE_DIR "dali-logo.png"); | |
| 169 | + mirrorImageActor.SetParentOrigin(ParentOrigin::CENTER); | |
| 170 | + mirrorImageActor.SetAnchorPoint(AnchorPoint::TOP_CENTER); | |
| 171 | + logoLayoutActor.Add(mirrorImageActor); | |
| 172 | + | |
| 173 | + CreateBubbles(stage.GetSize()); | |
| 174 | + CreateMeshActor(); | |
| 175 | + CreateBlending(); | |
| 176 | + CreateText(); | |
| 177 | + CreateModel(); | |
| 178 | + | |
| 179 | + stage.ContextLostSignal().Connect(this, &NewWindowController::OnContextLost); | |
| 180 | + stage.ContextRegainedSignal().Connect(this, &NewWindowController::OnContextRegained); | |
| 181 | +} | |
| 182 | + | |
| 183 | +void NewWindowController::Destroy( Application& app ) | |
| 184 | +{ | |
| 185 | + UnparentAndReset(mTextActor); | |
| 186 | +} | |
| 187 | + | |
| 188 | +bool NewWindowController::OnLoseContextButtonClicked( Toolkit::Button button ) | |
| 189 | +{ | |
| 190 | + // Add as an idle callback to avoid ProcessEvents being recursively called. | |
| 191 | + mApplication.AddIdle(NewWindowController::NewWindow); | |
| 192 | + return true; | |
| 193 | +} | |
| 194 | + | |
| 195 | +void NewWindowController::CreateMeshActor() | |
| 196 | +{ | |
| 197 | + mEffectImage = Image::New(EFFECT_IMAGE); | |
| 198 | + | |
| 199 | + Material baseMaterial = Material::New( "Material1" ); | |
| 200 | + Dali::MeshActor meshActor = MeshActor::New( CreateMesh(true, baseMaterial) ); | |
| 201 | + meshActor.SetScale( 100.0f ); | |
| 202 | + meshActor.SetParentOrigin( ParentOrigin::CENTER ); | |
| 203 | + meshActor.SetPosition(Vector3( -150.0f, 200.0f, 0.0f )); | |
| 204 | + meshActor.SetAffectedByLighting( false ); | |
| 205 | + meshActor.SetName("MeshActor"); | |
| 206 | + mContentLayer.Add( meshActor ); | |
| 207 | + | |
| 208 | + Material orchidMaterial = Material::New( "Material2" ); | |
| 209 | + orchidMaterial.SetDiffuseTexture(mEffectImage); | |
| 210 | + | |
| 211 | + Dali::MeshActor meshActor2 = MeshActor::New( CreateMesh(false, orchidMaterial) ); | |
| 212 | + meshActor2.SetScale( 100.0f ); | |
| 213 | + meshActor2.SetParentOrigin( ParentOrigin::CENTER ); | |
| 214 | + meshActor2.SetPosition(Vector3( -150.0f, 310.0f, 0.0f )); | |
| 215 | + meshActor2.SetAffectedByLighting( false ); | |
| 216 | + meshActor2.SetName("MeshActor"); | |
| 217 | + mContentLayer.Add( meshActor2 ); | |
| 218 | +} | |
| 219 | + | |
| 220 | +FrameBufferImage NewWindowController::CreateMirrorImage(const char* imageName) | |
| 221 | +{ | |
| 222 | + FrameBufferImage fbo; | |
| 223 | + Image image = Image::New(imageName); | |
| 224 | + fbo = CreateFrameBufferForImage(imageName, image, ShaderEffect()); | |
| 225 | + return fbo; | |
| 226 | +} | |
| 227 | + | |
| 228 | +ImageActor NewWindowController::CreateBlurredMirrorImage(const char* imageName) | |
| 229 | +{ | |
| 230 | + FrameBufferImage fbo; | |
| 231 | + Image image = Image::New( imageName ); | |
| 232 | + Vector2 FBOSize = Image::GetImageSize(imageName); | |
| 233 | + fbo = FrameBufferImage::New( FBOSize.width, FBOSize.height, Pixel::RGBA8888); | |
| 234 | + GaussianBlurView gbv = GaussianBlurView::New(5, 2.0f, Pixel::RGBA8888, 0.5f, 0.5f, true); | |
| 235 | + gbv.SetBackgroundColor(Color::TRANSPARENT); | |
| 236 | + gbv.SetUserImageAndOutputRenderTarget( image, fbo ); | |
| 237 | + gbv.SetSize(FBOSize); | |
| 238 | + Stage::GetCurrent().Add(gbv); | |
| 239 | + gbv.ActivateOnce(); | |
| 240 | + | |
| 241 | + ImageActor blurredActor = ImageActor::New(fbo); | |
| 242 | + blurredActor.SetSize(FBOSize); | |
| 243 | + blurredActor.SetScale(1.0f, -1.0f, 1.0f); | |
| 244 | + return blurredActor; | |
| 245 | +} | |
| 246 | + | |
| 247 | +FrameBufferImage NewWindowController::CreateFrameBufferForImage(const char* imageName, Image image, ShaderEffect shaderEffect) | |
| 248 | +{ | |
| 249 | + Stage stage = Stage::GetCurrent(); | |
| 250 | + Vector2 FBOSize = Image::GetImageSize(imageName); | |
| 251 | + | |
| 252 | + FrameBufferImage framebuffer = FrameBufferImage::New(FBOSize.x, FBOSize.y ); | |
| 253 | + | |
| 254 | + RenderTask renderTask = stage.GetRenderTaskList().CreateTask(); | |
| 255 | + | |
| 256 | + ImageActor imageActor = ImageActor::New(image); | |
| 257 | + imageActor.SetName("Source image actor"); | |
| 258 | + if(shaderEffect) | |
| 259 | + { | |
| 260 | + imageActor.SetShaderEffect(shaderEffect); | |
| 261 | + } | |
| 262 | + imageActor.SetParentOrigin(ParentOrigin::CENTER); | |
| 263 | + imageActor.SetAnchorPoint(AnchorPoint::CENTER); | |
| 264 | + imageActor.SetScale(1.0f, -1.0f, 1.0f); | |
| 265 | + stage.Add(imageActor); // Not in default image view | |
| 266 | + | |
| 267 | + CameraActor cameraActor = CameraActor::New(FBOSize); | |
| 268 | + cameraActor.SetParentOrigin(ParentOrigin::CENTER); | |
| 269 | + cameraActor.SetFieldOfView(Math::PI*0.25f); | |
| 270 | + cameraActor.SetNearClippingPlane(1.0f); | |
| 271 | + cameraActor.SetAspectRatio(FBOSize.width / FBOSize.height); | |
| 272 | + cameraActor.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor | |
| 273 | + cameraActor.SetRotation(Quaternion(M_PI, Vector3::YAXIS)); | |
| 274 | + cameraActor.SetPosition(0.0f, 0.0f, ((FBOSize.height * 0.5f) / tanf(Math::PI * 0.125f))); | |
| 275 | + stage.Add(cameraActor); | |
| 276 | + | |
| 277 | + renderTask.SetSourceActor(imageActor); | |
| 278 | + renderTask.SetInputEnabled(false); | |
| 279 | + renderTask.SetTargetFrameBuffer(framebuffer); | |
| 280 | + renderTask.SetCameraActor( cameraActor ); | |
| 281 | + renderTask.SetClearColor( Color::TRANSPARENT ); | |
| 282 | + renderTask.SetClearEnabled( true ); | |
| 283 | + renderTask.SetRefreshRate(RenderTask::REFRESH_ONCE); | |
| 284 | + | |
| 285 | + return framebuffer; | |
| 286 | +} | |
| 287 | + | |
| 288 | +void NewWindowController::CreateBubbles(Vector2 stageSize) | |
| 289 | +{ | |
| 290 | + mEmitter = Toolkit::BubbleEmitter::New( stageSize, | |
| 291 | + Image::New( DALI_IMAGE_DIR "bubble-ball.png" ), | |
| 292 | + 1000, Vector2( 5.0f, 5.0f ) ); | |
| 293 | + | |
| 294 | + Image background = Image::New(BACKGROUND_IMAGE); | |
| 295 | + mEmitter.SetBackground( background, mHSVDelta ); | |
| 296 | + Actor bubbleRoot = mEmitter.GetRootActor(); | |
| 297 | + mContentLayer.Add( bubbleRoot ); | |
| 298 | + bubbleRoot.SetParentOrigin(ParentOrigin::CENTER); | |
| 299 | + bubbleRoot.SetZ(0.1f); | |
| 300 | + | |
| 301 | + mEmitTrackTimer = Timer::New( EMIT_INTERVAL_IN_MS ); | |
| 302 | + mEmitTrackTimer.TickSignal().Connect(this, &NewWindowController::OnTrackTimerTick); | |
| 303 | + mEmitTrackTimer.Start(); | |
| 304 | + | |
| 305 | + //mExplodeTimer = Timer::New( Random::Range(4000.f, 8000.f) ); | |
| 306 | + //mExplodeTimer.TickSignal().Connect(this, &NewWindowController::OnExplodeTimerTick); | |
| 307 | + //mExplodeTimer.Start(); | |
| 308 | +} | |
| 309 | + | |
| 310 | +bool NewWindowController::OnExplodeTimerTick() | |
| 311 | +{ | |
| 312 | + mEmitter.StartExplosion( EXPLOSION_DURATION, 5.0f ); | |
| 313 | + | |
| 314 | + mExplodeTimer = Timer::New( Random::Range(4.f, 8.f) ); | |
| 315 | + mExplodeTimer.TickSignal().Connect(this, &NewWindowController::OnExplodeTimerTick); | |
| 316 | + return false; | |
| 317 | +} | |
| 318 | + | |
| 319 | +void NewWindowController::SetUpAnimation( Vector2 emitPosition, Vector2 direction ) | |
| 320 | +{ | |
| 321 | + if( mNeedNewAnimation ) | |
| 322 | + { | |
| 323 | + float duration = Random::Range(1.f, 1.5f); | |
| 324 | + mEmitAnimation = Animation::New( duration ); | |
| 325 | + mNeedNewAnimation = false; | |
| 326 | + mAnimateComponentCount = 0; | |
| 327 | + } | |
| 328 | + | |
| 329 | + mEmitter.EmitBubble( mEmitAnimation, emitPosition, direction, Vector2(1, 1) ); | |
| 330 | + | |
| 331 | + mAnimateComponentCount++; | |
| 332 | + | |
| 333 | + if( mAnimateComponentCount % 20 ==0 ) | |
| 334 | + { | |
| 335 | + mEmitAnimation.Play(); | |
| 336 | + mNeedNewAnimation = true; | |
| 337 | + } | |
| 338 | +} | |
| 339 | + | |
| 340 | +bool NewWindowController::OnTrackTimerTick() | |
| 341 | +{ | |
| 342 | + static int time=0; | |
| 343 | + const float radius(250.0f); | |
| 344 | + | |
| 345 | + time += EMIT_INTERVAL_IN_MS; | |
| 346 | + float modTime = time / TRACK_DURATION_IN_MS; | |
| 347 | + float angle = 2.0f*Math::PI*modTime; | |
| 348 | + | |
| 349 | + Vector2 position(radius*cosf(angle), radius*-sinf(angle)); | |
| 350 | + Vector2 aimPos(radius*2*sinf(angle), radius*2*-cosf(angle)); | |
| 351 | + Vector2 direction = aimPos-position; | |
| 352 | + Vector2 stageSize = Stage::GetCurrent().GetSize(); | |
| 353 | + | |
| 354 | + for(int i=0; i<20; i++) | |
| 355 | + { | |
| 356 | + SetUpAnimation( stageSize*0.5f+position, direction ); | |
| 357 | + } | |
| 358 | + | |
| 359 | + return true; | |
| 360 | +} | |
| 361 | + | |
| 362 | + | |
| 363 | +void NewWindowController::CreateBlending() | |
| 364 | +{ | |
| 365 | + Toolkit::ColorAdjuster colorAdjuster = ColorAdjuster::New(mHSVDelta); | |
| 366 | + FrameBufferImage fb2 = CreateFrameBufferForImage( EFFECT_IMAGE, mEffectImage, colorAdjuster ); | |
| 367 | + | |
| 368 | + ImageActor tmpActor = ImageActor::New(fb2); | |
| 369 | + mContentLayer.Add(tmpActor); | |
| 370 | + tmpActor.SetParentOrigin(ParentOrigin::BOTTOM_RIGHT); | |
| 371 | + tmpActor.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT); | |
| 372 | + tmpActor.SetScale(0.25f); | |
| 373 | + | |
| 374 | + // create blending shader effect | |
| 375 | + ShaderEffect blendShader = ShaderEffect::New( "", FRAG_SHADER ); | |
| 376 | + blendShader.SetEffectImage( fb2 ); | |
| 377 | + blendShader.SetUniform("alpha", 0.5f); | |
| 378 | + | |
| 379 | + mBaseImage = Image::New(BASE_IMAGE); | |
| 380 | + mBlendActor = ImageActor::New( mBaseImage ); | |
| 381 | + mBlendActor.SetParentOrigin(ParentOrigin::CENTER); | |
| 382 | + mBlendActor.SetPosition(Vector3(150.0f, 200.0f, 0.0f)); | |
| 383 | + mBlendActor.SetSize(140, 140); | |
| 384 | + mBlendActor.SetShaderEffect( blendShader ); | |
| 385 | + mContentLayer.Add(mBlendActor); | |
| 386 | +} | |
| 387 | + | |
| 388 | +void NewWindowController::CreateText() | |
| 389 | +{ | |
| 390 | + mTextActor = TextActor::New("Some text"); | |
| 391 | + mTextActor.SetParentOrigin(ParentOrigin::CENTER); | |
| 392 | + mTextActor.SetColor(Color::RED); | |
| 393 | + mTextActor.SetName("PushMe text"); | |
| 394 | + mContentLayer.Add( mTextActor ); | |
| 395 | +} | |
| 396 | + | |
| 397 | +Mesh NewWindowController::CreateMesh(bool hasColor, Material material) | |
| 398 | +{ | |
| 399 | + // Create vertices and specify their color | |
| 400 | + MeshData::VertexContainer vertices(4); | |
| 401 | + vertices[ 0 ] = MeshData::Vertex( Vector3( -0.5f, -0.5f, 0.0f ), Vector2(0.0f, 0.0f), Vector3(1.0f, 0.0f, 0.0f) ); | |
| 402 | + vertices[ 1 ] = MeshData::Vertex( Vector3( 0.5f, -0.5f, 0.0f ), Vector2(1.0f, 0.0f), Vector3(1.0f, 1.0f, 0.0f) ); | |
| 403 | + vertices[ 2 ] = MeshData::Vertex( Vector3( -0.5f, 0.5f, 0.0f ), Vector2(0.0f, 1.0f), Vector3(0.0f,1.0f,0.0f) ); | |
| 404 | + vertices[ 3 ] = MeshData::Vertex( Vector3( 0.5f, 0.5f, 0.0f ), Vector2(1.0f, 1.0f), Vector3(0.0f,0.0f,1.0f) ); | |
| 405 | + | |
| 406 | + // Specify all the faces | |
| 407 | + MeshData::FaceIndices faces; | |
| 408 | + faces.reserve( 6 ); // 2 triangles in Quad | |
| 409 | + faces.push_back( 0 ); faces.push_back( 3 ); faces.push_back( 1 ); | |
| 410 | + faces.push_back( 0 ); faces.push_back( 2 ); faces.push_back( 3 ); | |
| 411 | + | |
| 412 | + // Create the mesh data from the vertices and faces | |
| 413 | + MeshData meshData; | |
| 414 | + meshData.SetHasColor( hasColor ); | |
| 415 | + meshData.SetMaterial( material ); | |
| 416 | + meshData.SetVertices( vertices ); | |
| 417 | + meshData.SetFaceIndices( faces ); | |
| 418 | + | |
| 419 | + // Create a mesh from the data | |
| 420 | + Dali::Mesh mesh = Mesh::New( meshData ); | |
| 421 | + return mesh; | |
| 422 | +} | |
| 423 | + | |
| 424 | +void NewWindowController::CreateModel() | |
| 425 | +{ | |
| 426 | + mModel = Model::New(gModelFile); | |
| 427 | + mModel.LoadingFinishedSignal().Connect(this, &NewWindowController::OnModelLoaded); | |
| 428 | + | |
| 429 | + //Create a Key light | |
| 430 | + Light keylight = Light::New("KeyLight"); | |
| 431 | + keylight.SetFallOff(Vector2(10000.0f, 10000.0f)); | |
| 432 | + | |
| 433 | + mCastingLight = Actor::New(); | |
| 434 | + mCastingLight.SetParentOrigin(ParentOrigin::CENTER); | |
| 435 | + mCastingLight.SetAnchorPoint(AnchorPoint::CENTER); | |
| 436 | + mCastingLight.SetPosition( Vector3( 0.0f, 0.0f, 800.0f ) ); | |
| 437 | + mContentLayer.Add( mCastingLight ); | |
| 438 | + | |
| 439 | + mKeyLightActor = LightActor::New(); | |
| 440 | + mKeyLightActor.SetParentOrigin(ParentOrigin::CENTER); | |
| 441 | + mKeyLightActor.SetName(keylight.GetName()); | |
| 442 | + | |
| 443 | + //Add all the actors to the stage | |
| 444 | + mCastingLight.Add(mKeyLightActor); | |
| 445 | + mKeyLightActor.SetLight(keylight); | |
| 446 | +} | |
| 447 | + | |
| 448 | +void NewWindowController::OnModelLoaded( Model model ) | |
| 449 | +{ | |
| 450 | + if( model.GetLoadingState() == ResourceLoadingSucceeded ) | |
| 451 | + { | |
| 452 | + std::cout << "Succeeded loading collada model" << std::endl; | |
| 453 | + mModelActor = ModelActorFactory::BuildActorTree(mModel, ""); // Gets root actor | |
| 454 | + mModelActor.SetSize(250.0f, 250.0f); | |
| 455 | + mModelActor.SetPosition(0.0f, 200.0f, 70.0f); | |
| 456 | + mModelActor.SetScale(0.5f); | |
| 457 | + mModelActor.SetRotation(Radian(Math::PI*0.25f), Vector3(1.0, 0.7, 0.0)); | |
| 458 | + | |
| 459 | + mContentLayer.Add( mModelActor ); | |
| 460 | + | |
| 461 | + if (mModel.NumberOfAnimations()) | |
| 462 | + { | |
| 463 | + mModelAnimation = ModelActorFactory::BuildAnimation(mModel, mModelActor, 0); | |
| 464 | + mModelAnimation.SetDuration(4.0f); | |
| 465 | + mModelAnimation.SetLooping(true); | |
| 466 | + mModelAnimation.Play(); | |
| 467 | + } | |
| 468 | + } | |
| 469 | + else | |
| 470 | + { | |
| 471 | + std::cout << "Failed loading collada model" << std::endl; | |
| 472 | + mApplication.Quit(); | |
| 473 | + } | |
| 474 | +} | |
| 475 | + | |
| 476 | +void NewWindowController::NewWindow(void) | |
| 477 | +{ | |
| 478 | + PositionSize posSize(0, 0, 720, 1280); | |
| 479 | + gApplication.ReplaceWindow(posSize, "NewWindow"); // Generates a new window | |
| 480 | +} | |
| 481 | + | |
| 482 | +void NewWindowController::OnKeyEvent(const KeyEvent& event) | |
| 483 | +{ | |
| 484 | + if(event.state == KeyEvent::Down) | |
| 485 | + { | |
| 486 | + if( IsKey( event, Dali::DALI_KEY_ESCAPE) || IsKey( event, Dali::DALI_KEY_BACK) ) | |
| 487 | + { | |
| 488 | + mApplication.Quit(); | |
| 489 | + } | |
| 490 | + } | |
| 491 | +} | |
| 492 | + | |
| 493 | +void NewWindowController::OnContextLost() | |
| 494 | +{ | |
| 495 | + printf("Stage reporting context loss\n"); | |
| 496 | +} | |
| 497 | + | |
| 498 | +void NewWindowController::OnContextRegained() | |
| 499 | +{ | |
| 500 | + printf("Stage reporting context regain\n"); | |
| 501 | +} | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | +void RunTest(Application& app) | |
| 507 | +{ | |
| 508 | + gNewWindowController = new NewWindowController(app); | |
| 509 | + app.MainLoop(Configuration::APPLICATION_DOES_NOT_HANDLE_CONTEXT_LOSS); | |
| 510 | +} | |
| 511 | + | |
| 512 | +// Entry point for Linux & SLP applications | |
| 513 | +// | |
| 514 | + | |
| 515 | +int main(int argc, char **argv) | |
| 516 | +{ | |
| 517 | + gApplication = Application::New(&argc, &argv); | |
| 518 | + RunTest(gApplication); | |
| 519 | + | |
| 520 | + return 0; | |
| 521 | +} | ... | ... |