refactoring
This commit is contained in:
Haibo 2018-11-25 15:00:15 +08:00 committed by Nomango
parent 1d86da332c
commit ae2e5dad31
32 changed files with 377 additions and 759 deletions

View File

@ -75,7 +75,7 @@ namespace easy2d
}
Canvas::Canvas(Size const & size)
: Canvas(size.width, size.height)
: Canvas(size.x, size.y)
{
}
@ -158,7 +158,7 @@ namespace easy2d
return stroke_width_;
}
void Canvas::SetBrushTransform(math::Matrix const & transform)
void Canvas::SetBrushTransform(Matrix const & transform)
{
render_target_->SetTransform(transform);
}
@ -217,8 +217,8 @@ namespace easy2d
D2D1::RectF(
rect.origin.x,
rect.origin.y,
rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height
rect.origin.x + rect.size.x,
rect.origin.y + rect.size.y
),
stroke_brush_.Get(),
stroke_width_,
@ -234,8 +234,8 @@ namespace easy2d
D2D1::RectF(
rect.origin.x,
rect.origin.y,
rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height
rect.origin.x + rect.size.x,
rect.origin.y + rect.size.y
),
radius_x,
radius_y
@ -345,8 +345,8 @@ namespace easy2d
D2D1::RectF(
rect.origin.x,
rect.origin.y,
rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height
rect.origin.x + rect.size.x,
rect.origin.y + rect.size.y
),
fill_brush_.Get()
);
@ -360,8 +360,8 @@ namespace easy2d
D2D1::RectF(
rect.origin.x,
rect.origin.y,
rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height
rect.origin.x + rect.size.x,
rect.origin.y + rect.size.y
),
radius_x,
radius_y

View File

@ -212,7 +212,7 @@ namespace easy2d
// 变换画笔
void SetBrushTransform(
math::Matrix const& transform
Matrix const& transform
);
// 导出为图片

View File

@ -70,7 +70,7 @@ namespace easy2d
{
auto graphics = Graphics::Instance();
graphics->SetTransform(math::Matrix{});
graphics->SetTransform(Matrix{});
graphics->GetSolidBrush()->SetColor(Color(0.0f, 0.0f, 0.0f, 0.5f));

View File

@ -351,7 +351,7 @@ namespace easy2d
HRESULT FactoryImpl::CreateTransformedGeometry(
cpTransformedGeometry& transformed,
math::Matrix const& matrix,
Matrix const& matrix,
cpGeometry const& geo
) const
{

View File

@ -82,7 +82,7 @@ namespace easy2d
HRESULT CreateTransformedGeometry(
cpTransformedGeometry& transformed,
math::Matrix const& matrix,
Matrix const& matrix,
cpGeometry const& geo
) const;

View File

@ -113,19 +113,19 @@ namespace easy2d
auto bitmap_size = bitmap_->GetSize();
crop_rect_.origin.x = std::min(std::max(crop_rect.origin.x, 0.f), bitmap_size.width);
crop_rect_.origin.y = std::min(std::max(crop_rect.origin.y, 0.f), bitmap_size.height);
crop_rect_.size.width = std::min(std::max(crop_rect.size.width, 0.f), bitmap_size.width - crop_rect.origin.x);
crop_rect_.size.height = std::min(std::max(crop_rect.size.height, 0.f), bitmap_size.height - crop_rect.origin.y);
crop_rect_.size.x = std::min(std::max(crop_rect.size.x, 0.f), bitmap_size.width - crop_rect.origin.x);
crop_rect_.size.y = std::min(std::max(crop_rect.size.y, 0.f), bitmap_size.height - crop_rect.origin.y);
}
}
float Image::GetWidth() const
{
return crop_rect_.size.width;
return crop_rect_.size.x;
}
float Image::GetHeight() const
{
return crop_rect_.size.height;
return crop_rect_.size.y;
}
Size Image::GetSize() const
@ -139,10 +139,7 @@ namespace easy2d
{
return bitmap_->GetSize().width;
}
else
{
return 0;
}
return 0;
}
float Image::GetSourceHeight() const
@ -151,10 +148,7 @@ namespace easy2d
{
return bitmap_->GetSize().height;
}
else
{
return 0;
}
return 0;
}
Size Image::GetSourceSize() const
@ -198,8 +192,8 @@ namespace easy2d
{
bitmap_ = bitmap;
crop_rect_.origin.x = crop_rect_.origin.y = 0;
crop_rect_.size.width = bitmap_->GetSize().width;
crop_rect_.size.height = bitmap_->GetSize().height;
crop_rect_.size.x = bitmap_->GetSize().width;
crop_rect_.size.y = bitmap_->GetSize().height;
}
}

View File

@ -20,6 +20,7 @@
#pragma once
#include "Event.hpp"
#include "helper.hpp"
namespace easy2d
{
@ -36,15 +37,18 @@ namespace easy2d
Up, // 抬起
Wheel, // 滚轮滚动
Hover, // 報炎卞秘
Out, // 報炎卞竃
Click, // 報炎泣似
Last // 结束标志
};
MouseEvent(EventType type, float x, float y, float wheel_delta) : Event(type), x(x), y(y), wheel_delta(wheel_delta), button_down(false) {}
MouseEvent(EventType type, float x, float y, float wheel_delta) : Event(type), position(x, y), wheel_delta(wheel_delta), button_down(false) {}
static bool Check(Event* e) { return e->type > Type::First && e->type < Type::Last; }
float x;
float y;
Point position;
float wheel_delta;
bool button_down;
};

View File

