X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Factors%2Fcamera-actor-impl.cpp;h=a0faef31a93fc65759cce09e095b663f7ecf1d8a;hb=d353bae63798f48237dc24c078c2e8cb2aa0bc62;hp=c8f5d7548f8a893bc7d634bb6974c3f3779ddb3b;hpb=3e62d65a47aae01db4717b1bc5716ce81f2926d1;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/actors/camera-actor-impl.cpp b/dali/internal/event/actors/camera-actor-impl.cpp index c8f5d75..a0faef3 100644 --- a/dali/internal/event/actors/camera-actor-impl.cpp +++ b/dali/internal/event/actors/camera-actor-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 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,12 +25,15 @@ // INTERNAL INCLUDES #include #include +#include #include #include #include +#include #include #include #include +#include #include namespace Dali @@ -64,7 +67,7 @@ DALI_PROPERTY( "targetPosition", VECTOR3, true, false, true, Dal DALI_PROPERTY( "projectionMatrix", MATRIX, false, false, true, Dali::CameraActor::Property::PROJECTION_MATRIX ) DALI_PROPERTY( "viewMatrix", MATRIX, false, false, true, Dali::CameraActor::Property::VIEW_MATRIX ) DALI_PROPERTY( "invertYAxis", BOOLEAN, true, false, true, Dali::CameraActor::Property::INVERT_Y_AXIS ) -DALI_PROPERTY_TABLE_END( DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX ) +DALI_PROPERTY_TABLE_END( DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX, CameraDefaultProperties ) // calculate the far plane distance for a 16bit depth buffer with 4 bits per unit precision void CalculateClippingAndZ( float width, float height, float& nearClippingPlane, float& farClippingPlane, float& cameraZ ) @@ -79,7 +82,7 @@ BaseHandle Create() return Dali::CameraActor::New(); } -TypeRegistration mType( typeid( Dali::CameraActor ), typeid( Dali::Actor ), Create ); +TypeRegistration mType( typeid( Dali::CameraActor ), typeid( Dali::Actor ), Create, CameraDefaultProperties ); /** * Builds the picking ray in the world reference system from an orthographic camera @@ -112,8 +115,10 @@ void BuildOrthoPickingRay( const Matrix& viewMatrix, DALI_ASSERT_DEBUG( false ); } - Vector4 near( screenX - viewport.x, viewport.height - (screenY - viewport.y), 0.f, 1.f ); - if( !Unproject( near, invViewProjection, viewport.width, viewport.height, rayOrigin ) ) + Vector4 near( screenX - static_cast( viewport.x ), + static_cast( viewport.height ) - (screenY - static_cast( viewport.y ) ), + 0.f, 1.f ); + if( !Unproject( near, invViewProjection, static_cast( viewport.width ), static_cast( viewport.height ), rayOrigin ) ) { DALI_ASSERT_DEBUG( false ); } @@ -138,7 +143,7 @@ void BuildOrthoPickingRay( const Matrix& viewMatrix, CameraActorPtr CameraActor::New( const Size& size ) { - CameraActorPtr actor( new CameraActor() ); + CameraActorPtr actor( new CameraActor( *CreateNode() ) ); // Second-phase construction actor->Initialize(); @@ -153,8 +158,8 @@ CameraActorPtr CameraActor::New( const Size& size ) return actor; } -CameraActor::CameraActor() -: Actor( Actor::BASIC ), +CameraActor::CameraActor( const SceneGraph::Node& node ) +: Actor( Actor::BASIC, node ), mSceneObject( NULL ), mTarget( SceneGraph::Camera::DEFAULT_TARGET_POSITION ), mType( SceneGraph::Camera::DEFAULT_TYPE ), @@ -186,7 +191,7 @@ void CameraActor::OnInitialize() SceneGraph::Camera* sceneGraphCamera = SceneGraph::Camera::New(); // Store a pointer to this camera node inside the scene-graph camera. - sceneGraphCamera->SetNode( mNode ); + sceneGraphCamera->SetNode( &GetNode() ); mSceneObject = sceneGraphCamera; OwnerPointer< SceneGraph::Camera > sceneGraphCameraOwner( sceneGraphCamera ); @@ -195,6 +200,23 @@ void CameraActor::OnInitialize() AddCameraMessage( GetEventThreadServices().GetUpdateManager(), sceneGraphCameraOwner ); } +void CameraActor::OnStageConnectionInternal() +{ + // If the canvas size has not been set, then use the size of the scene we've been added to to set up the perspective projection + if( ( mCanvasSize.width < Math::MACHINE_EPSILON_1000 ) || ( mCanvasSize.height < Math::MACHINE_EPSILON_1000 ) ) + { + SetPerspectiveProjection( GetScene().GetSize() ); + } +} + +void CameraActor::SetReflectByPlane(const Vector4& plane) { + SceneGraph::Camera* cam = const_cast(GetCamera()); + if (cam) + { + cam->SetReflectByPlane(plane); + } +} + void CameraActor::SetTarget( const Vector3& target ) { if( target != mTarget ) // using range epsilon @@ -366,29 +388,28 @@ bool CameraActor::GetInvertYAxis() const return mInvertYAxis; } -void CameraActor::SetPerspectiveProjection( const Size& size, const Vector2& stereoBias /* = Vector2::ZERO */ ) +void CameraActor::SetPerspectiveProjection( const Size& size ) { - float width = size.width; - float height = size.height; + mCanvasSize = size; - if( Size::ZERO == size ) + if( ( size.width < Math::MACHINE_EPSILON_1000 ) || ( size.height < Math::MACHINE_EPSILON_1000 ) ) { - StagePtr stage = Stage::GetCurrent(); - if( stage ) + // If the size given is invalid, i.e. ZERO, then check if we've been added to a scene + if( OnStage() ) { - const Size& stageSize = stage->GetSize(); - - width = stageSize.width; - height = stageSize.height; + // We've been added to a scene already, set the canvas size to the scene's size + mCanvasSize = GetScene().GetSize(); + } + else + { + // We've not been added to a scene yet, so just return. + // We'll set the canvas size when we get added to a scene later + return; } } - if( ( width < Math::MACHINE_EPSILON_1000 ) || ( height < Math::MACHINE_EPSILON_1000 ) ) - { - // On the stage initialization this method is called but the size has not been set. - // There is no point to set any value if width or height is zero. - return; - } + float width = mCanvasSize.width; + float height = mCanvasSize.height; float nearClippingPlane; float farClippingPlane; @@ -407,13 +428,12 @@ void CameraActor::SetPerspectiveProjection( const Size& size, const Vector2& ste const float aspectRatio = width / height; + // sceneObject is being used in a separate thread; queue a message to set SetProjectionMode(Dali::Camera::PERSPECTIVE_PROJECTION); SetFieldOfView( fieldOfView ); SetNearClippingPlane( nearClippingPlane ); SetFarClippingPlane( farClippingPlane ); SetAspectRatio( aspectRatio ); - // sceneObject is being used in a separate thread; queue a message to set - SetStereoBiasMessage( GetEventThreadServices(), *mSceneObject, stereoBias ); SetZ( cameraZ ); } @@ -451,13 +471,15 @@ bool CameraActor::BuildPickingRay( const Vector2& screenCoordinates, { // Build a picking ray in the world reference system. // ray starts from the camera world position - rayOrigin = mNode->GetWorldMatrix(0).GetTranslation(); + rayOrigin = GetNode().GetWorldMatrix(0).GetTranslation(); rayOrigin.w = 1.0f; // Transform the touch point from the screen coordinate system to the world coordinates system. - Vector4 near( screenCoordinates.x - viewport.x, viewport.height - (screenCoordinates.y - viewport.y), 0.f, 1.f ); + Vector4 near( screenCoordinates.x - static_cast(viewport.x), + static_cast( viewport.height ) - (screenCoordinates.y - static_cast( viewport.y ) ), + 0.f, 1.f ); const Matrix& inverseViewProjection = mSceneObject->GetInverseViewProjectionMatrix( GetEventThreadServices().GetEventBufferIndex() ); - success = Unproject( near, inverseViewProjection, viewport.width, viewport.height, near ); + success = Unproject( near, inverseViewProjection, static_cast( viewport.width ), static_cast( viewport.height ), near ); // Compute the ray's director vector. rayDirection.x = near.x - rayOrigin.x; @@ -509,115 +531,10 @@ const SceneGraph::Camera* CameraActor::GetCamera() const return mSceneObject; } -unsigned int CameraActor::GetDefaultPropertyCount() const -{ - return Actor::GetDefaultPropertyCount() + DEFAULT_PROPERTY_COUNT; -} - -void CameraActor::GetDefaultPropertyIndices( Property::IndexContainer& indices ) const -{ - Actor::GetDefaultPropertyIndices( indices ); // Actor class properties - - indices.Reserve( indices.Size() + DEFAULT_PROPERTY_COUNT ); - - int index = DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX; - for ( int i = 0; i < DEFAULT_PROPERTY_COUNT; ++i, ++index ) - { - indices.PushBack( index ); - } -} - -bool CameraActor::IsDefaultPropertyWritable( Property::Index index ) const -{ - if( index < DEFAULT_ACTOR_PROPERTY_MAX_COUNT ) - { - return Actor::IsDefaultPropertyWritable( index ); - } - - return DEFAULT_PROPERTY_DETAILS[index - DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX].writable; -} - -bool CameraActor::IsDefaultPropertyAnimatable( Property::Index index ) const -{ - if( index < DEFAULT_ACTOR_PROPERTY_MAX_COUNT ) - { - return Actor::IsDefaultPropertyAnimatable( index ); - } - - return DEFAULT_PROPERTY_DETAILS[index - DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX].animatable; -} - -bool CameraActor::IsDefaultPropertyAConstraintInput( Property::Index index ) const -{ - if( index < DEFAULT_ACTOR_PROPERTY_MAX_COUNT ) - { - return Actor::IsDefaultPropertyAConstraintInput( index ); - } - - return DEFAULT_PROPERTY_DETAILS[index - DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX].constraintInput; -} - -Property::Type CameraActor::GetDefaultPropertyType( Property::Index index ) const -{ - if( index < DEFAULT_ACTOR_PROPERTY_MAX_COUNT ) - { - return Actor::GetDefaultPropertyType( index ); - } - else - { - index -= DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX; - - if ( ( index >= 0 ) && ( index < DEFAULT_PROPERTY_COUNT ) ) - { - return DEFAULT_PROPERTY_DETAILS[index].type; - } - else - { - // index out-of-bounds - return Property::NONE; - } - } -} - -const char* CameraActor::GetDefaultPropertyName( Property::Index index ) const +void CameraActor::RotateProjection( int rotationAngle ) { - if(index < DEFAULT_ACTOR_PROPERTY_MAX_COUNT) - { - return Actor::GetDefaultPropertyName(index); - } - else - { - index -= DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX; - - if ( ( index >= 0 ) && ( index < DEFAULT_PROPERTY_COUNT ) ) - { - return DEFAULT_PROPERTY_DETAILS[index].name; - } - return NULL; - } -} - -Property::Index CameraActor::GetDefaultPropertyIndex(const std::string& name) const -{ - Property::Index index = Property::INVALID_INDEX; - - // Look for name in current class' default properties - for( int i = 0; i < DEFAULT_PROPERTY_COUNT; ++i ) - { - if( 0 == strcmp( name.c_str(), DEFAULT_PROPERTY_DETAILS[i].name ) ) // dont want to convert rhs to string - { - index = i + DEFAULT_DERIVED_ACTOR_PROPERTY_START_INDEX; - break; - } - } - - // If not found, check in base class - if( Property::INVALID_INDEX == index ) - { - index = Actor::GetDefaultPropertyIndex( name ); - } - - return index; + // sceneObject is being used in a separate thread; queue a message to set + RotateProjectionMessage( GetEventThreadServices(), *mSceneObject, rotationAngle ); } void CameraActor::SetDefaultProperty( Property::Index index, const Property::Value& propertyValue ) @@ -716,6 +633,12 @@ void CameraActor::SetDefaultProperty( Property::Index index, const Property::Val SetInvertYAxis( propertyValue.Get() ); // set to false in case property is not bool break; } + case Dali::DevelCameraActor::Property::REFLECTION_PLANE: + { + SetReflectByPlane( propertyValue.Get() ); + break; + } + default: { DALI_LOG_WARNING( "Unknown property (%d)\n", index ); @@ -842,61 +765,28 @@ Property::Value CameraActor::GetDefaultPropertyCurrentValue( Property::Index ind return ret; } -const SceneGraph::PropertyBase* CameraActor::GetSceneObjectAnimatableProperty( Property::Index index ) const -{ - DALI_ASSERT_ALWAYS( IsPropertyAnimatable(index) && "Property is not animatable" ); - - const SceneGraph::PropertyBase* property( NULL ); - - // This method should only return a property of an object connected to the scene-graph - if ( !OnStage() ) - { - return property; - } - - // let actor handle animatable properties, we have no animatable properties - if( index < DEFAULT_ACTOR_PROPERTY_MAX_COUNT ) - { - property = Actor::GetSceneObjectAnimatableProperty(index); - } - - return property; -} - const PropertyInputImpl* CameraActor::GetSceneObjectInputProperty( Property::Index index ) const { const PropertyInputImpl* property( NULL ); - // This method should only return a property of an object connected to the scene-graph - if ( !OnStage() ) + switch( index ) { - return property; + case Dali::CameraActor::Property::PROJECTION_MATRIX: + { + property = mSceneObject->GetProjectionMatrix(); + break; + } + case Dali::CameraActor::Property::VIEW_MATRIX: + { + property = mSceneObject->GetViewMatrix(); + break; + } + // no default on purpose as we chain method up to actor } - - // if its an actor default property or a custom property (actor already handles custom properties) - if( ( index < DEFAULT_ACTOR_PROPERTY_MAX_COUNT ) || ( index >= DEFAULT_PROPERTY_MAX_COUNT ) ) + if( !property ) { property = Actor::GetSceneObjectInputProperty( index ); } - else - { - switch( index ) - { - case Dali::CameraActor::Property::PROJECTION_MATRIX: - { - property = mSceneObject->GetProjectionMatrix(); - break; - } - case Dali::CameraActor::Property::VIEW_MATRIX: - { - property = mSceneObject->GetViewMatrix(); - break; - } - default: - DALI_LOG_WARNING("Not an input property (%d)\n", index); - break; - } - } return property; }