From 69e2b815ed2f2f122314845fda897b431242a5b9 Mon Sep 17 00:00:00 2001 From: lite3 Date: Tue, 12 Aug 2014 17:05:23 +0800 Subject: [PATCH 01/41] fix: copy map when getParseCallBackMap() and getParseObjectMap() --- cocos/editor-support/cocostudio/CCSGUIReader.cpp | 8 ++++---- cocos/editor-support/cocostudio/CCSGUIReader.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index d86f04c166..61c9b86ca8 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -1512,11 +1512,11 @@ void WidgetPropertiesReader0300::setPropsForAllCustomWidgetFromJsonDictionary(co { GUIReader* guiReader = GUIReader::getInstance(); - std::map object_map = GUIReader::getInstance()->getParseObjectMap(); - Ref* object = object_map[classType]; + std::map *object_map = guiReader->getParseObjectMap(); + Ref* object = (*object_map)[classType]; - std::map selector_map = guiReader->getParseCallBackMap(); - SEL_ParseEvent selector = selector_map[classType]; + std::map *selector_map = guiReader->getParseCallBackMap(); + SEL_ParseEvent selector = (*selector_map)[classType]; if (object && selector) { diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index 89f27a6a1b..a4e6b880f3 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -85,8 +85,8 @@ protected: ParseObjectMap _mapObject; public: - ParseCallBackMap getParseCallBackMap() { return _mapParseSelector; }; - ParseObjectMap getParseObjectMap() { return _mapObject; }; + ParseCallBackMap* getParseCallBackMap() { return &_mapParseSelector; }; + ParseObjectMap* getParseObjectMap() { return &_mapObject; }; }; From 8f59d8ac93941b42e9d9df47af6448451000d599 Mon Sep 17 00:00:00 2001 From: lite3 Date: Tue, 12 Aug 2014 17:19:52 +0800 Subject: [PATCH 02/41] add GUIReader::registerTypeAndCallBack for std::function --- cocos/base/ObjectFactory.cpp | 23 +++++++++++++++++-- cocos/base/ObjectFactory.h | 3 +++ .../cocostudio/CCSGUIReader.cpp | 21 +++++++++++++++++ .../editor-support/cocostudio/CCSGUIReader.h | 5 ++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/cocos/base/ObjectFactory.cpp b/cocos/base/ObjectFactory.cpp index 3179b5f1f6..9612b2ab57 100644 --- a/cocos/base/ObjectFactory.cpp +++ b/cocos/base/ObjectFactory.cpp @@ -23,6 +23,7 @@ THE SOFTWARE. ****************************************************************************/ #include "ObjectFactory.h" +#include NS_CC_BEGIN @@ -30,12 +31,22 @@ NS_CC_BEGIN ObjectFactory::TInfo::TInfo(void) :_class("") ,_fun(nullptr) +,_func(nullptr) { } ObjectFactory::TInfo::TInfo(const std::string& type, Instance ins) :_class(type) ,_fun(ins) +,_func(nullptr) +{ + ObjectFactory::getInstance()->registerType(*this); +} + +ObjectFactory::TInfo::TInfo(const std::string& type, InstanceFunc ins) + :_class(type) + ,_fun(nullptr) + ,_func(ins) { ObjectFactory::getInstance()->registerType(*this); } @@ -44,18 +55,21 @@ ObjectFactory::TInfo::TInfo(const TInfo &t) { _class = t._class; _fun = t._fun; + _func = t._func; } ObjectFactory::TInfo::~TInfo(void) { _class = ""; _fun = nullptr; + _func = nullptr; } ObjectFactory::TInfo& ObjectFactory::TInfo::operator= (const TInfo &t) { _class = t._class; _fun = t._fun; + _func = t._func; return *this; } @@ -92,8 +106,13 @@ Ref* ObjectFactory::createObject(const std::string &name) do { const TInfo t = _typeMap[name]; - CC_BREAK_IF(t._fun == nullptr); - o = t._fun(); + if (t._fun != nullptr) + { + o = t._fun(); + }else if (t._func != nullptr) + { + o = t._func(); + } } while (0); return o; diff --git a/cocos/base/ObjectFactory.h b/cocos/base/ObjectFactory.h index 658fc65352..ce74615d61 100644 --- a/cocos/base/ObjectFactory.h +++ b/cocos/base/ObjectFactory.h @@ -36,15 +36,18 @@ class CC_DLL ObjectFactory { public: typedef cocos2d::Ref* (*Instance)(void); + typedef std::function InstanceFunc; struct CC_DLL TInfo { TInfo(void); TInfo(const std::string& type, Instance ins = NULL); + TInfo(const std::string& type, InstanceFunc ins = NULL); TInfo(const TInfo &t); ~TInfo(void); TInfo& operator= (const TInfo &t); std::string _class; Instance _fun; + InstanceFunc _func; }; typedef std::unordered_map FactoryMap; diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index 61c9b86ca8..b766a39b67 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -177,6 +177,27 @@ void GUIReader::registerTypeAndCallBack(const std::string& classType, } } +void GUIReader::registerTypeAndCallBack(const std::string& classType, + ObjectFactory::InstanceFunc ins, + Ref *object, + SEL_ParseEvent callBack) +{ + ObjectFactory* factoryCreate = ObjectFactory::getInstance(); + + ObjectFactory::TInfo t(classType, ins); + factoryCreate->registerType(t); + + if (object) + { + _mapObject.insert(ParseObjectMap::value_type(classType, object)); + } + + if (callBack) + { + _mapParseSelector.insert(ParseCallBackMap::value_type(classType, callBack)); + } +} + Widget* GUIReader::widgetFromJsonFile(const char *fileName) { diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index a4e6b880f3..12239ead66 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -72,6 +72,11 @@ public: cocos2d::ObjectFactory::Instance ins, Ref* object, SEL_ParseEvent callBack); + + void registerTypeAndCallBack(const std::string& classType, + cocos2d::ObjectFactory::InstanceFunc ins, + Ref* object, + SEL_ParseEvent callBack); protected: GUIReader(); ~GUIReader(); From fa83d63c5dcfa14f36884144d3116d079dd23c9f Mon Sep 17 00:00:00 2001 From: lite3 Date: Tue, 12 Aug 2014 17:35:18 +0800 Subject: [PATCH 03/41] replace NULL to nullptr fix compile error --- cocos/base/ObjectFactory.cpp | 2 +- cocos/base/ObjectFactory.h | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cocos/base/ObjectFactory.cpp b/cocos/base/ObjectFactory.cpp index 9612b2ab57..8baebbf4e9 100644 --- a/cocos/base/ObjectFactory.cpp +++ b/cocos/base/ObjectFactory.cpp @@ -22,8 +22,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#include "ObjectFactory.h" #include +#include "ObjectFactory.h" NS_CC_BEGIN diff --git a/cocos/base/ObjectFactory.h b/cocos/base/ObjectFactory.h index ce74615d61..c9342f2c9d 100644 --- a/cocos/base/ObjectFactory.h +++ b/cocos/base/ObjectFactory.h @@ -27,6 +27,7 @@ THE SOFTWARE. #include #include +#include #include "base/CCRef.h" #include "base/CCPlatformMacros.h" @@ -40,8 +41,8 @@ public: struct CC_DLL TInfo { TInfo(void); - TInfo(const std::string& type, Instance ins = NULL); - TInfo(const std::string& type, InstanceFunc ins = NULL); + TInfo(const std::string& type, Instance ins = nullptr); + TInfo(const std::string& type, InstanceFunc ins = nullptr); TInfo(const TInfo &t); ~TInfo(void); TInfo& operator= (const TInfo &t); From c136e8e07954119f902cd7dbb321fbe77298bef1 Mon Sep 17 00:00:00 2001 From: lite3 Date: Thu, 21 Aug 2014 02:15:27 +0800 Subject: [PATCH 04/41] fix indent --- cocos/base/ObjectFactory.cpp | 10 +- .../SampleUIAnimation.ExportJson | 1682 +++++++++++++++++ .../SampleUIAnimation0.plist | 84 + .../SampleUIAnimation/SampleUIAnimation0.png | Bin 0 -> 28378 bytes .../SampleUIAnimation.ExportJson | 1368 ++++++++++++++ .../SampleUIAnimation0.plist | 84 + .../SampleUIAnimation/SampleUIAnimation0.png | Bin 0 -> 28378 bytes 7 files changed, 3223 insertions(+), 5 deletions(-) create mode 100644 tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson create mode 100644 tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.plist create mode 100644 tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.png create mode 100644 tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson create mode 100644 tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation0.plist create mode 100644 tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation0.png diff --git a/cocos/base/ObjectFactory.cpp b/cocos/base/ObjectFactory.cpp index 8baebbf4e9..5cff373cb3 100644 --- a/cocos/base/ObjectFactory.cpp +++ b/cocos/base/ObjectFactory.cpp @@ -102,10 +102,10 @@ void ObjectFactory::destroyInstance() Ref* ObjectFactory::createObject(const std::string &name) { - Ref *o = nullptr; - do - { - const TInfo t = _typeMap[name]; + Ref *o = nullptr; + do + { + const TInfo t = _typeMap[name]; if (t._fun != nullptr) { o = t._fun(); @@ -113,7 +113,7 @@ Ref* ObjectFactory::createObject(const std::string &name) { o = t._func(); } - } while (0); + } while (0); return o; } diff --git a/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson b/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson new file mode 100644 index 0000000000..c38743cf4e --- /dev/null +++ b/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson @@ -0,0 +1,1682 @@ +{ + "classname": null, + "name": null, + "animation": { + "classname": null, + "name": "AnimationManager", + "actionlist": [ + { + "classname": null, + "name": "Animation1", + "actionnodelist": [ + { + "classname": null, + "name": "ImageView", + "ActionTag": 27, + "actionframelist": [ + { + "classname": null, + "name": null, + "colorb": 255, + "colorg": 255, + "colorr": 255, + "frameid": 0, + "opacity": 255, + "positionx": 39, + "positiony": 165.920044, + "rotation": 0, + "scalex": 1, + "scaley": 1, + "starttime": 1.77505913E+30, + "tweenParameter": [ + 0, + 0, + 1, + 1 + ], + "tweenType": 0, + "visible": false + }, + { + "classname": null, + "name": null, + "colorb": 255, + "colorg": 255, + "colorr": 255, + "frameid": 10, + "opacity": 255, + "positionx": 150, + "positiony": 42.9200439, + "rotation": 90, + "scalex": 1, + "scaley": 1, + "starttime": 1.401298E-42, + "tweenParameter": [ + 0, + 0, + 1, + 1 + ], + "tweenType": 0, + "visible": false + }, + { + "classname": null, + "name": null, + "colorb": 255, + "colorg": 255, + "colorr": 255, + "frameid": 15, + "opacity": 255, + "positionx": 190, + "positiony": 14.9200287, + "rotation": 90, + "scalex": 0.3, + "scaley": 1.6, + "starttime": 7.163279E-39, + "tweenParameter": [ + 0, + 0, + 1, + 1 + ], + "tweenType": 0, + "visible": false + }, + { + "classname": null, + "name": null, + "colorb": 52, + "colorg": 49, + "colorr": 196, + "frameid": 20, + "opacity": 255, + "positionx": 266, + "positiony": 91.92003, + "rotation": 272, + "scalex": 1, + "scaley": 1, + "starttime": 4.224576E-39, + "tweenParameter": [ + 0, + 0, + 1, + 1 + ], + "tweenType": 0, + "visible": false + }, + { + "classname": null, + "name": null, + "colorb": 255, + "colorg": 255, + "colorr": 255, + "frameid": 30, + "opacity": 0, + "positionx": 346.7685, + "positiony": 150.259537, + "rotation": -10.2989807, + "scalex": 1, + "scaley": 1, + "starttime": 7.163279E-39, + "tweenParameter": [ + 0, + 0, + 1, + 1 + ], + "tweenType": 0, + "visible": false + }, + { + "classname": null, + "name": null, + "colorb": 255, + "colorg": 255, + "colorr": 255, + "frameid": 40, + "opacity": 255, + "positionx": 235, + "positiony": 204.000015, + "rotation": 270, + "scalex": 1, + "scaley": 1, + "starttime": 1.401298E-45, + "tweenParameter": [ + 0, + 0, + 1, + 1 + ], + "tweenType": 0, + "visible": false + }, + { + "classname": null, + "name": null, + "colorb": 255, + "colorg": 255, + "colorr": 255, + "frameid": 50, + "opacity": 255, + "positionx": 312, + "positiony": 231.000015, + "rotation": 349.701019, + "scalex": -1, + "scaley": 0.9754356, + "starttime": 4.224576E-39, + "tweenParameter": [ + 0, + 0, + 1, + 1 + ], + "tweenType": 0, + "visible": false + }, + { + "classname": null, + "name": null, + "colorb": 255, + "colorg": 255, + "colorr": 255, + "frameid": 60, + "opacity": 255, + "positionx": 312, + "positiony": 231.000015, + "rotation": -10.2989807, + "scalex": 1, + "scaley": 0.9754356, + "starttime": 0, + "tweenParameter": [ + 0, + 0, + 1, + 1 + ], + "tweenType": 0, + "visible": false + }, + { + "classname": null, + "name": null, + "colorb": 255, + "colorg": 255, + "colorr": 255, + "frameid": 70, + "opacity": 255, + "positionx": 312, + "positiony": 231.000015, + "rotation": -10.2989807, + "scalex": -1, + "scaley": 0.9754356, + "starttime": 9.64289E-39, + "tweenParameter": [ + 0, + 0, + 1, + 1 + ], + "tweenType": 0, + "visible": false + } + ] + } + ], + "loop": false, + "unittime": 0.1 + } + ] + }, + "dataScale": 1, + "designHeight": 320, + "designWidth": 480, + "textures": [ + "SampleUIAnimation0.plist" + ], + "texturesPng": [ + "SampleUIAnimation0.png" + ], + "version": "1.5.0.0", + "widgetTree": { + "classname": "Panel", + "name": null, + "children": [ + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "TextButton", + "ZOrder": 2, + "actiontag": 24, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": null, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.0609375, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.104166664, + "sizePercentY": 0.046875, + "sizeType": 0, + "tag": 4, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 240, + "y": 39, + "capInsetsHeight": 0, + "capInsetsWidth": 0, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": "backtotopnormal.png", + "plistFile": "", + "resourceType": 1 + }, + "fontName": "宋体", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotopnormal.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "start anim", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "ImageView", + "name": null, + "children": [], + "options": { + "__type": "ImageViewSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "ImageView", + "name": "ImageView", + "ZOrder": 1, + "actiontag": 27, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSImageView", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 84, + "ignoreSize": true, + "layoutParameter": null, + "opacity": 255, + "positionPercentX": 0.040625, + "positionPercentY": 0.2578125, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.0791666657, + "sizePercentY": 0.13125, + "sizeType": 0, + "tag": 5, + "touchAble": false, + "useMergedTexture": true, + "visible": true, + "width": 76, + "x": 39, + "y": 165, + "capInsetsHeight": 0, + "capInsetsWidth": 0, + "capInsetsX": 0, + "capInsetsY": 0, + "fileName": null, + "fileNameData": { + "path": "CocoStudio_UIEditor.png", + "plistFile": "", + "resourceType": 1 + }, + "scale9Enable": false, + "scale9Height": 84, + "scale9Width": 76 + } + }, + { + "classname": "LoadingBar", + "name": null, + "children": [], + "options": { + "__type": "LoadingBarSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "LoadingBar", + "name": "ProgressBar_4", + "ZOrder": 0, + "actiontag": 36022812, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSLoadingBar", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": null, + "opacity": 255, + "positionPercentX": 0.0791666657, + "positionPercentY": 0.4453125, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.104166664, + "sizePercentY": 0.046875, + "sizeType": 0, + "tag": 7, + "touchAble": false, + "useMergedTexture": false, + "visible": true, + "width": 100, + "x": 76, + "y": 285, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "direction": 0, + "percent": 71, + "scale9Enable": false, + "texture": null, + "textureData": { + "path": "backtotopnormal.png", + "plistFile": "", + "resourceType": 1 + } + } + }, + { + "classname": "ListView", + "name": null, + "children": [ + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_6", + "ZOrder": 0, + "actiontag": 35532643, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 0, + "gravity": 2, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": 0, + "marginRight": 0, + "marginTop": 0, + "relativeName": "Button_6", + "relativeToName": "ListView_5", + "type": 1 + }, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.95714283, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.5, + "sizePercentY": 0.15, + "sizeType": 0, + "tag": 9, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 50, + "y": 335, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_6_0", + "ZOrder": 1, + "actiontag": 56999240, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 0, + "gravity": 2, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": -100, + "marginRight": 0, + "marginTop": -200, + "relativeName": "Button_6_0", + "relativeToName": "ListView_5", + "type": 1 + }, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.8428571, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.5, + "sizePercentY": 0.15, + "sizeType": 0, + "tag": 11, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 50, + "y": 295, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_6_0_1", + "ZOrder": 2, + "actiontag": 66472916, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 0, + "gravity": 2, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": -100, + "marginRight": 0, + "marginTop": -160, + "relativeName": "Button_6_0_1", + "relativeToName": "ListView_5", + "type": 1 + }, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.7285714, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.5, + "sizePercentY": 0.15, + "sizeType": 0, + "tag": 13, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 50, + "y": 255, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_6_0_2", + "ZOrder": 3, + "actiontag": 29143545, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 0, + "gravity": 2, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": -100, + "marginRight": 0, + "marginTop": -160, + "relativeName": "Button_6_0_2", + "relativeToName": "ListView_5", + "type": 1 + }, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.6142857, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.5, + "sizePercentY": 0.15, + "sizeType": 0, + "tag": 14, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 50, + "y": 215, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_6_0_3", + "ZOrder": 4, + "actiontag": 1842679, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 0, + "gravity": 2, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": -100, + "marginRight": 0, + "marginTop": -160, + "relativeName": "Button_6_0_3", + "relativeToName": "ListView_5", + "type": 1 + }, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.5, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.5, + "sizePercentY": 0.15, + "sizeType": 0, + "tag": 15, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 50, + "y": 175, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_6_0_4", + "ZOrder": 5, + "actiontag": 37105032, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 0, + "gravity": 2, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": -100, + "marginRight": 0, + "marginTop": -160, + "relativeName": "Button_6_0_4", + "relativeToName": "ListView_5", + "type": 1 + }, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.3857143, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.5, + "sizePercentY": 0.15, + "sizeType": 0, + "tag": 16, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 50, + "y": 135, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_6_0_5", + "ZOrder": 6, + "actiontag": 36874222, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 0, + "gravity": 2, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": -100, + "marginRight": 0, + "marginTop": -160, + "relativeName": "Button_6_0_5", + "relativeToName": "ListView_5", + "type": 1 + }, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.271428585, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.5, + "sizePercentY": 0.15, + "sizeType": 0, + "tag": 17, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 50, + "y": 95, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_6_0_6", + "ZOrder": 7, + "actiontag": 11303491, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 0, + "gravity": 2, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": -100, + "marginRight": 0, + "marginTop": -160, + "relativeName": "Button_6_0_6", + "relativeToName": "ListView_5", + "type": 1 + }, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.157142863, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.5, + "sizePercentY": 0.15, + "sizeType": 0, + "tag": 18, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 50, + "y": 55, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_6_0_7", + "ZOrder": 8, + "actiontag": 21667656, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 0, + "gravity": 2, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": -100, + "marginRight": 0, + "marginTop": -160, + "relativeName": "Button_6_0_7", + "relativeToName": "ListView_5", + "type": 1 + }, + "opacity": 255, + "positionPercentX": 0.25, + "positionPercentY": 0.042857144, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.5, + "sizePercentY": 0.15, + "sizeType": 0, + "tag": 19, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 50, + "y": 15, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotoppressed.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + } + ], + "options": { + "__type": "ListViewSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "ListView", + "name": "ListView_5", + "ZOrder": 0, + "actiontag": 38723810, + "anchorPointX": 0, + "anchorPointY": 0, + "classType": "CocoStudio.EngineAdapterWrap.CSListView", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 200, + "ignoreSize": false, + "layoutParameter": null, + "opacity": 255, + "positionPercentX": 0.17916666, + "positionPercentY": 0.1390625, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.208333328, + "sizePercentY": 0.3125, + "sizeType": 0, + "tag": 8, + "touchAble": false, + "useMergedTexture": true, + "visible": true, + "width": 200, + "x": 172, + "y": 89, + "backGroundImage": null, + "backGroundImageData": null, + "backGroundScale9Enable": false, + "bgColorB": 255, + "bgColorG": 150, + "bgColorOpacity": 100, + "bgColorR": 150, + "bgEndColorB": 255, + "bgEndColorG": 150, + "bgEndColorR": 150, + "bgStartColorB": 255, + "bgStartColorG": 255, + "bgStartColorR": 255, + "bounceEnable": true, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "clipAble": true, + "colorType": 1, + "direction": 1, + "editorClipAble": true, + "gravity": 0, + "innerHeight": 0, + "innerWidth": 0, + "itemMargin": 10, + "vectorX": 0, + "vectorY": -0.5 + } + }, + { + "classname": "Panel", + "name": null, + "children": [ + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_18", + "ZOrder": 0, + "actiontag": 36753709, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 1, + "gravity": 4, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": -1, + "marginRight": 0, + "marginTop": 164, + "relativeName": "Button_18", + "relativeToName": "Panel_17", + "type": 2 + }, + "opacity": 255, + "positionPercentX": 0.154574126, + "positionPercentY": 0.105, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.324921131, + "sizePercentY": 0.2, + "sizeType": 0, + "tag": 23, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 49, + "y": 21, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotopnormal.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "Button", + "name": null, + "children": [], + "options": { + "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Button", + "name": "Button_18_0", + "ZOrder": 0, + "actiontag": 58260049, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSButton", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 30, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 1, + "gravity": 4, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": 105, + "marginRight": 0, + "marginTop": 164, + "relativeName": "Button_18_0", + "relativeToName": "Panel_17", + "type": 2 + }, + "opacity": 255, + "positionPercentX": 0.488958985, + "positionPercentY": 0.105, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.324921131, + "sizePercentY": 0.2, + "sizeType": 0, + "tag": 25, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 100, + "x": 155, + "y": 21, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "disabled": null, + "disabledData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "fontName": "微软雅黑", + "fontSize": 14, + "fontType": 0, + "normal": null, + "normalData": { + "path": "backtotopnormal.png", + "plistFile": "", + "resourceType": 1 + }, + "pressed": null, + "pressedData": { + "path": null, + "plistFile": null, + "resourceType": 0 + }, + "scale9Enable": false, + "scale9Height": 30, + "scale9Width": 100, + "text": "", + "textColorB": 255, + "textColorG": 255, + "textColorR": 255 + } + }, + { + "classname": "TextField", + "name": null, + "children": [], + "options": { + "__type": "TextFieldSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "TextField", + "name": "TextField_21", + "ZOrder": 0, + "actiontag": 18483046, + "anchorPointX": 0.5, + "anchorPointY": 0.5, + "classType": "CocoStudio.EngineAdapterWrap.CSTextField", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 27, + "ignoreSize": true, + "layoutParameter": { + "classname": null, + "name": null, + "align": 1, + "gravity": 0, + "layoutEageType": 0, + "layoutNormalHorizontal": 0, + "layoutNormalVertical": 0, + "layoutParentHorizontal": 0, + "layoutParentVertical": 0, + "marginDown": 0, + "marginLeft": 93, + "marginRight": 0, + "marginTop": 49, + "relativeName": "TextField_21", + "relativeToName": "Panel_17", + "type": 2 + }, + "opacity": 255, + "positionPercentX": 0.4873817, + "positionPercentY": 0.6875, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.283911675, + "sizePercentY": 0.135, + "sizeType": 0, + "tag": 26, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 123, + "x": 154, + "y": 137, + "areaHeight": 0, + "areaWidth": 0, + "fontFile": null, + "fontName": "微软雅黑", + "fontSize": 20, + "maxLength": 10, + "maxLengthEnable": false, + "passwordEnable": false, + "passwordStyleText": "*", + "placeHolder": "fdsafdsafdsa", + "text": "Text Fielddsa" + } + } + ], + "options": { + "__type": "PanelSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Panel", + "name": "Panel_17", + "ZOrder": 0, + "actiontag": 53887349, + "anchorPointX": 0, + "anchorPointY": 0, + "classType": "CocoStudio.EngineAdapterWrap.CSPanel", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 200, + "ignoreSize": false, + "layoutParameter": null, + "opacity": 255, + "positionPercentX": 0.180109158, + "positionPercentY": 0.4951139, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0.330208331, + "sizePercentY": 0.3125, + "sizeType": 0, + "tag": 22, + "touchAble": true, + "useMergedTexture": true, + "visible": true, + "width": 317, + "x": 172, + "y": 316, + "adaptScreen": false, + "backGroundImage": null, + "backGroundImageData": null, + "backGroundScale9Enable": false, + "bgColorB": 255, + "bgColorG": 200, + "bgColorOpacity": 100, + "bgColorR": 150, + "bgEndColorB": 255, + "bgEndColorG": 200, + "bgEndColorR": 150, + "bgStartColorB": 255, + "bgStartColorG": 255, + "bgStartColorR": 255, + "capInsetsHeight": 1, + "capInsetsWidth": 1, + "capInsetsX": 0, + "capInsetsY": 0, + "clipAble": false, + "colorType": 1, + "layoutType": 3, + "vectorX": 0, + "vectorY": -0.5 + } + } + ], + "options": { + "__type": "PanelSurrogate:#EditorCommon.JsonModel.Component.GUI", + "classname": "Panel", + "name": "Panel", + "ZOrder": 0, + "actiontag": -1, + "anchorPointX": 0, + "anchorPointY": 0, + "classType": "CocoStudio.EngineAdapterWrap.CSPanel", + "colorB": 255, + "colorG": 255, + "colorR": 255, + "customProperty": "", + "flipX": false, + "flipY": false, + "height": 640, + "ignoreSize": false, + "layoutParameter": null, + "opacity": 255, + "positionPercentX": 0, + "positionPercentY": 0, + "positionType": 0, + "rotation": 0, + "scaleX": 1, + "scaleY": 1, + "sizePercentX": 0, + "sizePercentY": 0, + "sizeType": 0, + "tag": 4, + "touchAble": false, + "useMergedTexture": true, + "visible": true, + "width": 960, + "x": 0, + "y": 0, + "adaptScreen": false, + "backGroundImage": null, + "backGroundImageData": null, + "backGroundScale9Enable": false, + "bgColorB": 255, + "bgColorG": 200, + "bgColorOpacity": 0, + "bgColorR": 150, + "bgEndColorB": 255, + "bgEndColorG": 0, + "bgEndColorR": 0, + "bgStartColorB": 255, + "bgStartColorG": 255, + "bgStartColorR": 255, + "capInsetsHeight": 0, + "capInsetsWidth": 0, + "capInsetsX": 0, + "capInsetsY": 0, + "clipAble": false, + "colorType": 1, + "layoutType": 0, + "vectorX": 0, + "vectorY": -0.5 + } + } +} \ No newline at end of file diff --git a/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.plist b/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.plist new file mode 100644 index 0000000000..1acdeec8fd --- /dev/null +++ b/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.plist @@ -0,0 +1,84 @@ + + + + + frames + + backtotopnormal.png + + width + 100 + height + 30 + originalWidth + 100 + originalHeight + 30 + x + 0 + y + 0 + offsetX + 0 + offsetY + 0 + + backtotoppressed.png + + width + 100 + height + 30 + originalWidth + 100 + originalHeight + 30 + x + 102 + y + 0 + offsetX + 0 + offsetY + 0 + + CocoStudio_UIEditor.png + + width + 76 + height + 84 + originalWidth + 76 + originalHeight + 84 + x + 204 + y + 0 + offsetX + 0 + offsetY + 0 + + + metadata + + format + 0 + textureFileName + SampleUIAnimation0.png + realTextureFileName + SampleUIAnimation0.png + size + {1024,1024} + + texture + + width + 1024 + height + 1024 + + + \ No newline at end of file diff --git a/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.png b/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.png new file mode 100644 index 0000000000000000000000000000000000000000..76d1d69e09d0060d8d7ba8450c51cd2b30b226bf GIT binary patch literal 28378 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 + + + + frames + + backtotopnormal.png + + width + 100 + height + 30 + originalWidth + 100 + originalHeight + 30 + x + 0 + y + 0 + offsetX + 0 + offsetY + 0 + + backtotoppressed.png + + width + 100 + height + 30 + originalWidth + 100 + originalHeight + 30 + x + 102 + y + 0 + offsetX + 0 + offsetY + 0 + + CocoStudio_UIEditor.png + + width + 76 + height + 84 + originalWidth + 76 + originalHeight + 84 + x + 204 + y + 0 + offsetX + 0 + offsetY + 0 + + + metadata + + format + 0 + textureFileName + SampleUIAnimation0.png + realTextureFileName + SampleUIAnimation0.png + size + {1024,1024} + + texture + + width + 1024 + height + 1024 + + + \ No newline at end of file diff --git a/tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation0.png b/tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation0.png new file mode 100644 index 0000000000000000000000000000000000000000..76d1d69e09d0060d8d7ba8450c51cd2b30b226bf GIT binary patch literal 28378 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 Date: Thu, 21 Aug 2014 02:23:25 +0800 Subject: [PATCH 05/41] remove resources for unused. --- .../SampleUIAnimation.ExportJson | 1682 ----------------- .../SampleUIAnimation0.plist | 84 - .../SampleUIAnimation/SampleUIAnimation0.png | Bin 28378 -> 0 bytes .../SampleUIAnimation.ExportJson | 1368 -------------- .../SampleUIAnimation0.plist | 84 - .../SampleUIAnimation/SampleUIAnimation0.png | Bin 28378 -> 0 bytes 6 files changed, 3218 deletions(-) delete mode 100644 tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson delete mode 100644 tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.plist delete mode 100644 tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.png delete mode 100644 tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson delete mode 100644 tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation0.plist delete mode 100644 tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation0.png diff --git a/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson b/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson deleted file mode 100644 index c38743cf4e..0000000000 --- a/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation.ExportJson +++ /dev/null @@ -1,1682 +0,0 @@ -{ - "classname": null, - "name": null, - "animation": { - "classname": null, - "name": "AnimationManager", - "actionlist": [ - { - "classname": null, - "name": "Animation1", - "actionnodelist": [ - { - "classname": null, - "name": "ImageView", - "ActionTag": 27, - "actionframelist": [ - { - "classname": null, - "name": null, - "colorb": 255, - "colorg": 255, - "colorr": 255, - "frameid": 0, - "opacity": 255, - "positionx": 39, - "positiony": 165.920044, - "rotation": 0, - "scalex": 1, - "scaley": 1, - "starttime": 1.77505913E+30, - "tweenParameter": [ - 0, - 0, - 1, - 1 - ], - "tweenType": 0, - "visible": false - }, - { - "classname": null, - "name": null, - "colorb": 255, - "colorg": 255, - "colorr": 255, - "frameid": 10, - "opacity": 255, - "positionx": 150, - "positiony": 42.9200439, - "rotation": 90, - "scalex": 1, - "scaley": 1, - "starttime": 1.401298E-42, - "tweenParameter": [ - 0, - 0, - 1, - 1 - ], - "tweenType": 0, - "visible": false - }, - { - "classname": null, - "name": null, - "colorb": 255, - "colorg": 255, - "colorr": 255, - "frameid": 15, - "opacity": 255, - "positionx": 190, - "positiony": 14.9200287, - "rotation": 90, - "scalex": 0.3, - "scaley": 1.6, - "starttime": 7.163279E-39, - "tweenParameter": [ - 0, - 0, - 1, - 1 - ], - "tweenType": 0, - "visible": false - }, - { - "classname": null, - "name": null, - "colorb": 52, - "colorg": 49, - "colorr": 196, - "frameid": 20, - "opacity": 255, - "positionx": 266, - "positiony": 91.92003, - "rotation": 272, - "scalex": 1, - "scaley": 1, - "starttime": 4.224576E-39, - "tweenParameter": [ - 0, - 0, - 1, - 1 - ], - "tweenType": 0, - "visible": false - }, - { - "classname": null, - "name": null, - "colorb": 255, - "colorg": 255, - "colorr": 255, - "frameid": 30, - "opacity": 0, - "positionx": 346.7685, - "positiony": 150.259537, - "rotation": -10.2989807, - "scalex": 1, - "scaley": 1, - "starttime": 7.163279E-39, - "tweenParameter": [ - 0, - 0, - 1, - 1 - ], - "tweenType": 0, - "visible": false - }, - { - "classname": null, - "name": null, - "colorb": 255, - "colorg": 255, - "colorr": 255, - "frameid": 40, - "opacity": 255, - "positionx": 235, - "positiony": 204.000015, - "rotation": 270, - "scalex": 1, - "scaley": 1, - "starttime": 1.401298E-45, - "tweenParameter": [ - 0, - 0, - 1, - 1 - ], - "tweenType": 0, - "visible": false - }, - { - "classname": null, - "name": null, - "colorb": 255, - "colorg": 255, - "colorr": 255, - "frameid": 50, - "opacity": 255, - "positionx": 312, - "positiony": 231.000015, - "rotation": 349.701019, - "scalex": -1, - "scaley": 0.9754356, - "starttime": 4.224576E-39, - "tweenParameter": [ - 0, - 0, - 1, - 1 - ], - "tweenType": 0, - "visible": false - }, - { - "classname": null, - "name": null, - "colorb": 255, - "colorg": 255, - "colorr": 255, - "frameid": 60, - "opacity": 255, - "positionx": 312, - "positiony": 231.000015, - "rotation": -10.2989807, - "scalex": 1, - "scaley": 0.9754356, - "starttime": 0, - "tweenParameter": [ - 0, - 0, - 1, - 1 - ], - "tweenType": 0, - "visible": false - }, - { - "classname": null, - "name": null, - "colorb": 255, - "colorg": 255, - "colorr": 255, - "frameid": 70, - "opacity": 255, - "positionx": 312, - "positiony": 231.000015, - "rotation": -10.2989807, - "scalex": -1, - "scaley": 0.9754356, - "starttime": 9.64289E-39, - "tweenParameter": [ - 0, - 0, - 1, - 1 - ], - "tweenType": 0, - "visible": false - } - ] - } - ], - "loop": false, - "unittime": 0.1 - } - ] - }, - "dataScale": 1, - "designHeight": 320, - "designWidth": 480, - "textures": [ - "SampleUIAnimation0.plist" - ], - "texturesPng": [ - "SampleUIAnimation0.png" - ], - "version": "1.5.0.0", - "widgetTree": { - "classname": "Panel", - "name": null, - "children": [ - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "TextButton", - "ZOrder": 2, - "actiontag": 24, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": null, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.0609375, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.104166664, - "sizePercentY": 0.046875, - "sizeType": 0, - "tag": 4, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 240, - "y": 39, - "capInsetsHeight": 0, - "capInsetsWidth": 0, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": "backtotopnormal.png", - "plistFile": "", - "resourceType": 1 - }, - "fontName": "宋体", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotopnormal.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "start anim", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "ImageView", - "name": null, - "children": [], - "options": { - "__type": "ImageViewSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "ImageView", - "name": "ImageView", - "ZOrder": 1, - "actiontag": 27, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSImageView", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 84, - "ignoreSize": true, - "layoutParameter": null, - "opacity": 255, - "positionPercentX": 0.040625, - "positionPercentY": 0.2578125, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.0791666657, - "sizePercentY": 0.13125, - "sizeType": 0, - "tag": 5, - "touchAble": false, - "useMergedTexture": true, - "visible": true, - "width": 76, - "x": 39, - "y": 165, - "capInsetsHeight": 0, - "capInsetsWidth": 0, - "capInsetsX": 0, - "capInsetsY": 0, - "fileName": null, - "fileNameData": { - "path": "CocoStudio_UIEditor.png", - "plistFile": "", - "resourceType": 1 - }, - "scale9Enable": false, - "scale9Height": 84, - "scale9Width": 76 - } - }, - { - "classname": "LoadingBar", - "name": null, - "children": [], - "options": { - "__type": "LoadingBarSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "LoadingBar", - "name": "ProgressBar_4", - "ZOrder": 0, - "actiontag": 36022812, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSLoadingBar", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": null, - "opacity": 255, - "positionPercentX": 0.0791666657, - "positionPercentY": 0.4453125, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.104166664, - "sizePercentY": 0.046875, - "sizeType": 0, - "tag": 7, - "touchAble": false, - "useMergedTexture": false, - "visible": true, - "width": 100, - "x": 76, - "y": 285, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "direction": 0, - "percent": 71, - "scale9Enable": false, - "texture": null, - "textureData": { - "path": "backtotopnormal.png", - "plistFile": "", - "resourceType": 1 - } - } - }, - { - "classname": "ListView", - "name": null, - "children": [ - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_6", - "ZOrder": 0, - "actiontag": 35532643, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 0, - "gravity": 2, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": 0, - "marginRight": 0, - "marginTop": 0, - "relativeName": "Button_6", - "relativeToName": "ListView_5", - "type": 1 - }, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.95714283, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.5, - "sizePercentY": 0.15, - "sizeType": 0, - "tag": 9, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 50, - "y": 335, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_6_0", - "ZOrder": 1, - "actiontag": 56999240, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 0, - "gravity": 2, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": -100, - "marginRight": 0, - "marginTop": -200, - "relativeName": "Button_6_0", - "relativeToName": "ListView_5", - "type": 1 - }, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.8428571, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.5, - "sizePercentY": 0.15, - "sizeType": 0, - "tag": 11, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 50, - "y": 295, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_6_0_1", - "ZOrder": 2, - "actiontag": 66472916, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 0, - "gravity": 2, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": -100, - "marginRight": 0, - "marginTop": -160, - "relativeName": "Button_6_0_1", - "relativeToName": "ListView_5", - "type": 1 - }, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.7285714, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.5, - "sizePercentY": 0.15, - "sizeType": 0, - "tag": 13, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 50, - "y": 255, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_6_0_2", - "ZOrder": 3, - "actiontag": 29143545, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 0, - "gravity": 2, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": -100, - "marginRight": 0, - "marginTop": -160, - "relativeName": "Button_6_0_2", - "relativeToName": "ListView_5", - "type": 1 - }, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.6142857, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.5, - "sizePercentY": 0.15, - "sizeType": 0, - "tag": 14, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 50, - "y": 215, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_6_0_3", - "ZOrder": 4, - "actiontag": 1842679, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 0, - "gravity": 2, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": -100, - "marginRight": 0, - "marginTop": -160, - "relativeName": "Button_6_0_3", - "relativeToName": "ListView_5", - "type": 1 - }, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.5, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.5, - "sizePercentY": 0.15, - "sizeType": 0, - "tag": 15, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 50, - "y": 175, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_6_0_4", - "ZOrder": 5, - "actiontag": 37105032, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 0, - "gravity": 2, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": -100, - "marginRight": 0, - "marginTop": -160, - "relativeName": "Button_6_0_4", - "relativeToName": "ListView_5", - "type": 1 - }, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.3857143, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.5, - "sizePercentY": 0.15, - "sizeType": 0, - "tag": 16, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 50, - "y": 135, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_6_0_5", - "ZOrder": 6, - "actiontag": 36874222, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 0, - "gravity": 2, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": -100, - "marginRight": 0, - "marginTop": -160, - "relativeName": "Button_6_0_5", - "relativeToName": "ListView_5", - "type": 1 - }, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.271428585, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.5, - "sizePercentY": 0.15, - "sizeType": 0, - "tag": 17, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 50, - "y": 95, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_6_0_6", - "ZOrder": 7, - "actiontag": 11303491, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 0, - "gravity": 2, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": -100, - "marginRight": 0, - "marginTop": -160, - "relativeName": "Button_6_0_6", - "relativeToName": "ListView_5", - "type": 1 - }, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.157142863, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.5, - "sizePercentY": 0.15, - "sizeType": 0, - "tag": 18, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 50, - "y": 55, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_6_0_7", - "ZOrder": 8, - "actiontag": 21667656, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 0, - "gravity": 2, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": -100, - "marginRight": 0, - "marginTop": -160, - "relativeName": "Button_6_0_7", - "relativeToName": "ListView_5", - "type": 1 - }, - "opacity": 255, - "positionPercentX": 0.25, - "positionPercentY": 0.042857144, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.5, - "sizePercentY": 0.15, - "sizeType": 0, - "tag": 19, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 50, - "y": 15, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotoppressed.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - } - ], - "options": { - "__type": "ListViewSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "ListView", - "name": "ListView_5", - "ZOrder": 0, - "actiontag": 38723810, - "anchorPointX": 0, - "anchorPointY": 0, - "classType": "CocoStudio.EngineAdapterWrap.CSListView", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 200, - "ignoreSize": false, - "layoutParameter": null, - "opacity": 255, - "positionPercentX": 0.17916666, - "positionPercentY": 0.1390625, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.208333328, - "sizePercentY": 0.3125, - "sizeType": 0, - "tag": 8, - "touchAble": false, - "useMergedTexture": true, - "visible": true, - "width": 200, - "x": 172, - "y": 89, - "backGroundImage": null, - "backGroundImageData": null, - "backGroundScale9Enable": false, - "bgColorB": 255, - "bgColorG": 150, - "bgColorOpacity": 100, - "bgColorR": 150, - "bgEndColorB": 255, - "bgEndColorG": 150, - "bgEndColorR": 150, - "bgStartColorB": 255, - "bgStartColorG": 255, - "bgStartColorR": 255, - "bounceEnable": true, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "clipAble": true, - "colorType": 1, - "direction": 1, - "editorClipAble": true, - "gravity": 0, - "innerHeight": 0, - "innerWidth": 0, - "itemMargin": 10, - "vectorX": 0, - "vectorY": -0.5 - } - }, - { - "classname": "Panel", - "name": null, - "children": [ - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_18", - "ZOrder": 0, - "actiontag": 36753709, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 1, - "gravity": 4, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": -1, - "marginRight": 0, - "marginTop": 164, - "relativeName": "Button_18", - "relativeToName": "Panel_17", - "type": 2 - }, - "opacity": 255, - "positionPercentX": 0.154574126, - "positionPercentY": 0.105, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.324921131, - "sizePercentY": 0.2, - "sizeType": 0, - "tag": 23, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 49, - "y": 21, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotopnormal.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "Button", - "name": null, - "children": [], - "options": { - "__type": "ButtonSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Button", - "name": "Button_18_0", - "ZOrder": 0, - "actiontag": 58260049, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSButton", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 30, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 1, - "gravity": 4, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": 105, - "marginRight": 0, - "marginTop": 164, - "relativeName": "Button_18_0", - "relativeToName": "Panel_17", - "type": 2 - }, - "opacity": 255, - "positionPercentX": 0.488958985, - "positionPercentY": 0.105, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.324921131, - "sizePercentY": 0.2, - "sizeType": 0, - "tag": 25, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 100, - "x": 155, - "y": 21, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "disabled": null, - "disabledData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "fontName": "微软雅黑", - "fontSize": 14, - "fontType": 0, - "normal": null, - "normalData": { - "path": "backtotopnormal.png", - "plistFile": "", - "resourceType": 1 - }, - "pressed": null, - "pressedData": { - "path": null, - "plistFile": null, - "resourceType": 0 - }, - "scale9Enable": false, - "scale9Height": 30, - "scale9Width": 100, - "text": "", - "textColorB": 255, - "textColorG": 255, - "textColorR": 255 - } - }, - { - "classname": "TextField", - "name": null, - "children": [], - "options": { - "__type": "TextFieldSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "TextField", - "name": "TextField_21", - "ZOrder": 0, - "actiontag": 18483046, - "anchorPointX": 0.5, - "anchorPointY": 0.5, - "classType": "CocoStudio.EngineAdapterWrap.CSTextField", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 27, - "ignoreSize": true, - "layoutParameter": { - "classname": null, - "name": null, - "align": 1, - "gravity": 0, - "layoutEageType": 0, - "layoutNormalHorizontal": 0, - "layoutNormalVertical": 0, - "layoutParentHorizontal": 0, - "layoutParentVertical": 0, - "marginDown": 0, - "marginLeft": 93, - "marginRight": 0, - "marginTop": 49, - "relativeName": "TextField_21", - "relativeToName": "Panel_17", - "type": 2 - }, - "opacity": 255, - "positionPercentX": 0.4873817, - "positionPercentY": 0.6875, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.283911675, - "sizePercentY": 0.135, - "sizeType": 0, - "tag": 26, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 123, - "x": 154, - "y": 137, - "areaHeight": 0, - "areaWidth": 0, - "fontFile": null, - "fontName": "微软雅黑", - "fontSize": 20, - "maxLength": 10, - "maxLengthEnable": false, - "passwordEnable": false, - "passwordStyleText": "*", - "placeHolder": "fdsafdsafdsa", - "text": "Text Fielddsa" - } - } - ], - "options": { - "__type": "PanelSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Panel", - "name": "Panel_17", - "ZOrder": 0, - "actiontag": 53887349, - "anchorPointX": 0, - "anchorPointY": 0, - "classType": "CocoStudio.EngineAdapterWrap.CSPanel", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 200, - "ignoreSize": false, - "layoutParameter": null, - "opacity": 255, - "positionPercentX": 0.180109158, - "positionPercentY": 0.4951139, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0.330208331, - "sizePercentY": 0.3125, - "sizeType": 0, - "tag": 22, - "touchAble": true, - "useMergedTexture": true, - "visible": true, - "width": 317, - "x": 172, - "y": 316, - "adaptScreen": false, - "backGroundImage": null, - "backGroundImageData": null, - "backGroundScale9Enable": false, - "bgColorB": 255, - "bgColorG": 200, - "bgColorOpacity": 100, - "bgColorR": 150, - "bgEndColorB": 255, - "bgEndColorG": 200, - "bgEndColorR": 150, - "bgStartColorB": 255, - "bgStartColorG": 255, - "bgStartColorR": 255, - "capInsetsHeight": 1, - "capInsetsWidth": 1, - "capInsetsX": 0, - "capInsetsY": 0, - "clipAble": false, - "colorType": 1, - "layoutType": 3, - "vectorX": 0, - "vectorY": -0.5 - } - } - ], - "options": { - "__type": "PanelSurrogate:#EditorCommon.JsonModel.Component.GUI", - "classname": "Panel", - "name": "Panel", - "ZOrder": 0, - "actiontag": -1, - "anchorPointX": 0, - "anchorPointY": 0, - "classType": "CocoStudio.EngineAdapterWrap.CSPanel", - "colorB": 255, - "colorG": 255, - "colorR": 255, - "customProperty": "", - "flipX": false, - "flipY": false, - "height": 640, - "ignoreSize": false, - "layoutParameter": null, - "opacity": 255, - "positionPercentX": 0, - "positionPercentY": 0, - "positionType": 0, - "rotation": 0, - "scaleX": 1, - "scaleY": 1, - "sizePercentX": 0, - "sizePercentY": 0, - "sizeType": 0, - "tag": 4, - "touchAble": false, - "useMergedTexture": true, - "visible": true, - "width": 960, - "x": 0, - "y": 0, - "adaptScreen": false, - "backGroundImage": null, - "backGroundImageData": null, - "backGroundScale9Enable": false, - "bgColorB": 255, - "bgColorG": 200, - "bgColorOpacity": 0, - "bgColorR": 150, - "bgEndColorB": 255, - "bgEndColorG": 0, - "bgEndColorR": 0, - "bgStartColorB": 255, - "bgStartColorG": 255, - "bgStartColorR": 255, - "capInsetsHeight": 0, - "capInsetsWidth": 0, - "capInsetsX": 0, - "capInsetsY": 0, - "clipAble": false, - "colorType": 1, - "layoutType": 0, - "vectorX": 0, - "vectorY": -0.5 - } - } -} \ No newline at end of file diff --git a/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.plist b/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.plist deleted file mode 100644 index 1acdeec8fd..0000000000 --- a/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.plist +++ /dev/null @@ -1,84 +0,0 @@ - - - - - frames - - backtotopnormal.png - - width - 100 - height - 30 - originalWidth - 100 - originalHeight - 30 - x - 0 - y - 0 - offsetX - 0 - offsetY - 0 - - backtotoppressed.png - - width - 100 - height - 30 - originalWidth - 100 - originalHeight - 30 - x - 102 - y - 0 - offsetX - 0 - offsetY - 0 - - CocoStudio_UIEditor.png - - width - 76 - height - 84 - originalWidth - 76 - originalHeight - 84 - x - 204 - y - 0 - offsetX - 0 - offsetY - 0 - - - metadata - - format - 0 - textureFileName - SampleUIAnimation0.png - realTextureFileName - SampleUIAnimation0.png - size - {1024,1024} - - texture - - width - 1024 - height - 1024 - - - \ No newline at end of file diff --git a/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.png b/tests/cpp-empty-test/Resources/SampleUIAnimation/SampleUIAnimation0.png deleted file mode 100644 index 76d1d69e09d0060d8d7ba8450c51cd2b30b226bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28378 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 - - - - frames - - backtotopnormal.png - - width - 100 - height - 30 - originalWidth - 100 - originalHeight - 30 - x - 0 - y - 0 - offsetX - 0 - offsetY - 0 - - backtotoppressed.png - - width - 100 - height - 30 - originalWidth - 100 - originalHeight - 30 - x - 102 - y - 0 - offsetX - 0 - offsetY - 0 - - CocoStudio_UIEditor.png - - width - 76 - height - 84 - originalWidth - 76 - originalHeight - 84 - x - 204 - y - 0 - offsetX - 0 - offsetY - 0 - - - metadata - - format - 0 - textureFileName - SampleUIAnimation0.png - realTextureFileName - SampleUIAnimation0.png - size - {1024,1024} - - texture - - width - 1024 - height - 1024 - - - \ No newline at end of file diff --git a/tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation0.png b/tests/cpp-tests/Resources/SampleUIAnimation/SampleUIAnimation0.png deleted file mode 100644 index 76d1d69e09d0060d8d7ba8450c51cd2b30b226bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28378 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 Date: Wed, 27 Aug 2014 14:54:35 +0800 Subject: [PATCH 06/41] temp backup --- cocos/renderer/CCRenderer.cpp | 63 +++++++++++++++++------------------ cocos/renderer/CCRenderer.h | 13 +++++--- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/cocos/renderer/CCRenderer.cpp b/cocos/renderer/CCRenderer.cpp index 2eca2d9ead..cbf09e6ca4 100644 --- a/cocos/renderer/CCRenderer.cpp +++ b/cocos/renderer/CCRenderer.cpp @@ -110,7 +110,8 @@ static const int DEFAULT_RENDER_QUEUE = 0; Renderer::Renderer() :_lastMaterialID(0) ,_lastBatchedMeshCommand(nullptr) -,_numQuads(0) +,_filledVertex(0) +,_filledIndex(0) ,_glViewAssigned(false) ,_isRendering(false) #if CC_ENABLE_CACHE_TEXTURE_DATA @@ -163,7 +164,7 @@ void Renderer::initGLView() void Renderer::setupIndices() { - for( int i=0; i < VBO_SIZE; i++) + for( int i=0; i < INDEX_VBO_SIZE / 6; i++) { _indices[i*6+0] = (GLushort) (i*4+0); _indices[i*6+1] = (GLushort) (i*4+1); @@ -194,7 +195,7 @@ void Renderer::setupVBOAndVAO() glGenBuffers(2, &_buffersVBO[0]); glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]); - glBufferData(GL_ARRAY_BUFFER, sizeof(_quads[0]) * VBO_SIZE, _quads, GL_DYNAMIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(_verts[0]) * VBO_SIZE, _verts, GL_DYNAMIC_DRAW); // vertices glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION); @@ -209,7 +210,7 @@ void Renderer::setupVBOAndVAO() glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, texCoords)); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * VBO_SIZE * 6, _indices, GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * INDEX_VBO_SIZE, _indices, GL_STATIC_DRAW); // Must unbind the VAO before changing the element buffer. GL::bindVAO(0); @@ -232,11 +233,11 @@ void Renderer::mapBuffers() GL::bindVAO(0); glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]); - glBufferData(GL_ARRAY_BUFFER, sizeof(_quads[0]) * VBO_SIZE, _quads, GL_DYNAMIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(_verts[0]) * VBO_SIZE, _verts, GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * VBO_SIZE * 6, _indices, GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * INDEX_VBO_SIZE, _indices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); CHECK_GL_ERROR_DEBUG(); @@ -288,7 +289,7 @@ void Renderer::visitRenderQueue(const RenderQueue& queue) flush3D(); auto cmd = static_cast(command); //Batch quads - if(_numQuads + cmd->getQuadCount() > VBO_SIZE) + if( _filledVertex + cmd->getQuadCount() * 4 > VBO_SIZE || _filledIndex + cmd->getQuadCount() * 6 > INDEX_VBO_SIZE) { CCASSERT(cmd->getQuadCount()>= 0 && cmd->getQuadCount() < VBO_SIZE, "VBO is not big enough for quad data, please break the quad data down or use customized render command"); @@ -298,10 +299,11 @@ void Renderer::visitRenderQueue(const RenderQueue& queue) _batchedQuadCommands.push_back(cmd); - memcpy(_quads + _numQuads, cmd->getQuads(), sizeof(V3F_C4B_T2F_Quad) * cmd->getQuadCount()); - convertToWorldCoordinates(_quads + _numQuads, cmd->getQuadCount(), cmd->getModelView()); + memcpy(_verts + _filledVertex, cmd->getQuads(), sizeof(V3F_C4B_T2F) * cmd->getQuadCount() * 4); + fillQuadVertices(_verts + _filledVertex, cmd->getQuadCount() * 4, cmd->getModelView()); - _numQuads += cmd->getQuadCount(); + _filledVertex += cmd->getQuadCount() * 4; + _filledIndex += cmd->getQuadCount() * 6; } else if(RenderCommand::Type::GROUP_COMMAND == commandType) @@ -392,31 +394,22 @@ void Renderer::clean() // Clear batch quad commands _batchedQuadCommands.clear(); - _numQuads = 0; - + _filledVertex = 0; + _filledIndex = 0; _lastMaterialID = 0; _lastBatchedMeshCommand = nullptr; } -void Renderer::convertToWorldCoordinates(V3F_C4B_T2F_Quad* quads, ssize_t quantity, const Mat4& modelView) +void Renderer::fillQuadVertices(V3F_C4B_T2F* verts, ssize_t quantity, const Mat4& modelView) { // kmMat4 matrixP, mvp; // kmGLGetMatrix(KM_GL_PROJECTION, &matrixP); // kmMat4Multiply(&mvp, &matrixP, &modelView); for(ssize_t i=0; ibl.vertices; + V3F_C4B_T2F *q = &verts[i]; + Vec3 *vec1 = (Vec3*)&q->vertices; modelView.transformPoint(vec1); - - Vec3 *vec2 = (Vec3*)&q->br.vertices; - modelView.transformPoint(vec2); - - Vec3 *vec3 = (Vec3*)&q->tr.vertices; - modelView.transformPoint(vec3); - - Vec3 *vec4 = (Vec3*)&q->tl.vertices; - modelView.transformPoint(vec4); } } @@ -428,13 +421,15 @@ void Renderer::drawBatchedQuads() int startQuad = 0; //Upload buffer to VBO - if(_numQuads <= 0 || _batchedQuadCommands.empty()) + if(_filledVertex <= 0 || _filledIndex <= 0 || _batchedQuadCommands.empty()) { return; } if (Configuration::getInstance()->supportsShareableVAO()) { + //Bind VAO + GL::bindVAO(_quadVAO); //Set VBO data glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]); @@ -445,22 +440,22 @@ void Renderer::drawBatchedQuads() // glBufferData(GL_ARRAY_BUFFER, sizeof(quads_[0]) * (n-start), &quads_[start], GL_DYNAMIC_DRAW); // option 3: orphaning + glMapBuffer - glBufferData(GL_ARRAY_BUFFER, sizeof(_quads[0]) * (_numQuads), nullptr, GL_DYNAMIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(_verts[0]) * _filledVertex, nullptr, GL_DYNAMIC_DRAW); void *buf = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - memcpy(buf, _quads, sizeof(_quads[0])* (_numQuads)); + memcpy(buf, _verts, sizeof(_verts[0])* _filledVertex); glUnmapBuffer(GL_ARRAY_BUFFER); glBindBuffer(GL_ARRAY_BUFFER, 0); - - //Bind VAO - GL::bindVAO(_quadVAO); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * _filledIndex, _indices, GL_STATIC_DRAW); } else { -#define kQuadSize sizeof(_quads[0].bl) +#define kQuadSize sizeof(_verts[0]) glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]); - glBufferData(GL_ARRAY_BUFFER, sizeof(_quads[0]) * _numQuads , _quads, GL_DYNAMIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(_verts[0]) * _filledVertex , _verts, GL_DYNAMIC_DRAW); GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX); @@ -474,6 +469,7 @@ void Renderer::drawBatchedQuads() glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof(V3F_C4B_T2F, texCoords)); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * _filledIndex, _indices, GL_STATIC_DRAW); } //Start drawing verties in batch @@ -521,7 +517,8 @@ void Renderer::drawBatchedQuads() } _batchedQuadCommands.clear(); - _numQuads = 0; + _filledVertex = 0; + _filledIndex = 0; } void Renderer::flush() diff --git a/cocos/renderer/CCRenderer.h b/cocos/renderer/CCRenderer.h index 0c56b989e0..00fc2cec8c 100644 --- a/cocos/renderer/CCRenderer.h +++ b/cocos/renderer/CCRenderer.h @@ -75,7 +75,9 @@ Whenever possible prefer to use `QuadCommand` objects since the renderer will au class CC_DLL Renderer { public: - static const int VBO_SIZE = 65536 / 6; + static const int VBO_SIZE = 65536; + static const int INDEX_VBO_SIZE = 65536 * 6 / 4; + static const int BATCH_QUADCOMMAND_RESEVER_SIZE = 64; Renderer(); @@ -139,7 +141,7 @@ protected: void visitRenderQueue(const RenderQueue& queue); - void convertToWorldCoordinates(V3F_C4B_T2F_Quad* quads, ssize_t quantity, const Mat4& modelView); + void fillQuadVertices(V3F_C4B_T2F* verts, ssize_t quantity, const Mat4& modelView); std::stack _commandGroupStack; @@ -150,12 +152,13 @@ protected: MeshCommand* _lastBatchedMeshCommand; std::vector _batchedQuadCommands; - V3F_C4B_T2F_Quad _quads[VBO_SIZE]; - GLushort _indices[6 * VBO_SIZE]; + V3F_C4B_T2F _verts[VBO_SIZE]; + GLushort _indices[INDEX_VBO_SIZE]; GLuint _quadVAO; GLuint _buffersVBO[2]; //0: vertex 1: indices - int _numQuads; + int _filledVertex; + int _filledIndex; bool _glViewAssigned; From 91e332c253f1e164b800e27419bc103f926d4ebf Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Wed, 27 Aug 2014 16:43:14 +0800 Subject: [PATCH 07/41] dynamic update index for quad command --- cocos/renderer/CCRenderer.cpp | 71 +++++++++++++++++------------------ cocos/renderer/CCRenderer.h | 3 +- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/cocos/renderer/CCRenderer.cpp b/cocos/renderer/CCRenderer.cpp index cbf09e6ca4..a7509a1c1f 100644 --- a/cocos/renderer/CCRenderer.cpp +++ b/cocos/renderer/CCRenderer.cpp @@ -154,27 +154,12 @@ void Renderer::initGLView() Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_cacheTextureListener, -1); #endif - - setupIndices(); setupBuffer(); _glViewAssigned = true; } -void Renderer::setupIndices() -{ - for( int i=0; i < INDEX_VBO_SIZE / 6; i++) - { - _indices[i*6+0] = (GLushort) (i*4+0); - _indices[i*6+1] = (GLushort) (i*4+1); - _indices[i*6+2] = (GLushort) (i*4+2); - _indices[i*6+3] = (GLushort) (i*4+3); - _indices[i*6+4] = (GLushort) (i*4+2); - _indices[i*6+5] = (GLushort) (i*4+1); - } -} - void Renderer::setupBuffer() { if(Configuration::getInstance()->supportsShareableVAO()) @@ -299,11 +284,7 @@ void Renderer::visitRenderQueue(const RenderQueue& queue) _batchedQuadCommands.push_back(cmd); - memcpy(_verts + _filledVertex, cmd->getQuads(), sizeof(V3F_C4B_T2F) * cmd->getQuadCount() * 4); - fillQuadVertices(_verts + _filledVertex, cmd->getQuadCount() * 4, cmd->getModelView()); - - _filledVertex += cmd->getQuadCount() * 4; - _filledIndex += cmd->getQuadCount() * 6; + fillQuadVertices(cmd); } else if(RenderCommand::Type::GROUP_COMMAND == commandType) @@ -400,25 +381,41 @@ void Renderer::clean() _lastBatchedMeshCommand = nullptr; } -void Renderer::fillQuadVertices(V3F_C4B_T2F* verts, ssize_t quantity, const Mat4& modelView) +void Renderer::fillQuadVertices(const QuadCommand* cmd) { -// kmMat4 matrixP, mvp; -// kmGLGetMatrix(KM_GL_PROJECTION, &matrixP); -// kmMat4Multiply(&mvp, &matrixP, &modelView); - for(ssize_t i=0; igetQuads(), sizeof(V3F_C4B_T2F) * cmd->getQuadCount() * 4); + const Mat4& modelView = cmd->getModelView(); + + for(ssize_t i=0; i< cmd->getQuadCount() * 4; ++i) { - V3F_C4B_T2F *q = &verts[i]; + V3F_C4B_T2F *q = &_verts[i + _filledVertex]; Vec3 *vec1 = (Vec3*)&q->vertices; modelView.transformPoint(vec1); } + + //fill index + for(ssize_t i=0; i< cmd->getQuadCount(); ++i) + { + _indices[_filledIndex + i * 6 + 0] = _filledVertex + i * 4 + 0; + _indices[_filledIndex + i * 6 + 1] = _filledVertex + i * 4 + 1; + _indices[_filledIndex + i * 6 + 2] = _filledVertex + i * 4 + 2; + _indices[_filledIndex + i * 6 + 3] = _filledVertex + i * 4 + 3; + _indices[_filledIndex + i * 6 + 4] = _filledVertex + i * 4 + 2; + _indices[_filledIndex + i * 6 + 5] = _filledVertex + i * 4 + 1; + } + + _filledVertex += cmd->getQuadCount() * 4; + _filledIndex += cmd->getQuadCount() * 6; } void Renderer::drawBatchedQuads() { //TODO we can improve the draw performance by insert material switching command before hand. - int quadsToDraw = 0; - int startQuad = 0; +// int quadsToDraw = 0; +// int startQuad = 0; + int indexToDraw = 0; + int startIndex = 0; //Upload buffer to VBO if(_filledVertex <= 0 || _filledIndex <= 0 || _batchedQuadCommands.empty()) @@ -479,14 +476,14 @@ void Renderer::drawBatchedQuads() if(_lastMaterialID != newMaterialID || newMaterialID == QuadCommand::MATERIAL_ID_DO_NOT_BATCH) { //Draw quads - if(quadsToDraw > 0) + if(indexToDraw > 0) { - glDrawElements(GL_TRIANGLES, (GLsizei) quadsToDraw*6, GL_UNSIGNED_SHORT, (GLvoid*) (startQuad*6*sizeof(_indices[0])) ); + glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[0])) ); _drawnBatches++; - _drawnVertices += quadsToDraw*6; + _drawnVertices += indexToDraw; - startQuad += quadsToDraw; - quadsToDraw = 0; + startIndex += indexToDraw; + indexToDraw = 0; } //Use new material @@ -494,15 +491,15 @@ void Renderer::drawBatchedQuads() _lastMaterialID = newMaterialID; } - quadsToDraw += cmd->getQuadCount(); + indexToDraw += cmd->getQuadCount() * 6; } //Draw any remaining quad - if(quadsToDraw > 0) + if(indexToDraw > 0) { - glDrawElements(GL_TRIANGLES, (GLsizei) quadsToDraw*6, GL_UNSIGNED_SHORT, (GLvoid*) (startQuad*6*sizeof(_indices[0])) ); + glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[0])) ); _drawnBatches++; - _drawnVertices += quadsToDraw*6; + _drawnVertices += indexToDraw; } if (Configuration::getInstance()->supportsShareableVAO()) diff --git a/cocos/renderer/CCRenderer.h b/cocos/renderer/CCRenderer.h index 00fc2cec8c..85db7cc108 100644 --- a/cocos/renderer/CCRenderer.h +++ b/cocos/renderer/CCRenderer.h @@ -123,7 +123,6 @@ public: protected: - void setupIndices(); //Setup VBO or VAO based on OpenGL extensions void setupBuffer(); void setupVBOAndVAO(); @@ -141,7 +140,7 @@ protected: void visitRenderQueue(const RenderQueue& queue); - void fillQuadVertices(V3F_C4B_T2F* verts, ssize_t quantity, const Mat4& modelView); + void fillQuadVertices(const QuadCommand* cmd); std::stack _commandGroupStack; From c627affa5ea02a56b0b843dcb1924c868091baee Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Wed, 27 Aug 2014 18:39:49 +0800 Subject: [PATCH 08/41] add triangles command, make quad command inherit from triangles command --- cocos/renderer/CCQuadCommand.cpp | 117 +++++++++++++++++++++++-------- cocos/renderer/CCQuadCommand.h | 65 ++++++++++++----- cocos/renderer/CCRenderCommand.h | 1 + cocos/renderer/CCRenderer.cpp | 26 +++---- 4 files changed, 147 insertions(+), 62 deletions(-) diff --git a/cocos/renderer/CCQuadCommand.cpp b/cocos/renderer/CCQuadCommand.cpp index d5cff627f6..1b12e06f0b 100644 --- a/cocos/renderer/CCQuadCommand.cpp +++ b/cocos/renderer/CCQuadCommand.cpp @@ -29,15 +29,78 @@ #include "renderer/CCGLProgram.h" #include "renderer/CCGLProgramState.h" #include "xxhash.h" +#include "renderer/CCRenderer.h" NS_CC_BEGIN - -QuadCommand::QuadCommand() +TrianglesCommand::TrianglesCommand() :_materialID(0) ,_textureID(0) ,_glProgramState(nullptr) ,_blendType(BlendFunc::DISABLE) +{ + _type = RenderCommand::Type::TRIANGLES_COMMAND; +} + +void TrianglesCommand::init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, BlendFunc blendType, const Triangles& triangles,const Mat4& mv) +{ + CCASSERT(glProgramState, "Invalid GLProgramState"); + CCASSERT(glProgramState->getVertexAttribsFlags() == 0, "No custom attributes are supported in QuadCommand"); + + _globalOrder = globalOrder; + + _triangles = triangles; + if(_triangles.indexCount % 3 != 0) + { + ssize_t count = _triangles.indexCount; + _triangles.indexCount = count / 3 * 3; + CCLOGERROR("Resize indexCount from %zd to %zd, size must be multiple times of 3", count, _triangles.indexCount); + } + _mv = mv; + + if( _textureID != textureID || _blendType.src != blendType.src || _blendType.dst != blendType.dst || _glProgramState != glProgramState) { + + _textureID = textureID; + _blendType = blendType; + _glProgramState = glProgramState; + + generateMaterialID(); + } +} + +TrianglesCommand::~TrianglesCommand() +{ +} + +void TrianglesCommand::generateMaterialID() +{ + + if(_glProgramState->getUniformCount() > 0) + { + _materialID = TrianglesCommand::MATERIAL_ID_DO_NOT_BATCH; + } + else + { + int glProgram = (int)_glProgramState->getGLProgram()->getProgram(); + int intArray[4] = { glProgram, (int)_textureID, (int)_blendType.src, (int)_blendType.dst}; + + _materialID = XXH32((const void*)intArray, sizeof(intArray), 0); + } +} + +void TrianglesCommand::useMaterial() const +{ + //Set texture + GL::bindTexture2D(_textureID); + + //set blend mode + GL::blendFunc(_blendType.src, _blendType.dst); + + _glProgramState->apply(_mv); +} + +QuadCommand::QuadCommand() +:TrianglesCommand() ,_quads(nullptr) ,_quadsCount(0) { @@ -53,6 +116,29 @@ void QuadCommand::init(float globalOrder, GLuint textureID, GLProgramState* glPr _quadsCount = quadCount; _quads = quad; + + //generate triangles + { + static std::vector QUADINDICESMAX; + if(QUADINDICESMAX.size() == 0) + { + QUADINDICESMAX.resize(Renderer::INDEX_VBO_SIZE); + for(ssize_t i = 0; i < Renderer::INDEX_VBO_SIZE / 6; ++i) + { + QUADINDICESMAX[ 6 * i + 0] = 4 * i + 0; + QUADINDICESMAX[ 6 * i + 1] = 4 * i + 1; + QUADINDICESMAX[ 6 * i + 2] = 4 * i + 2; + QUADINDICESMAX[ 6 * i + 3] = 4 * i + 3; + QUADINDICESMAX[ 6 * i + 4] = 4 * i + 2; + QUADINDICESMAX[ 6 * i + 5] = 4 * i + 1; + } + } + + _triangles.vertCount = quadCount * 4; + _triangles.indexCount = quadCount * 6; + _triangles.indices = &QUADINDICESMAX[0]; + _triangles.verts = &quad->tl; + } _mv = mv; @@ -70,31 +156,4 @@ QuadCommand::~QuadCommand() { } -void QuadCommand::generateMaterialID() -{ - - if(_glProgramState->getUniformCount() > 0) - { - _materialID = QuadCommand::MATERIAL_ID_DO_NOT_BATCH; - } - else - { - int glProgram = (int)_glProgramState->getGLProgram()->getProgram(); - int intArray[4] = { glProgram, (int)_textureID, (int)_blendType.src, (int)_blendType.dst}; - - _materialID = XXH32((const void*)intArray, sizeof(intArray), 0); - } -} - -void QuadCommand::useMaterial() const -{ - //Set texture - GL::bindTexture2D(_textureID); - - //set blend mode - GL::blendFunc(_blendType.src, _blendType.dst); - - _glProgramState->apply(_mv); -} - NS_CC_END diff --git a/cocos/renderer/CCQuadCommand.h b/cocos/renderer/CCQuadCommand.h index 5c731b784b..549df94c8c 100644 --- a/cocos/renderer/CCQuadCommand.h +++ b/cocos/renderer/CCQuadCommand.h @@ -30,13 +30,56 @@ #include "renderer/CCRenderCommandPool.h" NS_CC_BEGIN - -/** Command used to render one or more Quads */ -class CC_DLL QuadCommand : public RenderCommand +class CC_DLL TrianglesCommand : public RenderCommand { public: static const int MATERIAL_ID_DO_NOT_BATCH = 0; +public: + struct Triangles + { + V3F_C4B_T2F* verts; + unsigned short* indices; + ssize_t vertCount; + ssize_t indexCount; + }; + + TrianglesCommand(); + ~TrianglesCommand(); + + /** Initializes the command with a globalZOrder, a texture ID, a `GLProgram`, a blending function, a pointer to triangles, + * quantity of quads, and the Model View transform to be used for the quads */ + void init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, BlendFunc blendType, const Triangles& triangles,const Mat4& mv); + + void useMaterial() const; + + inline uint32_t getMaterialID() const { return _materialID; } + inline GLuint getTextureID() const { return _textureID; } + inline const Triangles& getTriangles() const { return _triangles; } + inline ssize_t getVertexCount() const { return _triangles.vertCount; } + inline ssize_t getIndexCount() const { return _triangles.indexCount; } + inline const V3F_C4B_T2F* getVertices() const { return _triangles.verts; } + inline const unsigned short* getIndices() const { return _triangles.indices; } + inline GLProgramState* getGLProgramState() const { return _glProgramState; } + inline BlendFunc getBlendType() const { return _blendType; } + inline const Mat4& getModelView() const { return _mv; } + +protected: + void generateMaterialID(); + + uint32_t _materialID; + GLuint _textureID; + GLProgramState* _glProgramState; + BlendFunc _blendType; + Triangles _triangles; + Mat4 _mv; +}; + +/** Command used to render one or more Quads */ +class CC_DLL QuadCommand : public TrianglesCommand +{ +public: + QuadCommand(); ~QuadCommand(); @@ -45,26 +88,12 @@ public: void init(float globalOrder, GLuint texutreID, GLProgramState* shader, BlendFunc blendType, V3F_C4B_T2F_Quad* quads, ssize_t quadCount, const Mat4& mv); - void useMaterial() const; - - inline uint32_t getMaterialID() const { return _materialID; } - inline GLuint getTextureID() const { return _textureID; } - inline V3F_C4B_T2F_Quad* getQuads() const { return _quads; } + inline const V3F_C4B_T2F_Quad* getQuads() const { return _quads; } inline ssize_t getQuadCount() const { return _quadsCount; } - inline GLProgramState* getGLProgramState() const { return _glProgramState; } - inline BlendFunc getBlendType() const { return _blendType; } - inline const Mat4& getModelView() const { return _mv; } protected: - void generateMaterialID(); - - uint32_t _materialID; - GLuint _textureID; - GLProgramState* _glProgramState; - BlendFunc _blendType; V3F_C4B_T2F_Quad* _quads; ssize_t _quadsCount; - Mat4 _mv; }; NS_CC_END diff --git a/cocos/renderer/CCRenderCommand.h b/cocos/renderer/CCRenderCommand.h index 77332e01b0..882cc3518e 100644 --- a/cocos/renderer/CCRenderCommand.h +++ b/cocos/renderer/CCRenderCommand.h @@ -50,6 +50,7 @@ public: GROUP_COMMAND, MESH_COMMAND, PRIMITIVE_COMMAND, + TRIANGLES_COMMAND }; /** Get Render Command Id */ diff --git a/cocos/renderer/CCRenderer.cpp b/cocos/renderer/CCRenderer.cpp index a7509a1c1f..179013d11e 100644 --- a/cocos/renderer/CCRenderer.cpp +++ b/cocos/renderer/CCRenderer.cpp @@ -274,10 +274,10 @@ void Renderer::visitRenderQueue(const RenderQueue& queue) flush3D(); auto cmd = static_cast(command); //Batch quads - if( _filledVertex + cmd->getQuadCount() * 4 > VBO_SIZE || _filledIndex + cmd->getQuadCount() * 6 > INDEX_VBO_SIZE) + if( _filledVertex + cmd->getVertexCount() > VBO_SIZE || _filledIndex + cmd->getIndexCount() > INDEX_VBO_SIZE) { - CCASSERT(cmd->getQuadCount()>= 0 && cmd->getQuadCount() < VBO_SIZE, "VBO is not big enough for quad data, please break the quad data down or use customized render command"); - + CCASSERT(cmd->getVertexCount()>= 0 && cmd->getVertexCount() < VBO_SIZE, "VBO for vertex is not big enough, please break the data down or use customized render command"); + CCASSERT(cmd->getIndexCount()>= 0 && cmd->getIndexCount() < INDEX_VBO_SIZE, "VBO for index is not big enough, please break the data down or use customized render command"); //Draw batched quads if VBO is full drawBatchedQuads(); } @@ -383,29 +383,25 @@ void Renderer::clean() void Renderer::fillQuadVertices(const QuadCommand* cmd) { - memcpy(_verts + _filledVertex, cmd->getQuads(), sizeof(V3F_C4B_T2F) * cmd->getQuadCount() * 4); + memcpy(_verts + _filledVertex, cmd->getQuads(), sizeof(V3F_C4B_T2F) * cmd->getVertexCount()); const Mat4& modelView = cmd->getModelView(); - for(ssize_t i=0; i< cmd->getQuadCount() * 4; ++i) + for(ssize_t i=0; i< cmd->getVertexCount(); ++i) { V3F_C4B_T2F *q = &_verts[i + _filledVertex]; Vec3 *vec1 = (Vec3*)&q->vertices; modelView.transformPoint(vec1); } + const unsigned short* indices = cmd->getIndices(); //fill index - for(ssize_t i=0; i< cmd->getQuadCount(); ++i) + for(ssize_t i=0; i< cmd->getIndexCount(); ++i) { - _indices[_filledIndex + i * 6 + 0] = _filledVertex + i * 4 + 0; - _indices[_filledIndex + i * 6 + 1] = _filledVertex + i * 4 + 1; - _indices[_filledIndex + i * 6 + 2] = _filledVertex + i * 4 + 2; - _indices[_filledIndex + i * 6 + 3] = _filledVertex + i * 4 + 3; - _indices[_filledIndex + i * 6 + 4] = _filledVertex + i * 4 + 2; - _indices[_filledIndex + i * 6 + 5] = _filledVertex + i * 4 + 1; + _indices[_filledIndex + i] = _filledVertex + indices[i]; } - _filledVertex += cmd->getQuadCount() * 4; - _filledIndex += cmd->getQuadCount() * 6; + _filledVertex += cmd->getVertexCount(); + _filledIndex += cmd->getIndexCount(); } void Renderer::drawBatchedQuads() @@ -491,7 +487,7 @@ void Renderer::drawBatchedQuads() _lastMaterialID = newMaterialID; } - indexToDraw += cmd->getQuadCount() * 6; + indexToDraw += cmd->getIndexCount(); } //Draw any remaining quad From bdf92cfbd45c96c86092721cee14268272b2857a Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Thu, 28 Aug 2014 09:58:39 +0800 Subject: [PATCH 09/41] Renderer Only knows about Triangles Command, every command inherit from Triangles Command can be batched --- cocos/renderer/CCRenderer.cpp | 24 ++++++++++++------------ cocos/renderer/CCRenderer.h | 9 +++++---- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/cocos/renderer/CCRenderer.cpp b/cocos/renderer/CCRenderer.cpp index 179013d11e..efecfd8b1c 100644 --- a/cocos/renderer/CCRenderer.cpp +++ b/cocos/renderer/CCRenderer.cpp @@ -124,7 +124,7 @@ Renderer::Renderer() RenderQueue defaultRenderQueue; _renderGroups.push_back(defaultRenderQueue); - _batchedQuadCommands.reserve(BATCH_QUADCOMMAND_RESEVER_SIZE); + _batchedCommands.reserve(BATCH_QUADCOMMAND_RESEVER_SIZE); } Renderer::~Renderer() @@ -269,10 +269,10 @@ void Renderer::visitRenderQueue(const RenderQueue& queue) { auto command = queue[index]; auto commandType = command->getType(); - if(RenderCommand::Type::QUAD_COMMAND == commandType) + if(RenderCommand::Type::QUAD_COMMAND == commandType || RenderCommand::Type::TRIANGLES_COMMAND == commandType) { flush3D(); - auto cmd = static_cast(command); + auto cmd = static_cast(command); //Batch quads if( _filledVertex + cmd->getVertexCount() > VBO_SIZE || _filledIndex + cmd->getIndexCount() > INDEX_VBO_SIZE) { @@ -282,9 +282,9 @@ void Renderer::visitRenderQueue(const RenderQueue& queue) drawBatchedQuads(); } - _batchedQuadCommands.push_back(cmd); + _batchedCommands.push_back(cmd); - fillQuadVertices(cmd); + fillVerticesAndIndices(cmd); } else if(RenderCommand::Type::GROUP_COMMAND == commandType) @@ -374,16 +374,16 @@ void Renderer::clean() } // Clear batch quad commands - _batchedQuadCommands.clear(); + _batchedCommands.clear(); _filledVertex = 0; _filledIndex = 0; _lastMaterialID = 0; _lastBatchedMeshCommand = nullptr; } -void Renderer::fillQuadVertices(const QuadCommand* cmd) +void Renderer::fillVerticesAndIndices(const TrianglesCommand* cmd) { - memcpy(_verts + _filledVertex, cmd->getQuads(), sizeof(V3F_C4B_T2F) * cmd->getVertexCount()); + memcpy(_verts + _filledVertex, cmd->getVertices(), sizeof(V3F_C4B_T2F) * cmd->getVertexCount()); const Mat4& modelView = cmd->getModelView(); for(ssize_t i=0; i< cmd->getVertexCount(); ++i) @@ -414,7 +414,7 @@ void Renderer::drawBatchedQuads() int startIndex = 0; //Upload buffer to VBO - if(_filledVertex <= 0 || _filledIndex <= 0 || _batchedQuadCommands.empty()) + if(_filledVertex <= 0 || _filledIndex <= 0 || _batchedCommands.empty()) { return; } @@ -466,10 +466,10 @@ void Renderer::drawBatchedQuads() } //Start drawing verties in batch - for(const auto& cmd : _batchedQuadCommands) + for(const auto& cmd : _batchedCommands) { auto newMaterialID = cmd->getMaterialID(); - if(_lastMaterialID != newMaterialID || newMaterialID == QuadCommand::MATERIAL_ID_DO_NOT_BATCH) + if(_lastMaterialID != newMaterialID || newMaterialID == TrianglesCommand::MATERIAL_ID_DO_NOT_BATCH) { //Draw quads if(indexToDraw > 0) @@ -509,7 +509,7 @@ void Renderer::drawBatchedQuads() glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } - _batchedQuadCommands.clear(); + _batchedCommands.clear(); _filledVertex = 0; _filledIndex = 0; } diff --git a/cocos/renderer/CCRenderer.h b/cocos/renderer/CCRenderer.h index 85db7cc108..082f24c82d 100644 --- a/cocos/renderer/CCRenderer.h +++ b/cocos/renderer/CCRenderer.h @@ -38,6 +38,7 @@ NS_CC_BEGIN class EventListenerCustom; class QuadCommand; +class TrianglesCommand; class MeshCommand; /** Class that knows how to sort `RenderCommand` objects. @@ -75,8 +76,8 @@ Whenever possible prefer to use `QuadCommand` objects since the renderer will au class CC_DLL Renderer { public: - static const int VBO_SIZE = 65536; - static const int INDEX_VBO_SIZE = 65536 * 6 / 4; + static const int VBO_SIZE = 8192; + static const int INDEX_VBO_SIZE = 8192 * 6 / 4; static const int BATCH_QUADCOMMAND_RESEVER_SIZE = 64; @@ -140,7 +141,7 @@ protected: void visitRenderQueue(const RenderQueue& queue); - void fillQuadVertices(const QuadCommand* cmd); + void fillVerticesAndIndices(const TrianglesCommand* cmd); std::stack _commandGroupStack; @@ -149,7 +150,7 @@ protected: uint32_t _lastMaterialID; MeshCommand* _lastBatchedMeshCommand; - std::vector _batchedQuadCommands; + std::vector _batchedCommands; V3F_C4B_T2F _verts[VBO_SIZE]; GLushort _indices[INDEX_VBO_SIZE]; From 3872ee9b59b70d45bd6252bcce5f8b1515398317 Mon Sep 17 00:00:00 2001 From: lite3 Date: Fri, 29 Aug 2014 18:50:21 +0800 Subject: [PATCH 10/41] add CustomGUIReader for lua --- .../manual/cocostudio/CustomGUIReader.cpp | 87 +++++++++++++++++++ .../manual/cocostudio/CustomGUIReader.h | 34 ++++++++ .../lua_cocos2dx_coco_studio_manual.cpp | 63 ++++++++++++++ .../proj.win32/libluacocos2d.vcxproj | 2 + .../proj.win32/libluacocos2d.vcxproj.filters | 6 ++ 5 files changed, 192 insertions(+) create mode 100644 cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.cpp create mode 100644 cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.h diff --git a/cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.cpp b/cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.cpp new file mode 100644 index 0000000000..fa0bcb1832 --- /dev/null +++ b/cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.cpp @@ -0,0 +1,87 @@ +#include "CustomGUIReader.h" +#include "CCLuaEngine.h" +#include "base/ObjectFactory.h" +#include "json/document.h" +#include "json/writer.h" +#include "json/stringbuffer.h" + +USING_NS_CC; + +namespace cocostudio +{ + + CustomGUIReader* CustomGUIReader::create(std::string &className, int createFunc, int setPropsFunc) + { + auto reader = new CustomGUIReader(); + reader->init(className, createFunc, setPropsFunc); + return reader; + } + + Ref* CustomGUIReader::createInstance() + { + Ref* result = nullptr; + LuaStack* stack = LuaEngine::getInstance()->getLuaStack(); + stack->executeFunction(_createFunc, 0, 1, [&result](lua_State* L,int numReturn){ + result = static_cast(tolua_tousertype(L, -1, nullptr)); + lua_pop(L, 1); + }); + return result; + } + + CustomGUIReader::CustomGUIReader() + :_className() + ,_createFunc(0) + ,_setPropsFunc(0) + { + + } + + CustomGUIReader::~CustomGUIReader() + { + if (_createFunc) + { + LuaEngine::getInstance()->removeScriptHandler(_createFunc); + _createFunc = 0; + } + if (_setPropsFunc) + { + LuaEngine::getInstance()->removeScriptHandler(_setPropsFunc); + _setPropsFunc = 0; + } + } + + void CustomGUIReader::init(std::string &className, int createFunc, int setPropsFunc) + { + _className = className; + _createFunc = createFunc; + _setPropsFunc = setPropsFunc; + + ObjectFactory* factoryCreate = ObjectFactory::getInstance(); + ObjectFactory::TInfo t; + t._class = className; + t._func = CC_CALLBACK_0(CustomGUIReader::createInstance, this); + factoryCreate->registerType(t); + + auto guiReader = GUIReader::getInstance(); + auto objMap = guiReader->getParseObjectMap(); + (*objMap)[className] = this; + auto callbackMap = guiReader->getParseCallBackMap(); + (*callbackMap)[className] = parseselector(CustomGUIReader::setCustomProps); + } + + void CustomGUIReader::setCustomProps(const std::string &classType, cocos2d::Ref *widget, const rapidjson::Value &customOptions) + { + if (_setPropsFunc != 0) + { + rapidjson::StringBuffer buffer; + rapidjson::Writer writer(buffer); + customOptions.Accept(writer); + + auto stack = LuaEngine::getInstance()->getLuaStack(); + stack->pushString(classType.c_str(), classType.size()); + stack->pushObject(widget, "cc.Ref"); + stack->pushString(buffer.GetString(), buffer.Size()); + stack->executeFunctionByHandler(_setPropsFunc, 3); + } + } +} diff --git a/cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.h b/cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.h new file mode 100644 index 0000000000..b82ddd65aa --- /dev/null +++ b/cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.h @@ -0,0 +1,34 @@ +#ifndef COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_CUSTOM_GUI_READER_H +#define COCOS_SCRIPTING_LUA_BINDINGS_LUA_COCOS2DX_CUSTOM_GUI_READER_H + +#include "cocostudio/WidgetReader/WidgetReader.h" + +USING_NS_CC; + +namespace cocostudio +{ + class CustomGUIReader : public Ref + { + public: + + CustomGUIReader(); + virtual ~CustomGUIReader(); + + static CustomGUIReader* create(std::string &className, int createFunc, int setPropsFunc); + + void init(std::string &className, int createFunc, int setPropsFunc); + + Ref* createInstance(); + + void setCustomProps(const std::string &classType, cocos2d::Ref *widget, const rapidjson::Value &customOptions); + + private: + std::string _className; + int _createFunc; + int _setPropsFunc; + }; +} + + + +#endif diff --git a/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp b/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp index a8bca1e5dc..013784aee7 100644 --- a/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp @@ -30,6 +30,7 @@ #include "CCLuaValue.h" #include "CocoStudio.h" #include "CCLuaEngine.h" +#include "CustomGUIReader.h" using namespace cocostudio; @@ -554,6 +555,53 @@ static void extendActionTimeline(lua_State* L) lua_pop(L, 1); } +int lua_cocos2dx_CustomGUIReader_create(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"ccs.CustomGUIReader",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S)-1; + + do + { + if (argc == 3) + { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccs.CustomGUIReader:create"); + if (!ok) { break; } +#if COCOS2D_DEBUG >= 1 + if (!toluafix_isfunction(tolua_S,3,"LUA_FUNCTION",0,&tolua_err)) { + goto tolua_lerror; + } +#endif + LUA_FUNCTION arg1 = toluafix_ref_function(tolua_S,3,0); +#if COCOS2D_DEBUG >= 1 + if (!toluafix_isfunction(tolua_S,4,"LUA_FUNCTION",0,&tolua_err)) { + goto tolua_lerror; + } +#endif + LUA_FUNCTION arg2 = toluafix_ref_function(tolua_S,4,0); + + cocostudio::CustomGUIReader* ret = cocostudio::CustomGUIReader::create(arg0, arg1, arg2); + object_to_luaval(tolua_S, "ccs.CustomGUIReader",(cocostudio::CustomGUIReader*)ret); + return 1; + } + } while (0); + CCLOG("%s has wrong number of arguments: %d, was expecting %d", "ccs.CustomGUIReader:create",argc, 1); + return 0; +#if COCOS2D_DEBUG >= 1 +tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_CustomGUIReader_create'.",&tolua_err); +#endif + return 0; +} int register_all_cocos2dx_coco_studio_manual(lua_State* L) { @@ -569,6 +617,20 @@ int register_all_cocos2dx_coco_studio_manual(lua_State* L) return 0; } +int lua_register_cocos2dx_coco_studio_CustomGUIReader(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"ccs.CustomGUIReader"); + tolua_cclass(tolua_S,"CustomGUIReader","ccs.CustomGUIReader","cc.Ref",nullptr); + + tolua_beginmodule(tolua_S,"CustomGUIReader"); + tolua_function(tolua_S,"create",lua_cocos2dx_CustomGUIReader_create); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocostudio::CustomGUIReader).name(); + g_luaType[typeName] = "ccs.CustomGUIReader"; + g_typeCast["CustomGUIReader"] = "ccs.CustomGUIReader"; + return 1; +} + int register_cocostudio_module(lua_State* L) { lua_getglobal(L, "_G"); @@ -576,6 +638,7 @@ int register_cocostudio_module(lua_State* L) { register_all_cocos2dx_studio(L); register_all_cocos2dx_coco_studio_manual(L); + lua_register_cocos2dx_coco_studio_CustomGUIReader(L); } lua_pop(L, 1); diff --git a/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj b/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj index a627dd490e..f1c52743e9 100644 --- a/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj +++ b/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj @@ -56,6 +56,7 @@ + @@ -117,6 +118,7 @@ + diff --git a/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj.filters b/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj.filters index 11d3df728e..1f8c61573d 100644 --- a/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj.filters +++ b/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj.filters @@ -243,6 +243,9 @@ luasocket + + manual\cocostudio + @@ -422,6 +425,9 @@ luasocket + + manual\cocostudio + From 18464825271ae5bae257a2a4697f8811e50e3bba Mon Sep 17 00:00:00 2001 From: lite3 Date: Sat, 30 Aug 2014 00:46:38 +0800 Subject: [PATCH 11/41] skip GUIReader::registerTypeAndCallBack for lua bindings --- tools/tolua/cocos2dx_studio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tolua/cocos2dx_studio.ini b/tools/tolua/cocos2dx_studio.ini index 32baa60dae..a25e3b67b9 100644 --- a/tools/tolua/cocos2dx_studio.ini +++ b/tools/tolua/cocos2dx_studio.ini @@ -48,7 +48,7 @@ skip = *::[^visit$ copyWith.* onEnter.* onExit.* ^description$ getObjectType .* ActionManagerEx::[initWithDictionary initWithBinary], DisplayManager::[initDisplayList (s|g)etCurrentDecorativeDisplay getDecorativeDisplayByIndex], Tween::[(s|g)etMovementBoneData], - GUIReader::[storeFileDesignSize getFileDesignSize getParseCallBackMap getParseObjectMap], + GUIReader::[registerTypeAndCallBack storeFileDesignSize getFileDesignSize getParseCallBackMap getParseObjectMap], ActionNode::[initWithDictionary], ActionObject::[initWithDictionary initWithBinary], BaseData::[copy subtract], From 6d462c5013faea7c14f066e942f8f94a98345397 Mon Sep 17 00:00:00 2001 From: lite3 Date: Sat, 30 Aug 2014 12:23:03 +0800 Subject: [PATCH 12/41] fix ccs.CustomGUIReader not in ccs table --- .../manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp b/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp index 013784aee7..eabfb21ac0 100644 --- a/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp @@ -619,6 +619,10 @@ int register_all_cocos2dx_coco_studio_manual(lua_State* L) int lua_register_cocos2dx_coco_studio_CustomGUIReader(lua_State* tolua_S) { + tolua_module(tolua_S,"ccs",0); + tolua_beginmodule(tolua_S,"ccs"); + + tolua_usertype(tolua_S,"ccs.CustomGUIReader"); tolua_cclass(tolua_S,"CustomGUIReader","ccs.CustomGUIReader","cc.Ref",nullptr); @@ -628,6 +632,8 @@ int lua_register_cocos2dx_coco_studio_CustomGUIReader(lua_State* tolua_S) std::string typeName = typeid(cocostudio::CustomGUIReader).name(); g_luaType[typeName] = "ccs.CustomGUIReader"; g_typeCast["CustomGUIReader"] = "ccs.CustomGUIReader"; + + tolua_endmodule(tolua_S); return 1; } From 06eb6c2425fce58bec4094e3b123ba44c94d5faa Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 1 Sep 2014 11:49:04 +0800 Subject: [PATCH 13/41] put TrianglesCommand in a seperate file --- build/cocos2d_libs.xcodeproj/project.pbxproj | 12 +++ cocos/renderer/CCQuadCommand.cpp | 66 ------------ cocos/renderer/CCQuadCommand.h | 45 +-------- cocos/renderer/CCRenderer.cpp | 1 + cocos/renderer/CCTrianglesCommand.cpp | 100 +++++++++++++++++++ cocos/renderer/CCTrianglesCommand.h | 79 +++++++++++++++ 6 files changed, 193 insertions(+), 110 deletions(-) create mode 100644 cocos/renderer/CCTrianglesCommand.cpp create mode 100644 cocos/renderer/CCTrianglesCommand.h diff --git a/build/cocos2d_libs.xcodeproj/project.pbxproj b/build/cocos2d_libs.xcodeproj/project.pbxproj index 1dce556650..4168e8e076 100644 --- a/build/cocos2d_libs.xcodeproj/project.pbxproj +++ b/build/cocos2d_libs.xcodeproj/project.pbxproj @@ -1809,6 +1809,10 @@ B21770471977ED34009EE11B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B21770461977ED34009EE11B /* QuartzCore.framework */; }; B21770491977ED4C009EE11B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = B21770481977ED4C009EE11B /* libz.dylib */; }; B217704E1977ED9F009EE11B /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = B217704C1977ED8B009EE11B /* libsqlite3.dylib */; }; + B230ED7119B417AE00364AA8 /* CCTrianglesCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B230ED6F19B417AE00364AA8 /* CCTrianglesCommand.cpp */; }; + B230ED7219B417AE00364AA8 /* CCTrianglesCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B230ED6F19B417AE00364AA8 /* CCTrianglesCommand.cpp */; }; + B230ED7319B417AE00364AA8 /* CCTrianglesCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = B230ED7019B417AE00364AA8 /* CCTrianglesCommand.h */; }; + B230ED7419B417AE00364AA8 /* CCTrianglesCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = B230ED7019B417AE00364AA8 /* CCTrianglesCommand.h */; }; B24AA985195A675C007B4522 /* CCFastTMXLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B24AA981195A675C007B4522 /* CCFastTMXLayer.cpp */; }; B24AA986195A675C007B4522 /* CCFastTMXLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B24AA981195A675C007B4522 /* CCFastTMXLayer.cpp */; }; B24AA987195A675C007B4522 /* CCFastTMXLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = B24AA982195A675C007B4522 /* CCFastTMXLayer.h */; }; @@ -2843,6 +2847,8 @@ B21770481977ED4C009EE11B /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; B217704A1977ED55009EE11B /* libcurl.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcurl.dylib; path = usr/lib/libcurl.dylib; sourceTree = SDKROOT; }; B217704C1977ED8B009EE11B /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; + B230ED6F19B417AE00364AA8 /* CCTrianglesCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCTrianglesCommand.cpp; sourceTree = ""; }; + B230ED7019B417AE00364AA8 /* CCTrianglesCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCTrianglesCommand.h; sourceTree = ""; }; B24AA981195A675C007B4522 /* CCFastTMXLayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCFastTMXLayer.cpp; sourceTree = ""; }; B24AA982195A675C007B4522 /* CCFastTMXLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCFastTMXLayer.h; sourceTree = ""; }; B24AA983195A675C007B4522 /* CCFastTMXTiledMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCFastTMXTiledMap.cpp; sourceTree = ""; }; @@ -4599,6 +4605,8 @@ 50ABBD731925AB4100A911A9 /* CCGroupCommand.h */, B29594B21926D5EC003EEF37 /* CCMeshCommand.cpp */, B29594B31926D5EC003EEF37 /* CCMeshCommand.h */, + B230ED6F19B417AE00364AA8 /* CCTrianglesCommand.cpp */, + B230ED7019B417AE00364AA8 /* CCTrianglesCommand.h */, 50ABBD741925AB4100A911A9 /* CCQuadCommand.cpp */, 50ABBD751925AB4100A911A9 /* CCQuadCommand.h */, 50ABBD761925AB4100A911A9 /* CCRenderCommand.cpp */, @@ -4993,6 +5001,7 @@ 15AE1BE519AAE01E00C27E9E /* CCTableView.h in Headers */, 15AE1BD319AAE01E00C27E9E /* CCControlPotentiometer.h in Headers */, 15AE1B6E19AADA9900C27E9E /* UIHelper.h in Headers */, + B230ED7319B417AE00364AA8 /* CCTrianglesCommand.h in Headers */, 15AE187F19AAD33D00C27E9E /* CCBKeyframe.h in Headers */, 1A570073180BC5A10088DEC7 /* CCActionGrid.h in Headers */, 15AE1BCC19AAE01E00C27E9E /* CCControlButton.h in Headers */, @@ -5566,6 +5575,7 @@ 15AE181D19AAD2F700C27E9E /* CCBundle3D.h in Headers */, 15AE192519AAD35100C27E9E /* CocoLoader.h in Headers */, 15AE1BBB19AADFF000C27E9E /* HttpRequest.h in Headers */, + B230ED7419B417AE00364AA8 /* CCTrianglesCommand.h in Headers */, 15AE1A0019AAD3A700C27E9E /* AtlasAttachmentLoader.h in Headers */, 15AE1ACB19AAD40300C27E9E /* b2MouseJoint.h in Headers */, 50ABBD3F1925AB0000A911A9 /* CCGeometry.h in Headers */, @@ -6246,6 +6256,7 @@ 15AE1A7819AAD40300C27E9E /* b2PolygonAndCircleContact.cpp in Sources */, 15AE1A3419AAD3D500C27E9E /* b2EdgeShape.cpp in Sources */, 15AE1BA319AADFDF00C27E9E /* UILayoutManager.cpp in Sources */, + B230ED7119B417AE00364AA8 /* CCTrianglesCommand.cpp in Sources */, 1A5702F2180BCE750088DEC7 /* CCTMXObjectGroup.cpp in Sources */, 15AE1A5B19AAD40300C27E9E /* b2Timer.cpp in Sources */, 15AE1B1219AAD43700C27E9E /* cpGearJoint.c in Sources */, @@ -6438,6 +6449,7 @@ 50ABC0161926664800A911A9 /* CCImage.cpp in Sources */, 1A01C6A518F58F7500EFE3A6 /* CCNotificationCenter.cpp in Sources */, 15AE1BFB19AAE01E00C27E9E /* CCControlUtils.cpp in Sources */, + B230ED7219B417AE00364AA8 /* CCTrianglesCommand.cpp in Sources */, 15AE1B9019AADA9A00C27E9E /* UIWidget.cpp in Sources */, ED9C6A9518599AD8000A5232 /* CCNodeGrid.cpp in Sources */, 1A01C68F18F57BE800EFE3A6 /* CCDictionary.cpp in Sources */, diff --git a/cocos/renderer/CCQuadCommand.cpp b/cocos/renderer/CCQuadCommand.cpp index 1b12e06f0b..6fd255bf1b 100644 --- a/cocos/renderer/CCQuadCommand.cpp +++ b/cocos/renderer/CCQuadCommand.cpp @@ -33,72 +33,6 @@ NS_CC_BEGIN -TrianglesCommand::TrianglesCommand() -:_materialID(0) -,_textureID(0) -,_glProgramState(nullptr) -,_blendType(BlendFunc::DISABLE) -{ - _type = RenderCommand::Type::TRIANGLES_COMMAND; -} - -void TrianglesCommand::init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, BlendFunc blendType, const Triangles& triangles,const Mat4& mv) -{ - CCASSERT(glProgramState, "Invalid GLProgramState"); - CCASSERT(glProgramState->getVertexAttribsFlags() == 0, "No custom attributes are supported in QuadCommand"); - - _globalOrder = globalOrder; - - _triangles = triangles; - if(_triangles.indexCount % 3 != 0) - { - ssize_t count = _triangles.indexCount; - _triangles.indexCount = count / 3 * 3; - CCLOGERROR("Resize indexCount from %zd to %zd, size must be multiple times of 3", count, _triangles.indexCount); - } - _mv = mv; - - if( _textureID != textureID || _blendType.src != blendType.src || _blendType.dst != blendType.dst || _glProgramState != glProgramState) { - - _textureID = textureID; - _blendType = blendType; - _glProgramState = glProgramState; - - generateMaterialID(); - } -} - -TrianglesCommand::~TrianglesCommand() -{ -} - -void TrianglesCommand::generateMaterialID() -{ - - if(_glProgramState->getUniformCount() > 0) - { - _materialID = TrianglesCommand::MATERIAL_ID_DO_NOT_BATCH; - } - else - { - int glProgram = (int)_glProgramState->getGLProgram()->getProgram(); - int intArray[4] = { glProgram, (int)_textureID, (int)_blendType.src, (int)_blendType.dst}; - - _materialID = XXH32((const void*)intArray, sizeof(intArray), 0); - } -} - -void TrianglesCommand::useMaterial() const -{ - //Set texture - GL::bindTexture2D(_textureID); - - //set blend mode - GL::blendFunc(_blendType.src, _blendType.dst); - - _glProgramState->apply(_mv); -} - QuadCommand::QuadCommand() :TrianglesCommand() ,_quads(nullptr) diff --git a/cocos/renderer/CCQuadCommand.h b/cocos/renderer/CCQuadCommand.h index 549df94c8c..22ffbd4f9b 100644 --- a/cocos/renderer/CCQuadCommand.h +++ b/cocos/renderer/CCQuadCommand.h @@ -28,52 +28,9 @@ #include "renderer/CCRenderCommand.h" #include "renderer/CCGLProgramState.h" #include "renderer/CCRenderCommandPool.h" +#include "renderer/CCTrianglesCommand.h" NS_CC_BEGIN -class CC_DLL TrianglesCommand : public RenderCommand -{ -public: - static const int MATERIAL_ID_DO_NOT_BATCH = 0; - -public: - struct Triangles - { - V3F_C4B_T2F* verts; - unsigned short* indices; - ssize_t vertCount; - ssize_t indexCount; - }; - - TrianglesCommand(); - ~TrianglesCommand(); - - /** Initializes the command with a globalZOrder, a texture ID, a `GLProgram`, a blending function, a pointer to triangles, - * quantity of quads, and the Model View transform to be used for the quads */ - void init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, BlendFunc blendType, const Triangles& triangles,const Mat4& mv); - - void useMaterial() const; - - inline uint32_t getMaterialID() const { return _materialID; } - inline GLuint getTextureID() const { return _textureID; } - inline const Triangles& getTriangles() const { return _triangles; } - inline ssize_t getVertexCount() const { return _triangles.vertCount; } - inline ssize_t getIndexCount() const { return _triangles.indexCount; } - inline const V3F_C4B_T2F* getVertices() const { return _triangles.verts; } - inline const unsigned short* getIndices() const { return _triangles.indices; } - inline GLProgramState* getGLProgramState() const { return _glProgramState; } - inline BlendFunc getBlendType() const { return _blendType; } - inline const Mat4& getModelView() const { return _mv; } - -protected: - void generateMaterialID(); - - uint32_t _materialID; - GLuint _textureID; - GLProgramState* _glProgramState; - BlendFunc _blendType; - Triangles _triangles; - Mat4 _mv; -}; /** Command used to render one or more Quads */ class CC_DLL QuadCommand : public TrianglesCommand diff --git a/cocos/renderer/CCRenderer.cpp b/cocos/renderer/CCRenderer.cpp index 60c39f451f..86557d6b6e 100644 --- a/cocos/renderer/CCRenderer.cpp +++ b/cocos/renderer/CCRenderer.cpp @@ -26,6 +26,7 @@ #include +#include "renderer/CCTrianglesCommand.h" #include "renderer/CCQuadCommand.h" #include "renderer/CCBatchCommand.h" #include "renderer/CCCustomCommand.h" diff --git a/cocos/renderer/CCTrianglesCommand.cpp b/cocos/renderer/CCTrianglesCommand.cpp new file mode 100644 index 0000000000..8f46ef9c6a --- /dev/null +++ b/cocos/renderer/CCTrianglesCommand.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** + Copyright (c) 2013-2014 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + 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. + ****************************************************************************/ + +#include "renderer/CCTrianglesCommand.h" +#include "renderer/ccGLStateCache.h" +#include "renderer/CCGLProgram.h" +#include "renderer/CCGLProgramState.h" +#include "xxhash.h" +#include "renderer/CCRenderer.h" + +NS_CC_BEGIN + +TrianglesCommand::TrianglesCommand() +:_materialID(0) +,_textureID(0) +,_glProgramState(nullptr) +,_blendType(BlendFunc::DISABLE) +{ + _type = RenderCommand::Type::TRIANGLES_COMMAND; +} + +void TrianglesCommand::init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, BlendFunc blendType, const Triangles& triangles,const Mat4& mv) +{ + CCASSERT(glProgramState, "Invalid GLProgramState"); + CCASSERT(glProgramState->getVertexAttribsFlags() == 0, "No custom attributes are supported in QuadCommand"); + + _globalOrder = globalOrder; + + _triangles = triangles; + if(_triangles.indexCount % 3 != 0) + { + ssize_t count = _triangles.indexCount; + _triangles.indexCount = count / 3 * 3; + CCLOGERROR("Resize indexCount from %zd to %zd, size must be multiple times of 3", count, _triangles.indexCount); + } + _mv = mv; + + if( _textureID != textureID || _blendType.src != blendType.src || _blendType.dst != blendType.dst || _glProgramState != glProgramState) { + + _textureID = textureID; + _blendType = blendType; + _glProgramState = glProgramState; + + generateMaterialID(); + } +} + +TrianglesCommand::~TrianglesCommand() +{ +} + +void TrianglesCommand::generateMaterialID() +{ + + if(_glProgramState->getUniformCount() > 0) + { + _materialID = TrianglesCommand::MATERIAL_ID_DO_NOT_BATCH; + } + else + { + int glProgram = (int)_glProgramState->getGLProgram()->getProgram(); + int intArray[4] = { glProgram, (int)_textureID, (int)_blendType.src, (int)_blendType.dst}; + + _materialID = XXH32((const void*)intArray, sizeof(intArray), 0); + } +} + +void TrianglesCommand::useMaterial() const +{ + //Set texture + GL::bindTexture2D(_textureID); + + //set blend mode + GL::blendFunc(_blendType.src, _blendType.dst); + + _glProgramState->apply(_mv); +} + +NS_CC_END diff --git a/cocos/renderer/CCTrianglesCommand.h b/cocos/renderer/CCTrianglesCommand.h new file mode 100644 index 0000000000..71cd1cca25 --- /dev/null +++ b/cocos/renderer/CCTrianglesCommand.h @@ -0,0 +1,79 @@ +/**************************************************************************** + Copyright (c) 2013-2014 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + 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. + ****************************************************************************/ + +#ifndef __CC_TRIANGLES_COMMAND__ +#define __CC_TRIANGLES_COMMAND__ + +#include "renderer/CCRenderCommand.h" +#include "renderer/CCGLProgramState.h" + +NS_CC_BEGIN +class CC_DLL TrianglesCommand : public RenderCommand +{ +public: + static const int MATERIAL_ID_DO_NOT_BATCH = 0; + +public: + struct Triangles + { + V3F_C4B_T2F* verts; + unsigned short* indices; + ssize_t vertCount; + ssize_t indexCount; + }; + + TrianglesCommand(); + ~TrianglesCommand(); + + /** Initializes the command with a globalZOrder, a texture ID, a `GLProgram`, a blending function, a pointer to triangles, + * quantity of quads, and the Model View transform to be used for the quads */ + void init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, BlendFunc blendType, const Triangles& triangles,const Mat4& mv); + + void useMaterial() const; + + inline uint32_t getMaterialID() const { return _materialID; } + inline GLuint getTextureID() const { return _textureID; } + inline const Triangles& getTriangles() const { return _triangles; } + inline ssize_t getVertexCount() const { return _triangles.vertCount; } + inline ssize_t getIndexCount() const { return _triangles.indexCount; } + inline const V3F_C4B_T2F* getVertices() const { return _triangles.verts; } + inline const unsigned short* getIndices() const { return _triangles.indices; } + inline GLProgramState* getGLProgramState() const { return _glProgramState; } + inline BlendFunc getBlendType() const { return _blendType; } + inline const Mat4& getModelView() const { return _mv; } + +protected: + void generateMaterialID(); + + uint32_t _materialID; + GLuint _textureID; + GLProgramState* _glProgramState; + BlendFunc _blendType; + Triangles _triangles; + Mat4 _mv; +}; + +NS_CC_END + +#endif // defined(__CC_TRIANGLES_COMMAND__) From bfaef3574a9f82fc70d0d0b1cd30f4e9a0f949c3 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 1 Sep 2014 13:57:33 +0800 Subject: [PATCH 14/41] android works for trianglesCommand --- cocos/Android.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/cocos/Android.mk b/cocos/Android.mk index 94c14a9824..87573c5ce1 100644 --- a/cocos/Android.mk +++ b/cocos/Android.mk @@ -159,6 +159,7 @@ renderer/CCVertexIndexBuffer.cpp \ renderer/CCVertexIndexData.cpp \ renderer/CCPrimitive.cpp \ renderer/CCPrimitiveCommand.cpp \ +renderer/CCTrianglesCommand.cpp \ deprecated/CCArray.cpp \ deprecated/CCSet.cpp \ deprecated/CCString.cpp \ From 68244538046b8a0ec386d2c6447c467fbd5bf31b Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 1 Sep 2014 15:08:09 +0800 Subject: [PATCH 15/41] windows work for trianglesCommand --- cocos/2d/libcocos2d.vcxproj | 2 ++ cocos/2d/libcocos2d.vcxproj.filters | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/cocos/2d/libcocos2d.vcxproj b/cocos/2d/libcocos2d.vcxproj index 9fdc34eb21..d2e43dad0a 100644 --- a/cocos/2d/libcocos2d.vcxproj +++ b/cocos/2d/libcocos2d.vcxproj @@ -405,6 +405,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\spine\prebuilt\release-l + @@ -781,6 +782,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\spine\prebuilt\release-l + diff --git a/cocos/2d/libcocos2d.vcxproj.filters b/cocos/2d/libcocos2d.vcxproj.filters index 1a5d9f9b25..692354480f 100644 --- a/cocos/2d/libcocos2d.vcxproj.filters +++ b/cocos/2d/libcocos2d.vcxproj.filters @@ -1165,6 +1165,9 @@ cocosbuilder\Source Files + + renderer + @@ -2290,6 +2293,9 @@ cocosbuilder\Header Files + + renderer + From 57dd8fd4e1ac6310edb891576f20a90aca70c199 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 1 Sep 2014 15:19:02 +0800 Subject: [PATCH 16/41] remove commented code --- cocos/renderer/CCRenderer.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/cocos/renderer/CCRenderer.cpp b/cocos/renderer/CCRenderer.cpp index 3b0f2c7291..7815e08701 100644 --- a/cocos/renderer/CCRenderer.cpp +++ b/cocos/renderer/CCRenderer.cpp @@ -411,8 +411,6 @@ void Renderer::drawBatchedQuads() { //TODO: we can improve the draw performance by insert material switching command before hand. -// int quadsToDraw = 0; -// int startQuad = 0; int indexToDraw = 0; int startIndex = 0; From 05d0e04073a0a6ea33ab68b22b56841d8d81c3e3 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Tue, 2 Sep 2014 15:05:21 +0800 Subject: [PATCH 17/41] [ci skip] update template for triangles command --- templates/cocos2dx_files.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 25d6d414cb..5099548791 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -934,6 +934,8 @@ "cocos/renderer/CCPrimitive.h", "cocos/renderer/CCPrimitiveCommand.cpp", "cocos/renderer/CCPrimitiveCommand.h", + "cocos/renderer/CCTrianglesCommand.cpp", + "cocos/renderer/CCTrianglesCommand.h", "cocos/renderer/CCQuadCommand.cpp", "cocos/renderer/CCQuadCommand.h", "cocos/renderer/CCRenderCommand.cpp", From 5d935c2cea945ffae666255f735e28a7da251437 Mon Sep 17 00:00:00 2001 From: lite3 Date: Tue, 2 Sep 2014 16:16:36 +0800 Subject: [PATCH 18/41] fix compile error on android --- cocos/scripting/lua-bindings/proj.android/Android.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/cocos/scripting/lua-bindings/proj.android/Android.mk b/cocos/scripting/lua-bindings/proj.android/Android.mk index c61e2b6ae3..cee7f1fd53 100644 --- a/cocos/scripting/lua-bindings/proj.android/Android.mk +++ b/cocos/scripting/lua-bindings/proj.android/Android.mk @@ -66,6 +66,7 @@ LOCAL_SRC_FILES += ../manual/cocosbuilder/lua_cocos2dx_cocosbuilder_manual.cpp \ #cocostudio LOCAL_SRC_FILES += ../manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp \ + ../manual/cocostudio/CustomGUIReader.cpp \ ../auto/lua_cocos2dx_studio_auto.cpp #spine From 27f771744a9237defb1d5f54a56f12ded8bc8a5c Mon Sep 17 00:00:00 2001 From: lvlong Date: Tue, 2 Sep 2014 17:33:22 +0800 Subject: [PATCH 19/41] static model load problem of old version . --- cocos/3d/CCBundle3D.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index c28351046b..6a2a74efd2 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -760,7 +760,17 @@ bool Bundle3D::loadNodes(NodeDatas& nodedatas) if (_version == "0.1" || _version == "1.2" || _version == "0.2") { SkinData skinData; - loadSkinData("", &skinData); + if (!loadSkinData("", &skinData)) + { + auto node= new (std::nothrow) NodeData(); + auto modelnode = new (std::nothrow) ModelData(); + modelnode->matrialId = ""; + modelnode->subMeshId = ""; + node->modelNodeDatas.push_back(modelnode); + nodedatas.nodes.push_back(node); + return true; + } + auto nodeDatas = new (std::nothrow) NodeData*[skinData.skinBoneNames.size() + skinData.nodeBoneNames.size()]; int index = 0; size_t i; From 6ff1289aed659b6665f8739d9a28932f58915c88 Mon Sep 17 00:00:00 2001 From: lite3 Date: Tue, 2 Sep 2014 20:26:21 +0800 Subject: [PATCH 20/41] fix compile error on Xcode --- .../cocos2d_lua_bindings.xcodeproj/project.pbxproj | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeproj/project.pbxproj b/cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeproj/project.pbxproj index 36cecee16a..260b98b268 100644 --- a/cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeproj/project.pbxproj +++ b/cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeproj/project.pbxproj @@ -236,6 +236,10 @@ 15EFA64E198B3342000C57D3 /* lua.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ABCA1E718CD8F470087CE3A /* lua.h */; }; 15EFA64F198B3342000C57D3 /* luaconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ABCA1E818CD8F470087CE3A /* luaconf.h */; }; 15EFA650198B3342000C57D3 /* lualib.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ABCA1E918CD8F470087CE3A /* lualib.h */; }; + 566F015F19B5EB0F00FCA620 /* CustomGUIReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 566F015D19B5EB0F00FCA620 /* CustomGUIReader.cpp */; }; + 566F016019B5EB0F00FCA620 /* CustomGUIReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 566F015D19B5EB0F00FCA620 /* CustomGUIReader.cpp */; }; + 566F016119B5EB0F00FCA620 /* CustomGUIReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 566F015E19B5EB0F00FCA620 /* CustomGUIReader.h */; }; + 566F016219B5EB0F00FCA620 /* CustomGUIReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 566F015E19B5EB0F00FCA620 /* CustomGUIReader.h */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -364,6 +368,8 @@ 1ABCA1FF18CD8F6E0087CE3A /* tolua++.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "tolua++.h"; path = "../../../../external/lua/tolua/tolua++.h"; sourceTree = ""; }; 2905FACE18CF12E600240AA3 /* lua_cocos2dx_ui_auto.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lua_cocos2dx_ui_auto.cpp; sourceTree = ""; }; 2905FACF18CF12E600240AA3 /* lua_cocos2dx_ui_auto.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = lua_cocos2dx_ui_auto.hpp; sourceTree = ""; }; + 566F015D19B5EB0F00FCA620 /* CustomGUIReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CustomGUIReader.cpp; sourceTree = ""; }; + 566F015E19B5EB0F00FCA620 /* CustomGUIReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomGUIReader.h; sourceTree = ""; }; C0D9BAFA1974D30000EC35BB /* liblua.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblua.a; path = ../../../../external/lua/lua/prebuilt/ios/liblua.a; sourceTree = ""; }; /* End PBXFileReference section */ @@ -507,6 +513,8 @@ 15EFA400198B2AB2000C57D3 /* cocostudio */ = { isa = PBXGroup; children = ( + 566F015D19B5EB0F00FCA620 /* CustomGUIReader.cpp */, + 566F015E19B5EB0F00FCA620 /* CustomGUIReader.h */, 15EFA401198B2AB2000C57D3 /* lua_cocos2dx_coco_studio_manual.cpp */, 15EFA402198B2AB2000C57D3 /* lua_cocos2dx_coco_studio_manual.hpp */, ); @@ -738,6 +746,7 @@ 15C1C2EE19874CBE00A46ACC /* tolua_fix.h in Headers */, 155C7E2019A71CCC00F08B25 /* LuaSkeletonAnimation.h in Headers */, 15415AB719A71A53004F1E71 /* io.h in Headers */, + 566F016119B5EB0F00FCA620 /* CustomGUIReader.h in Headers */, 15C1C2DC19874B4400A46ACC /* xxtea.h in Headers */, 15415AD319A71A53004F1E71 /* timeout.h in Headers */, 15C1C2D5198749BC00A46ACC /* LuaOpengl.h in Headers */, @@ -798,6 +807,7 @@ 15EFA642198B32BB000C57D3 /* tolua_fix.h in Headers */, 155C7E2119A71CCE00F08B25 /* LuaSkeletonAnimation.h in Headers */, 15415AB819A71A53004F1E71 /* io.h in Headers */, + 566F016219B5EB0F00FCA620 /* CustomGUIReader.h in Headers */, 15EFA62B198B3220000C57D3 /* LuaOpengl.h in Headers */, 15415AD419A71A53004F1E71 /* timeout.h in Headers */, 15EFA62C198B3220000C57D3 /* lua_cocos2dx_deprecated.h in Headers */, @@ -928,6 +938,7 @@ 155C7E1E19A71CC700F08B25 /* LuaSkeletonAnimation.cpp in Sources */, 15415AB519A71A53004F1E71 /* io.c in Sources */, 15C1C2CE1987498B00A46ACC /* LuaOpengl.cpp in Sources */, + 566F015F19B5EB0F00FCA620 /* CustomGUIReader.cpp in Sources */, 15415AC119A71A53004F1E71 /* options.c in Sources */, 155C7E0A19A71C8B00F08B25 /* lua_cocos2dx_network_manual.cpp in Sources */, 15415AD119A71A53004F1E71 /* timeout.c in Sources */, @@ -995,6 +1006,7 @@ 155C7E1F19A71CC800F08B25 /* LuaSkeletonAnimation.cpp in Sources */, 15415ACA19A71A53004F1E71 /* serial.c in Sources */, 155C7DEA19A71BDA00F08B25 /* lua_cocos2dx_3d_auto.cpp in Sources */, + 566F016019B5EB0F00FCA620 /* CustomGUIReader.cpp in Sources */, 155C7DF119A71C2300F08B25 /* lua_cocos2dx_studio_auto.cpp in Sources */, 155C7E0B19A71C8D00F08B25 /* lua_cocos2dx_network_manual.cpp in Sources */, 15415AAE19A71A53004F1E71 /* except.c in Sources */, From fab9a0052bd85d62b06d05aa6d1ebb6c45ee6dc4 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 6 Aug 2014 14:38:58 +0800 Subject: [PATCH 21/41] fix normalizedPosition bug --- cocos/2d/CCNode.cpp | 22 ++++++++++++------- cocos/2d/CCNode.h | 1 + tests/cpp-tests/Classes/NodeTest/NodeTest.cpp | 6 ++++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index cbd4b97f31..d13cd07bc6 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -126,6 +126,7 @@ Node::Node(void) , _cascadeColorEnabled(false) , _cascadeOpacityEnabled(false) , _usingNormalizedPosition(false) +, _normalizedPositionDirty(false) , _name("") , _hashOfName(0) , _cameraMask(1) @@ -613,6 +614,7 @@ void Node::setNormalizedPosition(const Vec2& position) _normalizedPosition = position; _usingNormalizedPosition = true; + _normalizedPositionDirty = true; _transformUpdated = _transformDirty = _inverseDirty = true; } @@ -1210,17 +1212,21 @@ void Node::visit() uint32_t Node::processParentFlags(const Mat4& parentTransform, uint32_t parentFlags) { + if(_usingNormalizedPosition) { + CCASSERT(_parent, "setNormalizedPosition() doesn't work with orphan nodes"); + if ((parentFlags & FLAGS_CONTENT_SIZE_DIRTY) || _normalizedPositionDirty) { + auto s = _parent->getContentSize(); + _position.x = _normalizedPosition.x * s.width; + _position.y = _normalizedPosition.y * s.height; + _transformUpdated = _transformDirty = _inverseDirty = true; + _normalizedPositionDirty = false; + } + } + uint32_t flags = parentFlags; flags |= (_transformUpdated ? FLAGS_TRANSFORM_DIRTY : 0); flags |= (_contentSizeDirty ? FLAGS_CONTENT_SIZE_DIRTY : 0); - - if(_usingNormalizedPosition && (flags & FLAGS_CONTENT_SIZE_DIRTY)) { - CCASSERT(_parent, "setNormalizedPosition() doesn't work with orphan nodes"); - auto s = _parent->getContentSize(); - _position.x = _normalizedPosition.x * s.width; - _position.y = _normalizedPosition.y * s.height; - _transformUpdated = _transformDirty = _inverseDirty = true; - } + if(flags & FLAGS_DIRTY_MASK) _modelViewTransform = this->transform(parentTransform); diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index 8f24f2d09d..96ab1118ee 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -1555,6 +1555,7 @@ protected: float _positionZ; ///< OpenGL real Z position Vec2 _normalizedPosition; bool _usingNormalizedPosition; + bool _normalizedPositionDirty; float _skewX; ///< skew angle on x-axis float _skewY; ///< skew angle on y-axis diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp index dc4bad49dd..56db085fbe 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp @@ -1198,6 +1198,7 @@ NodeNormalizedPositionTest2::NodeNormalizedPositionTest2() sprites[i] = Sprite::create("Images/grossini.png"); sprites[i]->setNormalizedPosition(positions[i]); addChild(sprites[i]); + sprites[i]->setTag(2); } scheduleUpdate(); @@ -1227,7 +1228,10 @@ void NodeNormalizedPositionTest2::update(float dt) Size s = Size(_copyContentSize.width*norm, _copyContentSize.height*norm); setContentSize(s); - + if (norm > 0.5) { + auto node = this->getChildByTag(2); + node->setNormalizedPosition(Vec2(0.2,0.2)); + } CCLOG("s: %f,%f", s.width, s.height); } From a79d35d08bc15236088919b1532ee8ace4e13515 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 1 Sep 2014 11:16:27 +0800 Subject: [PATCH 22/41] remove NodeNormalizedPositionTest --- tests/cpp-tests/Classes/NodeTest/NodeTest.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp index 56db085fbe..6c43181c68 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp @@ -1198,7 +1198,6 @@ NodeNormalizedPositionTest2::NodeNormalizedPositionTest2() sprites[i] = Sprite::create("Images/grossini.png"); sprites[i]->setNormalizedPosition(positions[i]); addChild(sprites[i]); - sprites[i]->setTag(2); } scheduleUpdate(); @@ -1228,10 +1227,6 @@ void NodeNormalizedPositionTest2::update(float dt) Size s = Size(_copyContentSize.width*norm, _copyContentSize.height*norm); setContentSize(s); - if (norm > 0.5) { - auto node = this->getChildByTag(2); - node->setNormalizedPosition(Vec2(0.2,0.2)); - } CCLOG("s: %f,%f", s.width, s.height); } From b00a7b3b386df5eead328d279329dd9e16243cd5 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 1 Sep 2014 11:29:40 +0800 Subject: [PATCH 23/41] add Node normalizedPosition bug test --- tests/cpp-tests/Classes/NodeTest/NodeTest.cpp | 40 +++++++++++++++++++ tests/cpp-tests/Classes/NodeTest/NodeTest.h | 15 +++++++ 2 files changed, 55 insertions(+) diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp index 6c43181c68..2790a989f5 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp @@ -73,6 +73,7 @@ static std::function createFunctions[] = CL(NodeGlobalZValueTest), CL(NodeNormalizedPositionTest1), CL(NodeNormalizedPositionTest2), + CL(NodeNormalizedPositionBugTest), CL(NodeNameTest), }; @@ -1231,6 +1232,45 @@ void NodeNormalizedPositionTest2::update(float dt) } +//------------------------------------------------------------------ +// +// NodeNormalizedPositionBugTest +// +//------------------------------------------------------------------ +NodeNormalizedPositionBugTest::NodeNormalizedPositionBugTest() +: _accum(0) +{ + Vec2 position; + + position = Vec2(0.5,0.5); + + + sprite = Sprite::create("Images/grossini.png"); + sprite->setNormalizedPosition(position); + addChild(sprite); + + scheduleUpdate(); +} + +std::string NodeNormalizedPositionBugTest::title() const +{ + return "NodeNormalizedPositionBugTest"; +} + +std::string NodeNormalizedPositionBugTest::subtitle() const +{ + return "When changing sprite normalizedPosition, the sprite doesn't move!"; +} + +void NodeNormalizedPositionBugTest::update(float dt) +{ + _accum += dt; + + // for 5 seconds + float norm = clampf(sinf(_accum), 0, 1.0); + sprite->setNormalizedPosition(Vec2(norm,norm)); +} + std::string NodeNameTest::title() const { return "getName()/setName()/getChildByName()/enumerateChildren()"; diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.h b/tests/cpp-tests/Classes/NodeTest/NodeTest.h index 068bdb7cfd..a7ab77894b 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.h +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.h @@ -295,6 +295,21 @@ protected: float _accum; }; +class NodeNormalizedPositionBugTest : public TestCocosNodeDemo +{ +public: + CREATE_FUNC(NodeNormalizedPositionBugTest); + virtual std::string title() const override; + virtual std::string subtitle() const override; + +protected: + NodeNormalizedPositionBugTest(); + + void update(float dt); + float _accum; + Sprite *sprite; +}; + class NodeNameTest : public TestCocosNodeDemo { public: From ed849a186389de4a6b82e4021732d5014bae56ab Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 3 Sep 2014 11:34:40 +0800 Subject: [PATCH 24/41] fix: win32 cpp-tests sometimes cannot display font correctly Pass FILE_SHARE_READ to the 3rd parameter of CreateFileW. Otherwise, it may fail to get date from the font file. --- cocos/platform/win32/CCFileUtilsWin32.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/platform/win32/CCFileUtilsWin32.cpp b/cocos/platform/win32/CCFileUtilsWin32.cpp index c43339c8a7..1e174ef13e 100644 --- a/cocos/platform/win32/CCFileUtilsWin32.cpp +++ b/cocos/platform/win32/CCFileUtilsWin32.cpp @@ -147,7 +147,7 @@ static Data getData(const std::string& filename, bool forString) WCHAR wszBuf[CC_MAX_PATH] = {0}; MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf)/sizeof(wszBuf[0])); - HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, nullptr); + HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, nullptr); CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE); size = ::GetFileSize(fileHandle, nullptr); @@ -222,7 +222,7 @@ unsigned char* FileUtilsWin32::getFileData(const std::string& filename, const ch WCHAR wszBuf[CC_MAX_PATH] = {0}; MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf)/sizeof(wszBuf[0])); - HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, nullptr); + HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, nullptr); CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE); *size = ::GetFileSize(fileHandle, nullptr); From 278a3441cef5249010722c09692fcfe2123ec4d9 Mon Sep 17 00:00:00 2001 From: liuliang Date: Wed, 3 Sep 2014 11:43:42 +0800 Subject: [PATCH 25/41] Set the node name --- cocos/3d/CCSprite3D.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 8d289035ab..e2f89ecb46 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -385,6 +385,7 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m auto sprite = createSprite3DNode(nodedata,it,matrialdatas); if (sprite) { + sprite->setName(nodedata->id); if(root) { root->addChild(sprite); @@ -399,6 +400,7 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m node= Node::create(); if(node) { + node->setName(nodedata->id); node->setAdditionalTransform(&nodedata->transform); if(root) { From 2e27a6865f51fc40e9d3f2d7e445f703be7e8456 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 3 Sep 2014 14:10:38 +0800 Subject: [PATCH 26/41] update project to vs2013 --- cocos/2d/libcocos2d.vcxproj | 6 +++--- .../scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj | 6 +++--- tests/cpp-empty-test/proj.win32/cpp-empty-test.vcxproj | 6 +++--- tests/cpp-tests/proj.win32/cpp-tests.vcxproj | 6 +++--- .../project/proj.win32/lua-empty-test.vcxproj | 6 +++--- tests/lua-tests/project/proj.win32/lua-tests.win32.vcxproj | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cocos/2d/libcocos2d.vcxproj b/cocos/2d/libcocos2d.vcxproj index 108b9bc422..bb67aa5e3f 100644 --- a/cocos/2d/libcocos2d.vcxproj +++ b/cocos/2d/libcocos2d.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -24,7 +24,7 @@ v110 v110_xp v120 - v110_xp + v120_xp DynamicLibrary @@ -33,7 +33,7 @@ v110 v110_xp v120 - v110_xp + v120_xp diff --git a/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj b/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj index e84501f6f1..3775b75bee 100644 --- a/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj +++ b/cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -208,7 +208,7 @@ v110 v110_xp v120 - v110_xp + v120_xp StaticLibrary @@ -217,7 +217,7 @@ v110 v110_xp v120 - v110_xp + v120_xp diff --git a/tests/cpp-empty-test/proj.win32/cpp-empty-test.vcxproj b/tests/cpp-empty-test/proj.win32/cpp-empty-test.vcxproj index 4bc89fa9de..22c42ff781 100644 --- a/tests/cpp-empty-test/proj.win32/cpp-empty-test.vcxproj +++ b/tests/cpp-empty-test/proj.win32/cpp-empty-test.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -24,7 +24,7 @@ v110 v110_xp v120 - v110_xp + v120_xp Application @@ -33,7 +33,7 @@ v110 v110_xp v120 - v110_xp + v120_xp diff --git a/tests/cpp-tests/proj.win32/cpp-tests.vcxproj b/tests/cpp-tests/proj.win32/cpp-tests.vcxproj index 1fa1eec21b..f5612208c7 100644 --- a/tests/cpp-tests/proj.win32/cpp-tests.vcxproj +++ b/tests/cpp-tests/proj.win32/cpp-tests.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -24,7 +24,7 @@ v110 v110_xp v120 - v110_xp + v120_xp Application @@ -33,7 +33,7 @@ v110 v110_xp v120 - v110_xp + v120_xp diff --git a/tests/lua-empty-test/project/proj.win32/lua-empty-test.vcxproj b/tests/lua-empty-test/project/proj.win32/lua-empty-test.vcxproj index 7d24ad16dc..a9dbfd77e9 100644 --- a/tests/lua-empty-test/project/proj.win32/lua-empty-test.vcxproj +++ b/tests/lua-empty-test/project/proj.win32/lua-empty-test.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -22,7 +22,7 @@ v110 v110_xp v120 - v110_xp + v120_xp Application @@ -31,7 +31,7 @@ v110 v110_xp v120 - v110_xp + v120_xp diff --git a/tests/lua-tests/project/proj.win32/lua-tests.win32.vcxproj b/tests/lua-tests/project/proj.win32/lua-tests.win32.vcxproj index f4592847dd..547770c554 100644 --- a/tests/lua-tests/project/proj.win32/lua-tests.win32.vcxproj +++ b/tests/lua-tests/project/proj.win32/lua-tests.win32.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -23,7 +23,7 @@ v110 v110_xp v120 - v110_xp + v120_xp Application @@ -33,7 +33,7 @@ v110 v110_xp v120 - v110_xp + v120_xp From c167ed17ee63c019f2f20f15b9ee95880544d1fd Mon Sep 17 00:00:00 2001 From: liuliang Date: Wed, 3 Sep 2014 15:55:11 +0800 Subject: [PATCH 27/41] Set the node name --- cocos/3d/CCSprite3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index e2f89ecb46..ed9a3baf89 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -231,6 +231,7 @@ Sprite3D* Sprite3D::createSprite3DNode(NodeData* nodedata,ModelData* modeldata,c auto sprite = new (std::nothrow) Sprite3D(); if (sprite) { + sprite->setName(nodedata->id); auto mesh = Mesh::create(nodedata->id, getMeshIndexData(modeldata->subMeshId)); if (modeldata->matrialId == "" && matrialdatas.materials.size()) { @@ -385,7 +386,6 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m auto sprite = createSprite3DNode(nodedata,it,matrialdatas); if (sprite) { - sprite->setName(nodedata->id); if(root) { root->addChild(sprite); From 87af0ecdd69b76cf499e314068d57d30b5645920 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 3 Sep 2014 17:37:34 +0800 Subject: [PATCH 28/41] add back libbox2d and libspine project to our solution --- build/cocos2d-win32.vc2012.sln | 40 ++++- cocos/2d/cocos2d_headers.props | 3 + cocos/2d/cocos2dx.props | 5 +- cocos/2d/libcocos2d.vcxproj | 17 +- .../spine/proj.win32/libSpine.vcxproj | 152 ++++++++++++++++ .../spine/proj.win32/libSpine.vcxproj.filters | 170 ++++++++++++++++++ 6 files changed, 379 insertions(+), 8 deletions(-) create mode 100644 cocos/editor-support/spine/proj.win32/libSpine.vcxproj create mode 100644 cocos/editor-support/spine/proj.win32/libSpine.vcxproj.filters diff --git a/build/cocos2d-win32.vc2012.sln b/build/cocos2d-win32.vc2012.sln index f23109c90c..45dcf34217 100644 --- a/build/cocos2d-win32.vc2012.sln +++ b/build/cocos2d-win32.vc2012.sln @@ -1,6 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-tests", "..\tests\cpp-tests\proj.win32\cpp-tests.vcxproj", "{76A39BB2-9B84-4C65-98A5-654D86B86F2A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua-tests", "..\tests\lua-tests\project\proj.win32\lua-tests.win32.vcxproj", "{4E6A7A0E-DDD8-4BAA-8B22-C964069364ED}" @@ -13,40 +15,76 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcocos2d", "..\cocos\2d\l EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libluacocos2d", "..\cocos\scripting\lua-bindings\proj.win32\libluacocos2d.vcxproj", "{9F2D6CE6-C893-4400-B50C-6DB70CC2562F}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbox2d", "..\external\Box2D\proj.win32\libbox2d.vcxproj", "{929480E7-23C0-4DF6-8456-096D71547116}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "External", "External", "{92D54E36-7916-48EF-A951-224DD3B25442}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libSpine", "..\cocos\editor-support\spine\proj.win32\libSpine.vcxproj", "{B7C2A162-DEC9-4418-972E-240AB3CBFCAE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {76A39BB2-9B84-4C65-98A5-654D86B86F2A}.Debug|ARM.ActiveCfg = Debug|Win32 {76A39BB2-9B84-4C65-98A5-654D86B86F2A}.Debug|Win32.ActiveCfg = Debug|Win32 {76A39BB2-9B84-4C65-98A5-654D86B86F2A}.Debug|Win32.Build.0 = Debug|Win32 + {76A39BB2-9B84-4C65-98A5-654D86B86F2A}.Release|ARM.ActiveCfg = Release|Win32 {76A39BB2-9B84-4C65-98A5-654D86B86F2A}.Release|Win32.ActiveCfg = Release|Win32 {76A39BB2-9B84-4C65-98A5-654D86B86F2A}.Release|Win32.Build.0 = Release|Win32 + {4E6A7A0E-DDD8-4BAA-8B22-C964069364ED}.Debug|ARM.ActiveCfg = Debug|Win32 {4E6A7A0E-DDD8-4BAA-8B22-C964069364ED}.Debug|Win32.ActiveCfg = Debug|Win32 {4E6A7A0E-DDD8-4BAA-8B22-C964069364ED}.Debug|Win32.Build.0 = Debug|Win32 + {4E6A7A0E-DDD8-4BAA-8B22-C964069364ED}.Release|ARM.ActiveCfg = Release|Win32 {4E6A7A0E-DDD8-4BAA-8B22-C964069364ED}.Release|Win32.ActiveCfg = Release|Win32 {4E6A7A0E-DDD8-4BAA-8B22-C964069364ED}.Release|Win32.Build.0 = Release|Win32 + {B8BF9E81-35FD-4582-BA1C-B85FA365BABB}.Debug|ARM.ActiveCfg = Debug|Win32 {B8BF9E81-35FD-4582-BA1C-B85FA365BABB}.Debug|Win32.ActiveCfg = Debug|Win32 {B8BF9E81-35FD-4582-BA1C-B85FA365BABB}.Debug|Win32.Build.0 = Debug|Win32 + {B8BF9E81-35FD-4582-BA1C-B85FA365BABB}.Release|ARM.ActiveCfg = Release|Win32 {B8BF9E81-35FD-4582-BA1C-B85FA365BABB}.Release|Win32.ActiveCfg = Release|Win32 {B8BF9E81-35FD-4582-BA1C-B85FA365BABB}.Release|Win32.Build.0 = Release|Win32 + {13E55395-94A2-4CD9-BFC2-1A051F80C17D}.Debug|ARM.ActiveCfg = Debug|Win32 {13E55395-94A2-4CD9-BFC2-1A051F80C17D}.Debug|Win32.ActiveCfg = Debug|Win32 {13E55395-94A2-4CD9-BFC2-1A051F80C17D}.Debug|Win32.Build.0 = Debug|Win32 + {13E55395-94A2-4CD9-BFC2-1A051F80C17D}.Release|ARM.ActiveCfg = Release|Win32 {13E55395-94A2-4CD9-BFC2-1A051F80C17D}.Release|Win32.ActiveCfg = Release|Win32 {13E55395-94A2-4CD9-BFC2-1A051F80C17D}.Release|Win32.Build.0 = Release|Win32 + {98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Debug|ARM.ActiveCfg = Debug|Win32 {98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Debug|Win32.ActiveCfg = Debug|Win32 {98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Debug|Win32.Build.0 = Debug|Win32 + {98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Release|ARM.ActiveCfg = Release|Win32 {98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Release|Win32.ActiveCfg = Release|Win32 {98A51BA8-FC3A-415B-AC8F-8C7BD464E93E}.Release|Win32.Build.0 = Release|Win32 + {9F2D6CE6-C893-4400-B50C-6DB70CC2562F}.Debug|ARM.ActiveCfg = Debug|Win32 {9F2D6CE6-C893-4400-B50C-6DB70CC2562F}.Debug|Win32.ActiveCfg = Debug|Win32 {9F2D6CE6-C893-4400-B50C-6DB70CC2562F}.Debug|Win32.Build.0 = Debug|Win32 + {9F2D6CE6-C893-4400-B50C-6DB70CC2562F}.Release|ARM.ActiveCfg = Release|Win32 {9F2D6CE6-C893-4400-B50C-6DB70CC2562F}.Release|Win32.ActiveCfg = Release|Win32 {9F2D6CE6-C893-4400-B50C-6DB70CC2562F}.Release|Win32.Build.0 = Release|Win32 + {929480E7-23C0-4DF6-8456-096D71547116}.Debug|ARM.ActiveCfg = Debug|Win32 + {929480E7-23C0-4DF6-8456-096D71547116}.Debug|Win32.ActiveCfg = Debug|Win32 + {929480E7-23C0-4DF6-8456-096D71547116}.Debug|Win32.Build.0 = Debug|Win32 + {929480E7-23C0-4DF6-8456-096D71547116}.Release|ARM.ActiveCfg = Release|Win32 + {929480E7-23C0-4DF6-8456-096D71547116}.Release|Win32.ActiveCfg = Release|Win32 + {929480E7-23C0-4DF6-8456-096D71547116}.Release|Win32.Build.0 = Release|Win32 + {B7C2A162-DEC9-4418-972E-240AB3CBFCAE}.Debug|ARM.ActiveCfg = Debug|Win32 + {B7C2A162-DEC9-4418-972E-240AB3CBFCAE}.Debug|Win32.ActiveCfg = Debug|Win32 + {B7C2A162-DEC9-4418-972E-240AB3CBFCAE}.Debug|Win32.Build.0 = Debug|Win32 + {B7C2A162-DEC9-4418-972E-240AB3CBFCAE}.Release|ARM.ActiveCfg = Release|Win32 + {B7C2A162-DEC9-4418-972E-240AB3CBFCAE}.Release|Win32.ActiveCfg = Release|Win32 + {B7C2A162-DEC9-4418-972E-240AB3CBFCAE}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {929480E7-23C0-4DF6-8456-096D71547116} = {92D54E36-7916-48EF-A951-224DD3B25442} + {B7C2A162-DEC9-4418-972E-240AB3CBFCAE} = {92D54E36-7916-48EF-A951-224DD3B25442} + EndGlobalSection GlobalSection(DPCodeReviewSolutionGUID) = preSolution DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} EndGlobalSection diff --git a/cocos/2d/cocos2d_headers.props b/cocos/2d/cocos2d_headers.props index afdcd49a10..596cc3f6c2 100644 --- a/cocos/2d/cocos2d_headers.props +++ b/cocos/2d/cocos2d_headers.props @@ -10,6 +10,9 @@ $(EngineRoot)cocos;$(EngineRoot)cocos\platform\win32;$(EngineRoot)cocos\platform\desktop;$(EngineRoot)external\glfw3\include\win32;$(EngineRoot)external\win32-specific\gles\include\OGLES _VARIADIC_MAX=10;%(PreprocessorDefinitions) + + true + diff --git a/cocos/2d/cocos2dx.props b/cocos/2d/cocos2dx.props index 543f4ab5cc..d20aeccf80 100644 --- a/cocos/2d/cocos2dx.props +++ b/cocos/2d/cocos2dx.props @@ -7,11 +7,14 @@ - opengl32.lib;glew32.lib;libzlib.lib;libpng.lib;libjpeg.lib;libtiff.lib;libwebp.lib;libiconv.lib;glfw3.lib;freetype250.lib;winmm.lib;ws2_32.lib;libchipmunk.lib;libbox2d.lib;libspine.lib;%(AdditionalDependencies) + opengl32.lib;glew32.lib;libzlib.lib;libpng.lib;libjpeg.lib;libtiff.lib;libwebp.lib;libiconv.lib;glfw3.lib;freetype250.lib;winmm.lib;ws2_32.lib;libchipmunk.lib;libbox2d.lib;libSpine.lib;%(AdditionalDependencies) $(OutDir);%(AdditionalLibraryDirectories) false + + true + \ No newline at end of file diff --git a/cocos/2d/libcocos2d.vcxproj b/cocos/2d/libcocos2d.vcxproj index bb67aa5e3f..0b27c0edae 100644 --- a/cocos/2d/libcocos2d.vcxproj +++ b/cocos/2d/libcocos2d.vcxproj @@ -77,7 +77,7 @@ Disabled - $(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A\include;$(EngineRoot)external\sqlite3\include;$(EngineRoot)external\unzip;$(EngineRoot)external\edtaa3func;$(EngineRoot)external\tinyxml2;$(EngineRoot)external\png\include\win32;$(EngineRoot)external\jpeg\include\win32;$(EngineRoot)external\tiff\include\win32;$(EngineRoot)external\webp\include\win32;$(EngineRoot)external\freetype2\include\win32;$(EngineRoot)external\win32-specific\icon\include;$(EngineRoot)external\win32-specific\zlib\include;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)external\xxhash;$(EngineRoot)external\ConvertUTF;$(EngineRoot)external\Box2d;$(EngineRoot)external\curl\include\win32;$(EngineRoot)external\websockets\include\win32;$(EngineRoot)external;$(EngineRoot)cocos;$(EngineRoot)cocos\editor-support;$(EngineRoot)cocos\audio\include;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories) + $(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A\include;$(EngineRoot)external\box2d;$(EngineRoot)external\sqlite3\include;$(EngineRoot)external\unzip;$(EngineRoot)external\edtaa3func;$(EngineRoot)external\tinyxml2;$(EngineRoot)external\png\include\win32;$(EngineRoot)external\jpeg\include\win32;$(EngineRoot)external\tiff\include\win32;$(EngineRoot)external\webp\include\win32;$(EngineRoot)external\freetype2\include\win32;$(EngineRoot)external\win32-specific\icon\include;$(EngineRoot)external\win32-specific\zlib\include;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)external\xxhash;$(EngineRoot)external\ConvertUTF;$(EngineRoot)external\curl\include\win32;$(EngineRoot)external\websockets\include\win32;$(EngineRoot)external;$(EngineRoot)cocos;$(EngineRoot)cocos\editor-support;$(EngineRoot)cocos\audio\include;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories) WIN32;_USRDLL;_DEBUG;_WINDOWS;_LIB;COCOS2DXWIN32_EXPORTS;GL_GLEXT_PROTOTYPES;COCOS2D_DEBUG=1;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_USE3DDLL;_EXPORT_DLL_;_USRSTUDIODLL;_USREXDLL;_USEGUIDLL;CC_ENABLE_CHIPMUNK_INTEGRATION=1;%(PreprocessorDefinitions) false EnableFastChecks @@ -104,9 +104,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\zlib\prebuilt\*.*" "$(Ou xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\icon\prebuilt\*.*" "$(OutDir)" xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\gles\prebuilt\*.*" "$(OutDir)" xcopy /Y /Q "$(ProjectDir)..\..\external\sqlite3\libraries\win32\*.*" "$(OutDir)" -xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\chipmunk\prebuilt\debug-lib\*.*" "$(OutDir)" -xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\box2d\prebuilt\debug-lib\*.*" "$(OutDir)" -xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\spine\prebuilt\debug-lib\*.*" "$(OutDir)" +xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\chipmunk\prebuilt\debug-lib\*.*" "$(OutDir)" $(OutDir)$(ProjectName).dll @@ -158,8 +156,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\zlib\prebuilt\*.*" "$(Ou xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\icon\prebuilt\*.*" "$(OutDir)" xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\gles\prebuilt\*.*" "$(OutDir)" xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\chipmunk\prebuilt\release-lib\*.*" "$(OutDir)" -xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\box2d\prebuilt\release-lib\*.*" "$(OutDir)" -xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\spine\prebuilt\release-lib\*.*" "$(OutDir)" + sqlite3.lib;libcurl_imp.lib;websockets.lib;%(AdditionalDependencies) @@ -887,6 +884,14 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\spine\prebuilt\release-l + + + {929480e7-23c0-4df6-8456-096d71547116} + + + {b7c2a162-dec9-4418-972e-240ab3cbfcae} + + diff --git a/cocos/editor-support/spine/proj.win32/libSpine.vcxproj b/cocos/editor-support/spine/proj.win32/libSpine.vcxproj new file mode 100644 index 0000000000..2f033657b8 --- /dev/null +++ b/cocos/editor-support/spine/proj.win32/libSpine.vcxproj @@ -0,0 +1,152 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {B7C2A162-DEC9-4418-972E-240AB3CBFCAE} + libSpine + + + + StaticLibrary + true + v100 + v110 + v110_xp + v120 + v120_xp + Unicode + + + StaticLibrary + false + v100 + v110 + v110_xp + v120 + v120_xp + true + Unicode + + + + + + + + + + + + + + + $(SolutionDir)$(Configuration).win32\ + $(Configuration).win32\ + + + $(SolutionDir)$(Configuration).win32\ + $(Configuration).win32\ + + + + Level3 + Disabled + + + $(EngineRoot);$(EngineRoot)cocos\audio\include;$(EngineRoot)cocos\editor-support;$(EngineRoot)extensions;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_LIB;COCOS2DXWIN32_EXPORTS;GL_GLEXT_PROTOTYPES;COCOS2D_DEBUG=1;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + 4267;4251;4244;%(DisableSpecificWarnings) + false + + + true + + + + + Level3 + MinSpace + true + true + + + WIN32;_WINDOWS;_LIB;COCOS2DXWIN32_EXPORTS;GL_GLEXT_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(EngineRoot);$(EngineRoot)cocos\audio\include;$(EngineRoot)cocos\editor-support;$(EngineRoot)extensions;%(AdditionalIncludeDirectories) + None + false + + + true + true + true + + + + + + \ No newline at end of file diff --git a/cocos/editor-support/spine/proj.win32/libSpine.vcxproj.filters b/cocos/editor-support/spine/proj.win32/libSpine.vcxproj.filters new file mode 100644 index 0000000000..a6f105d4bc --- /dev/null +++ b/cocos/editor-support/spine/proj.win32/libSpine.vcxproj.filters @@ -0,0 +1,170 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file From 925fb9aa38e8ee3f578f9c1282cee17f61af179e Mon Sep 17 00:00:00 2001 From: Kezhu Wang Date: Tue, 24 Jun 2014 23:01:15 +0800 Subject: [PATCH 29/41] bugfix: condition variable sleep on unrelated mutex --- cocos/network/HttpClient.cpp | 53 +++++++++++++----------------------- 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/cocos/network/HttpClient.cpp b/cocos/network/HttpClient.cpp index c2a0440b99..4640258c2a 100644 --- a/cocos/network/HttpClient.cpp +++ b/cocos/network/HttpClient.cpp @@ -47,16 +47,13 @@ namespace network { static std::mutex s_requestQueueMutex; static std::mutex s_responseQueueMutex; -static std::mutex s_SleepMutex; -static std::condition_variable s_SleepCondition; +static std::condition_variable_any s_SleepCondition; #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) typedef int int32_t; #endif -static bool s_need_quit = false; - static Vector* s_requestQueue = nullptr; static Vector* s_responseQueue = nullptr; @@ -102,43 +99,31 @@ static int processDeleteTask(HttpRequest *request, write_callback callback, void // int processDownloadTask(HttpRequest *task, write_callback callback, void *stream, int32_t *errorCode); static void processResponse(HttpResponse* response, char* errorBuffer); +static HttpRequest *s_requestSentinel = new HttpRequest; + // Worker thread void HttpClient::networkThread() { - HttpRequest *request = nullptr; - auto scheduler = Director::getInstance()->getScheduler(); while (true) { - if (s_need_quit) - { - break; - } - + HttpRequest *request; + // step 1: send http request if the requestQueue isn't empty - request = nullptr; - - s_requestQueueMutex.lock(); - - //Get request task from queue - - if (!s_requestQueue->empty()) { + std::lock_guard lock(s_requestQueueMutex); + while (s_requestQueue->empty()) { + s_SleepCondition.wait(s_requestQueueMutex); + } request = s_requestQueue->at(0); s_requestQueue->erase(0); } - - s_requestQueueMutex.unlock(); - - if (nullptr == request) - { - // Wait for http request tasks from main thread - std::unique_lock lk(s_SleepMutex); - s_SleepCondition.wait(lk); - continue; + + if (request == s_requestSentinel) { + break; } - + // step 2: libcurl sync access // Create a HttpResponse object, the default setting is http access failed @@ -462,12 +447,14 @@ HttpClient::HttpClient() HttpClient::~HttpClient() { - s_need_quit = true; - if (s_requestQueue != nullptr) { + { + std::lock_guard lock(s_requestQueueMutex); + s_requestQueue->pushBack(s_requestSentinel); + } s_SleepCondition.notify_one(); } - + s_pHttpClient = nullptr; } @@ -480,9 +467,7 @@ bool HttpClient::lazyInitThreadSemphore() s_requestQueue = new (std::nothrow) Vector(); s_responseQueue = new (std::nothrow) Vector(); - - s_need_quit = false; - + auto t = std::thread(CC_CALLBACK_0(HttpClient::networkThread, this)); t.detach(); } From 14853d46f28788e4c37c2be0f7fc653ddc95c5ef Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 17 Jun 2014 14:18:37 +0400 Subject: [PATCH 30/41] setPlaceholderFontSize fix --- cocos/ui/UIEditBox/UIEditBox.cpp | 2 +- cocos/ui/UIEditBox/UIEditBoxImplIOS.mm | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/cocos/ui/UIEditBox/UIEditBox.cpp b/cocos/ui/UIEditBox/UIEditBox.cpp index 27e4ccc95b..6ef69b9e74 100644 --- a/cocos/ui/UIEditBox/UIEditBox.cpp +++ b/cocos/ui/UIEditBox/UIEditBox.cpp @@ -268,7 +268,7 @@ void EditBox::setPlaceholderFontSize(int fontSize) _placeholderFontSize = fontSize; if (_editBoxImpl != nullptr && _placeholderFontName.length() > 0) { - _editBoxImpl->setPlaceholderFont(_placeholderFontName.c_str(), _fontSize); + _editBoxImpl->setPlaceholderFont(_placeholderFontName.c_str(), fontSize); } } diff --git a/cocos/ui/UIEditBox/UIEditBoxImplIOS.mm b/cocos/ui/UIEditBox/UIEditBoxImplIOS.mm index d78dd0c765..a2456ed125 100644 --- a/cocos/ui/UIEditBox/UIEditBoxImplIOS.mm +++ b/cocos/ui/UIEditBox/UIEditBoxImplIOS.mm @@ -395,8 +395,6 @@ void EditBoxImplIOS::setFont(const char* pFontName, int fontSize) _label->setSystemFontName(pFontName); _label->setSystemFontSize(fontSize); - _labelPlaceHolder->setSystemFontName(pFontName); - _labelPlaceHolder->setSystemFontSize(fontSize); } void EditBoxImplIOS::setFontColor(const Color3B& color) @@ -407,7 +405,8 @@ void EditBoxImplIOS::setFontColor(const Color3B& color) void EditBoxImplIOS::setPlaceholderFont(const char* pFontName, int fontSize) { - // TODO: need to be implemented. + _labelPlaceHolder->setSystemFontName(pFontName); + _labelPlaceHolder->setSystemFontSize(fontSize); } void EditBoxImplIOS::setPlaceholderFontColor(const Color3B& color) From cef9a21324eb862afa96aea3f99a0ba320c007c4 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 4 Sep 2014 10:10:26 +0800 Subject: [PATCH 31/41] [ci skip] --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index bfe066429f..58c9390ddf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,7 @@ cocos2d-x-3.3?? ?? [FIX] EditBox: moved to ui:EditBox [FIX] Node: create unneeded temple `Vec2` object in `setPosition(int, int)`, `setPositionX()` and `setPositionY()` [FIX] Node: skew effect is wrong + [FIX] Node: setNormalizedPosition can not take effect if parent position is not changed [FIX] TextureAtlas: may crash if only drawing part of it cocos2d-x-3.3alpha0 Aug.28 2014 From 345167236519aabc3a35e84aaa6a8347d8cfa55d Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 4 Sep 2014 10:49:45 +0800 Subject: [PATCH 32/41] restore some configs --- cocos/2d/cocos2d_headers.props | 2 +- cocos/2d/cocos2dx.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/2d/cocos2d_headers.props b/cocos/2d/cocos2d_headers.props index 596cc3f6c2..aaaefd1c7d 100644 --- a/cocos/2d/cocos2d_headers.props +++ b/cocos/2d/cocos2d_headers.props @@ -11,7 +11,7 @@ _VARIADIC_MAX=10;%(PreprocessorDefinitions) - true + false diff --git a/cocos/2d/cocos2dx.props b/cocos/2d/cocos2dx.props index d20aeccf80..a0a234ee9f 100644 --- a/cocos/2d/cocos2dx.props +++ b/cocos/2d/cocos2dx.props @@ -13,7 +13,7 @@ - true + false From 071aedaa51990228e743bb96d9bda27abb1ff351 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 4 Sep 2014 02:56:25 +0000 Subject: [PATCH 33/41] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index ff4f386aa0..fce55eac65 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -4030,6 +4030,8 @@ "cocos/scripting/lua-bindings/manual/cocosbuilder/lua_cocos2dx_cocosbuilder_manual.h", "cocos/scripting/lua-bindings/manual/cocosdenshion/lua_cocos2dx_cocosdenshion_manual.cpp", "cocos/scripting/lua-bindings/manual/cocosdenshion/lua_cocos2dx_cocosdenshion_manual.h", + "cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.cpp", + "cocos/scripting/lua-bindings/manual/cocostudio/CustomGUIReader.h", "cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.cpp", "cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_coco_studio_manual.hpp", "cocos/scripting/lua-bindings/manual/controller/lua_cocos2dx_controller_manual.cpp", From a1edd4a819d5946ca5f9b21f6d55e2ca08487234 Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 4 Sep 2014 10:07:46 +0800 Subject: [PATCH 34/41] remove dead code --- .../cocostudio/CCActionNode.cpp | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCActionNode.cpp b/cocos/editor-support/cocostudio/CCActionNode.cpp index d1dfa4f438..aa30b2b2fe 100644 --- a/cocos/editor-support/cocostudio/CCActionNode.cpp +++ b/cocos/editor-support/cocostudio/CCActionNode.cpp @@ -313,18 +313,14 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) } void ActionNode::initActionNodeFromRoot(Ref* root) -{ - Node* rootNode = dynamic_cast(root); - if (rootNode != nullptr) +{ + Widget* rootWidget = dynamic_cast(root); + if (rootWidget != nullptr) { - Widget* rootWidget = dynamic_cast(root); - if (rootWidget != nullptr) + Widget* widget = Helper::seekActionWidgetByActionTag(rootWidget, getActionTag()); + if (widget != nullptr) { - Widget* widget = Helper::seekActionWidgetByActionTag(rootWidget, getActionTag()); - if (widget != nullptr) - { - setObject(widget); - } + setObject(widget); } } } @@ -367,14 +363,6 @@ Node* ActionNode::getActionNode() { return cNode; } - else - { - Widget* rootWidget = dynamic_cast(_object); - if (rootWidget != nullptr) - { - return rootWidget; - } - } return nullptr; } From 64d926a75f0c837d947298e854823a51ba2881df Mon Sep 17 00:00:00 2001 From: Dhilan007 Date: Thu, 4 Sep 2014 11:04:50 +0800 Subject: [PATCH 35/41] fix compile error on android. --- .../android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java index ea102e7f73..ebbc5bdc75 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java @@ -91,7 +91,6 @@ public class Cocos2dxHelper { Cocos2dxHelper.nativeSetContext((Context)activity, Cocos2dxHelper.sAssetManager); Cocos2dxBitmap.setContext(activity); - Cocos2dxETCLoader.setContext(activity); sActivity = activity; sInited = true; From 6f03e97a6d9445dc7998447a4f9c44368ca0d6e8 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Thu, 4 Sep 2014 11:20:43 +0800 Subject: [PATCH 36/41] add trianglesCommand head file to cocos2d remove invoking of base class constructor --- cocos/cocos2d.h | 1 + cocos/renderer/CCQuadCommand.cpp | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/cocos2d.h b/cocos/cocos2d.h index 0bd428f97d..4f06a692d7 100644 --- a/cocos/cocos2d.h +++ b/cocos/cocos2d.h @@ -158,6 +158,7 @@ THE SOFTWARE. #include "renderer/CCVertexIndexData.h" #include "renderer/CCPrimitive.h" #include "renderer/CCPrimitiveCommand.h" +#include "renderer/CCTrianglesCommand.h" // physics #include "physics/CCPhysicsBody.h" diff --git a/cocos/renderer/CCQuadCommand.cpp b/cocos/renderer/CCQuadCommand.cpp index 128d69f3ee..5b910e7e89 100644 --- a/cocos/renderer/CCQuadCommand.cpp +++ b/cocos/renderer/CCQuadCommand.cpp @@ -33,8 +33,7 @@ NS_CC_BEGIN QuadCommand::QuadCommand() -:TrianglesCommand() -,_quads(nullptr) +:_quads(nullptr) ,_quadsCount(0) { _type = RenderCommand::Type::QUAD_COMMAND; From 9cd21f19c9797e682e810c3b25b4729025628c9c Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 4 Sep 2014 13:39:17 +0800 Subject: [PATCH 37/41] [ci skip] --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 58c9390ddf..f422026bd4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ cocos2d-x-3.3?? ?? [NEW] UI: added `WebView` on iOS and Android [FIX] EditBox: moved to ui:EditBox + [FIX] HttpClient: condition variable sleep on unrelated mutex [FIX] Node: create unneeded temple `Vec2` object in `setPosition(int, int)`, `setPositionX()` and `setPositionY()` [FIX] Node: skew effect is wrong [FIX] Node: setNormalizedPosition can not take effect if parent position is not changed From a416eb72980a8b7e87ea2fa4c619992680e2102d Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 4 Sep 2014 13:40:40 +0800 Subject: [PATCH 38/41] [ci skip] --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index ba8e4686d9..a5b107d9d3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -896,6 +896,7 @@ Developers: kezhuw AutoReleasePool manager improvement + Fixed a bug that condition variable sleep on unrelated mutex in HttpClient zhouxiaoxiaoxujian Added TextField::getStringLength() From 4b21972d8bd0a17475944bcaefa07a378271633b Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 4 Sep 2014 05:42:22 +0000 Subject: [PATCH 39/41] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index fce55eac65..e178a7ff23 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -640,6 +640,8 @@ "cocos/editor-support/spine/SlotData.h", "cocos/editor-support/spine/extension.cpp", "cocos/editor-support/spine/extension.h", + "cocos/editor-support/spine/proj.win32/libSpine.vcxproj", + "cocos/editor-support/spine/proj.win32/libSpine.vcxproj.filters", "cocos/editor-support/spine/proj.wp8/libSpine.vcxproj", "cocos/editor-support/spine/proj.wp8/libSpine.vcxproj.filters", "cocos/editor-support/spine/proj.wp8/libSpine.vcxproj.user", From 6bd05770e712e437dd13cbbcc04d5d92537f590b Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 4 Sep 2014 06:00:43 +0000 Subject: [PATCH 40/41] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 7f7f746beb..8371a753c1 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -935,8 +935,6 @@ "cocos/renderer/CCPrimitive.h", "cocos/renderer/CCPrimitiveCommand.cpp", "cocos/renderer/CCPrimitiveCommand.h", - "cocos/renderer/CCTrianglesCommand.cpp", - "cocos/renderer/CCTrianglesCommand.h", "cocos/renderer/CCQuadCommand.cpp", "cocos/renderer/CCQuadCommand.h", "cocos/renderer/CCRenderCommand.cpp", @@ -950,6 +948,8 @@ "cocos/renderer/CCTextureAtlas.h", "cocos/renderer/CCTextureCache.cpp", "cocos/renderer/CCTextureCache.h", + "cocos/renderer/CCTrianglesCommand.cpp", + "cocos/renderer/CCTrianglesCommand.h", "cocos/renderer/CCVertexIndexBuffer.cpp", "cocos/renderer/CCVertexIndexBuffer.h", "cocos/renderer/CCVertexIndexData.cpp", From d26446c73f2da251c6992e3d8019cc7079fddd34 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 4 Sep 2014 14:02:20 +0800 Subject: [PATCH 41/41] [ci skip] --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index f422026bd4..93ed0c39b6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ cocos2d-x-3.3?? ?? [NEW] ActionManager: added removeAllActionsByTag() [NEW] Node: added stopAllActionsByTag() + [NEW] Renderer: added TriangleCommand [NEW] UI: added `WebView` on iOS and Android [FIX] EditBox: moved to ui:EditBox