From afe89aff9c7c3bdd7dd3daa56cab03a8eb56880e Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Mon, 8 Aug 2016 15:34:31 +0100 Subject: [PATCH] VR: Fixed frustum position. Added stage::GetCamera() API for testing Change-Id: Ibee5e7d680382a225b72377d9a28efe7eaf71180 --- dali/internal/event/common/stage-impl.cpp | 48 +++++++++++++++++++++++++------ dali/internal/event/common/stage-impl.h | 9 ++++++ dali/public-api/common/stage.cpp | 9 +++++- dali/public-api/common/stage.h | 12 +++++--- 4 files changed, 64 insertions(+), 14 deletions(-) diff --git a/dali/internal/event/common/stage-impl.cpp b/dali/internal/event/common/stage-impl.cpp index c5ce49e..678d250 100644 --- a/dali/internal/event/common/stage-impl.cpp +++ b/dali/internal/event/common/stage-impl.cpp @@ -245,8 +245,15 @@ void Stage::CreateDefaultCameraActor() // children of the default layer, can be positioned at (0,0) and // be at the top-left of the viewport. mDefaultCamera = CameraActor::New( Size::ZERO ); - mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER); - Add(*(mDefaultCamera.Get())); + mDefaultCamera->SetParentOrigin( ParentOrigin::CENTER ); + mDefaultCamera->SetAnchorPoint( AnchorPoint::CENTER ); + Add( *( mDefaultCamera.Get() ) ); +} + +//TODOVR +Dali::CameraActor Stage::GetCameraActor() +{ + return Dali::CameraActor( mDefaultCamera.Get() ); } Actor& Stage::GetDefaultRootActor() @@ -332,7 +339,6 @@ void Stage::SetViewMode( ViewMode viewMode ) mDefaultCamera->Add( *mStereoInfo[RIGHT].camera.Get() ); mStereoInfo[RIGHT].renderTask = mRenderTaskList->CreateTask(); mStereoInfo[RIGHT].renderTask.SetClearColor( Vector4( 1.0f, 0.0f, 0.0f, 1.0f ) ); - mStereoInfo[RIGHT].renderTask.SetCameraActor( Dali::CameraActor( mStereoInfo[RIGHT].camera.Get() ) ); mStereoInfo[RIGHT].camera->SetType( Dali::Camera::FREE_LOOK ); } @@ -372,12 +378,11 @@ void Stage::SetViewMode( ViewMode viewMode ) mStereoInfo[LEFT].camera->SetPerspectiveProjection( mSize, Vector2( 0.0f, stereoBase) ); mStereoInfo[LEFT].camera->SetAspectRatio( aspect ); - mStereoInfo[LEFT].camera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS ); mStereoInfo[LEFT].camera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); mStereoInfo[LEFT].renderTask.SetViewport( Viewport(0, mSize.height * 0.5f, mSize.width, mSize.height * 0.5f ) ); - mStereoInfo[RIGHT].camera->SetPerspectiveProjection( mSize, Vector2( 0.0, -stereoBase) ); + mStereoInfo[RIGHT].camera->SetPerspectiveProjection( mSize, Vector2( 0.0, -stereoBase) ); mStereoInfo[RIGHT].camera->SetAspectRatio( aspect ); mStereoInfo[RIGHT].camera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS ); mStereoInfo[RIGHT].camera->SetPosition( Vector3( -stereoBase, 0.0f, 0.0f ) ); @@ -423,13 +428,16 @@ void Stage::SetViewMode( ViewMode viewMode ) const float viewPortWidth = mSize.x / 2.0f; const float cameraAspect = pixelAspect / ( sizeX / viewPortWidth ); - mStereoInfo[LEFT].camera->SetPerspectiveProjection( Size( sizeX, mSize.height ), Vector2( stereoBase, 0.0f ) ); + // We should not alter the frustums based on eye separation. + mStereoInfo[LEFT].camera->SetPerspectiveProjection( Size( sizeX, mSize.height ), Vector2::ZERO ); + //mStereoInfo[LEFT].camera->SetPerspectiveProjection( Size( sizeX, mSize.height ), Vector2( stereoBase, 0.0f ) ); mStereoInfo[LEFT].camera->SetAspectRatio( cameraAspect ); mStereoInfo[LEFT].camera->SetOrientation( Dali::ANGLE_0, Vector3::ZAXIS ); mStereoInfo[LEFT].camera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); mStereoInfo[LEFT].renderTask.SetViewport( Viewport( 0, 0, viewPortWidth, mSize.height ) ); - mStereoInfo[RIGHT].camera->SetPerspectiveProjection( Size( sizeX, mSize.height ), Vector2( -stereoBase, 0.0f ) ); + mStereoInfo[RIGHT].camera->SetPerspectiveProjection( Size( sizeX, mSize.height ), Vector2( 0.0f, 0.0f ) ); + //mStereoInfo[RIGHT].camera->SetPerspectiveProjection( Size( sizeX, mSize.height ), Vector2( -stereoBase, 0.0f ) ); mStereoInfo[RIGHT].camera->SetAspectRatio( cameraAspect ); mStereoInfo[RIGHT].camera->SetOrientation( Dali::ANGLE_0, Vector3::ZAXIS ); mStereoInfo[RIGHT].camera->SetPosition( Vector3( -stereoBase, 0.0f, 0.0f ) ); @@ -447,14 +455,16 @@ void Stage::SetViewMode( ViewMode viewMode ) // Recalculate fov based on viewport size const float fov = std::atan( viewPortHeight / ( 2.0f * mSize.width ) ); - mStereoInfo[LEFT].camera->SetPerspectiveProjection( Size( mSize.width, sizeY ), Vector2( 0.0f, stereoBase ) ); + mStereoInfo[LEFT].camera->SetPerspectiveProjection( Size( mSize.width, sizeY ), Vector2::ZERO ); + //mStereoInfo[LEFT].camera->SetPerspectiveProjection( Size( mSize.width, sizeY ), Vector2( 0.0f, stereoBase ) ); mStereoInfo[LEFT].camera->SetAspectRatio( cameraAspect ); mStereoInfo[LEFT].camera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS ); mStereoInfo[LEFT].camera->SetPosition( Vector3( stereoBase, 0.0f, 0.0f ) ); mStereoInfo[LEFT].camera->SetFieldOfView( fov ); mStereoInfo[LEFT].renderTask.SetViewport( Viewport( 0, viewPortHeight, mSize.width, viewPortHeight ) ); - mStereoInfo[RIGHT].camera->SetPerspectiveProjection( Size( mSize.width, sizeY ), Vector2( 0.0, -stereoBase ) ); + mStereoInfo[RIGHT].camera->SetPerspectiveProjection( Size( mSize.width, sizeY ), Vector2::ZERO ); + //mStereoInfo[RIGHT].camera->SetPerspectiveProjection( Size( mSize.width, sizeY ), Vector2( 0.0, -stereoBase ) ); mStereoInfo[RIGHT].camera->SetAspectRatio( cameraAspect ); mStereoInfo[RIGHT].camera->SetOrientation( -Dali::ANGLE_90, Vector3::ZAXIS ); mStereoInfo[RIGHT].camera->SetPosition( Vector3( -stereoBase, 0.0f, 0.0f ) ); @@ -470,6 +480,26 @@ void Stage::SetViewMode( ViewMode viewMode ) } } } + + + //TODOVR: Animate the look angle for testing. +#if 0 + Quaternion q = mDefaultCamera->GetCurrentOrientation(); + + float duration = 3.0f; + mCamAnim = Dali::Animation::New( duration ); + + Dali::CameraActor a = Dali::CameraActor( ( mDefaultCamera.Get() ) ); + + float lookAngle = 20.0f; + mDefaultCamera->SetOrientation( Degree( ( 180.0f - ( lookAngle / 2.0f ) ) ), Vector3::YAXIS ); + + mCamAnim.AnimateBy( Dali::Property( a, Dali::Actor::Property::ORIENTATION ), Quaternion( Radian( Degree( lookAngle ) ), Vector3::YAXIS ), AlphaFunction::EASE_IN_OUT, TimePeriod( 0.0f, duration / 2.0f ) ); + mCamAnim.AnimateBy( Dali::Property( a, Dali::Actor::Property::ORIENTATION ), Quaternion( Radian( Degree( -lookAngle ) ), Vector3::YAXIS ), AlphaFunction::EASE_IN_OUT, TimePeriod( duration / 2.0f, duration / 2.0f ) ); + mCamAnim.SetLooping( true ); + + mDefaultCamera->SetOrientation( Radian( Math::PI * 0.95f ), Vector3::YAXIS ); +#endif } ViewMode Stage::GetViewMode() const diff --git a/dali/internal/event/common/stage-impl.h b/dali/internal/event/common/stage-impl.h index e97839c..af85a02 100644 --- a/dali/internal/event/common/stage-impl.h +++ b/dali/internal/event/common/stage-impl.h @@ -185,6 +185,13 @@ public: */ virtual CameraActor& GetDefaultCameraActor(); + /** + * TODOVR + * Retrieve the main camera actor. + * @return The default camera actor. + */ + Dali::CameraActor GetCameraActor(); + // Layers /** @@ -457,6 +464,8 @@ private: IntrusivePtr mDefaultCamera; + Dali::Animation mCamAnim;//TODOVR + ViewMode mViewMode; float mStereoBase; diff --git a/dali/public-api/common/stage.cpp b/dali/public-api/common/stage.cpp index 3d809a0..4150314 100644 --- a/dali/public-api/common/stage.cpp +++ b/dali/public-api/common/stage.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ #include #include #include +#include namespace Dali { @@ -129,6 +130,12 @@ ObjectRegistry Stage::GetObjectRegistry() const return ObjectRegistry(&internal); } +//TODOVR +Dali::CameraActor Stage::GetCameraActor() +{ + return GetImplementation(*this).GetCameraActor(); +} + void Stage::KeepRendering( float durationSeconds ) { GetImplementation(*this).KeepRendering( durationSeconds ); diff --git a/dali/public-api/common/stage.h b/dali/public-api/common/stage.h index 50e7930..625d5f7 100644 --- a/dali/public-api/common/stage.h +++ b/dali/public-api/common/stage.h @@ -1,8 +1,8 @@ -#ifndef __DALI_STAGE_H__ -#define __DALI_STAGE_H__ +#ifndef DALI_STAGE_H +#define DALI_STAGE_H /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,6 +39,7 @@ class Layer; class ObjectRegistry; class TouchData; class RenderTaskList; +class CameraActor; struct Vector2; struct Vector3; struct Vector4; @@ -234,6 +235,9 @@ public: */ ObjectRegistry GetObjectRegistry() const; + //TODOVR: For testing only. + Dali::CameraActor GetCameraActor(); + // Rendering /** @@ -370,4 +374,4 @@ public: // Not intended for application developers } // namespace Dali -#endif // __DALI_STAGE_H__ +#endif // DALI_STAGE_H -- 2.7.4