add Renderer::CheckVisibility()
This commit is contained in:
parent
ab9ffb5e79
commit
47be1dc413
|
|
@ -33,8 +33,9 @@ namespace kiwano
|
|||
{
|
||||
}
|
||||
|
||||
void ImGuiLayer::OnRender()
|
||||
void ImGuiLayer::OnRender(Renderer* renderer)
|
||||
{
|
||||
PrepareRender(renderer);
|
||||
for (const auto& pipeline : pipelines_)
|
||||
{
|
||||
pipeline.second();
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ namespace kiwano
|
|||
void RemoveAllItems();
|
||||
|
||||
public:
|
||||
void OnRender() override;
|
||||
void OnRender(Renderer* renderer) override;
|
||||
|
||||
protected:
|
||||
Map<String, ImGuiPipeline> pipelines_;
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ namespace kiwano
|
|||
}
|
||||
}
|
||||
|
||||
void Actor::Render()
|
||||
void Actor::Render(Renderer* renderer)
|
||||
{
|
||||
if (!visible_)
|
||||
return;
|
||||
|
|
@ -91,8 +91,7 @@ namespace kiwano
|
|||
|
||||
if (children_.is_empty())
|
||||
{
|
||||
PrepareRender();
|
||||
OnRender();
|
||||
OnRender(renderer);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -103,21 +102,26 @@ namespace kiwano
|
|||
if (child->GetZOrder() >= 0)
|
||||
break;
|
||||
|
||||
child->Render();
|
||||
child->Render(renderer);
|
||||
child = child->next_item().get();
|
||||
}
|
||||
|
||||
PrepareRender();
|
||||
OnRender();
|
||||
OnRender(renderer);
|
||||
|
||||
while (child)
|
||||
{
|
||||
child->Render();
|
||||
child->Render(renderer);
|
||||
child = child->next_item().get();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Actor::PrepareRender(Renderer* renderer)
|
||||
{
|
||||
renderer->SetTransform(transform_matrix_);
|
||||
renderer->SetOpacity(displayed_opacity_);
|
||||
}
|
||||
|
||||
void Actor::RenderBorder()
|
||||
{
|
||||
if (show_border_)
|
||||
|
|
@ -656,12 +660,4 @@ namespace kiwano
|
|||
return GetBounds().ContainsPoint(local);
|
||||
}
|
||||
|
||||
|
||||
void VisualActor::PrepareRender()
|
||||
{
|
||||
auto renderer = Renderer::GetInstance();
|
||||
renderer->SetTransform(transform_matrix_);
|
||||
renderer->SetOpacity(displayed_opacity_);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
namespace kiwano
|
||||
{
|
||||
class Director;
|
||||
class Renderer;
|
||||
|
||||
// 실<>
|
||||
class KGE_API Actor
|
||||
|
|
@ -51,7 +52,7 @@ namespace kiwano
|
|||
virtual void OnUpdate(Duration dt) { KGE_UNUSED(dt); }
|
||||
|
||||
// 斡횡실<ED9AA1>
|
||||
virtual void OnRender() {}
|
||||
virtual void OnRender(Renderer* renderer) { KGE_UNUSED(renderer); }
|
||||
|
||||
// 삿혤鞫刻榴檄
|
||||
bool IsVisible() const { return visible_; }
|
||||
|
|
@ -135,10 +136,10 @@ namespace kiwano
|
|||
Transform GetTransform() const { return transform_; }
|
||||
|
||||
// 삿혤긋움
|
||||
Rect GetBounds() const;
|
||||
virtual Rect GetBounds() const;
|
||||
|
||||
// 삿혤棍학관鍋분
|
||||
Rect GetBoundingBox() const;
|
||||
virtual Rect GetBoundingBox() const;
|
||||
|
||||
// 삿혤랗郭긴뻣앤黎
|
||||
Matrix const& GetTransformMatrix() const;
|
||||
|
|
@ -379,6 +380,9 @@ namespace kiwano
|
|||
// 닒만실<EBA78C>盧뇜
|
||||
void RemoveFromParent();
|
||||
|
||||
// 事件分发
|
||||
void Dispatch(Event& evt) override;
|
||||
|
||||
// 董界실<E7958C>뫘劤
|
||||
inline void PauseUpdating() { update_pausing_ = true; }
|
||||
|
||||
|
|
@ -403,16 +407,12 @@ namespace kiwano
|
|||
float anchor_y
|
||||
);
|
||||
|
||||
public:
|
||||
// 事件分发
|
||||
void Dispatch(Event& evt) override;
|
||||
|
||||
protected:
|
||||
virtual void PrepareRender() {}
|
||||
|
||||
virtual void Update(Duration dt);
|
||||
|
||||
virtual void Render();
|
||||
virtual void Render(Renderer* renderer);
|
||||
|
||||
void PrepareRender(Renderer* renderer);
|
||||
|
||||
void RenderBorder();
|
||||
|
||||
|
|
@ -451,14 +451,4 @@ namespace kiwano
|
|||
mutable Matrix transform_matrix_inverse_;
|
||||
};
|
||||
|
||||
|
||||
// 可视角色
|
||||
// 在渲染前处理二维旋转矩阵和透明度
|
||||
class KGE_API VisualActor
|
||||
: public Actor
|
||||
{
|
||||
public:
|
||||
virtual void PrepareRender() override;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ namespace kiwano
|
|||
cache_expired_ = true;
|
||||
}
|
||||
|
||||
void Canvas::OnRender()
|
||||
void Canvas::OnRender(Renderer* renderer)
|
||||
{
|
||||
if (cache_expired_)
|
||||
{
|
||||
|
|
@ -95,8 +95,10 @@ namespace kiwano
|
|||
|
||||
if (bitmap_cached_)
|
||||
{
|
||||
PrepareRender(renderer);
|
||||
|
||||
Rect bitmap_rect(0.f, 0.f, bitmap_cached_->GetSize().width, bitmap_cached_->GetSize().height);
|
||||
Renderer::GetInstance()->DrawBitmap(
|
||||
renderer->DrawBitmap(
|
||||
bitmap_cached_,
|
||||
bitmap_rect,
|
||||
bitmap_rect
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ namespace kiwano
|
|||
{
|
||||
// 画布
|
||||
class KGE_API Canvas
|
||||
: public VisualActor
|
||||
: public Actor
|
||||
{
|
||||
public:
|
||||
Canvas();
|
||||
|
|
@ -211,7 +211,7 @@ namespace kiwano
|
|||
// 导出为图片
|
||||
ImagePtr ExportToImage() const;
|
||||
|
||||
void OnRender() override;
|
||||
void OnRender(Renderer* renderer) override;
|
||||
|
||||
protected:
|
||||
ComPtr<ID2D1Bitmap> const& GetBitmap() const;
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
namespace kiwano
|
||||
{
|
||||
DebugNode::DebugNode()
|
||||
DebugActor::DebugActor()
|
||||
: background_color_(0.0f, 0.0f, 0.0f, 0.7f)
|
||||
{
|
||||
SetName(L"kiwano-debug-actor");
|
||||
|
|
@ -54,13 +54,13 @@ namespace kiwano
|
|||
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->GetD2DDeviceResources()->GetDeviceContext()->FillRoundedRectangle(
|
||||
|
|
@ -69,7 +69,7 @@ namespace kiwano
|
|||
);
|
||||
}
|
||||
|
||||
void DebugNode::OnUpdate(Duration dt)
|
||||
void DebugActor::OnUpdate(Duration dt)
|
||||
{
|
||||
KGE_UNUSED(dt);
|
||||
|
||||
|
|
|
|||
|
|
@ -23,15 +23,15 @@
|
|||
|
||||
namespace kiwano
|
||||
{
|
||||
class KGE_API DebugNode
|
||||
: public VisualActor
|
||||
class KGE_API DebugActor
|
||||
: public Actor
|
||||
{
|
||||
public:
|
||||
DebugNode();
|
||||
DebugActor();
|
||||
|
||||
virtual ~DebugNode();
|
||||
virtual ~DebugActor();
|
||||
|
||||
void OnRender() override;
|
||||
void OnRender(Renderer* renderer) override;
|
||||
|
||||
void OnUpdate(Duration dt) override;
|
||||
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ namespace kiwano
|
|||
|
||||
void GifSprite::Update(Duration dt)
|
||||
{
|
||||
VisualActor::Update(dt);
|
||||
Actor::Update(dt);
|
||||
|
||||
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();
|
||||
Renderer::GetInstance()->DrawBitmap(frame_to_render_, bounds, bounds);
|
||||
renderer->DrawBitmap(frame_to_render_, bounds, bounds);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
namespace kiwano
|
||||
{
|
||||
class KGE_API GifSprite
|
||||
: public VisualActor
|
||||
: public Actor
|
||||
{
|
||||
public:
|
||||
using LoopDoneCallback = Function<void(int)>;
|
||||
|
|
@ -67,7 +67,7 @@ namespace kiwano
|
|||
|
||||
inline DoneCallback GetDoneCallback() const { return done_cb_; }
|
||||
|
||||
void OnRender() override;
|
||||
void OnRender(Renderer* renderer) override;
|
||||
|
||||
protected:
|
||||
void Update(Duration dt) override;
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ namespace kiwano
|
|||
{
|
||||
}
|
||||
|
||||
Rect ShapeActor::GetBoundingBox()
|
||||
Rect ShapeActor::GetBounds() const
|
||||
{
|
||||
if (!geo_)
|
||||
return Rect{};
|
||||
|
|
@ -52,6 +52,17 @@ namespace kiwano
|
|||
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 length = 0.f;
|
||||
|
|
@ -125,16 +136,18 @@ namespace kiwano
|
|||
outline_join_ = outline_join;
|
||||
}
|
||||
|
||||
void ShapeActor::OnRender()
|
||||
void ShapeActor::OnRender(Renderer* renderer)
|
||||
{
|
||||
if (geo_)
|
||||
{
|
||||
Renderer::GetInstance()->FillGeometry(
|
||||
PrepareRender(renderer);
|
||||
|
||||
renderer->FillGeometry(
|
||||
geo_,
|
||||
fill_color_
|
||||
);
|
||||
|
||||
Renderer::GetInstance()->DrawGeometry(
|
||||
renderer->DrawGeometry(
|
||||
geo_,
|
||||
stroke_color_,
|
||||
stroke_width_,
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ namespace kiwano
|
|||
{
|
||||
// 랗郭暠近실<E8BF91>
|
||||
class KGE_API ShapeActor
|
||||
: public VisualActor
|
||||
: public Actor
|
||||
{
|
||||
public:
|
||||
ShapeActor();
|
||||
|
|
@ -49,8 +49,11 @@ namespace kiwano
|
|||
// 삿혤窟係宮슥湳駕
|
||||
StrokeStyle SetOutlineJoinStyle() const { return outline_join_; }
|
||||
|
||||
// »ñÈ¡±ß½ç
|
||||
Rect GetBounds() const override;
|
||||
|
||||
// 삿혤棍학관鍋분
|
||||
Rect GetBoundingBox();
|
||||
Rect GetBoundingBox() const override;
|
||||
|
||||
// 털뙤暠近角뤠관벵듐
|
||||
bool ContainsPoint(
|
||||
|
|
@ -96,7 +99,7 @@ namespace kiwano
|
|||
// 삿혤近榴
|
||||
inline ComPtr<ID2D1Geometry> GetGeometry() const { return geo_; }
|
||||
|
||||
void OnRender() override;
|
||||
void OnRender(Renderer* renderer) override;
|
||||
|
||||
protected:
|
||||
Color fill_color_;
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ namespace kiwano
|
|||
{
|
||||
// ¾«Áé
|
||||
class KGE_API Sprite
|
||||
: public VisualActor
|
||||
: public Actor
|
||||
{
|
||||
public:
|
||||
Sprite();
|
||||
|
|
@ -63,7 +63,7 @@ namespace kiwano
|
|||
void SetFrame(FramePtr frame);
|
||||
|
||||
// äÖȾ¾«Áé
|
||||
void OnRender() override;
|
||||
void OnRender(Renderer* renderer) override;
|
||||
|
||||
protected:
|
||||
FramePtr frame_;
|
||||
|
|
|
|||
|
|
@ -297,14 +297,14 @@ namespace kiwano
|
|||
style_.outline_stroke = outline_stroke;
|
||||
}
|
||||
|
||||
void Text::OnRender()
|
||||
void Text::OnRender(Renderer* renderer)
|
||||
{
|
||||
UpdateLayout();
|
||||
|
||||
if (text_layout_)
|
||||
if (text_layout_ && renderer->CheckVisibility(layout_size_, transform_matrix_))
|
||||
{
|
||||
auto renderer = Renderer::GetInstance();
|
||||
renderer->SetTextStyle(
|
||||
PrepareRender(renderer);
|
||||
renderer->SetTextStyle(
|
||||
GetDisplayedOpacity(),
|
||||
style_.color,
|
||||
style_.outline,
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ namespace kiwano
|
|||
{
|
||||
// Îı¾
|
||||
class KGE_API Text
|
||||
: public VisualActor
|
||||
: public Actor
|
||||
{
|
||||
public:
|
||||
Text();
|
||||
|
|
@ -203,7 +203,7 @@ namespace kiwano
|
|||
TextStyle const& style
|
||||
);
|
||||
|
||||
void OnRender() override;
|
||||
void OnRender(Renderer* renderer) override;
|
||||
|
||||
protected:
|
||||
void UpdateLayout() const;
|
||||
|
|
@ -218,4 +218,4 @@ namespace kiwano
|
|||
mutable ComPtr<IDWriteTextFormat> text_format_;
|
||||
mutable ComPtr<IDWriteTextLayout> text_layout_;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,10 +99,8 @@ namespace kiwano
|
|||
}
|
||||
}
|
||||
|
||||
void Transition::Render()
|
||||
void Transition::Render(Renderer* renderer)
|
||||
{
|
||||
auto renderer = Renderer::GetInstance();
|
||||
|
||||
if (out_scene_)
|
||||
{
|
||||
renderer->PushClip(
|
||||
|
|
@ -111,7 +109,7 @@ namespace kiwano
|
|||
);
|
||||
renderer->PushLayer(out_layer_, out_layer_prop_);
|
||||
|
||||
out_scene_->Render();
|
||||
out_scene_->Render(renderer);
|
||||
|
||||
renderer->PopLayer();
|
||||
renderer->PopClip();
|
||||
|
|
@ -125,7 +123,7 @@ namespace kiwano
|
|||
);
|
||||
renderer->PushLayer(in_layer_, in_layer_prop_);
|
||||
|
||||
in_scene_->Render();
|
||||
in_scene_->Render(renderer);
|
||||
|
||||
renderer->PopLayer();
|
||||
renderer->PopClip();
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
namespace kiwano
|
||||
{
|
||||
class Director;
|
||||
class Renderer;
|
||||
|
||||
// 舞台过渡
|
||||
class KGE_API Transition
|
||||
|
|
@ -49,7 +50,7 @@ namespace kiwano
|
|||
|
||||
virtual void Update(Duration dt);
|
||||
|
||||
virtual void Render();
|
||||
virtual void Render(Renderer* renderer);
|
||||
|
||||
virtual void Stop();
|
||||
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@
|
|||
|
||||
namespace kiwano
|
||||
{
|
||||
class Renderer;
|
||||
|
||||
class KGE_API Component
|
||||
{
|
||||
public:
|
||||
|
|
@ -36,7 +38,7 @@ namespace kiwano
|
|||
virtual void AfterUpdate() {}
|
||||
|
||||
virtual void BeforeRender() {}
|
||||
virtual void OnRender() {}
|
||||
virtual void OnRender(Renderer*) {}
|
||||
virtual void AfterRender() {}
|
||||
|
||||
virtual void HandleEvent(Event&) {}
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ namespace kiwano
|
|||
if (show)
|
||||
{
|
||||
if (!debug_actor_)
|
||||
debug_actor_ = new DebugNode;
|
||||
debug_actor_ = new DebugActor;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -124,19 +124,21 @@ namespace kiwano
|
|||
debug_actor_->Update(dt);
|
||||
}
|
||||
|
||||
void Director::OnRender()
|
||||
void Director::OnRender(Renderer* renderer)
|
||||
{
|
||||
if (transition_)
|
||||
{
|
||||
transition_->Render();
|
||||
transition_->Render(renderer);
|
||||
}
|
||||
else if (curr_scene_)
|
||||
{
|
||||
curr_scene_->Render();
|
||||
curr_scene_->Render(renderer);
|
||||
}
|
||||
|
||||
if (debug_actor_)
|
||||
debug_actor_->Render();
|
||||
{
|
||||
debug_actor_->Render(renderer);
|
||||
}
|
||||
}
|
||||
|
||||
void Director::AfterRender()
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ namespace kiwano
|
|||
|
||||
void OnUpdate(Duration dt) override;
|
||||
|
||||
void OnRender() override;
|
||||
void OnRender(Renderer* renderer) override;
|
||||
|
||||
void AfterRender() override;
|
||||
|
||||
|
|
|
|||
|
|
@ -267,9 +267,10 @@ namespace kiwano
|
|||
}
|
||||
|
||||
// Rendering
|
||||
Renderer* renderer = Renderer::GetInstance();
|
||||
for (Component* c : components_)
|
||||
{
|
||||
c->OnRender();
|
||||
c->OnRender(renderer);
|
||||
}
|
||||
|
||||
// After render
|
||||
|
|
|
|||
|
|
@ -484,4 +484,11 @@ namespace kiwano
|
|||
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 })
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -147,6 +147,11 @@ namespace kiwano
|
|||
UINT height
|
||||
);
|
||||
|
||||
bool CheckVisibility(
|
||||
Size const& content_size,
|
||||
Matrix const& transform
|
||||
);
|
||||
|
||||
public:
|
||||
void SetupComponent() override;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue