cascade opacity supported

This commit is contained in:
Nomango 2019-07-29 13:42:13 +08:00
parent 3c63ca3965
commit 331ec42523
2 changed files with 34 additions and 6 deletions

View File

@ -46,12 +46,13 @@ namespace kiwano
, responsible_(false) , responsible_(false)
, dirty_transform_(false) , dirty_transform_(false)
, dirty_transform_inverse_(false) , dirty_transform_inverse_(false)
, cascade_opacity_(false)
, parent_(nullptr) , parent_(nullptr)
, scene_(nullptr) , scene_(nullptr)
, hash_name_(0) , hash_name_(0)
, z_order_(0) , z_order_(0)
, opacity_(1.f) , opacity_(1.f)
, display_opacity_(1.f) , displayed_opacity_(1.f)
, anchor_(default_anchor_x, default_anchor_y) , anchor_(default_anchor_x, default_anchor_y)
{ {
} }
@ -230,10 +231,15 @@ namespace kiwano
void Node::UpdateOpacity() void Node::UpdateOpacity()
{ {
if (parent_) if (parent_ && parent_->IsCascadeOpacityEnabled())
{ {
display_opacity_ = opacity_ * parent_->display_opacity_; displayed_opacity_ = opacity_ * parent_->displayed_opacity_;
} }
else
{
displayed_opacity_ = opacity_;
}
for (Node* child = children_.First().Get(); child; child = child->NextItem().Get()) for (Node* child = children_.First().Get(); child; child = child->NextItem().Get())
{ {
child->UpdateOpacity(); child->UpdateOpacity();
@ -298,7 +304,16 @@ namespace kiwano
if (opacity_ == opacity) if (opacity_ == opacity)
return; return;
display_opacity_ = opacity_ = std::min(std::max(opacity, 0.f), 1.f); displayed_opacity_ = opacity_ = std::min(std::max(opacity, 0.f), 1.f);
UpdateOpacity();
}
void Node::SetCascadeOpacityEnabled(bool enabled)
{
if (cascade_opacity_ == enabled)
return;
cascade_opacity_ = enabled;
UpdateOpacity(); UpdateOpacity();
} }
@ -625,7 +640,7 @@ namespace kiwano
void VisualNode::PrepareRender() void VisualNode::PrepareRender()
{ {
Renderer::Instance().SetTransform(transform_matrix_); Renderer::Instance().SetTransform(transform_matrix_);
Renderer::Instance().SetOpacity(display_opacity_); Renderer::Instance().SetOpacity(displayed_opacity_);
} }
} }

View File

@ -59,6 +59,9 @@ namespace kiwano
// 获取响应状态 // 获取响应状态
bool IsResponsible() const { return responsible_; } bool IsResponsible() const { return responsible_; }
// 是否启用级联透明度
bool IsCascadeOpacityEnabled() const { return cascade_opacity_; }
// 获取名称的 Hash 值 // 获取名称的 Hash 值
size_t GetHashName() const { return hash_name_; } size_t GetHashName() const { return hash_name_; }
@ -125,6 +128,9 @@ namespace kiwano
// 获取透明度 // 获取透明度
float GetOpacity() const { return opacity_; } float GetOpacity() const { return opacity_; }
// 获取显示透明度
float GetDisplayedOpacity() const { return displayed_opacity_; }
// 获取变换 // 获取变换
Transform GetTransform() const { return transform_; } Transform GetTransform() const { return transform_; }
@ -296,6 +302,7 @@ namespace kiwano
const Size & size const Size & size
); );
// 设置二维仿射变换
void SetTransform( void SetTransform(
Transform const& transform Transform const& transform
); );
@ -306,6 +313,11 @@ namespace kiwano
float opacity float opacity
); );
// 启用或禁用级联透明度
void SetCascadeOpacityEnabled(
bool enabled
);
// 设置 Z 轴顺序 // 设置 Z 轴顺序
// 默认为 0 // 默认为 0
void SetZOrder( void SetZOrder(
@ -413,9 +425,10 @@ namespace kiwano
bool pressed_; bool pressed_;
bool responsible_; bool responsible_;
bool update_pausing_; bool update_pausing_;
bool cascade_opacity_;
int z_order_; int z_order_;
float opacity_; float opacity_;
float display_opacity_; float displayed_opacity_;
Node* parent_; Node* parent_;
Scene* scene_; Scene* scene_;
size_t hash_name_; size_t hash_name_;