412 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
		
		
			
		
	
	
			412 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
| 
								 | 
							
								// Copyright (c) 2016-2018 Easy2D - Nomango
							 | 
						|||
| 
								 | 
							
								// 
							 | 
						|||
| 
								 | 
							
								// Permission is hereby granted, free of charge, to any person obtaining a copy
							 | 
						|||
| 
								 | 
							
								// of this software and associated documentation files (the "Software"), to deal
							 | 
						|||
| 
								 | 
							
								// in the Software without restriction, including without limitation the rights
							 | 
						|||
| 
								 | 
							
								// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
							 | 
						|||
| 
								 | 
							
								// copies of the Software, and to permit persons to whom the Software is
							 | 
						|||
| 
								 | 
							
								// furnished to do so, subject to the following conditions:
							 | 
						|||
| 
								 | 
							
								// 
							 | 
						|||
| 
								 | 
							
								// The above copyright notice and this permission notice shall be included in
							 | 
						|||
| 
								 | 
							
								// all copies or substantial portions of the Software.
							 | 
						|||
| 
								 | 
							
								// 
							 | 
						|||
| 
								 | 
							
								// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
							 | 
						|||
| 
								 | 
							
								// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
							 | 
						|||
| 
								 | 
							
								// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
							 | 
						|||
| 
								 | 
							
								// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
							 | 
						|||
| 
								 | 
							
								// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
							 | 
						|||
| 
								 | 
							
								// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
							 | 
						|||
| 
								 | 
							
								// THE SOFTWARE.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#pragma once
							 | 
						|||
| 
								 | 
							
								#include "include-forwards.h"
							 | 
						|||
| 
								 | 
							
								#include "Transform.hpp"
							 | 
						|||
| 
								 | 
							
								#include "ActionManager.h"
							 | 
						|||
| 
								 | 
							
								#include "../base/TimerManager.h"
							 | 
						|||
| 
								 | 
							
								#include "../base/EventDispatcher.h"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace easy2d
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									class Application;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									// <20>ڵ<EFBFBD>
							 | 
						|||
| 
								 | 
							
									class E2D_API Node
							 | 
						|||
| 
								 | 
							
										: public virtual Object
							 | 
						|||
| 
								 | 
							
										, public TimerManager
							 | 
						|||
| 
								 | 
							
										, public ActionManager
							 | 
						|||
| 
								 | 
							
										, public EventDispatcher
							 | 
						|||
| 
								 | 
							
										, public IntrusiveListItem<NodePtr>
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										friend class Application;
							 | 
						|||
| 
								 | 
							
										friend class Transition;
							 | 
						|||
| 
								 | 
							
										friend class IntrusiveList<NodePtr>;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										using Children = IntrusiveList<NodePtr>;
							 | 
						|||
| 
								 | 
							
										using UpdateCallback = std::function<void(Duration)>;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public:
							 | 
						|||
| 
								 | 
							
										Node();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD>½ڵ<C2BD>
							 | 
						|||
| 
								 | 
							
										virtual void OnUpdate(Duration dt) { E2D_NOT_USED(dt); }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>Ⱦ<EFBFBD>ڵ<EFBFBD>
							 | 
						|||
| 
								 | 
							
										virtual void OnRender() {}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1>ʾ״̬
							 | 
						|||