@ -19,10 +19,11 @@
// THE SOFTWARE.
#include "Node.h"
#include "Action.hpp"
#include "Factory.h"
#include "Scene.h"
#include "Task.h"
#include "Action.hpp"
#include "MouseEvent.hpp"
#include "render.h"
#include "logs.h"
@ -43,6 +44,7 @@ namespace easy2d
Node::Node()
: visible_(true)
, dirty_transform_(false)
, dirty_transform_inverse_(false)
, parent_(nullptr)
, hash_name_(0)
, z_order_(0)
@ -116,30 +118,78 @@ namespace easy2d
if (!visible_)
return;
this->HandleEvent(e);
if (!e->has_target)
{
EventDispatcher::DispatchEvent(e);
}
}
void Node::HandleEvent(Event * e)
{
spNode prev;
for (auto child = children_.Last(); child; child = prev)
{
prev = child->PrevItem();
child->HandleEvent(e);
child->DispatchEvent(e);
}
if (MouseEvent::Check(e))
{
MouseEvent* me = static_cast<MouseEvent*>(e);
if (me->type == MouseEvent::Move)
{
if (!me->has_target && ContainsPoint(me->position))
{
me->has_target = true;
if (!hover_)
{
hover_ = true;
MouseEvent hover = *me;
hover.type = MouseEvent::Hover;
DispatchEvent(&hover);
}
}
else if (hover_)
{
hover_ = false;
pressed_ = false;
MouseEvent hover = *me;
hover.type = MouseEvent::Out;
DispatchEvent(&hover);
}
}
if (me->type == MouseEvent::Down && hover_)
{
pressed_ = true;
}
if (me->type == MouseEvent::Up && pressed_)
{
pressed_ = false;
MouseEvent click = *me;
click.type = MouseEvent::Click;
DispatchEvent(&click);
}
}
EventDispatcher::DispatchEvent(e);
}
math::Matrix const & Node::GetTransformMatrix()
Matrix const & Node::GetTransformMatrix() const
{
UpdateTransform();
return transform_matrix_;
}
Matrix const & Node::GetTransformInverseMatrix() const
{
UpdateTransform();
if (dirty_transform_inverse_)
{
transform_matrix_inverse_ = Matrix::Invert(transform_matrix_);
dirty_transform_inverse_ = false;
}
return transform_matrix_inverse_;
}
spNode Node::GetParent() const
{
return parent_;
@ -150,20 +200,21 @@ namespace easy2d
return scene_;
}
void Node::UpdateTransform()
void Node::UpdateTransform() const
{
if (!dirty_transform_)
return;
dirty_transform_ = false;
dirty_transform_inverse_ = true;
// matrix multiplication is optimized by expression template
transform_matrix_ = math::Matrix::Scaling(transform_.scale)
* math::Matrix::Skewing(transform_.skew.x, transform_.skew.y)
* math::Matrix::Rotation(transform_.rotation)
* math::Matrix::Translation(transform_.position);
transform_matrix_ = Matrix::Scaling(transform_.scale)
* Matrix::Skewing(transform_.skew.x, transform_.skew.y)
* Matrix::Rotation(transform_.rotation)
* Matrix::Translation(transform_.position);
Point offset{ -size_.width * pivot_.x, -size_.height * pivot_.y };
Point offset{ -size_.x * pivot_.x, -size_.y * pivot_.y };
transform_matrix_.Translate(offset);
if (parent_)
@ -261,26 +312,26 @@ namespace easy2d
void Node::SetWidth(float width)
{
this->SetSize(width, size_.height);
this->SetSize(width, size_.y);
}
void Node::SetHeight(float height)
{
this->SetSize(size_.width, height);
this->SetSize(size_.x, height);
}
void Node::SetSize(const Size& size)
{
this->SetSize(size.width, size.height);
this->SetSize(size.x, size.y);
}
void Node::SetSize(float width, float height)
{
if (size_.width == width && size_.height == height)
if (size_.x == width && size_.y == height)
return;
size_.width = width;
size_.height = height;
size_.x = width;
size_.y = height;
dirty_transform_ = true;
}
@ -427,7 +478,7 @@ namespace easy2d
}
}
Rect Node::GetBounds()
Rect Node::GetBounds() const
{
return Rect(Point{}, size_);
}
@ -522,25 +573,12 @@ namespace easy2d
children_.Clear();
}
bool Node::ContainsPoint(const Point& point)
bool Node::ContainsPoint(const Point& point) const
{
if (size_.width == 0.f || size_.height == 0.f)
if (size_.x == 0.f || size_.y == 0.f)
return false;
UpdateTransform();
cpRectangleGeometry border;
ThrowIfFailed(
Factory::Instance()->CreateRectangleGeometry(
border,
Rect(Point{}, size_)
)
);
BOOL ret = 0;
// no matter it failed or not
border->FillContainsPoint(point, transform_matrix_, &ret);
return !!ret;
math::Vector2 local = GetTransformInverseMatrix().Transform(point);
return GetBounds().ContainsPoint(local);
}
}

View File

