diff --git a/core/Base/Game.cpp b/core/Base/Game.cpp index 0c18d324..bcec101c 100644 --- a/core/Base/Game.cpp +++ b/core/Base/Game.cpp @@ -45,7 +45,6 @@ void e2d::Game::start(bool cleanup) auto sceneManager = SceneManager::getInstance(); auto actionManager = ActionManager::getInstance(); auto inputManager = InputManager::getInstance(); - auto collisionManager = CollisionManager::getInstance(); // 显示窗口 ::ShowWindow(window->getHWnd(), SW_SHOWNORMAL); @@ -76,9 +75,8 @@ void e2d::Game::start(bool cleanup) input->update(); // 获取用户输入 timer->update(); // 更新定时器 actionManager->update(); // 更新动作管理器 - sceneManager->update(); // 更新场景内容 inputManager->update(); // 更新输入监听器 - collisionManager->update(); // 更新碰撞监听器 + sceneManager->update(); // 更新场景内容 renderer->render(); // 渲染游戏画面 GC::flush(); // 刷新内存池 diff --git a/core/Common/Collider.cpp b/core/Common/Collider.cpp index 12801aa2..da9badc3 100644 --- a/core/Common/Collider.cpp +++ b/core/Common/Collider.cpp @@ -9,13 +9,16 @@ e2d::Collider::Collider(Node * parent) , _geometry(nullptr) , _enabled(true) , _shape(Collider::Shape::None) + , _notify(true) { _shape = Game::getInstance()->getConfig()->getDefaultColliderShape(); + CollisionManager::getInstance()->__addCollider(this); } e2d::Collider::~Collider() { SafeRelease(_geometry); + CollisionManager::getInstance()->__removeCollider(this); } e2d::Color e2d::Collider::getColor() const @@ -28,6 +31,11 @@ e2d::Collider::Shape e2d::Collider::getShape() const return _shape; } +e2d::Node * e2d::Collider::getNode() const +{ + return _parentNode; +} + ID2D1Geometry * e2d::Collider::getGeometry() const { return _geometry; @@ -36,7 +44,12 @@ ID2D1Geometry * e2d::Collider::getGeometry() const void e2d::Collider::setShape(Shape shape) { _shape = shape; - this->_recreate(); + this->recreate(); +} + +void e2d::Collider::setCollisionNotify(bool notify) +{ + _notify = notify; } void e2d::Collider::setEnabled(bool enabled) @@ -54,9 +67,9 @@ void e2d::Collider::setColor(Color color) _color = color; } -void e2d::Collider::_render() +void e2d::Collider::render() { - if (_geometry && _enabled) + if (_geometry && _enabled && _visible) { auto renderer = Renderer::getInstance(); // 获取纯色画刷 @@ -88,7 +101,22 @@ e2d::Collider::Relation e2d::Collider::getRelationWith(Collider * collider) cons return Relation::Unknown; } -void e2d::Collider::_recreate() +bool e2d::Collider::isEnabled() const +{ + return _enabled; +} + +bool e2d::Collider::isVisible() const +{ + return _visible; +} + +bool e2d::Collider::isCollisionNotify() const +{ + return _notify; +} + +void e2d::Collider::recreate() { SafeRelease(_geometry); diff --git a/core/Common/Collision.cpp b/core/Common/Collision.cpp new file mode 100644 index 00000000..10030fe2 --- /dev/null +++ b/core/Common/Collision.cpp @@ -0,0 +1,34 @@ +#include "..\e2dcommon.h" + +e2d::Collision::Collision() + : _active(nullptr) + , _passive(nullptr) + , _relation(Collider::Relation::Unknown) +{ +} + +e2d::Collision::Collision(Node* active, Node* passive, Collider::Relation relation) + : _active(active) + , _passive(passive) + , _relation(relation) +{ +} + +e2d::Collision::~Collision() +{ +} + +e2d::Node * e2d::Collision::getActive() const +{ + return _active; +} + +e2d::Node * e2d::Collision::getPassive() const +{ + return _passive; +} + +e2d::Collider::Relation e2d::Collision::getRelation() const +{ + return _relation; +} diff --git a/core/Manager/CollisionManager.cpp b/core/Manager/CollisionManager.cpp index c513d9fb..c6370276 100644 --- a/core/Manager/CollisionManager.cpp +++ b/core/Manager/CollisionManager.cpp @@ -22,8 +22,6 @@ void e2d::CollisionManager::destroyInstance() } e2d::CollisionManager::CollisionManager() - : _activeNode(nullptr) - , _passiveNode(nullptr) { } @@ -31,73 +29,61 @@ e2d::CollisionManager::~CollisionManager() { } -void e2d::CollisionManager::__remove(Node * node) +void e2d::CollisionManager::__addCollider(Collider * collider) { - if (node) + _colliders.push_back(collider); +} + +void e2d::CollisionManager::__removeCollider(Collider * collider) +{ + auto iter = std::find(_colliders.begin(), _colliders.end(), collider); + if (iter != _colliders.end()) { - auto iter = std::find(_collisionNodes.begin(), _collisionNodes.end(), node); - if (iter != _collisionNodes.end()) - { - _collisionNodes.erase(iter); - } + _colliders.erase(iter); } } -void e2d::CollisionManager::updateCollider(Node * node) +void e2d::CollisionManager::__updateCollider(Collider* collider) { - if (node) - { - if (node->getCollider()->_shape != Collider::Shape::None) - { - node->getCollider()->_recreate(); - _collisionNodes.insert(node); - } - } -} - -void e2d::CollisionManager::update() -{ - // 判断碰撞监听是否打开 if (Game::getInstance()->isPaused() || !Game::getInstance()->getConfig()->isCollisionEnabled() || - SceneManager::getInstance()->isTransitioning()) - { - _collisionNodes.clear(); + SceneManager::getInstance()->isTransitioning() || + !collider->isCollisionNotify()) return; - } - for (auto iter1 = _collisionNodes.begin(); iter1 != _collisionNodes.end(); iter1++) + for (size_t i = 0; i < _colliders.size(); i++) { - auto node1 = (*iter1); // 判断与其他碰撞体的交集情况 - auto iter2 = iter1; - iter2++; - for (; iter2 != _collisionNodes.end(); iter2++) + auto active = collider->getNode(); + auto passive = _colliders[i]->getNode(); + // 判断两物体是否是相互冲突的物体 + if (active == passive || + active->getParentScene() != passive->getParentScene() || + !CollisionManager::isCollidable(active, passive)) { - auto node2 = (*iter2); - // 判断两物体是否是相互冲突的物体 - if (CollisionManager::isCollidable(node1, node2)) - { - // 判断两碰撞体交集情况 - Collider::Relation relation = node1->getCollider()->getRelationWith(node2->getCollider()); - // 忽略 UNKNOWN 和 DISJOIN 情况 - if (relation != Collider::Relation::Unknown && - relation != Collider::Relation::Disjoin) - { - // 更新碰撞监听器 - CollisionManager::__update(node1, node2); - } - } + continue; + } + + // 判断两碰撞体交集情况 + Collider::Relation relation = active->getCollider()->getRelationWith(passive->getCollider()); + // 忽略 UNKNOWN 和 DISJOIN 情况 + if (relation != Collider::Relation::Unknown && + relation != Collider::Relation::Disjoin) + { + _collision = Collision(active, passive, relation); + active->onCollision(_collision); + // 更新碰撞监听器 + CollisionManager::__updateListeners(); } } - _collisionNodes.clear(); + _collision = Collision(); } void e2d::CollisionManager::addName(const String & name1, const String & name2) { if (!name1.isEmpty() && !name2.isEmpty()) { - _collisionList.insert(HashPair(name1.getHashCode(), name2.getHashCode())); + _collisionList.insert(std::make_pair(name1.getHashCode(), name2.getHashCode())); } } @@ -107,7 +93,7 @@ void e2d::CollisionManager::addName(const std::vector { if (!name.first.isEmpty() && !name.second.isEmpty()) { - _collisionList.insert(HashPair(name.first.getHashCode(), name.second.getHashCode())); + _collisionList.insert(std::make_pair(name.first.getHashCode(), name.second.getHashCode())); } } } @@ -119,8 +105,10 @@ bool e2d::CollisionManager::isCollidable(Node * node1, Node * node2) bool e2d::CollisionManager::isCollidable(const String & name1, const String & name2) { - UINT hashName1 = name1.getHashCode(), hashName2 = name2.getHashCode(); - HashPair pair1 = HashPair(hashName1, hashName2), pair2 = HashPair(hashName2, hashName1); + UINT hashName1 = name1.getHashCode(), + hashName2 = name2.getHashCode(); + auto pair1 = std::make_pair(hashName1, hashName2), + pair2 = std::make_pair(hashName2, hashName1); for (auto& pair : _collisionList) { if (pair == pair1 || pair == pair2) @@ -131,56 +119,16 @@ bool e2d::CollisionManager::isCollidable(const String & name1, const String & na return false; } -e2d::Node * e2d::CollisionManager::getActiveNode() +e2d::Collision e2d::CollisionManager::getCollision() const { - return _activeNode; + return _collision; } -e2d::Node * e2d::CollisionManager::getPassiveNode() -{ - return _passiveNode; -} - -bool e2d::CollisionManager::isCausedBy(const String & name1, const String & name2) -{ - String activeName = _activeNode->getName(); - String passiveName = _passiveNode->getName(); - return (activeName == name1 && passiveName == name2) || - (activeName == name2 && passiveName == name1); -} - -bool e2d::CollisionManager::isCausedBy(Node * node1, Node * node2) -{ - return (_activeNode == node1 && _passiveNode == node2) || - (_activeNode == node2 && _passiveNode == node1); -} - -e2d::Node* e2d::CollisionManager::isCausedBy(Node * node) -{ - if (_activeNode == node) - return _passiveNode; - if (_passiveNode == node) - return _activeNode; - return nullptr; -} - -e2d::Node* e2d::CollisionManager::isCausedBy(const String& name) -{ - if (_activeNode->getName() == name) - return _activeNode; - if (_passiveNode->getName() == name) - return _passiveNode; - return nullptr; -} - -void e2d::CollisionManager::__update(Node * active, Node * passive) +void e2d::CollisionManager::__updateListeners() { if (_listeners.empty() || Game::getInstance()->isPaused()) return; - _activeNode = active; - _passiveNode = passive; - for (size_t i = 0; i < _listeners.size(); ++i) { auto listener = _listeners[i]; @@ -197,9 +145,6 @@ void e2d::CollisionManager::__update(Node * active, Node * passive) ++i; } } - - _activeNode = nullptr; - _passiveNode = nullptr; } e2d::Listener * e2d::CollisionManager::addListener(const Function& func, const String& name, bool paused) diff --git a/core/Node/Node.cpp b/core/Node/Node.cpp index b0a90fb5..a3cccef1 100644 --- a/core/Node/Node.cpp +++ b/core/Node/Node.cpp @@ -80,7 +80,6 @@ e2d::Node::~Node() SafeRelease(_outline); ActionManager::getInstance()->clearAllBindedWith(this); - CollisionManager::getInstance()->__remove(this); for (auto child : _children) { GC::release(child); @@ -89,9 +88,6 @@ e2d::Node::~Node() void e2d::Node::_update() { - // 更新转换矩阵 - _updateTransform(); - if (_children.empty()) { if (_autoUpdate && !Game::getInstance()->isPaused()) @@ -106,9 +102,8 @@ void e2d::Node::_update() _sortChildren(); // 遍历子节点 - size_t size = _children.size(); size_t i; - for (i = 0; i < size; ++i) + for (i = 0; i < _children.size(); ++i) { auto child = _children[i]; // 访问 Order 小于零的节点 @@ -129,9 +124,14 @@ void e2d::Node::_update() this->_fixedUpdate(); // 访问其他节点 - for (; i < size; ++i) + for (; i < _children.size(); ++i) _children[i]->_update(); } + + // 更新转换矩阵 + updateTransform(); + // 保留差别属性 + _extrapolate = this->getProperty(); } void e2d::Node::_render() @@ -141,9 +141,6 @@ void e2d::Node::_render() return; } - // 更新转换矩阵 - _updateTransform(); - if (_children.empty()) { // 转换渲染器的二维矩阵 @@ -156,9 +153,8 @@ void e2d::Node::_render() // 子节点排序 _sortChildren(); - size_t size = _children.size(); size_t i; - for (i = 0; i < size; ++i) + for (i = 0; i < _children.size(); ++i) { auto child = _children[i]; // 访问 Order 小于零的节点 @@ -178,7 +174,7 @@ void e2d::Node::_render() this->onRender(); // 访问剩余节点 - for (; i < size; ++i) + for (; i < _children.size(); ++i) _children[i]->_render(); } } @@ -207,10 +203,7 @@ void e2d::Node::_renderOutline() void e2d::Node::_renderCollider() { // 绘制自身的几何碰撞体 - if (_collider._visible) - { - _collider._render(); - } + _collider.render(); // 绘制所有子节点的几何碰撞体 for (auto child : _children) @@ -219,11 +212,53 @@ void e2d::Node::_renderCollider() } } -void e2d::Node::_updateTransform() +void e2d::Node::updateTransform() { if (!_needTransform) return; + _updateSelfTransform(); + CollisionManager::getInstance()->__updateCollider(&_collider); + + if (_needTransform) + { + _updateSelfTransform(); + } + + // 为节点创建一个轮廓 + ID2D1RectangleGeometry * rectGeo = nullptr; + ID2D1TransformedGeometry * transformedGeo = nullptr; + + auto factory = Renderer::getFactory(); + HRESULT hr = factory->CreateRectangleGeometry( + D2D1::RectF(0, 0, _width, _height), + &rectGeo + ); + + if (SUCCEEDED(hr)) + { + factory->CreateTransformedGeometry( + rectGeo, + _finalMatri, + &transformedGeo + ); + } + + SafeRelease(rectGeo); + SafeRelease(_outline); + _outline = transformedGeo; + + // 通知子节点进行转换 + for (auto& child : _children) + { + child->_needTransform = true; + } +} + +void e2d::Node::_updateSelfTransform() +{ + _needTransform = false; + // 计算中心点坐标 D2D1_POINT_2F pivot = { _width * _pivotX, _height * _pivotY }; // 变换 Initial 矩阵,子节点将根据这个矩阵进行变换 @@ -251,35 +286,8 @@ void e2d::Node::_updateTransform() _finalMatri = _finalMatri * _parent->_initialMatri; } - // 为节点创建一个轮廓 - ID2D1RectangleGeometry * rectGeo; - ID2D1TransformedGeometry * transformedGeo; - - auto factory = Renderer::getFactory(); - factory->CreateRectangleGeometry( - D2D1::RectF(0, 0, _width, _height), - &rectGeo - ); - factory->CreateTransformedGeometry( - rectGeo, - _finalMatri, - &transformedGeo - ); - - SafeRelease(rectGeo); - SafeRelease(_outline); - _outline = transformedGeo; - // 更新碰撞体 - CollisionManager::getInstance()->updateCollider(this); - // 标志已执行过变换 - _needTransform = false; - - // 通知子节点进行转换 - for (auto& child : _children) - { - child->_needTransform = true; - } + _collider.recreate(); } void e2d::Node::_sortChildren() @@ -425,6 +433,11 @@ e2d::Node::Property e2d::Node::getProperty() const return std::move(prop); } +e2d::Node::Property e2d::Node::getExtrapolate() const +{ + return this->getProperty() - _extrapolate; +} + e2d::Collider* e2d::Node::getCollider() { return &_collider; @@ -462,8 +475,6 @@ void e2d::Node::setPos(double x, double y) _posX = float(x); _posY = float(y); - _extrapolate.posX += x; - _extrapolate.posY += y; _needTransform = true; } @@ -518,8 +529,6 @@ void e2d::Node::setScale(double scaleX, double scaleY) _scaleX = float(scaleX); _scaleY = float(scaleY); - _extrapolate.scaleX += scaleX; - _extrapolate.scaleY += scaleY; _needTransform = true; } @@ -540,8 +549,6 @@ void e2d::Node::setSkew(double angleX, double angleY) _skewAngleX = float(angleX); _skewAngleY = float(angleY); - _extrapolate.skewAngleX += angleX; - _extrapolate.skewAngleY += angleY; _needTransform = true; } @@ -551,7 +558,6 @@ void e2d::Node::setRotation(double angle) return; _rotation = float(angle); - _extrapolate.rotation += angle; _needTransform = true; } @@ -582,8 +588,6 @@ void e2d::Node::setPivot(double pivotX, double pivotY) _pivotX = std::min(std::max(float(pivotX), 0.f), 1.f); _pivotY = std::min(std::max(float(pivotY), 0.f), 1.f); - _extrapolate.pivotX += pivotX; - _extrapolate.pivotY += pivotY; _needTransform = true; } @@ -604,8 +608,6 @@ void e2d::Node::setSize(double width, double height) _width = float(width); _height = float(height); - _extrapolate.width += width; - _extrapolate.height += height; _needTransform = true; } @@ -786,7 +788,7 @@ void e2d::Node::removeChildren(const String& childName) } } -void e2d::Node::clearAllChildren() +void e2d::Node::removeAllChildren() { // 所有节点的引用计数减一 for (auto child : _children) @@ -840,7 +842,7 @@ void e2d::Node::stopAction(const String& name) bool e2d::Node::containsPoint(const Point& point) { - _updateTransform(); + updateTransform(); if (_outline) { BOOL ret = 0; @@ -859,8 +861,8 @@ bool e2d::Node::containsPoint(const Point& point) bool e2d::Node::intersects(Node * node) { - _updateTransform(); - node->_updateTransform(); + updateTransform(); + node->updateTransform(); if (_outline) { D2D1_GEOMETRY_RELATION relation; diff --git a/core/e2dcommon.h b/core/e2dcommon.h index e5eef4d6..0d69142b 100644 --- a/core/e2dcommon.h +++ b/core/e2dcommon.h @@ -441,14 +441,10 @@ public: class Node; -class CollisionManager; // 碰撞体 class Collider { - friend class Node; - friend class CollisionManager; - public: // 碰撞体形状 enum class Shape @@ -470,13 +466,24 @@ public: }; public: + Collider( + Node * parent + ); + + virtual ~Collider(); + // 设置碰撞体形状 - virtual void setShape( + void setShape( Shape shape ); + // 是否触发碰撞事件 + void setCollisionNotify( + bool notify + ); + // 启用或关闭该碰撞体 - virtual void setEnabled( + void setEnabled( bool enabled ); @@ -491,37 +498,44 @@ public: ); // 判断两碰撞体的交集关系 - virtual Relation getRelationWith( + Relation getRelationWith( Collider * pCollider ) const; + // 是否启用碰撞体 + bool isEnabled() const; + + // 是否可见 + bool isVisible() const; + + // 是否触发碰撞事件 + bool isCollisionNotify() const; + // 获取绘制颜色 Color getColor() const; // 获取形状 Shape getShape() const; + // 获取绑定节点 + Node* getNode() const; + // 获取 ID2D1Geometry* 对象 ID2D1Geometry* getGeometry() const; -protected: - Collider( - Node * parent - ); - - virtual ~Collider(); - - E2D_DISABLE_COPY(Collider); - // 重新生成 - void _recreate(); + void recreate(); // 渲染碰撞体 - void _render(); + void render(); + +protected: + E2D_DISABLE_COPY(Collider); protected: bool _enabled; bool _visible; + bool _notify; Color _color; Node * _parentNode; Shape _shape; @@ -529,6 +543,36 @@ protected: }; +// 碰撞事件 +class Collision +{ +public: + Collision(); + + Collision( + Node* active, + Node* passive, + Collider::Relation relation + ); + + ~Collision(); + + // 获取发生碰撞的主动方 + Node* getActive() const; + + // 获取发生碰撞的被动方 + Node* getPassive() const; + + // 获取交集关系 + Collider::Relation getRelation() const; + +protected: + Node * _active; + Node* _passive; + Collider::Relation _relation; +}; + + // 资源 class Resource { diff --git a/core/e2dmanager.h b/core/e2dmanager.h index 218324e5..73c5a69d 100644 --- a/core/e2dmanager.h +++ b/core/e2dmanager.h @@ -5,13 +5,9 @@ namespace e2d { -class Game; -class Input; -class Renderer; + class Node; -class Task; class Action; -class Player; class Collider; class Transition; @@ -249,6 +245,7 @@ private: class CollisionManager { friend class Node; + friend class Collider; public: // 获取碰撞体管理器实例 @@ -265,7 +262,7 @@ public: // 添加可互相碰撞物体的名称 void addName( - const std::vector >& names + const std::vector>& names ); // 判断两个物体是否是可碰撞的 @@ -280,35 +277,8 @@ public: const String& name2 ); - // 获取碰撞发生时的主动体 - Node * getActiveNode(); - - // 获取碰撞发生时的被动体 - Node * getPassiveNode(); - - // 判断发生碰撞的节点名称是否相同 - bool isCausedBy( - const String& name1, - const String& name2 - ); - - // 判断两物体是否发生碰撞 - bool isCausedBy( - Node * node1, - Node * node2 - ); - - // 判断发生碰撞的任意一方名称是否相同 - // 若相同,返回其指针,否则返回空 - Node * isCausedBy( - const String& name - ); - - // 判断物体是否发生碰撞 - // 如果是,返回与其相撞的节点指针,否则返回空 - Node * isCausedBy( - Node * node - ); + // 获取碰撞事件 + Collision getCollision() const; // 添加碰撞监听 Listener * addListener( @@ -354,14 +324,6 @@ public: // 强制清除所有监听器 void clearAllListeners(); - // 更新碰撞体 - void updateCollider( - Node * node - ); - - // 更新碰撞体管理器 - void update(); - private: CollisionManager(); @@ -369,24 +331,29 @@ private: E2D_DISABLE_COPY(CollisionManager); - void __remove( - Node* node + // 添加碰撞体 + void __addCollider( + Collider* collider + ); + + // 移除碰撞体 + void __removeCollider( + Collider* collider + ); + + // 更新碰撞体 + void __updateCollider( + Collider* collider ); // 更新监听器 - void __update( - Node * active, - Node * passive - ); + void __updateListeners(); private: - typedef std::pair HashPair; - - e2d::Node * _activeNode; - e2d::Node * _passiveNode; - std::set _collisionNodes; - std::set _collisionList; + Collision _collision; + std::vector _colliders; std::vector _listeners; + std::set> _collisionList; static CollisionManager * _instance; }; diff --git a/core/e2dnode.h b/core/e2dnode.h index bca02721..a60bef65 100644 --- a/core/e2dnode.h +++ b/core/e2dnode.h @@ -7,6 +7,7 @@ namespace e2d class Action; class Transition; +class CollisionManager; class Node : public Ref @@ -14,6 +15,7 @@ class Node : friend class Scene; friend class Collider; friend class Transition; + friend class CollisionManager; public: // 节点属性 @@ -48,6 +50,11 @@ public: // 渲染节点 virtual void onRender() {} + // 节点发生碰撞 + virtual void onCollision( + Collision other + ) {} + // 获取节点显示状态 virtual bool isVisible() const; @@ -124,6 +131,9 @@ public: // 获取节点属性 virtual Property getProperty() const; + // 获取差别属性 + virtual Property getExtrapolate() const; + // 获取节点碰撞体 virtual Collider * getCollider(); @@ -159,12 +169,12 @@ public: const String& childName ); + // 移除所有节点 + virtual void removeAllChildren(); + // 从父节点移除 virtual void removeFromParent(); - // 移除所有节点 - virtual void clearAllChildren(); - // 设置节点是否显示 virtual void setVisible( bool value @@ -375,6 +385,9 @@ public: // 停止所有动作 virtual void stopAllActions(); + // 更新转换矩阵 + void updateTransform(); + protected: E2D_DISABLE_COPY(Node); @@ -395,8 +408,8 @@ protected: Scene * scene ); - // 更新节点二维矩阵 - void _updateTransform(); + // 更新自身转换矩阵 + void _updateSelfTransform(); // 子节点排序 void _sortChildren(); diff --git a/project/vs2012/Easy2D.vcxproj b/project/vs2012/Easy2D.vcxproj index cb487ee4..0303e5c2 100644 --- a/project/vs2012/Easy2D.vcxproj +++ b/project/vs2012/Easy2D.vcxproj @@ -59,6 +59,7 @@ + diff --git a/project/vs2012/Easy2D.vcxproj.filters b/project/vs2012/Easy2D.vcxproj.filters index 03303913..c20ee156 100644 --- a/project/vs2012/Easy2D.vcxproj.filters +++ b/project/vs2012/Easy2D.vcxproj.filters @@ -260,5 +260,8 @@ Manager + + Common + \ No newline at end of file diff --git a/project/vs2013/Easy2D.vcxproj b/project/vs2013/Easy2D.vcxproj index a531da63..e941eb34 100644 --- a/project/vs2013/Easy2D.vcxproj +++ b/project/vs2013/Easy2D.vcxproj @@ -203,6 +203,7 @@ + diff --git a/project/vs2013/Easy2D.vcxproj.filters b/project/vs2013/Easy2D.vcxproj.filters index c279e3d1..3c2b8a39 100644 --- a/project/vs2013/Easy2D.vcxproj.filters +++ b/project/vs2013/Easy2D.vcxproj.filters @@ -260,5 +260,8 @@ Manager + + Common + \ No newline at end of file diff --git a/project/vs2017/Easy2D.vcxproj b/project/vs2017/Easy2D.vcxproj index 2836fe63..5718ded1 100644 --- a/project/vs2017/Easy2D.vcxproj +++ b/project/vs2017/Easy2D.vcxproj @@ -222,6 +222,7 @@ + diff --git a/project/vs2017/Easy2D.vcxproj.filters b/project/vs2017/Easy2D.vcxproj.filters index 64bb623a..49728c3b 100644 --- a/project/vs2017/Easy2D.vcxproj.filters +++ b/project/vs2017/Easy2D.vcxproj.filters @@ -243,6 +243,9 @@ Manager + + Common +