diff --git a/Kiwano/2d/Node.cpp b/Kiwano/2d/Node.cpp index 619f0242..f8a82653 100644 --- a/Kiwano/2d/Node.cpp +++ b/Kiwano/2d/Node.cpp @@ -46,12 +46,13 @@ namespace kiwano , responsible_(false) , dirty_transform_(false) , dirty_transform_inverse_(false) + , cascade_opacity_(false) , parent_(nullptr) , scene_(nullptr) , hash_name_(0) , z_order_(0) , opacity_(1.f) - , display_opacity_(1.f) + , displayed_opacity_(1.f) , anchor_(default_anchor_x, default_anchor_y) { } @@ -230,10 +231,15 @@ namespace kiwano 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()) { child->UpdateOpacity(); @@ -298,7 +304,16 @@ namespace kiwano if (opacity_ == opacity) 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(); } @@ -625,7 +640,7 @@ namespace kiwano void VisualNode::PrepareRender() { Renderer::Instance().SetTransform(transform_matrix_); - Renderer::Instance().SetOpacity(display_opacity_); + Renderer::Instance().SetOpacity(displayed_opacity_); } } diff --git a/Kiwano/2d/Node.h b/Kiwano/2d/Node.h index 72347f93..923d160a 100644 --- a/Kiwano/2d/Node.h +++ b/Kiwano/2d/Node.h @@ -59,6 +59,9 @@ namespace kiwano // 获取响应状态 bool IsResponsible() const { return responsible_; } + // 是否启用级联透明度 + bool IsCascadeOpacityEnabled() const { return cascade_opacity_; } + // 获取名称的 Hash 值 size_t GetHashName() const { return hash_name_; } @@ -125,6 +128,9 @@ namespace kiwano // 获取透明度 float GetOpacity() const { return opacity_; } + // 获取显示透明度 + float GetDisplayedOpacity() const { return displayed_opacity_; } + // 获取变换 Transform GetTransform() const { return transform_; } @@ -296,6 +302,7 @@ namespace kiwano const Size & size ); + // 设置二维仿射变换 void SetTransform( Transform const& transform ); @@ -306,6 +313,11 @@ namespace kiwano float opacity ); + // 启用或禁用级联透明度 + void SetCascadeOpacityEnabled( + bool enabled + ); + // 设置 Z 轴顺序 // 默认为 0 void SetZOrder( @@ -413,9 +425,10 @@ namespace kiwano bool pressed_; bool responsible_; bool update_pausing_; + bool cascade_opacity_; int z_order_; float opacity_; - float display_opacity_; + float displayed_opacity_; Node* parent_; Scene* scene_; size_t hash_name_;