diff --git a/core/base/Canvas.cpp b/core/base/Canvas.cpp index b295922a..24d6c542 100644 --- a/core/base/Canvas.cpp +++ b/core/base/Canvas.cpp @@ -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 diff --git a/core/base/Canvas.h b/core/base/Canvas.h index 2db1419a..b111b8ec 100644 --- a/core/base/Canvas.h +++ b/core/base/Canvas.h @@ -212,7 +212,7 @@ namespace easy2d // 变换画笔 void SetBrushTransform( - math::Matrix const& transform + Matrix const& transform ); // 导出为图片 diff --git a/core/base/DebugNode.cpp b/core/base/DebugNode.cpp index 6395670c..ea87b6b5 100644 --- a/core/base/DebugNode.cpp +++ b/core/base/DebugNode.cpp @@ -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)); diff --git a/core/base/Factory.cpp b/core/base/Factory.cpp index c733552f..1a735f5b 100644 --- a/core/base/Factory.cpp +++ b/core/base/Factory.cpp @@ -351,7 +351,7 @@ namespace easy2d HRESULT FactoryImpl::CreateTransformedGeometry( cpTransformedGeometry& transformed, - math::Matrix const& matrix, + Matrix const& matrix, cpGeometry const& geo ) const { diff --git a/core/base/Factory.h b/core/base/Factory.h index 26f558c9..52dc2d69 100644 --- a/core/base/Factory.h +++ b/core/base/Factory.h @@ -82,7 +82,7 @@ namespace easy2d HRESULT CreateTransformedGeometry( cpTransformedGeometry& transformed, - math::Matrix const& matrix, + Matrix const& matrix, cpGeometry const& geo ) const; diff --git a/core/base/Image.cpp b/core/base/Image.cpp index b22e8788..a6ca1b16 100644 --- a/core/base/Image.cpp +++ b/core/base/Image.cpp @@ -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; } } diff --git a/core/base/MouseEvent.hpp b/core/base/MouseEvent.hpp index ddb3784a..50aa7035 100644 --- a/core/base/MouseEvent.hpp +++ b/core/base/MouseEvent.hpp @@ -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; }; diff --git a/core/base/Node.cpp b/core/base/Node.cpp index ea1f6d24..e284d82a 100644 --- a/core/base/Node.cpp +++ b/core/base/Node.cpp @@ -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(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); } } diff --git a/core/base/Node.h b/core/base/Node.h index feafcb49..9b24b9bf 100644 --- a/core/base/Node.h +++ b/core/base/Node.h @@ -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_; }; } diff --git a/core/base/Point.hpp b/core/base/Point.hpp deleted file mode 100644 index c90b9a1e..00000000 --- a/core/base/Point.hpp +++ /dev/null @@ -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 - -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(*this); - } - - inline operator D2D1_POINT_2F& () - { - return reinterpret_cast(*this); - } - }; -} diff --git a/core/base/Rect.hpp b/core/base/Rect.hpp deleted file mode 100644 index 51806d91..00000000 --- a/core/base/Rect.hpp +++ /dev/null @@ -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 - -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 }; - } - }; -} diff --git a/core/base/Size.hpp b/core/base/Size.hpp deleted file mode 100644 index d1370823..00000000 --- a/core/base/Size.hpp +++ /dev/null @@ -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 - -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(*this); - } - - inline operator D2D1_SIZE_F& () - { - return reinterpret_cast(*this); - } - }; -} diff --git a/core/base/Sprite.cpp b/core/base/Sprite.cpp index 38e4cb5b..671e1296 100644 --- a/core/base/Sprite.cpp +++ b/core/base/Sprite.cpp @@ -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()) ); } diff --git a/core/base/Transform.hpp b/core/base/Transform.hpp index 9ac5cfd8..34c46a94 100644 --- a/core/base/Transform.hpp +++ b/core/base/Transform.hpp @@ -19,10 +19,7 @@ // THE SOFTWARE. #pragma once -#include "Size.hpp" -#include "Point.hpp" -#include "../math/Matrix.hpp" -#include +#include "helper.hpp" namespace easy2d { diff --git a/core/base/Transition.cpp b/core/base/Transition.cpp index 553a75bc..4eca7abb 100644 --- a/core/base/Transition.cpp +++ b/core/base/Transition.cpp @@ -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_) { diff --git a/core/base/helper.hpp b/core/base/helper.hpp index c1137404..1957a47c 100644 --- a/core/base/helper.hpp +++ b/core/base/helper.hpp @@ -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 inline Dest SafeCast(Src ptr) diff --git a/core/base/include-forwards.h b/core/base/include-forwards.h index a4374ac9..fe09f445 100644 --- a/core/base/include-forwards.h +++ b/core/base/include-forwards.h @@ -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" diff --git a/core/base/render.cpp b/core/base/render.cpp index c9c1fb34..10c23d62 100644 --- a/core/base/render.cpp +++ b/core/base/render.cpp @@ -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; diff --git a/core/base/render.h b/core/base/render.h index 1f65b8ea..33ceb618 100644 --- a/core/base/render.h +++ b/core/base/render.h @@ -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 ); diff --git a/core/base/window.cpp b/core/base/window.cpp index 224c6cdf..1b72aa34 100644 --- a/core/base/window.cpp +++ b/core/base/window.cpp @@ -89,8 +89,8 @@ namespace easy2d WINDOW_STYLE, static_cast(client_rect.origin.x), static_cast(client_rect.origin.y), - static_cast(client_rect.size.width), - static_cast(client_rect.size.height), + static_cast(client_rect.size.x), + static_cast(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(rect.origin.x), static_cast(rect.origin.y), - static_cast(rect.size.width), - static_cast(rect.size.height), + static_cast(rect.size.x), + static_cast(rect.size.y), TRUE ); } diff --git a/core/easy2d.h b/core/easy2d.h index 7e2850a4..6606abb6 100644 --- a/core/easy2d.h +++ b/core/easy2d.h @@ -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" diff --git a/core/math/Matrix.hpp b/core/math/Matrix.hpp index c66637ef..81c1ff15 100644 --- a/core/math/Matrix.hpp +++ b/core/math/Matrix.hpp @@ -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) + ); + } }; diff --git a/core/math/Rect.hpp b/core/math/Rect.hpp new file mode 100644 index 00000000..53f11999 --- /dev/null +++ b/core/math/Rect.hpp @@ -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 + +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 }; + } + }; + } +} diff --git a/core/math/vector.hpp b/core/math/vector.hpp index 80e19cbc..e30f89f3 100644 --- a/core/math/vector.hpp +++ b/core/math/vector.hpp @@ -20,6 +20,7 @@ #pragma once #include "scalar.hpp" +#include 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(*this); + } + + inline operator D2D1_POINT_2F& () + { + return reinterpret_cast(*this); + } }; } } \ No newline at end of file diff --git a/core/ui/Button.cpp b/core/ui/Button.cpp index e5c194ba..d9b58961 100644 --- a/core/ui/Button.cpp +++ b/core/ui/Button.cpp @@ -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(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(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_(); } } } + } } \ No newline at end of file diff --git a/core/ui/Button.h b/core/ui/Button.h index 9e7b07e6..e7978e9d 100644 --- a/core/ui/Button.h +++ b/core/ui/Button.h @@ -19,7 +19,7 @@ // THE SOFTWARE. #pragma once -#include "../base/Node.h" +#include "../base/Sprite.h" #include namespace easy2d @@ -27,7 +27,7 @@ namespace easy2d namespace ui { class Button - : public Node + : public Sprite { using Callback = std::function; @@ -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_; diff --git a/project/vs2013/Easy2D.vcxproj b/project/vs2013/Easy2D.vcxproj index d8e08658..70b42e75 100644 --- a/project/vs2013/Easy2D.vcxproj +++ b/project/vs2013/Easy2D.vcxproj @@ -55,14 +55,11 @@ - - - @@ -78,6 +75,7 @@ + diff --git a/project/vs2013/Easy2D.vcxproj.filters b/project/vs2013/Easy2D.vcxproj.filters index 948b455d..95ad21af 100644 --- a/project/vs2013/Easy2D.vcxproj.filters +++ b/project/vs2013/Easy2D.vcxproj.filters @@ -38,9 +38,6 @@ base - - base - base @@ -137,12 +134,6 @@ base - - base - - - base - base @@ -206,6 +197,9 @@ base + + math + diff --git a/project/vs2015/Easy2D.vcxproj b/project/vs2015/Easy2D.vcxproj index 041378a0..79178010 100644 --- a/project/vs2015/Easy2D.vcxproj +++ b/project/vs2015/Easy2D.vcxproj @@ -55,14 +55,11 @@ - - - @@ -78,6 +75,7 @@ + diff --git a/project/vs2015/Easy2D.vcxproj.filters b/project/vs2015/Easy2D.vcxproj.filters index 948b455d..95ad21af 100644 --- a/project/vs2015/Easy2D.vcxproj.filters +++ b/project/vs2015/Easy2D.vcxproj.filters @@ -38,9 +38,6 @@ base - - base - base @@ -137,12 +134,6 @@ base - - base - - - base - base @@ -206,6 +197,9 @@ base + + math + diff --git a/project/vs2017/Easy2D.vcxproj b/project/vs2017/Easy2D.vcxproj index e8629361..cba9d6e6 100644 --- a/project/vs2017/Easy2D.vcxproj +++ b/project/vs2017/Easy2D.vcxproj @@ -55,14 +55,11 @@ - - - @@ -78,6 +75,7 @@ + diff --git a/project/vs2017/Easy2D.vcxproj.filters b/project/vs2017/Easy2D.vcxproj.filters index 948b455d..95ad21af 100644 --- a/project/vs2017/Easy2D.vcxproj.filters +++ b/project/vs2017/Easy2D.vcxproj.filters @@ -38,9 +38,6 @@ base - - base - base @@ -137,12 +134,6 @@ base - - base - - - base - base @@ -206,6 +197,9 @@ base + + math +