| 
								 | 
							
										bool IsVisible()				const	{ return visible_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD>Ƶ<EFBFBD> Hash ֵ
							 | 
						|||
| 
								 | 
							
										size_t GetHashName()			const	{ return hash_name_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ Z <20><>˳<EFBFBD><CBB3>
							 | 
						|||
| 
								 | 
							
										int GetZOrder()					const	{ return z_order_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										Point const& GetPosition()		const	{ return transform_.position; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ x <20><><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										float GetPositionX()			const	{ return transform_.position.x; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ y <20><><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										float GetPositionY()			const	{ return transform_.position.y; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
							 | 
						|||
| 
								 | 
							
										float GetScaleX()				const	{ return transform_.scale.x; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
							 | 
						|||
| 
								 | 
							
										float GetScaleY()				const	{ return transform_.scale.y; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>нǶ<D0BD>
							 | 
						|||
| 
								 | 
							
										float GetSkewX()				const	{ return transform_.skew.x; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>нǶ<D0BD>
							 | 
						|||
| 
								 | 
							
										float GetSkewY()				const	{ return transform_.skew.y; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1>ת<EFBFBD>Ƕ<EFBFBD>
							 | 
						|||
| 
								 | 
							
										float GetRotation()				const	{ return transform_.rotation; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										float GetWidth()				const	{ return size_.x; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD>߶<EFBFBD>
							 | 
						|||
| 
								 | 
							
										float GetHeight()				const	{ return size_.y; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1>С
							 | 
						|||
| 
								 | 
							
										Size const& GetSize()			const	{ return size_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ź<EFBFBD><C5BA>Ŀ<EFBFBD><C4BF><EFBFBD>
							 | 
						|||
| 
								 | 
							
										float GetScaledWidth()			const	{ return size_.x * transform_.scale.x; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ź<EFBFBD><C5BA>ĸ߶<C4B8>
							 | 
						|||
| 
								 | 
							
										float GetScaledHeight()			const	{ return size_.y * transform_.scale.y; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ź<EFBFBD><C5BA>Ĵ<EFBFBD>С
							 | 
						|||
| 
								 | 
							
										Size GetScaledSize()			const	{ return Size{ GetScaledWidth(), GetScaledHeight() }; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ x <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA>
							 | 
						|||
| 
								 | 
							
										float GetAnchorX()				const	{ return anchor_.x; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ y <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA>
							 | 
						|||
| 
								 | 
							
										float GetAnchorY()				const	{ return anchor_.y; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<C8A1><CDB8><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										float GetOpacity()				const	{ return opacity_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD>任
							 | 
						|||
| 
								 | 
							
										Transform const& GetTransform()	const	{ return transform_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD>߿<EFBFBD>
							 | 
						|||
| 
								 | 
							
										Rect GetBounds() const;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD>а<EFBFBD>Χ<EFBFBD><CEA7>
							 | 
						|||
| 
								 | 
							
										Rect GetBoundingBox() const;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1>ά<EFBFBD>任<EFBFBD><E4BBBB><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										Matrix const& GetTransformMatrix()  const;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1>ά<EFBFBD>任<EFBFBD><E4BBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										Matrix const& GetTransformInverseMatrix()  const;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڵ<EFBFBD>
							 | 
						|||
| 
								 | 
							
										inline Node* GetParent() const { return parent_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD>
							 | 
						|||
| 
								 | 
							
										inline Scene* GetScene() const { return scene_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
							 | 
						|||
| 
								 | 
							
										void SetVisible(
							 | 
						|||
| 
								 | 
							
											bool val
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										void SetName(
							 | 
						|||
| 
								 | 
							
											String const& name
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										void SetPositionX(
							 | 
						|||
| 
								 | 
							
											float x
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										void SetPositionY(
							 | 
						|||
| 
								 | 
							
											float y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										void SetPosition(
							 | 
						|||
| 
								 | 
							
											const Point & point
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										void SetPosition(
							 | 
						|||
| 
								 | 
							
											float x,
							 | 
						|||
| 
								 | 
							
											float y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>ƶ<EFBFBD>
							 | 
						|||
| 
								 | 
							
										void Move(
							 | 
						|||
| 
								 | 
							
											float x,
							 | 
						|||
| 
								 | 
							
											float y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>ƶ<EFBFBD>
							 | 
						|||
| 
								 | 
							
										void Move(
							 | 
						|||
| 
								 | 
							
											const Point & vector
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 1.0
							 | 
						|||
| 
								 | 
							
										void SetScaleX(
							 | 
						|||
| 
								 | 
							
											float scale_x
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 1.0
							 | 
						|||
| 
								 | 
							
										void SetScaleY(
							 | 
						|||
| 
								 | 
							
											float scale_y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ (1.0, 1.0)
							 | 
						|||
| 
								 | 
							
										void SetScale(
							 | 
						|||
| 
								 | 
							
											float scale_x,
							 | 
						|||
| 
								 | 
							
											float scale_y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 1.0
							 | 
						|||
| 
								 | 
							
										void SetScale(
							 | 
						|||
| 
								 | 
							
											float scale
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>нǶ<D0BD>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 0
							 | 
						|||
| 
								 | 
							
										void SetSkewX(
							 | 
						|||
| 
								 | 
							
											float skew_x
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>нǶ<D0BD>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 0
							 | 
						|||
| 
								 | 
							
										void SetSkewY(
							 | 
						|||
| 
								 | 
							
											float skew_y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD>ô<EFBFBD><C3B4>нǶ<D0BD>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ (0, 0)
							 | 
						|||
| 
								 | 
							
										void SetSkew(
							 | 
						|||
| 
								 | 
							
											float skew_x,
							 | 
						|||
| 
								 | 
							
											float skew_y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 0
							 | 
						|||
| 
								 | 
							
										void SetRotation(
							 | 
						|||
| 
								 | 
							
											float rotation
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD>λ<EFBFBD><CEBB>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 0, <20><>Χ [0, 1]
							 | 
						|||
| 
								 | 
							
										void SetAnchorX(
							 | 
						|||
| 
								 | 
							
											float anchor_x
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 0, <20><>Χ [0, 1]
							 | 
						|||
| 
								 | 
							
										void SetAnchorY(
							 | 
						|||
| 
								 | 
							
											float anchor_y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA>λ<EFBFBD><CEBB>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ (0, 0), <20><>Χ [0, 1]
							 | 
						|||
| 
								 | 
							
										void SetAnchor(
							 | 
						|||
| 
								 | 
							
											float anchor_x,
							 | 
						|||
| 
								 | 
							
											float anchor_y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>Ŀ<DEB8><C4BF><EFBFBD>
							 | 
						|||
| 
								 | 
							
										void SetWidth(
							 | 
						|||
| 
								 | 
							
											float width
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>ĸ߶<C4B8>
							 | 
						|||
| 
								 | 
							
										void SetHeight(
							 | 
						|||
| 
								 | 
							
											float height
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>Ĵ<DEB8>С
							 | 
						|||
| 
								 | 
							
										void SetSize(
							 | 
						|||
| 
								 | 
							
											float width,
							 | 
						|||
| 
								 | 
							
											float height
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>Ĵ<DEB8>С
							 | 
						|||
| 
								 | 
							
										void SetSize(
							 | 
						|||
| 
								 | 
							
											const Size & size
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										void SetTransform(
							 | 
						|||
| 
								 | 
							
											Transform const& transform
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 1.0, <20><>Χ [0, 1]
							 | 
						|||
| 
								 | 
							
										void SetOpacity(
							 | 
						|||
| 
								 | 
							
											float opacity
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD> Z <20><>˳<EFBFBD><CBB3>
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ 0
							 | 
						|||
| 
								 | 
							
										void SetZOrder(
							 | 
						|||
| 
								 | 
							
											int zorder
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ӧ (<28><><EFBFBD><EFBFBD> Hover | Out | Click <20><>Ϣ)
							 | 
						|||
| 
								 | 
							
										// Ĭ<><C4AC>Ϊ false
							 | 
						|||
| 
								 | 
							
										void SetResponsible(
							 | 
						|||
| 
								 | 
							
											bool enable
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7>ڽڵ<DABD><DAB5><EFBFBD>
							 | 
						|||
| 
								 | 
							
										bool ContainsPoint(
							 | 
						|||
| 
								 | 
							
											const Point& point
							 | 
						|||
| 
								 | 
							
										)  const;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
							 | 
						|||
| 
								 | 
							
										void AddChild(
							 | 
						|||
| 
								 | 
							
											NodePtr const& child
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ӽڵ<D3BD>
							 | 
						|||
| 
								 | 
							
										void AddChildren(
							 | 
						|||
| 
								 | 
							
											Array<NodePtr> const& children
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ӽڵ<D3BD>
							 | 
						|||
| 
								 | 
							
										Array<NodePtr> GetChildren(
							 | 
						|||
| 
								 | 
							
											String const& name
							 | 
						|||
| 
								 | 
							
										) const;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ӽڵ<D3BD>
							 | 
						|||
| 
								 | 
							
										NodePtr GetChild(
							 | 
						|||
| 
								 | 
							
											String const& name
							 | 
						|||
| 
								 | 
							
										) const;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡȫ<C8A1><C8AB><EFBFBD>ӽڵ<D3BD>
							 | 
						|||
| 
								 | 
							
										Children const& GetChildren() const;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>Ƴ<EFBFBD><C6B3>ӽڵ<D3BD>
							 | 
						|||
| 
								 | 
							
										bool RemoveChild(
							 | 
						|||
| 
								 | 
							
											NodePtr const& child
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>Ƴ<EFBFBD><C6B3>ӽڵ<D3BD>
							 | 
						|||
| 
								 | 
							
										bool RemoveChild(
							 | 
						|||
| 
								 | 
							
											Node* child
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ӽڵ<D3BD>
							 | 
						|||
| 
								 | 
							
										void RemoveChildren(
							 | 
						|||
| 
								 | 
							
											String const& child_name
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>нڵ<D0BD>
							 | 
						|||
| 
								 | 
							
										void RemoveAllChildren();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>Ӹ<EFBFBD><D3B8>ڵ<EFBFBD><DAB5>Ƴ<EFBFBD>
							 | 
						|||
| 
								 | 
							
										void RemoveFromParent();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ͣ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										inline void PauseUpdating()									{ update_pausing_ = true; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										inline void ResumeUpdating()								{ update_pausing_ = false; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͣ
							 | 
						|||
| 
								 | 
							
										inline bool IsUpdatePausing() const							{ return update_pausing_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD>ʱ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										inline void SetCallbackOnUpdate(UpdateCallback const& cb)	{ cb_update_ = cb; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʱ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
							 | 
						|||
| 
								 | 
							
										inline UpdateCallback const& GetCallbackOnUpdate()			{ return cb_update_; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										// <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ê<EFBFBD><C3AA>
							 | 
						|||
| 
								 | 
							
										static void SetDefaultAnchor(
							 | 
						|||
| 
								 | 
							
											float anchor_x,
							 | 
						|||
| 
								 | 
							
											float anchor_y
							 | 
						|||
| 
								 | 
							
										);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public:
							 | 
						|||
| 
								 | 
							
										// <20>¼<EFBFBD><C2BC>ַ<EFBFBD>
							 | 
						|||
| 
								 | 
							
										void Dispatch(Event& evt) override;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									protected:
							 | 
						|||
| 
								 | 
							
										virtual void PrepareRender() {}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										void Update(Duration dt);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										void Render();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										void UpdateTransform() const;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										void UpdateOpacity();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										void SetScene(Scene* scene);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									protected:
							 | 
						|||
| 
								 | 
							
										bool		visible_;
							 | 
						|||
| 
								 | 
							
										bool		hover_;
							 | 
						|||
| 
								 | 
							
										bool		pressed_;
							 | 
						|||
| 
								 | 
							
										bool		responsible_;
							 | 
						|||
| 
								 | 
							
										bool		update_pausing_;
							 | 
						|||
| 
								 | 
							
										int			z_order_;
							 | 
						|||
| 
								 | 
							
										float		opacity_;
							 | 
						|||
| 
								 | 
							
										float		display_opacity_;
							 | 
						|||
| 
								 | 
							
										size_t		hash_name_;
							 | 
						|||
| 
								 | 
							
										Transform	transform_;
							 | 
						|||
| 
								 | 
							
										Point		anchor_;
							 | 
						|||
| 
								 | 
							
										Size		size_;
							 | 
						|||
| 
								 | 
							
										Node*		parent_;
							 | 
						|||
| 
								 | 
							
										Scene*		scene_;
							 | 
						|||
| 
								 | 
							
										Children	children_;
							 | 
						|||
| 
								 | 
							
										UpdateCallback cb_update_;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										mutable bool	dirty_transform_;
							 | 
						|||
| 
								 | 
							
										mutable bool	dirty_transform_inverse_;
							 | 
						|||
| 
								 | 
							
										mutable Matrix	transform_matrix_;
							 | 
						|||
| 
								 | 
							
										mutable Matrix	transform_matrix_inverse_;
							 | 
						|||
| 
								 | 
							
									};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									// <20><><EFBFBD>ӻ<EFBFBD><D3BB>ڵ<EFBFBD>
							 | 
						|||
| 
								 | 
							
									class E2D_API VisualNode
							 | 
						|||
| 
								 | 
							
										: public Node
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
									public:
							 | 
						|||
| 
								 | 
							
										virtual void PrepareRender() override;
							 | 
						|||
| 
								 | 
							
									};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								}
							 |