2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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.
20 #include <dali/dali.h>
22 #include "dali-test-suite-utils/dali-test-suite-utils.h"
26 void camera_actor_test_startup(void)
28 test_return_value = TET_UNDEF;
31 void camera_actor_test_cleanup(void)
33 test_return_value = TET_PASS;
39 const float FLOAT_EPSILON = 0.001f;
40 const float TEST_ASPECT_RATIO = 0.123f;
41 const float TEST_FIELD_OF_VIEW = Radian(Degree(40.0f));
42 const float TEST_NEAR_PLANE_DISTANCE = 0.23f;
43 const float TEST_FAR_PLANE_DISTANCE = 0.973f;
45 const std::string SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME( "uLightCameraProjectionMatrix" );
46 const std::string SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME( "uLightCameraViewMatrix" );
47 const char* const RENDER_SHADOW_VERTEX_SOURCE =
48 " uniform mediump mat4 uLightCameraProjectionMatrix;\n"
49 " uniform mediump mat4 uLightCameraViewMatrix;\n"
53 " gl_Position = uProjection * uModelView * vec4(aPosition,1.0);\n"
54 " vec4 textureCoords = uLightCameraProjectionMatrix * uLightCameraViewMatrix * uModelMatrix * vec4(aPosition,1.0);\n"
55 " vTexCoord = 0.5 + 0.5 * (textureCoords.xy/textureCoords.w);\n"
58 const char* const RENDER_SHADOW_FRAGMENT_SOURCE =
59 "uniform lowp vec4 uShadowColor;\n"
62 " lowp float alpha;\n"
63 " alpha = texture2D(sTexture, vec2(vTexCoord.x, vTexCoord.y)).a;\n"
64 " gl_FragColor = vec4(uShadowColor.rgb, uShadowColor.a * alpha);\n"
71 int UtcDaliCameraActorConstructorVoid(void)
73 TestApplication application;
74 tet_infoline("Testing Dali::CameraActor::CameraActor()");
78 DALI_TEST_CHECK(!actor);
82 int UtcDaliCameraActorNew(void)
84 TestApplication application;
85 tet_infoline("Testing Dali::CameraActor::New()");
87 CameraActor actor = CameraActor::New();
89 DALI_TEST_CHECK(actor);
93 DALI_TEST_CHECK(!actor);
97 int UtcDaliCameraActorDownCast(void)
99 TestApplication application;
100 tet_infoline("Testing Dali::CameraActor::DownCast()");
102 CameraActor camera = CameraActor::New();
103 Actor anActor = Actor::New();
104 anActor.Add( camera );
106 Actor child = anActor.GetChildAt(0);
107 CameraActor cameraActor = CameraActor::DownCast( child );
108 DALI_TEST_CHECK( cameraActor );
111 DALI_TEST_CHECK( !cameraActor );
113 cameraActor = DownCast< CameraActor >( child );
114 DALI_TEST_CHECK( cameraActor );
118 int UtcDaliCameraActorDownCast2(void)
120 TestApplication application;
121 tet_infoline("Testing Dali::CameraActor::DownCast()");
123 Actor actor1 = Actor::New();
124 Actor anActor = Actor::New();
127 Actor child = anActor.GetChildAt(0);
128 CameraActor cameraActor = CameraActor::DownCast( child );
129 DALI_TEST_CHECK( !cameraActor );
131 Actor unInitialzedActor;
132 cameraActor = CameraActor::DownCast( unInitialzedActor );
133 DALI_TEST_CHECK( !cameraActor );
135 cameraActor = DownCast< CameraActor >( unInitialzedActor );
136 DALI_TEST_CHECK( !cameraActor );
141 int UtcDaliCameraActorSetCameraOffStage(void)
143 TestApplication application;
144 tet_infoline("Testing Dali::CameraActor::SetCamera()");
146 CameraActor actor = CameraActor::New();
148 actor.SetType(Camera::FREE_LOOK);
149 actor.SetFieldOfView(TEST_FIELD_OF_VIEW);
150 actor.SetAspectRatio(TEST_ASPECT_RATIO);
151 actor.SetNearClippingPlane(TEST_NEAR_PLANE_DISTANCE);
152 actor.SetFarClippingPlane(TEST_FAR_PLANE_DISTANCE);
153 actor.SetProjectionMode(Camera::PERSPECTIVE_PROJECTION);
155 actor.SetInvertYAxis(false);
157 DALI_TEST_EQUALS(TEST_ASPECT_RATIO, actor.GetAspectRatio(), FLOAT_EPSILON, TEST_LOCATION);
158 DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, actor.GetFieldOfView(), FLOAT_EPSILON, TEST_LOCATION);
159 DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, actor.GetNearClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
160 DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, actor.GetFarClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
161 DALI_TEST_EQUALS(Camera::PERSPECTIVE_PROJECTION, actor.GetProjectionMode(), TEST_LOCATION);
162 DALI_TEST_EQUALS(false, actor.GetInvertYAxis(), TEST_LOCATION);
166 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
167 DALI_TEST_EQUALS(TEST_ASPECT_RATIO, value, FLOAT_EPSILON, TEST_LOCATION);
168 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
169 DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, value, FLOAT_EPSILON, TEST_LOCATION);
170 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
171 DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, value, FLOAT_EPSILON, TEST_LOCATION);
172 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
173 DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, value, FLOAT_EPSILON, TEST_LOCATION);
174 actor.GetProperty(CameraActor::PROJECTION_MODE).Get(sValue);
175 DALI_TEST_EQUALS("PERSPECTIVE_PROJECTION", sValue, TEST_LOCATION);
177 actor.GetProperty(CameraActor::INVERT_Y_AXIS).Get(bValue);
178 DALI_TEST_EQUALS(false, bValue, TEST_LOCATION);
182 int UtcDaliCameraActorSetCameraOnStage(void)
184 TestApplication application;
185 tet_infoline("Testing Dali::CameraActor::SetCamera()");
187 CameraActor actor = CameraActor::New();
188 Stage::GetCurrent().Add(actor);
189 application.Render(0);
190 application.SendNotification();
192 actor.SetType(Camera::LOOK_AT_TARGET);
193 actor.SetFieldOfView(TEST_FIELD_OF_VIEW);
194 actor.SetAspectRatio(TEST_ASPECT_RATIO);
195 actor.SetNearClippingPlane(TEST_NEAR_PLANE_DISTANCE);
196 actor.SetFarClippingPlane(TEST_FAR_PLANE_DISTANCE);
197 actor.SetInvertYAxis(false);
199 DALI_TEST_EQUALS(false, actor.GetInvertYAxis(), TEST_LOCATION);
201 // Will need 2 frames to ensure both buffers are set to same values:
202 application.Render();
203 application.SendNotification();
204 application.Render();
205 application.SendNotification();
207 DALI_TEST_EQUALS(TEST_ASPECT_RATIO, actor.GetAspectRatio(), FLOAT_EPSILON, TEST_LOCATION);
208 DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, actor.GetFieldOfView(), FLOAT_EPSILON, TEST_LOCATION);
209 DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, actor.GetNearClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
210 DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, actor.GetFarClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
211 DALI_TEST_EQUALS(false, actor.GetInvertYAxis(), TEST_LOCATION);
214 actor.GetProperty(CameraActor::TYPE).Get(sValue);
215 DALI_TEST_EQUALS(sValue, "LOOK_AT_TARGET", TEST_LOCATION);
218 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
219 DALI_TEST_EQUALS(TEST_ASPECT_RATIO, value, FLOAT_EPSILON, TEST_LOCATION);
220 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
221 DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, value, FLOAT_EPSILON, TEST_LOCATION);
222 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
223 DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, value, FLOAT_EPSILON, TEST_LOCATION);
224 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
225 DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, value, FLOAT_EPSILON, TEST_LOCATION);
228 actor.GetProperty(CameraActor::INVERT_Y_AXIS).Get(bValue);
229 DALI_TEST_EQUALS(false, bValue, TEST_LOCATION);
234 int UtcDaliCameraActorGetCamera(void)
236 TestApplication application;
237 tet_infoline("Testing Dali::CameraActor::GetCamera()");
239 CameraActor actor = CameraActor::New();
241 actor.SetAspectRatio(TEST_ASPECT_RATIO);
243 DALI_TEST_EQUALS(actor.GetAspectRatio(), TEST_ASPECT_RATIO, FLOAT_EPSILON, TEST_LOCATION);
245 actor.SetProperty(CameraActor::TYPE, "FREE_LOOK");
246 actor.SetProperty(CameraActor::ASPECT_RATIO, TEST_ASPECT_RATIO);
247 actor.SetProperty(CameraActor::FIELD_OF_VIEW, TEST_FIELD_OF_VIEW);
248 actor.SetProperty(CameraActor::NEAR_PLANE_DISTANCE, TEST_NEAR_PLANE_DISTANCE);
249 actor.SetProperty(CameraActor::FAR_PLANE_DISTANCE, TEST_FAR_PLANE_DISTANCE);
251 DALI_TEST_EQUALS(Camera::FREE_LOOK, actor.GetType(), TEST_LOCATION);
252 DALI_TEST_EQUALS(TEST_ASPECT_RATIO, actor.GetAspectRatio(), FLOAT_EPSILON, TEST_LOCATION);
253 DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, actor.GetFieldOfView(), FLOAT_EPSILON, TEST_LOCATION);
254 DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, actor.GetNearClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
255 DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, actor.GetFarClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
259 int UtcDaliCameraActorDefaultProperties(void)
261 TestApplication application;
262 tet_infoline("Testing Dali::CameraActor DefaultProperties");
264 CameraActor actor = CameraActor::New();
266 actor.SetAspectRatio(TEST_ASPECT_RATIO);
267 Stage::GetCurrent().Add(actor);
268 application.Render(0);
269 application.SendNotification();
271 actor.GetProperty(CameraActor::INVERT_Y_AXIS).Get(bValue);
272 DALI_TEST_EQUALS(false, bValue, TEST_LOCATION);
274 std::vector<Property::Index> indices ;
275 indices.push_back(CameraActor::TYPE);
276 indices.push_back(CameraActor::PROJECTION_MODE);
277 indices.push_back(CameraActor::FIELD_OF_VIEW );
278 indices.push_back(CameraActor::ASPECT_RATIO );
279 indices.push_back(CameraActor::NEAR_PLANE_DISTANCE );
280 indices.push_back(CameraActor::FAR_PLANE_DISTANCE );
281 indices.push_back(CameraActor::LEFT_PLANE_DISTANCE );
282 indices.push_back(CameraActor::RIGHT_PLANE_DISTANCE );
283 indices.push_back(CameraActor::TOP_PLANE_DISTANCE );
284 indices.push_back(CameraActor::BOTTOM_PLANE_DISTANCE );
285 indices.push_back(CameraActor::TARGET_POSITION );
286 indices.push_back(CameraActor::PROJECTION_MATRIX );
287 indices.push_back(CameraActor::VIEW_MATRIX);
288 indices.push_back(CameraActor::INVERT_Y_AXIS );
290 DALI_TEST_CHECK(actor.GetPropertyCount() == ( Actor::New().GetPropertyCount() + indices.size() ) );
292 for(std::vector<Property::Index>::iterator iter = indices.begin(); iter != indices.end(); ++iter)
294 DALI_TEST_EQUALS( *iter, actor.GetPropertyIndex(actor.GetPropertyName(*iter)), TEST_LOCATION);
295 DALI_TEST_CHECK( ! actor.IsPropertyAnimatable(*iter) );
299 if ( ( *iter == CameraActor::PROJECTION_MATRIX ) ||
300 ( *iter == CameraActor::VIEW_MATRIX ) )
302 DALI_TEST_CHECK( ! actor.IsPropertyWritable(*iter) );
306 DALI_TEST_CHECK( actor.IsPropertyWritable(*iter) );
310 DALI_TEST_CHECK( actor.GetPropertyType(*iter) == actor.GetPropertyType(*iter) ); // just checking call succeeds
313 // set/get one of them
314 const float newAspect = TEST_ASPECT_RATIO * 2.f;
316 actor.SetProperty( CameraActor::ASPECT_RATIO, Property::Value(newAspect) );
317 application.Render();
318 application.SendNotification();
319 application.Render();
320 application.SendNotification();
322 DALI_TEST_EQUALS(actor.GetAspectRatio(), newAspect, TEST_LOCATION );
326 int UtcDaliCameraActorSetTarget(void)
328 TestApplication application;
329 tet_infoline("Testing Dali::CameraActor Get/Set Target Position");
331 CameraActor actor = CameraActor::New();
332 DALI_TEST_EQUALS( actor.GetTargetPosition(), Vector3::ZERO, TEST_LOCATION );
334 Vector3 target( 10.0f, 20.0f, 30.0f);
335 actor.SetTargetPosition( target );
337 DALI_TEST_EQUALS( actor.GetTargetPosition(), target, TEST_LOCATION );
340 actor.GetProperty(CameraActor::TARGET_POSITION).Get(value);
341 DALI_TEST_EQUALS(target, value, FLOAT_EPSILON, TEST_LOCATION);
346 int UtcDaliCameraActorSetType01(void)
348 TestApplication application;
349 tet_infoline("Testing Dali::CameraActor Get/Set Type");
351 CameraActor actor = CameraActor::New();
352 DALI_TEST_EQUALS( actor.GetType(), Dali::Camera::LOOK_AT_TARGET, TEST_LOCATION );
354 actor.SetType(Dali::Camera::FREE_LOOK);
355 DALI_TEST_EQUALS( actor.GetType(), Dali::Camera::FREE_LOOK, TEST_LOCATION );
358 actor.GetProperty(CameraActor::TYPE).Get(sValue);
359 std::string result("FREE_LOOK");
360 DALI_TEST_EQUALS(result, sValue, TEST_LOCATION);
364 int UtcDaliCameraActorSetType02(void)
366 TestApplication application;
367 tet_infoline("Testing Dali::CameraActor Get/Set Type");
371 Dali::Camera::Type cameraType = Dali::Camera::FREE_LOOK ;
374 cameraType = actor.GetType();
376 catch ( Dali::DaliException& e )
378 tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
379 DALI_TEST_ASSERT(e, "camera", TEST_LOCATION);
382 const CameraActor aConstActor;
386 cameraType = aConstActor.GetType();
388 catch ( Dali::DaliException& e )
390 tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
391 DALI_TEST_ASSERT(e, "camera", TEST_LOCATION);
394 DALI_TEST_EQUALS((int)cameraType, (int)Dali::Camera::FREE_LOOK, TEST_LOCATION);
398 int UtcDaliCameraActorSetFieldOfView(void)
400 TestApplication application;
401 tet_infoline("Testing Dali::CameraActor Get/Set Field of view");
403 CameraActor defaultCamera = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
404 const float defaultFov = defaultCamera.GetFieldOfView();
406 CameraActor actor = CameraActor::New();
407 DALI_TEST_EQUALS( actor.GetFieldOfView(), defaultFov, TEST_LOCATION );
409 float fov = Math::PI/3.0f;
410 actor.SetFieldOfView(fov);
411 DALI_TEST_EQUALS( actor.GetFieldOfView(), fov, TEST_LOCATION );
414 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
415 DALI_TEST_EQUALS(fov, value, FLOAT_EPSILON, TEST_LOCATION);
419 int UtcDaliCameraActorSetAspectRatio(void)
421 TestApplication application;
422 tet_infoline("Testing Dali::CameraActor Get/Set Aspect Ratio");
424 CameraActor actor = CameraActor::New();
425 DALI_TEST_EQUALS( actor.GetAspectRatio(), static_cast<float>( TestApplication::DEFAULT_SURFACE_WIDTH ) / static_cast<float>( TestApplication::DEFAULT_SURFACE_HEIGHT ), TEST_LOCATION );
427 float aspect = 16.0f/9.0f;
428 actor.SetAspectRatio(aspect);
429 DALI_TEST_EQUALS( actor.GetAspectRatio(), aspect, TEST_LOCATION );
432 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
433 DALI_TEST_EQUALS(aspect, value, FLOAT_EPSILON, TEST_LOCATION);
437 int UtcDaliCameraActorSetNearClippingPlane(void)
439 TestApplication application;
440 tet_infoline("Testing Dali::CameraActor Get/Set Near clipping plane");
442 CameraActor actor = CameraActor::New();
443 DALI_TEST_EQUALS( actor.GetNearClippingPlane(), 800.0f, TEST_LOCATION );
445 actor.SetNearClippingPlane(400.0f);
446 DALI_TEST_EQUALS( actor.GetNearClippingPlane(), 400.0f, TEST_LOCATION );
449 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
450 DALI_TEST_EQUALS(400.0f, value, FLOAT_EPSILON, TEST_LOCATION);
454 int UtcDaliCameraActorSetFarClippingPlane(void)
456 TestApplication application;
457 tet_infoline("Testing Dali::CameraActor Get/Set Far clipping plane");
459 CameraActor actor = CameraActor::New();
460 DALI_TEST_EQUALS( actor.GetFarClippingPlane(), 800.0f + (0xFFFF>>4), TEST_LOCATION );
462 actor.SetFarClippingPlane(4000.0f);
463 DALI_TEST_EQUALS( actor.GetFarClippingPlane(), 4000.0f, TEST_LOCATION );
466 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
467 DALI_TEST_EQUALS(4000.0f, value, FLOAT_EPSILON, TEST_LOCATION);
471 int UtcDaliCameraActorSetTargetPosition(void)
473 TestApplication application;
474 tet_infoline("Testing Dali::CameraActor Get/Set Target Position");
476 CameraActor actor = CameraActor::New();
477 DALI_TEST_EQUALS( actor.GetTargetPosition(), Vector3::ZERO, TEST_LOCATION );
479 Vector3 target( 10.0f, 20.0f, 30.0f);
480 actor.SetTargetPosition( target );
482 DALI_TEST_EQUALS( actor.GetTargetPosition(), target, TEST_LOCATION );
485 actor.GetProperty(CameraActor::TARGET_POSITION).Get(value);
486 DALI_TEST_EQUALS(target, value, FLOAT_EPSILON, TEST_LOCATION);
490 int UtcDaliCameraActorSetInvertYAxis(void)
492 TestApplication application;
493 tet_infoline("Testing Dali::CameraActor Get/Set InvertYAxis");
495 CameraActor actor = CameraActor::New();
496 DALI_TEST_EQUALS( actor.GetInvertYAxis(), false, TEST_LOCATION );
498 actor.SetInvertYAxis(true);
500 DALI_TEST_EQUALS( actor.GetInvertYAxis(), true, TEST_LOCATION );
503 actor.GetProperty(CameraActor::INVERT_Y_AXIS).Get(bValue);
504 DALI_TEST_EQUALS(true, bValue, TEST_LOCATION);
508 int UtcDaliCameraActorModelView(void)
510 TestApplication application;
511 tet_infoline("Testing Dali::CameraActor Test view application");
513 BitmapImage image = CreateBitmapImage();
515 ImageActor actor = ImageActor::New( image );
516 actor.SetSize( 100.0f, 100.0f );
517 actor.SetPosition(20.0f, 30.0f, 40.0f);
518 actor.SetParentOrigin(ParentOrigin::CENTER);
519 Stage::GetCurrent().Add(actor);
521 application.SendNotification();
522 application.Render(0);
523 application.Render();
524 application.SendNotification();
526 Matrix resultMatrix(true);
527 resultMatrix.SetTransformComponents( Vector3::ONE, Quaternion::IDENTITY, actor.GetCurrentPosition());
529 RenderTask task = Stage::GetCurrent().GetRenderTaskList().GetTask(0);
530 CameraActor cameraActor = task.GetCameraActor();
532 Matrix viewMatrix(false);
533 cameraActor.GetProperty(CameraActor::VIEW_MATRIX).Get( viewMatrix );
534 Matrix::Multiply(resultMatrix, resultMatrix, viewMatrix);
536 DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "uModelView", resultMatrix ) );
540 int UtcDaliCameraActorSetPerspectiveProjection(void)
542 TestApplication application;
543 tet_infoline("Testing Dali::CameraActor::SetPerspectiveProjection( const Size& size )");
545 CameraActor actor = CameraActor::New();
546 actor.SetPerspectiveProjection( Size( 100.f, 150.f ) );
548 DALI_TEST_CHECK(actor);
551 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
552 DALI_TEST_EQUALS(0.666666f, value, FLOAT_EPSILON, TEST_LOCATION);
553 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
554 DALI_TEST_EQUALS(0.489957f, value, FLOAT_EPSILON, TEST_LOCATION);
555 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
556 DALI_TEST_EQUALS(150.f, value, FLOAT_EPSILON, TEST_LOCATION);
557 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
558 DALI_TEST_EQUALS(4245.f, value, FLOAT_EPSILON, TEST_LOCATION);
560 DALI_TEST_EQUALS((int)actor.GetProjectionMode(), (int)Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION);
562 std::string stringValue;
563 actor.GetProperty(CameraActor::PROJECTION_MODE).Get(stringValue);
564 DALI_TEST_EQUALS(stringValue, "PERSPECTIVE_PROJECTION", TEST_LOCATION);
568 int UtcDaliCameraActorSetOrthographicProjection01(void)
570 TestApplication application;
571 tet_infoline("Testing Dali::CameraActor::SetOrthographicProjection01()");
573 CameraActor actor = CameraActor::New(Size(1080.0f, 1920.0f));
574 DALI_TEST_CHECK(actor);
576 Stage::GetCurrent().Add( actor );
578 actor.SetOrthographicProjection( Size( 1080.0f, 1920.0f ) );
579 application.SendNotification();
580 application.Render(0);
581 application.Render();
582 application.SendNotification();
584 float defaultAspectRatio;
585 float defaultFieldOfView;
586 float defaultNearPlaneDistance;
587 float defaultFarPlaneDistance;
588 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(defaultAspectRatio);
589 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(defaultFieldOfView);
590 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(defaultNearPlaneDistance);
591 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(defaultFarPlaneDistance);
592 Vector3 defaultPos = actor.GetCurrentPosition();
594 actor.SetOrthographicProjection( Size( 1080.0f, 1920.0f ) );
596 application.SendNotification();
597 application.Render(0);
598 application.Render();
599 application.SendNotification();
602 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
603 DALI_TEST_EQUALS(defaultAspectRatio, value, FLOAT_EPSILON, TEST_LOCATION);
604 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
605 DALI_TEST_EQUALS(defaultFieldOfView, value, FLOAT_EPSILON, TEST_LOCATION);
606 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
607 DALI_TEST_EQUALS(defaultNearPlaneDistance, value, FLOAT_EPSILON, TEST_LOCATION);
608 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
609 DALI_TEST_EQUALS(defaultFarPlaneDistance, value, FLOAT_EPSILON, TEST_LOCATION);
611 actor.GetProperty(CameraActor::LEFT_PLANE_DISTANCE).Get(value);
612 DALI_TEST_EQUALS(-540.0f, value, FLOAT_EPSILON, TEST_LOCATION);
613 actor.GetProperty(CameraActor::RIGHT_PLANE_DISTANCE).Get(value);
614 DALI_TEST_EQUALS( 540.0f, value, FLOAT_EPSILON, TEST_LOCATION);
615 actor.GetProperty(CameraActor::TOP_PLANE_DISTANCE).Get(value);
616 DALI_TEST_EQUALS(960.0f, value, FLOAT_EPSILON, TEST_LOCATION);
617 actor.GetProperty(CameraActor::BOTTOM_PLANE_DISTANCE).Get(value);
618 DALI_TEST_EQUALS(-960.0f, value, FLOAT_EPSILON, TEST_LOCATION);
620 Vector3 pos = actor.GetCurrentPosition();
621 DALI_TEST_EQUALS(defaultPos.z, pos.z, 0.001f, TEST_LOCATION);
623 DALI_TEST_EQUALS((int)actor.GetProjectionMode(), (int)Dali::Camera::ORTHOGRAPHIC_PROJECTION, TEST_LOCATION);
628 int UtcDaliCameraActorSetOrthographicProjection02(void)
630 TestApplication application;
631 tet_infoline("Testing Dali::CameraActor::SetOrthographicProjection02()");
633 CameraActor actor = CameraActor::New();
634 DALI_TEST_CHECK(actor);
636 float defaultAspectRatio;
637 float defaultFieldOfView;
638 float defaultNearPlaneDistance;
639 float defaultFarPlaneDistance;
640 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(defaultAspectRatio);
641 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(defaultFieldOfView);
642 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(defaultNearPlaneDistance);
643 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(defaultFarPlaneDistance);
645 actor.SetOrthographicProjection( -100.0f, 200.0f, -300.0f, 500.0f, 400.0f, 4000.0f );
648 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
649 DALI_TEST_EQUALS(defaultAspectRatio, value, FLOAT_EPSILON, TEST_LOCATION);
650 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
651 DALI_TEST_EQUALS(defaultFieldOfView, value, FLOAT_EPSILON, TEST_LOCATION);
652 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
653 DALI_TEST_EQUALS(400.0f, value, FLOAT_EPSILON, TEST_LOCATION);
654 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
655 DALI_TEST_EQUALS(4000.0f, value, FLOAT_EPSILON, TEST_LOCATION);
657 actor.GetProperty(CameraActor::LEFT_PLANE_DISTANCE).Get(value);
658 DALI_TEST_EQUALS(-100.0f, value, FLOAT_EPSILON, TEST_LOCATION);
659 actor.GetProperty(CameraActor::RIGHT_PLANE_DISTANCE).Get(value);
660 DALI_TEST_EQUALS( 200.0f, value, FLOAT_EPSILON, TEST_LOCATION);
661 actor.GetProperty(CameraActor::TOP_PLANE_DISTANCE).Get(value);
662 DALI_TEST_EQUALS(-300.0f, value, FLOAT_EPSILON, TEST_LOCATION);
663 actor.GetProperty(CameraActor::BOTTOM_PLANE_DISTANCE).Get(value);
664 DALI_TEST_EQUALS( 500.0f, value, FLOAT_EPSILON, TEST_LOCATION);
666 DALI_TEST_EQUALS((int)actor.GetProjectionMode(), (int)Dali::Camera::ORTHOGRAPHIC_PROJECTION, TEST_LOCATION);
672 int UtcDaliCameraActorSetOrthographicProjection03(void)
674 TestApplication application;
675 tet_infoline("Testing Dali::CameraActor::SetOrthographicProjection03()");
677 CameraActor actor = CameraActor::New();
678 DALI_TEST_CHECK(actor);
680 float defaultAspectRatio;
681 float defaultFieldOfView;
682 float defaultNearPlaneDistance;
683 float defaultFarPlaneDistance;
684 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(defaultAspectRatio);
685 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(defaultFieldOfView);
686 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(defaultNearPlaneDistance);
687 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(defaultFarPlaneDistance);
689 actor.SetProjectionMode(Dali::Camera::ORTHOGRAPHIC_PROJECTION);
691 actor.SetProperty(CameraActor::LEFT_PLANE_DISTANCE, -100.0f);
692 actor.SetProperty(CameraActor::RIGHT_PLANE_DISTANCE, 200.0f);
693 actor.SetProperty(CameraActor::TOP_PLANE_DISTANCE, -300.0f);
694 actor.SetProperty(CameraActor::BOTTOM_PLANE_DISTANCE, 500.0f);
695 actor.SetNearClippingPlane( 400.0f );
696 actor.SetFarClippingPlane( 4000.0f );
699 actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
700 DALI_TEST_EQUALS(defaultAspectRatio, value, FLOAT_EPSILON, TEST_LOCATION);
701 actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
702 DALI_TEST_EQUALS(defaultFieldOfView, value, FLOAT_EPSILON, TEST_LOCATION);
703 actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
704 DALI_TEST_EQUALS(400.0f, value, FLOAT_EPSILON, TEST_LOCATION);
705 actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
706 DALI_TEST_EQUALS(4000.0f, value, FLOAT_EPSILON, TEST_LOCATION);
708 actor.GetProperty(CameraActor::LEFT_PLANE_DISTANCE).Get(value);
709 DALI_TEST_EQUALS(-100.0f, value, FLOAT_EPSILON, TEST_LOCATION);
710 actor.GetProperty(CameraActor::RIGHT_PLANE_DISTANCE).Get(value);
711 DALI_TEST_EQUALS( 200.0f, value, FLOAT_EPSILON, TEST_LOCATION);
712 actor.GetProperty(CameraActor::TOP_PLANE_DISTANCE).Get(value);
713 DALI_TEST_EQUALS(-300.0f, value, FLOAT_EPSILON, TEST_LOCATION);
714 actor.GetProperty(CameraActor::BOTTOM_PLANE_DISTANCE).Get(value);
715 DALI_TEST_EQUALS( 500.0f, value, FLOAT_EPSILON, TEST_LOCATION);
717 DALI_TEST_EQUALS((int)actor.GetProjectionMode(), (int)Dali::Camera::ORTHOGRAPHIC_PROJECTION, TEST_LOCATION);
718 std::string stringValue;
719 actor.GetProperty(CameraActor::PROJECTION_MODE).Get(stringValue);
720 DALI_TEST_EQUALS(stringValue, "ORTHOGRAPHIC_PROJECTION", TEST_LOCATION);
726 int UtcDaliCameraActorReadProjectionMatrix(void)
728 TestApplication application;
729 tet_infoline("Testing Dali::CameraActor::ReadProjectionMatrix()");
731 CameraActor camera = Stage::GetCurrent().GetRenderTaskList().GetTask(0u).GetCameraActor();
732 application.SendNotification();
733 application.Render(0);
734 application.Render();
735 application.SendNotification();
736 Image image = CreateBitmapImage();
737 ImageActor imageActor = ImageActor::New( image );
738 imageActor.SetSize(100.0f, 100.0f);
739 Stage::GetCurrent().Add(imageActor);
741 Matrix projectionMatrix;
744 camera.GetProperty(CameraActor::CameraActor::PROJECTION_MATRIX).Get(projectionMatrix);
745 camera.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(viewMatrix);
747 ShaderEffect shaderEffect = ShaderEffect::New( RENDER_SHADOW_VERTEX_SOURCE, RENDER_SHADOW_FRAGMENT_SOURCE);
748 imageActor.SetShaderEffect(shaderEffect);
750 shaderEffect.SetUniform( SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME, Matrix::IDENTITY );
751 shaderEffect.SetUniform( SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME, Matrix::IDENTITY );
753 Property::Index projectionMatrixPropertyIndex = shaderEffect.GetPropertyIndex(SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME);
754 Property::Index viewMatrixPropertyIndex = shaderEffect.GetPropertyIndex(SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME);
756 Constraint projectionMatrixConstraint = Constraint::New<Dali::Matrix>( projectionMatrixPropertyIndex, Source( camera, CameraActor::PROJECTION_MATRIX ), EqualToConstraint());
757 Constraint viewMatrixConstraint = Constraint::New<Dali::Matrix>( viewMatrixPropertyIndex, Source( camera, CameraActor::VIEW_MATRIX ), EqualToConstraint());
759 shaderEffect.ApplyConstraint(projectionMatrixConstraint);
760 shaderEffect.ApplyConstraint(viewMatrixConstraint);
762 application.SendNotification();
763 application.Render();
765 // Test effects of Constraint.
766 DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue(SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME.c_str(), projectionMatrix));
768 DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue(SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME.c_str(), viewMatrix));
772 int UtcDaliCameraActorAnimatedProperties(void)
774 TestApplication application;
775 tet_infoline("Testing Dali::Internal::CameraActor::GetSceneObjectAnimatableProperty()");
777 CameraActor camera = Stage::GetCurrent().GetRenderTaskList().GetTask(0u).GetCameraActor();
778 Actor actor = Actor::New();
779 actor.SetSize(100.0f, 100.0f);
780 Stage::GetCurrent().Add(actor);
782 actor.ApplyConstraint(Constraint::New<Dali::Vector3>( Actor::POSITION, Source( camera, Actor::POSITION), EqualToConstraint()));
784 camera.SetPosition(100.0f, 200.0f, 300.0f);
785 application.SendNotification();
786 application.Render();
788 DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3(100.0f, 200.0f, 300.0f), TEST_LOCATION);
792 int UtcDaliCameraActorPropertyIndices(void)
794 TestApplication application;
795 CameraActor camera = Stage::GetCurrent().GetRenderTaskList().GetTask(0u).GetCameraActor();
797 Actor basicActor = Actor::New();
798 Property::IndexContainer indices;
799 camera.GetPropertyIndices( indices );
800 DALI_TEST_CHECK( indices.size() > basicActor.GetPropertyCount() );
801 DALI_TEST_EQUALS( indices.size(), camera.GetPropertyCount(), TEST_LOCATION );
805 int UtcDaliCameraActorCheckLookAtAndFreeLookViews01(void)
807 TestApplication application;
808 Stage stage = Stage::GetCurrent();
809 Vector2 stageSize = stage.GetSize();
811 CameraActor freeLookCameraActor = CameraActor::New(stageSize);
812 freeLookCameraActor.SetParentOrigin(ParentOrigin::CENTER);
813 freeLookCameraActor.SetType(Camera::FREE_LOOK);
815 Vector3 targetPosition(30.0f, 240.0f, -256.0f);
816 Actor target = Actor::New();
817 target.SetParentOrigin(ParentOrigin::CENTER);
818 target.SetPosition(targetPosition);
820 Constraint cameraOrientationConstraint =
821 Constraint::New<Quaternion> ( Actor::ROTATION,
822 Source( target, Actor::WORLD_POSITION ),
823 Source( freeLookCameraActor, Actor::WORLD_POSITION ),
824 Source( target, Actor::WORLD_ROTATION ),
826 freeLookCameraActor.ApplyConstraint( cameraOrientationConstraint );
828 CameraActor lookAtCameraActor = CameraActor::New(stageSize);
829 lookAtCameraActor.SetType(Camera::LOOK_AT_TARGET);
830 lookAtCameraActor.SetTargetPosition(targetPosition);
831 lookAtCameraActor.SetParentOrigin(ParentOrigin::CENTER);
834 stage.Add(freeLookCameraActor);
835 stage.Add(lookAtCameraActor);
837 // Create an arbitrary vector
838 for( float x=-1.0f; x<=1.0f; x+=0.1f )
840 for( float y=-1.0f; y<1.0f; y+=0.1f )
842 for( float z=-1.0f; z<1.0f; z+=0.1f )
844 Vector3 position(x, y, z);
845 position.Normalize();
848 freeLookCameraActor.SetPosition(position);
849 lookAtCameraActor.SetPosition(position);
851 application.SendNotification();
852 application.Render();
853 application.SendNotification();
854 application.Render();
855 Matrix freeLookViewMatrix;
856 Matrix lookAtViewMatrix;
857 freeLookCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(freeLookViewMatrix);
858 lookAtCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(lookAtViewMatrix);
860 DALI_TEST_EQUALS( freeLookViewMatrix, lookAtViewMatrix, 0.01, TEST_LOCATION );
867 int UtcDaliCameraActorCheckLookAtAndFreeLookViews02(void)
869 TestApplication application;
870 Stage stage = Stage::GetCurrent();
871 Vector2 stageSize = stage.GetSize();
873 CameraActor freeLookCameraActor = CameraActor::New(stageSize);
874 freeLookCameraActor.SetParentOrigin(ParentOrigin::CENTER);
875 freeLookCameraActor.SetType(Camera::FREE_LOOK);
877 Vector3 targetPosition(30.0f, 240.0f, -256.0f);
878 Actor target = Actor::New();
879 target.SetParentOrigin(ParentOrigin::CENTER);
880 target.SetPosition(targetPosition);
882 Constraint cameraOrientationConstraint =
883 Constraint::New<Quaternion> ( Actor::ROTATION,
884 Source( target, Actor::WORLD_POSITION ),
885 Source( freeLookCameraActor, Actor::WORLD_POSITION ),
886 Source( target, Actor::WORLD_ROTATION ),
888 freeLookCameraActor.ApplyConstraint( cameraOrientationConstraint );
890 CameraActor lookAtCameraActor = CameraActor::New(stageSize);
891 lookAtCameraActor.SetType(Camera::LOOK_AT_TARGET);
892 lookAtCameraActor.SetTargetPosition(targetPosition);
893 lookAtCameraActor.SetParentOrigin(ParentOrigin::CENTER);
896 stage.Add(freeLookCameraActor);
897 stage.Add(lookAtCameraActor);
899 // Create an arbitrary vector
900 for( float x=-1.0f; x<=1.0f; x+=0.1f )
902 for( float y=-1.0f; y<1.0f; y+=0.1f )
904 for( float z=-1.0f; z<1.0f; z+=0.1f )
906 Vector3 position(x, y, z);
907 position.Normalize();
910 freeLookCameraActor.SetPosition(position);
911 lookAtCameraActor.SetPosition(position);
913 application.SendNotification();
914 application.Render();
915 application.SendNotification();
916 application.Render();
917 Matrix freeLookViewMatrix;
918 Matrix lookAtViewMatrix;
919 freeLookCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(freeLookViewMatrix);
920 lookAtCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(lookAtViewMatrix);
922 Matrix freeLookWorld = freeLookCameraActor.GetCurrentWorldMatrix();
924 Matrix freeLookTest(false);
925 Matrix::Multiply(freeLookTest, freeLookViewMatrix, freeLookWorld);
926 DALI_TEST_EQUALS( freeLookTest, Matrix::IDENTITY, 0.01f, TEST_LOCATION);
928 DALI_TEST_EQUALS( freeLookViewMatrix, lookAtViewMatrix, 0.01, TEST_LOCATION );
935 int UtcDaliCameraActorCheckLookAtAndFreeLookViews03(void)
937 TestApplication application;
938 Stage stage = Stage::GetCurrent();
939 Vector2 stageSize = stage.GetSize();
941 Vector3 targetPosition(Vector3::ZERO);
943 CameraActor lookAtCameraActor = CameraActor::New(stageSize);
944 lookAtCameraActor.SetType(Camera::LOOK_AT_TARGET);
945 lookAtCameraActor.SetTargetPosition(targetPosition);
946 lookAtCameraActor.SetParentOrigin(ParentOrigin::CENTER);
947 stage.Add(lookAtCameraActor);
949 Vector3 cameraOffset( 0.f, 0.f, 100.f );
951 CameraActor freeLookCameraActor = CameraActor::New(stageSize);
952 freeLookCameraActor.SetType(Camera::FREE_LOOK);
953 freeLookCameraActor.SetParentOrigin(ParentOrigin::CENTER);
955 Quaternion cameraOrientation( Radian(Degree(180.f)), Vector3::YAXIS );
956 freeLookCameraActor.SetPosition(cameraOffset);
957 freeLookCameraActor.SetRotation(cameraOrientation);
959 Actor cameraAnchor = Actor::New();
960 cameraAnchor.Add(lookAtCameraActor);
961 stage.Add(cameraAnchor);
964 for( float angle = 1.f; angle <= 180.f; angle += 1.f )
966 Quaternion rotation(Radian(Degree(angle)), Vector3::YAXIS);
968 lookAtCameraActor.SetPosition( rotation.Rotate( cameraOffset ) );
969 cameraAnchor.SetRotation( rotation );
971 application.SendNotification();
972 application.Render();
973 application.SendNotification();
974 application.Render();
976 Matrix freeLookViewMatrix;
977 freeLookCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(freeLookViewMatrix);
979 Matrix freeLookWorld = freeLookCameraActor.GetCurrentWorldMatrix();
981 Matrix freeLookTest(false);
982 Matrix::Multiply( freeLookTest, freeLookViewMatrix, freeLookWorld);
983 DALI_TEST_EQUALS( freeLookTest, Matrix::IDENTITY, 0.01f, TEST_LOCATION);