@ -56,9 +56,6 @@ namespace easy2d
// 渲染节点
virtual void OnRender() {}
// ´¦Àíʼþ
virtual void HandleEvent(Event* e);
// 获取显示状态
bool IsVisible() const { return visible_; }
@ -96,19 +93,19 @@ namespace easy2d
float GetRotation() const { return transform_.rotation; }
// 获取宽度
float GetWidth() const { return size_.width; }
float GetWidth() const { return size_.x; }
// 获取高度
float GetHeight() const { return size_.height; }
float GetHeight() const { return size_.y; }
// 获取大小
Size const& GetSize() const { return size_; }
// 获取缩放后的宽度
float GetScaledWidth() const { return size_.width * transform_.scale.x; }
float GetScaledWidth() const { return size_.x * transform_.scale.x; }
// 获取缩放后的高度
float GetScaledHeight() const { return size_.height * transform_.scale.y; }
float GetScaledHeight() const { return size_.y * transform_.scale.y; }
// 获取缩放后的大小
Size GetScaledSize() const { return Size{ GetScaledWidth(), GetScaledHeight() }; }
@ -126,10 +123,13 @@ namespace easy2d
Transform const& GetTransform() const { return transform_; }
// 获取包围盒
virtual Rect GetBounds();
Rect GetBounds() const;
// 获取二维变换矩阵
math::Matrix const& GetTransformMatrix();
Matrix const& GetTransformMatrix() const;
// »ñÈ¡¶þά±ä»»µÄÄæ¾ØÕó
Matrix const& GetTransformInverseMatrix() const;
// 获取父节点
spNode GetParent() const;
@ -243,7 +243,7 @@ namespace easy2d
// 设置支点位置
// 默认为 (0, 0), 范围 [0, 1]
virtual void SetPivot(
void SetPivot(
float pivot_x,
float pivot_y
);
@ -288,7 +288,7 @@ namespace easy2d
// 判断点是否在节点内
bool ContainsPoint(
const Point& point
);
) const;
// 添加子节点
void AddChild(
@ -347,7 +347,7 @@ namespace easy2d
void Render();
void UpdateTransform();
void UpdateTransform() const;
void UpdateOpacity();
@ -355,18 +355,23 @@ namespace easy2d
protected:
bool visible_;
bool dirty_transform_;
bool hover_;
bool pressed_;
int z_order_;
float opacity_;
float display_opacity_;
std::wstring name_;
size_t hash_name_;
Transform transform_;
math::Matrix transform_matrix_;
Point pivot_;
Size size_;
Node* parent_;
Scene* scene_;
Children children_;
mutable bool dirty_transform_;
mutable bool dirty_transform_inverse_;
mutable Matrix transform_matrix_;
mutable Matrix transform_matrix_inverse_;
};
}

View File

@ -1,89 +0,0 @@
// 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 "../math/vector.hpp"
#include <d2d1.h>
namespace easy2d
{
// 坐标
//
// Usage:
// 表示一个二维空间的坐标: Point origin(0, 0);
// 计算两点间距离: float distance = p1.Distance(p2);
// 坐标可以相加减: Point p = Point(10, 10) + Point(20, 20); // p 的坐标是 (30, 30)
//
class Point
: public math::Vector2
{
public:
Point() {}
Point(float x, float y) : math::Vector2(x, y) {}
Point(Point const& other) : math::Vector2(other.x, other.y) {}
inline float Distance(Point const& v)
{
return Point(x - v.x, y - v.y).Length();
}
inline const Point operator + (const Point & other) const
{
return Point(x + other.x, y + other.y);
}
inline const Point operator - (const Point & other) const
{
return Point(x - other.x, y - other.y);
}
inline const Point operator * (float val) const
{
return Point(x * val, y * val);
}
inline const Point operator / (float val) const
{
return Point(x / val, y / val);
}
inline const Point operator - () const
{
return Point(-x, -y);
}
inline bool operator == (const Point& other) const
{
return (x == other.x) && (y == other.y);
}
inline operator D2D1_POINT_2F const& () const
{
return reinterpret_cast<D2D1_POINT_2F const&>(*this);
}
inline operator D2D1_POINT_2F& ()
{
return reinterpret_cast<D2D1_POINT_2F&>(*this);
}
};
}

View File

@ -1,128 +0,0 @@
// 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 "Point.hpp"
#include "Size.hpp"
#include <d2d1.h>
namespace easy2d
{
// 矩形
//
// Usage:
// 表示一个二维矩形: Rect rect = Rect(10, 20, 30, 40); // 左上角坐标为 (10, 20), 宽为 30, 高为 40
// 矩形可以通过 Point + Size 定义, Point 表示矩形左上角坐标, Size 表示矩形宽高
// 判断一个点是否在矩形内: bool contains = rect.ContainsPoint(p);
// 判断两矩形是否相交: bool intersects = rect1.Intersects(rect2);
//
class Rect
{
public:
Point origin; // 左上角坐标
Size size; // 宽度和高度
public:
Rect() {}
Rect(
float x,
float y,
float width,
float height
)
: origin(x, y)
, size(width, height)
{}
Rect(
const Point& pos,
const Size& size
)
: origin(pos.x, pos.y)
, size(size.width, size.height)
{}
Rect(
const Rect& other
)
: origin(other.origin.x, other.origin.y)
, size(other.size.width, other.size.height)
{}
Rect(
const D2D1_RECT_F& other
)
: origin(other.left, other.top)
, size(other.right - other.left, other.bottom - other.top)
{}
Rect& operator= (const Rect& other)
{
origin = other.origin;
size = other.size;
return *this;
}
inline bool operator== (const Rect& rect) const
{
return (origin == rect.origin) && (size == rect.size);
}
inline Point GetCenter() const { return Point{ origin.x + size.width / 2, origin.y + size.height / 2 }; }
inline Point GetLeftTop() const { return origin; }
inline Point GetRightBottom() const { return Point{ GetRight(), GetBottom() }; }
inline Point GetRightTop() const { return Point{ GetRight(), GetTop() }; }
inline Point GetLeftBottom() const { return Point{ GetLeft(), GetBottom() }; }
inline float GetLeft() const { return origin.x; }
inline float GetTop() const { return origin.y; }
inline float GetRight() const { return origin.x + size.width; }
inline float GetBottom() const { return origin.y + size.height; }
// 判断点是否在矩形内
inline bool ContainsPoint(const Point& point) const
{
return point.x >= origin.x && point.x <= (origin.y + size.height) &&
point.y >= origin.y && point.y <= (origin.y + size.height);
}
// 判断两矩形是否相交
inline bool Intersects(const Rect& rect) const
{
return !((origin.x + size.width) < rect.origin.x ||
(rect.origin.x + rect.size.width) < origin.x ||
(origin.y + size.height) < rect.origin.y ||
(rect.origin.y + rect.size.height) < origin.y);
}
inline operator D2D1_RECT_F () const
{
return D2D1_RECT_F{ origin.x, origin.y, origin.x + size.width, origin.y + size.height };
}
};
}

View File

