add Renderer::CheckVisibility()

This commit is contained in:
Nomango 2019-08-14 00:28:25 +08:00
parent ab9ffb5e79
commit 47be1dc413
24 changed files with 114 additions and 90 deletions

View File

@ -33,8 +33,9 @@ namespace kiwano
{ {
} }
void ImGuiLayer::OnRender() void ImGuiLayer::OnRender(Renderer* renderer)
{ {
PrepareRender(renderer);
for (const auto& pipeline : pipelines_) for (const auto& pipeline : pipelines_)
{ {
pipeline.second(); pipeline.second();

View File

@ -52,7 +52,7 @@ namespace kiwano
void RemoveAllItems(); void RemoveAllItems();
public: public:
void OnRender() override; void OnRender(Renderer* renderer) override;
protected: protected:
Map<String, ImGuiPipeline> pipelines_; Map<String, ImGuiPipeline> pipelines_;

View File

@ -82,7 +82,7 @@ namespace kiwano
} }
} }
void Actor::Render() void Actor::Render(Renderer* renderer)
{ {
if (!visible_) if (!visible_)
return; return;
@ -91,8 +91,7 @@ namespace kiwano
if (children_.is_empty()) if (children_.is_empty())
{ {
PrepareRender(); OnRender(renderer);
OnRender();
} }
else else
{ {
@ -103,21 +102,26 @@ namespace kiwano
if (child->GetZOrder() >= 0) if (child->GetZOrder() >= 0)
break; break;
child->Render(); child->Render(renderer);
child = child->next_item().get(); child = child->next_item().get();
} }
PrepareRender(); OnRender(renderer);
OnRender();
while (child) while (child)
{ {
child->Render(); child->Render(renderer);
child = child->next_item().get(); child = child->next_item().get();
} }
} }
} }
void Actor::PrepareRender(Renderer* renderer)
{
renderer->SetTransform(transform_matrix_);
renderer->SetOpacity(displayed_opacity_);
}
void Actor::RenderBorder() void Actor::RenderBorder()
{ {
if (show_border_) if (show_border_)
@ -656,12 +660,4 @@ namespace kiwano
return GetBounds().ContainsPoint(local); return GetBounds().ContainsPoint(local);
} }
void VisualActor::PrepareRender()
{
auto renderer = Renderer::GetInstance();
renderer->SetTransform(transform_matrix_);
renderer->SetOpacity(displayed_opacity_);
}
} }

View File

@ -28,6 +28,7 @@
namespace kiwano namespace kiwano
{ {
class Director; class Director;
class Renderer;
// 실<> // 실<>
class KGE_API Actor class KGE_API Actor
@ -51,7 +52,7 @@ namespace kiwano
virtual void OnUpdate(Duration dt) { KGE_UNUSED(dt); } virtual void OnUpdate(Duration dt) { KGE_UNUSED(dt); }
// 斡횡실<ED9AA1> // 斡횡실<ED9AA1>
virtual void OnRender() {} virtual void OnRender(Renderer* renderer) { KGE_UNUSED(renderer); }
// 삿혤鞫刻榴檄 // 삿혤鞫刻榴檄
bool IsVisible() const { return visible_; } bool IsVisible() const { return visible_; }
@ -135,10 +136,10 @@ namespace kiwano
Transform GetTransform() const { return transform_; } Transform GetTransform() const { return transform_; }
// 삿혤긋움 // 삿혤긋움
Rect GetBounds() const; virtual Rect GetBounds() const;
// 삿혤棍학관鍋분 // 삿혤棍학관鍋분
Rect GetBoundingBox() const; virtual Rect GetBoundingBox() const;
// 삿혤랗郭긴뻣앤黎 // 삿혤랗郭긴뻣앤黎
Matrix const& GetTransformMatrix() const; Matrix const& GetTransformMatrix() const;
@ -379,6 +380,9 @@ namespace kiwano
// 닒만실<EBA78C>盧뇜 // 닒만실<EBA78C>盧뇜
void RemoveFromParent(); void RemoveFromParent();
// 事件分发
void Dispatch(Event& evt) override;
// 董界실<E7958C>뫘劤 // 董界실<E7958C>뫘劤
inline void PauseUpdating() { update_pausing_ = true; } inline void PauseUpdating() { update_pausing_ = true; }
@ -403,16 +407,12 @@ namespace kiwano
float anchor_y float anchor_y
); );
public:
// 事件分发
void Dispatch(Event& evt) override;
protected: protected:
virtual void PrepareRender() {}
virtual void Update(Duration dt); virtual void Update(Duration dt);
virtual void Render(); virtual void Render(Renderer* renderer);
void PrepareRender(Renderer* renderer);
void RenderBorder(); void RenderBorder();
@ -451,14 +451,4 @@ namespace kiwano
mutable Matrix transform_matrix_inverse_; mutable Matrix transform_matrix_inverse_;
}; };
// 可视角色
// 在渲染前处理二维旋转矩阵和透明度
class KGE_API VisualActor
: public Actor
{
public:
virtual void PrepareRender() override;
};
} }

