#include <dali-scene3d/public-api/controls/model/model.h>
#include <dali-scene3d/public-api/controls/scene-view/scene-view.h>
+#include <dali/devel-api/actors/camera-actor-devel.h>
using namespace Dali;
DALI_TEST_CHECK(camera1.GetParent());
DALI_TEST_EQUALS(camera1.GetParent(), camera2.GetParent(), TEST_LOCATION);
+ view.SelectCamera("camera1");
Scene3D::Model model = Scene3D::Model::New();
view.Add(model);
model.Add(camera1);
DALI_TEST_EQUALS(camera1.GetParent(), model, TEST_LOCATION);
- view.SelectCamera("camera1");
DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
DALI_TEST_CHECK(camera1.GetParent());
DALI_TEST_CHECK(camera2.GetParent());
DALI_TEST_NOT_EQUALS(camera1, view.GetSelectedCamera(), 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Functor to test whether a Finish signal is emitted
+struct TransitionFinishCheck
+{
+ TransitionFinishCheck(bool& signalReceived)
+ : mSignalReceived(signalReceived)
+ {
+ }
+
+ void operator()(Scene3D::SceneView& sceneView)
+ {
+ mSignalReceived = true;
+ }
+
+ void Reset()
+ {
+ mSignalReceived = false;
+ }
+
+ void CheckSignalReceived()
+ {
+ if(!mSignalReceived)
+ {
+ tet_printf("Expected Finish signal was not received\n");
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+ }
+
+ void CheckSignalNotReceived()
+ {
+ if(mSignalReceived)
+ {
+ tet_printf("Unexpected Finish signal was received\n");
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+ }
+
+ bool& mSignalReceived; // owned by individual tests
+};
+
+int UtcDaliSceneViewCameraTransitionFail(void)
+{
+ ToolkitTestApplication application;
+
+ Scene3D::SceneView view = Scene3D::SceneView::New();
+ application.GetScene().Add(view);
+
+ CameraActor camera1 = CameraActor::New3DCamera();
+ camera1.SetProperty(Dali::Actor::Property::NAME, "camera1");
+ view.AddCamera(camera1);
+ DALI_TEST_CHECK(!camera1.GetParent());
+ view.SelectCamera("camera1");
+ DALI_TEST_CHECK(camera1.GetParent());
+ DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
+
+ camera1.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * -50.0f);
+ view.Add(camera1);
+
+ bool signalReceived(false);
+ TransitionFinishCheck finishCheck(signalReceived);
+ view.CameraTransitionFinishedSignal().Connect(&application, finishCheck);
+
+ view.StartCameraTransition("camera1", 1.0f);
+
+ application.SendNotification();
+ application.Render(500);
+ application.SendNotification();
+
+ // We didn't expect the animation to finish yet
+ finishCheck.CheckSignalNotReceived();
+
+ application.SendNotification();
+ application.Render(600);
+ application.SendNotification();
+
+ finishCheck.CheckSignalNotReceived();
+
+ CameraActor finalCamera = view.GetSelectedCamera();
+ DALI_TEST_EQUALS(finalCamera, camera1, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliSceneViewCameraChangeDuringTransition(void)
+{
+ ToolkitTestApplication application;
+
+ Scene3D::SceneView view = Scene3D::SceneView::New();
+ application.GetScene().Add(view);
+
+ CameraActor camera1 = CameraActor::New3DCamera();
+ camera1.SetProperty(Dali::Actor::Property::NAME, "camera1");
+ view.AddCamera(camera1);
+ DALI_TEST_CHECK(!camera1.GetParent());
+ view.SelectCamera("camera1");
+ DALI_TEST_CHECK(camera1.GetParent());
+ DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
+
+ camera1.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * -50.0f);
+ view.Add(camera1);
+
+ CameraActor camera2 = CameraActor::New3DCamera();
+ camera2.SetProperty(Dali::Actor::Property::NAME, "camera2");
+ view.AddCamera(camera2);
+ camera2.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * 100.0f);
+
+ application.SendNotification();
+ application.Render();
+
+ bool signalReceived(false);
+ TransitionFinishCheck finishCheck(signalReceived);
+ view.CameraTransitionFinishedSignal().Connect(&application, finishCheck);
+
+ view.StartCameraTransition("camera2", 1.0f);
+
+ CameraActor camera3 = CameraActor::New3DCamera();
+ camera3.SetProperty(Dali::Actor::Property::NAME, "camera3");
+ view.AddCamera(camera3);
+ view.SelectCamera("camera3");
+
+ DALI_TEST_NOT_EQUALS(camera3, view.GetSelectedCamera(), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(500);
+ application.SendNotification();
+
+ // We didn't expect the animation to finish yet
+ finishCheck.CheckSignalNotReceived();
+
+ CameraActor currentCamera = view.GetSelectedCamera();
+ DALI_TEST_CHECK(currentCamera);
+ DALI_TEST_NOT_EQUALS(currentCamera, camera1, 0.0f, TEST_LOCATION);
+ DALI_TEST_NOT_EQUALS(currentCamera, camera2, 0.0f, TEST_LOCATION);
+
+ view.SelectCamera(view.GetCameraCount() - 1);
+ DALI_TEST_NOT_EQUALS(camera3, view.GetSelectedCamera(), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(currentCamera, view.GetSelectedCamera(), TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(600);
+ application.SendNotification();
+
+ finishCheck.CheckSignalReceived();
+
+ CameraActor finalCamera = view.GetSelectedCamera();
+ DALI_TEST_EQUALS(finalCamera, camera2, TEST_LOCATION);
+
+ view.SelectCamera("camera3");
+ DALI_TEST_EQUALS(camera3, view.GetSelectedCamera(), TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliSceneViewStartCameraTransitionDuringTransition(void)
+{
+ ToolkitTestApplication application;
+
+ Scene3D::SceneView view = Scene3D::SceneView::New();
+ application.GetScene().Add(view);
+
+ CameraActor camera1 = CameraActor::New3DCamera();
+ camera1.SetProperty(Dali::Actor::Property::NAME, "camera1");
+ view.AddCamera(camera1);
+ DALI_TEST_CHECK(!camera1.GetParent());
+ view.SelectCamera("camera1");
+ DALI_TEST_CHECK(camera1.GetParent());
+ DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
+
+ camera1.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * -50.0f);
+ view.Add(camera1);
+
+ CameraActor camera2 = CameraActor::New3DCamera();
+ camera2.SetProperty(Dali::Actor::Property::NAME, "camera2");
+ view.AddCamera(camera2);
+ camera2.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * 100.0f);
+
+ application.SendNotification();
+ application.Render();
+
+ bool signalReceived(false);
+ TransitionFinishCheck finishCheck(signalReceived);
+ view.CameraTransitionFinishedSignal().Connect(&application, finishCheck);
+
+ view.StartCameraTransition("camera2", 1.0f);
+
+ application.SendNotification();
+ application.Render(500);
+ application.SendNotification();
+
+ // We didn't expect the animation to finish yet
+ finishCheck.CheckSignalNotReceived();
+
+ CameraActor camera3 = CameraActor::New3DCamera();
+ camera3.SetProperty(Dali::Actor::Property::NAME, "camera3");
+ view.AddCamera(camera3);
+
+ view.StartCameraTransition("camera3", 1.0f);
+
+ application.SendNotification();
+ application.Render(600);
+ application.SendNotification();
+
+ finishCheck.CheckSignalReceived();
+
+ CameraActor finalCamera = view.GetSelectedCamera();
+ DALI_TEST_EQUALS(finalCamera, camera2, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliSceneViewCameraTransition1(void)
+{
+ ToolkitTestApplication application;
+
+ Scene3D::SceneView view = Scene3D::SceneView::New();
+ application.GetScene().Add(view);
+
+ CameraActor camera1 = CameraActor::New3DCamera();
+ camera1.SetProperty(Dali::Actor::Property::NAME, "camera1");
+ view.AddCamera(camera1);
+ DALI_TEST_CHECK(!camera1.GetParent());
+ view.SelectCamera("camera1");
+ DALI_TEST_CHECK(camera1.GetParent());
+ DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
+
+ Scene3D::Model model1 = Scene3D::Model::New();
+ model1.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * -50.0f);
+ view.Add(model1);
+
+ camera1.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * -50.0f);
+ camera1.SetNearClippingPlane(10.0f);
+ camera1.SetFarClippingPlane(100.0f);
+ model1.Add(camera1);
+
+ CameraActor camera2 = CameraActor::New3DCamera();
+ camera2.SetProperty(Dali::Actor::Property::NAME, "camera2");
+ view.AddCamera(camera2);
+ camera2.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * 100.0f);
+ camera2.SetNearClippingPlane(5.0f);
+ camera2.SetFarClippingPlane(50.0f);
+
+ Scene3D::Model model2 = Scene3D::Model::New();
+ model2.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * 100.0f);
+ view.Add(model2);
+ model2.Add(camera2);
+
+ application.SendNotification();
+ application.Render();
+
+ camera1.SetProperty(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION, Dali::DevelCameraActor::ProjectionDirection::VERTICAL);
+ camera2.SetProperty(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION, Dali::DevelCameraActor::ProjectionDirection::HORIZONTAL);
+ camera1.SetFieldOfView(1.0f); // Vertical : 1.0f, Horizontal : 0.533293254f
+ camera2.SetFieldOfView(1.0f); // Vertical : 1.65924551f, Horizontal : 1.0f
+ camera1.SetAspectRatio(0.5f);
+ camera2.SetAspectRatio(0.5f);
+ tet_printf("camera1 fov : %f\n", camera1.GetFieldOfView());
+ tet_printf("camera2 fov : %f\n", camera2.GetFieldOfView());
+ tet_printf("camera1 aspect : %f\n", camera1.GetAspectRatio());
+ tet_printf("camera2 aspect : %f\n", camera2.GetAspectRatio());
+ tet_printf("camera1 direction : %d\n", camera1.GetProperty<Dali::DevelCameraActor::ProjectionDirection>(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION));
+ tet_printf("camera2 direction : %d\n", camera2.GetProperty<Dali::DevelCameraActor::ProjectionDirection>(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION));
+
+ bool signalReceived(false);
+ TransitionFinishCheck finishCheck(signalReceived);
+ view.CameraTransitionFinishedSignal().Connect(&application, finishCheck);
+
+ view.StartCameraTransition("camera2", 1.0f);
+
+ application.SendNotification();
+ application.Render(500);
+ application.SendNotification();
+
+ // We didn't expect the animation to finish yet
+ finishCheck.CheckSignalNotReceived();
+
+ CameraActor currentCamera = view.GetSelectedCamera();
+ DALI_TEST_CHECK(currentCamera);
+ DALI_TEST_NOT_EQUALS(currentCamera, camera1, 0.0f, TEST_LOCATION);
+ DALI_TEST_NOT_EQUALS(currentCamera, camera2, 0.0f, TEST_LOCATION);
+
+ Vector3 currentPosition = currentCamera.GetCurrentProperty<Vector3>(Dali::Actor::Property::POSITION);
+ DALI_TEST_EQUALS(currentPosition, Vector3::ONE * 50.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(currentCamera.GetNearClippingPlane(), 5.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(currentCamera.GetFarClippingPlane(), 100.0f, TEST_LOCATION);
+ float currentFov = (0.533293254f + 1.0f) / 2.0f;
+ DALI_TEST_EQUALS(currentCamera.GetProperty<Dali::DevelCameraActor::ProjectionDirection>(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION), Dali::DevelCameraActor::ProjectionDirection::HORIZONTAL, TEST_LOCATION);
+ DALI_TEST_EQUALS(currentCamera.GetCurrentProperty<float>(Dali::CameraActor::Property::FIELD_OF_VIEW), currentFov, 0.05f, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(600);
+ application.SendNotification();
+
+ finishCheck.CheckSignalReceived();
+
+ CameraActor finalCamera = view.GetSelectedCamera();
+ DALI_TEST_EQUALS(finalCamera, camera2, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliSceneViewCameraTransition2(void)
+{
+ ToolkitTestApplication application;
+
+ Scene3D::SceneView view = Scene3D::SceneView::New();
+ application.GetScene().Add(view);
+
+ CameraActor camera1 = CameraActor::New3DCamera();
+ camera1.SetProperty(Dali::Actor::Property::NAME, "camera1");
+ view.AddCamera(camera1);
+ DALI_TEST_CHECK(!camera1.GetParent());
+ view.SelectCamera("camera1");
+ DALI_TEST_CHECK(camera1.GetParent());
+ DALI_TEST_EQUALS(camera1, view.GetSelectedCamera(), TEST_LOCATION);
+
+ Scene3D::Model model1 = Scene3D::Model::New();
+ model1.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * -50.0f);
+ view.Add(model1);
+
+ camera1.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * -50.0f);
+ camera1.SetNearClippingPlane(10.0f);
+ camera1.SetFarClippingPlane(100.0f);
+ model1.Add(camera1);
+
+ CameraActor camera2 = CameraActor::New3DCamera();
+ camera2.SetProperty(Dali::Actor::Property::NAME, "camera2");
+ view.AddCamera(camera2);
+ camera2.SetProperty(Dali::Actor::Property::POSITION, Vector3::ONE * 200.0f);
+ camera2.SetNearClippingPlane(5.0f);
+ camera2.SetFarClippingPlane(50.0f);
+ // Camera2 is not added on SceneView, it will added on root layer automatically.
+
+ application.SendNotification();
+ application.Render();
+
+ bool signalReceived(false);
+ TransitionFinishCheck finishCheck(signalReceived);
+ view.CameraTransitionFinishedSignal().Connect(&application, finishCheck);
+
+ camera1.SetProjectionMode(Dali::Camera::ProjectionMode::ORTHOGRAPHIC_PROJECTION);
+ camera2.SetProjectionMode(Dali::Camera::ProjectionMode::ORTHOGRAPHIC_PROJECTION);
+ camera1.SetProperty(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION, Dali::DevelCameraActor::ProjectionDirection::VERTICAL);
+ camera2.SetProperty(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION, Dali::DevelCameraActor::ProjectionDirection::HORIZONTAL);
+
+ camera1.SetProperty(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE, 10.0f); // Vertical : 10.0f, Horizontal : 5.0f
+ camera2.SetProperty(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE, 10.0f); // Vertical : 20.0f, Horizontal : 10.0f
+ camera1.SetAspectRatio(0.5f);
+ camera2.SetAspectRatio(0.5f);
+
+ tet_printf("camera1 fov : %f\n", camera1.GetProperty<float>(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE));
+ tet_printf("camera2 fov : %f\n", camera2.GetProperty<float>(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE));
+ tet_printf("camera1 aspect : %f\n", camera1.GetAspectRatio());
+ tet_printf("camera2 aspect : %f\n", camera2.GetAspectRatio());
+ tet_printf("camera1 direction : %f\n", camera1.GetProperty<Dali::DevelCameraActor::ProjectionDirection>(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION));
+ tet_printf("camera2 direction : %f\n", camera2.GetProperty<Dali::DevelCameraActor::ProjectionDirection>(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION));
+
+ int camera2Index = view.GetCameraCount() - 1;
+ view.StartCameraTransition(camera2Index, 1.0f);
+
+ application.SendNotification();
+ application.Render(500);
+ application.SendNotification();
+
+ // We didn't expect the animation to finish yet
+ finishCheck.CheckSignalNotReceived();
+
+ CameraActor currentCamera = view.GetSelectedCamera();
+ DALI_TEST_CHECK(currentCamera);
+ DALI_TEST_NOT_EQUALS(currentCamera, camera1, 0.0f, TEST_LOCATION);
+ DALI_TEST_NOT_EQUALS(currentCamera, camera2, 0.0f, TEST_LOCATION);
+
+ Vector3 currentPosition = currentCamera.GetCurrentProperty<Vector3>(Dali::Actor::Property::POSITION);
+ DALI_TEST_EQUALS(currentPosition, Vector3::ONE * 50.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(currentCamera.GetNearClippingPlane(), 5.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(currentCamera.GetFarClippingPlane(), 100.0f, TEST_LOCATION);
+ float currentOrthographicSize = (5.0f + 10.0f) / 2.0f;
+ DALI_TEST_EQUALS(currentCamera.GetProperty<Dali::DevelCameraActor::ProjectionDirection>(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION), Dali::DevelCameraActor::ProjectionDirection::HORIZONTAL, TEST_LOCATION);
+ DALI_TEST_EQUALS(currentCamera.GetCurrentProperty<float>(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE), currentOrthographicSize, 0.05f, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(600);
+ application.SendNotification();
+
+ finishCheck.CheckSignalReceived();
+
+ CameraActor finalCamera = view.GetSelectedCamera();
+ DALI_TEST_EQUALS(finalCamera, camera2, TEST_LOCATION);
+
END_TEST;
}
\ No newline at end of file
#include <dali-toolkit/internal/controls/control/control-data-impl.h>
#include <dali-toolkit/public-api/image-loader/image-url.h>
#include <dali-toolkit/public-api/image-loader/image.h>
+#include <dali/devel-api/actors/actor-devel.h>
#include <dali/devel-api/actors/camera-actor-devel.h>
#include <dali/devel-api/adaptor-framework/image-loading.h>
#include <dali/devel-api/adaptor-framework/window-devel.h>
return false;
}
+void ConvertFovFromVerticalToHorizontal(float aspect, float& fov)
+{
+ fov = 2.0f * (float)std::atan(std::tan(fov * 0.5f) * aspect);
+}
+
+void ConvertFovFromHorizontalToVertical(float aspect, float& fov)
+{
+ fov = 2.0f * (float)std::atan(std::tan(fov * 0.5f) / aspect);
+}
+
} // anonymous namespace
SceneView::SceneView()
}
mSelectedCamera.OffSceneSignal().Disconnect(this, &SceneView::OnCameraDisconnected);
+ if(mInCameraTransition)
+ {
+ mTransitionAnimation.Stop();
+ ResetTransition();
+ }
+
// Request image resource GC
Dali::Scene3D::Internal::ImageResourceLoader::RequestGarbageCollect();
}
void SceneView::SelectCamera(uint32_t index)
{
+ if(mInCameraTransition)
+ {
+ DALI_LOG_ERROR("Cannot change camera during Camera Transition.\n");
+ return;
+ }
UpdateCamera(GetCamera(index));
}
void SceneView::SelectCamera(const std::string& name)
{
+ if(mInCameraTransition)
+ {
+ DALI_LOG_ERROR("Cannot change camera during Camera Transition.\n");
+ return;
+ }
UpdateCamera(GetCamera(name));
}
+void SceneView::StartCameraTransition(uint32_t index, float durationSeconds, Dali::AlphaFunction alphaFunction)
+{
+ RegisterCameraTransition(GetCamera(index), durationSeconds, alphaFunction);
+}
+
+void SceneView::StartCameraTransition(std::string name, float durationSeconds, Dali::AlphaFunction alphaFunction)
+{
+ RegisterCameraTransition(GetCamera(name), durationSeconds, alphaFunction);
+}
+
void SceneView::RegisterSceneItem(Scene3D::Internal::LightObserver* item)
{
if(item)
return mCaptureFinishedSignal;
}
+Dali::Scene3D::SceneView::CameraTransitionFinishedSignalType& SceneView::CameraTransitionFinishedSignal()
+{
+ return mCameraTransitionFinishedSignal;
+}
+
Dali::Scene3D::Loader::ShaderManagerPtr SceneView::GetShaderManager() const
{
return mShaderManager;
mFrameBuffer.Reset();
mShadowFrameBuffer.Reset();
+ if(mInCameraTransition)
+ {
+ mTransitionAnimation.Stop();
+ ResetTransition();
+ }
+
Control::OnSceneDisconnection();
}
void SceneView::OnCameraDisconnected(Dali::Actor actor)
{
- CameraActor selectedCamera = GetSelectedCamera();
- if(selectedCamera == actor)
+ if(!mIsProcessorRegistered)
+ {
+ mIsProcessorRegistered = true;
+ Adaptor::Get().RegisterProcessorOnce(*this);
+ }
+}
+
+void SceneView::RegisterCameraTransition(CameraActor destinationCamera, float durationSeconds, Dali::AlphaFunction alphaFunction)
+{
+ if(mInCameraTransition)
+ {
+ DALI_LOG_ERROR("Cannot start Camera transition before previous Camera transition is finished.\n");
+ return;
+ }
+
+ mTransitionSourceCamera = GetSelectedCamera();
+ mTransitionDestinationCamera = destinationCamera;
+ mTransitionDurationSeconds = durationSeconds;
+ mTransitionAlphaFunction = alphaFunction;
+ mInCameraTransition = true;
+
+ if(!mIsProcessorRegistered)
+ {
+ mIsProcessorRegistered = true;
+ Adaptor::Get().RegisterProcessorOnce(*this);
+ }
+}
+
+void SceneView::RequestCameraTransition()
+{
+ if(mTransitionSourceCamera && mTransitionDestinationCamera && !(mTransitionSourceCamera == mTransitionDestinationCamera))
{
- if(!selectedCamera || !CheckInside(mRootLayer, selectedCamera))
+ Vector3 sourceWorldPosition = mTransitionSourceCamera.GetProperty<Vector3>(Dali::Actor::Property::WORLD_POSITION);
+ Quaternion sourceWorldOrientation = mTransitionSourceCamera.GetProperty<Quaternion>(Dali::Actor::Property::WORLD_ORIENTATION);
+
+ if(!CheckInside(mRootLayer, mTransitionDestinationCamera))
+ {
+ mRootLayer.Add(mTransitionDestinationCamera);
+ }
+
+ Vector3 destinationWorldPosition;
+ Quaternion destinationWorldOrientation;
+ Vector3 destinationWorldScale;
+ Dali::Matrix destinationWorldTransform = Dali::DevelActor::GetWorldTransform(mTransitionDestinationCamera);
+ destinationWorldTransform.GetTransformComponents(destinationWorldPosition, destinationWorldOrientation, destinationWorldScale);
+
+ if(!mTransitionAnimation)
+ {
+ mTransitionAnimation = Dali::Animation::New(mTransitionDurationSeconds);
+ }
+
+ if(mTransitionAnimation.GetState() != Animation::State::STOPPED)
+ {
+ mTransitionAnimation.Stop();
+ }
+ mTransitionAnimation.Clear();
+
+ Dali::KeyFrames positionKeyFrames = Dali::KeyFrames::New();
+ positionKeyFrames.Add(0.0f, sourceWorldPosition);
+ positionKeyFrames.Add(1.0f, destinationWorldPosition);
+
+ Dali::KeyFrames orientationKeyFrames = Dali::KeyFrames::New();
+ orientationKeyFrames.Add(0.0f, sourceWorldOrientation);
+ orientationKeyFrames.Add(1.0f, destinationWorldOrientation);
+
+ mTransitionCamera = Dali::CameraActor::New3DCamera();
+ mTransitionCamera.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+ mTransitionCamera.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+ mRootLayer.Add(mTransitionCamera);
+
+ mTransitionAnimation.AnimateBetween(Dali::Property(mTransitionCamera, Dali::Actor::Property::POSITION), positionKeyFrames, mTransitionAlphaFunction, Dali::Animation::Interpolation::LINEAR);
+ mTransitionAnimation.AnimateBetween(Dali::Property(mTransitionCamera, Dali::Actor::Property::ORIENTATION), orientationKeyFrames, mTransitionAlphaFunction, Dali::Animation::Interpolation::LINEAR);
+
+ Dali::DevelCameraActor::ProjectionDirection sourceProjectionDirection = mTransitionSourceCamera.GetProperty<Dali::DevelCameraActor::ProjectionDirection>(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION);
+ Dali::DevelCameraActor::ProjectionDirection destinationProjectionDirection = mTransitionDestinationCamera.GetProperty<Dali::DevelCameraActor::ProjectionDirection>(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION);
+ if(mTransitionDestinationCamera.GetProjectionMode() == Dali::Camera::ProjectionMode::PERSPECTIVE_PROJECTION)
+ {
+ float sourceFieldOfView = mTransitionSourceCamera.GetFieldOfView();
+ float destinationFieldOfView = mTransitionDestinationCamera.GetFieldOfView();
+
+ if(sourceProjectionDirection != destinationProjectionDirection)
+ {
+ float aspect = mTransitionDestinationCamera.GetAspectRatio();
+ if(destinationProjectionDirection == Dali::DevelCameraActor::ProjectionDirection::VERTICAL)
+ {
+ ConvertFovFromHorizontalToVertical(aspect, sourceFieldOfView);
+ }
+ else
+ {
+ ConvertFovFromVerticalToHorizontal(aspect, sourceFieldOfView);
+ }
+ }
+
+ KeyFrames fieldOfViewKeyFrames = KeyFrames::New();
+ fieldOfViewKeyFrames.Add(0.0f, sourceFieldOfView);
+ fieldOfViewKeyFrames.Add(1.0f, destinationFieldOfView);
+ mTransitionAnimation.AnimateBetween(Dali::Property(mTransitionCamera, Dali::CameraActor::Property::FIELD_OF_VIEW), fieldOfViewKeyFrames, mTransitionAlphaFunction, Dali::Animation::Interpolation::LINEAR);
+ }
+ else
{
- UpdateCamera(mDefaultCamera);
+ float sourceOrthographicSize = mTransitionSourceCamera.GetProperty<float>(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE);
+ float destinationOrthographicSize = mTransitionDestinationCamera.GetProperty<float>(Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE);
+
+ if(sourceProjectionDirection != destinationProjectionDirection)
+ {
+ float aspect = mTransitionDestinationCamera.GetAspectRatio();
+ if(destinationProjectionDirection == Dali::DevelCameraActor::ProjectionDirection::VERTICAL)
+ {
+ sourceOrthographicSize = sourceOrthographicSize / aspect;
+ }
+ else
+ {
+ sourceOrthographicSize = sourceOrthographicSize * aspect;
+ }
+ }
+
+ KeyFrames orthographicSizeKeyFrames = KeyFrames::New();
+ orthographicSizeKeyFrames.Add(0.0f, sourceOrthographicSize);
+ orthographicSizeKeyFrames.Add(1.0f, destinationOrthographicSize);
+ mTransitionAnimation.AnimateBetween(Dali::Property(mTransitionCamera, Dali::DevelCameraActor::Property::ORTHOGRAPHIC_SIZE), orthographicSizeKeyFrames, mTransitionAlphaFunction, Dali::Animation::Interpolation::LINEAR);
}
+
+ float destinationNearPlaneDistance = mTransitionDestinationCamera.GetNearClippingPlane();
+ float destinationFarPlaneDistance = mTransitionDestinationCamera.GetFarClippingPlane();
+ mTransitionCamera.SetNearClippingPlane(std::min(mTransitionSourceCamera.GetNearClippingPlane(), destinationNearPlaneDistance));
+ mTransitionCamera.SetFarClippingPlane(std::max(mTransitionSourceCamera.GetFarClippingPlane(), destinationFarPlaneDistance));
+
+ mTransitionCamera.SetProperty(Dali::DevelCameraActor::Property::PROJECTION_DIRECTION, destinationProjectionDirection);
+ mTransitionCamera.SetProjectionMode(mTransitionDestinationCamera.GetProjectionMode());
+
+ UpdateCamera(mTransitionCamera);
+
+ mTransitionAnimation.FinishedSignal().Connect(this, &SceneView::OnTransitionFinished);
+
+ mTransitionAnimation.Play();
+ }
+ else
+ {
+ ResetTransition();
+ }
+}
+
+void SceneView::ResetTransition()
+{
+ mTransitionCamera.Reset();
+ mTransitionSourceCamera.Reset();
+ mTransitionDestinationCamera.Reset();
+ mTransitionAnimation.Reset();
+ mInCameraTransition = false;
+}
+
+void SceneView::OnTransitionFinished(Animation& animation)
+{
+ UpdateCamera(mTransitionDestinationCamera);
+ ResetTransition();
+
+ auto self = Self();
+ Dali::Scene3D::SceneView handle(Dali::Scene3D::SceneView::DownCast(self));
+ mCameraTransitionFinishedSignal.Emit(handle);
+}
+
+void SceneView::Process(bool postProcessor)
+{
+ CameraActor selectedCamera = GetSelectedCamera();
+ if(!selectedCamera || !CheckInside(mRootLayer, selectedCamera))
+ {
+ UpdateCamera(mDefaultCamera);
+ }
+
+ if(mInCameraTransition && !mTransitionCamera)
+ {
+ RequestCameraTransition();
}
+
+ mIsProcessorRegistered = false;
}
} // namespace Internal