@ -1,109 +0,0 @@
// 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 "Point.hpp"
#include <d2d1.h>
namespace easy2d
{
// 大小
//
// Usage:
// 表示一个二维矩形区域的大小: Size s(10, 5); // 宽为 10, 高为 5
// 大小可以相加减: Size s = Size(10, 10) + Size(20, 20); // s 的大小是宽高均为 30
//
class Size
{
public:
float width; // 宽度
float height; // 高度
public:
Size()
{
width = 0;
height = 0;
}
Size(float width, float height)
{
this->width = width;
this->height = height;
}
Size(const Size & other)
{
width = other.width;
height = other.height;
}
Size(const Point & p)
{
width = p.x;
height = p.y;
}
inline const Size operator+(const Size & other) const
{
return Size(width + other.width, height + other.height);
}
inline const Size operator-(const Size & other) const
{
return Size(width - other.width, height - other.height);
}
inline const Size operator*(float val) const
{
return Size(width * val, height * val);
}
inline const Size operator/(float val) const
{
return Size(width / val, height / val);
}
inline const Size operator-() const
{
return Size(-width, -height);
}
inline bool operator==(const Size & other) const
{
return (width == other.width) && (height == other.height);
}
inline operator Point () const
{
return Point{ width, height };
}
inline operator D2D1_SIZE_F const& () const
{
return reinterpret_cast<D2D1_SIZE_F const&>(*this);
}
inline operator D2D1_SIZE_F& ()
{
return reinterpret_cast<D2D1_SIZE_F&>(*this);
}
};
}

View File

@ -117,8 +117,8 @@ namespace easy2d
{
image_->Crop(crop_rect);
Node::SetSize(
std::min(std::max(crop_rect.size.width, 0.f), image_->GetSourceWidth() - image_->GetCropX()),
std::min(std::max(crop_rect.size.height, 0.f), image_->GetSourceHeight() - image_->GetCropY())
std::min(std::max(crop_rect.size.x, 0.f), image_->GetSourceWidth() - image_->GetCropX()),
std::min(std::max(crop_rect.size.y, 0.f), image_->GetSourceHeight() - image_->GetCropY())
);
}

View File

@ -19,10 +19,7 @@
// THE SOFTWARE.
#pragma once
#include "Size.hpp"
#include "Point.hpp"
#include "../math/Matrix.hpp"
#include <d2d1.h>
#include "helper.hpp"
namespace easy2d
{

View File

@ -161,10 +161,10 @@ namespace easy2d
if (process_ < .5f)
{
out_layer_prop_.area = Rect(
window_size_.width * process_,
window_size_.height * process_,
window_size_.width * (1 - process_ * 2),
window_size_.height * (1 - process_ * 2)
window_size_.x * process_,
window_size_.y * process_,
window_size_.x * (1 - process_ * 2),
window_size_.y * (1 - process_ * 2)
);
}
else
@ -172,10 +172,10 @@ namespace easy2d
out_layer_prop_.opacity = 0;
in_layer_prop_.opacity = 1;
in_layer_prop_.area = Rect(
window_size_.width * (1 - process_),
window_size_.height * (1 - process_),
window_size_.width * (2 * process_ - 1),
window_size_.height * (2 * process_ - 1)
window_size_.x * (1 - process_),
window_size_.y * (1 - process_),
window_size_.x * (2 * process_ - 1),
window_size_.y * (2 * process_ - 1)
);
}
}
@ -255,20 +255,20 @@ namespace easy2d
switch (direction_)
{
case Direction::Up:
pos_delta_ = Point(0, -window_size_.height);
start_pos_ = Point(0, window_size_.height);
pos_delta_ = Point(0, -window_size_.y);
start_pos_ = Point(0, window_size_.y);
break;
case Direction::Down:
pos_delta_ = Point(0, window_size_.height);
start_pos_ = Point(0, -window_size_.height);
pos_delta_ = Point(0, window_size_.y);
start_pos_ = Point(0, -window_size_.y);
break;
case Direction::Left:
pos_delta_ = Point(-window_size_.width, 0);
start_pos_ = Point(window_size_.width, 0);
pos_delta_ = Point(-window_size_.x, 0);
start_pos_ = Point(window_size_.x, 0);
break;
case Direction::Right:
pos_delta_ = Point(window_size_.width, 0);
start_pos_ = Point(-window_size_.width, 0);
pos_delta_ = Point(window_size_.x, 0);
start_pos_ = Point(-window_size_.x, 0);
break;
}
@ -332,7 +332,7 @@ namespace easy2d
Transition::Init(prev, next);
auto transform = Transform{};
transform.position = Point{ window_size_.width / 2, window_size_.height / 2 };
transform.position = Point{ window_size_.x / 2, window_size_.y / 2 };
if (out_scene_)
{

View File

@ -21,6 +21,9 @@
#pragma once
#include "RefCounter.hpp"
#include "intrusive/SmartPointer.hpp"
#include "../math/vector.hpp"
#include "../math/Rect.hpp"
#include "../math/Matrix.hpp"
#ifndef E2D_DECLARE_SMART_PTR
#define E2D_DECLARE_SMART_PTR(class_name)\
@ -89,6 +92,11 @@ namespace easy2d
E2D_DECLARE_NS_SMART_PTR(ui, Button);
E2D_DECLARE_NS_SMART_PTR(ui, Menu);
using Vector2 = math::Vector2;
using Point = math::Vector2;
using Size = math::Vector2;
using Rect = math::Rect;
using Matrix = math::Matrix;
template <typename Dest, typename Src>
inline Dest SafeCast(Src ptr)

View File

@ -20,9 +20,6 @@
#pragma once
#include "macros.h"
#include "Point.hpp"
#include "Size.hpp"
#include "Rect.hpp"
#include "Color.h"
#include "Object.h"
#include "helper.hpp"

View File

@ -249,7 +249,7 @@ namespace easy2d
return text_layout->Draw(nullptr, text_renderer_.Get(), 0, 0);
}
HRESULT GraphicsDevice::PushClip(const math::Matrix & clip_matrix, const Size & clip_size)
HRESULT GraphicsDevice::PushClip(const Matrix & clip_matrix, const Size & clip_size)
{
if (!render_target_)
return E_UNEXPECTED;
@ -259,7 +259,7 @@ namespace easy2d
render_target_->SetTransform(clip_matrix);
render_target_->PushAxisAlignedClip(
D2D1::RectF(0, 0, clip_size.width, clip_size.height),
D2D1::RectF(0, 0, clip_size.x, clip_size.y),
D2D1_ANTIALIAS_MODE_PER_PRIMITIVE
);
return S_OK;
@ -319,8 +319,8 @@ namespace easy2d
return E_UNEXPECTED;
auto rtsize = render_target_->GetSize();
size.width = rtsize.width;
size.height = rtsize.height;
size.x = rtsize.width;
size.y = rtsize.height;
return S_OK;
}
@ -399,7 +399,7 @@ namespace easy2d
return S_OK;
}
HRESULT GraphicsDevice::SetTransform(const math::Matrix & matrix)
HRESULT GraphicsDevice::SetTransform(const Matrix & matrix)
{
if (!render_target_)
return E_UNEXPECTED;

View File

@ -97,7 +97,7 @@ namespace easy2d
);
HRESULT SetTransform(
const math::Matrix& matrix
const Matrix& matrix
);
HRESULT SetOpacity(
@ -137,7 +137,7 @@ namespace easy2d
);
HRESULT PushClip(
const math::Matrix& clip_matrix,
const Matrix& clip_matrix,
const Size& clip_size
);

