X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Frender-tasks%2Fscene-graph-camera.cpp;h=f6ecce5a4a8b5d8c60d850ed225c3926037b26de;hb=a06eafa8babd0523af3b6935e2c900347f96bfb8;hp=c9e4b7adabbb1abd362348f889b3fd436abc84ea;hpb=ab53e305cc7a1f47578d84cc89592c2601ce7ac7;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/render-tasks/scene-graph-camera.cpp b/dali/internal/update/render-tasks/scene-graph-camera.cpp index c9e4b7a..f6ecce5 100644 --- a/dali/internal/update/render-tasks/scene-graph-camera.cpp +++ b/dali/internal/update/render-tasks/scene-graph-camera.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2018 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. @@ -29,8 +29,8 @@ namespace // unnamed namespace { -const unsigned int UPDATE_COUNT = 2u; // Update projection or view matrix this many frames after a change -const unsigned int COPY_PREVIOUS_MATRIX = 1u; // Copy view or projection matrix from previous frame +const uint32_t UPDATE_COUNT = 2u; // Update projection or view matrix this many frames after a change +const uint32_t COPY_PREVIOUS_MATRIX = 1u; // Copy view or projection matrix from previous frame } namespace Dali @@ -45,6 +45,12 @@ namespace SceneGraph namespace { +template< typename T > +T Sign( T value ) +{ + return T( T(0) < value ) - T( value < T(0) ); +} + void LookAt(Matrix& result, const Vector3& eye, const Vector3& target, const Vector3& up) { Vector3 vZ = target - eye; @@ -59,7 +65,6 @@ void LookAt(Matrix& result, const Vector3& eye, const Vector3& target, const Vec result.SetInverseTransformComponents(vX, vY, vZ, eye); } - void Frustum(Matrix& result, float left, float right, float bottom, float top, float near, float far, bool invertYAxis) { float deltaZ = far - near; @@ -91,13 +96,12 @@ void Frustum(Matrix& result, float left, float right, float bottom, float top, f m[12] = m[13] = m[15] = 0.0f; } -void Perspective(Matrix& result, float fovy, float aspect, float near, float far, bool invertYAxis, const Vector2& stereoBias ) +void Perspective(Matrix& result, float fovy, float aspect, float near, float far, bool invertYAxis ) { float frustumH = tanf( fovy * 0.5f ) * near; float frustumW = frustumH * aspect; - Vector2 bias = stereoBias * 0.5f; - Frustum(result, -(frustumW + bias.x), frustumW - bias.x, -(frustumH + bias.y), frustumH - bias.y, near, far, invertYAxis); + Frustum(result, -frustumW, frustumW, -frustumH, frustumH, near, far, invertYAxis); } void Orthographic(Matrix& result, float left, float right, float bottom, float top, float near, float far, bool invertYAxis) @@ -139,7 +143,7 @@ void Orthographic(Matrix& result, float left, float right, float bottom, float t const Dali::Camera::Type Camera::DEFAULT_TYPE( Dali::Camera::FREE_LOOK ); const Dali::Camera::ProjectionMode Camera::DEFAULT_MODE( Dali::Camera::PERSPECTIVE_PROJECTION ); const bool Camera::DEFAULT_INVERT_Y_AXIS( false ); -const float Camera::DEFAULT_FIELD_OF_VIEW( 45.0f*(M_PI/180.0f) ); +const float Camera::DEFAULT_FIELD_OF_VIEW( 45.0f*(Math::PI/180.0f) ); const float Camera::DEFAULT_ASPECT_RATIO( 4.0f/3.0f ); const float Camera::DEFAULT_LEFT_CLIPPING_PLANE(-240.0f); const float Camera::DEFAULT_RIGHT_CLIPPING_PLANE(240.0f); @@ -147,13 +151,13 @@ const float Camera::DEFAULT_TOP_CLIPPING_PLANE(-400.0f); const float Camera::DEFAULT_BOTTOM_CLIPPING_PLANE(400.0f); const float Camera::DEFAULT_NEAR_CLIPPING_PLANE( 800.0f ); // default height of the screen const float Camera::DEFAULT_FAR_CLIPPING_PLANE( DEFAULT_NEAR_CLIPPING_PLANE + 2.f * DEFAULT_NEAR_CLIPPING_PLANE ); -const Vector2 Camera::DEFAULT_STEREO_BIAS( 0.0f, 0.0f ); const Vector3 Camera::DEFAULT_TARGET_POSITION( 0.0f, 0.0f, 0.0f ); Camera::Camera() : mUpdateViewFlag( UPDATE_COUNT ), mUpdateProjectionFlag( UPDATE_COUNT ), + mNode( NULL ), mType( DEFAULT_TYPE ), mProjectionMode( DEFAULT_MODE ), mInvertYAxis( DEFAULT_INVERT_Y_AXIS ), @@ -165,7 +169,6 @@ Camera::Camera() mBottomClippingPlane( DEFAULT_BOTTOM_CLIPPING_PLANE ), mNearClippingPlane( DEFAULT_NEAR_CLIPPING_PLANE ), mFarClippingPlane( DEFAULT_FAR_CLIPPING_PLANE ), - mStereoBias( DEFAULT_STEREO_BIAS ), mTargetPosition( DEFAULT_TARGET_POSITION ), mViewMatrix(), mProjectionMatrix(), @@ -182,6 +185,11 @@ Camera::~Camera() { } +void Camera::SetNode( const Node* node ) +{ + mNode = node; +} + void Camera::SetType( Dali::Camera::Type type ) { mType = type; @@ -211,12 +219,6 @@ void Camera::SetAspectRatio( float aspectRatio ) mUpdateProjectionFlag = UPDATE_COUNT; } -void Camera::SetStereoBias( const Vector2& stereoBias ) -{ - mStereoBias = stereoBias; - mUpdateProjectionFlag = UPDATE_COUNT; -} - void Camera::SetLeftClippingPlane( float leftClippingPlane ) { mLeftClippingPlane = leftClippingPlane; @@ -284,14 +286,14 @@ const PropertyInputImpl* Camera::GetViewMatrix() const return &mViewMatrix; } -void Camera::Update( BufferIndex updateBufferIndex, const Node& owningNode ) +void Camera::Update( BufferIndex updateBufferIndex ) { // if owning node has changes in world position we need to update camera for next 2 frames - if( owningNode.IsLocalMatrixDirty() ) + if( mNode->IsLocalMatrixDirty() ) { mUpdateViewFlag = UPDATE_COUNT; } - if( owningNode.GetDirtyFlags() & VisibleFlag ) + if( mNode->GetDirtyFlags() & NodePropertyFlags::VISIBLE ) { // If the visibility changes, the projection matrix needs to be re-calculated. // It may happen the first time an actor is rendered it's rendered only once and becomes invisible, @@ -301,8 +303,8 @@ void Camera::Update( BufferIndex updateBufferIndex, const Node& owningNode ) } // if either matrix changed, we need to recalculate the inverse matrix for hit testing to work - unsigned int viewUpdateCount = UpdateViewMatrix( updateBufferIndex, owningNode ); - unsigned int projectionUpdateCount = UpdateProjection( updateBufferIndex ); + uint32_t viewUpdateCount = UpdateViewMatrix( updateBufferIndex ); + uint32_t projectionUpdateCount = UpdateProjection( updateBufferIndex ); // if model or view matrix changed we need to either recalculate the inverse VP or copy previous if( viewUpdateCount > COPY_PREVIOUS_MATRIX || projectionUpdateCount > COPY_PREVIOUS_MATRIX ) @@ -328,9 +330,9 @@ bool Camera::ViewMatrixUpdated() return 0u != mUpdateViewFlag; } -unsigned int Camera::UpdateViewMatrix( BufferIndex updateBufferIndex, const Node& owningNode ) +uint32_t Camera::UpdateViewMatrix( BufferIndex updateBufferIndex ) { - unsigned int retval( mUpdateViewFlag ); + uint32_t retval( mUpdateViewFlag ); if( 0u != mUpdateViewFlag ) { if( COPY_PREVIOUS_MATRIX == mUpdateViewFlag ) @@ -346,7 +348,7 @@ unsigned int Camera::UpdateViewMatrix( BufferIndex updateBufferIndex, const Node case Dali::Camera::FREE_LOOK: { Matrix& viewMatrix = mViewMatrix.Get( updateBufferIndex ); - viewMatrix = owningNode.GetWorldMatrix( updateBufferIndex ); + viewMatrix = mNode->GetWorldMatrix( updateBufferIndex ); viewMatrix.Invert(); mViewMatrix.SetDirty( updateBufferIndex ); break; @@ -354,7 +356,7 @@ unsigned int Camera::UpdateViewMatrix( BufferIndex updateBufferIndex, const Node // camera orientation constrained to look at a target case Dali::Camera::LOOK_AT_TARGET: { - const Matrix& owningNodeMatrix( owningNode.GetWorldMatrix( updateBufferIndex ) ); + const Matrix& owningNodeMatrix( mNode->GetWorldMatrix( updateBufferIndex ) ); Vector3 position, scale; Quaternion orientation; owningNodeMatrix.GetTransformComponents( position, orientation, scale ); @@ -418,7 +420,7 @@ void Camera::UpdateFrustum( BufferIndex updateBufferIndex, bool normalize ) if ( normalize ) { - for ( unsigned int i = 0; i < 6; ++i ) + for ( uint32_t i = 0; i < 6; ++i ) { // Normalize planes to ensure correct bounding distance checking Plane& plane = planes.mPlanes[ i ]; @@ -431,7 +433,7 @@ void Camera::UpdateFrustum( BufferIndex updateBufferIndex, bool normalize ) } else { - for ( unsigned int i = 0; i < 6; ++i ) + for ( uint32_t i = 0; i < 6; ++i ) { planes.mSign[i] = Vector3( Sign(planes.mPlanes[ i ].mNormal.x), Sign(planes.mPlanes[ i ].mNormal.y), Sign(planes.mPlanes[ i ].mNormal.z) ); } @@ -467,9 +469,9 @@ bool Camera::CheckAABBInFrustum( BufferIndex bufferIndex, const Vector3& origin, return true; } -unsigned int Camera::UpdateProjection( BufferIndex updateBufferIndex ) +uint32_t Camera::UpdateProjection( BufferIndex updateBufferIndex ) { - unsigned int retval( mUpdateProjectionFlag ); + uint32_t retval( mUpdateProjectionFlag ); // Early-exit if no update required if ( 0u != mUpdateProjectionFlag ) { @@ -490,8 +492,7 @@ unsigned int Camera::UpdateProjection( BufferIndex updateBufferIndex ) mAspectRatio, mNearClippingPlane, mFarClippingPlane, - mInvertYAxis, - mStereoBias ); + mInvertYAxis ); break; } case Dali::Camera::ORTHOGRAPHIC_PROJECTION: