X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fshadow-view%2Fshadow-view-impl.cpp;h=1197a464a46c8cd65cf7efcf85a3325d836fef12;hp=d6fd80432e9ed221f9eeda3fafd5ee735db11d2c;hb=9a5ce98a301f74f8df8a3be6d223b525c8839b0b;hpb=8c0b17fb124c735b31c441873da4d7ffc4b15eb5 diff --git a/dali-toolkit/internal/controls/shadow-view/shadow-view-impl.cpp b/dali-toolkit/internal/controls/shadow-view/shadow-view-impl.cpp index d6fd804..1197a46 100644 --- a/dali-toolkit/internal/controls/shadow-view/shadow-view-impl.cpp +++ b/dali-toolkit/internal/controls/shadow-view/shadow-view-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -19,27 +19,30 @@ #include "shadow-view-impl.h" // EXTERNAL INCLUDES -#include -#include +#include +#include #include -#include -#include #include +#include #include #include -#include +#include +#include // INTERNAL INCLUDES -#include +#include +#include +#include #include #include +#include +#include // TODO: // pixel format / size - set from JSON // aspect ratio property needs to be able to be constrained also for cameras. (now do-able) // default near clip value - ///////////////////////////////////////////////////////// // IMPLEMENTATION NOTES @@ -53,16 +56,12 @@ namespace Dali { - namespace Toolkit { - namespace Internal { - namespace { - using namespace Dali; BaseHandle Create() @@ -70,58 +69,26 @@ BaseHandle Create() return Toolkit::ShadowView::New(); } -DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ShadowView, Toolkit::Control, Create ) +DALI_TYPE_REGISTRATION_BEGIN(Toolkit::ShadowView, Toolkit::Control, Create) DALI_TYPE_REGISTRATION_END() const float BLUR_STRENGTH_DEFAULT = 1.0f; const Vector3 DEFAULT_LIGHT_POSITION(300.0f, 250.0f, 600.0f); -const float DEFAULT_FIELD_OF_VIEW_RADIANS = Math::PI / 4.0f; // 45 degrees +const float DEFAULT_FIELD_OF_VIEW_RADIANS = Math::PI / 4.0f; // 45 degrees const Vector4 DEFAULT_SHADOW_COLOR = Vector4(0.2f, 0.2f, 0.2f, 0.8f); const char* const SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME = "uLightCameraProjectionMatrix"; -const char* const SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME = "uLightCameraViewMatrix"; -const char* const SHADER_SHADOW_COLOR_PROPERTY_NAME = "uShadowColor"; -const char* const BLUR_STRENGTH_PROPERTY_NAME = "BlurStrengthProperty"; -const char* const SHADOW_COLOR_PROPERTY_NAME = "ShadowColorProperty"; - -const char* const RENDER_SHADOW_VERTEX_SOURCE = - - " attribute mediump vec2 aPosition;\n" - " uniform mediump mat4 uMvpMatrix;\n" - " uniform mediump mat4 uModelMatrix;\n" - " uniform vec3 uSize;\n" - " varying vec2 vTexCoord;\n" - - " uniform mediump mat4 uLightCameraProjectionMatrix;\n" - " uniform mediump mat4 uLightCameraViewMatrix;\n" - "\n" - "void main()\n" - "{\n" - " mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n" - " vertexPosition.xyz *= uSize;\n" - " gl_Position = uMvpMatrix * vertexPosition;\n" - " vec4 textureCoords = uLightCameraProjectionMatrix * uLightCameraViewMatrix * uModelMatrix * vertexPosition;\n" - " vTexCoord = 0.5 + 0.5 * (textureCoords.xy/textureCoords.w);\n" - "}\n"; - -const char* const RENDER_SHADOW_FRAGMENT_SOURCE = - "varying mediump vec2 vTexCoord;\n" - "uniform lowp vec4 uShadowColor;\n" - "uniform sampler2D sTexture;\n" - - "void main()\n" - "{\n" - " lowp float alpha;\n" - " alpha = texture2D(sTexture, vec2(vTexCoord.x, vTexCoord.y)).a;\n" - " gl_FragColor = vec4(uShadowColor.rgb, uShadowColor.a * alpha);\n" - "}\n"; +const char* const SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME = "uLightCameraViewMatrix"; +const char* const SHADER_SHADOW_COLOR_PROPERTY_NAME = "uShadowColor"; +const char* const BLUR_STRENGTH_PROPERTY_NAME = "BlurStrengthProperty"; +const char* const SHADOW_COLOR_PROPERTY_NAME = "ShadowColorProperty"; } // namespace -ShadowView::ShadowView( float downsampleWidthScale, float downsampleHeightScale ) -: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), +ShadowView::ShadowView(float downsampleWidthScale, float downsampleHeightScale) +: Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)), mChildrenRoot(Actor::New()), mCachedShadowColor(DEFAULT_SHADOW_COLOR), mCachedBackgroundColor(DEFAULT_SHADOW_COLOR.r, DEFAULT_SHADOW_COLOR.g, DEFAULT_SHADOW_COLOR.b, 0.0f), @@ -140,7 +107,7 @@ Toolkit::ShadowView ShadowView::New(float downsampleWidthScale, float downsample { ShadowView* impl = new ShadowView(downsampleWidthScale, downsampleHeightScale); - Dali::Toolkit::ShadowView handle = Dali::Toolkit::ShadowView( *impl ); + Dali::Toolkit::ShadowView handle = Dali::Toolkit::ShadowView(*impl); // Second-phase init of the implementation // This can only be done after the CustomActor connection has been made... @@ -153,25 +120,28 @@ void ShadowView::SetShadowPlaneBackground(Actor shadowPlaneBackground) { mShadowPlaneBg = shadowPlaneBackground; - mShadowPlane = Toolkit::ImageView::New( mOutputImage ); - mShadowPlane.SetName( "SHADOW_PLANE" ); - mShadowPlane.SetParentOrigin(ParentOrigin::CENTER); - mShadowPlane.SetAnchorPoint(AnchorPoint::CENTER); + mShadowPlane = Actor::New(); + mShadowPlane.SetProperty(Actor::Property::NAME, "SHADOW_PLANE"); + mShadowPlane.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mShadowPlane.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + Renderer shadowRenderer = CreateRenderer(SHADER_SHADOW_VIEW_RENDER_SHADER_VERT, SHADER_SHADOW_VIEW_RENDER_SHADER_FRAG, Shader::Hint::OUTPUT_IS_TRANSPARENT, Uint16Pair(20, 20)); + TextureSet textureSet = shadowRenderer.GetTextures(); + textureSet.SetTexture(0u, mOutputFrameBuffer.GetColorTexture()); + mShadowPlane.AddRenderer(shadowRenderer); - mShadowPlane.SetProperty( Toolkit::ImageView::Property::IMAGE, mShadowVisualMap ); SetShaderConstants(); // Rather than parent the shadow plane drawable and have constraints to move it to the same // position, instead parent the shadow plane drawable on the shadow plane passed in. mShadowPlaneBg.Add(mShadowPlane); - mShadowPlane.SetParentOrigin(ParentOrigin::CENTER); - mShadowPlane.SetZ(1.0f); + mShadowPlane.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mShadowPlane.SetProperty(Actor::Property::POSITION_Z, 1.0f); ConstrainCamera(); - mShadowPlane.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + mShadowPlane.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS); - mBlurRootActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + mBlurRootActor.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS); } void ShadowView::SetPointLight(Actor pointLight) @@ -188,24 +158,24 @@ void ShadowView::SetPointLightFieldOfView(float fieldOfView) void ShadowView::SetShadowColor(Vector4 color) { - mCachedShadowColor = color; + mCachedShadowColor = color; mCachedBackgroundColor.r = color.r; mCachedBackgroundColor.g = color.g; mCachedBackgroundColor.b = color.b; - if( mShadowPlane ) + if(mShadowPlane) { - mShadowPlane.SetProperty( mShadowColorPropertyIndex, mCachedShadowColor ); + mShadowPlane.SetProperty(mShadowColorPropertyIndex, mCachedShadowColor); } if(mRenderSceneTask) { - mRenderSceneTask.SetClearColor( mCachedBackgroundColor ); + mRenderSceneTask.SetClearColor(mCachedBackgroundColor); } } void ShadowView::Activate() { - DALI_ASSERT_ALWAYS( Self().OnStage() && "ShadowView should be on stage before calling Activate()\n" ); + DALI_ASSERT_ALWAYS(Self().GetProperty(Actor::Property::CONNECTED_TO_SCENE) && "ShadowView should be on stage before calling Activate()\n"); // make sure resources are allocated and start the render tasks processing CreateRenderTasks(); @@ -213,7 +183,7 @@ void ShadowView::Activate() void ShadowView::Deactivate() { - DALI_ASSERT_ALWAYS( Self().OnStage() && "ShadowView should be on stage before calling Deactivate()\n" ) + DALI_ASSERT_ALWAYS(Self().GetProperty(Actor::Property::CONNECTED_TO_SCENE) && "ShadowView should be on stage before calling Deactivate()\n") // stop render tasks processing // Note: render target resources are automatically freed since we set the Image::Unused flag @@ -228,58 +198,50 @@ void ShadowView::Deactivate() void ShadowView::OnInitialize() { // root actor to parent all user added actors. Used as source actor for shadow render task. - mChildrenRoot.SetParentOrigin( ParentOrigin::CENTER ); - mChildrenRoot.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + mChildrenRoot.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mChildrenRoot.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS); Vector2 stageSize = Stage::GetCurrent().GetSize(); - mCameraActor = CameraActor::New(stageSize); + mCameraActor = CameraActor::New(stageSize); - mCameraActor.SetParentOrigin( ParentOrigin::CENTER ); + mCameraActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); // Target is constrained to point at the shadow plane origin - mCameraActor.SetNearClippingPlane( 1.0f ); - mCameraActor.SetType( Dali::Camera::FREE_LOOK ); // Camera orientation constrained to point at shadow plane world position - mCameraActor.SetOrientation(Radian(Degree(180)), Vector3::YAXIS); - mCameraActor.SetPosition(DEFAULT_LIGHT_POSITION); - - - Property::Map customShader; - customShader[ Toolkit::Visual::Shader::Property::VERTEX_SHADER ] = RENDER_SHADOW_VERTEX_SOURCE; - customShader[ Toolkit::Visual::Shader::Property::FRAGMENT_SHADER ] = RENDER_SHADOW_FRAGMENT_SOURCE; - - customShader[ Toolkit::Visual::Shader::Property::SUBDIVIDE_GRID_X ] = 20; - customShader[ Toolkit::Visual::Shader::Property::SUBDIVIDE_GRID_Y ] = 20; - - customShader[ Toolkit::Visual::Shader::Property::HINTS ] = Shader::Hint::OUTPUT_IS_TRANSPARENT; - - mShadowVisualMap[ Toolkit::VisualProperty::SHADER ] = customShader; + mCameraActor.SetNearClippingPlane(1.0f); + mCameraActor.SetType(Dali::Camera::FREE_LOOK); // Camera orientation constrained to point at shadow plane world position + mCameraActor.SetProperty(Actor::Property::ORIENTATION, Quaternion(Radian(Degree(180)), Vector3::YAXIS)); + mCameraActor.SetProperty(Actor::Property::POSITION, DEFAULT_LIGHT_POSITION); // Create render targets needed for rendering from light's point of view - mSceneFromLightRenderTarget = FrameBufferImage::New( stageSize.width, stageSize.height, Pixel::RGBA8888 ); + mSceneFromLightRenderTarget = FrameBuffer::New(stageSize.width, stageSize.height, FrameBuffer::Attachment::NONE); + Texture textureFromLight = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, unsigned(stageSize.width), unsigned(stageSize.height)); + mSceneFromLightRenderTarget.AttachColorTexture(textureFromLight); - mOutputImage = FrameBufferImage::New( stageSize.width * 0.5f, stageSize.height * 0.5f, Pixel::RGBA8888 ); + mOutputFrameBuffer = FrameBuffer::New(stageSize.width * 0.5f, stageSize.height * 0.5f, FrameBuffer::Attachment::NONE); + Texture outputTexture = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, unsigned(stageSize.width * 0.5f), unsigned(stageSize.height * 0.5f)); + mOutputFrameBuffer.AttachColorTexture(outputTexture); ////////////////////////////////////////////////////// // Connect to actor tree - Self().Add( mChildrenRoot ); - Stage::GetCurrent().Add( mCameraActor ); + Self().Add(mChildrenRoot); + Stage::GetCurrent().Add(mCameraActor); mBlurFilter.SetRefreshOnDemand(false); - mBlurFilter.SetInputImage(mSceneFromLightRenderTarget); - mBlurFilter.SetOutputImage(mOutputImage); + mBlurFilter.SetInputTexture(mSceneFromLightRenderTarget.GetColorTexture()); + mBlurFilter.SetOutputFrameBuffer(mOutputFrameBuffer); mBlurFilter.SetSize(stageSize * 0.5f); mBlurFilter.SetPixelFormat(Pixel::RGBA8888); mBlurRootActor = Actor::New(); - mBlurRootActor.SetName( "BLUR_ROOT_ACTOR" ); + mBlurRootActor.SetProperty(Actor::Property::NAME, "BLUR_ROOT_ACTOR"); // Turn off inheritance to ensure filter renders properly - mBlurRootActor.SetParentOrigin( ParentOrigin::CENTER ); - mBlurRootActor.SetInheritPosition(false); - mBlurRootActor.SetInheritOrientation(false); - mBlurRootActor.SetInheritScale(false); - mBlurRootActor.SetColorMode(USE_OWN_COLOR); + mBlurRootActor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + mBlurRootActor.SetProperty(Actor::Property::INHERIT_POSITION, false); + mBlurRootActor.SetProperty(Actor::Property::INHERIT_ORIENTATION, false); + mBlurRootActor.SetProperty(Actor::Property::INHERIT_SCALE, false); + mBlurRootActor.SetProperty(Actor::Property::COLOR_MODE, USE_OWN_COLOR); Self().Add(mBlurRootActor); @@ -290,43 +252,48 @@ void ShadowView::OnInitialize() // Register a property that the user can use to control the blur in the internal object mBlurStrengthPropertyIndex = self.RegisterProperty(BLUR_STRENGTH_PROPERTY_NAME, BLUR_STRENGTH_DEFAULT); - Constraint blurStrengthConstraint = Constraint::New( mBlurFilter.GetHandleForAnimateBlurStrength(), mBlurFilter.GetBlurStrengthPropertyIndex(), EqualToConstraint() ); - blurStrengthConstraint.AddSource( Source( self, mBlurStrengthPropertyIndex) ); + Constraint blurStrengthConstraint = Constraint::New(mBlurFilter.GetHandleForAnimateBlurStrength(), mBlurFilter.GetBlurStrengthPropertyIndex(), EqualToConstraint()); + blurStrengthConstraint.AddSource(Source(self, mBlurStrengthPropertyIndex)); blurStrengthConstraint.Apply(); + + DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) { + return std::unique_ptr( + new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::FILLER)); + }); } -void ShadowView::OnChildAdd( Actor& child ) +void ShadowView::OnChildAdd(Actor& child) { - Control::OnChildAdd( child ); - - if( child != mChildrenRoot && child != mBlurRootActor) + if(child != mChildrenRoot && child != mBlurRootActor) { - mChildrenRoot.Add( child ); + mChildrenRoot.Add(child); } + + Control::OnChildAdd(child); } -void ShadowView::OnChildRemove( Actor& child ) +void ShadowView::OnChildRemove(Actor& child) { - mChildrenRoot.Remove( child ); + mChildrenRoot.Remove(child); - Control::OnChildRemove( child ); + Control::OnChildRemove(child); } void ShadowView::ConstrainCamera() { - if( mPointLight && mShadowPlane ) + if(mPointLight && mShadowPlane) { // Constrain camera to look directly at center of shadow plane. (mPointLight position // is under control of application, can't use transform inheritance) - Constraint cameraOrientationConstraint = Constraint::New ( mCameraActor, Actor::Property::ORIENTATION, &LookAt ); - cameraOrientationConstraint.AddSource( Source( mShadowPlane, Actor::Property::WORLD_POSITION ) ); - cameraOrientationConstraint.AddSource( Source( mPointLight, Actor::Property::WORLD_POSITION ) ); - cameraOrientationConstraint.AddSource( Source( mShadowPlane, Actor::Property::WORLD_ORIENTATION ) ); + Constraint cameraOrientationConstraint = Constraint::New(mCameraActor, Actor::Property::ORIENTATION, &LookAt); + cameraOrientationConstraint.AddSource(Source(mShadowPlane, Actor::Property::WORLD_POSITION)); + cameraOrientationConstraint.AddSource(Source(mPointLight, Actor::Property::WORLD_POSITION)); + cameraOrientationConstraint.AddSource(Source(mShadowPlane, Actor::Property::WORLD_ORIENTATION)); cameraOrientationConstraint.Apply(); - Constraint pointLightPositionConstraint = Constraint::New( mCameraActor, Actor::Property::POSITION, EqualToConstraint() ); - pointLightPositionConstraint.AddSource( Source( mPointLight, Actor::Property::WORLD_POSITION ) ); + Constraint pointLightPositionConstraint = Constraint::New(mCameraActor, Actor::Property::POSITION, EqualToConstraint()); + pointLightPositionConstraint.AddSource(Source(mPointLight, Actor::Property::WORLD_POSITION)); pointLightPositionConstraint.Apply(); } } @@ -338,16 +305,16 @@ void ShadowView::CreateRenderTasks() // We want the first task to render the scene from the light mRenderSceneTask = taskList.CreateTask(); - mRenderSceneTask.SetCameraActor( mCameraActor ); - mRenderSceneTask.SetSourceActor( mChildrenRoot ); - mRenderSceneTask.SetTargetFrameBuffer( mSceneFromLightRenderTarget ); - mRenderSceneTask.SetInputEnabled( false ); - mRenderSceneTask.SetClearEnabled( true ); + mRenderSceneTask.SetCameraActor(mCameraActor); + mRenderSceneTask.SetSourceActor(mChildrenRoot); + mRenderSceneTask.SetFrameBuffer(mSceneFromLightRenderTarget); + mRenderSceneTask.SetInputEnabled(false); + mRenderSceneTask.SetClearEnabled(true); // background color for render task should be the shadow color, but with alpha 0 // we don't want to blend the edges of the content with a BLACK at alpha 0, but // the same shadow color at alpha 0. - mRenderSceneTask.SetClearColor( mCachedBackgroundColor ); + mRenderSceneTask.SetClearColor(mCachedBackgroundColor); mBlurFilter.Enable(); } @@ -364,17 +331,17 @@ void ShadowView::RemoveRenderTasks() void ShadowView::SetShaderConstants() { - Property::Index lightCameraProjectionMatrixPropertyIndex = mShadowPlane.RegisterProperty( SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME, Matrix::IDENTITY ); - Constraint projectionMatrixConstraint = Constraint::New( mShadowPlane, lightCameraProjectionMatrixPropertyIndex, EqualToConstraint() ); - projectionMatrixConstraint.AddSource( Source( mCameraActor, CameraActor::Property::PROJECTION_MATRIX ) ); + Property::Index lightCameraProjectionMatrixPropertyIndex = mShadowPlane.RegisterProperty(SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME, Matrix::IDENTITY); + Constraint projectionMatrixConstraint = Constraint::New(mShadowPlane, lightCameraProjectionMatrixPropertyIndex, EqualToConstraint()); + projectionMatrixConstraint.AddSource(Source(mCameraActor, CameraActor::Property::PROJECTION_MATRIX)); projectionMatrixConstraint.Apply(); - Property::Index lightCameraViewMatrixPropertyIndex = mShadowPlane.RegisterProperty( SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME, Matrix::IDENTITY ); - Constraint viewMatrixConstraint = Constraint::New( mShadowPlane, lightCameraViewMatrixPropertyIndex, EqualToConstraint() ); - viewMatrixConstraint.AddSource( Source( mCameraActor, CameraActor::Property::VIEW_MATRIX ) ); + Property::Index lightCameraViewMatrixPropertyIndex = mShadowPlane.RegisterProperty(SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME, Matrix::IDENTITY); + Constraint viewMatrixConstraint = Constraint::New(mShadowPlane, lightCameraViewMatrixPropertyIndex, EqualToConstraint()); + viewMatrixConstraint.AddSource(Source(mCameraActor, CameraActor::Property::VIEW_MATRIX)); viewMatrixConstraint.Apply(); - mShadowColorPropertyIndex = mShadowPlane.RegisterProperty( SHADER_SHADOW_COLOR_PROPERTY_NAME, mCachedShadowColor ); + mShadowColorPropertyIndex = mShadowPlane.RegisterProperty(SHADER_SHADOW_COLOR_PROPERTY_NAME, mCachedShadowColor); } } // namespace Internal