View File

@ -89,8 +89,8 @@ namespace easy2d
WINDOW_STYLE,
static_cast<int>(client_rect.origin.x),
static_cast<int>(client_rect.origin.y),
static_cast<int>(client_rect.size.width),
static_cast<int>(client_rect.size.height),
static_cast<int>(client_rect.size.x),
static_cast<int>(client_rect.size.y),
nullptr,
nullptr,
hinstance,
@ -138,12 +138,12 @@ namespace easy2d
float WindowImpl::GetWidth() const
{
return GetSize().width;
return GetSize().x;
}
float WindowImpl::GetHeight() const
{
return GetSize().height;
return GetSize().y;
}
void WindowImpl::SetSize(int width, int height)
@ -155,8 +155,8 @@ namespace easy2d
handle,
static_cast<int>(rect.origin.x),
static_cast<int>(rect.origin.y),
static_cast<int>(rect.size.width),
static_cast<int>(rect.size.height),
static_cast<int>(rect.size.x),
static_cast<int>(rect.size.y),
TRUE
);
}

View File

@ -39,9 +39,6 @@
#include "base/time.h"
#include "base/logs.h"
#include "base/Point.hpp"
#include "base/Size.hpp"
#include "base/Rect.hpp"
#include "base/Font.hpp"
#include "base/Color.h"
#include "base/Resource.h"

View File

@ -123,6 +123,11 @@ namespace easy2d
_31 == 0.f && _32 == 0.f;
}
inline bool IsInvertible() const
{
return 0 != Determinant();
}
Vector2 Transform(const Vector2& v) const
{
return Vector2(
@ -210,6 +215,20 @@ namespace easy2d
center.y * tx, center.x * ty
);
}
static Matrix Invert(Matrix const& matrix)
{
float det = 1.f / matrix.Determinant();
return Matrix(
det * matrix._22,
-det * matrix._12,
-det * matrix._21,
det * matrix._11,
det * (matrix._21 * matrix._32 - matrix._22 * matrix._31),
det * (matrix._12 * matrix._31 - matrix._11 * matrix._32)
);
}
};

130
core/math/Rect.hpp Normal file
View File

@ -0,0 +1,130 @@
// 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 "vector.hpp"
#include <d2d1.h>
namespace easy2d
{
namespace math
{
// 矩形
//
// Usage:
// 表示一个二维矩形: Rect rect = Rect(10, 20, 30, 40); // 左上角坐标为 (10, 20), 宽为 30, 高为 40
// 矩形可以通过 Vector2 + Vector2 定义, Vector2 表示矩形左上角坐标, Vector2 表示矩形宽高
// 判断一个点是否在矩形内: bool contains = rect.ContainsPoint(p);
// 判断两矩形是否相交: bool intersects = rect1.Intersects(rect2);
//
class Rect
{
public:
Vector2 origin; // 左上角坐标
Vector2 size; // 宽度和高度
public:
Rect() {}
Rect(
float x,
float y,
float width,
float height
)
: origin(x, y)
, size(width, height)
{}
Rect(
const Vector2& pos,
const Vector2& size
)
: origin(pos.x, pos.y)
, size(size.x, size.y)
{}
Rect(
const Rect& other
)
: origin(other.origin.x, other.origin.y)
, size(other.size.x, other.size.y)
{}
Rect(
const D2D1_RECT_F& other
)
: origin(other.left, other.top)
, size(other.right - other.left, other.bottom - other.top)
{}
Rect& operator= (const Rect& other)
{
origin = other.origin;
size = other.size;
return *this;
}
inline bool operator== (const Rect& rect) const
{
return (origin == rect.origin) && (size == rect.size);
}
inline Vector2 GetCenter() const { return Vector2{ origin.x + size.x / 2, origin.y + size.y / 2 }; }
inline Vector2 GetLeftTop() const { return origin; }
inline Vector2 GetRightBottom() const { return Vector2{ GetRight(), GetBottom() }; }
inline Vector2 GetRightTop() const { return Vector2{ GetRight(), GetTop() }; }
inline Vector2 GetLeftBottom() const { return Vector2{ GetLeft(), GetBottom() }; }
inline float GetLeft() const { return origin.x; }
inline float GetTop() const { return origin.y; }
inline float GetRight() const { return origin.x + size.x; }
inline float GetBottom() const { return origin.y + size.y; }
// 判断点是否在矩形内
inline bool ContainsPoint(const Vector2& point) const
{
return point.x >= origin.x && point.x <= (origin.y + size.y) &&
point.y >= origin.y && point.y <= (origin.y + size.y);
}
// 判断两矩形是否相交
inline bool Intersects(const Rect& rect) const
{
return !((origin.x + size.x) < rect.origin.x ||
(rect.origin.x + rect.size.x) < origin.x ||
(origin.y + size.y) < rect.origin.y ||
(rect.origin.y + rect.size.y) < origin.y);
}
inline operator D2D1_RECT_F () const
{
return D2D1_RECT_F{ origin.x, origin.y, origin.x + size.x, origin.y + size.y };
}
};
}
}

