TizenFX
TizenFX copied to clipboard
[NUI] Support View BackgroundBlurEffect
[NUI] Support View RenderEffect + BackgroundBlurEffect
Dali patch required for this PR: https://review.tizen.org/gerrit/c/platform/core/uifw/dali-csharp-binder/+/313372
Public API Changed
Please follow the ACR process for the changed API below.
Added: 6, Removed: 0, Changed: 0
Added
+ /// <since_tizen>none</since_tizen
+ Tizen.NUI.BackgroundBlurEffect
+ /// <since_tizen>none</since_tizen
+ System.Void Tizen.NUI.BackgroundBlurEffect::.ctor()
+ /// <since_tizen>none</since_tizen
+ System.Void Tizen.NUI.BackgroundBlurEffect::.ctor(System.Single,System.UInt32,System.Single)
+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.NUI.BaseComponents.View::ClearRenderEffect()
+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.NUI.BaseComponents.View::SetRenderEffect(Tizen.NUI.RenderEffect)
+ /// <since_tizen>none</since_tizen
+ Tizen.NUI.RenderEffect
Internal API Changed
Added: 1, Removed: 0, Changed: 0
Added
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BackgroundBlurEffect::ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef)
C# API로 도출 할 때, 몇 가지 요구사항을 요청드리면,
- RenderEffect 클래스는 C# 레이어에서 확장이 사실상 불가능합니다. 그래서 클래스 형태가 아닌 enum형태가 되면 좋겠습니다.
- RenderEffect구현을 위해서는 C#레이어로는 구현 할 수 없는 부분이 존재합니다. 따라서 사실상 C#레이어에 RenderEffect를 클래스 상속 구조를 제공한다고 해서 이를 확장할 수 있는 방법이 있는 것은 아닙니다. 이런 이유로 클래스 객체를 설정하는 구조가 아닌 단순히 이미 정의된 enum에서 Effect를 선택하는 구조로 제공해주는게 더 적합한 것 같습니다.
enum으로 제공할 경우 효과에 대한 설정이 불가능하기에 enum으로는 어려울 듯한데요.
대신, 상속 구조가 아닌 단순하게 factory method형태로 제공하고, 생성된 객체는 Immutable하게 관리하는것이 좋을 것 같습니다.
래퍼런스가 되는 Android의 RenderEffect도 상속 구조로 Effect를 제공하는 것이 아니고 Factory method형태로 Effect에 대한 설정을 parameter로 받아서 생성된 객체를 Immutable로 다루고 있습니다 .
https://developer.android.com/reference/android/graphics/RenderEffect
예를 들면...
class RenderEffect {
....
public static RenderEffect CreateBlurEffect(float downscaleFactor, uint blurRadius, float bellCurveWidth) { .... }
}
결국에는 C# 의 RenderEffect class 는 getter only Property 로 Type 같은 것만 있고, Immutable 한 정보들 (아마도 PropertyMap) 로부터 Dali::Toolkit::RenderEffect 를 새로 생성하는 구현물을 dali-csharp-binder 에서 전부 구현하는 방식으로 가야할 것 같은데요...
이렇게 하면 BlurRadius 에 대한 animation 은 물론, 추후 추가되는 여러 가지 RenderEffect 들에 대한 Animation 지원은 어려워지게 됩니다. (현재 BlurRadius 가 Animation 이 안되긴 합니다만, Dali 에서는 몇몇 API 를 public으로 추가한다면 가능해집니다..)
만약 이러한 요구사항이 미래에 왔을 때 방어할 적절한 논리가 준비 되어있다면 Immutable 로 전환하는 것에 긍정적으로 검토하겠습니다.
Animation에 관해.
이 전까지는 Animation의 경우 Actor에 설정된 Property에 대한 업데이트를 Render Thread에서 업데이트하는 방식이였습니다.
그런데 RenderEffect의 경우 이 범주에서 벗어 납니다. (제가 보고 있는 뷰 안에서는... 내부에서는 뭔가 다를지 모르겠지만 공개된 정보안에서는)
그래서 Animation을 위해 State Object로 설계하는 것이 적합한 것인지 모르겠습니다.
타 플랫폼의 경우 대부분 이런객체들은 Stateless object 즉 Immutable객체로 두고, Animation이 필요할 시에는 이런 Immutable객체를 계속 생성하여 업데이트 하는 방식을 따르고 있습니다. 물론 이렇게 되면 Render Thread에서 동작하는 Animation과 UI Thread에서 동작하는 Animation간 차이가 발생할테지만 그럼에도 저는 타플랫폼과 동일한 방식으로 이루어졌으면 좋겠습니다.
그럼에도 RenderThread에서 동작하는 Animation으로 Blur효과를 변경하고 싶다면, StatefulRenderEffect 클래스를 RenderEffect 클래스에 대비하여 제공하겠습니다.
public void SetRenderEffect(RenderEffect effect); // 이 Effect는 Immutable하고 그래서 재사용가능
public void SetRenderEffect(StatefulRenderEffect effect); // 이 Effect는 state가 있고 그래서 mutable하고 따라서 특정 View에서 dedicated되어 사용되어야 함
제가 생각하는 구현 방식은 위에 은기님이 말씀하신 구현물을 dali-csharp-binder 에서 구현하지 않고 모두 C#에서 구현하면 될것으로 판단하고 있습니다.
그냥 Dali binder로 전달하는 effect객체는 현재 구현하신 Effect객체 그대로인데 C#에서 생성하는 객체만 Dali의 객체와 전혀 상관 없이 정보만 갖는 객체로 만들어서 설정하는 부분에서 Dali의 RenderEffect객체를 생성해서 전달하는 방식으로 생각하고 있습니다.
그리고 만약에 위에 언급한 것처럼 Animation 이 필요한 RenderEffect가 생기면 그때, Dali의 RenderEffect객체를 C#의 StatefulRenderEffect와 연결하면 될것으로 보고 있습니다.
https://github.sec.samsung.net/dotnet/nui2/pull/181
요 PR을 참고해주세요
한국어로 TizenFX 레포에 글을 쓰는게 아주 어색하군요..(....)
API에 대해서는 반드시 Mutable해야 한다거나 Immutable해야 한다거나로 정해놓은 건 아니니까 좋은 방법으로 구현되면 좋겠네요. 다만, 저희의 경험적인 면에서, 사업부 요구사항이 앞으로 어떻게 올 수 있을지 명확하지 않은 부분이 있으므로 가능하면 여러가지 대비를 하게되는 부분이 있습니다. 그런 면에서 가능하면 속성을 자유롭게 수정할 수 있는 형태로 만드는게 일상적인 부분이었고요. Blur Effect를 만들면서는 우선 상정할 수 있는 가능성이 blur 정도에 대한 Animation이었는데요. 이 부분은 바로 지윤님/상현님도 Blur 이야기를 들으시면서 가능성 여부를 물어보시더라고요. Animation을 지원하고자 한다면 어차피 지금처럼 NUI Animation으로 구현할 생각은 아니었고, 이 기능은 특수한 기능이라고 상정하고, 뭐 예를들면 SetBlurAnimation(time, in-AlphaFunction, out-AlphaFunction) 같이 적당한 API 형태로 입력하면 DALi 내에서 Animation을 만들고 재생하는 방법을 우선 생각하고 있긴 했습니다. 뭐 사실 이런 기능은 Immutable API라고 하더라도 RenderEffect renderEffect = CreateBlurRenderEffect(~~); renderEffect.SetAnimation(BlurAnimation(time, in-AlphaFunction, out-AlphaFunction)) view.SetRenderEffect(); view.PlayRenderAnimation(); 같은 형태로도 제공이 가능할 것 같으니 어떻게든 몇가지 예상 문제를 고려해서 더 나은 형태가 되기만 하면 괜찮을 거 같습니다.
추가적으로 나머지 사항에 대해서 이야기를 하자면..
BellCurve 어쩌구 하는 API는 굳이 열 필요가 없는 거 같고요.. 이건 GaussianBlur 혹은 BellCurve분포를 쓰는 경우에 대한 특수 파라메터라서 나중에 Blur 알고리즘이 바뀌거나 개선될 때 문제가 될 수 있는 요소인 거 같네요.
Radius와 표준편차/시그마 API의 경우에는, 개인적으로는 Radius가 더 사용성이 편리한 요소라고 생각이 듭니다. 표준편차/시그마 속성은 또 Gaussian 분포의 분포 형태에 영향을 주는 친구라서 사용할 때 한단계 더 생각을 해 봐야 하거든요..
그리고... 승근님께서 이미 Render Thread Animation을 선호하는 경우에 대해서 말씀하셨지만 Animation은 특별한 경우가 아니면 가능하면 Render Thread에서 계산이 되는 편이 좋을 거 같습니다.
안녕하세요 의견들 주셔서 감사합니다.
내용을 제가 이해하기로는 당장은 아니더라도, 기본적으로 RenderEffect는 Stateless object로 두면서 애니메이션을 RenderThread에서 돌도록 하면 좋은거지요?
- NUI에서의 RenderEffect는 일단 Stateless object (effect = Create00Effect();)
- view.SetRenderEffect(effect); 일 때 내부적으로 달리 객체를 새로 만들어서 set
여기서 이렇게 매번 새로 만들어 넣으면 effect.SetAnimation()이 불린 이후에 나오는 SetRenderEffect(effect)들에서만 애니메이션이 적용될 텐데요. 사용자의 입장에서 애니메이션을 effect에 설정한다고 하면 여태 설정된 effect들도 한꺼번에 업데이트 되도록 기대할 수도 있을 것 같고요. StatefulRenderEffect를 새로 만들면 애니메이션인 경우에만 쓰이는 래퍼니까 쓰는 입장에서 헷갈릴 수도 있을 거 같아서요. 특정 view에 종속적인 이펙트 애니메이션을 달아야 하는거니까 나중에 애니메이션을 넣게 되면 저는 view.SetRenderEffectAnimation(); 형태가 좋아보입니다.
- NUI의 블러에서 입력 파라미터는 blur radius만 남기도록 할게요
Public API Changed
Please follow the ACR process for the changed API below.
Added: 6, Removed: 0, Changed: 0
Added
+ /// <since_tizen>none</since_tizen
+ Tizen.NUI.BackgroundBlurEffect
+ /// <since_tizen>none</since_tizen
+ System.Void Tizen.NUI.BackgroundBlurEffect::.ctor()
+ /// <since_tizen>none</since_tizen
+ System.Void Tizen.NUI.BackgroundBlurEffect::.ctor(System.UInt32)
+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.NUI.BaseComponents.View::ClearRenderEffect()
+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.NUI.BaseComponents.View::SetRenderEffect(Tizen.NUI.RenderEffect)
+ /// <since_tizen>none</since_tizen
+ Tizen.NUI.RenderEffect
Internal API Changed
Added: 1, Removed: 0, Changed: 0
Added
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BackgroundBlurEffect::ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef)
Public API Changed
Please follow the ACR process for the changed API below.
Added: 4, Removed: 0, Changed: 0
Added
+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.NUI.BaseComponents.View::ClearRenderEffect()
+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.NUI.BaseComponents.View::SetRenderEffect(Tizen.NUI.RenderEffect)
+ /// <since_tizen>none</since_tizen
+ Tizen.NUI.RenderEffect
+ /// <since_tizen>none</since_tizen
+ static Tizen.NUI.RenderEffect Tizen.NUI.RenderEffect::CreateBackgroundBlurEffect(System.Single)
Public API Changed
Please follow the ACR process for the changed API below.
Added: 4, Removed: 0, Changed: 0
Added
+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.NUI.BaseComponents.View::ClearRenderEffect()
+ /// <since_tizen>12</since_tizen
+ System.Void Tizen.NUI.BaseComponents.View::SetRenderEffect(Tizen.NUI.RenderEffect)
+ /// <since_tizen>12</since_tizen
+ Tizen.NUI.RenderEffect
+ /// <since_tizen>none</since_tizen
+ static Tizen.NUI.RenderEffect Tizen.NUI.RenderEffect::CreateBackgroundBlurEffect(System.Single)
Internal API Changed
Added: 4, Removed: 0, Changed: 0
Added
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BaseComponents.View::ClearRenderEffect()
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BaseComponents.View::SetRenderEffect(Tizen.NUI.RenderEffect)
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ Tizen.NUI.RenderEffect
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static Tizen.NUI.RenderEffect Tizen.NUI.RenderEffect::CreateBackgroundBlurEffect(System.Single)
Hello, There was a diff and conflict between DevelNUI and master, causing difficulties in integrating NUI. Therefore, a hard reset was performed on DevelNUI. As a result, the pull requests (https://github.com/Samsung/TizenFX/pulls) in DevelNUI are now conflicting. To resolve this, you can go to the specific PR, where you will see an error indicating a conflict. You can then use the command line to resolve the conflict. or Here is another example. This one updates everything below the topmost patch, leaving only the topmost patch unchanged.
git fetch upstream git rebase --onto=upstream/DevelNUI HEAD~1 git push {current working branch} -f
I'm sorry for the inconvenience. thank you.
Internal API Changed
Added: 4, Removed: 0, Changed: 0
Added
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BaseComponents.View::ClearRenderEffect()
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BaseComponents.View::SetRenderEffect(Tizen.NUI.RenderEffect)
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ Tizen.NUI.RenderEffect
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static Tizen.NUI.RenderEffect Tizen.NUI.RenderEffect::CreateBackgroundBlurEffect(System.Single)
Internal API Changed
Added: 4, Removed: 0, Changed: 0
Added
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BaseComponents.View::ClearRenderEffect()
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BaseComponents.View::SetRenderEffect(Tizen.NUI.RenderEffect)
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ Tizen.NUI.RenderEffect
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static Tizen.NUI.RenderEffect Tizen.NUI.RenderEffect::CreateBackgroundBlurEffect(System.Single)
Internal API Changed
Added: 4, Removed: 0, Changed: 0
Added
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BaseComponents.View::ClearRenderEffect()
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ System.Void Tizen.NUI.BaseComponents.View::SetRenderEffect(Tizen.NUI.RenderEffect)
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ Tizen.NUI.RenderEffect
+ /// <since_tizen>none</since_tizen
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ static Tizen.NUI.RenderEffect Tizen.NUI.RenderEffect::CreateBackgroundBlurEffect(System.Single)