View File

@ -86,7 +86,7 @@ namespace kiwano
cache_expired_ = true; cache_expired_ = true;
} }
void Canvas::OnRender() void Canvas::OnRender(Renderer* renderer)
{ {
if (cache_expired_) if (cache_expired_)
{ {
@ -95,8 +95,10 @@ namespace kiwano
if (bitmap_cached_) if (bitmap_cached_)
{ {
PrepareRender(renderer);
Rect bitmap_rect(0.f, 0.f, bitmap_cached_->GetSize().width, bitmap_cached_->GetSize().height); Rect bitmap_rect(0.f, 0.f, bitmap_cached_->GetSize().width, bitmap_cached_->GetSize().height);
Renderer::GetInstance()->DrawBitmap( renderer->DrawBitmap(
bitmap_cached_, bitmap_cached_,
bitmap_rect, bitmap_rect,
bitmap_rect bitmap_rect

View File

@ -33,7 +33,7 @@ namespace kiwano
{ {
// 画布 // 画布
class KGE_API Canvas class KGE_API Canvas
: public VisualActor : public Actor
{ {
public: public:
Canvas(); Canvas();
@ -211,7 +211,7 @@ namespace kiwano
// 导出为图片 // 导出为图片
ImagePtr ExportToImage() const; ImagePtr ExportToImage() const;
void OnRender() override; void OnRender(Renderer* renderer) override;
protected: protected:
ComPtr<ID2D1Bitmap> const& GetBitmap() const; ComPtr<ID2D1Bitmap> const& GetBitmap() const;

View File

@ -28,7 +28,7 @@
namespace kiwano namespace kiwano
{ {
DebugNode::DebugNode() DebugActor::DebugActor()
: background_color_(0.0f, 0.0f, 0.0f, 0.7f) : background_color_(0.0f, 0.0f, 0.0f, 0.7f)
{ {
SetName(L"kiwano-debug-actor"); SetName(L"kiwano-debug-actor");
@ -54,13 +54,13 @@ namespace kiwano
AddListener(Event::MouseOut, [=](const Event&) { SetOpacity(1.f); }); AddListener(Event::MouseOut, [=](const Event&) { SetOpacity(1.f); });
} }
DebugNode::~DebugNode() DebugActor::~DebugActor()
{ {
} }
void DebugNode::OnRender() void DebugActor::OnRender(Renderer* renderer)
{ {
auto renderer = Renderer::GetInstance(); PrepareRender(renderer);
renderer->GetSolidColorBrush()->SetColor(DX::ConvertToColorF(background_color_)); renderer->GetSolidColorBrush()->SetColor(DX::ConvertToColorF(background_color_));
renderer->GetD2DDeviceResources()->GetDeviceContext()->FillRoundedRectangle( renderer->GetD2DDeviceResources()->GetDeviceContext()->FillRoundedRectangle(
@ -69,7 +69,7 @@ namespace kiwano
); );
} }
void DebugNode::OnUpdate(Duration dt) void DebugActor::OnUpdate(Duration dt)
{ {
KGE_UNUSED(dt); KGE_UNUSED(dt);

View File

@ -23,15 +23,15 @@
namespace kiwano namespace kiwano
{ {
class KGE_API DebugNode class KGE_API DebugActor
: public VisualActor : public Actor
{ {
public: public:
DebugNode(); DebugActor();
virtual ~DebugNode(); virtual ~DebugActor();
void OnRender() override; void OnRender(Renderer* renderer) override;
void OnUpdate(Duration dt) override; void OnUpdate(Duration dt) override;

View File

@ -86,7 +86,7 @@ namespace kiwano
void GifSprite::Update(Duration dt) void GifSprite::Update(Duration dt)
{ {
VisualActor::Update(dt); Actor::Update(dt);
if (image_ && animating_) if (image_ && animating_)
{ {
@ -100,12 +100,14 @@ namespace kiwano
} }
} }
void GifSprite::OnRender() void GifSprite::OnRender(Renderer* renderer)
{ {
if (frame_to_render_) if (frame_to_render_ && renderer->CheckVisibility(size_, transform_matrix_))
{ {
PrepareRender(renderer);
Rect bounds = GetBounds(); Rect bounds = GetBounds();
Renderer::GetInstance()->DrawBitmap(frame_to_render_, bounds, bounds); renderer->DrawBitmap(frame_to_render_, bounds, bounds);
} }
} }

View File

@ -27,7 +27,7 @@
namespace kiwano namespace kiwano
{ {
class KGE_API GifSprite class KGE_API GifSprite
: public VisualActor : public Actor
{ {
public: public:
using LoopDoneCallback = Function<void(int)>; using LoopDoneCallback = Function<void(int)>;
@ -67,7 +67,7 @@ namespace kiwano
inline DoneCallback GetDoneCallback() const { return done_cb_; } inline DoneCallback GetDoneCallback() const { return done_cb_; }
void OnRender() override; void OnRender(Renderer* renderer) override;
protected: protected:
void Update(Duration dt) override; void Update(Duration dt) override;

View File

@ -41,7 +41,7 @@ namespace kiwano
{ {
} }
Rect ShapeActor::GetBoundingBox() Rect ShapeActor::GetBounds() const
{ {
if (!geo_) if (!geo_)
return Rect{}; return Rect{};
@ -52,6 +52,17 @@ namespace kiwano
return Rect{ rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top }; return Rect{ rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top };
} }
Rect ShapeActor::GetBoundingBox() const
{
if (!geo_)
return Rect{};
D2D1_RECT_F rect;
// no matter it failed or not
geo_->GetBounds(DX::ConvertToMatrix3x2F(transform_matrix_), &rect);
return Rect{ rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top };
}
float ShapeActor::GetLength() float ShapeActor::GetLength()
{ {
float length = 0.f; float length = 0.f;
@ -125,16 +136,18 @@ namespace kiwano
outline_join_ = outline_join; outline_join_ = outline_join;
} }
void ShapeActor::OnRender() void ShapeActor::OnRender(Renderer* renderer)
{ {
if (geo_) if (geo_)
{ {
Renderer::GetInstance()->FillGeometry( PrepareRender(renderer);
renderer->FillGeometry(
geo_, geo_,
fill_color_ fill_color_
); );
Renderer::GetInstance()->DrawGeometry( renderer->DrawGeometry(
geo_, geo_,
stroke_color_, stroke_color_,
stroke_width_, stroke_width_,

View File

@ -26,7 +26,7 @@ namespace kiwano
{ {
// 랗郭暠近실<E8BF91> // 랗郭暠近실<E8BF91>
class KGE_API ShapeActor class KGE_API ShapeActor
: public VisualActor : public Actor
{ {
public: public:
ShapeActor(); ShapeActor();
@ -49,8 +49,11 @@ namespace kiwano
// 삿혤窟係宮슥湳駕 // 삿혤窟係宮슥湳駕
StrokeStyle SetOutlineJoinStyle() const { return outline_join_; } StrokeStyle SetOutlineJoinStyle() const { return outline_join_; }
// »ñÈ¡±ß½ç
Rect GetBounds() const override;
// 삿혤棍학관鍋분 // 삿혤棍학관鍋분
Rect GetBoundingBox(); Rect GetBoundingBox() const override;
// 털뙤暠近角뤠관벵듐 // 털뙤暠近角뤠관벵듐
bool ContainsPoint( bool ContainsPoint(
@ -96,7 +99,7 @@ namespace kiwano
// 삿혤近榴 // 삿혤近榴
inline ComPtr<ID2D1Geometry> GetGeometry() const { return geo_; } inline ComPtr<ID2D1Geometry> GetGeometry() const { return geo_; }
void OnRender() override; void OnRender(Renderer* renderer) override;
protected: protected:
Color fill_color_; Color fill_color_;

View File

@ -83,11 +83,12 @@ namespace kiwano
} }
} }
void Sprite::OnRender() void Sprite::OnRender(Renderer* renderer)
{ {
if (frame_) if (frame_ && renderer->CheckVisibility(size_, transform_matrix_))
{ {
Renderer::GetInstance()->DrawBitmap(frame_->GetImage()->GetBitmap(), frame_->GetCropRect(), GetBounds()); PrepareRender(renderer);
renderer->DrawBitmap(frame_->GetImage()->GetBitmap(), frame_->GetCropRect(), GetBounds());
} }
} }
} }

View File

@ -26,7 +26,7 @@ namespace kiwano
{ {
// ¾«Áé // ¾«Áé
class KGE_API Sprite class KGE_API Sprite
: public VisualActor : public Actor
{ {
public: public:
Sprite(); Sprite();
@ -63,7 +63,7 @@ namespace kiwano
void SetFrame(FramePtr frame); void SetFrame(FramePtr frame);
// äÖȾ¾«Áé // äÖȾ¾«Áé
void OnRender() override; void OnRender(Renderer* renderer) override;
protected: protected:
FramePtr frame_; FramePtr frame_;

View File

@ -297,14 +297,14 @@ namespace kiwano
style_.outline_stroke = outline_stroke; style_.outline_stroke = outline_stroke;
} }
void Text::OnRender() void Text::OnRender(Renderer* renderer)
{ {
UpdateLayout(); UpdateLayout();
if (text_layout_) if (text_layout_ && renderer->CheckVisibility(layout_size_, transform_matrix_))
{ {
auto renderer = Renderer::GetInstance(); PrepareRender(renderer);
renderer->SetTextStyle( renderer->SetTextStyle(
GetDisplayedOpacity(), GetDisplayedOpacity(),
style_.color, style_.color,
style_.outline, style_.outline,

View File

@ -28,7 +28,7 @@ namespace kiwano
{ {
// 文本 // 文本
class KGE_API Text class KGE_API Text
: public VisualActor : public Actor
{ {
public: public:
Text(); Text();
@ -203,7 +203,7 @@ namespace kiwano
TextStyle const& style TextStyle const& style
); );
void OnRender() override; void OnRender(Renderer* renderer) override;
protected: protected:
void UpdateLayout() const; void UpdateLayout() const;

View File

@ -99,10 +99,8 @@ namespace kiwano
} }
} }
void Transition::Render() void Transition::Render(Renderer* renderer)
{ {
auto renderer = Renderer::GetInstance();
if (out_scene_) if (out_scene_)
{ {
renderer->PushClip( renderer->PushClip(
@ -111,7 +109,7 @@ namespace kiwano
); );
renderer->PushLayer(out_layer_, out_layer_prop_); renderer->PushLayer(out_layer_, out_layer_prop_);
out_scene_->Render(); out_scene_->Render(renderer);
renderer->PopLayer(); renderer->PopLayer();
renderer->PopClip(); renderer->PopClip();
@ -125,7 +123,7 @@ namespace kiwano
); );
renderer->PushLayer(in_layer_, in_layer_prop_); renderer->PushLayer(in_layer_, in_layer_prop_);
in_scene_->Render(); in_scene_->Render(renderer);
renderer->PopLayer(); renderer->PopLayer();
renderer->PopClip(); renderer->PopClip();

View File

@ -25,6 +25,7 @@
namespace kiwano namespace kiwano
{ {
class Director; class Director;
class Renderer;
// 舞台过渡 // 舞台过渡
class KGE_API Transition class KGE_API Transition
@ -49,7 +50,7 @@ namespace kiwano
virtual void Update(Duration dt); virtual void Update(Duration dt);
virtual void Render(); virtual void Render(Renderer* renderer);
virtual void Stop(); virtual void Stop();

View File

@ -25,6 +25,8 @@
namespace kiwano namespace kiwano
{ {
class Renderer;
class KGE_API Component class KGE_API Component
{ {
public: public:
@ -36,7 +38,7 @@ namespace kiwano
virtual void AfterUpdate() {} virtual void AfterUpdate() {}
virtual void BeforeRender() {} virtual void BeforeRender() {}
virtual void OnRender() {} virtual void OnRender(Renderer*) {}
virtual void AfterRender() {} virtual void AfterRender() {}
virtual void HandleEvent(Event&) {} virtual void HandleEvent(Event&) {}

View File

@ -75,7 +75,7 @@ namespace kiwano
if (show) if (show)
{ {
if (!debug_actor_) if (!debug_actor_)
debug_actor_ = new DebugNode; debug_actor_ = new DebugActor;
} }
else else
{ {
@ -124,19 +124,21 @@ namespace kiwano
debug_actor_->Update(dt); debug_actor_->Update(dt);
} }
void Director::OnRender() void Director::OnRender(Renderer* renderer)
{ {
if (transition_) if (transition_)
{ {
transition_->Render(); transition_->Render(renderer);
} }
else if (curr_scene_) else if (curr_scene_)
{ {
curr_scene_->Render(); curr_scene_->Render(renderer);
} }
if (debug_actor_) if (debug_actor_)
debug_actor_->Render(); {
debug_actor_->Render(renderer);
}
} }
void Director::AfterRender() void Director::AfterRender()

View File

@ -63,7 +63,7 @@ namespace kiwano
void OnUpdate(Duration dt) override; void OnUpdate(Duration dt) override;
void OnRender() override; void OnRender(Renderer* renderer) override;
void AfterRender() override; void AfterRender() override;

View File

@ -267,9 +267,10 @@ namespace kiwano
} }
// Rendering // Rendering
Renderer* renderer = Renderer::GetInstance();
for (Component* c : components_) for (Component* c : components_)
{ {
c->OnRender(); c->OnRender(renderer);
} }
// After render // After render

View File

@ -484,4 +484,11 @@ namespace kiwano
return S_OK; return S_OK;
} }
bool Renderer::CheckVisibility(Size const& content_size, Matrix const& transform)
{
return Rect{ Point{}, output_size_ }.Intersects(
transform.Transform(Rect{ Point{}, content_size })
);
}
} }

View File

@ -147,6 +147,11 @@ namespace kiwano
UINT height UINT height
); );
bool CheckVisibility(
Size const& content_size,
Matrix const& transform
);
public: public:
void SetupComponent() override; void SetupComponent() override;