View File

@ -20,6 +20,7 @@
#pragma once
#include "scalar.hpp"
#include <d2d1.h>
namespace easy2d
{
@ -34,20 +35,9 @@ namespace easy2d
public:
Vector2() : x(0.f), y(0.f) {}
Vector2(
float x,
float y
)
: x(x)
, y(y)
{}
Vector2(float x, float y) : x(x), y(y) {}
Vector2(
const Vector2& other
)
: x(other.x)
, y(other.y)
{}
Vector2(const Vector2& other) : x(other.x), y(other.y) {}
inline float Length() const
{
@ -83,6 +73,16 @@ namespace easy2d
{
return (x == other.x) && (y == other.y);
}
inline operator D2D1_POINT_2F const& () const
{
return reinterpret_cast<D2D1_POINT_2F const&>(*this);
}
inline operator D2D1_POINT_2F& ()
{
return reinterpret_cast<D2D1_POINT_2F&>(*this);
}
};
}
}

View File

@ -21,98 +21,26 @@
#include "Button.h"
#include "../base/MouseEvent.hpp"
#define SAFE_SET(pointer, func, ...) if (pointer) { pointer->##func(__VA_ARGS__); }
#define SET_BUTTON_NODE(Old, New) \
if (New != Old) \
{ \
if (Old) this->RemoveChild(Old); \
if (New) \
{ \
New->SetPivot(GetPivotX(), GetPivotY()); \
this->AddChild(New); \
} \
Old = New; \
UpdateVisible(); \
} \
namespace easy2d
{
namespace ui
{
Button::Button()
: callback_(nullptr)
, status_(Status::Normal)
, enabled_(true)
: enabled_(true)
, is_selected_(false)
, normal_(nullptr)
, mouseover_(nullptr)
, selected_(nullptr)
, disabled_(nullptr)
, callback_(nullptr)
, status_(Status::Normal)
{
AddListener(MouseEvent::Hover, std::bind(&Button::UpdateStatus, this, std::placeholders::_1));
AddListener(MouseEvent::Out, std::bind(&Button::UpdateStatus, this, std::placeholders::_1));
AddListener(MouseEvent::Down, std::bind(&Button::UpdateStatus, this, std::placeholders::_1));
AddListener(MouseEvent::Up, std::bind(&Button::UpdateStatus, this, std::placeholders::_1));
}
Button::Button(spNode const& normal, const Callback& func)
: callback_(nullptr)
, status_(Status::Normal)
, enabled_(true)
, is_selected_(false)
, normal_(nullptr)
, mouseover_(nullptr)
, selected_(nullptr)
, disabled_(nullptr)
Button::Button(const Callback& func)
: Button()
{
this->SetNormal(normal);
this->SetCallbackOnClick(func);
}
Button::Button(spNode const& normal, spNode const& selected, const Callback& func)
: callback_(nullptr)
, status_(Status::Normal)
, enabled_(true)
, is_selected_(false)
, normal_(nullptr)
, mouseover_(nullptr)
, selected_(nullptr)
, disabled_(nullptr)
{
this->SetNormal(normal);
this->SetSelected(selected);
this->SetCallbackOnClick(func);
}
Button::Button(spNode const& normal, spNode const& mouseover, spNode const& selected, const Callback& func)
: callback_(nullptr)
, status_(Status::Normal)
, enabled_(true)
, is_selected_(false)
, normal_(nullptr)
, mouseover_(nullptr)
, selected_(nullptr)
, disabled_(nullptr)
{
this->SetNormal(normal);
this->SetMouseOver(mouseover);
this->SetSelected(selected);
this->SetCallbackOnClick(func);
}
Button::Button(spNode const& normal, spNode const& mouseover, spNode const& selected, spNode const& disabled, const Callback& func)
: callback_(nullptr)
, status_(Status::Normal)
, enabled_(true)
, is_selected_(false)
, normal_(nullptr)
, mouseover_(nullptr)
, selected_(nullptr)
, disabled_(nullptr)
{
this->SetNormal(normal);
this->SetMouseOver(mouseover);
this->SetSelected(selected);
this->SetDisabled(disabled);
this->SetCallbackOnClick(func);
this->SetClickCallback(func);
}
Button::~Button()
@ -124,146 +52,55 @@ namespace easy2d
return enabled_;
}
void Button::SetNormal(spNode const& normal)
{
SET_BUTTON_NODE(normal_, normal);
if (normal)
{
this->SetSize(normal->GetWidth(), normal->GetHeight());
}
}
void Button::SetMouseOver(spNode const& mouseover)
{
SET_BUTTON_NODE(mouseover_, mouseover);
}
void Button::SetSelected(spNode const& selected)
{
SET_BUTTON_NODE(selected_, selected);
}
void Button::SetDisabled(spNode const& disabled)
{
SET_BUTTON_NODE(disabled_, disabled);
}
void Button::SetEnabled(bool enabled)
{
if (enabled_ != enabled)
{
enabled_ = enabled;
UpdateVisible();
}
}
void Button::SetCallbackOnClick(const Callback& func)
void Button::SetClickCallback(const Callback& func)
{
callback_ = func;
}
void Button::SetPivot(float pivot_x, float pivot_y)
{
Node::SetPivot(pivot_x, pivot_y);
SAFE_SET(normal_, SetPivot, pivot_x, pivot_y);
SAFE_SET(mouseover_, SetPivot, pivot_x, pivot_y);
SAFE_SET(selected_, SetPivot, pivot_x, pivot_y);
SAFE_SET(disabled_, SetPivot, pivot_x, pivot_y);
}
void Button::HandleEvent(Event* e)
{
if (e && MouseEvent::Check(e) && !e->has_target)
{
MouseEvent* me = static_cast<MouseEvent*>(e);
if (enabled_ && IsVisible() && normal_)
{
bool contains = normal_->ContainsPoint(Point{ me->x, me->y });
if (me->type == MouseEvent::Up && is_selected_ && contains)
{
if (callback_)
{
callback_();
}
is_selected_ = false;
SetStatus(Status::Normal);
me->has_target = true;
}
else if (me->type == MouseEvent::Down)
{
is_selected_ = contains;
SetStatus(contains ? Status::Selected : Status::Normal);
me->has_target = contains;
}
else if (me->type == MouseEvent::Up)
{
is_selected_ = false;
}
else if (me->type == MouseEvent::Move && is_selected_ && contains)
{
SetStatus(Status::Selected);
me->has_target = true;
}
else
{
if (!me->button_down && is_selected_)
{
is_selected_ = false;
}
SetStatus(contains ? Status::Mouseover : Status::Normal);
me->has_target = contains;
}
}
}
Node::HandleEvent(e);
}
void Button::SetStatus(Status status)
{
if (status_ != status)
{
status_ = status;
UpdateVisible();
}
}
void Button::UpdateVisible()
void Button::UpdateStatus(Event * e)
{
SAFE_SET(normal_, SetVisible, false);
SAFE_SET(mouseover_, SetVisible, false);
SAFE_SET(selected_, SetVisible, false);
SAFE_SET(disabled_, SetVisible, false);
E2D_ASSERT(MouseEvent::Check(e));
MouseEvent* me = static_cast<MouseEvent*>(e);
if (enabled_)
{
if (status_ == Status::Selected && selected_)
if (me->type == MouseEvent::Hover)
{
selected_->SetVisible(true);
SetStatus(Status::Hover);
}
else if (status_ == Status::Mouseover && mouseover_)
else if (me->type == MouseEvent::Out)
{
mouseover_->SetVisible(true);
SetStatus(Status::Normal);
}
else
else if (me->type == MouseEvent::Down && status_ == Status::Hover)
{
if (normal_) normal_->SetVisible(true);
SetStatus(Status::Selected);
}
}
else
{
if (disabled_)
else if (me->type == MouseEvent::Up && status_ == Status::Selected)
{
disabled_->SetVisible(true);
}
else
{
if (normal_) normal_->SetVisible(true);
SetStatus(Status::Hover);
if (callback_)
callback_();
}
}
}
}
}

