From 99c378a7d15d5bd36b116e65f0903454bd5dc50b Mon Sep 17 00:00:00 2001 From: Xiangyin Ma Date: Wed, 28 Jan 2015 15:37:00 +0000 Subject: [PATCH] remove constaints from EffectsView & Image Filters Change-Id: I992366ec2c8b6897ddf35bd7a46e41642e57aba1 --- .../controls/effects-view/effects-view-impl.cpp | 51 +++++++++++++++------- .../internal/filters/blur-two-pass-filter.cpp | 23 ++++++++-- .../internal/filters/blur-two-pass-filter.h | 3 ++ .../internal/filters/emboss-filter.cpp | 35 ++++++++++++--- .../dali-toolkit/internal/filters/emboss-filter.h | 3 ++ .../dali-toolkit/internal/filters/image-filter.h | 2 +- .../internal/filters/spread-filter.cpp | 17 +++++++- .../dali-toolkit/internal/filters/spread-filter.h | 3 ++ 8 files changed, 111 insertions(+), 26 deletions(-) diff --git a/optional/dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp b/optional/dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp index 82c6ffe..f928e1c 100644 --- a/optional/dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp +++ b/optional/dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp @@ -220,7 +220,7 @@ void EffectsView::SetOutputImage( FrameBufferImage image ) } mActorForResult = Actor::New(); mActorForResult.SetParentOrigin( ParentOrigin::CENTER ); - mActorForResult.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForResult.SetSize( mTargetSize ); mActorForResult.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); Self().Add( mActorForResult ); @@ -266,7 +266,6 @@ void EffectsView::SetupProperties() mEffectOffsetPropertyIndex = self.RegisterProperty(EFFECT_OFFSET_PROPERTY_NAME, EFFECT_OFFSET_DEFAULT); mEffectColorPropertyIndex = self.RegisterProperty(EFFECT_COLOR_PROPERTY_NAME, EFFECT_COLOR_DEFAULT); mActorPostFilter.ApplyConstraint( Constraint::New( Actor::POSITION, Source( self, mEffectOffsetPropertyIndex ), EqualToConstraint() ) ); - mActorPostFilter.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); mActorPostFilter.ApplyConstraint( Constraint::New( Actor::COLOR, Source( self, mEffectColorPropertyIndex ), EqualToConstraint() ) ); } @@ -290,12 +289,10 @@ void EffectsView::OnInitialize() mActorForChildren = ImageActor::New(); mActorForChildren.SetPositionInheritanceMode( Dali::USE_PARENT_POSITION ); - mActorForChildren.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); // same size as EffectsView object mActorForChildren.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); mActorPostFilter = ImageActor::New(); mActorPostFilter.SetParentOrigin( ParentOrigin::CENTER ); - mActorPostFilter.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); // same size as EffectsView object mActorPostFilter.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); mActorPostFilter.SetShaderEffect( ShaderEffect::New( "", EFFECTS_VIEW_FRAGMENT_SOURCE ) ); @@ -316,6 +313,38 @@ void EffectsView::OnControlSizeSet(const Vector3& targetSize) { AllocateResources(); } + + if( mActorForResult ) + { + mActorForResult.SetSize( targetSize ); + } + if( mActorForChildren ) + { + mActorForChildren.SetSize( targetSize ); + } + if( mActorPostFilter ) + { + mActorPostFilter.SetSize( targetSize ); + } + + // Children render camera must move when EffectsView object is resized. + // This is since we cannot change render target size - so we need to remap the child actors' rendering + // accordingly so they still exactly fill the render target. + // Note that this means the effective resolution of the child render changes as the EffectsView object + // changes size, this is the trade off for not being able to modify render target size + // Change camera z position based on EffectsView actor height + if( mCameraForChildren ) + { + const float cameraPosScale( 0.5f / tanf(ARBITRARY_FIELD_OF_VIEW * 0.5f) ); + mCameraForChildren.SetZ( targetSize.height * cameraPosScale ); + } + + const size_t numFilters( mFilters.size() ); + for( size_t i = 0; i < numFilters; ++i ) + { + mFilters[i]->SetSize( mTargetSize ); + } + } void EffectsView::OnStageDisconnection() @@ -421,7 +450,7 @@ void EffectsView::AllocateResources() void EffectsView::SetupCameras() { - const float cameraPosConstraintScale( 0.5f / tanf(ARBITRARY_FIELD_OF_VIEW * 0.5f) ); + const float cameraPosScale( 0.5f / tanf(ARBITRARY_FIELD_OF_VIEW * 0.5f) ); // Create and place a camera for the children render, corresponding to its render target size mCameraForChildren.SetFieldOfView(ARBITRARY_FIELD_OF_VIEW); @@ -429,17 +458,9 @@ void EffectsView::SetupCameras() mCameraForChildren.SetNearClippingPlane(1.0f); mCameraForChildren.SetAspectRatio(mTargetSize.width / mTargetSize.height); mCameraForChildren.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor - mCameraForChildren.SetPosition(0.0f, 0.0f, mTargetSize.height * cameraPosConstraintScale); + mCameraForChildren.SetPosition(0.0f, 0.0f, mTargetSize.height * cameraPosScale); mCameraForChildren.SetRotation(Quaternion(M_PI, Vector3::YAXIS)); - - // Children render camera must move when EffectsView object is resized. - // This is since we cannot change render target size - so we need to remap the child actors' rendering - // accordingly so they still exactly fill the render target. - // Note that this means the effective resolution of the child render changes as the EffectsView object - // changes size, this is the trade off for not being able to modify render target size - // Change camera z position based on EffectsView actor height - mCameraForChildren.RemoveConstraints(); - mCameraForChildren.ApplyConstraint( Constraint::New( Actor::POSITION_Z, ParentSource( Actor::SIZE_HEIGHT ), RelativeToConstraintFloat(cameraPosConstraintScale) ) ); + mCameraForChildren.SetZ( mTargetSize.height * cameraPosScale ); } void EffectsView::CreateRenderTasks() diff --git a/optional/dali-toolkit/internal/filters/blur-two-pass-filter.cpp b/optional/dali-toolkit/internal/filters/blur-two-pass-filter.cpp index 6544046..5ab09a1 100644 --- a/optional/dali-toolkit/internal/filters/blur-two-pass-filter.cpp +++ b/optional/dali-toolkit/internal/filters/blur-two-pass-filter.cpp @@ -142,7 +142,7 @@ void BlurTwoPassFilter::Enable() // create actor to render input with applied emboss effect mActorForInput = ImageActor::New( mInputImage ); mActorForInput.SetParentOrigin( ParentOrigin::CENTER ); - mActorForInput.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForInput.SetSize(mTargetSize); mActorForInput.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); // create internal offscreen for result of horizontal pass @@ -151,7 +151,7 @@ void BlurTwoPassFilter::Enable() // create an actor to render mImageForHorz for vertical blur pass mActorForHorz = ImageActor::New( mImageForHorz ); mActorForHorz.SetParentOrigin( ParentOrigin::CENTER ); - mActorForHorz.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForHorz.SetSize(mTargetSize); mActorForHorz.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); // create internal offscreen for result of the two pass blurred image @@ -160,7 +160,7 @@ void BlurTwoPassFilter::Enable() // create an actor to blend the blurred image and the input image with the given blur strength mActorForBlending = ImageActor::New( mBlurredImage ); mActorForBlending.SetParentOrigin( ParentOrigin::CENTER ); - mActorForBlending.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForBlending.SetSize(mTargetSize); mActorForBlending.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); mRootActor.Add( mActorForInput ); @@ -271,6 +271,23 @@ void BlurTwoPassFilter::Refresh() } } +void BlurTwoPassFilter::SetSize( const Vector2& size ) +{ + mTargetSize = size; + if( mActorForInput ) + { + mActorForInput.SetSize(mTargetSize); + } + if( mActorForHorz ) + { + mActorForHorz.SetSize(mTargetSize); + } + if( mActorForBlending ) + { + mActorForBlending.SetSize(mTargetSize); + } +} + Constrainable BlurTwoPassFilter::GetHandleForAnimateBlurStrength() { return mShaderForBlending; diff --git a/optional/dali-toolkit/internal/filters/blur-two-pass-filter.h b/optional/dali-toolkit/internal/filters/blur-two-pass-filter.h index 2528996..9b29dde 100644 --- a/optional/dali-toolkit/internal/filters/blur-two-pass-filter.h +++ b/optional/dali-toolkit/internal/filters/blur-two-pass-filter.h @@ -63,6 +63,9 @@ public: // From ImageFilter /// @copydoc Dali::Toolkit::Internal::ImageFilter::Refresh virtual void Refresh(); + /// @copydoc Dali::Toolkit::Internal::ImageFilter::SetSize + virtual void SetSize( const Vector2& size ); + /** * Get the property index that controls the strength of the blur applied to the image. Useful for animating this property. * This property represents a value in the range [0.0 - 1.0] where 0.0 is no blur and 1.0 is full blur. diff --git a/optional/dali-toolkit/internal/filters/emboss-filter.cpp b/optional/dali-toolkit/internal/filters/emboss-filter.cpp index b715e11..dee4a2e 100644 --- a/optional/dali-toolkit/internal/filters/emboss-filter.cpp +++ b/optional/dali-toolkit/internal/filters/emboss-filter.cpp @@ -131,31 +131,31 @@ void EmbossFilter::Enable() // create actor to render input with applied emboss effect mActorForInput1 = ImageActor::New( mInputImage ); mActorForInput1.SetParentOrigin( ParentOrigin::CENTER ); - mActorForInput1.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForInput1.SetSize(mTargetSize); mActorForInput1.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); mActorForInput1.SetColor( Color::WHITE ); mActorForInput2 = ImageActor::New( mInputImage ); mActorForInput2.SetParentOrigin( ParentOrigin::CENTER ); - mActorForInput2.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForInput2.SetSize(mTargetSize); mActorForInput2.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); mActorForInput2.SetColor( Color::WHITE ); mActorForEmboss1 = ImageActor::New( mImageForEmboss1 ); mActorForEmboss1.SetParentOrigin( ParentOrigin::CENTER ); - mActorForEmboss1.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForEmboss1.SetSize(mTargetSize); mActorForEmboss1.SetColor( Color::BLACK ); mActorForEmboss1.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) ); mActorForEmboss2 = ImageActor::New( mImageForEmboss2 ); mActorForEmboss2.SetParentOrigin( ParentOrigin::CENTER ); - mActorForEmboss2.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForEmboss2.SetSize(mTargetSize); mActorForEmboss2.SetColor( Color::WHITE ); mActorForEmboss2.SetShaderEffect( ShaderEffect::New( "", COMPOSITE_FRAGMENT_SOURCE ) ); mActorForComposite = Actor::New(); mActorForComposite.SetParentOrigin( ParentOrigin::CENTER ); - mActorForComposite.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForComposite.SetSize(mTargetSize); mActorForComposite.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); // create custom shader effect @@ -247,6 +247,31 @@ void EmbossFilter::Refresh() } } +void EmbossFilter::SetSize( const Vector2& size ) +{ + mTargetSize = size; + if( mActorForInput1 ) + { + mActorForInput1.SetSize(mTargetSize); + } + if( mActorForInput2 ) + { + mActorForInput2.SetSize(mTargetSize); + } + if( mActorForEmboss1 ) + { + mActorForEmboss1.SetSize(mTargetSize); + } + if( mActorForEmboss2 ) + { + mActorForEmboss2.SetSize(mTargetSize); + } + if( mActorForComposite ) + { + mActorForComposite.SetSize(mTargetSize); + } +} + void EmbossFilter::SetupCamera() { // Create and place a camera for the embossing render, corresponding to its render target size diff --git a/optional/dali-toolkit/internal/filters/emboss-filter.h b/optional/dali-toolkit/internal/filters/emboss-filter.h index 1f706b2..c912428 100644 --- a/optional/dali-toolkit/internal/filters/emboss-filter.h +++ b/optional/dali-toolkit/internal/filters/emboss-filter.h @@ -61,6 +61,9 @@ public: // From ImageFilter /// @copydoc Dali::Toolkit::Internal::ImageFilter::Refresh virtual void Refresh(); + /// @copydoc Dali::Toolkit::Internal::ImageFilter::SetSize + virtual void SetSize( const Vector2& size ); + private: /** * Setup position and parameters for camera diff --git a/optional/dali-toolkit/internal/filters/image-filter.h b/optional/dali-toolkit/internal/filters/image-filter.h index 8de47b0..5a07ded 100644 --- a/optional/dali-toolkit/internal/filters/image-filter.h +++ b/optional/dali-toolkit/internal/filters/image-filter.h @@ -90,7 +90,7 @@ public: * Set size of ImageFilter. Used to create internal offscreen buffers * @param[in] size THe size. */ - void SetSize( const Vector2& size ); + virtual void SetSize( const Vector2& size ); /** * Set the pixel format for internal offscreen buffers diff --git a/optional/dali-toolkit/internal/filters/spread-filter.cpp b/optional/dali-toolkit/internal/filters/spread-filter.cpp index b04d173..3d911b9 100644 --- a/optional/dali-toolkit/internal/filters/spread-filter.cpp +++ b/optional/dali-toolkit/internal/filters/spread-filter.cpp @@ -96,7 +96,7 @@ void SpreadFilter::Enable() // create actor to render input with applied emboss effect mActorForInput = ImageActor::New( mInputImage ); mActorForInput.SetParentOrigin( ParentOrigin::CENTER ); - mActorForInput.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForInput.SetSize(mTargetSize); mActorForInput.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); // create internal offscreen for result of horizontal pass @@ -105,7 +105,7 @@ void SpreadFilter::Enable() // create an actor to render mImageForHorz for vertical blur pass mActorForHorz = ImageActor::New( mImageForHorz ); mActorForHorz.SetParentOrigin( ParentOrigin::CENTER ); - mActorForHorz.ApplyConstraint( Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) ); + mActorForHorz.SetSize(mTargetSize); mActorForHorz.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); mRootActor.Add( mActorForInput ); @@ -183,6 +183,19 @@ void SpreadFilter::Refresh() } } +void SpreadFilter::SetSize( const Vector2& size ) +{ + mTargetSize = size; + if( mActorForInput ) + { + mActorForInput.SetSize(mTargetSize); + } + if( mActorForHorz ) + { + mActorForHorz.SetSize(mTargetSize); + } +} + void SpreadFilter::SetupCamera() { // Create and place a camera for the embossing render, corresponding to its render target size diff --git a/optional/dali-toolkit/internal/filters/spread-filter.h b/optional/dali-toolkit/internal/filters/spread-filter.h index e04484c..5f5d857 100644 --- a/optional/dali-toolkit/internal/filters/spread-filter.h +++ b/optional/dali-toolkit/internal/filters/spread-filter.h @@ -68,6 +68,9 @@ public: // From ImageFilter /// @copydoc Dali::Toolkit::Internal::ImageFilter::Refresh virtual void Refresh(); + /// @copydoc Dali::Toolkit::Internal::ImageFilter::SetSize + virtual void SetSize( const Vector2& size ); + private: /** * Setup position and parameters for camera -- 2.7.4