View File

@ -19,7 +19,7 @@
// THE SOFTWARE.
#pragma once
#include "../base/Node.h"
#include "../base/Sprite.h"
#include <functional>
namespace easy2d
@ -27,7 +27,7 @@ namespace easy2d
namespace ui
{
class Button
: public Node
: public Sprite
{
using Callback = std::function<void()>;
@ -35,29 +35,7 @@ namespace easy2d
Button();
explicit Button(
spNode const& normal, /* 普通状态 */
const Callback& func = nullptr /* 按钮点击后的回调函数 */
);
explicit Button(
spNode const& normal, /* 普通状态 */
spNode const& selected, /* 鼠标按下状态 */
const Callback& func = nullptr /* 按钮点击后的回调函数 */
);
explicit Button(
spNode const& normal, /* 普通状态 */
spNode const& mouseover, /* 鼠标移入状态 */
spNode const& selected, /* 鼠标按下状态 */
const Callback& func = nullptr /* 按钮点击后的回调函数 */
);
explicit Button(
spNode const& normal, /* 普通状态 */
spNode const& mouseover, /* 鼠标移入状态 */
spNode const& selected, /* 鼠标移入状态 */
spNode const& disabled, /* 按钮禁用状态 */
const Callback& func = nullptr /* 按钮点击后的回调函数 */
Callback const& func /* 按钮回调函数 */
);
virtual ~Button();
@ -70,57 +48,21 @@ namespace easy2d
bool enabled
);
// 设置一般情况下显示的按钮
void SetNormal(
spNode const& normal
);
// 设置鼠标移入按钮时显示的按钮
void SetMouseOver(
spNode const& mouseover
);
// 设置鼠标按下按钮时显示的按钮
void SetSelected(
spNode const& selected
);
// 设置按钮被禁用时显示的按钮
void SetDisabled(
spNode const& disabled
);
// 设置按钮点击后的回调函数
void SetCallbackOnClick(
void SetClickCallback(
const Callback& func
);
// 设置支点位置
// 默认为 (0, 0), 范围 [0, 1]
virtual void SetPivot(
float pivot_x,
float pivot_y
) override;
virtual void HandleEvent(Event* e) override;
private:
// 按钮状态枚举
enum class Status { Normal, Mouseover, Selected };
enum class Status { Normal, Hover, Selected };
// 设置按钮状态
virtual void SetStatus(
void SetStatus(
Status status
);
// 刷新按钮显示
virtual void UpdateVisible();
void UpdateStatus(Event* e);
private:
spNode normal_;
spNode mouseover_;
spNode selected_;
spNode disabled_;
bool enabled_;
bool is_selected_;
Status status_;

View File

@ -55,14 +55,11 @@
<ClInclude Include="..\..\core\base\Node.h" />
<ClInclude Include="..\..\core\base\noncopyable.hpp" />
<ClInclude Include="..\..\core\base\Object.h" />
<ClInclude Include="..\..\core\base\Point.hpp" />
<ClInclude Include="..\..\core\base\Rect.hpp" />
<ClInclude Include="..\..\core\base\RefCounter.hpp" />
<ClInclude Include="..\..\core\base\render.h" />
<ClInclude Include="..\..\core\base\Resource.h" />
<ClInclude Include="..\..\core\base\Scene.h" />
<ClInclude Include="..\..\core\base\Singleton.hpp" />
<ClInclude Include="..\..\core\base\Size.hpp" />
<ClInclude Include="..\..\core\base\Sprite.h" />
<ClInclude Include="..\..\core\base\Task.h" />
<ClInclude Include="..\..\core\base\TaskManager.h" />
@ -78,6 +75,7 @@
<ClInclude Include="..\..\core\math\ease.hpp" />
<ClInclude Include="..\..\core\math\Matrix.hpp" />
<ClInclude Include="..\..\core\math\rand.h" />
<ClInclude Include="..\..\core\math\Rect.hpp" />
<ClInclude Include="..\..\core\math\scalar.hpp" />
<ClInclude Include="..\..\core\math\vector.hpp" />
<ClInclude Include="..\..\core\ui\Button.h" />

View File

@ -38,9 +38,6 @@
<ClInclude Include="..\..\core\base\Node.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\Rect.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\render.h">
<Filter>base</Filter>
</ClInclude>
@ -137,12 +134,6 @@
<ClInclude Include="..\..\core\base\Transform.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\Point.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\Size.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\noncopyable.hpp">
<Filter>base</Filter>
</ClInclude>
@ -206,6 +197,9 @@
<ClInclude Include="..\..\core\base\DebugNode.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\Rect.hpp">
<Filter>math</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="base">

View File

@ -55,14 +55,11 @@
<ClInclude Include="..\..\core\base\Node.h" />
<ClInclude Include="..\..\core\base\noncopyable.hpp" />
<ClInclude Include="..\..\core\base\Object.h" />
<ClInclude Include="..\..\core\base\Point.hpp" />
<ClInclude Include="..\..\core\base\Rect.hpp" />
<ClInclude Include="..\..\core\base\RefCounter.hpp" />
<ClInclude Include="..\..\core\base\render.h" />
<ClInclude Include="..\..\core\base\Resource.h" />
<ClInclude Include="..\..\core\base\Scene.h" />
<ClInclude Include="..\..\core\base\Singleton.hpp" />
<ClInclude Include="..\..\core\base\Size.hpp" />
<ClInclude Include="..\..\core\base\Sprite.h" />
<ClInclude Include="..\..\core\base\Task.h" />
<ClInclude Include="..\..\core\base\TaskManager.h" />
@ -78,6 +75,7 @@
<ClInclude Include="..\..\core\math\ease.hpp" />
<ClInclude Include="..\..\core\math\Matrix.hpp" />
<ClInclude Include="..\..\core\math\rand.h" />
<ClInclude Include="..\..\core\math\Rect.hpp" />
<ClInclude Include="..\..\core\math\scalar.hpp" />
<ClInclude Include="..\..\core\math\vector.hpp" />
<ClInclude Include="..\..\core\ui\Button.h" />

View File

@ -38,9 +38,6 @@
<ClInclude Include="..\..\core\base\Node.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\Rect.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\render.h">
<Filter>base</Filter>
</ClInclude>
@ -137,12 +134,6 @@
<ClInclude Include="..\..\core\base\Transform.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\Point.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\Size.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\noncopyable.hpp">
<Filter>base</Filter>
</ClInclude>
@ -206,6 +197,9 @@
<ClInclude Include="..\..\core\base\DebugNode.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\Rect.hpp">
<Filter>math</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="base">

View File

@ -55,14 +55,11 @@
<ClInclude Include="..\..\core\base\Node.h" />
<ClInclude Include="..\..\core\base\noncopyable.hpp" />
<ClInclude Include="..\..\core\base\Object.h" />
<ClInclude Include="..\..\core\base\Point.hpp" />
<ClInclude Include="..\..\core\base\Rect.hpp" />
<ClInclude Include="..\..\core\base\RefCounter.hpp" />
<ClInclude Include="..\..\core\base\render.h" />
<ClInclude Include="..\..\core\base\Resource.h" />
<ClInclude Include="..\..\core\base\Scene.h" />
<ClInclude Include="..\..\core\base\Singleton.hpp" />
<ClInclude Include="..\..\core\base\Size.hpp" />
<ClInclude Include="..\..\core\base\Sprite.h" />
<ClInclude Include="..\..\core\base\Task.h" />
<ClInclude Include="..\..\core\base\TaskManager.h" />
@ -78,6 +75,7 @@
<ClInclude Include="..\..\core\math\ease.hpp" />
<ClInclude Include="..\..\core\math\Matrix.hpp" />
<ClInclude Include="..\..\core\math\rand.h" />
<ClInclude Include="..\..\core\math\Rect.hpp" />
<ClInclude Include="..\..\core\math\scalar.hpp" />
<ClInclude Include="..\..\core\math\vector.hpp" />
<ClInclude Include="..\..\core\ui\Button.h" />

View File

@ -38,9 +38,6 @@
<ClInclude Include="..\..\core\base\Node.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\Rect.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\render.h">
<Filter>base</Filter>
</ClInclude>
@ -137,12 +134,6 @@
<ClInclude Include="..\..\core\base\Transform.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\Point.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\Size.hpp">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\base\noncopyable.hpp">
<Filter>base</Filter>
</ClInclude>
@ -206,6 +197,9 @@
<ClInclude Include="..\..\core\base\DebugNode.h">
<Filter>base</Filter>
</ClInclude>
<ClInclude Include="..\..\core\math\Rect.hpp">
<Filter>math</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="base">