From 9134e5e4c512f833b9e967af555357edbf436508 Mon Sep 17 00:00:00 2001 From: Timothy Zhang Date: Thu, 29 May 2014 05:44:39 +0000 Subject: [PATCH 001/241] cc_utf8_to_utf16 doesn't work correctly if length!=-1 and the given char* is not zero-terminated or contains zero. --- cocos/base/ccUTF8.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cocos/base/ccUTF8.cpp b/cocos/base/ccUTF8.cpp index fd9514f4c9a2..6e770a74f674 100644 --- a/cocos/base/ccUTF8.cpp +++ b/cocos/base/ccUTF8.cpp @@ -248,7 +248,8 @@ unsigned short* cc_utf8_to_utf16(const char* str_old, int length/* = -1*/, int* unsigned short* ret = nullptr; std::u16string outUtf16; - bool succeed = StringUtils::UTF8ToUTF16(str_old, outUtf16); + std::string inUtf8 = length == -1 ? std::string(str_old) : std::string(str_old, length); + bool succeed = StringUtils::UTF8ToUTF16(inUtf8, outUtf16); if (succeed) { From acf6dbc77c61a9e14f2072c7b126b748aeb74a83 Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Fri, 8 Apr 2016 08:26:18 -0700 Subject: [PATCH 002/241] updated version and filesize --- external/config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/external/config.json b/external/config.json index 852833ab5ac6..371ced1dac02 100644 --- a/external/config.json +++ b/external/config.json @@ -1,6 +1,6 @@ { - "version":"v3-deps-88", - "zip_file_size":"128300879", + "version":"v3-deps-89", + "zip_file_size":"128440074", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", "move_dirs":{ From ef7f38b6a966fc2ebcebef77c9742d605c8c8199 Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 11 Apr 2016 09:36:44 +0800 Subject: [PATCH 003/241] compile v3.11 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1bccfbf9d614..01bdd7fe052b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,4 +37,4 @@ before_install: # whitelist branches: only: - - v3 + - v3.11 From 02e3fca1fad6dfe51ef5cade1ab9a81589798c12 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Mon, 11 Apr 2016 01:39:26 +0000 Subject: [PATCH 004/241] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 2caf2f3c9cf3..25171fe84159 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -2351,6 +2351,7 @@ "external/curl/include/android/curl/multi.h", "external/curl/include/android/curl/stdcheaders.h", "external/curl/include/android/curl/typecheck-gcc.h", + "external/curl/include/android/curl/types.h", "external/curl/include/ios/curl/curl.h", "external/curl/include/ios/curl/curlbuild-32.h", "external/curl/include/ios/curl/curlbuild-64.h", @@ -3204,6 +3205,7 @@ "external/websockets/include/mac/lws_config.h", "external/websockets/include/win10/libwebsockets.h", "external/websockets/include/win10/lws_config.h", + "external/websockets/include/win10/private-libwebsockets.h", "external/websockets/include/win32/libwebsockets.h", "external/websockets/include/win32/lws_config.h", "external/websockets/include/win32/win32helpers/getopt.h", @@ -3212,13 +3214,9 @@ "external/websockets/include/winrt_8.1/libwebsockets.h", "external/websockets/include/winrt_8.1/lws_config.h", "external/websockets/include/winrt_8.1/private-libwebsockets.h", - "external/websockets/include/winrt_8.1/win32helpers/getopt.h", - "external/websockets/include/winrt_8.1/win32helpers/gettimeofday.h", "external/websockets/include/wp_8.1/libwebsockets.h", "external/websockets/include/wp_8.1/lws_config.h", "external/websockets/include/wp_8.1/private-libwebsockets.h", - "external/websockets/include/wp_8.1/win32helpers/getopt.h", - "external/websockets/include/wp_8.1/win32helpers/gettimeofday.h", "external/websockets/prebuilt/android/Android.mk", "external/websockets/prebuilt/android/armeabi-v7a/libwebsockets.a", "external/websockets/prebuilt/android/armeabi/libwebsockets.a", From f450405d4e65a52b1137cd9ded675f236bd867e0 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Thu, 7 Apr 2016 22:30:52 +0800 Subject: [PATCH 005/241] Fix AssetsManagerEx issue with failed asset --- extensions/assets-manager/AssetsManagerEx.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/assets-manager/AssetsManagerEx.cpp b/extensions/assets-manager/AssetsManagerEx.cpp index 936dcf0b96b1..364a2bf88c14 100644 --- a/extensions/assets-manager/AssetsManagerEx.cpp +++ b/extensions/assets-manager/AssetsManagerEx.cpp @@ -850,6 +850,8 @@ void AssetsManagerEx::onError(const network::DownloadTask& task, // Found unit and add it to failed units if (unitIt != _downloadUnits.end()) { + _totalWaitToDownload--; + DownloadUnit unit = unitIt->second; _failedUnits.emplace(unit.customId, unit); } From bb2cfc7308ff57640848789bd7928defe9fdf29e Mon Sep 17 00:00:00 2001 From: pandamicro Date: Thu, 7 Apr 2016 22:36:29 +0800 Subject: [PATCH 006/241] Update engine version --- cocos/scripting/js-bindings/manual/ScriptingCore.h | 2 +- docs/doxygen.config | 2 +- .../frameworks/runtime-src/proj.ios_mac/mac/Info.plist | 2 +- tools/simulator/frameworks/runtime-src/proj.win32/game.rc | 2 +- web | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.h b/cocos/scripting/js-bindings/manual/ScriptingCore.h index 6768f15496ca..586cb783175c 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.h +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.h @@ -40,7 +40,7 @@ #include #include -#define ENGINE_VERSION "Cocos2d-JS v3.10" +#define ENGINE_VERSION "Cocos2d-JS v3.11" void js_log(const char *format, ...); diff --git a/docs/doxygen.config b/docs/doxygen.config index 9df6c39a70c0..b1d83acdd65e 100644 --- a/docs/doxygen.config +++ b/docs/doxygen.config @@ -38,7 +38,7 @@ PROJECT_NAME = Cocos2d-x # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = v3.10 +PROJECT_NUMBER = v3.11 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/simulator/frameworks/runtime-src/proj.ios_mac/mac/Info.plist b/tools/simulator/frameworks/runtime-src/proj.ios_mac/mac/Info.plist index 70c8595a307d..a274d7ef48ef 100644 --- a/tools/simulator/frameworks/runtime-src/proj.ios_mac/mac/Info.plist +++ b/tools/simulator/frameworks/runtime-src/proj.ios_mac/mac/Info.plist @@ -41,7 +41,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.10 + 3.11 CFBundleSignature ???? CFBundleVersion diff --git a/tools/simulator/frameworks/runtime-src/proj.win32/game.rc b/tools/simulator/frameworks/runtime-src/proj.win32/game.rc index 65a3d825ec2a..20041e35261e 100755 --- a/tools/simulator/frameworks/runtime-src/proj.win32/game.rc +++ b/tools/simulator/frameworks/runtime-src/proj.win32/game.rc @@ -64,7 +64,7 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSM CAPTION "About Simulator" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - CTEXT "Version 3.10 (20151222)",IDC_ABOUT_VERSION,35,70,173,17 + CTEXT "Version 3.11 (20160330)",IDC_ABOUT_VERSION,35,70,173,17 CTEXT "Cocos Simulator",IDC_ABOUT_TITLE,35,49,173,17 CTEXT "Copyright (C) 2015. All rights reserved.",IDC_STATIC,35,94,173,17 ICON "GLFW_ICON",IDC_STATIC,111,15,20,20 diff --git a/web b/web index 8586470e65d4..9363587d5c95 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 8586470e65d43f60b06d2846bde72b384e884e5d +Subproject commit 9363587d5c95d941e25683390a3177983c4a031f From f9f95516458af9274a065d9d12f58c63c3bdf851 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Thu, 7 Apr 2016 22:40:32 +0800 Subject: [PATCH 007/241] Fix some issues 1. Action extendable in JSB 2. Fix cc.CallFunc callback parameter issue 3. Fix arrivalOrder property of Node 4. Upgrade trick for QQ browser <6.2 --- .../js-bindings/manual/cocos2d_specifics.cpp | 3 ++- .../js-bindings/script/jsb_property_apis.js | 2 +- templates/js-template-default/index.html | 14 ++++++++------ templates/js-template-runtime/index.html | 14 ++++++++------ tools/tojs/cocos2dx.ini | 2 +- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp index 871d27f3d599..fbf7b1e90042 100644 --- a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp +++ b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp @@ -841,8 +841,9 @@ static bool js_callFunc(JSContext *cx, uint32_t argc, jsval *vp) JS::RootedValue jsvalExtraData(cx, tmpCobj->getJSExtraData()); JS::RootedValue senderVal(cx); - if (sender) + if (!sender) { + sender = ret->getTarget(); js_type_class_t *nodeClass = js_get_type_from_native(sender); auto nodeObj = jsb_ref_get_or_create_jsobject(cx, sender, nodeClass, "cocos2d::Node"); senderVal.set(OBJECT_TO_JSVAL(nodeObj)); diff --git a/cocos/scripting/js-bindings/script/jsb_property_apis.js b/cocos/scripting/js-bindings/script/jsb_property_apis.js index 735ea2c1c9c3..b2e4ccf9e8c3 100644 --- a/cocos/scripting/js-bindings/script/jsb_property_apis.js +++ b/cocos/scripting/js-bindings/script/jsb_property_apis.js @@ -164,7 +164,7 @@ cc.defineGetterSetter(_proto, "shaderProgram", _proto.getShaderProgram, _proto.s cc.defineGetterSetter(_proto, "glServerState", _proto.getGLServerState, _proto.setGLServerState); cc.defineGetterSetter(_proto, "tag", _proto.getTag, _proto.setTag); cc.defineGetterSetter(_proto, "userObject", _proto.getUserObject, _proto.setUserObject); -cc.defineGetterSetter(_proto, "arrivalOrder", _proto.getArrivalOrder, _proto.setArrivalOrder); +cc.defineGetterSetter(_proto, "arrivalOrder", _proto.getOrderOfArrival, _proto.setOrderOfArrival); cc.defineGetterSetter(_proto, "opacity", _proto.getOpacity, _proto.setOpacity); cc.defineGetterSetter(_proto, "opacityModifyRGB", _proto.isOpacityModifyRGB, _proto.setOpacityModifyRGB); cc.defineGetterSetter(_proto, "cascadeOpacity", _proto.isCascadeOpacityEnabled, _proto.setCascadeOpacityEnabled); diff --git a/templates/js-template-default/index.html b/templates/js-template-default/index.html index 8d87f199eefa..a049999ace07 100644 --- a/templates/js-template-default/index.html +++ b/templates/js-template-default/index.html @@ -29,13 +29,15 @@ var ua = nav.userAgent.toLowerCase(); var uaResult = /android (\d+(?:\.\d+)+)/i.exec(ua) || /android (\d+(?:\.\d+)+)/i.exec(nav.platform); if (uaResult) { - var osVersion = parseInt(uaResult[1]) || 0; - var browserCheck = ua.match(/(qzone|micromessenger|qqbrowser)/i); + var browserCheck = ua.match(/(qzone|micromessenger|qq)(mobile)?(browser)?\/?([\d.]+)/i); if (browserCheck) { - var gameCanvas = document.getElementById("gameCanvas"); - var ctx = gameCanvas.getContext('2d'); - ctx.fillStyle = '#000000'; - ctx.fillRect(0, 0, 1, 1); + var browserVersion = parseFloat(browserCheck[4] || 0); + if (browserVer < 6.2) { + var gameCanvas = document.getElementById("gameCanvas"); + var ctx = gameCanvas.getContext('2d'); + ctx.fillStyle = '#000000'; + ctx.fillRect(0, 0, 1, 1); + } } } })(); diff --git a/templates/js-template-runtime/index.html b/templates/js-template-runtime/index.html index 8d87f199eefa..a049999ace07 100644 --- a/templates/js-template-runtime/index.html +++ b/templates/js-template-runtime/index.html @@ -29,13 +29,15 @@ var ua = nav.userAgent.toLowerCase(); var uaResult = /android (\d+(?:\.\d+)+)/i.exec(ua) || /android (\d+(?:\.\d+)+)/i.exec(nav.platform); if (uaResult) { - var osVersion = parseInt(uaResult[1]) || 0; - var browserCheck = ua.match(/(qzone|micromessenger|qqbrowser)/i); + var browserCheck = ua.match(/(qzone|micromessenger|qq)(mobile)?(browser)?\/?([\d.]+)/i); if (browserCheck) { - var gameCanvas = document.getElementById("gameCanvas"); - var ctx = gameCanvas.getContext('2d'); - ctx.fillStyle = '#000000'; - ctx.fillRect(0, 0, 1, 1); + var browserVersion = parseFloat(browserCheck[4] || 0); + if (browserVer < 6.2) { + var gameCanvas = document.getElementById("gameCanvas"); + var ctx = gameCanvas.getContext('2d'); + ctx.fillStyle = '#000000'; + ctx.fillRect(0, 0, 1, 1); + } } } })(); diff --git a/tools/tojs/cocos2dx.ini b/tools/tojs/cocos2dx.ini index 1f335d160d2d..75980c02c09d 100644 --- a/tools/tojs/cocos2dx.ini +++ b/tools/tojs/cocos2dx.ini @@ -186,7 +186,7 @@ base_classes_to_skip = Ref Clonable # classes that create no constructor # Set is special and we will use a hand-written constructor -abstract_classes = Action FiniteTimeAction ActionInterval ActionEase EaseRateAction EaseElastic EaseBounce ActionInstant GridAction Grid3DAction TiledGrid3DAction Director SpriteFrameCache TransitionEaseScene Set SimpleAudioEngine FileUtils Application GLViewProtocol GLView ComponentContainer SAXParser Configuration EventListener BaseLight AsyncTaskPool ComponentJS +abstract_classes = FiniteTimeAction ActionInterval ActionEase EaseRateAction EaseElastic EaseBounce ActionInstant GridAction Grid3DAction TiledGrid3DAction Director SpriteFrameCache TransitionEaseScene Set SimpleAudioEngine FileUtils Application GLViewProtocol GLView ComponentContainer SAXParser Configuration EventListener BaseLight AsyncTaskPool ComponentJS # Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'. script_control_cpp = yes From 150ec2e7ceb14608c21d7c9990bd0ae95674dcdd Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 7 Apr 2016 15:25:41 +0000 Subject: [PATCH 008/241] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../auto/api/jsb_cocos2dx_auto_api.js | 9 +++++ .../js-bindings/auto/jsb_cocos2dx_auto.cpp | 34 ++++++++++++++++++- .../js-bindings/auto/jsb_cocos2dx_auto.hpp | 1 + 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js index f4aca36eac39..bd3d59153b63 100644 --- a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js +++ b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js @@ -3495,6 +3495,15 @@ reverse : function ( return cc.Action; }, +/** + * @method Action + * @constructor + */ +Action : function ( +) +{ +}, + }; /** diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp index bcf13996ae45..e267a38347b0 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp @@ -8379,7 +8379,37 @@ bool js_cocos2dx_Action_reverse(JSContext *cx, uint32_t argc, jsval *vp) JS_ReportError(cx, "js_cocos2dx_Action_reverse : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } +bool js_cocos2dx_Action_constructor(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + bool ok = true; + cocos2d::Action* cobj = new (std::nothrow) cocos2d::Action(); + + js_type_class_t *typeClass = js_get_type_from_native(cobj); + + // link the native object with the javascript object + JS::RootedObject jsobj(cx, jsb_ref_create_jsobject(cx, cobj, typeClass, "cocos2d::Action")); + args.rval().set(OBJECT_TO_JSVAL(jsobj)); + if (JS_HasProperty(cx, jsobj, "_ctor", &ok) && ok) + ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(jsobj), "_ctor", args); + return true; +} +static bool js_cocos2dx_Action_ctor(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + cocos2d::Action *nobj = new (std::nothrow) cocos2d::Action(); + auto newproxy = jsb_new_proxy(nobj, obj); + jsb_ref_init(cx, &newproxy->obj, nobj, "cocos2d::Action"); + bool isFound = false; + if (JS_HasProperty(cx, obj, "_ctor", &isFound) && isFound) + ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(obj), "_ctor", args); + args.rval().setUndefined(); + return true; +} + + void js_register_cocos2dx_Action(JSContext *cx, JS::HandleObject global) { jsb_cocos2d_Action_class = (JSClass *)calloc(1, sizeof(JSClass)); jsb_cocos2d_Action_class->name = "Action"; @@ -8412,6 +8442,7 @@ void js_register_cocos2dx_Action(JSContext *cx, JS::HandleObject global) { JS_FN("setTarget", js_cocos2dx_Action_setTarget, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("isDone", js_cocos2dx_Action_isDone, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("reverse", js_cocos2dx_Action_reverse, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("ctor", js_cocos2dx_Action_ctor, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FS_END }; @@ -8421,7 +8452,7 @@ void js_register_cocos2dx_Action(JSContext *cx, JS::HandleObject global) { cx, global, JS::NullPtr(), jsb_cocos2d_Action_class, - empty_constructor, 0, + js_cocos2dx_Action_constructor, 0, // constructor properties, funcs, NULL, // no static properties @@ -8434,6 +8465,7 @@ void js_register_cocos2dx_Action(JSContext *cx, JS::HandleObject global) { JS_SetProperty(cx, proto, "__is_ref", JS::TrueHandleValue); // add the proto and JSClass to the type->js info hash table jsb_register_class(cx, jsb_cocos2d_Action_class, proto, JS::NullPtr()); + anonEvaluate(cx, global, "(function () { cc.Action.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_FiniteTimeAction_class; diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp index 26b92ce0c9b9..95f6f2f53acf 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp @@ -449,6 +449,7 @@ bool js_cocos2dx_Action_getTag(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_setTarget(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_isDone(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_reverse(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_Action_Action(JSContext *cx, uint32_t argc, jsval *vp); extern JSClass *jsb_cocos2d_FiniteTimeAction_class; extern JSObject *jsb_cocos2d_FiniteTimeAction_prototype; From 79cfe8ac0e3a46fa4031c1f752bdc875d449ec7a Mon Sep 17 00:00:00 2001 From: pandamicro Date: Thu, 7 Apr 2016 23:49:57 +0800 Subject: [PATCH 009/241] Fix a issue in cc.CallFunc JSB implementation --- .../scripting/js-bindings/manual/cocos2d_specifics.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp index fbf7b1e90042..b2db0bc3ae25 100644 --- a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp +++ b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp @@ -844,14 +844,10 @@ static bool js_callFunc(JSContext *cx, uint32_t argc, jsval *vp) if (!sender) { sender = ret->getTarget(); - js_type_class_t *nodeClass = js_get_type_from_native(sender); - auto nodeObj = jsb_ref_get_or_create_jsobject(cx, sender, nodeClass, "cocos2d::Node"); - senderVal.set(OBJECT_TO_JSVAL(nodeObj)); - } - else - { - senderVal.set(JS::NullValue()); } + js_type_class_t *nodeClass = js_get_type_from_native(sender); + auto nodeObj = jsb_ref_get_or_create_jsobject(cx, sender, nodeClass, "cocos2d::Node"); + senderVal.set(OBJECT_TO_JSVAL(nodeObj)); if (!jsvalCallback.isNullOrUndefined()) { From fea84b8af3b86ceb8a1f343131529569543bb624 Mon Sep 17 00:00:00 2001 From: Ricardo Quesada Date: Wed, 6 Apr 2016 19:14:00 -0700 Subject: [PATCH 010/241] fix: use chipmunk v6.2 API whenever possible fix: make it more compatible with chipmunk v6.2 code fix: make it more compatible with chipmunk v6.2.2 --- cocos/physics/cpCompat62.h | 8 ++++++++ .../script/chipmunk/jsb_chipmunk.js | 7 ++++++- .../js-tests/src/ChipmunkTest/ChipmunkTest.js | 18 +++++++++--------- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/cocos/physics/cpCompat62.h b/cocos/physics/cpCompat62.h index 6f0b135c4baa..36fdc7dbe573 100644 --- a/cocos/physics/cpCompat62.h +++ b/cocos/physics/cpCompat62.h @@ -27,6 +27,14 @@ // // Body // +inline cpVect cpBodyGetVelAtWorldPoint(const cpBody *body) +{ + return cpBodyGetVelocityAtWorldPoint(body); +} +inline cpVect cpBodyGetVelAtLocalPoint(const cpBody *body) +{ + return cpBodyGetVelocityAtLocalPoint(body); +} inline cpVect cpBodyGetVel(const cpBody *body) { return cpBodyGetVelocity(body); diff --git a/cocos/scripting/js-bindings/script/chipmunk/jsb_chipmunk.js b/cocos/scripting/js-bindings/script/chipmunk/jsb_chipmunk.js index 0df956c15933..d5e74fb8788e 100644 --- a/cocos/scripting/js-bindings/script/chipmunk/jsb_chipmunk.js +++ b/cocos/scripting/js-bindings/script/chipmunk/jsb_chipmunk.js @@ -150,6 +150,12 @@ cp.bb = function(l, b, r, t) { // // Body +cp.Body.prototype.getVelAtWorldPoint = function(point) { + return this.getVelocityAtWorldPoint(point); +} +cp.Body.prototype.getVelAtLocalPoint = function(point) { + return this.getVelocityAtLocalPoint(point); +} cp.Body.prototype.getVel = function() { return this.getVelocity(); } @@ -189,7 +195,6 @@ cp.Body.prototype.applyForce = function(force, point) { cp.Shape.prototype.setLayers = function(layer) { var filter = this.getFilter(); filter.mask = layer; - filter.categories.layer; this.setFilter(filter); } cp.Shape.prototype.getLayers = function() { diff --git a/tests/js-tests/src/ChipmunkTest/ChipmunkTest.js b/tests/js-tests/src/ChipmunkTest/ChipmunkTest.js index 8ed34e54336a..5d5938eec639 100644 --- a/tests/js-tests/src/ChipmunkTest/ChipmunkTest.js +++ b/tests/js-tests/src/ChipmunkTest/ChipmunkTest.js @@ -31,8 +31,8 @@ var chipmunkTestSceneIdx = -1; function k_scalar_body(body, point, n) { - var rcn = cp.v.cross(cp.v.sub(point, body.getPosition()), n); - return 1.0/body.getMass() + rcn*rcn/body.getMoment(); + var rcn = cp.v.cross(cp.v.sub(point, body.p), n); + return 1.0/body.m + rcn*rcn/body.i; } //------------------------------------------------------------------ @@ -1494,14 +1494,14 @@ var Buoyancy = ChipmunkDemo.extend( { var level = water.getBB().t; // Clip the polygon against the water level - var count = poly.getCount(); + var count = poly.getNumVerts(); var clipped = []; var j=count-1; for(var i=0; i Date: Mon, 11 Apr 2016 11:18:55 +0800 Subject: [PATCH 011/241] Update web engine ref --- web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web b/web index 8586470e65d4..ff19fd2880a1 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 8586470e65d43f60b06d2846bde72b384e884e5d +Subproject commit ff19fd2880a1dd014151170166bcb1cb5b2bf9a7 From 8ae6d68640931d9e8c9b09a1c5c799c8346d0911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B5=D1=81=D1=88=D0=B0=D0=BF=D0=BE=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Fri, 8 Apr 2016 11:14:45 +0300 Subject: [PATCH 012/241] Add scroll view bar js test --- tests/js-tests/src/GUITest/UISceneManager.js | 6 +++ .../UIScrollViewTest/UIScrollViewTest.js | 46 ++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/tests/js-tests/src/GUITest/UISceneManager.js b/tests/js-tests/src/GUITest/UISceneManager.js index 1090c5efa912..e1067915d925 100644 --- a/tests/js-tests/src/GUITest/UISceneManager.js +++ b/tests/js-tests/src/GUITest/UISceneManager.js @@ -477,6 +477,12 @@ func: function () { return new UIScrollViewTest_Vertical_Multiple(); } + }, + { + title:"UIScrollView Scroll Bar Test", + func: function () { + return new UIScrollViewTest_ScrollBar(); + } } ], "UIPageView": [ diff --git a/tests/js-tests/src/GUITest/UIScrollViewTest/UIScrollViewTest.js b/tests/js-tests/src/GUITest/UIScrollViewTest/UIScrollViewTest.js index 0ea3fe81db3b..f5b712264cfb 100644 --- a/tests/js-tests/src/GUITest/UIScrollViewTest/UIScrollViewTest.js +++ b/tests/js-tests/src/GUITest/UIScrollViewTest/UIScrollViewTest.js @@ -603,4 +603,48 @@ var UIScrollViewTest_Vertical_Multiple = UIMainLayer.extend({ scrollView.addChild(button_scale9); } } -}); \ No newline at end of file +}); + +var UIScrollViewTest_ScrollBar = UIMainLayer.extend({ + init: function () { + if (this._super()) { + var widgetSize = this._widget.getContentSize(); + //init text + this._topDisplayLabel.setString("Scroll bar is red, 65% opacity, auto hide time: 5 sec"); + this._topDisplayLabel.setFontSize(14); + this._topDisplayLabel.x = widgetSize.width / 2.0; + this._topDisplayLabel.y = widgetSize.height / 2.0 + this._topDisplayLabel.height * 1.5; + + this._bottomDisplayLabel.setString(""); + this._bottomDisplayLabel.x = widgetSize.width / 2; + this._bottomDisplayLabel.y = widgetSize.height / 2 - this._bottomDisplayLabel.height * 3; + + var background = this._widget.getChildByName("background_Panel"); + + // Create the scrollview + var scrollView = new ccui.ScrollView(); + scrollView.setTouchEnabled(true); + scrollView.setBounceEnabled(true); + scrollView.setBackGroundColor(cc.color.GREEN); + scrollView.setBackGroundColorType(ccui.Layout.BG_COLOR_SOLID); + scrollView.setDirection(ccui.ScrollView.DIR_BOTH); + scrollView.setInnerContainerSize(cc.size(480, 320)); + scrollView.setContentSize(cc.size(100, 100)); + var scrollViewSize = scrollView.getContentSize(); + + scrollView.x = (widgetSize.width - background.width) / 2 + (background.width - scrollViewSize.width) / 2; + scrollView.y = (widgetSize.height - background.height) / 2 + (background.height - scrollViewSize.height) / 2; + + this._mainNode.addChild(scrollView); + + scrollView.setScrollBarAutoHideTime(5); + scrollView.setScrollBarColor(cc.color.RED); + scrollView.setScrollBarOpacity(255 * 0.65); + scrollView.setScrollBarWidth(5); + + return true; + } + return false; + } +}); + From 273281ecce8a3f832f3a82ec4b98405071925f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B5=D1=81=D1=88=D0=B0=D0=BF=D0=BE=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Fri, 8 Apr 2016 13:40:21 +0300 Subject: [PATCH 013/241] Add ListView js tests --- .../GUITest/UIListViewTest/UIListViewTest.js | 255 ++++++++++++++++++ tests/js-tests/src/GUITest/UISceneManager.js | 24 ++ 2 files changed, 279 insertions(+) diff --git a/tests/js-tests/src/GUITest/UIListViewTest/UIListViewTest.js b/tests/js-tests/src/GUITest/UIListViewTest/UIListViewTest.js index 62f75f09d401..83f551158ac8 100644 --- a/tests/js-tests/src/GUITest/UIListViewTest/UIListViewTest.js +++ b/tests/js-tests/src/GUITest/UIListViewTest/UIListViewTest.js @@ -350,3 +350,258 @@ var UIListViewTest_TouchIntercept = UIMainLayer.extend({ return false; } }); + +var UIListViewTest_ScrollToItem = UIMainLayer.extend({ + _nextIndex: 0, + init: function () { + if(this._super()) { + var widgetSize = this._widget.getContentSize(); + var background = this._widget.getChildByName("background_Panel"); + var backgroundSize = background.getContentSize(); + + this._topDisplayLabel.setString(""); + this._topDisplayLabel.x = widgetSize.width / 2.0; + this._topDisplayLabel.y = widgetSize.height / 2.0 + this._topDisplayLabel.height * 1.5; + this._bottomDisplayLabel.setString(""); + this._bottomDisplayLabel.x = widgetSize.width / 2; + this._bottomDisplayLabel.y = widgetSize.height / 2 - this._bottomDisplayLabel.height * 3; + + // Create the list view + var listView = new ccui.ListView(); + // set list view ex direction + listView.setDirection(this._getListViewDirection()); + listView.setBounceEnabled(true); + listView.setBackGroundImage("ccs-res/cocosui/green_edit.png"); + listView.setBackGroundImageScale9Enabled(true); + listView.setContentSize(widgetSize.width / 2, widgetSize.height / 2); + listView.setScrollBarPositionFromCorner(cc.p(7, 7)); + listView.setItemsMargin(2.0); + + listView.x = (widgetSize.width - backgroundSize.width) / 2 + (backgroundSize.width - listView.width) / 2; + listView.y = (widgetSize.height - backgroundSize.height) / 2 + (backgroundSize.height - listView.height) / 2; + this._mainNode.addChild(listView); + + { + var pNode = new cc.DrawNode(); + + var center = cc.p(widgetSize.width / 2, widgetSize.height / 2); + if(this._getListViewDirection() == ccui.ScrollView.DIR_HORIZONTAL) + { + var halfY = 110; + pNode.drawLine(cc.p(center.x, center.y - halfY), cc.p(center.x, center.y + halfY), cc.color(0, 0, 0, 255)); + } + else + { + var halfX = 150; + pNode.drawLine(cc.p(center.x - halfX, center.y), cc.p(center.x + halfX, center.y), cc.color(0, 0, 0, 255)); + } + pNode.setLineWidth(2); + pNode.setContentSize(listView.getContentSize()); + this._mainNode.addChild(pNode); + } + + var NUMBER_OF_ITEMS = 31; + + // Button + var pButton = new ccui.Button("ccs-res/cocosui/backtotoppressed.png", "ccs-res/cocosui/backtotopnormal.png"); + pButton.setAnchorPoint(cc.p(0, 0.5)); + pButton.setScale(0.8); + pButton.setPosition(cc.pAdd(cc.p(widgetSize.width / 2, widgetSize.height / 2), cc.p(120, -60))); + pButton.setTitleText("Go to '" +this._nextIndex + "'"); + pButton.addClickEventListener(function(pButton) { + listView.scrollToItem(this._nextIndex, cc.p(0.5, 0.5), cc.p(0.5, 0.5)); + this._nextIndex = (this._nextIndex + Math.floor(NUMBER_OF_ITEMS / 2)) % NUMBER_OF_ITEMS; + pButton.setTitleText("Go to '" + this._nextIndex+ "'"); + }.bind(this)); + this._mainNode.addChild(pButton); + + // Add list items + var BUTTON_SIZE = cc.size(50, 40); + + for (var i = 0; i < NUMBER_OF_ITEMS; ++i) + { + var pButton = new ccui.Button("ccs-res/cocosui/button.png", "ccs-res/cocosui/buttonHighlighted.png"); + pButton.setContentSize(BUTTON_SIZE); + pButton.setScale9Enabled(true); + pButton.setTitleText("Button-" + i); + listView.pushBackCustomItem(pButton); + } + + return true; + } + return false; + }, + _getListViewDirection: function() + { + + } +}); + +var UIListViewTest_ScrollToItemVertical = UIListViewTest_ScrollToItem.extend({ + _getListViewDirection: function() + { + return ccui.ScrollView.DIR_VERTICAL; + } +}); + +var UIListViewTest_ScrollToItemHorizontal = UIListViewTest_ScrollToItem.extend({ + _getListViewDirection: function() + { + return ccui.ScrollView.DIR_HORIZONTAL; + } +}); + +var UIListViewTest_Magnetic = UIMainLayer.extend({ + _listView: null, + init: function () { + if(this._super()) { + var widgetSize = this._widget.getContentSize(); + var background = this._widget.getChildByName("background_Panel"); + var backgroundSize = background.getContentSize(); + + this._indexLabels= []; + + this._topDisplayLabel.setString("1"); + this._topDisplayLabel.setFontSize(14); + this._topDisplayLabel.x = widgetSize.width / 2.0; + this._topDisplayLabel.y = widgetSize.height / 2 + 90; + this._bottomDisplayLabel.setString(""); + this._bottomDisplayLabel.x = widgetSize.width / 2; + this._bottomDisplayLabel.y = widgetSize.height / 2 - this._bottomDisplayLabel.height * 3; + + // Create the list view + this._listView = new ccui.ListView(); + // set list view ex direction + this._listView.setDirection(this._getListViewDirection()); + this._listView.setTouchEnabled(true); + this._listView.setBounceEnabled(true); + this._listView.setBackGroundImage("ccs-res/cocosui/green_edit.png"); + this._listView.setBackGroundImageScale9Enabled(true); + this._listView.setContentSize(widgetSize.width / 2, widgetSize.height / 2); + this._listView.setScrollBarPositionFromCorner(cc.p(7, 7)); + this._listView.setItemsMargin(2.0); + this._listView.setAnchorPoint(cc.p(0.5 ,0.5)); + + this._listView.x = widgetSize.width / 2; + this._listView.y = widgetSize.height / 2; + + this._mainNode.addChild(this._listView); + + { + var pNode = new cc.DrawNode(); + + var center = cc.p(widgetSize.width / 2, widgetSize.height / 2); + if(this._getListViewDirection() == ccui.ScrollView.DIR_HORIZONTAL) + { + var halfY = 110; + pNode.drawLine(cc.p(center.x, center.y - halfY), cc.p(center.x, center.y + halfY), cc.color(0, 0, 0, 255)); + } + else + { + var halfX = 150; + pNode.drawLine(cc.p(center.x - halfX, center.y), cc.p(center.x + halfX, center.y), cc.color(0, 0, 0, 255)); + } + pNode.setLineWidth(2); + pNode.setContentSize(this._listView.getContentSize()); + this._mainNode.addChild(pNode); + } + + // Initial magnetic type + this._listView.setMagneticType(ccui.ListView.MAGNETIC_NONE); + this._topDisplayLabel.setString("MagneticType - NONE"); + + // Magnetic change button + var pButton = new ccui.Button("ccs-res/cocosui/backtotoppressed.png", "ccs-res/cocosui/backtotopnormal.png"); + pButton.setAnchorPoint(cc.p(0.5, 0.5)); + pButton.setScale(0.8); + pButton.setPosition(cc.pAdd(cc.p(widgetSize.width / 2, widgetSize.height / 2), cc.p(130, -60))); + pButton.setTitleText("Next Magnetic"); + pButton.addClickEventListener(function() { + var eCurrentType = this._listView.getMagneticType(); + var eNextType; + var sString; + if(eCurrentType == ccui.ListView.MAGNETIC_NONE) + { + eNextType = ccui.ListView.MAGNETIC_CENTER; + sString = "CENTER"; + } + else if(eCurrentType == ccui.ListView.MAGNETIC_CENTER) + { + eNextType = ccui.ListView.MAGNETIC_BOTH_END; + sString = "BOTH_END"; + } + else if(eCurrentType == ccui.ListView.MAGNETIC_BOTH_END) + { + if(this._getListViewDirection() == ccui.ScrollView.DIR_HORIZONTAL) + { + eNextType = ccui.ListView.MAGNETIC_LEFT; + sString = "LEFT"; + } + else + { + eNextType = ccui.ListView.MAGNETIC_TOP; + sString = "TOP"; + } + } + else if(eCurrentType == ccui.ListView.MAGNETIC_LEFT) + { + eNextType = ccui.ListView.MAGNETIC_RIGHT; + sString = "RIGHT"; + } + else if(eCurrentType == ccui.ListView.MAGNETIC_RIGHT) + { + eNextType = ccui.ListView.MAGNETIC_NONE; + sString = "NONE"; + } + else if(eCurrentType == ccui.ListView.MAGNETIC_TOP) + { + eNextType = ccui.ListView.MAGNETIC_BOTTOM; + sString = "BOTTOM"; + } + else if(eCurrentType == ccui.ListView.MAGNETIC_BOTTOM) + { + eNextType = ccui.ListView.MAGNETIC_NONE; + sString = "NONE"; + } + this._listView.setMagneticType(eNextType); + + this._topDisplayLabel.setString("MagneticType - " + sString); + }.bind(this)); + this._mainNode.addChild(pButton); + + // Add list items + var BUTTON_SIZE = cc.size(50, 40); + + for (var i = 0; i < 40; ++i) + { + var pButton = new ccui.Button("ccs-res/cocosui/button.png", "ccs-res/cocosui/buttonHighlighted.png"); + pButton.setContentSize(BUTTON_SIZE); + pButton.setScale9Enabled(true); + pButton.setTitleText("Button-" + i); + this._listView.pushBackCustomItem(pButton); + } + + return true; + } + return false; + }, + + _getListViewDirection: function() + { + + } +}); + +var UIListViewTest_MagneticVertical = UIListViewTest_Magnetic.extend({ + _getListViewDirection: function() + { + return ccui.ScrollView.DIR_VERTICAL; + } +}); + +var UIListViewTest_MagneticHorizontal = UIListViewTest_Magnetic.extend({ + _getListViewDirection: function() + { + return ccui.ScrollView.DIR_HORIZONTAL; + } +}); \ No newline at end of file diff --git a/tests/js-tests/src/GUITest/UISceneManager.js b/tests/js-tests/src/GUITest/UISceneManager.js index e1067915d925..2d9cd3333d90 100644 --- a/tests/js-tests/src/GUITest/UISceneManager.js +++ b/tests/js-tests/src/GUITest/UISceneManager.js @@ -541,6 +541,30 @@ func: function() { return new UIListViewTest_TouchIntercept(); } + }, + { + title:"UIListViewTest Scroll to item vertical", + func: function() { + return new UIListViewTest_ScrollToItemVertical(); + } + }, + { + title:"UIListViewTest Scroll to item horizontal", + func: function() { + return new UIListViewTest_ScrollToItemHorizontal(); + } + }, + { + title:"UIListViewTest magnetic vertical", + func: function() { + return new UIListViewTest_MagneticVertical(); + } + }, + { + title:"UIListViewTest magnetic horizontal", + func: function() { + return new UIListViewTest_MagneticHorizontal(); + } } ], "UIWidget": [ From cf32f8a2f0a7f3740e9f5dcd4aa8900aa00783dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B5=D1=81=D1=88=D0=B0=D0=BF=D0=BE=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Fri, 8 Apr 2016 14:01:20 +0300 Subject: [PATCH 014/241] Add PageView js tests --- .../GUITest/UIPageViewTest/UIPageViewTest.js | 146 ++++++++++++++++++ tests/js-tests/src/GUITest/UISceneManager.js | 12 ++ 2 files changed, 158 insertions(+) diff --git a/tests/js-tests/src/GUITest/UIPageViewTest/UIPageViewTest.js b/tests/js-tests/src/GUITest/UIPageViewTest/UIPageViewTest.js index c0bf09af1cbd..d29d5a8ccdc5 100644 --- a/tests/js-tests/src/GUITest/UIPageViewTest/UIPageViewTest.js +++ b/tests/js-tests/src/GUITest/UIPageViewTest/UIPageViewTest.js @@ -586,3 +586,149 @@ var UIPageViewDisableTouchTest = UIMainLayer.extend({ return false; } }); + +var UIPageViewJumpToPageTest = UIMainLayer.extend({ + init: function () { + if (this._super()) { + var widgetSize = this._widget.getContentSize(); + //init text + this._topDisplayLabel.setString("setCurrentPageIndex API Test"); + this._topDisplayLabel.setFontSize(14); + this._topDisplayLabel.x = widgetSize.width / 2.0; + this._topDisplayLabel.y = widgetSize.height / 2.0 + this._topDisplayLabel.height * 4; + this._bottomDisplayLabel.setString(""); + this._bottomDisplayLabel.x = widgetSize.width / 2; + this._bottomDisplayLabel.y = widgetSize.height / 2 - this._bottomDisplayLabel.height * 3; + + var background = this._widget.getChildByName("background_Panel"); + + // Create the page view + var pageView = new ccui.PageView(); + pageView.setTouchEnabled(true); + pageView.setContentSize(cc.size(240, 130)); + pageView.x = (widgetSize.width - background.width) / 2 + (background.width - pageView.width) / 2; + pageView.y = (widgetSize.height - background.height) / 2 + (background.height - pageView.height) / 2; + pageView.setIndicatorEnabled(true); + pageView.removeAllItems(); + + var pageCount = 4; + for (var i = 0; i < pageCount; ++i) + { + var layout = new ccui.Layout(); + layout.setContentSize(cc.size(240.0, 130.0)); + + var imageView = new ccui.ImageView("ccs-res/cocosui/scrollviewbg.png"); + imageView.setScale9Enabled(true); + imageView.setContentSize(cc.size(240, 130)); + imageView.setPosition(cc.p(layout.width / 2.0, layout.height / 2.0)); + layout.addChild(imageView); + + var label = new ccui.Text("page " + (i+1), "Arial", 30); + label.setColor(cc.color(192, 192, 192)); + label.setPosition(cc.p(layout.width / 2.0, layout.height / 2.0)); + layout.addChild(label); + + pageView.insertCustomItem(layout, i); + } + + pageView.setCurrentPageIndex(1); + //add buttons to jump to specific page + var button1 = new ccui.Button(); + button1.setPosition(cc.p(pageView.x - 50, pageView.y + pageView.height)); + button1.setTitleText("Jump to Page1"); + + button1.addClickEventListener(function(){ + pageView.setCurrentPageIndex(0); + }); + this._mainNode.addChild(button1); + + var button2 = button1.clone(); + button2.setTitleText("Jump to Page2"); + button2.setPosition(cc.p(pageView.x - 50, pageView.y + pageView.height - 50)); + button2.addClickEventListener(function(){ + pageView.setCurrentPageIndex(1); + }); + this._mainNode.addChild(button2); + + var button3 = button2.clone(); + button3.setTitleText("Jump to Page3"); + button3.setPosition(cc.p(pageView.x + pageView.width + 50, pageView.y + pageView.height)); + button3.addClickEventListener(function(){ + pageView.setCurrentPageIndex(2); + }); + this._mainNode.addChild(button3); + + var button4 = button3.clone(); + button4.setTitleText("Jump to Page4"); + button4.setPosition(cc.p(pageView.x + pageView.width + 50, pageView.y + pageView.height - 50)); + button4.addClickEventListener(function(){ + pageView.setCurrentPageIndex(3); + }); + this._mainNode.addChild(button4); + + this._mainNode.addChild(pageView); + + return true; + } + return false; + } +}); + +var UIPageViewChildSizeTest = UIMainLayer.extend({ + init: function () { + if (this._super()) { + var widgetSize = this._widget.getContentSize(); + //init text + this._topDisplayLabel.setString("Move by horizontal direction"); + this._topDisplayLabel.setFontSize(14); + this._topDisplayLabel.x = widgetSize.width / 2.0; + this._topDisplayLabel.y = widgetSize.height / 2.0 + this._topDisplayLabel.height * 4; + this._bottomDisplayLabel.setString(""); + this._bottomDisplayLabel.x = widgetSize.width / 2; + this._bottomDisplayLabel.y = widgetSize.height / 2 - this._bottomDisplayLabel.height * 3; + + var background = this._widget.getChildByName("background_Panel"); + + // Create the page view + var pageView = new ccui.PageView(); + pageView.setTouchEnabled(true); + pageView.setContentSize(cc.size(240, 130)); + pageView.x = (widgetSize.width - background.width) / 2 + (background.width - pageView.width) / 2; + pageView.y = (widgetSize.height - background.height) / 2 + (background.height - pageView.height) / 2; + pageView.setIndicatorEnabled(true); + pageView.removeAllItems(); + + var pageCount = 4; + for (var i = 0; i < pageCount; ++i) + { + var imageView = new ccui.ImageView("ccs-res/cocosui/scrollviewbg.png"); + var label = new ccui.Text("page " + (i + 1), "Arial", 30); + + imageView.setScale9Enabled(true); + label.setColor(cc.color(192, 192, 192)); + label.setAnchorPoint(cc.p(0,0)); + imageView.addChild(label); + + pageView.insertCustomItem(imageView, i); + } + + pageView.addEventListener(this.pageViewEvent, this); + + this._mainNode.addChild(pageView); + + return true; + } + return false; + }, + + pageViewEvent: function (sender, type) { + switch (type) { + case ccui.PageView.EVENT_TURNING: + var pageView = sender; + this._topDisplayLabel.setString("page = " + (pageView.getCurPageIndex().valueOf()-0 + 1)); + break; + default: + break; + } + } +}); diff --git a/tests/js-tests/src/GUITest/UISceneManager.js b/tests/js-tests/src/GUITest/UISceneManager.js index 2d9cd3333d90..18b0cd4d04b2 100644 --- a/tests/js-tests/src/GUITest/UISceneManager.js +++ b/tests/js-tests/src/GUITest/UISceneManager.js @@ -521,6 +521,18 @@ func: function () { return new UIPageViewDisableTouchTest(); } + }, + { + title: "UIPageViewJumpToPageTest", + func: function () { + return new UIPageViewJumpToPageTest(); + } + }, + { + title: "UIPageViewChildSizeTest", + func: function () { + return new UIPageViewChildSizeTest(); + } } ], "UIListView": [ From 32b64831da11a2eed6ee3916315f92e68a5e17a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B5=D1=81=D1=88=D0=B0=D0=BF=D0=BE=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Fri, 8 Apr 2016 15:31:51 +0300 Subject: [PATCH 015/241] Fixed ccui.ListView Test --- .../GUITest/UIListViewTest/UIListViewTest.js | 67 ++++++++++++------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/tests/js-tests/src/GUITest/UIListViewTest/UIListViewTest.js b/tests/js-tests/src/GUITest/UIListViewTest/UIListViewTest.js index 83f551158ac8..4ac1b4ad1472 100644 --- a/tests/js-tests/src/GUITest/UIListViewTest/UIListViewTest.js +++ b/tests/js-tests/src/GUITest/UIListViewTest/UIListViewTest.js @@ -388,20 +388,17 @@ var UIListViewTest_ScrollToItem = UIMainLayer.extend({ if(this._getListViewDirection() == ccui.ScrollView.DIR_HORIZONTAL) { var halfY = 110; - pNode.drawLine(cc.p(center.x, center.y - halfY), cc.p(center.x, center.y + halfY), cc.color(0, 0, 0, 255)); + pNode.drawSegment(cc.p(center.x, center.y - halfY), cc.p(center.x, center.y + halfY), 2, cc.color(0, 0, 0, 255)); } else { var halfX = 150; - pNode.drawLine(cc.p(center.x - halfX, center.y), cc.p(center.x + halfX, center.y), cc.color(0, 0, 0, 255)); + pNode.drawSegment(cc.p(center.x - halfX, center.y), cc.p(center.x + halfX, center.y), 2, cc.color(0, 0, 0, 255)); } - pNode.setLineWidth(2); pNode.setContentSize(listView.getContentSize()); this._mainNode.addChild(pNode); } - var NUMBER_OF_ITEMS = 31; - // Button var pButton = new ccui.Button("ccs-res/cocosui/backtotoppressed.png", "ccs-res/cocosui/backtotopnormal.png"); pButton.setAnchorPoint(cc.p(0, 0.5)); @@ -416,15 +413,28 @@ var UIListViewTest_ScrollToItem = UIMainLayer.extend({ this._mainNode.addChild(pButton); // Add list items - var BUTTON_SIZE = cc.size(50, 40); + var default_button = new ccui.Button(); + default_button.setName("TextButton"); + default_button.setTouchEnabled(true); + default_button.loadTextures("ccs-res/cocosui/backtotoppressed.png", "ccs-res/cocosui/backtotopnormal.png", ""); + + var default_item = new ccui.Layout(); + default_item.setTouchEnabled(true); + default_item.setContentSize(default_button.getContentSize()); + default_button.x = default_item.width / 2; + default_button.y = default_item.height / 2; + default_item.addChild(default_button); + + // set model + listView.setItemModel(default_item); + + // Add list items for (var i = 0; i < NUMBER_OF_ITEMS; ++i) { - var pButton = new ccui.Button("ccs-res/cocosui/button.png", "ccs-res/cocosui/buttonHighlighted.png"); - pButton.setContentSize(BUTTON_SIZE); - pButton.setScale9Enabled(true); - pButton.setTitleText("Button-" + i); - listView.pushBackCustomItem(pButton); + var item = default_item.clone(); + item.getChildByName("TextButton").setTitleText("Button-" + i); + listView.pushBackCustomItem(item); } return true; @@ -459,8 +469,6 @@ var UIListViewTest_Magnetic = UIMainLayer.extend({ var background = this._widget.getChildByName("background_Panel"); var backgroundSize = background.getContentSize(); - this._indexLabels= []; - this._topDisplayLabel.setString("1"); this._topDisplayLabel.setFontSize(14); this._topDisplayLabel.x = widgetSize.width / 2.0; @@ -485,6 +493,8 @@ var UIListViewTest_Magnetic = UIMainLayer.extend({ this._listView.x = widgetSize.width / 2; this._listView.y = widgetSize.height / 2; + this._listView.setGravity(ccui.ListView.GRAVITY_CENTER_VERTICAL); + this._mainNode.addChild(this._listView); { @@ -494,14 +504,13 @@ var UIListViewTest_Magnetic = UIMainLayer.extend({ if(this._getListViewDirection() == ccui.ScrollView.DIR_HORIZONTAL) { var halfY = 110; - pNode.drawLine(cc.p(center.x, center.y - halfY), cc.p(center.x, center.y + halfY), cc.color(0, 0, 0, 255)); + pNode.drawSegment(cc.p(center.x, center.y - halfY), cc.p(center.x, center.y + halfY), 2, cc.color(0, 0, 0, 255)); } else { var halfX = 150; - pNode.drawLine(cc.p(center.x - halfX, center.y), cc.p(center.x + halfX, center.y), cc.color(0, 0, 0, 255)); + pNode.drawSegment(cc.p(center.x - halfX, center.y), cc.p(center.x + halfX, center.y), 2, cc.color(0, 0, 0, 255)); } - pNode.setLineWidth(2); pNode.setContentSize(this._listView.getContentSize()); this._mainNode.addChild(pNode); } @@ -569,16 +578,28 @@ var UIListViewTest_Magnetic = UIMainLayer.extend({ }.bind(this)); this._mainNode.addChild(pButton); - // Add list items - var BUTTON_SIZE = cc.size(50, 40); + var default_button = new ccui.Button(); + default_button.setName("TextButton"); + default_button.setTouchEnabled(true); + default_button.loadTextures("ccs-res/cocosui/backtotoppressed.png", "ccs-res/cocosui/backtotopnormal.png", ""); + + var default_item = new ccui.Layout(); + default_item.setTouchEnabled(true); + default_item.setContentSize(default_button.getContentSize()); + default_button.x = default_item.width / 2; + default_button.y = default_item.height / 2; + default_item.addChild(default_button); + + // set model + this._listView.setItemModel(default_item); + + // Add list items for (var i = 0; i < 40; ++i) { - var pButton = new ccui.Button("ccs-res/cocosui/button.png", "ccs-res/cocosui/buttonHighlighted.png"); - pButton.setContentSize(BUTTON_SIZE); - pButton.setScale9Enabled(true); - pButton.setTitleText("Button-" + i); - this._listView.pushBackCustomItem(pButton); + var item = default_item.clone(); + item.getChildByName("TextButton").setTitleText("Button-" + i); + this._listView.pushBackCustomItem(item); } return true; From 54e457f1be6d20d78572cafe84f6c9b6b698ecfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B5=D1=81=D1=88=D0=B0=D0=BF=D0=BE=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Fri, 8 Apr 2016 15:34:25 +0300 Subject: [PATCH 016/241] Fixed ccui scroll widgets constants for JS bindings --- .../js-bindings/script/ccui/jsb_cocos2d_ui.js | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/cocos/scripting/js-bindings/script/ccui/jsb_cocos2d_ui.js b/cocos/scripting/js-bindings/script/ccui/jsb_cocos2d_ui.js index 6568a84fc1eb..bcebfb89523b 100644 --- a/cocos/scripting/js-bindings/script/ccui/jsb_cocos2d_ui.js +++ b/cocos/scripting/js-bindings/script/ccui/jsb_cocos2d_ui.js @@ -212,6 +212,15 @@ ccui.ListView.GRAVITY_TOP = 3; ccui.ListView.GRAVITY_BOTTOM = 4; ccui.ListView.GRAVITY_CENTER_VERTICAL = 5; +//list view magnetic type +ccui.ListView.MAGNETIC_NONE = 0; +ccui.ListView.MAGNETIC_CENTER = 1; +ccui.ListView.MAGNETIC_BOTH_END = 2; +ccui.ListView.MAGNETIC_LEFT = 3; +ccui.ListView.MAGNETIC_RIGHT = 4; +ccui.ListView.MAGNETIC_TOP = 5; +ccui.ListView.MAGNETIC_BOTTOM = 6; + /* * UIScrollView */ @@ -231,13 +240,13 @@ ccui.ScrollView.EVENT_BOUNCE_TOP = 5; ccui.ScrollView.EVENT_BOUNCE_BOTTOM = 6; ccui.ScrollView.EVENT_BOUNCE_LEFT = 7; ccui.ScrollView.EVENT_BOUNCE_RIGHT = 8; +ccui.ScrollView.EVENT_CONTAINER_MOVED = 9; +ccui.ScrollView.EVENT_AUTOSCROLL_ENDED = 10; - -ccui.ScrollView.AUTO_SCROLL_MAX_SPEED = 1000; -ccui.ScrollView.SCROLLDIR_UP = cc.p(0, 1); -ccui.ScrollView.SCROLLDIR_DOWN = cc.p(0, -1); -ccui.ScrollView.SCROLLDIR_LEFT = cc.p(-1, 0); -ccui.ScrollView.SCROLLDIR_RIGHT = cc.p(1, 0); +ccui.ScrollView.MOVEDIR_TOP = 0; +ccui.ScrollView.MOVEDIR_BOTTOM = 1; +ccui.ScrollView.MOVEDIR_LEFT = 2; +ccui.ScrollView.MOVEDIR_RIGHT = 3; /* * UIPageView @@ -252,8 +261,8 @@ ccui.PageView.TOUCH_DIR_UP = 2; ccui.PageView.TOUCH_DIR_DOWN = 3; //PageView direction -ccui.PageView.DIRECTION_HORIZONTAL = 0; -ccui.PageView.DIRECTION_VERTICAL = 1; +ccui.PageView.DIRECTION_LEFT = 0; +ccui.PageView.DIRECTION_RIGHT = 1; /* * UIButton @@ -450,7 +459,7 @@ if (ccui.WebView) } if (ccui.VideoPlayer) { - /** + /** * The VideoPlayer support list of events * @type {{PLAYING: string, PAUSED: string, STOPPED: string, COMPLETED: string}} */ From 9c4f3ffa8db0a0daa5ebb5503e8fb75c4381d208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Luis=20Boya=20Garc=C3=ADa?= Date: Tue, 5 Apr 2016 12:58:50 +0200 Subject: [PATCH 017/241] Make selectedSprite optional in JSB too --- .../scripting/js-bindings/script/jsb_create_apis.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cocos/scripting/js-bindings/script/jsb_create_apis.js b/cocos/scripting/js-bindings/script/jsb_create_apis.js index f939df557a13..2b041ce41b3f 100644 --- a/cocos/scripting/js-bindings/script/jsb_create_apis.js +++ b/cocos/scripting/js-bindings/script/jsb_create_apis.js @@ -206,9 +206,9 @@ _p._ctor = function(value, callback, target) { _p = cc.MenuItemSprite.prototype; _p._ctor = function(normalSprite, selectedSprite, three, four, five) { - if (selectedSprite) { + if (normalSprite) { normalSprite = normalSprite; - selectedSprite = selectedSprite; + selectedSprite = selectedSprite || null; var disabledSprite, target, callback; if (five) { disabledSprite = three; @@ -335,7 +335,7 @@ cc.ParticleExplosion.prototype._ctor = dummyCtor; cc.ParticleSmoke.prototype._ctor = dummyCtor; cc.ParticleRain.prototype._ctor = dummyCtor; cc.ParticleSnow.prototype._ctor = dummyCtor; - + /************************ ProgressTimer *************************/ @@ -351,7 +351,7 @@ _p._ctor = function(placeholder, dimensions, alignment, fontName, fontSize){ this.initWithPlaceHolder('', dimensions, alignment, fontName, fontSize); if(placeholder) this._placeHolder = placeholder; - } + } else if(fontName === undefined && alignment !== undefined){ fontName = arguments[1]; fontSize = arguments[2]; @@ -497,7 +497,7 @@ cc.FadeOutTRTiles.prototype._ctor = durationCtor; cc.FadeOutBLTiles.prototype._ctor = durationCtor; cc.FadeOutUpTiles.prototype._ctor = durationCtor; cc.FadeOutDownTiles.prototype._ctor = durationCtor; - + cc.Twirl.prototype._ctor = function(duration, gridSize, position, twirls, amplitude) { amplitude !== undefined && this.initWithDuration(duration, gridSize, position, twirls, amplitude); @@ -824,7 +824,7 @@ cc.GLProgram.prototype._ctor = function(vShaderFileName, fShaderFileName) { cc.GLProgram.prototype.init.call(this, vShaderFileName, fShaderFileName); cc.GLProgram.prototype.link.call(this); cc.GLProgram.prototype.updateUniforms.call(this); - } + } }; From f3e6e8331afae5fe5ca038f7afc686fe02c198c7 Mon Sep 17 00:00:00 2001 From: James Chen Date: Thu, 7 Apr 2016 15:50:59 +0800 Subject: [PATCH 018/241] Fixes wrong usage of std::vector's constructor in EventDispatcher::removeAllEventListener. --- cocos/base/CCEventDispatcher.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cocos/base/CCEventDispatcher.cpp b/cocos/base/CCEventDispatcher.cpp index 8ee77b77664e..9be52d8bfcaf 100644 --- a/cocos/base/CCEventDispatcher.cpp +++ b/cocos/base/CCEventDispatcher.cpp @@ -1484,7 +1484,8 @@ void EventDispatcher::removeCustomEventListeners(const std::string& customEventN void EventDispatcher::removeAllEventListeners() { bool cleanMap = true; - std::vector types(_listenerMap.size()); + std::vector types; + types.reserve(_listenerMap.size()); for (const auto& e : _listenerMap) { From 3b5c1eb0f23224c7731f24366da5118e6e52d746 Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 11 Apr 2016 11:55:45 +0800 Subject: [PATCH 019/241] update web submodule --- web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web b/web index 9363587d5c95..ff19fd2880a1 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 9363587d5c95d941e25683390a3177983c4a031f +Subproject commit ff19fd2880a1dd014151170166bcb1cb5b2bf9a7 From 23d074ea34e356f6e14f1f8de71902cf0ae68704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B5=D1=81=D1=88=D0=B0=D0=BF=D0=BE=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Mon, 11 Apr 2016 12:28:47 +0300 Subject: [PATCH 020/241] Make PageView indicator more tunable: -add possibility to change texture of index nodes -add possibility to change color of index nodes -add possibility to change scale of index nodes --- cocos/ui/UIPageView.cpp | 38 +++++++++++++++ cocos/ui/UIPageView.h | 38 ++++++++++++++- cocos/ui/UIPageViewIndicator.cpp | 83 +++++++++++++++++++++++++++++++- cocos/ui/UIPageViewIndicator.h | 26 ++++++++-- 4 files changed, 178 insertions(+), 7 deletions(-) diff --git a/cocos/ui/UIPageView.cpp b/cocos/ui/UIPageView.cpp index 29fb71d15cc7..80c75659a5e7 100644 --- a/cocos/ui/UIPageView.cpp +++ b/cocos/ui/UIPageView.cpp @@ -438,6 +438,44 @@ const Color3B& PageView::getIndicatorSelectedIndexColor() const return _indicator->getSelectedIndexColor(); } +void PageView::setIndicatorIndexNodesColor(const Color3B& color) +{ + if(_indicator != nullptr) + { + _indicator->setIndexNodesColor(color); + } +} + +const Color3B& PageView::getIndicatorIndexNodesColor() const +{ + CCASSERT(_indicator != nullptr, ""); + return _indicator->getIndexNodesColor(); +} + +void PageView::setIndicatorIndexNodesScale(float indexNodesScale) +{ + if(_indicator != nullptr) + { + _indicator->setIndexNodesScale(indexNodesScale); + _indicator->indicate(_currentPageIndex); + } +} + +float PageView::getIndicatorIndexNodesScale() const +{ + CCASSERT(_indicator != nullptr, ""); + return _indicator->getIndexNodesScale(); +} + +void PageView::setIndicatorIndexNodesTexture(const std::string& texName,Widget::TextureResType texType) +{ + if(_indicator != nullptr) + { + _indicator->setIndexNodesTexture(texName, texType); + _indicator->indicate(_currentPageIndex); + } +} + void PageView::remedyLayoutParameter(Widget *item) { item->setContentSize(this->getContentSize()); diff --git a/cocos/ui/UIPageView.h b/cocos/ui/UIPageView.h index 261cfa976a8f..646040ea780a 100644 --- a/cocos/ui/UIPageView.h +++ b/cocos/ui/UIPageView.h @@ -301,7 +301,7 @@ class CC_GUI_DLL PageView : public ListView /** * @brief Set color of page indicator's selected index. * - * @param spaceBetweenIndexNodes Space between nodes in pixel. + * @param color Space between nodes in pixel. */ void setIndicatorSelectedIndexColor(const Color3B& color); @@ -312,6 +312,42 @@ class CC_GUI_DLL PageView : public ListView */ const Color3B& getIndicatorSelectedIndexColor() const; + /** + * @brief Set color of page indicator's index nodes. + * + * @param color Space between nodes in pixel. + */ + void setIndicatorIndexNodesColor(const Color3B& color); + + /** + * @brief Get the color of page indicator's index nodes. + * + * @return color + */ + const Color3B& getIndicatorIndexNodesColor() const; + + /** + * @brief Set scale of page indicator's index nodes. + * + * @param indexNodesScale Scale of index nodes. + */ + void setIndicatorIndexNodesScale(float indexNodesScale); + + /** + * sets texture for index nodes. + * + * @param fileName File name of texture. + * @param resType @see TextureResType . + */ + void setIndicatorIndexNodesTexture(const std::string& texName,Widget::TextureResType texType = Widget::TextureResType::LOCAL); + + /** + * @brief Get scale of page indicator's index nodes. + * + * @return indexNodesScale + */ + float getIndicatorIndexNodesScale() const; + /** *@brief If you don't specify the value, the pageView will turn page when scrolling at the half width of a page. *@param threshold A threshold in float. diff --git a/cocos/ui/UIPageViewIndicator.cpp b/cocos/ui/UIPageViewIndicator.cpp index d1b61c640183..e475a9113275 100644 --- a/cocos/ui/UIPageViewIndicator.cpp +++ b/cocos/ui/UIPageViewIndicator.cpp @@ -50,6 +50,11 @@ PageViewIndicator::PageViewIndicator() : _direction(PageView::Direction::HORIZONTAL) , _currentIndexNode(nullptr) , _spaceBetweenIndexNodes(SPACE_BETWEEN_INDEX_NODES_DEFAULT) +, _indexNodesScale(1.0f) +, _indexNodesColor(Color3B::WHITE) +, _useDefaultTexture(true) +, _indexNodesTextureFile("") +, _indexNodesTexType(Widget::TextureResType::LOCAL) { } @@ -59,7 +64,7 @@ PageViewIndicator::~PageViewIndicator() bool PageViewIndicator::init() { - _currentIndexNode = (Node*) utils::createSpriteFromBase64(CIRCLE_IMAGE); + _currentIndexNode = utils::createSpriteFromBase64(CIRCLE_IMAGE); _currentIndexNode->setVisible(false); addProtectedChild(_currentIndexNode, 1); return true; @@ -137,9 +142,83 @@ void PageViewIndicator::setSpaceBetweenIndexNodes(float spaceBetweenIndexNodes) rearrange(); } +void PageViewIndicator::setIndexNodesColor(const Color3B& indexNodesColor) +{ + _indexNodesColor = indexNodesColor; + + for(auto indexNode : _indexNodes) { + indexNode->setColor(indexNodesColor); + } +} + +void PageViewIndicator::setIndexNodesScale(float indexNodesScale) +{ + if(_indexNodesScale == indexNodesScale) + { + return; + } + _indexNodesScale = indexNodesScale; + + _currentIndexNode->setScale(indexNodesScale); + for(auto indexNode : _indexNodes) { + indexNode->setScale(_indexNodesScale); + } + + rearrange(); +} + +void PageViewIndicator::setIndexNodesTexture(const std::string& texName, Widget::TextureResType texType) +{ + _useDefaultTexture = false; + _indexNodesTextureFile = texName; + _indexNodesTexType = texType; + + switch (texType) + { + case Widget::TextureResType::LOCAL: + _currentIndexNode->setTexture(texName); + for(auto indexNode : _indexNodes) { + indexNode->setTexture(texName); + } + break; + case Widget::TextureResType::PLIST: + _currentIndexNode->setSpriteFrame(texName); + for(auto indexNode : _indexNodes) { + indexNode->setSpriteFrame(texName); + } + break; + default: + break; + } + + rearrange(); +} + void PageViewIndicator::increaseNumberOfPages() { - Sprite* indexNode = utils::createSpriteFromBase64(CIRCLE_IMAGE); + Sprite* indexNode; + + if(_useDefaultTexture) + { + indexNode = utils::createSpriteFromBase64(CIRCLE_IMAGE); + } + else + { + switch (_indexNodesTexType) + { + case Widget::TextureResType::LOCAL: + indexNode = Sprite::create(_indexNodesTextureFile); + break; + case Widget::TextureResType::PLIST: + indexNode = Sprite::createWithSpriteFrameName(_indexNodesTextureFile); + break; + default: + break; + } + } + + indexNode->setColor(_indexNodesColor); + indexNode->setScale(_indexNodesScale); // indexNode->setOpacity(255 * 0.3f); addProtectedChild(indexNode); _indexNodes.pushBack(indexNode); diff --git a/cocos/ui/UIPageViewIndicator.h b/cocos/ui/UIPageViewIndicator.h index 1545b91ca2f9..2e20938bc7b3 100644 --- a/cocos/ui/UIPageViewIndicator.h +++ b/cocos/ui/UIPageViewIndicator.h @@ -26,6 +26,7 @@ THE SOFTWARE. #define __UIPAGEVIEWINDICATOR_H__ #include "ui/UIPageView.h" +#include "2d/CCSprite.h" NS_CC_BEGIN /** @@ -56,7 +57,19 @@ class PageViewIndicator : public ProtectedNode float getSpaceBetweenIndexNodes() const { return _spaceBetweenIndexNodes; } void setSelectedIndexColor(const Color3B& color) { _currentIndexNode->setColor(color); } const Color3B& getSelectedIndexColor() const { return _currentIndexNode->getColor(); } - + void setIndexNodesColor(const Color3B& indexNodesColor); + const Color3B& getIndexNodesColor() const { return _indexNodesColor; } + void setIndexNodesScale(float indexNodesScale); + float getIndexNodesScale() const { return _indexNodesScale; } + + /** + * Sets texture for index nodes. + * + * @param fileName File name of texture. + * @param resType @see TextureResType . + */ + void setIndexNodesTexture(const std::string& texName,Widget::TextureResType texType = Widget::TextureResType::LOCAL); + protected: bool init() override; void increaseNumberOfPages(); @@ -64,10 +77,15 @@ class PageViewIndicator : public ProtectedNode void rearrange(); PageView::Direction _direction; - Vector _indexNodes; - Node* _currentIndexNode; + Vector _indexNodes; + Sprite* _currentIndexNode; float _spaceBetweenIndexNodes; - + float _indexNodesScale; + Color3B _indexNodesColor; + + bool _useDefaultTexture; + std::string _indexNodesTextureFile; + Widget::TextureResType _indexNodesTexType; }; } From 2246495cc304a4dc8f22f0f94da11b12e17b019b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B5=D1=81=D1=88=D0=B0=D0=BF=D0=BE=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Mon, 11 Apr 2016 12:29:02 +0300 Subject: [PATCH 021/241] Add test for page view indicator tune --- .../UIPageViewTest/UIPageViewTest.cpp | 82 +++++++++++++++++++ .../UIPageViewTest/UIPageViewTest.h | 14 ++++ 2 files changed, 96 insertions(+) diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp index f720f680fa0f..50cc1f4ee0a5 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp @@ -14,6 +14,7 @@ UIPageViewTests::UIPageViewTests() ADD_TEST_CASE(UIPageViewVerticalTest); ADD_TEST_CASE(UIPageViewDisableTouchTest); ADD_TEST_CASE(UIPageViewChildSizeTest); + ADD_TEST_CASE(UIPageViewIndicatorTest); } // UIPageViewTest @@ -962,3 +963,84 @@ void UIPageViewChildSizeTest::pageViewEvent(Ref *pSender, PageView::EventType ty } } +// UIPageViewIndicatorTest +UIPageViewIndicatorTest::UIPageViewIndicatorTest() +: _displayValueLabel(nullptr) +{ + +} + +UIPageViewIndicatorTest::~UIPageViewIndicatorTest() +{ +} + +bool UIPageViewIndicatorTest::init() +{ + if (UIScene::init()) + { + Size widgetSize = _widget->getContentSize(); + + // Add a label in which the dragpanel events will be displayed + _displayValueLabel = Text::create("PageView indidcator custom texture\nscale : 0.5, index color: RED", "fonts/Marker Felt.ttf", 16); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, + widgetSize.height / 2.0f + + _displayValueLabel->getContentSize().height)); + _uiLayer->addChild(_displayValueLabel); + + // Add the black background + Text* alert = Text::create("PageView", "fonts/Marker Felt.ttf", 30); + alert->setColor(Color3B(159, 168, 176)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); + _uiLayer->addChild(alert); + + Layout* root = static_cast(_uiLayer->getChildByTag(81)); + + Layout* background = dynamic_cast(root->getChildByName("background_Panel")); + + // Create the page view + PageView* pageView = PageView::create(); + pageView->setContentSize(Size(240.0f, 130.0f)); + Size backgroundSize = background->getContentSize(); + pageView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + + (backgroundSize.width - pageView->getContentSize().width) / 2.0f, + (widgetSize.height - backgroundSize.height) / 2.0f + + (backgroundSize.height - pageView->getContentSize().height) / 2.0f)); + pageView->setDirection(ui::PageView::Direction::VERTICAL); + pageView->removeAllItems(); + + pageView->setIndicatorEnabled(true); + pageView->setIndicatorSpaceBetweenIndexNodes(5); + pageView->setIndicatorIndexNodesScale(0.5); + pageView->setIndicatorIndexNodesTexture("cocosui/green_edit.png"); + pageView->setIndicatorIndexNodesColor(Color3B::RED); + + int pageCount = 4; + for (int i = 0; i < pageCount; ++i) + { + Layout* layout = Layout::create(); + layout->setContentSize(Size(240.0f, 130.0f)); + + ImageView* imageView = ImageView::create("cocosui/scrollviewbg.png"); + imageView->setScale9Enabled(true); + imageView->setContentSize(Size(240, 130)); + imageView->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); + layout->addChild(imageView); + + Text* label = Text::create(StringUtils::format("page %d",(i+1)), "fonts/Marker Felt.ttf", 30); + label->setColor(Color3B(192, 192, 192)); + label->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); + layout->addChild(label); + + pageView->insertCustomItem(layout, i); + } + + _uiLayer->addChild(pageView); + + + return true; + } + return false; +} + + diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.h index bc17231970a3..ea8badcd5229 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.h @@ -155,4 +155,18 @@ class UIPageViewChildSizeTest : public UIScene cocos2d::ui::Text* _displayValueLabel; }; +class UIPageViewIndicatorTest : public UIScene +{ +public: + CREATE_FUNC(UIPageViewIndicatorTest); + + UIPageViewIndicatorTest(); + ~UIPageViewIndicatorTest(); + virtual bool init() override; + +protected: + + cocos2d::ui::Text* _displayValueLabel; +}; + #endif /* defined(__TestCpp__UIPageViewTest__) */ From 32e9f9eb15e3cfc99f5b5b1ccf98d921b7c74199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B5=D1=81=D1=88=D0=B0=D0=BF=D0=BE=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Mon, 11 Apr 2016 13:44:25 +0300 Subject: [PATCH 022/241] Add js-tests for page view indicator tune. --- .../GUITest/UIPageViewTest/UIPageViewTest.js | 56 +++++++++++++++++++ tests/js-tests/src/GUITest/UISceneManager.js | 6 ++ 2 files changed, 62 insertions(+) diff --git a/tests/js-tests/src/GUITest/UIPageViewTest/UIPageViewTest.js b/tests/js-tests/src/GUITest/UIPageViewTest/UIPageViewTest.js index d29d5a8ccdc5..d87eae89e95d 100644 --- a/tests/js-tests/src/GUITest/UIPageViewTest/UIPageViewTest.js +++ b/tests/js-tests/src/GUITest/UIPageViewTest/UIPageViewTest.js @@ -732,3 +732,59 @@ var UIPageViewChildSizeTest = UIMainLayer.extend({ } } }); + +var UIPageViewIndicatorTest = UIMainLayer.extend({ + init: function () { + if(this._super()){ + var widgetSize = this._widget.getContentSize(); + + this._topDisplayLabel.setString("PageView indidcator custom texture\nscale : 0.5, index color: RED"); + this._topDisplayLabel.setFontSize(14); + this._topDisplayLabel.x = widgetSize.width / 2.0; + this._topDisplayLabel.y = widgetSize.height / 2.0 + this._topDisplayLabel.height; + + this._bottomDisplayLabel.setString("PageView"); + this._bottomDisplayLabel.x = widgetSize.width / 2; + this._bottomDisplayLabel.y = widgetSize.height / 2 - this._bottomDisplayLabel.height * 3; + + var background = this._widget.getChildByName("background_Panel"); + var backgroundSize = background.getContentSize(); + + var pageView = new ccui.PageView(); + pageView.setContentSize(cc.size(240, 130)); + pageView.x = (widgetSize.width - backgroundSize.width) / 2 + (backgroundSize.width - pageView.width) / 2; + pageView.y = (widgetSize.height - backgroundSize.height) / 2 + (backgroundSize.height - pageView.height) / 2; + pageView.removeAllPages(); + + pageView.setIndicatorEnabled(true); + pageView.setIndicatorSpaceBetweenIndexNodes(5); + pageView.setIndicatorIndexNodesScale(0.5); + pageView.setIndicatorIndexNodesTexture("ccs-res/cocosui/green_edit.png"); + pageView.setIndicatorIndexNodesColor(cc.color.RED); + + var pageCount = 4; + for(var i = 0; i < pageCount; i++){ + var layout = new ccui.Layout(); + layout.setContentSize(cc.size(240, 130)); + + var imageView = new ccui.ImageView(); + imageView.setScale9Enabled(true); + imageView.loadTexture("ccs-res/cocosui/scrollviewbg.png"); + imageView.setContentSize(cc.size(240, 130)); + imageView.x = layout.getContentSize().width / 2; + imageView.y = layout.getContentSize().height / 2; + layout.addChild(imageView); + var pageNumber = i+1; + var label = new ccui.Text("page" + pageNumber, "Marker Felt",30); + label.setColor(cc.color(192, 192, 192)); + label.setPosition(cc.p(layout.getContentSize().width / 2, layout.getContentSize().height / 2)); + layout.addChild(label); + + pageView.insertPage(layout, i); + } + this._mainNode.addChild(pageView); + return true; + } + return false; + } +}); diff --git a/tests/js-tests/src/GUITest/UISceneManager.js b/tests/js-tests/src/GUITest/UISceneManager.js index 18b0cd4d04b2..d1aa7feffd60 100644 --- a/tests/js-tests/src/GUITest/UISceneManager.js +++ b/tests/js-tests/src/GUITest/UISceneManager.js @@ -533,6 +533,12 @@ func: function () { return new UIPageViewChildSizeTest(); } + }, + { + title: "UIPageViewIndicatorTest", + func: function () { + return new UIPageViewIndicatorTest(); + } } ], "UIListView": [ From acb38c9f165b211992b115ffca3038671373a24c Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Tue, 12 Apr 2016 16:19:03 -0700 Subject: [PATCH 023/241] ignore VS 2015 .VC.db files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5b9e8fdc4a3b..7a6440c66795 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ Generated Files AppPackages BundleArtifacts .vs/ +*.VC.db # Ignore files build by ndk and eclipse libs/ From fe84af5dbd5fd270c5b23fc0a9a76f39da84ce29 Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Tue, 12 Apr 2016 17:18:47 -0700 Subject: [PATCH 024/241] added zlib.dll --- cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1_app.props | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1_app.props b/cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1_app.props index c974f7009a7c..db92b65200ee 100644 --- a/cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1_app.props +++ b/cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1_app.props @@ -4,6 +4,7 @@ $(EngineRoot)external\$(COCOS2D_PLATFORM)-specific\angle\prebuilt\$(Platform)\ $(EngineRoot)external\curl\prebuilt\$(COCOS2D_PLATFORM)\$(Platform)\ + $(EngineRoot)external\$(COCOS2D_PLATFORM)-specific\zlib\prebuilt\$(Platform)\ $(EngineRoot)external\websockets\prebuilt\$(COCOS2D_PLATFORM)\$(Platform)\ $(EngineRoot)external\sqlite3\libraries\$(COCOS2D_PLATFORM)\$(Platform)\ $(EngineRoot)external\$(COCOS2D_PLATFORM)-specific\OggDecoder\prebuilt\$(Platform)\ @@ -14,6 +15,9 @@ true + + + true true From 2b4f3cf898df92a9615abd444f67c26e9c537441 Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Thu, 14 Apr 2016 09:16:51 +0800 Subject: [PATCH 025/241] upgrade deps to 90 --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index 371ced1dac02..54fa44a6aead 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version":"v3-deps-89", + "version":"v3-deps-90", "zip_file_size":"128440074", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", From d1ced49baab2686ab83133ee2774a66934444ba5 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 14 Apr 2016 01:57:22 +0000 Subject: [PATCH 026/241] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 38 +++++++++-------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 25171fe84159..0f97afe1b1c4 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -3273,8 +3273,10 @@ "external/win10-specific/zlib/include/zlib.h", "external/win10-specific/zlib/prebuilt/arm/zlib.dll", "external/win10-specific/zlib/prebuilt/arm/zlib.lib", + "external/win10-specific/zlib/prebuilt/arm/zlibstatic.lib", "external/win10-specific/zlib/prebuilt/win32/zlib.dll", "external/win10-specific/zlib/prebuilt/win32/zlib.lib", + "external/win10-specific/zlib/prebuilt/win32/zlibstatic.lib", "external/win32-specific/MP3Decoder/include/mpg123.h", "external/win32-specific/MP3Decoder/prebuilt/libmpg123.dll", "external/win32-specific/MP3Decoder/prebuilt/libmpg123.lib", @@ -3309,34 +3311,6 @@ "external/win32-specific/zlib/include/zlib.h", "external/win32-specific/zlib/prebuilt/libzlib.lib", "external/win32-specific/zlib/prebuilt/zlib1.dll", - "external/winrt-specific/angle/angle.bat", - "external/winrt-specific/angle/include/EGL/egl.h", - "external/winrt-specific/angle/include/EGL/eglext.h", - "external/winrt-specific/angle/include/EGL/eglplatform.h", - "external/winrt-specific/angle/include/GLES2/gl2.h", - "external/winrt-specific/angle/include/GLES2/gl2ext.h", - "external/winrt-specific/angle/include/GLES2/gl2platform.h", - "external/winrt-specific/angle/include/GLSLANG/ShaderLang.h", - "external/winrt-specific/angle/include/KHR/khrplatform.h", - "external/winrt-specific/angle/include/esUtil.h", - "external/winrt-specific/angle/include/winrtangle.h", - "external/winrt-specific/angle/prebuilt/ARM/esUtil.lib", - "external/winrt-specific/angle/prebuilt/ARM/libEGL.dll", - "external/winrt-specific/angle/prebuilt/ARM/libEGL.lib", - "external/winrt-specific/angle/prebuilt/ARM/libGLESv2.dll", - "external/winrt-specific/angle/prebuilt/ARM/libGLESv2.lib", - "external/winrt-specific/angle/prebuilt/Win32/esUtil.lib", - "external/winrt-specific/angle/prebuilt/Win32/libEGL.dll", - "external/winrt-specific/angle/prebuilt/Win32/libEGL.lib", - "external/winrt-specific/angle/prebuilt/Win32/libGLESv2.dll", - "external/winrt-specific/angle/prebuilt/Win32/libGLESv2.lib", - "external/winrt-specific/zlib/include/README.txt", - "external/winrt-specific/zlib/include/zconf.h", - "external/winrt-specific/zlib/include/zlib.h", - "external/winrt-specific/zlib/include/zlib.vcxproj", - "external/winrt-specific/zlib/include/zlib.vcxproj.filters", - "external/winrt-specific/zlib/prebuilt/ARM/zlib.lib", - "external/winrt-specific/zlib/prebuilt/Win32/zlib.lib", "external/winrt_8.1-specific/OggDecoder/include/ogg/ogg.h", "external/winrt_8.1-specific/OggDecoder/include/ogg/os_types.h", "external/winrt_8.1-specific/OggDecoder/include/vorbis/codec.h", @@ -3376,8 +3350,12 @@ "external/winrt_8.1-specific/angle/prebuilt/win32/libGLESv2.lib", "external/winrt_8.1-specific/zlib/include/zconf.h", "external/winrt_8.1-specific/zlib/include/zlib.h", + "external/winrt_8.1-specific/zlib/prebuilt/arm/zlib.dll", "external/winrt_8.1-specific/zlib/prebuilt/arm/zlib.lib", + "external/winrt_8.1-specific/zlib/prebuilt/arm/zlibstatic.lib", + "external/winrt_8.1-specific/zlib/prebuilt/win32/zlib.dll", "external/winrt_8.1-specific/zlib/prebuilt/win32/zlib.lib", + "external/winrt_8.1-specific/zlib/prebuilt/win32/zlibstatic.lib", "external/wp_8.1-specific/OggDecoder/include/ogg/ogg.h", "external/wp_8.1-specific/OggDecoder/include/ogg/os_types.h", "external/wp_8.1-specific/OggDecoder/include/vorbis/codec.h", @@ -3417,8 +3395,12 @@ "external/wp_8.1-specific/angle/prebuilt/win32/libGLESv2.lib", "external/wp_8.1-specific/zlib/include/zconf.h", "external/wp_8.1-specific/zlib/include/zlib.h", + "external/wp_8.1-specific/zlib/prebuilt/arm/zlib.dll", "external/wp_8.1-specific/zlib/prebuilt/arm/zlib.lib", + "external/wp_8.1-specific/zlib/prebuilt/arm/zlibstatic.lib", + "external/wp_8.1-specific/zlib/prebuilt/win32/zlib.dll", "external/wp_8.1-specific/zlib/prebuilt/win32/zlib.lib", + "external/wp_8.1-specific/zlib/prebuilt/win32/zlibstatic.lib", "external/xxhash/CMakeLists.txt", "external/xxhash/xxhash.c", "external/xxhash/xxhash.h", From 009c7926f6e92586c4df324e03dfbe08e6554f94 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 14 Apr 2016 15:09:58 +0800 Subject: [PATCH 027/241] update changelog (#15424) --- CHANGELOG | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 9b7a46eb42ff..3522322f85a9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -22,14 +22,16 @@ cocos2d-x-3.11 Apr ? 2016 [REFINE] Renderer: TriangleCommand and QuadCommand are merged [REFINE] 2D: SpriteFrameCache takes pixelFormat into account if specified [REFINE] UI: let ScrollView swallow touch events by default +[REFINE] JSB: make selectedSprite optional [FIX] JS: firefox v30+ can not debug cocos2d-x JSB projects [FIX] UI: can not get event when PageView was turning [FIX] UI: bitmap font sizes are not loaded from binary .fnt files -[FIX] 2D: TargetedAction::isDone() always return false -[FIX] 2D: some fonts were rendered incorreclty +[FIX] UI: some fonts were rendered incorreclty +[FIX] Action: TargetedAction::isDone() always return false +[FIX] Action: Repeat: will run actions more than speicific times, instant action will run one frame later [FIX] 2D: drawing in incorrect app state on iOS -[FIX] 2D: FileUtils::getValueVectorFromFile() returns wrong value on iOS and Mac +[FIX] Platform: FileUtils::getValueVectorFromFile() returns wrong value on iOS and Mac cocos2d-x-3.10 Jan 11 2016 From 3eb7d62e6e5796aaa99532fa17ca28e8d7d175db Mon Sep 17 00:00:00 2001 From: Ricardo Quesada Date: Wed, 6 Apr 2016 10:26:46 -0700 Subject: [PATCH 028/241] fix: compile in Windows Github issue #15372 --- cocos/scripting/js-bindings/manual/ScriptingCore.cpp | 6 +++--- cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp index 6c63d1c91c86..33d7d12f1a52 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp @@ -216,7 +216,7 @@ void removeJSObject(JSContext* cx, cocos2d::Ref* nativeObj) auto proxy = jsb_get_native_proxy(nativeObj); if (proxy) { -#if not CC_ENABLE_GC_FOR_NATIVE_OBJECTS +#if ! CC_ENABLE_GC_FOR_NATIVE_OBJECTS JS::RemoveObjectRoot(cx, &proxy->obj); #endif // remove the proxy here, since this was a "stack" object, not heap @@ -2192,7 +2192,7 @@ JSObject* jsb_create_weak_jsobject(JSContext *cx, void *native, js_type_class_t JS::RootedObject jsObj(cx, JS_NewObject(cx, typeClass->jsclass, proto, parent)); auto proxy = jsb_new_proxy(native, jsObj); -#if not CC_ENABLE_GC_FOR_NATIVE_OBJECTS +#if ! CC_ENABLE_GC_FOR_NATIVE_OBJECTS JS::AddNamedObjectRoot(cx, &proxy->obj, debug); #else #if COCOS2D_DEBUG > 1 @@ -2262,7 +2262,7 @@ JSObject* jsb_get_or_create_weak_jsobject(JSContext *cx, void *native, js_type_c JS::RootedObject jsObj(cx, JS_NewObject(cx, typeClass->jsclass, proto, parent)); proxy = jsb_new_proxy(native, jsObj); -#if not CC_ENABLE_GC_FOR_NATIVE_OBJECTS +#if ! CC_ENABLE_GC_FOR_NATIVE_OBJECTS JS::AddNamedObjectRoot(cx, &proxy->obj, debug); #else #if COCOS2D_DEBUG > 1 diff --git a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp index b2db0bc3ae25..fdc1c0777a9e 100644 --- a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp +++ b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp @@ -2215,7 +2215,7 @@ bool js_forceGC(JSContext *cx, uint32_t argc, jsval *vp) { bool js_cocos2dx_retain(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); -#if not CC_ENABLE_GC_FOR_NATIVE_OBJECTS +#if ! CC_ENABLE_GC_FOR_NATIVE_OBJECTS JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); js_proxy_t *proxy = jsb_get_js_proxy(obj); cocos2d::Ref* cobj = (cocos2d::Ref *)(proxy ? proxy->ptr : NULL); @@ -2230,7 +2230,7 @@ bool js_cocos2dx_retain(JSContext *cx, uint32_t argc, jsval *vp) bool js_cocos2dx_release(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); -#if not CC_ENABLE_GC_FOR_NATIVE_OBJECTS +#if ! CC_ENABLE_GC_FOR_NATIVE_OBJECTS JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); js_proxy_t *proxy = jsb_get_js_proxy(obj); cocos2d::Ref* cobj = (cocos2d::Ref *)(proxy ? proxy->ptr : NULL); From 2f868098048614305639956c603461e00d3a377e Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 15 Apr 2016 09:46:56 +0800 Subject: [PATCH 029/241] update release note --- CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 3522322f85a9..b1cce323713b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,8 @@ cocos2d-x-3.11 Apr ? 2016 [HIGHLIGHT] Physics: upgrade chipmunk to v7.0.1 [HIGHLIGHT] JS: new memory model, don't have to use retain/release in JS +[HIGHLIGHT] Curl: upgrade to v7.48 +[HIGHLIGHT] OpenSSL: upgrade to 1.0.2g [NEW] JS: web console is enabled debugging JSB projects via firefox [NEW] UI: add a setter for touch total time threshold in ScrollView From 69bd99476062d213fa8581a1db38f8d332e75221 Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Mon, 18 Apr 2016 00:10:35 -0700 Subject: [PATCH 030/241] added missing _USRJSSTATIC preprocessor define (#15438) --- cocos/2d/win10_props/cocos2d_win10.props | 2 +- cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/2d/win10_props/cocos2d_win10.props b/cocos/2d/win10_props/cocos2d_win10.props index b298cac4ff89..44df4754432f 100644 --- a/cocos/2d/win10_props/cocos2d_win10.props +++ b/cocos/2d/win10_props/cocos2d_win10.props @@ -10,7 +10,7 @@ $(EngineRoot)cocos\editor-support;$(EngineRoot)cocos\platform\winrt;$(EngineRoot)external\$(COCOS2D_PLATFORM)-specific\angle\include;$(EngineRoot)external\freetype2\include\$(COCOS2D_PLATFORM)\freetype2;$(EngineRoot)external\curl\include\$(COCOS2D_PLATFORM);$(EngineRoot)external\websockets\include\$(COCOS2D_PLATFORM);$(EngineRoot)external\chipmunk\include;$(EngineRoot)external\sqlite3\include;$(EngineRoot)cocos;$(EngineRoot)extensions;$(EngineRoot)external;$(EngineRoot)external\edtaa3func;$(EngineRoot)external\unzip;$(EngineRoot)external\tinyxml2;$(EngineRoot);$(EngineRoot)external\ConvertUTF;$(EngineRoot)external\xxhash;$(EngineRoot)external\poly2tri;$(EngineRoot)external\poly2tri\common;$(EngineRoot)external\poly2tri\sweep;%(AdditionalIncludeDirectories) - WINRT;_VARIADIC_MAX=10;NOMINMAX;GL_GLEXT_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_UNICODE;UNICODE;RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN;%(PreprocessorDefinitions) + WINRT;_VARIADIC_MAX=10;NOMINMAX;GL_GLEXT_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_UNICODE;UNICODE;RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN;_USRJSSTATIC;%(PreprocessorDefinitions) true true false diff --git a/cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1.props b/cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1.props index e4f953eb8308..600edb48cb05 100644 --- a/cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1.props +++ b/cocos/2d/winrt_8.1_props/cocos2d_winrt_8.1.props @@ -10,7 +10,7 @@ $(EngineRoot)cocos\editor-support;$(EngineRoot)external\$(COCOS2D_PLATFORM)-specific\angle\include;$(EngineRoot)external\freetype2\include\$(COCOS2D_PLATFORM)\freetype2;$(EngineRoot)external\curl\include\$(COCOS2D_PLATFORM);$(EngineRoot)external\websockets\include\$(COCOS2D_PLATFORM);$(EngineRoot)external\chipmunk\include;$(EngineRoot)external\sqlite3\include;$(EngineRoot)cocos;$(EngineRoot)extensions;$(EngineRoot)external;$(EngineRoot)external\edtaa3func;$(EngineRoot)external\unzip;$(EngineRoot)external\tinyxml2;$(EngineRoot);$(EngineRoot)external\ConvertUTF;$(EngineRoot)external\xxhash;$(EngineRoot)external\poly2tri;$(EngineRoot)external\poly2tri\common;$(EngineRoot)external\poly2tri\sweep;%(AdditionalIncludeDirectories) - WINRT;_VARIADIC_MAX=10;NOMINMAX;GL_GLEXT_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_UNICODE;UNICODE;RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN;%(PreprocessorDefinitions) + WINRT;_VARIADIC_MAX=10;NOMINMAX;GL_GLEXT_PROTOTYPES;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_UNICODE;UNICODE;RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN;_USRJSSTATIC;%(PreprocessorDefinitions) true true false From f578042d262d00747ff0188afd39971b87f99119 Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Mon, 18 Apr 2016 21:20:25 -0700 Subject: [PATCH 031/241] update version to v3-deps-91 --- external/config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/external/config.json b/external/config.json index 54fa44a6aead..839299e5a75d 100644 --- a/external/config.json +++ b/external/config.json @@ -1,6 +1,6 @@ { - "version":"v3-deps-90", - "zip_file_size":"128440074", + "version":"v3-deps-91", + "zip_file_size":"124463259", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", "move_dirs":{ From 4d7bf1f8274b988987867db8018ffba65f1d462f Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Tue, 19 Apr 2016 09:07:30 -0700 Subject: [PATCH 032/241] updated expiration dates of all winrt test app and template certificates --- .../proj.win10/App/HelloCpp.vcxproj | 6 +++--- .../proj.win10/App/HelloCpp_TemporaryKey.pfx | Bin 2450 -> 2450 bytes .../App.Windows/HelloCpp.Windows.vcxproj | 6 +++--- .../HelloCpp.Windows_TemporaryKey.pfx | Bin 2450 -> 2450 bytes .../HelloJavascript.Windows.vcxproj | 2 +- .../App.Windows/TemporaryKey.pfx | Bin 2450 -> 2450 bytes .../proj.win10/Package.appxmanifest | 2 +- .../proj.win10/cpp-empty-test.vcxproj | 2 +- .../cpp-empty-test_TemporaryKey.pfx | Bin 2448 -> 2450 bytes .../HelloCpp.Windows/HelloCpp.Windows.vcxproj | 2 +- .../HelloCpp.Windows_TemporaryKey.pfx | Bin 2450 -> 2450 bytes .../cpp-tests/proj.win10/Package.appxmanifest | 2 +- tests/cpp-tests/proj.win10/cpp-tests.vcxproj | 2 +- .../proj.win10/cpp-tests.vcxproj.filters | 8 ++------ .../proj.win10/cpp-tests_TemporaryKey.pfx | Bin 2448 -> 2450 bytes .../cpp-tests.Windows.vcxproj | 2 +- .../cpp-tests.Windows_TemporaryKey.pfx | Bin 2450 -> 2450 bytes .../App.Windows/js-tests.Windows.vcxproj | 2 +- .../js-tests.Windows_TemporaryKey.pfx | Bin 2450 -> 2450 bytes 19 files changed, 16 insertions(+), 20 deletions(-) diff --git a/templates/cpp-template-default/proj.win10/App/HelloCpp.vcxproj b/templates/cpp-template-default/proj.win10/App/HelloCpp.vcxproj index e42546c5f660..85b38afda956 100644 --- a/templates/cpp-template-default/proj.win10/App/HelloCpp.vcxproj +++ b/templates/cpp-template-default/proj.win10/App/HelloCpp.vcxproj @@ -1,4 +1,4 @@ - + {187d3e60-961a-41ee-bc18-c510a431d22e} @@ -125,7 +125,7 @@ HelloCpp_TemporaryKey.pfx - 69E61EED9D75298C20C00383913E70404878E922 + A65425A251E18D5D9AE2DC68E216D4AB8C0B5C18 false @@ -293,4 +293,4 @@ - + \ No newline at end of file diff --git a/templates/cpp-template-default/proj.win10/App/HelloCpp_TemporaryKey.pfx b/templates/cpp-template-default/proj.win10/App/HelloCpp_TemporaryKey.pfx index 5c4447a929f04d52dd7f2c9e19aadd8313628c8c..b1c58aeceb1817f5da8e537e2dee73d1bfdd5888 100644 GIT binary patch delta 1991 zcmV;&2RQhW6Ot2mS>)e}&%#E^w|1J$&q$zU|y zjTp#{pi>s}+k;ilQm4EOc_z5OGPndKnA^hPbz_jeK>=1tAAih;{<>hi9xj>H5*6p6 zf3@q@(mw=Sjg1*0lA_R%{UJ1;WK+Tiz0pT4Aq$^X@|>SCVmc7XuoNDg7nX$!`>0#y zpApN37Ue1i^|OzG-I#@CZvhw z;Qyv--7XE4eWFXzo{;RB?r!+~>i<@E&1R z+AaEl4bz!R^TK`pn=)S3W(EDw6QX2DZ|3MH#;O;l@*`G;pmSR-KM>s6?IyMuj6IZV z*v4EKeScQ&I-)NKaFHO0w!+XZA%x82AJIw)1FNHng@>WCq2#TA+uDi59{xQiVOp{KJ=)?=D@~I5GEUgd^x>^h-@m*dxmDj#83B%8xlX-}{M(rx_3)j-69|AfnM+3~ z4V6<8S++GvKQgE3tie=dBV$5p^9m8_xDu7eH8D@S|bdVVze#@S2fI=Nl8*+(=AfL63fR)T`JJ>c*`BS_P;Q=yH~J=RZMW{>Oz z`G1jC%^XvFll~AjvlacHtpZGF<;s|7Td%PZ;_vgUUpQ>Y1)#Dr`syD69Zl%$2xET_ zmeu$O%hHTBb%sp$uE=$Inlc;?yJMCO>OQ&L?L8K=`(66Z!p*_H=uw@{z0N6fwrzXi3D*rbiEcNT5Vmdg2wZH@f%c__og{eGf;_NJ z!eSf{sn+JcAq2hgIPxaxoLIHPbjX9J9y|t3OaA#5^~#sU@*)2txXR$c^tF*v7*a$C z^y7ho0HeuYQy$KtISbL@sl3ZrLw^jH6!mowBdrmVF0?_;QIskMdZs` z!9HnL>QVA#HFd$B8&;b+|L{ZyYKf*mMx;QncA|`tXD?fz2=z1_>&LNQUqV;F%0g^rfBB$ilztKaMn>1-ml-{VzTV@CN$Glq+zzLQ# z6GBLVKaS(hkQW?3P7Uy4y}zW})OubR@em?*C#);oo9mIr0IqNy zYiJnHb?2e&To50V4<%_7^j83pjJCz3m?`GQjEduLU=N%AsDtX$f!9175`v78e-E3Z z*l)jZM99zG(V{?!mk+>hE;izsO=wcIbD0Nmgp1?y-)5?DnJaw&Ri}T)W*)~tll8uf zoIYQkUnh@*VLRvzR;vLZ(BNp zY7(d=GHRR^Iv+KJ2mKIz=!ewh0%2Q|J_#l+4Hu%bzKD6;IE^+wFPA!C;}q;k1QZ}) ZZV*z9q@Nk|J3(B}Z9DEp$_)Yn2hfs$w@Cm1 delta 1991 zcmV;&2RQhW6Ot2Sq*_g8_6THw?RzkJ@$ zB&y*2-cBJ4s3Zf#4jaShtEfeC52t2FAmYD{*%@3=#dqR>O4Q;qY~=d)babBDJ5uU5 zVwqdoQv4WcI--?Kk7tf2L*0ZOl<0)mnhX=x6?uaHws3ps^r2138SADG{HqUDP=m^XF zFH!UIq<_^gb%yIN6G2dT&~no>|2hpUeZF8nBDzh!go01~N{{tP(4jBEsObp+HYn_W z>*1-^`J*-!x5Rhij*;8}s45e;+OUjoY#jViN7!9EZ}LrJJGuIC@?QCESW1(6DQiGMD8@xQna4+`nkKY>&1*mZUr;hsQB zqwk-4s^FVz)zvcOLwrNmwu1PjKN3lH=Bt*9a(?S2kjGxG#EPs0#!`c^bP)?VO)Dt91SM{{g&W`CN> zd??f~P26lA9ibW64{h-+;NK)A9UA)R5RDP)Tu>%!{mN%Gj-$_Gzf8%w4anz*ACsQ? zp*VSj;kQ(SlN&)RYc=#cV>XH)kHLl}!w$1(pHLJpphn zL_$eY(4GoRPA6_g^ZQM6L<^3Gj(>-n;nQ*UhluMk?zmb-`$Br?_V4mz=oHM-JH%23 z--L)5tiqTXPMTbG|L`yD#{053PwRYvmS_eXJ$fqy=6vL5p_+h zkMe}l92KDtg*1SgP~PX^=&uQ)?G%A9KW3itDHhl&LNQUHdTILgz_iBCsgROVn(TH1E*rAfS z9#?-+{!pzc6ry>1|yo(e0esu88@F^BLAAeBWJxpNQkm>jCKgDj0A zBg8ufrhC9m#Sx=aeMbw+@>nt#OGtf2MlT=NC_V^hRThnhvpbOC4pOu*+jt&8r<%Kw zu@PC4rujtid&DXo84$KtwgRgYlluole^rN%m+f(+T^Zb{_~XB8#K+}szTY|x0Jxxa z4zA(Q%@ZzDtJWc%LfuA#%wihtAHo8VHT|fe0`a(48TtER;K5|v4m)0BdE&E(!y#lO zDMy8M%m4<Z1R?8WP33?6_qNwis&-j$lR+)7U^IyRKwJ;^16@r_eNS1EHotA;cd2pr;}Nl_{+4t#slIlc8(>NLyjqniR_Y#L6p4&Xm>! ziC`z$z5ES*4)M|%P3#9ymS@HV5YHE=iDgj6MX~-MiFiGXB4t1IO%rwtp}+G)^*3uu zzhVL1o}Y3~tsItM3629aM@&Q70&{zlJ_#l+AtJ=!DB-m--9OtfwVJyP;}XLM1QfCe Zb!pDGPi#>^=!J2DP|o}|gh2uV2hd_XuE78R diff --git a/templates/cpp-template-default/proj.win8.1-universal/App.Windows/HelloCpp.Windows.vcxproj b/templates/cpp-template-default/proj.win8.1-universal/App.Windows/HelloCpp.Windows.vcxproj index cf5b513ee401..92c261161a86 100644 --- a/templates/cpp-template-default/proj.win8.1-universal/App.Windows/HelloCpp.Windows.vcxproj +++ b/templates/cpp-template-default/proj.win8.1-universal/App.Windows/HelloCpp.Windows.vcxproj @@ -1,4 +1,4 @@ - + @@ -114,7 +114,7 @@ HelloCpp.Windows_TemporaryKey.pfx True x86 - BF581B3BB7204EE28C310DA2AFC1D084BEA81274 + D1342F9E64B60E24773C7E212EA97270DF0B3470 @@ -214,4 +214,4 @@ - + \ No newline at end of file diff --git a/templates/cpp-template-default/proj.win8.1-universal/App.Windows/HelloCpp.Windows_TemporaryKey.pfx b/templates/cpp-template-default/proj.win8.1-universal/App.Windows/HelloCpp.Windows_TemporaryKey.pfx index a5ee8feeb9168739aaa08dba1c6a4fe9c86564e2..9cff791f69116a710d63d12bb194f5833fbb246c 100644 GIT binary patch delta 2080 zcmV+*2;cXT6Ot2uFoFq&0s#Xsf(b$f2`Yw2hW8Bt2LYgh2{QzO2`?~$2`eyy1@Z<7 zDuzgg_YDCD0ic2f;{<{Q-!Os&+c1I!*9HqJhDe6@4FL=a0Ro_c1okk31oAK(1_~;M zNQU5Nu$1?{d?e8ScPmrXw*p`fW7U7J)3!@tdmxTbM zY266d?By3*Bl8=2y9e`q100-`IzZPFw`A>xqeO+=j4*SQ=A8!lOQZVt22SkdDKgCO z8x7IoE#Q=YbxA&5PIy=}2K0Wpyn3#ljI48jms7eqeRqHO{ZN^u3)dn5^zB@M;hyS!hsy@&it+w7yTik7oC%Dm+1iB^qy2 zZ>|m$x~~n|1mpnr8&SjqioMPT4GkV^I0dgZ_^J0XgTxbnFxXWE=Vg7ZV{mi?kAzGjXD~d=U9hPT<~& z%Wp)n`gaI#oc5fiEzdk_4w2F&{*}KV5iKBpMj{5I8~j*+8mwxA2BV!dnowDsKP=h- z=0qFue^Em#c3MaOr|X7Fp(_JP`%24&5LdnYCZa`LKu9^xj=+QKhO9#(IQ&}b@M2v; z{eE$muj2SXy+nInWOWKhgh#1FE(&y<3~#JPxjzs?=Z=h&@dhd-vd5f`NuaqWAF^MjhoRW*2rsR8U4RWJ!K9`C4UO!!ov`0 zM(kp!-K^%3ZUOa?Y&wiV}(VOpXezN(jvTokT3A!$ z{S`WV8sLC(U7|egqz!XlnuLaDpy5dIFuL=#s0DLCOZI{q45{9A00VwJ2O9f^u=lWo z-)_F@I8l42(rWF2L(#LxAi5Q>aF#t=DAt$yY4LJ{glB5_x+x1WBpBUOq}Z`u2N_;{ zh(v`HJife(kg6(mssKKS+{Rdc-5Afc+tou|R4<$Izr3nZ?#~BHGAGs`6=Kz?o=uo5 zymrh+7nAY@O2RfwKIWrlE6S;^d1_@1s3o%a5CPH~0k6;KpWW8}JCZVk$SH@gCtQ8v zLFb}a)9p@t`>}ioOTNOMF8iW2cbJ(nHQT^N(Q}7{%Z%EeM#l3Bc=|6=xDKskL(`1} zPH+41k7P4kjh0E@L2lwhE@Jljm+dHspkGYD5bpGU<1ayZI6CpV`_0ZBXh0JzjsijD z>2IoVht#XgjX%*g0SSd@)6)^00}hi=1u92j05t$L0A&C&0A>I+0Av6y0A&C-05~v3r|*)hXy7ZHZU|XIWaacFfln=7Y#8tFf=haGBPkQF*%dR1~h+* zP29Y2YOTS-`BCLX$Cdt%Yhcg3FfD_nphFls*2su^q7NV0DEY7gqOb5x>5xeR(S-&W z5%XUYRq8NPG!|cGim161dy!KsLm6Zobf-Sm6x6?>gd{H0NLtDk32vY$WjP4=QcjST zSulPQ)iQbHgWdAg)>>=3@;Tx|co%Ag%UYJ(&R2)-P%_NRk~*L2AQL8r zHtpogE_U|nGs_hE$6LVg*u3?23GJjAJYXx*2GhCfKJ@ZaYXFsby3f<<#L#PwHDS;e zGnUsQLxQMEt#E{IH}h28aM8`N6n~xvj(>irQ~7G<5$>6>50!eY^f+aM*lcG1mP&PbNnbBerOw3e5bOvk!}6Tg*k)EKYtGs|6;{ zOJC||(^mFU$_GXc12lDbp=ppSqF5VNt-jl|!{I6X)aC(0Tl|PB90_Re$d^s8r2?V3 zlRgP1HW*uI5*Gvah_bPn!$(v{20qg%3j`D%_iE3;-IEm5U`ad`nOHTin0k%^0te6l K000000000q@v*xA delta 2080 zcmV+*2;cXT6Ot2uFoFq=0s#Xsf(c3n2`Yw2hW8Bt2LYgh2|EOW2{$l;2{SN)1^NaF zDuzgg_YDCD0ic2f>jZ)Y=P-f=<1m5+-v$dRhDe6@4FL=a0Ro_c1pY9B1o|)>1_~;M zNQU(Ij6I>)c3@$MB6*K?NOH7G)t9BUWFkdHAJ@~%F5T$ z2XE+T5us6YsVR2BdxPMowapcpc2!{DJu8f?^!_HSI=6Jg0%|L9v**=^PF}7~02~x= z6U?ikan-eS2xy^8%1FI`%}?>p~5!qTebXsT1`87hhU0us!>hY zN*uekv~r${s8onNwYq+e$jTJE>A%r2(rqr(?3H)iKj*&sDzu;eF$5CZ@#*L>oA8Rr z6%=8WK(|}_EO1N4!TPgjZ6_)HQoHR%b|Iu3nEd}3z9aqf4cOvyW04h=S$HxB)Dbah zMs5UuwxS`(s!XWHCd(!ys_PiCf$rzwk}tDHhx@oLaZ|Q4?FADtCp)b)A5rF#H^1f` zUS-xWh?pF_czVU#@fFpu&SS0n~OfkOcN zIrNWvXNfI-Z)R^=fk-I!rHOCMVWRms$h3R?yUYL+v5ofmVGb;cxW|ah=4qzrUv+Bw z0UPB^b_SQ_S|ERv0n`o=49!X~dSXfvy_P3@$v|+ndF1^Xs(lo!K0OyjSDMuZB9ViC z{sbGVYY(~fmKpQm_OQ5zj{7_IlI6R41!}8w`SYj1iLJ4i2(dzs+i zDChz9?PP|e6yTXged~aKT#crG$sD5z=$p!+#1EA$Ejn}Cw=}2M5E*ZB z=rI2w1={XMtl9N&sM%IfRqzmt^k^h)660?edaT_AOPk%2vU;DZEl$Z}ub!1yNpNlR zZ%Bh55d?X34(763Iaf^^Mp&S-!b#pTEbF+-ypx$p>!c3Pv-@m{yB+SZgWqs|b}@y@@~TTo9mw zv@iW`n|EIQRXq`}f$~)YfUeqq@AUtEO5KE&wvdh^8ygL8gj)_WyV0Qwd>nO$9)PM8 z$so&nu&uL)UTUfA9^GXv8Lx;adMO9uuUcRt50stdp$yq9#UF^Z6aG&5uut)RaBF>K zYUe^;9ctwE@<&4m85iXLQXv%IsnEi7e+{YwaA|zgr4IU--a8@qyhqqtVq%6us=PWX zrepQXt~=zkN`R(UG0iJ-2k5v~=cd$eDHG*(UDIF=99ZMGnpW*%4P*Om!al33tc^Q2 zMaCG_>#l}oa5;-zN;vEdmqj*g`<;51u9230Av6%0AT=P05$+J05kwC z0A>I)0AT<*04)GC0A>JU05t$D05||M0AT=Q04)Gx05t$L05kwL05SkJ05||J0Av7U z0ArK61-1|!(lSfXB98wMQL3B7INqccor;{2m%GGZ}F zwe+OVTksRoF)9JY(421EQOYGr0;&ZD;bBOc%Y|}6g%cr%Rd!Nsr z2(SXbMU(RfLw|$qq{K3}(Wx@RtW8qHGCqWvBYeGDyeZBE#8k&k4DZccIj1~jH=XW; z6y}q)XBdrtUS3ZDW&l!^ugRlRsuYH&i^i|$!%BC zA3}&{AXGP;D1`jIl5BEQqK(`9tkE++A%wlEE2p*<_*}ZqG0X2T)C&4gOYhLEEtNw@ zkTemporaryKey.pfx True x86 - 7BE2570D98E1798E21D435C4F19076AFEB9AE074 + 78049EAB4980D535620EA948E9C4A302EAA34D2E diff --git a/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Windows/TemporaryKey.pfx b/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Windows/TemporaryKey.pfx index d81d48f986fed7aa298a9942862a4cb0e97347d9..688c22a57cf8d2357c5a6cdda9d72b33af069d8e 100644 GIT binary patch delta 2078 zcmV+(2;ujV6Ot2uFoFq=0s#Xsf(c3n2`Yw2hW8Bt2LYgh2|EOW2{$l;2{SN)1^NaF zDuzgg_YDCD0ic2f>jZ)Y=P-f=<1m5+-v$dRhDe6@4FL=a0Ro_c1pY9B1o|)>1_~;M zNQUs!inaliGY+61MIT0OB=i#)Z|1!XO@in4}%^Y?Zd|CQUHz|<5B4recR`6 z+ISIgHgphw_}WdTyefM?{pETg+dK*O(D98uHn&?R%<8kp`=;4|YUg1*;rwlmkyVKi zc;sYK;!dFURl6MPzgdRO@WtWM*3mWDD$(pvn=67T43O#(y@t+PRMFpK`&E)9W9QVd z1;QIVnO!n7fx4~5-S7je&E%HH92f%Ysyg8td6ct%@)*r*{b>GOs|T;&w^*cc3!KvcvCJ&hB9+69|D)taO_Pc0|9CxEdHxF|RABgYHP{ z_T3HiRUzuRf;+Cv8)#b{WlDrKHqg9Hi3NwC2Ib&{oyA>$-d1+!^pBs5gAf~lWjw)|96Q5I@7O#oNKgG$P zy$Z(bcu4R;!kv@RwWGMW&AiX z*no{1C*AvHk<8l-a(rYGOfQ zsoj`V;-q?TiNEU~mO`CCn1C)T;Vik%KULxgTiEL%0L8;0$PVlnE+=+c^xY4Y8k9!g zF5Bn!x+HhfQBYd7b<>2-ZV|bnhHp^Xwizcw?5}nWKANm3xnBl8oz)tQ-$Xcs8<)|k z{7jHq)QkkB&Dbe7teU6Ut{Nt?`{Gntw5la*FKm-Y1u8`~05$+O05AYz0Av6)0A&Cz z05kw$05$+Q04)GC05SkM0A>I!0AT$di8tCK@&{G%-0bHZU?WIa(JDF*h(YF*!0aFfuYZ zlfMQuf6A)_2V^%Xnq-%x@?MM!5U~!-0qYnUS5w1*YvuX*s60JG>08&@_M(gn}BRDHgTS7}eYl7(Le?Qh+6G67gq4SC^8sATsIZRjjnqtup zMCA<{V4^nWMVr$^(NU}e{$WxXLQyk(7OzH8?Zs91^T?7#9Q=aaWSnZA+QLI$ZUM+$ zdK5mI(#T=s2nX@rb@Gz>iLd5$B)}`dw8ol;qGv{0;J?XXBk*^*L=Pu!QFkvO{EU5d%-i4T z4c`y2cQUNQy(oBrM?kMF1;WJkKxaUDormst4ZPnC!{0E@<86S delta 2078 zcmV+(2;ujV6Ot2uFoFq&0s#Xsf(b$f2`Yw2hW8Bt2LYgh2{QzO2`?~$2`eyy1@Z<7 zDuzgg_YDCD0ic2f;{<{Q-!Os&+c1I!*9HqJhDe6@4FL=a0Ro_c1okk31oAK(1_~;M zNQUxr{x%ruE=CvAG7SJrJZbE2Q=74WLJ*ZZ`!^ z=C8mDju-txW-{!apFl?m9el@)W{L}znP%I!fe<%8LfUz#({gH9OTkk{7Yt_8m6H2n zx$8JWvm6M2`rmnP#v?jZjCze`!8r&G)LSzh5wTVPWHiPL)zu5lnids+&6iNh=;rFO zN-`8!MO0!OADfbw6Oru9bF;!7c8+#Yil5)qfSP$z0*NUd;E2oCZ0EoPVBBj#Z>L>3 z+aaJGruZdhEK#b^{xGH?PP!8jFsCld{3zAQfzvO4H-SIAzQq{Jie7|1e6~M`H|+!$ zA+e1RA;|tQqjRs(SnHMP3u`FAs{vOxIOm_-inrrBx6u7w^~DIiH0x4%^;8Bk@TaK;ej2zZX zw?}$^bWFGZG=E);x0&<%3$ao|Oxo`0aG6ILp{_L=Ze7@4BPuFN_)b$WIaS{cn~tG# z%Y5Bqn%;SndaQW_1%!lY*dBAz;t+C+4{^-ahERQn8YPRKhub#q_gkirSps7iFTj9` z`2?9l%L+?2zsBfOL0!shcuhFCcvxk)r~4$L%3?sA`a5%UmP1QZloj4qf2dk zAkF(gUFTeWAK{M1@mS>JaaK1erC_(zRZ-{Len4&Ve~f{c4Qc;O_s(%tY3hp2ck_S`y!|e}t&)TT z=wHhQ*oKJbhD`;uG31&_v?3`Q>?QgFn6i>*_J@SxAn|EsS#HBW*CXVw4^1+%1C6Us z4MEKu(CCEsIXDoTH)lDMN(Hvp>zp8e#Aq)MNr{1iJ~giXXNAJNs-q=@JDL_L?@Z#C z^gPh1UN90|iJw5#QWR!T_!=dzY%L}rj_n07oo!J*T^OYPAV;o6^fsMYomN?AmER*2 z!=Z?Mbq|uww##BK7MN%+x@Ku39X+6?6x14+SoeO}H2{{=Ek+3!dkserJzE2R&7<@R zb3i0UzLTG26>b+Iu8i2_YkAZ|t;T2uxj))nE?a8S!jDCuphic7-rZby{F)&% ztf?+kKP{>uvkTe7&@KNJ8Ov{fE5qH!(h~Z~3$DHwebC|<(c9DZu;D?mEQm@8spR!R zj=av&Gc+$S5hPHi^YsqU@-&+o**s-pEh3FShBzY|81KJEV&gIw55M}yjVD+obr!M! z@y(b=2uioOrdJ2}ZKDE%vrgJsas|Ky8WM-hX3_^AxDh>}_U6^kL3*T8OV969BJ!`d zaFVh`)IM08N`uLo8z=ZOK6cRWk%pd&Fo}{Ja+erI>iTSTw>45aI`W#6<0i8y17L%i;RMnGE1u8``05AY$0Am0!05SkF0Ac_w05JX05bqN05kwO0673RlfMPH5FX{c zaX$0`qC);1_<*U+O_PTPCK@#{FfuSPGc`FiHCh)9F*Y$UF*z|gH90jklg9=$f6H{M zlxm2-?BHxUOMJ=NwvKnY9hh@UBQhmAUP3*}ta2|pHVkv$DCX4;G}NtQ5|$<4U{oIk zr=H6+GnJmQ?4pq4$*%`~I&&Qfm~H%yd{-l@c_cx_)~CR?8r#HMKZEP?kR*(*HmlMx zDO?k-Hm4NNCe!vZ@pP7cK3k(^f5>zbs|l&?yCYOgO3B84%8%p{WK!*+|@8P0JDd7K4iKRg zo9&B2+CoBSxz1?ubd24bTXs`f_aLo@LH^b2`re%v%Y=TI0E|a5XQ5uZJf^cg;-9|L zlU}5iPsZI0@tC~_-(KD>=P%NpP(2=hVb|d3$XzJ~FI<;UGA*T?j}>_w$X5ZH=RORh z^4@h&2e1OOjmr#8*2DCKZ>0(#uB(Jg0kUuGI^&t{arg))k5uJcTbDLL*IhKz0R6WW z)f)!V_}njqbI&e - + cpp-empty-test diff --git a/tests/cpp-empty-test/proj.win10/cpp-empty-test.vcxproj b/tests/cpp-empty-test/proj.win10/cpp-empty-test.vcxproj index b08f941b4488..7ebb3c29dee3 100644 --- a/tests/cpp-empty-test/proj.win10/cpp-empty-test.vcxproj +++ b/tests/cpp-empty-test/proj.win10/cpp-empty-test.vcxproj @@ -125,7 +125,7 @@ cpp-empty-test_TemporaryKey.pfx - 8E2EFFE1B27ACCF9CDBF2D5496DEE796CE2E6569 + EC3927E758F5E53DC59521EED57869F363F39357 false diff --git a/tests/cpp-empty-test/proj.win10/cpp-empty-test_TemporaryKey.pfx b/tests/cpp-empty-test/proj.win10/cpp-empty-test_TemporaryKey.pfx index 8eec023cfc4203f8f8faf29fb743f37b1d4173bd..8275f7ebd84c4841730fd3ff1de3d33e8c7cab6f 100644 GIT binary patch delta 2162 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 XqvJ8@?nI|sg(%BquB*1fkHg_#`M}i~ diff --git a/tests/cpp-empty-test/proj.win8.1-universal/HelloCpp.Windows/HelloCpp.Windows.vcxproj b/tests/cpp-empty-test/proj.win8.1-universal/HelloCpp.Windows/HelloCpp.Windows.vcxproj index 0243b00b1cea..2911e5286d1d 100644 --- a/tests/cpp-empty-test/proj.win8.1-universal/HelloCpp.Windows/HelloCpp.Windows.vcxproj +++ b/tests/cpp-empty-test/proj.win8.1-universal/HelloCpp.Windows/HelloCpp.Windows.vcxproj @@ -114,7 +114,7 @@ HelloCpp.Windows_TemporaryKey.pfx False x86 - 83D2917722F98E5A20DCA9D8C4B75E36204AE3F7 + 2CDFC928D2D9162A1E5F975F5B9203593ACECDFE diff --git a/tests/cpp-empty-test/proj.win8.1-universal/HelloCpp.Windows/HelloCpp.Windows_TemporaryKey.pfx b/tests/cpp-empty-test/proj.win8.1-universal/HelloCpp.Windows/HelloCpp.Windows_TemporaryKey.pfx index 884cb2895d88394cf2da0cc830debb85977f2043..57ed216177ba376fbd15e2a6c7e203012b21c6dc 100644 GIT binary patch delta 2080 zcmV+*2;cXT6Ot2uFoFq=0s#Xsf(c3n2`Yw2hW8Bt2LYgh2|EOW2{$l;2{SN)1^NaF zDuzgg_YDCD0ic2f>jZ)Y=P-f=<1m5+-v$dRhDe6@4FL=a0Ro_c1pY9B1o|)>1_~;M zNQU7g9b&8+1 zeKI(K9pP>!4jc+GiSeC&R-VYd-n>{}*V)=Oz0TB2tF#^Ah#1zD zbvDG~n#=$R(4kjF(k*x6jF5GGB|VR2O-ff{`~5VN)~e3`#a6o}*r97`h+1A31V{h|$>kd{ID2#H8`4bKQJv@@ zK`j^4go|@k6HMR&JClA*NvMOGP({dkfuM0vg?~l#~&o=6<4K9Pzm(cinR$Ux5`u;t2siJ58k}DsArGQq&@!q+RsA)#cageMd+|2L;PQ6{4Hqf6UA`t(jM% zW&Ms~F(gTa^6RmNk*(=R4rwlbs|q*5zhW4;db;+vqjytw3Sqk|l0` z5gbPSX(d;m{L-reTG^OiWI-I`Wh*$g>N4XL`+i%qXt4?Q_%wTV0xT$cinz(PQ{`=j zY3^-#jSh~&)W?u71w;SnRl^YgFuok!475KBo!C3VUY`-Yx$G;ym1SYyM&s%Ya35`I zMSp!}%p63wk5Wk*3GrS?M0ILeDr*~m8p-*shxN>D(0lna+V}obrodAV^+Rt%^-`7D zw`Ee~-`R4C*-9HNu8NTeo8&O!-|OKUi&hXmKtKd^$YG};@!Fb(_+SyIj3ea~Mogwn zu`Q%KvV!j~036&7&BRqi%iODPK5W3hZ8E<#U*8=C{_HN&aE12nx$)hiH{xf13usgo z1?Vex(&IBZF^S=J0t`C32oT|f-Q1()2 z$CfoMS8st*wUi4psd5KY5lSfV`JC$O_Ly#l3V>(E#>c5=$Gu25{&(l`r<5>SlnOhz(VD#S?p9xj1 zuSh#_cO|?CR2=$7&=K;1MlM2S-Rf@FbSZ4qh*v7KPT53A%U)=!VSK7d1e#ObUIM-E z3mZ(=MAuH@DJUG>vI=&+PtLvGivoP4Za=!t8i9_`qWQPt6z`;*X#s#*lH%77JPu-y zI! z0Am0+05||<04)GC05bq$0Ac_w0Ac`T05SkG04)GH05kwF0Av6&05t$O05Sk#05Sk! z05+4k1-1}sii%J0ZEBcBuQ?ATQR#t`e+DKRHZU|XIWaXgGchjbgaTHpR(bT6FhZdgBl3BDGSU*NEh0`A35m_&f!82dr zRwyA<9vp<-LN-=qI(SK!;PSnG}NHUkpH$=~%aj>Qh`k21$tNbU4kg!W~S(^g@NEttUI+ab_vqV8?DpCfUlbqin`~DY-?_5lLW=^y;Bz&>W; z4@+MJ9YS4Ib}sfvLC5cM!mjxR?A*hG8zb&G!i?*H(@B{4X9#lCl7mtdk>jNE>RFVi zucLG37t+n`o*jT+%YD*YCfF5`rpG%h1FcC$WSmRMIDao)gG-;m$t;9_T}=so+R_HT z(7D$dQ*%`%8SCTBaw;V3;_dPu$_2{)ge*8~)O*ztF0lY*Y?@JN;*>BiW6 Kj`gVm0te8VFv?8; delta 2080 zcmV+*2;cXT6Ot2uFoFq&0s#Xsf(b$f2`Yw2hW8Bt2LYgh2{QzO2`?~$2`eyy1@Z<7 zDuzgg_YDCD0ic2f;{<{Q-!Os&+c1I!*9HqJhDe6@4FL=a0Ro_c1okk31oAK(1_~;M zNQU9 z!Ni3l9i=aPoMW;FR7VMd(o$wnAy5R5`!pRo1wH9}}QKE;25sS*sw(i*=QD`>b z4bJJjAuxV_OQkBeqKb39_ztfFFQe=GH!(yv(d;w2T}oH>7Q@Y94zqzZP*7~f>7o6H zohMY9`bAzz`U#^L-C;m^L#Jjt#peNCK0URdEzd|Xyu6jqT;AjNBYfH*WPVV6f(=>2 zGE!#N=SqREcIit}F1uEvN96xaaT+(yT#$ex?&QCJNu}xQSc<<8EU{U|bfo()1hA*y z3J3;0FI8h4`{8KS6xF}6WCgbV_C+34q{)jOW$_DJr3+}}_N?qmd0!7L=VR4~VA()o zplbtfHn%xpSYB&j#{&m?6D>H5)roeHpe!%)0igVH*x4|V5>Xh1*o5rnbq69wD)>!O z=EkmnE}i2p_W7PLbLrz{K*rGx?#Ff*sh^_PhJq=q?)Z*dGhlPT4}7Nx18xpy{M`6& z$v0UL6I$3B%Y&pYmx&T1?Uf!Sitn`o;m`7^QjXb(VGhU_Oi>bt=P!O*E@Ui6{d0B+ zo`JurGZ?QXVY4sVs3U&;Cs8j|Zk@tlvLma1n~W-~q90nq;~CVBy52EcV6UTwIGd0z zcvM+QJa3Ke@d!xA5M*AuuVNc69zHFYfwhzc3^MLYHrTJc)e0ez-+si+k-d1kl|Du^ zDmcOum1*4RL12n7Wyg94+&CO5_<7JLO29Se)*hyS<8)&lEfRRFi$j2`tG9!*E($s|)Cc z-X#>;t{I)*%nn1IWnbS!l!}~b(bJ883=(=^pMXKy57q|si);yohru~DF0hy&g3uLc zI=2DSqT~F}!aoo!w*-MU#GqS)i1G7(0mGp-l$ZsDQFev=FX`kFeRM5ORra7e4`~4w z1s*&>Xm@LB`(jg$f^ettx{|ZXH$l9w3KHjY``2>%udP^%ry6cOJYuddtHU3Evy>cJ znhEE#z%~z^9Xp8JVzrS9vs*P_Q6{^cZfV^&s5LM2GX;4=(Gnry15MrJeT%M#u?o=CZ-C zTO`?q$_(uHHI>e>mbI8z;nA*JJ!oq`+6tivvqK%Et986fuXF0;QMDXWy0S9VvaW6$ zuD8`I|JqQlsR1V_ukyfuWnaDb-oUah-hNy7JfEiIiZRc}Gck2T2N}28E^Ck~H_c@W zTwnxP&RXoJ+c(Lm=A~#~7`0q=m+_NO1u91}0AT=P05kwO05bqL0A>I!05I*0AiED1-1|u zu&#^?5j>qt#O(hNj0)wkU zIdwBJq|CJwuR(H^P=+_UVZkot!aJu{U-@N|gjrQ2&>&ewH)*4UedJd(V9^5q!;||5 zLw^qdus3(vF2HzI2z)41=&9V>)ylHffSpfX^V!Q`@Tz~4woDbByh-l?KV5pagDjM)ndBCd>o`Mrr?u-hU82rTfk)`sic?^qrND$on36;RyG|7&;ia zO;kPr+0qYuW*`ZzdTp^!$=xc?v%s3@TA-tU6_g_xWsCs$_6wL%Cnzu@@v+fUZbhtQ zTyH#t?u1oW`j=7q=DbPnC_!T=>@WPJ_`l~tw6B_QpKRbHp$W6(8$dmD&Fi0EiUOw( zlRgP1Hp3m>qlW#*>1pn&Pj}Cijif=)zyuT$6TL0AdmQ0iU0$0vK1V^rJXGfb0te6l K000000001Z+RQ)z diff --git a/tests/cpp-tests/proj.win10/Package.appxmanifest b/tests/cpp-tests/proj.win10/Package.appxmanifest index a86accb000c0..3c0b8b3270c8 100644 --- a/tests/cpp-tests/proj.win10/Package.appxmanifest +++ b/tests/cpp-tests/proj.win10/Package.appxmanifest @@ -1,6 +1,6 @@  - + cpp-tests diff --git a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj index 0aca17cbe170..db53f8bbc838 100644 --- a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj +++ b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj @@ -125,7 +125,7 @@ cpp-tests_TemporaryKey.pfx - 41A5E0A283A14FFD10B4B42BB4458F11FD954DC1 + F3187E657336E152D7AC4C352643738EE7C7C055 false diff --git a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters index adecf7bb3648..9b21b7b55e34 100644 --- a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters +++ b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters @@ -917,9 +917,6 @@ Classes\ZwoptexTest - - Classes\SpriteFrameCacheTest - @@ -960,6 +957,7 @@ Classes\UITest\CocoStudioGUITest\UITabContorlTest + @@ -1692,9 +1690,6 @@ Classes\ZwoptexTest - - Classes\SpriteFrameCacheTest - @@ -1735,6 +1730,7 @@ Classes\UITest\CocoStudioGUITest\UITabContorlTest + diff --git a/tests/cpp-tests/proj.win10/cpp-tests_TemporaryKey.pfx b/tests/cpp-tests/proj.win10/cpp-tests_TemporaryKey.pfx index 908e16588f9a4de37e12bfb01164d946f014fb74..8c92e76a7d5a61d727f3a85262c02cda59aa6b63 100644 GIT binary patch delta 2164 zcmYk8cTf{Z8;3&@2!RAddY3BQgpx=L^(Z1z1eF#@AV@Dqhl5}gq~r)q0TC_;NEa!} z(F73{JZhwabc6_k5)mnK7w@}qzS-H?_jzW2@Ba7BX7Xn9N+U?n3?K`Ld0b$FDkWPa z@55OjEL0Ly7fgbpnOY-D+KkAk6=-_ZJJtvULPo$O@Kl-Lai=I&lMvQAhuQX&gp0kY z27K!WT}QpG*bsecZMME^#^br0A%=2aK8?_wmyK*iTYdxzR(Ssk{H~`z=q}eedhiS5 zZmgkNpR~zoPzlT@$sDzm6dHG7jvgr3nKHxXf~!o`ADgVr4xEm>M;wsteVaF=TA)Xn z$>;&g?gQ&~gnTlido_gTWTnPcK88JLHFO0K*HnF1CbJjzFFY%uSX#M7T&?9O{-c5$ zhIB22`{be1EXoaqIL9Z#CK-KY_Vw!T$NwaiPw(Q4f_rewwdY1-$A(HZoIPAPKK!;Y zlA}LnrTFT6cS#EI1rZ?=cdzRze~`pLB^NE^be{3xT$4PxHA&f`AYsp1)JpkUMlBq4S{8I{2flnK0PYo zW_A^HMI|+gby1hoI(D~1%rsPKy%o2x7Z9$2m{jzeTp1|bB07gie+^wlLXVY1{V`>R zR1n|6>N-aeP6HZFE@w^fkFr=C%GA?! zA|@jlPaaiP*e;7ZM7eV}Y!Gs%zC61~;H2=dYrJ`#CH5f=xv~ih_@$$>!>_d(L9Q+G_7Ur7`Fomv(1-Kc({ z8zMdp%}Wwdw0jZ?{Juz7lehBBjpG)|rp~QJ9zq z^`uB!{LVNX>tdAOh}#UbTV3g}fl(=G_o|y@7+ziJR?sC+nDexbv1Nj7;PbM)r3UjL z?wnzwhy~By_e65}-97&6bxBeHl3p`mYf+5bGzD|8^JeiNUEITq;VD*~d&!?nf3<;yKc zJiV*Hy#TddV;C`qJ^G8_@p*c}<#R5IfLJ63J$XIepJ)m3piuqD3OQ2m5e3aRX^jJY z>omy1w6|$jo>z^(`1`G{xEJwwS2=1T9zr_0)}E!bvA^c=NCmGoK4Sp5NT!w7jXPj@ zL!GNuBh~>;jzz5rd9t^}U09GGSxFqi+?FP!+p4aD!d>59b7cG;S|?Tp zJ(-m~;T8#~d~K{`#Z61NAK{-D&NE4`-}RQ{ZSxx_gxt74QSep*YaOkak-v+%5?Rhi zre>yngTND8*(m{{4I-sy^KY@kiTo;>x`puQaTaChV0gqyY7bhkX1GzHh9X7B>F5(u zE-6?|#J#l1!@~W7@zq7f&STR-M4M&vX%Vd}C+809Z`((WZf*@@>}RWfv(~D98T#k^ zNc3@s=zP6NdR>@5h)$b=D@et%IDqA2XVI63q>(oU5xhSKVh)y7%-kEG3Gf0S0Vses zK%H5u0<@S+V6rNcG?*5_th50*rpN#5w3!aaTqx!}b-;OMRvqA#^PCk=ME-33W7dMC z!6c9bf&>y_ZUHvV|Hd$kg9St-0k;t(;0HF2|0Gm^834|JNx%uFry)ozZB!7D1qeLF zcUqXWHYzR0_~GVbLB$Xu1pMbCES#(W#3>{f0>%b%1cP|bvxbG^0s|2ef^Z}Xp^4N+ zYH1<0)Sa1#{(JunvOTmvKGM(EW9nyJ5`bWv?KhCdhy(l zdD}JG-wNh+jbkOHwu5(WA3o+o*>+K!`mh z4K_5emMlu5pY4pqf5ab%yEe<4kXx4hwj*&hGk<%gvs*Z3nH<75*cQ;rQ5k@rt*j~ zBcz7!6Gpv)CoHk;8kqa)*F!!)LO(<^o>DBn3z{uar)%3-W(7TxudZ+jZ7x&~5mUFL zCTqkz`Sb)vOQL18@$(z4}`84&2E^dFyxe*lGT-GBf9 delta 2162 zcmYjTdpHy7AD`WrxhA&}%ZXglhBj1E$E}1MmE1353X2`3X*rFBSforYbGAlAtBB(o zAtHuyo!hUD`5~9N$F!2)I?s7}e$V&$KJWMQ`MjU^{qOU>8A|t*bkI~-Do_F>UQR+` zhDj%rgt8Kn5^O5W5=@0*#I(tM9eav=D$UGxrk4W*O7?=O;E}Y=U2^S}8O%T4&M~d= z^?(w-f3gAc`A+bRKHQ@qnl$9w;*eQZjYzrtp(2+`I3Q7sm^hbHq*ltHr8}H`{btv2 z^8qA#8*N|7OLZ^pzDW(;_~c{M-)2)m_`9+H)e`ZswX(<2c*coi<<@AS8$}e+mgKlq zyW%st+PRX-4%IjZDxX$;_+`|!?A18KoA>VKdV1C!FCI4BQEvRnOUQ@)*H)6How1^+ zNraFr?ZGR1iEbxPw^x}PR`i4oT@&@KG8da*aGUG@?dWd!t0qC#B4D&AqdioMOIVU8 zu|yp2h16)&@&tAyI@`jN65SE7uW*p~PKP@8&FyqA*TT0*gkZ(nlM_@u4e(5O-bO;y zhqD9wH2JZQ*B7Vf*_xP4ozYBFJl`bR3ic07X_Q z7l;Z4B8j|=xk=P+Wh3n7v6V7Tew+g?p}}2XR$|n}%Fe*u_1ptp8%veZz9f}f<}CfC zWO2fO$#%!eS<&PI3tx3BCg#neynaw!pr&;nn`Vfj9~YI!*p~G`RPYU+g_-vy;E8)btx!)J0N?1&!;R(|Afp+vU-NU6;(kw`Toks z^u!5iByp_oRKaM%WPX69(vcPi<2d@j)F{MzkerPD#y!sVd8Ksy^Fw2k)cl;G>exvA z_U#8vF1Yhq{_Z3F%%vx5ODNL=Fw_C{)KJ>>Bqp;XoZMlbpQRZ^aK1uI zk{Lsh=NH^6P2F)IcFx#uC%&vo`QSWCdr(6q=^jFZuDvcUq%-gEy1&QGD$o6ap$+@` ziM}wpyx%^Q4RrGBeZdagKRE!s5k1_hcfXuc(;%eqws>^E7Ij+dKw?(O&Y)(s#aAsI z-^!aTzR-~yCPZ}O)!@7^Mx5(x4V~2{0KEL%t*r4~?`2jl*qZKtc((@BX`y6Xn<>>v z<`WYU?ye)#gmy>3l#6hiq&9onTYj30FM3|f}@~*9{nS0 zK}awaq=}}2)Wp3T3ja5TWuzrQY${NIrUGZ7(*Ke$6|n(00;U27#e6TCDpAV@0VRMy z1y!?k4}(X%vJ;Wt5{rk6hS0J_71T9sd~UW6-^nlvmG<53@(isE(sF&!z>a6N5=gwT}3_2~lFG zapy4g6|xgXn0Aa^jP)x)&Ks1o??}VoJxK zZOOd(=D0;hGm zt9SV7_-IYa(C7!wx#;op9EOg*`GBzSO6=KDcQtjAM-GJF1jTs1h`l}1`%Gsh!ONO+ zoN9{l9x!5hUX*Hep_iT(^tebO6yxjbWpM8$@NFrQ+s1IHmu$9H$*D=z7CoNyaRk5qY~|2=%!uU0uJ7aC$66*?vTqmA^_cCK@1EeMUv zjOTUHo-a)sJq*>wJr!ri^)pOr?V??Ok>CfQZ!;P!o Yt1mgLS8?HM$v){f)@_$te|#PO2g!KrA^-pY diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Windows/cpp-tests.Windows.vcxproj b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Windows/cpp-tests.Windows.vcxproj index 4efae725cc5c..58b1c2e54812 100644 --- a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Windows/cpp-tests.Windows.vcxproj +++ b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Windows/cpp-tests.Windows.vcxproj @@ -89,7 +89,7 @@ cpp-tests.Windows_TemporaryKey.pfx - 88B5B02E2DF4494198EB4805409CFE69EEFDD17E + CB329DAE6650A73BBE00580645DD9D1272F29555 False x86 diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Windows/cpp-tests.Windows_TemporaryKey.pfx b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Windows/cpp-tests.Windows_TemporaryKey.pfx index f994e10912512a71c91304c04fb497211c2b19f4..ddd25c0e501310cd229befd716cb31f0da59e72a 100644 GIT binary patch delta 2080 zcmV+*2;cXT6Ot2uFoFq&0s#Xsf(b$f2`Yw2hW8Bt2LYgh2{QzO2`?~$2`eyy1@Z<7 zDuzgg_YDCD0ic2f;{<{Q-!Os&+c1I!*9HqJhDe6@4FL=a0Ro_c1okk31oAK(1_~;M zNQUY(g#7_gyD0PKLs$UF{r0#i^m#gHU(#Co1k@v#wFc9xAeB zH?*jKmQL@X^X;L|ON%(!^ow}qe#d-#2H%2p6v&_Hc$J~GvL?R|sXief;| zDFh$5Kvj_9WkF9YPX|!D1P&sCs1W!+7&);%5PR&rPCm~|WW&!;sUFT~oWhCMcH-r+ z#QYRRb*?8a&JI=)8xJI23Z4s6slQ`6@vS<4u;qJ~rbqf%a2K|;E`+2{Hnkr-cBwW} zSj&+gu1LxLHG@9JwM^#dWP=5|x9dTilwcKoILl&Mxiyh13Hmn%gbLwLMNB&m=m2s6f4ZF(*<8~t&A z5^9*G*uID{>=!Qwwj`;{_}=(CS+4-EHXx7#v~WlP{o`WSBEZ{k`jRzW(u~MkHo8v_ zw|AqtHcZ=)G5l||ddBtBd1(SZ1tf(b7vBg!?6fjFaZ0o&v{D@iS=!_Q zGf>k+5!us;xgujelh>`j)GH}a7>oe&2K)4J`Zgs$%Rsbc~$S*X5$wfEmK zP#|PIQF)}eaK3a#KDyWtINckFs|LHDfZSV{!1-?QiYJPG(%(D|&erln8L6h%x);5b z1$nU%d43=nMl%3dP{Ooi5ETrer|p*Yg_ig2f0sBtDC3#&E~4F%HGNe&kaYm`jJVLf zAjX9vhv+p^BorP7D<8$imbeXn0Q};`1PJHuwp$B{!V|I|3R&8Ztv~a7EFdPlZJ=aj z`7tOwq5msPz67^ag@1u92o0Am0%0Am0#0A&DW05JX05Sk&05bqN05$+P0AiED1-1}B zZ<`B;^p=24tjodIu!WM7hXy7ZHZU|XIWaXgGc!0^7Y#8tFf=haGBGtXGdPpS1~h-H zBUq}BOo;3gOidDx>Z=&_{{Mufn%dGIO5iIPf^v>;xW&C@lm**$Bisk$OZkM=ZE&B(x1G`L10Jd1O3rQ<{LTx&^!B!~BQSW-Xl3>5uzw$Edo zv?_X=8;z}8NIwhYAX?t}oLaER;Z#S+p?_VF9iEv1@0*86lAB+itQzt(oF z+wx!XN!%H2qE&ldmucbq-*JoCZ`Pk}KP!wv2yST7%5LQSWqWD}ou=Vpo`zBXQCYkV z&YnNDwRqrUPv(MKf90&ru4AX8o7c4QN&MR%1n?Cg8Z2V~Ma{L6rnc0Nnx-IFd&RE;0te6l K000000002MPr;l3 delta 2080 zcmV+*2;cXT6Ot2uFoFq=0s#Xsf(c3n2`Yw2hW8Bt2LYgh2|EOW2{$l;2{SN)1^NaF zDuzgg_YDCD0ic2f>jZ)Y=P-f=<1m5+-v$dRhDe6@4FL=a0Ro_c1pY9B1o|)>1_~;M zNQUK$_{P41OzJ!1-96o_YKfVS4=>lkbc!9A{m)F%W*m!4%R3@)xLsd zd`NTehCkd|hSpwW!HD@d2SN$8PmTQDVSD3vqM8FtbY!yjI8s}gg2_8V9oG9BTW|SG z#+65|kldnw7z`=@%Wfeq$s2Z8eJGmN&bsma9oZ-<(jZPn;;>iugyRf6(1|d1F6@sj zIgp*_qW=)X#tAysLONLri;iF|-La=A-DuI=$?03Bg8#5na7wT8=~hxWtYr6tc*Vu5R(g}A@-z2 z*J}gx_|7#)_Xl1#@Cj}@)~hwa=dzebB_i%zWWxsLVz>LF%fBI>zm-Fnlb~Hn;ZcxE z5r0uYTQR;e$;Z>Jk_+^b*+57*E;wp`ktTIXMpiAAZS-N{-!-RGvo2l)s3UEMAYE98 zP~K&Kg=Gf+jtUs8UCP@Wbc>Zz9fxu<0F59ytMW}Oh}N$ad>i36 zhRHM`-y9S`Bq4y&gbiC8{c>|OXL4Ki4q%^cO$I2y8GzJm(vwV&iLvxX50jj_R5A?w zq_Ijpg7u}XN*L|wXlA$VLaIe0I$( zV9vf)Z2`C4+@C)Lc)Y|A%4puiVHL_}_7+biK$jS9ZhpS%T2!eJ^ypTBMOr*}cf{9! zj4fO{Qn4K;v<1w9*RCg;y2cIz?fo4&vuNB{PRn2WV_erF{a)c}C5|upnUUJDZ>u?j z$x0c`GjY(w81cirtB0Wf5xzv$*IjkQ&kc5+6Ra0v5i@9nY%5aogyNnvoP-tIJFi`D z{*SR2)IR9Huy>_|wMWH!6|G=Gtbtg6S}gah{X|D{)C#D{brX9l$68Ixt--Pn+~G$JC7l@*{hnvq|Fppkxu^U<#rhqAGru2TUL&Npip)`;~Ci9b35o+DHhja9dKx@Dh)8uWK#U{m`%&M|r3s%<)DU2PV z0htxv!Qs^3=&Zsu#SRwrjtJAbmasb*01Gv`;^*$$t2OEtT|Q5?phcQ{CUtHV0%m_! z$u#+&{36!W|MRU5sDL6T9!EM7PD?rWdV$S04ib=yGCW5nUls;NlER zx6&H*4<&bjB6#-SLGwd&rW-sUd$*!|@Z^hrSt33}M*Ac~AU3(Kz5QSSJKYYPHED{^ z|9TpaMX-!d!>v%-5yd`i1i`FrOwi4@o6!Avke7P!*KMMSIpu_*j{*-`>VKQrnOUG8 z#PrNnaPj4FLRCIa``B~ov& zw%1C)P~AwLhF5WIofJbp+VMoYok}F1VA$oPok82l4eWs zR1X6Gdz14ALw|OKtCUz_yfEQ=J8N|E??`bhB|GD(l>IN7ITa_Jt@z%<)&XfPW4VtN zK4fI+cio-)2OJSt#&3qj1tFTTpH6n_WAY>t)7yo>LyJ}zhky8n7ekhJ_4^zP;8C8Y z^3&N^0+CF@YLgI$wZ7rJTpvz~lR5&JY8cF*?HcAW34Z}(>}1a>+W--{$wP;oz7aS9 zTqveCE>k}C0wghHEPTGSIpWUG)(<5iG_FhmKpu}5 zfr3=D*#aDmlQsz^E)PF^Sqgnw@t5H&?YQh2S1Eoy#{?9Q^U*?I0l&|>oftc<`k5XM KS-UR+0te89KgLY} diff --git a/tests/js-tests/project/proj.win8.1-universal/App.Windows/js-tests.Windows.vcxproj b/tests/js-tests/project/proj.win8.1-universal/App.Windows/js-tests.Windows.vcxproj index 01a747f32835..1fecd555e3fb 100644 --- a/tests/js-tests/project/proj.win8.1-universal/App.Windows/js-tests.Windows.vcxproj +++ b/tests/js-tests/project/proj.win8.1-universal/App.Windows/js-tests.Windows.vcxproj @@ -114,7 +114,7 @@ js-tests.Windows_TemporaryKey.pfx True x86 - 2D1A6993BB7DD73FD4EDC183F0FA7F9A1B7AD3C3 + 650BD4660C94384744142D833420DA7AB4FD990B diff --git a/tests/js-tests/project/proj.win8.1-universal/App.Windows/js-tests.Windows_TemporaryKey.pfx b/tests/js-tests/project/proj.win8.1-universal/App.Windows/js-tests.Windows_TemporaryKey.pfx index 4d25179d4230b452859503a9a538c11fce86c99a..b4cc0ad40bfb52d373e368ddb49e1665c4595948 100644 GIT binary patch delta 2080 zcmV+*2;cXT6Ot2uFoFq=0s#Xsf(c3n2`Yw2hW8Bt2LYgh2|EOW2{$l;2{SN)1^NaF zDuzgg_YDCD0ic2f>jZ)Y=P-f=<1m5+-v$dRhDe6@4FL=a0Ro_c1pY9B1o|)>1_~;M zNQUu(Cxu0G~ zQW2tHiZ;a*$Phi~hJMv)Zg_$v?oo#3BgUlb~H**F=w}EJ` zLXsVW(aZj}ku3yAg-f%6wQd)XsFZ?=!r%>)ksI+mGH1p|WhdV$Cn-x8fFDG`MsNL| zGhrm0#VJ~U?^(>GzEneu;;$dMG9nr7+oQshlF_7!T`+tS2y91HJ(H6*gE8F2Ra_r!vcrJeA|{V{H5m(H6n^RWzfb z6%dk3vc-bC%n4pHPqIk){`IK^nji=~p)=g(`R+)0Q=C%Ba6$~GYlwBxfooxaww31A zuZYnMJrG_8zE4CLInM!#r(`F9%?{w!FfBOo;>^Gs$hK)@N$a9*=go?02e$pkW?boZ z5lKRSH>>F5QM7shP@$4R^oWnS7ha?)XVw&8#PvS4Hr=Q?rGe$~kT)y6u%Is9jadGo z57828)#-BlVf^H%)8FhfE@wT~VLbztRfwp8b?MhXvXN$^=n%d`6IMIy@Kc&=)<}ld zcGfKAb|^Esi-b07IsF=Yg)z>;b?V5L-kp?x7!;Sw|M-QvuCPUvttQgxj;bNgJBohQ z18r_!&15?D0dGs>JMhHLrz zhrZ3}z-Pz{Y|sAkEZYDJLH-4*pPN5_Wh9y?UIp6Uwr<{r zBZVS@O-TgydhX5+0~gv4KW%i%4Xw zDQHa$$dj#5gUh*qKFP}7o*FHn$;;FBc$u+Z-mgBh!QR~Ww_i_g`v#rufMbP-?5RU2q=JW}4K znP`L`yc{cG?oB)gge-jqH)B?=(Ej1bX(O*~l!y4L5$Ulva!TA`!prYw!f611<~|wU zv0W1lL=qWIAHwVGEp(yKN)S4P$8mw{T?S^HWTv4P0}KL>N7ec)Mxf{ecdp}j4^gA4 zEMLX^sHSk3hFk69!^kJ@saI21ynG5_?C83&Qgs3t)E7*n*1DZ%Pug`5hgAN~GVwV+-+s76T9C3tg2 zDcOxq3E%4cy8zk%)Ta62+z5}_cOE=A(dg8StgX=PN8rzJbzBYvy@xSsQ}LBT-F5<7 zEL_xV#064oN5a~((>(%#Vc>vXn$N}TA}SI)0A&C)05bqG z06CMn1-1}uQo7q&EIOq{d?B)@Fta6-e+DKRHZU|XIWaXgGc`9_7Y#8tFf=haGBGtX zH8+#L1~h-eDutui7LIz&ac9f2ciG%`Df>syyRc0~%$F67y5pl8KM;l=Wyqg87oxQP z|H2aas~DLIFRHGio}Ox-v`dj%&mkbTt<7x8Lau_okH)Q2o@Rme;60?|TD_H&-{*d` zqw+LwWq=R7VhaSaO?bR0ShPQ6O|wnsTX)FA*1~_?eGt9s9fKS88}-w6PmD-zi{PSq zE&UQND+P=hUZ{Uw;w{2;(ccHzvYg?5jTJ@P_Eq|G(6V!$sOBzGcz{4|nrdGO62mhj zBIB;A|BJ?$k2FD1%dN@sst;kPDeL6MlP9*LV8TzoE6_I@$6I+2Rr(j%dp_X>OP)&o zU(*8BVUzO*Lw~fB#j+0=BZ4|696?IvET>h!r?m1&(yv1o1(HGyn3ue53TJV80FO-d zeNQ)C8FFZJGtD+g0Ti1dM+~^l--Hq`yvHFI>}CvonLX|=v|F`rrvJg$5&2#=kv#Qo zOmDw%10@L8D9ghU*6WP_yYOoPTx?o}w~JgEB)Gye!hag?eoBOz$z!+c^-Uhu2ztN+ zh0-i$aj<&`@HcU1xF-6_YyKaWtEN{Vo#H3WK1P0IT6H;|!n&0Kr*NFhQCR*hXl64h z^~C8GsVus!HUL_62oXZu1GX=qF}!S`_mBr*`uga(y?~~Z|2w6iE++gME1iJ)0Qv?*PiGcCM^wJ-Ylla#>BsPjD KQ_RNz delta 2080 zcmV+*2;cXT6Ot2uFoFq&0s#Xsf(b$f2`Yw2hW8Bt2LYgh2{QzO2`?~$2`eyy1@Z<7 zDuzgg_YDCD0ic2f;{<{Q-!Os&+c1I!*9HqJhDe6@4FL=a0Ro_c1okk31oAK(1_~;M zNQUFV z=c1@`4EY7wqeYBv01=l$e1^UdTrl<*yF?g5(y7mnx_oIIs(R)uu?JE>APE)G?tom=z3 zTJcge((aUGGQ2I6psp>T|LN&grI`DUkoc{PL>qgO=evHhDgG8#iiqE~pw z{OIHeZCorH$w)KG&0qZF1F2EQ06Ve)EZ{bCIG<%j`Mcw$bevZlFcfHlQf8&T z7Z(DE(q7*5zk3k!pVf>KVPE}2Myr0D(aP*dZ&47Q&JMmXNA^gRdQw%IWfo45v>UQyVA)6gS2U~I;# z&*6h#Vt0J^$%M$`1xWq5U11B59W(Gah;sxD_dJ$V&4j`MCfNoG=WJM3A9T%0zGO={%+;kK#WutcC@$!_GMYrn*?WA z{@G1~@o@)0nCl&Mm~S^7@R=ji347Z_=!ROtomd*j-xH5iQ^&COK^h8|8hvKJc16a2 zb$~oO{H%x4#LOkUk$gwh{XH?6b}+q>eiO~q=ylxtnDZ*HnYuPzUuJX+rxtnWuGVKT zhbO1vNF=oTQU(fsx_&CK>MbI~V7{jU7bXjKMvOksiK#zY1zLFwLJ%KRJQD2G*6WNI z1Cb$q{FD)&N#%3e6Z&YTXD4wkXE>~XGe>S@qWzh#k9n!R98l`_{>p}d_zVym3S6fW zYxaIXcNbDjYMcUvXJoA)_y>j zhK4iLynliAJOTv8lrk80>brx)KJvCHK>vwMfz}^ni=Qp!CMGHSs8R|Mx5$5TL)cGm5LF$ApstzF#FoEJquitZ&@6gJgdt zQoYO6U7_JIqy(ZPeH&CQYm$1GXT&4MMP0KXN-%0IFe&nmteKh_oo$sF8*2dd#%Ha3 zCw_Ys%DpCpiT-xn6ECS2WiM5jSritJ%B_+w=$8iMc=S_7rM;t_XG_i`@lbU~bX(x?V*tBci~iDr6S@+^ zoJ6{)ApUza8FHZ=fwX8QXLop3XI7I?1u92m05JeL0Am0#05||M05Je905kwI05$+& z04)GC0A>I)0ATJW05t$L05_At1-1|t zY6*3BG_tio4JC8KyaaEPhXy7ZH8C(UFflVUFfch<7Y#8sF)%SXF*!6aFgcUQ1~h-c zOyfBB=CXt0YY~qjyXQSArI5Vi^w{M!fC-|p^qCuQGHH~2x*TD7BV=61e;@LYIJ@zg zCw4FaO`|_2_dQ$w)#s%1Lj@(+r}_lRFXZucLnN+=z3{~~^aDSD;=*ftct($EirUN* z4At8AQ>_9HM%CeU3pV$u$4iU4lE!~Phxqw|V76dEqO(W!Z3hI{o*TB(zJe~^O<$9- zOimZ?91P{EtYoh!=KX`n0d=yanmnU&CZsKmgGFu|&W(~@JX_Fz1~|VDKajZ)#f0;! zJLS=5-MuO(0~Evrv}uZ;Mq%GVX{shdaG9~z=DQW53nqS=OZuSSM~GJv`Dy}mb(8xC zLw}eX>lM(vaAz=XzWTF%%?u1^=ABx4rA#YEg%U5%uCv@I5b=zphKLuc=pPQLNj(7c zY!b%utJqI~-+bk7e7rEh|H?u=fj<7y_KSiIhD-VN{(_(r1gD5by-EOeV^fO{kVv&0 zKW64G5=qAk2AC}>z$a)~#aj(*Fz1zaEPqzAW^n11N{steN_j$j#>*YD*4SaKJc)~i zdWq5E$NG7M@Xmj308jz(A#|<}f>?Qc4=yw^Jje>Hm#^z1tlU0*5?>Kk+hSx0-EUd+ zG-0Sm3P+!PmJ%N^I!fQ7O>Bj39Iir`3VTd3)I*ZRHCRwd-89W#n0Nsffm;{EkOC1p zlRgP1Hs*b@mhN#{|9eta+pgYC?lNyG2Lu$!VpL|>6NXZYe3W1na)3|^SpdQU0te6l K000000000#VY!+B From 58586871619d08a2ef3b8829a6c8529929e82562 Mon Sep 17 00:00:00 2001 From: Ce Zheng Date: Wed, 20 Apr 2016 12:53:38 +0900 Subject: [PATCH 033/241] fix AssetManagerEx bug when the last task fails This fixes #15463 --- extensions/assets-manager/AssetsManagerEx.cpp | 40 ++++++++++++------- extensions/assets-manager/AssetsManagerEx.h | 3 ++ 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/extensions/assets-manager/AssetsManagerEx.cpp b/extensions/assets-manager/AssetsManagerEx.cpp index 364a2bf88c14..2c5912ec7c43 100644 --- a/extensions/assets-manager/AssetsManagerEx.cpp +++ b/extensions/assets-manager/AssetsManagerEx.cpp @@ -856,6 +856,11 @@ void AssetsManagerEx::onError(const network::DownloadTask& task, _failedUnits.emplace(unit.customId, unit); } dispatchUpdateEvent(EventAssetsManagerEx::EventCode::ERROR_UPDATING, task.identifier, errorStr, errorCode, errorCodeInternal); + + if (_totalWaitToDownload <= 0) + { + this->onDownloadUnitsFinished(); + } } } @@ -961,21 +966,7 @@ void AssetsManagerEx::onSuccess(const std::string &srcUrl, const std::string &st if (_totalWaitToDownload <= 0) { - // Finished with error check - if (_failedUnits.size() > 0) - { - // Save current download manifest information for resuming - _tempManifest->saveToFile(_tempManifestPath); - - decompressDownloadedZip(); - - _updateState = State::FAIL_TO_UPDATE; - dispatchUpdateEvent(EventAssetsManagerEx::EventCode::UPDATE_FAILED); - } - else - { - updateSucceed(); - } + this->onDownloadUnitsFinished(); } } } @@ -995,4 +986,23 @@ void AssetsManagerEx::batchDownload() } } +void AssetsManagerEx::onDownloadUnitsFinished() +{ + // Finished with error check + if (_failedUnits.size() > 0) + { + // Save current download manifest information for resuming + _tempManifest->saveToFile(_tempManifestPath); + + decompressDownloadedZip(); + + _updateState = State::FAIL_TO_UPDATE; + dispatchUpdateEvent(EventAssetsManagerEx::EventCode::UPDATE_FAILED); + } + else + { + updateSucceed(); + } +} + NS_CC_EXT_END diff --git a/extensions/assets-manager/AssetsManagerEx.h b/extensions/assets-manager/AssetsManagerEx.h index e7fa32291f24..ec8b17e80d0b 100644 --- a/extensions/assets-manager/AssetsManagerEx.h +++ b/extensions/assets-manager/AssetsManagerEx.h @@ -189,6 +189,9 @@ class CC_EX_DLL AssetsManagerEx : public Ref private: void batchDownload(); + + // Called when one DownloadUnits finished + void onDownloadUnitsFinished(); //! The event of the current AssetsManagerEx in event dispatcher std::string _eventName; From f3cd1298af0f16d67f93d9be8bfbdd3f22ce2796 Mon Sep 17 00:00:00 2001 From: Ce Zheng Date: Wed, 20 Apr 2016 13:17:57 +0900 Subject: [PATCH 034/241] improve asset manifest diff performance By reducing copies of large manifest files using const references --- extensions/assets-manager/Manifest.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/extensions/assets-manager/Manifest.cpp b/extensions/assets-manager/Manifest.cpp index c5c7d1cc6f36..bbb14adbb5ae 100644 --- a/extensions/assets-manager/Manifest.cpp +++ b/extensions/assets-manager/Manifest.cpp @@ -160,16 +160,13 @@ bool Manifest::versionEquals(const Manifest *b) const std::unordered_map Manifest::genDiff(const Manifest *b) const { std::unordered_map diff_map; - std::unordered_map bAssets = b->getAssets(); + const std::unordered_map &bAssets = b->getAssets(); - std::string key; - Asset valueA; - Asset valueB; std::unordered_map::const_iterator valueIt, it; for (it = _assets.begin(); it != _assets.end(); ++it) { - key = it->first; - valueA = it->second; + const auto &key = it->first; + const auto &valueA = it->second; // Deleted valueIt = bAssets.find(key); @@ -182,7 +179,7 @@ std::unordered_map Manifest::genDiff(const Man } // Modified - valueB = valueIt->second; + const auto &valueB = valueIt->second; if (valueA.md5 != valueB.md5) { AssetDiff diff; diff.asset = valueB; @@ -193,8 +190,8 @@ std::unordered_map Manifest::genDiff(const Man for (it = bAssets.begin(); it != bAssets.end(); ++it) { - key = it->first; - valueB = it->second; + const auto &key = it->first; + const auto &valueB = it->second; // Added valueIt = _assets.find(key); @@ -318,8 +315,7 @@ void Manifest::setAssetDownloadState(const std::string &key, const Manifest::Dow { for (rapidjson::Value::MemberIterator itr = assets.MemberBegin(); itr != assets.MemberEnd(); ++itr) { - std::string jkey = itr->name.GetString(); - if (jkey == key) { + if (key.compare(itr->name.GetString()) == 0) { rapidjson::Value &entry = itr->value; if (entry.HasMember(KEY_DOWNLOAD_STATE) && entry[KEY_DOWNLOAD_STATE].IsInt()) { From d848292860421ffd475b6482818060b501380955 Mon Sep 17 00:00:00 2001 From: Ce Zheng Date: Wed, 20 Apr 2016 13:38:49 +0900 Subject: [PATCH 035/241] make android downloader taskQueue thread My previous fixes for the android downloader in #14530 are not thread safe, this commit fixes the problem --- .../org/cocos2dx/lib/Cocos2dxDownloader.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxDownloader.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxDownloader.java index 54e82618e6e5..8e620e26329b 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxDownloader.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxDownloader.java @@ -99,10 +99,7 @@ public void onStart() { @Override public void onFinish() { // onFinish called after onSuccess/onFailure - Runnable taskRunnable = _downloader.dequeue(); - if (taskRunnable != null) { - Cocos2dxHelper.getActivity().runOnUiThread(taskRunnable); - } + _downloader.runNextTaskIfExists(); } @Override @@ -173,6 +170,7 @@ public class Cocos2dxDownloader { private int _countOfMaxProcessingTasks; private HashMap _taskMap = new HashMap(); private Queue _taskQueue = new LinkedList(); + private int _runningTaskCount = 0; void onProgress(final int id, final long downloadBytes, final long downloadNow, final long downloadTotal) { DownloadTask task = (DownloadTask)_taskMap.get(id); @@ -277,12 +275,7 @@ public void run() { } } }; - if (downloader._taskQueue.size() < downloader._countOfMaxProcessingTasks) { - Cocos2dxHelper.getActivity().runOnUiThread(taskRunnable); - downloader._taskQueue.add(null); - } else { - downloader._taskQueue.add(taskRunnable); - } + downloader.enqueueTask(taskRunnable); } public static void cancelAllRequests(final Cocos2dxDownloader downloader) { @@ -304,14 +297,27 @@ public void run() { }); } - public Runnable dequeue() { - if (!_taskQueue.isEmpty() && _taskQueue.element() == null) { - _taskQueue.remove(); + + public void enqueueTask(Runnable taskRunnable) { + synchronized (_taskQueue) { + if (_runningTaskCount < _countOfMaxProcessingTasks) { + Cocos2dxHelper.getActivity().runOnUiThread(taskRunnable); + _runningTaskCount++; + } else { + _taskQueue.add(taskRunnable); + } } - if (!_taskQueue.isEmpty()) { - return _taskQueue.remove(); + } + + public void runNextTaskIfExists() { + synchronized (_taskQueue) { + Runnable taskRunnable = Cocos2dxDownloader.this._taskQueue.poll(); + if (taskRunnable != null) { + Cocos2dxHelper.getActivity().runOnUiThread(taskRunnable); + } else { + _runningTaskCount--; + } } - return null; } native void nativeOnProgress(int id, int taskId, long dl, long dlnow, long dltotal); From 200c9fda59f7a5fbece4ba4fa3a3729e38de6998 Mon Sep 17 00:00:00 2001 From: Ce Zheng Date: Wed, 20 Apr 2016 14:04:44 +0900 Subject: [PATCH 036/241] fix HTTPAsyncConnection bad memory management Removed a redundant release on certDataRef that caused crash on NSURLConnectionLoader thread. Fixed a memory leak of SecCertificateRef This fixes #15464 --- cocos/network/HttpAsynConnection-apple.m | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cocos/network/HttpAsynConnection-apple.m b/cocos/network/HttpAsynConnection-apple.m index 0d926c0a0fc8..07b78478bd91 100644 --- a/cocos/network/HttpAsynConnection-apple.m +++ b/cocos/network/HttpAsynConnection-apple.m @@ -187,11 +187,17 @@ - (BOOL) shouldTrustProtectionSpace:(NSURLProtectionSpace*)protectionSpace CFDataRef errDataRef = SecTrustCopyExceptions(serverTrust); SecTrustSetExceptions(serverTrust, errDataRef); SecTrustEvaluate(serverTrust, &trustResult); - [(id)errDataRef release]; + CFRelease(errDataRef); } [certData release]; - [(id)certArrayRef release]; - [(id)certArrayRef release]; + if (cert) + { + CFRelease(cert); + } + if (certArrayRef) + { + CFRelease(certArrayRef); + } //Did our custom trust chain evaluate successfully? return trustResult = kSecTrustResultUnspecified || trustResult == kSecTrustResultProceed; } From 775db978dafe1d0d8f18eda3242a756ee97cde7f Mon Sep 17 00:00:00 2001 From: Ricardo Quesada Date: Wed, 20 Apr 2016 08:41:20 -0700 Subject: [PATCH 037/241] fix: fix issue 15423 for v3.11 Github issue #15423 --- cocos/ui/UIRichText.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cocos/ui/UIRichText.cpp b/cocos/ui/UIRichText.cpp index e9f9c0ea5eaf..15f2ac8e7415 100644 --- a/cocos/ui/UIRichText.cpp +++ b/cocos/ui/UIRichText.cpp @@ -25,6 +25,7 @@ #include "ui/UIRichText.h" #include +#include #include "tinyxml2/tinyxml2.h" #include "platform/CCFileUtils.h" @@ -705,7 +706,7 @@ static int getPrevWord(const std::string& text, int idx) // start from idx-1 for (int i=idx-1; i>=0; --i) { - if (!std::isalnum(text[i])) + if (!std::isalnum(text[i], std::locale())) return i; } return -1; @@ -715,7 +716,7 @@ static bool isWrappable(const std::string& text) { for (int i=0; i 0) From ba78999ffd7b0e95489b36ddf88d2e7dc7955b61 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 21 Apr 2016 09:39:19 +0800 Subject: [PATCH 038/241] update cocos2d-console --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 62c304c63a7f..5e5a8f279c5d 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 62c304c63a7fb08c6bc06e8a1571d602a23e23e7 +Subproject commit 5e5a8f279c5df0c98cafd27ffb43ce7e4e6a2082 From 3f8910d80c108171c14f047df8d07d85d5840454 Mon Sep 17 00:00:00 2001 From: Xpol Wan Date: Tue, 26 Apr 2016 13:57:53 +0800 Subject: [PATCH 039/241] Remove last internal use of deprecated `FileUtils::getFileData()`. --- cocos/platform/winrt/CCFreeTypeFont.cpp | 99 ++++++++++++++----------- 1 file changed, 55 insertions(+), 44 deletions(-) diff --git a/cocos/platform/winrt/CCFreeTypeFont.cpp b/cocos/platform/winrt/CCFreeTypeFont.cpp index a443dd85fb83..fdc13fe32df0 100644 --- a/cocos/platform/winrt/CCFreeTypeFont.cpp +++ b/cocos/platform/winrt/CCFreeTypeFont.cpp @@ -8,10 +8,10 @@ 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 @@ -42,14 +42,14 @@ static FT_Library s_FreeTypeLibrary = nullptr; const std::string CCFreeTypeFont::DEFAULT_FONT = "arial"; -CCFreeTypeFont::CCFreeTypeFont() +CCFreeTypeFont::CCFreeTypeFont() :m_space(" ") , m_face(nullptr) { } -CCFreeTypeFont::~CCFreeTypeFont() +CCFreeTypeFont::~CCFreeTypeFont() { reset(); } @@ -92,14 +92,14 @@ unsigned char* CCFreeTypeFont::initWithString(const char * text, const FontDefin #if 0 // check the cache for the font file buffer auto ittFontNames = s_fontsNames.find(textDefinition._fontName); - if(ittFontNames != s_fontsNames.end()) + if(ittFontNames != s_fontsNames.end()) { pBuffer = ittFontNames->second.pBuffer; size = ittFontNames->second.size; - } + } #endif // 0 - + if(!pBuffer) { // attempt to load font from Resources fonts folder @@ -130,7 +130,7 @@ unsigned char* CCFreeTypeFont::initWithString(const char * text, const FontDefin FontBufferInfo info; info.pBuffer = pBuffer; info.size = size; - s_fontsNames[textDefinition._fontName]=info; + s_fontsNames[textDefinition._fontName]=info; #endif // 0 } @@ -183,7 +183,7 @@ unsigned char* CCFreeTypeFont::getBitmap(Device::TextAlign eAlignMask, int &widt m_width = m_inWidth ? m_inWidth : m_textWidth; m_height = m_inHeight ? m_inHeight : m_textHeight; - + unsigned int size = m_width * m_height * 4; unsigned char* pBuffer = new unsigned char[size]; dataLength = size; @@ -210,7 +210,7 @@ FT_Vector CCFreeTypeFont::getPenForAlignment(FTLineInfo* pInfo, Device::TextAlig { FT_Error error = 0; FT_Vector pen; - + int top; int stringWidth = pInfo->bbox.xMax - pInfo->bbox.xMin; int maxLineNumber = totalLines - 1; @@ -221,19 +221,19 @@ FT_Vector CCFreeTypeFont::getPenForAlignment(FTLineInfo* pInfo, Device::TextAlig { case Device::TextAlign::TOP: // Horizontal center and vertical top. pen.x = ((m_width - stringWidth) / 2) - pInfo->bbox.xMin; - pen.y = pInfo->bbox.yMax + (lineNumber * m_lineHeight); + pen.y = pInfo->bbox.yMax + (lineNumber * m_lineHeight); break; - + case Device::TextAlign::TOP_LEFT: // Horizontal left and vertical top. pen.x -=pInfo->bbox.xMin; - pen.y = pInfo->bbox.yMax + (lineNumber * m_lineHeight); + pen.y = pInfo->bbox.yMax + (lineNumber * m_lineHeight); break; case Device::TextAlign::TOP_RIGHT: // Horizontal right and vertical top. pen.x = m_width - stringWidth - pInfo->bbox.xMin; - pen.y = pInfo->bbox.yMax + (lineNumber * m_lineHeight); + pen.y = pInfo->bbox.yMax + (lineNumber * m_lineHeight); break; - + case Device::TextAlign::BOTTOM_RIGHT: // Horizontal right and vertical bottom. pen.x = m_width - stringWidth - pInfo->bbox.xMin; pen.y = m_height + pInfo->bbox.yMin - ((maxLineNumber - lineNumber) * m_lineHeight); @@ -253,20 +253,20 @@ FT_Vector CCFreeTypeFont::getPenForAlignment(FTLineInfo* pInfo, Device::TextAlig case Device::TextAlign::CENTER: // Horizontal center and vertical center pen.x = ((m_width - stringWidth) / 2) - pInfo->bbox.xMin; top = (m_height - m_textHeight) / 2; - pen.y = top + (lineNumber * m_lineHeight) + pInfo->bbox.yMax; + pen.y = top + (lineNumber * m_lineHeight) + pInfo->bbox.yMax; break; case Device::TextAlign::RIGHT: // Horizontal right and vertical center. pen.x = m_width - stringWidth - pInfo->bbox.xMin; top = (m_height - m_textHeight) / 2; - pen.y = top + (lineNumber * m_lineHeight) + pInfo->bbox.yMax; + pen.y = top + (lineNumber * m_lineHeight) + pInfo->bbox.yMax; break; case Device::TextAlign::LEFT: // Horizontal left and vertical center. default: pen.x -=pInfo->bbox.xMin; top = (m_height - m_textHeight) / 2; - pen.y = top + (lineNumber * m_lineHeight) + pInfo->bbox.yMax; + pen.y = top + (lineNumber * m_lineHeight) + pInfo->bbox.yMax; break; } @@ -316,10 +316,10 @@ void CCFreeTypeFont::draw_bitmap(unsigned char* pBuffer, FT_Bitmap* bitmap, FT_ pBuffer[index++] = value * fontAlpha; } } - } + } } -void CCFreeTypeFont::endLine() +void CCFreeTypeFont::endLine() { if(m_currentLine) { @@ -329,7 +329,7 @@ void CCFreeTypeFont::endLine() } } -void CCFreeTypeFont::newLine() +void CCFreeTypeFont::newLine() { m_currentLine = new FTLineInfo(); m_currentLine->width = 0; @@ -338,24 +338,24 @@ void CCFreeTypeFont::newLine() } -FT_Error CCFreeTypeFont::addWord(const std::string& word) +FT_Error CCFreeTypeFont::addWord(const std::string& word) { std::vector glyphs; // glyphs for the word FT_BBox bbox; // bounding box containing all of the glyphs in the word int maxWidth = m_inWidth ? m_inWidth : m_windowWidth; std::string newWord; - if(m_currentLine->width > 0) + if(m_currentLine->width > 0) { newWord = ' ' + word; - } + } else { newWord = word; } FT_Error error = initWordGlyphs(glyphs, newWord, m_currentLine->pen); - if(!error) + if(!error) { compute_bbox(glyphs, &bbox); if(m_currentLine->width == 0 || bbox.xMax <= maxWidth) @@ -371,7 +371,7 @@ FT_Error CCFreeTypeFont::addWord(const std::string& word) } m_currentLine->width = m_currentLine->bbox.xMax - m_currentLine->bbox.xMin; } - else + else { endLine(); newLine(); @@ -381,7 +381,7 @@ FT_Error CCFreeTypeFont::addWord(const std::string& word) return error; } -FT_Error CCFreeTypeFont::initGlyphs(const char* text) +FT_Error CCFreeTypeFont::initGlyphs(const char* text) { FT_Error error = 0; std::stringstream stringStream(text); @@ -396,7 +396,7 @@ FT_Error CCFreeTypeFont::initGlyphs(const char* text) m_lines.clear(); - while(std::getline(stringStream, line) && !error) + while(std::getline(stringStream, line) && !error) { newLine(); @@ -422,14 +422,14 @@ FT_Error CCFreeTypeFont::initGlyphs(const char* text) // if linewidth > m_inWidth // get words for line -void CCFreeTypeFont::initWords(const char* text) +void CCFreeTypeFont::initWords(const char* text) { std::stringstream stringStream(text); std::string line; vector lines; vector words; - while(std::getline(stringStream, line)) + while(std::getline(stringStream, line)) { lines.push_back(line); } @@ -453,9 +453,9 @@ void CCFreeTypeFont::initWords(const char* text) } } -FT_Error CCFreeTypeFont::initWordGlyphs(std::vector& glyphs, const std::string& text, FT_Vector& pen) +FT_Error CCFreeTypeFont::initWordGlyphs(std::vector& glyphs, const std::string& text, FT_Vector& pen) { - FT_GlyphSlot slot = m_face->glyph; + FT_GlyphSlot slot = m_face->glyph; FT_UInt glyph_index; FT_UInt previous = 0; FT_Error error = 0; @@ -464,15 +464,15 @@ FT_Error CCFreeTypeFont::initWordGlyphs(std::vector& glyphs, const std:: wchar_t * pwszBuffer = nullptr; int num_chars = text.size(); - int nBufLen = num_chars + 1; + int nBufLen = num_chars + 1; pwszBuffer = new wchar_t[nBufLen]; if(!pwszBuffer) { return -1; } - + memset(pwszBuffer,0,nBufLen); - num_chars = MultiByteToWideChar(CP_UTF8, 0, text.c_str(), num_chars, pwszBuffer, nBufLen); + num_chars = MultiByteToWideChar(CP_UTF8, 0, text.c_str(), num_chars, pwszBuffer, nBufLen); pwszBuffer[num_chars] = '\0'; glyphs.clear(); @@ -571,12 +571,22 @@ void CCFreeTypeFont::compute_bbox(std::vector& glyphs, FT_BBox *abbox) bbox.xMax = 0; bbox.yMax = 0; } - + /* return string bbox */ *abbox = bbox; } -unsigned char* CCFreeTypeFont::loadFont(const char *pFontName, ssize_t *size) +namespace { + inline unsigned char* takeBuffer(Data& data, ssize_t* size = nullptr) { + auto buffer = data.getBytes(); + if (size) + *size = data.getSize(); + data.fastSet(nullptr, 0); + return buffer; + } +} + +unsigned char* CCFreeTypeFont::loadFont(const char *pFontName, ssize_t *size) { @@ -611,10 +621,12 @@ unsigned char* CCFreeTypeFont::loadFont(const char *pFontName, ssize_t *size) return nullptr; } - return FileUtils::getInstance()->getFileData(fullpath.c_str(), "rb", size); + Data d; + FileUtils::getInstance()->getContents(fullpath, &d); + return takeBuffer(d, size); } -unsigned char* CCFreeTypeFont::loadSystemFont(const char *pFontName, ssize_t *size) +unsigned char* CCFreeTypeFont::loadSystemFont(const char *pFontName, ssize_t *size) { std::string aName(pFontName); unsigned char* pBuffer = nullptr; @@ -631,9 +643,9 @@ unsigned char* CCFreeTypeFont::loadSystemFont(const char *pFontName, ssize_t *si BOOL exists; std::wstring fontNameW; const void *fontFileReferenceKey = nullptr; - UINT32 fontFileReferenceKeySize; + UINT32 fontFileReferenceKeySize; void *fragmentContext = nullptr; - + for (unsigned int i = 0; i < aName.length(); ++i) { aName[i] = tolower(aName[i]); @@ -649,7 +661,7 @@ unsigned char* CCFreeTypeFont::loadSystemFont(const char *pFontName, ssize_t *si hr = writeFactory->GetSystemFontCollection(&fontCollection, TRUE); } - //get the font + //get the font if(SUCCEEDED(hr)) { hr = fontCollection->FindFamilyName(fontNameW.c_str(), &index, &exists); @@ -704,7 +716,7 @@ unsigned char* CCFreeTypeFont::loadSystemFont(const char *pFontName, ssize_t *si if(SUCCEEDED(hr)) { pBuffer = (unsigned char*)malloc((size_t)fileSize); - memcpy(pBuffer, fragmentStart, (size_t)fileSize); + memcpy(pBuffer, fragmentStart, (size_t)fileSize); *size = (unsigned long)fileSize; } } @@ -750,4 +762,3 @@ unsigned char* CCFreeTypeFont::loadSystemFont(const char *pFontName, ssize_t *si } NS_CC_END - From bd3c3a7c3dd37fc39f4ca0252687a792378acbdd Mon Sep 17 00:00:00 2001 From: Xpol Wan Date: Tue, 26 Apr 2016 14:54:20 +0800 Subject: [PATCH 040/241] remove default value for size argument. --- cocos/platform/winrt/CCFreeTypeFont.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/platform/winrt/CCFreeTypeFont.cpp b/cocos/platform/winrt/CCFreeTypeFont.cpp index fdc13fe32df0..ef6d89fa7a0d 100644 --- a/cocos/platform/winrt/CCFreeTypeFont.cpp +++ b/cocos/platform/winrt/CCFreeTypeFont.cpp @@ -577,7 +577,7 @@ void CCFreeTypeFont::compute_bbox(std::vector& glyphs, FT_BBox *abbox) } namespace { - inline unsigned char* takeBuffer(Data& data, ssize_t* size = nullptr) { + inline unsigned char* takeBuffer(Data& data, ssize_t* size) { auto buffer = data.getBytes(); if (size) *size = data.getSize(); From bb4a54b042993161f1c6f22f3200d1fb5bfed5fc Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 26 Apr 2016 15:59:30 +0800 Subject: [PATCH 041/241] use fullpath to play background music --- cocos/audio/android/jni/cddandroidAndroidJavaEngine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/audio/android/jni/cddandroidAndroidJavaEngine.cpp b/cocos/audio/android/jni/cddandroidAndroidJavaEngine.cpp index ddc27202c4e8..03125a95208c 100644 --- a/cocos/audio/android/jni/cddandroidAndroidJavaEngine.cpp +++ b/cocos/audio/android/jni/cddandroidAndroidJavaEngine.cpp @@ -75,12 +75,12 @@ AndroidJavaEngine::~AndroidJavaEngine() void AndroidJavaEngine::preloadBackgroundMusic(const char* filePath) { std::string fullPath = CocosDenshion::android::getFullPathWithoutAssetsPrefix(filePath); - JniHelper::callStaticVoidMethod(helperClassName, "preloadBackgroundMusic", filePath); + JniHelper::callStaticVoidMethod(helperClassName, "preloadBackgroundMusic", fullPath); } void AndroidJavaEngine::playBackgroundMusic(const char* filePath, bool loop) { std::string fullPath = CocosDenshion::android::getFullPathWithoutAssetsPrefix(filePath); - JniHelper::callStaticVoidMethod(helperClassName, "playBackgroundMusic", filePath, loop); + JniHelper::callStaticVoidMethod(helperClassName, "playBackgroundMusic", fullPath, loop); } void AndroidJavaEngine::stopBackgroundMusic(bool releaseData) { From 1cc0130bdddd5e268cc57edd2cccd12a3d6bddc8 Mon Sep 17 00:00:00 2001 From: Xpol Wan Date: Tue, 26 Apr 2016 14:50:39 +0800 Subject: [PATCH 042/241] Fixes signed/unsigned mismatch warnings. ``` 2d\CCFontFNT.cpp(328): warning C4018: '<' : signed/unsigned mismatch 2d\CCLabel.cpp(782): warning C4018: '>' : signed/unsigned mismatch 2d\CCLabel.cpp(784): warning C4018: '<' : signed/unsigned mismatch scripting\js-bindings\manual\cocos2d_specifics.cpp(2741): warning C4018: '<' : signed/unsigned mismatch tests\cpp-tests\Classes\Sprite3DTest\Sprite3DTest.cpp(1969): warning C4018: '>=' : signed/unsigned mismatch tests\cpp-tests\Classes\TextInputTest\TextInputTest.cpp(264): warning C4018: '>=' : signed/unsigned mismatch ui\UIEditBox\UIEditBoxImpl-common.cpp(113): warning C4018: '<' : signed/unsigned mismatch ui\UIRichText.cpp(1573): warning C4018: '<=' : signed/unsigned mismatch ui\UITextField.cpp(89): warning C4018: '>=' : signed/unsigned mismatch ``` --- cocos/2d/CCFontFNT.cpp | 4 ++-- cocos/2d/CCLabel.cpp | 4 ++-- cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp | 2 +- cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp | 2 +- cocos/ui/UIRichText.cpp | 2 +- cocos/ui/UITextField.cpp | 2 +- tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp | 2 +- tests/cpp-tests/Classes/TextInputTest/TextInputTest.h | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cocos/2d/CCFontFNT.cpp b/cocos/2d/CCFontFNT.cpp index 5b4ce9d6a7cf..cd8ae17e3d2d 100644 --- a/cocos/2d/CCFontFNT.cpp +++ b/cocos/2d/CCFontFNT.cpp @@ -316,8 +316,8 @@ std::set* BMFontConfiguration::parseConfigFile(const std::string& auto next = strchr(contents, '\n'); auto base = contents; - int lineLength = 0; - int parseCount = 0; + size_t lineLength = 0; + size_t parseCount = 0; while (next) { lineLength = ((int)(next - base)); diff --git a/cocos/2d/CCLabel.cpp b/cocos/2d/CCLabel.cpp index 1dd85af6f788..31e161080ddc 100644 --- a/cocos/2d/CCLabel.cpp +++ b/cocos/2d/CCLabel.cpp @@ -779,9 +779,9 @@ bool Label::alignText() do { _fontAtlas->prepareLetterDefinitions(_utf16Text); auto& textures = _fontAtlas->getTextures(); - if (textures.size() > _batchNodes.size()) + if (textures.size() > static_cast(_batchNodes.size())) { - for (auto index = _batchNodes.size(); index < textures.size(); ++index) + for (auto index = static_cast(_batchNodes.size()); index < textures.size(); ++index) { auto batchNode = SpriteBatchNode::createWithTexture(textures.at(index)); if (batchNode) diff --git a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp index 298b8e0a4069..4c45d25758b8 100644 --- a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp +++ b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp @@ -2738,7 +2738,7 @@ bool js_cocos2dx_ActionInterval_easing(JSContext *cx, uint32_t argc, jsval *vp) double tag; double parameter; - for (int i = 0; i < argc; i++) + for (uint32_t i = 0; i < argc; i++) { // jsval vpi = argv[i]; JS::RootedValue vpi(cx, args.get(i)); diff --git a/cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp b/cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp index 88df3bf56e58..a2b5b65a946d 100644 --- a/cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp +++ b/cocos/ui/UIEditBox/UIEditBoxImpl-common.cpp @@ -110,7 +110,7 @@ void EditBoxImplCommon::setInactiveText(const char* pText) if(EditBox::InputFlag::PASSWORD == _editBoxInputFlag) { std::string passwordString; - for(int i = 0; i < strlen(pText); ++i) + for(size_t i = 0; i < strlen(pText); ++i) passwordString.append(PASSWORD_CHAR); _label->setString(passwordString); } diff --git a/cocos/ui/UIRichText.cpp b/cocos/ui/UIRichText.cpp index 44ead9a89d29..fb042f5fb5e1 100644 --- a/cocos/ui/UIRichText.cpp +++ b/cocos/ui/UIRichText.cpp @@ -1570,7 +1570,7 @@ int RichText::findSplitPositionForChar(cocos2d::Label* label, const std::string& leftLength--; break; } - else if (stringLength <= leftLength) { + else if (static_cast(stringLength) <= leftLength) { break; } } diff --git a/cocos/ui/UITextField.cpp b/cocos/ui/UITextField.cpp index 97b66f17c6d6..1ee060a7d97f 100644 --- a/cocos/ui/UITextField.cpp +++ b/cocos/ui/UITextField.cpp @@ -86,7 +86,7 @@ bool UICCTextField::onTextFieldInsertText(TextFieldTTF *pSender, const char *tex setInsertText(true); if (_maxLengthEnabled) { - if (TextFieldTTF::getCharCount() >= _maxLength) + if (static_cast(TextFieldTTF::getCharCount()) >= _maxLength) { return true; } diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index e7471978991f..43b7a7697eca 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -1966,7 +1966,7 @@ NodeAnimationTest::NodeAnimationTest() _sprites[_vectorIndex]->setVisible(false); int tIndex = _vectorIndex + 1; - if(tIndex >= _sprites.size()) + if(tIndex >= static_cast(_sprites.size())) _vectorIndex = 0; else _vectorIndex++; diff --git a/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h b/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h index 0ea4f15dbe64..4c3f48a610d9 100644 --- a/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h +++ b/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h @@ -53,7 +53,7 @@ class TextFieldTTFActionTest : public KeyboardNotificationLayer, public cocos2d: cocos2d::TextFieldTTF* _textField; cocos2d::Action* _textFieldAction; bool _action; - int _charLimit; // the textfield max char limit + size_t _charLimit; // the textfield max char limit public: CREATE_FUNC(TextFieldTTFActionTest); From f395cadbac0553aecc3bdedc8b1910ce0382eeee Mon Sep 17 00:00:00 2001 From: mogemimi Date: Wed, 27 Apr 2016 04:08:09 +0900 Subject: [PATCH 043/241] Add CC_GUI_DLL to suppress warning C4275 --- cocos/ui/UIEditBox/UIEditBoxImpl-common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/ui/UIEditBox/UIEditBoxImpl-common.h b/cocos/ui/UIEditBox/UIEditBoxImpl-common.h index 1785bf6ec1bd..2a0c95fd4fb2 100644 --- a/cocos/ui/UIEditBox/UIEditBoxImpl-common.h +++ b/cocos/ui/UIEditBox/UIEditBoxImpl-common.h @@ -37,7 +37,7 @@ namespace ui { class EditBox; -class EditBoxImplCommon : public EditBoxImpl +class CC_GUI_DLL EditBoxImplCommon : public EditBoxImpl { public: /** From 79d659e46b8ce4d4028516381e412c86b4d0789f Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 27 Apr 2016 15:01:02 +0800 Subject: [PATCH 044/241] update changelog and release note --- CHANGELOG | 1 + docs/RELEASE_NOTES.md | 258 ++++-------------------------------------- 2 files changed, 22 insertions(+), 237 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b1cce323713b..74549d212b65 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ cocos2d-x-3.11 Apr ? 2016 [HIGHLIGHT] JS: new memory model, don't have to use retain/release in JS [HIGHLIGHT] Curl: upgrade to v7.48 [HIGHLIGHT] OpenSSL: upgrade to 1.0.2g +[HiGHLIGHT] Support Tizen platform [NEW] JS: web console is enabled debugging JSB projects via firefox [NEW] UI: add a setter for touch total time threshold in ScrollView diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index eebd4386dc06..505c60d9c183 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -26,7 +26,7 @@ -# Cocos2d-x 3.10 Release Notes # +# Cocos2d-x 3.11 Release Notes # # Misc Information @@ -147,256 +147,40 @@ Use Cocos Console to create a new game: cocos new -l cpp|js|lua MyNewGame ``` -# v3.10 - -## Highlights features, improvements and API updates of v3.10 - -We are happy to announce the release of Cocos2d-x v3.10. Following are the highlighted features, improvements and API updates in this version. - -1. Provides a unified setup for both Cocos2d-x and Cocos. This allows you to stay up to date with the latest Cocos2d-x releases. This includes using precompiled binaries and source code, in a single place. As always the source code is available from [GitHub](https://github.com/cocos2d/cocos2d-x) but, there is no longer a `.zip` file available containing the source code. -2. New __Cocos Launcher__ tool! __Cocos Launcher__ allows: - * One step to create a new project with the engine, by using precompiled libraries or source code. - * Easy integration with SDKBOX for 3rd party services: Facebook, IAP and many more. - * Developers to provide feedback and get support, directly within __Cocos Launcher__, making it simple to contact the engine team for help.  -3. UI System: - * Reimplemented `Scale9Sprite` to improve performance and reduce memory consumption. - * Changed `PageView` to derive from `ListView`. `PageView` can add any widget as a child. - * Added three new *overflow types* to `Label`: **CLAMP**,**SHRINK**, **RESIZE_HEIGHT**. - * Fixed a bug in `ClippingNode` that corrects its behavior when being set as a child. -4. Improved **JavaScript Bindings**: follows [SpiderMonkey GC best practices](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/GC_Rooting_Guide) making it more robust. - -## The main features in detail of Cocos2d-x v3.10: - -### UI System - -1. Reimplemented `Scale9Sprite` and improve the scale9sprite performance and reduce memory consumption. - - Reimplemented ui::Scale9Sprite, now the Slice sprite uses 16 vertices and 54 indices instead of the old 9 sprites way, The memory consumption is much lower than the previous implementation, and it is also more efficient. - - In SIMPLE mode, the 4 borders are all 0 and the whole sprite will scale horizontally and vertically. In this mode only 1 quad is used for rendering, for example: - - auto blocks = ui::Scale9Sprite::createWithSpriteFrameName("blocks9c.png"); - //When setting to SIMPLE, only 4 vertexes is used to rendering. - blocks->setRenderingType(Scale9Sprite::RenderingType::SIMPLE); - - In SLICE mode, it will use 18 triangles to rendering the slice 9 sprite. If the 4 borders are 0, there still be 18 triangles computed. So choose your RenderingType wisely, for example: - - auto sprite = ui::Scale9Sprite::createWithSpriteFrameName("blocks9c.png"); - //When setting to SLICE, 16 vertexes will be used to rendering. - sprite->setRenderingType(Scale9Sprite::RenderingType::SLICE); - -2. Changed `PageView` to derived from ListView, PageView can add any type of widget as child. - - PageView was derived from Layout and it implemented the features of scrolling and item arrangement from scratch. But the features are already there in ListView. So remove those duplicated implementations from PageView and make it inherit from ListView. - - By consequence, PageView becomes simpler and easier to maintain because it considers only paging implementation. for example: - - // Create the page view - Size size(240, 130); - PageView* pageView = PageView::create(); - pageView->setDirection(PageView::Direction::HORIZONTAL); - pageView->setContentSize(size); - Size backgroundSize = background->getContentSize(); - //"removeAllPages" is changed to "removeAllItems" - pageView->removeAllItems(); - pageView->setIndicatorEnabled(true); - - int pageCount = 4; - for (int i = 0; i < pageCount; ++i) - { - Layout* layout = Layout::create(); - layout->setContentSize(size); - - ImageView* imageView = ImageView::create("cocosui/scrollviewbg.png"); - imageView->setScale9Enabled(true); - imageView->setContentSize(size); - imageView->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); - layout->addChild(imageView); - - Text* label = Text::create(StringUtils::format("page %d",(i+1)), "fonts/Marker Felt.ttf", 30); - label->setColor(Color3B(192, 192, 192)); - label->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); - layout->addChild(label); - //"insertPage" is changed to "insertCustomItem" - pageView->insertCustomItem(layout, i); - } - //"removePageAtIndex" is changed to "removeItem" - pageView->removeItem(0); - //"scrollToPage" is changed to "scrollToItem" - pageView->scrollToItem(pageCount - 2); - - More detail usage please refer to: tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp. - - -3. Added three overflow type to new label: CLAMP, SHRINK, RESIZE_HEIGHT. - - Overflow type is used to control label overflow result, In SHRINK mode, the font size will change dynamically to adapt the content size. In CLAMP mode, when label content goes out of the bounding box, it will be clipped, In RESIZE_HEIGHT mode, you can only change the width of label and the height is changed automatically. For example: - - //Change the label's Overflow type - label->setOverflow(Label::Overflow::RESIZE_HEIGHT); - - More detail usage please refer to: tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp. - - Limitations: - - - currently only TTF and BMFont support all the valid Overflow type. Char Map font supports all the Overflow type except for SHRINK, because we can't measure its font size. System font only support Overflow::Normal and Overflow::RESIZE_HEIGHT. +# v3.11 -## Other changes -[NEW] RichText supported new line element. - -[NEW] UIText::clone supports clone the text effect. - -[NEW] UI: Added methods to query label effect state. - -[REFINE] IOS: Added virtual keyword for some render related function. - -[REFINE] UI: Fixed boring deprecated warning in HttpRequest. - -[REFINE] Network: Fixed Downloader bug on iOS & Android platform. - -[REFINE] Studio: Fixed deprecation warning in SkeletonRenderer. - -[REFINE] JS: Added js test case for fix, improve template. - -[REFINE] Network: Permit http access to cocos2d-x.org in test projects on iOS. - -[REFINE] Network: Crash when removing a remotely downloaded image from texture -cache in js-binding. - -[REFINE] Win10: WinRT project update version to v3.10. - -[REFINE] Console: Added quiet option for Cocos Toolkit. - -[REFINE] JS: New GC model for js-binding. - -[REFINE] Doc: Fixed typos in documentation and comments. - -[REFINE] UI: Updated controlButton size calculate with new Scale9Sprite logic. - -[REFINE] Win10: Added missing _USRJSSTATIC preprocessor define for ARM builds. - -[REFINE] JS: Added ccvector_to / ccmap_to converted to new js-binding API. - -[REFINE] UI: Slider misprint fix. - -[FIX] Core: Fixed premultiplyAlpha for mipmaps and compressed textures. - -[FIX] UI: Fixed Scale9sprite rendering error when content size smaller than the sum of leftInset and rightInset. - -[FIX] Win32: Fixed EditBox crash when removing an EditBox in a scheduler. - -[FIX] Android: Fixed cannot add view to mFrameLayout when extends Cocos2dxActivity. - -[FIX] 2D: Fixed actionNode set at wrong position bug. - -[FIX] 3D: Fixed the movement of PUParticle lags one frame. - -[FIX] UI: Fixed the wront argument of setPlaceholderFontName in EditBox. - -[FIX] UI: Fixed EditBox editBoxEditingDidEnd may use the original text after change the text of EditBox in user script. - -[FIX] Audio: Fixed `FinishCallback` never be called in Windows. - -[FIX] UI: Fixed Layout stencil clipping nested with Clipping Node rendering issue. - -[FIX] UI: Keyboard doesn't hide when click the screen outside of EditBox on iOS platform. - -[FIX] UI: Fixed a fatal bug in EditBox implement on Windows platform. - -[FIX] UI: Fixed edit box setPlaceholderFontName and scale font size issue. - -[FIX] Core: Fixed memory leak when initWithImage() failed. - -[FIX] Network: CCDownloader on iOS is broken in v3.9 js-binding. - -[FIX] JS: Bindings fixes for Menu, Sprite and Label. +## Highlights features -[FIX] Studio: Removed weak reference in ActionNode. +* upgrade Chipmunk to v7.0.1 +* use new memory model in JSB, don't have to invoke `retain/release` in JS, it is disabled by default +* support Tizen platform +* upgrade Culr to v7.48 +* upgrade OpenSSL to 1.0.2g -[FIX] UI: shouldStartLoading method should return value to js in js-binding. +## The main features in detail of Cocos2d-x v3.11 -[FIX] UI: Fixed scrollview render error. +### New memory model in JSB -[FIX] JS: Fixed win32 js project crash issue. +With new memory model, you don't have to care about object lifecycle. Which means you don't have to invoke `retain/release` in JS any more. -[FIX] UI: Button touch doesn't work with scale9 enabled. +Though we have finished many tests about this new memory model, we can't make sure it is too perfect to enable it by default. But you are appreciated if you can enable it to have a try. If you want to enable it, you should: -[FIX] JS: Fixed evalString doesn't return result issue. - -[FIX] JS: Fixed ComponentJS proxy management issue in JSB. +``` +TBD +``` -[FIX] Android: Fixed include in cocos network module. +### OpenSSL -[FIX] Network: Fixed web socket crash. +Beginning July 11, 2016, Google Play will block publishing of any new apps or updates that use older versions of OpenSSL. So coocs2d-x upgrades OpenSSL to latest version(v1.0.2g). -[FIX] UI: Fixed TextField missing default password style text setting. +If you use v2.x or use older versions of v3.x, you can just update CURL and OpenSSL. This guild shows you how to do. [TBD: Add guide link]() -[TEST] S9SpriteTest: Scale9Sprite fade actions with cascade opacity. +### Tizen support -[TEST] Web: Removed default focus block from UIFocusTestVertical. +TBD: doc links of Tizen -[TEST] Lua: Fixed pageViewTest Horizontal scroll won't work in Lua-test. +## Other changes You can also take a look at the [full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG). -## NEW APIS - -1. RichText - - Added RichElementNewLine class to create new RichText Element. - - For more information: [https://github.com/cocos2d/cocos2d-x/pull/14033](https://github.com/cocos2d/cocos2d-x/pull/14033 "https://github.com/cocos2d/cocos2d-x/pull/14033") - -2. PageViewIndicator - - Added PageViewIndicator class to create PageViewIndicator. - - For more information: [https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/ui/UIPageViewIndicator.h](https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/ui/UIPageViewIndicator.h "https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/ui/UIPageViewIndicator.h") - -3. PageView - - Changed PageView to derived from ListView. - For more information: [https://github.com/cocos2d/cocos2d-x/pull/14252](https://github.com/cocos2d/cocos2d-x/pull/14252 "https://github.com/cocos2d/cocos2d-x/pull/14252") - -4. ApplicationProtocol - - Added the API getVersion. - - -5. PolygonInfo - - Added the API setTriangles. - -6. Scale9Sprite - - Added setRenderingType, getRenderingType. - -9. FontFNT - - Added setFontSize, getOriginalFontSize. - -10. Label - - Added setBMFontSize, getBMFontSize, enableWrap, isWrapEnabled, setOverflow, getOverflow, initWithTTF, isShadowEnabled, getShadowOffset, getShadowBlurRadius, getShadowColor, getOutlineSize, getLabelEffectType, getEffectColor. - -11. AudioEngineImpl - - Added AudioEngineImpl to implement FMOD. - -12. Lua Module - - Added luaval_to_node, node_to_luaval. - -13. JS Module - - Added js_cocos2dx_ComponentJS_create - -14. ui::Text - - Added isShadowEnabled, getShadowOffset, getShadowBlurRadius, getShadowColor, getOutlineSize, getLabelEffectType, getEffectColor. - -15. UITextTest_Clone - - Added UITextTest_Clone class. \ No newline at end of file From 0f19bec99d4aa207a40f8ad6b7ea60c92186ad1d Mon Sep 17 00:00:00 2001 From: Dawid Drozd Date: Wed, 27 Apr 2016 13:15:08 +0200 Subject: [PATCH 045/241] Fix compile error isnan -> std::isnan #15111 Issue: https://github.com/cocos2d/cocos2d-x/issues/15111 --- cocos/2d/CCActionCamera.cpp | 6 +++--- cocos/2d/CCSpriteFrame.cpp | 2 +- extensions/GUI/CCControlExtension/CCControlUtils.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cocos/2d/CCActionCamera.cpp b/cocos/2d/CCActionCamera.cpp index beea0b952d3f..cb02318f0cbb 100644 --- a/cocos/2d/CCActionCamera.cpp +++ b/cocos/2d/CCActionCamera.cpp @@ -194,11 +194,11 @@ void OrbitCamera::startWithTarget(Node *target) float r, zenith, azimuth; this->sphericalRadius(&r, &zenith, &azimuth); - if( isnan(_radius) ) + if( std::isnan(_radius) ) _radius = r; - if( isnan(_angleZ) ) + if( std::isnan(_angleZ) ) _angleZ = (float)CC_RADIANS_TO_DEGREES(zenith); - if( isnan(_angleX) ) + if( std::isnan(_angleX) ) _angleX = (float)CC_RADIANS_TO_DEGREES(azimuth); _radZ = (float)CC_DEGREES_TO_RADIANS(_angleZ); diff --git a/cocos/2d/CCSpriteFrame.cpp b/cocos/2d/CCSpriteFrame.cpp index 809fcbac89f9..516d4f7157e7 100644 --- a/cocos/2d/CCSpriteFrame.cpp +++ b/cocos/2d/CCSpriteFrame.cpp @@ -188,7 +188,7 @@ void SpriteFrame::setAnchorPoint(const Vec2& anchorPoint) bool SpriteFrame::hasAnchorPoint() const { - return !isnan(_anchorPoint.x); + return !std::isnan(_anchorPoint.x); } void SpriteFrame::setTexture(Texture2D * texture) diff --git a/extensions/GUI/CCControlExtension/CCControlUtils.cpp b/extensions/GUI/CCControlExtension/CCControlUtils.cpp index f2c868d20c20..97c69a553e60 100644 --- a/extensions/GUI/CCControlExtension/CCControlUtils.cpp +++ b/extensions/GUI/CCControlExtension/CCControlUtils.cpp @@ -92,7 +92,7 @@ RGBA ControlUtils::RGBfromHSV(HSV value) if (value.s <= 0.0) // < is bogus, just shuts up warnings { - if (isnan(value.h)) // value.h == NAN + if (std::isnan(value.h)) // value.h == NAN { out.r = value.v; out.g = value.v; From 482788c933eb6da227dc873591552420499c7d5b Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Thu, 28 Apr 2016 09:49:55 +0800 Subject: [PATCH 046/241] Add tizen support (#15518) * add Tizen Support * fix linter error * fix tizen audio engine lua bindings config --- .gitignore | 4 + build/tizen/.cproject | 957 +++++++++++++ build/tizen/.exportMap | 4 + build/tizen/.gitignore | 3 + build/tizen/.project | 295 ++++ build/tizen/.tproject | 12 + cocos/2d/CCAutoPolygon.cpp | 4 +- cocos/2d/CCAutoPolygon.h | 4 +- cocos/audio/AudioEngine.cpp | 2 + cocos/audio/tizen/AudioEngine-tizen.cpp | 402 ++++++ cocos/audio/tizen/AudioEngine-tizen.h | 117 ++ cocos/audio/tizen/SimpleAudioEngineTizen.cpp | 217 +++ cocos/base/allocator/CCAllocatorMutex.h | 2 +- cocos/cocos2d.h | 7 + .../cocostudio/CCSGUIReader.cpp | 5 + .../editor-support/cocostudio/CCSGUIReader.h | 1 + .../ButtonReader/ButtonReader.cpp | 3 + .../CheckBoxReader/CheckBoxReader.cpp | 2 + .../ImageViewReader/ImageViewReader.cpp | 2 + .../LayoutReader/LayoutReader.cpp | 3 + .../ListViewReader/ListViewReader.cpp | 2 + .../LoadingBarReader/LoadingBarReader.cpp | 2 + .../PageViewReader/PageViewReader.cpp | 2 + .../ScrollViewReader/ScrollViewReader.cpp | 2 + .../SliderReader/SliderReader.cpp | 2 + .../TextAtlasReader/TextAtlasReader.cpp | 1 + .../TextBMFontReader/TextBMFontReader.cpp | 1 + .../TextFieldReader/TextFieldReader.cpp | 1 + .../WidgetReader/TextReader/TextReader.cpp | 1 + .../WidgetReader/WidgetReaderProtocol.h | 2 +- cocos/platform/CCApplication.h | 2 + cocos/platform/CCGL.h | 2 + cocos/platform/CCImage.cpp | 4 +- cocos/platform/CCPlatformDefine.h | 2 + cocos/platform/CCStdC.h | 2 + cocos/platform/tizen/CCApplication-tizen.cpp | 663 +++++++++ cocos/platform/tizen/CCApplication-tizen.h | 142 ++ cocos/platform/tizen/CCCommon-tizen.cpp | 46 + cocos/platform/tizen/CCDevice-tizen.cpp | 358 +++++ cocos/platform/tizen/CCFileUtils-tizen.cpp | 88 ++ cocos/platform/tizen/CCFileUtils-tizen.h | 70 + cocos/platform/tizen/CCGL-tizen.h | 49 + cocos/platform/tizen/CCGLViewImpl-tizen.cpp | 217 +++ cocos/platform/tizen/CCGLViewImpl-tizen.h | 61 + cocos/platform/tizen/CCPlatformDefine-tizen.h | 51 + cocos/platform/tizen/CCStdC-tizen.cpp | 72 + cocos/platform/tizen/CCStdC-tizen.h | 60 + .../auto/lua_cocos2dx_audioengine_auto.cpp | 26 +- .../auto/lua_cocos2dx_audioengine_auto.hpp | 2 +- .../lua_cocos2dx_audioengine_manual.cpp | 2 +- .../lua-bindings/proj.tizen/.cproject | 1166 +++++++++++++++ .../lua-bindings/proj.tizen/.gitignore | 2 + .../lua-bindings/proj.tizen/.project | 137 ++ .../lua-bindings/proj.tizen/.tproject | 12 + cocos/ui/CocosGUI.h | 4 +- cocos/ui/UIEditBox/UIEditBoxImpl-tizen.cpp | 439 ++++++ cocos/ui/UIEditBox/UIEditBoxImpl-tizen.h | 117 ++ cocos/ui/UIVideoPlayer-tizen.cpp | 428 ++++++ cocos/ui/UIVideoPlayer.h | 2 +- cocos/ui/UIWebView-inl.h | 1 + cocos/ui/UIWebView.cpp | 2 +- cocos/ui/UIWebView.h | 2 +- cocos/ui/UIWebViewImpl-tizen.cpp | 162 +++ cocos/ui/UIWebViewImpl-tizen.h | 99 ++ .../Particle3D/PU/CCPUMaterialManager.cpp | 4 +- .../CCEventListenerAssetsManagerEx.cpp | 4 +- external/config.json | 4 +- .../cocos-project-template.json | 10 +- .../cpp-template-default/proj.tizen/.cproject | 793 ++++++++++ .../proj.tizen/.exportMap | 4 + .../proj.tizen/.gitignore | 7 + .../cpp-template-default/proj.tizen/.project | 56 + .../cpp-template-default/proj.tizen/.tproject | 11 + .../proj.tizen/copy_resource.sh | 3 + .../proj.tizen/res/.gitkeep | 0 .../proj.tizen/shared/res/HelloCpp.png | Bin 0 -> 23871 bytes .../proj.tizen/src/main.cpp | 17 + .../proj.tizen/tizen-manifest.xml | 7 + .../cocos-project-template.json | 10 +- .../runtime-src/proj.tizen/.cproject | 813 +++++++++++ .../runtime-src/proj.tizen/.exportMap | 4 + .../runtime-src/proj.tizen/.gitignore | 4 + .../runtime-src/proj.tizen/.project | 50 + .../runtime-src/proj.tizen/.tproject | 11 + .../runtime-src/proj.tizen/copy_resource.sh | 6 + .../runtime-src/proj.tizen/res/.gitkeep | 0 .../proj.tizen/shared/res/HelloLua.png | Bin 0 -> 23871 bytes .../runtime-src/proj.tizen/src/main.cpp | 17 + .../runtime-src/proj.tizen/tizen-manifest.xml | 7 + tests/cpp-empty-test/proj.tizen/.cproject | 909 ++++++++++++ tests/cpp-empty-test/proj.tizen/.exportMap | 4 + tests/cpp-empty-test/proj.tizen/.gitignore | 7 + tests/cpp-empty-test/proj.tizen/.project | 65 + .../org.eclipse.cdt.managedbuilder.core.prefs | 13 + tests/cpp-empty-test/proj.tizen/.tproject | 12 + .../proj.tizen/copy_resource.sh | 3 + tests/cpp-empty-test/proj.tizen/res/.gitkeep | 0 .../proj.tizen/shared/res/cpp-empty-test.png | Bin 0 -> 23871 bytes tests/cpp-empty-test/proj.tizen/src/main.cpp | 20 + .../proj.tizen/tizen-manifest.xml | 8 + .../CocoStudioSceneTest/SceneEditorTest.cpp | 363 +++-- .../CocoStudioSceneTest/SceneEditorTest.h | 105 +- tests/cpp-tests/Classes/JNITest/JNITest.cpp | 6 + tests/cpp-tests/Classes/JNITest/JNITest.h | 4 +- .../SpritePolygonTest/SpritePolygonTest.cpp | 30 +- tests/cpp-tests/proj.tizen/.cproject | 1274 +++++++++++++++++ tests/cpp-tests/proj.tizen/.exportMap | 4 + tests/cpp-tests/proj.tizen/.gitignore | 7 + tests/cpp-tests/proj.tizen/.project | 62 + tests/cpp-tests/proj.tizen/.tproject | 12 + tests/cpp-tests/proj.tizen/copy_resource.sh | 3 + tests/cpp-tests/proj.tizen/res/.gitkeep | 0 .../proj.tizen/shared/res/cpp-tests.png | Bin 0 -> 23871 bytes tests/cpp-tests/proj.tizen/src/main.cpp | 22 + tests/cpp-tests/proj.tizen/tizen-manifest.xml | 13 + .../project/proj.tizen/.cproject | 958 +++++++++++++ .../project/proj.tizen/.exportMap | 4 + .../project/proj.tizen/.gitignore | 8 + .../project/proj.tizen/.project | 50 + .../project/proj.tizen/.tproject | 12 + .../project/proj.tizen/copy_resource.sh | 7 + .../project/proj.tizen/res/.gitignore | 2 + .../project/proj.tizen/res/.gitkeep | 0 .../proj.tizen/shared/res/lua-empty-test.png | Bin 0 -> 23871 bytes .../project/proj.tizen/src/main.cpp | 20 + .../project/proj.tizen/tizen-manifest.xml | 8 + tests/lua-tests/project/proj.tizen/.cproject | 934 ++++++++++++ tests/lua-tests/project/proj.tizen/.exportMap | 4 + tests/lua-tests/project/proj.tizen/.gitignore | 8 + tests/lua-tests/project/proj.tizen/.project | 50 + .../org.eclipse.cdt.managedbuilder.core.prefs | 13 + tests/lua-tests/project/proj.tizen/.tproject | 12 + .../project/proj.tizen/copy_resource.sh | 9 + .../project/proj.tizen/res/.gitignore | 2 + .../lua-tests/project/proj.tizen/res/.gitkeep | 0 .../proj.tizen/shared/res/lua-tests.png | Bin 0 -> 23871 bytes .../lua-tests/project/proj.tizen/src/main.cpp | 20 + .../project/proj.tizen/tizen-manifest.xml | 11 + .../ByteCodeEncryptTest.lua | 2 +- .../src/Particle3DTest/Particle3DTest.lua | 2 +- tests/lua-tests/src/mainMenu.lua | 14 +- tools/tolua/cocos2dx_audioengine.ini | 2 +- 142 files changed, 13194 insertions(+), 300 deletions(-) create mode 100644 build/tizen/.cproject create mode 100644 build/tizen/.exportMap create mode 100644 build/tizen/.gitignore create mode 100644 build/tizen/.project create mode 100644 build/tizen/.tproject create mode 100644 cocos/audio/tizen/AudioEngine-tizen.cpp create mode 100644 cocos/audio/tizen/AudioEngine-tizen.h create mode 100644 cocos/audio/tizen/SimpleAudioEngineTizen.cpp create mode 100644 cocos/platform/tizen/CCApplication-tizen.cpp create mode 100644 cocos/platform/tizen/CCApplication-tizen.h create mode 100644 cocos/platform/tizen/CCCommon-tizen.cpp create mode 100644 cocos/platform/tizen/CCDevice-tizen.cpp create mode 100644 cocos/platform/tizen/CCFileUtils-tizen.cpp create mode 100644 cocos/platform/tizen/CCFileUtils-tizen.h create mode 100644 cocos/platform/tizen/CCGL-tizen.h create mode 100644 cocos/platform/tizen/CCGLViewImpl-tizen.cpp create mode 100644 cocos/platform/tizen/CCGLViewImpl-tizen.h create mode 100644 cocos/platform/tizen/CCPlatformDefine-tizen.h create mode 100644 cocos/platform/tizen/CCStdC-tizen.cpp create mode 100644 cocos/platform/tizen/CCStdC-tizen.h create mode 100644 cocos/scripting/lua-bindings/proj.tizen/.cproject create mode 100644 cocos/scripting/lua-bindings/proj.tizen/.gitignore create mode 100644 cocos/scripting/lua-bindings/proj.tizen/.project create mode 100644 cocos/scripting/lua-bindings/proj.tizen/.tproject create mode 100644 cocos/ui/UIEditBox/UIEditBoxImpl-tizen.cpp create mode 100644 cocos/ui/UIEditBox/UIEditBoxImpl-tizen.h create mode 100644 cocos/ui/UIVideoPlayer-tizen.cpp create mode 100644 cocos/ui/UIWebViewImpl-tizen.cpp create mode 100644 cocos/ui/UIWebViewImpl-tizen.h create mode 100644 templates/cpp-template-default/proj.tizen/.cproject create mode 100644 templates/cpp-template-default/proj.tizen/.exportMap create mode 100644 templates/cpp-template-default/proj.tizen/.gitignore create mode 100644 templates/cpp-template-default/proj.tizen/.project create mode 100644 templates/cpp-template-default/proj.tizen/.tproject create mode 100755 templates/cpp-template-default/proj.tizen/copy_resource.sh create mode 100644 templates/cpp-template-default/proj.tizen/res/.gitkeep create mode 100644 templates/cpp-template-default/proj.tizen/shared/res/HelloCpp.png create mode 100644 templates/cpp-template-default/proj.tizen/src/main.cpp create mode 100644 templates/cpp-template-default/proj.tizen/tizen-manifest.xml create mode 100644 templates/lua-template-default/frameworks/runtime-src/proj.tizen/.cproject create mode 100644 templates/lua-template-default/frameworks/runtime-src/proj.tizen/.exportMap create mode 100644 templates/lua-template-default/frameworks/runtime-src/proj.tizen/.gitignore create mode 100644 templates/lua-template-default/frameworks/runtime-src/proj.tizen/.project create mode 100644 templates/lua-template-default/frameworks/runtime-src/proj.tizen/.tproject create mode 100755 templates/lua-template-default/frameworks/runtime-src/proj.tizen/copy_resource.sh create mode 100644 templates/lua-template-default/frameworks/runtime-src/proj.tizen/res/.gitkeep create mode 100644 templates/lua-template-default/frameworks/runtime-src/proj.tizen/shared/res/HelloLua.png create mode 100644 templates/lua-template-default/frameworks/runtime-src/proj.tizen/src/main.cpp create mode 100644 templates/lua-template-default/frameworks/runtime-src/proj.tizen/tizen-manifest.xml create mode 100644 tests/cpp-empty-test/proj.tizen/.cproject create mode 100644 tests/cpp-empty-test/proj.tizen/.exportMap create mode 100644 tests/cpp-empty-test/proj.tizen/.gitignore create mode 100644 tests/cpp-empty-test/proj.tizen/.project create mode 100644 tests/cpp-empty-test/proj.tizen/.settings/org.eclipse.cdt.managedbuilder.core.prefs create mode 100644 tests/cpp-empty-test/proj.tizen/.tproject create mode 100755 tests/cpp-empty-test/proj.tizen/copy_resource.sh create mode 100644 tests/cpp-empty-test/proj.tizen/res/.gitkeep create mode 100644 tests/cpp-empty-test/proj.tizen/shared/res/cpp-empty-test.png create mode 100644 tests/cpp-empty-test/proj.tizen/src/main.cpp create mode 100644 tests/cpp-empty-test/proj.tizen/tizen-manifest.xml create mode 100644 tests/cpp-tests/proj.tizen/.cproject create mode 100644 tests/cpp-tests/proj.tizen/.exportMap create mode 100644 tests/cpp-tests/proj.tizen/.gitignore create mode 100644 tests/cpp-tests/proj.tizen/.project create mode 100644 tests/cpp-tests/proj.tizen/.tproject create mode 100755 tests/cpp-tests/proj.tizen/copy_resource.sh create mode 100644 tests/cpp-tests/proj.tizen/res/.gitkeep create mode 100644 tests/cpp-tests/proj.tizen/shared/res/cpp-tests.png create mode 100644 tests/cpp-tests/proj.tizen/src/main.cpp create mode 100644 tests/cpp-tests/proj.tizen/tizen-manifest.xml create mode 100644 tests/lua-empty-test/project/proj.tizen/.cproject create mode 100644 tests/lua-empty-test/project/proj.tizen/.exportMap create mode 100644 tests/lua-empty-test/project/proj.tizen/.gitignore create mode 100644 tests/lua-empty-test/project/proj.tizen/.project create mode 100644 tests/lua-empty-test/project/proj.tizen/.tproject create mode 100755 tests/lua-empty-test/project/proj.tizen/copy_resource.sh create mode 100644 tests/lua-empty-test/project/proj.tizen/res/.gitignore create mode 100644 tests/lua-empty-test/project/proj.tizen/res/.gitkeep create mode 100644 tests/lua-empty-test/project/proj.tizen/shared/res/lua-empty-test.png create mode 100644 tests/lua-empty-test/project/proj.tizen/src/main.cpp create mode 100644 tests/lua-empty-test/project/proj.tizen/tizen-manifest.xml create mode 100644 tests/lua-tests/project/proj.tizen/.cproject create mode 100644 tests/lua-tests/project/proj.tizen/.exportMap create mode 100644 tests/lua-tests/project/proj.tizen/.gitignore create mode 100644 tests/lua-tests/project/proj.tizen/.project create mode 100644 tests/lua-tests/project/proj.tizen/.settings/org.eclipse.cdt.managedbuilder.core.prefs create mode 100644 tests/lua-tests/project/proj.tizen/.tproject create mode 100755 tests/lua-tests/project/proj.tizen/copy_resource.sh create mode 100644 tests/lua-tests/project/proj.tizen/res/.gitignore create mode 100644 tests/lua-tests/project/proj.tizen/res/.gitkeep create mode 100644 tests/lua-tests/project/proj.tizen/shared/res/lua-tests.png create mode 100644 tests/lua-tests/project/proj.tizen/src/main.cpp create mode 100644 tests/lua-tests/project/proj.tizen/tizen-manifest.xml diff --git a/.gitignore b/.gitignore index 7a6440c66795..c307000df9d4 100644 --- a/.gitignore +++ b/.gitignore @@ -150,3 +150,7 @@ tests/cpp-tests/Resources/audio /*/*/*/prebuilt-mk/Android.mk /*/*/*/*/prebuilt-mk/Android.mk *.xcscmblueprint +tests/cpp-empty-test/proj.tizen/res/ +tests/cpp-tests/proj.tizen/res/ +tests/lua-empty-test/project/proj.tizen/res/ +tests/lua-tests/project/proj.tizen/res/ diff --git a/build/tizen/.cproject b/build/tizen/.cproject new file mode 100644 index 000000000000..a5aea8d190d3 --- /dev/null +++ b/build/tizen/.cproject @@ -0,0 +1,957 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/tizen/.exportMap b/build/tizen/.exportMap new file mode 100644 index 000000000000..43e310e053e2 --- /dev/null +++ b/build/tizen/.exportMap @@ -0,0 +1,4 @@ +{ + global: main; + local: *; +}; diff --git a/build/tizen/.gitignore b/build/tizen/.gitignore new file mode 100644 index 000000000000..6c2a09550904 --- /dev/null +++ b/build/tizen/.gitignore @@ -0,0 +1,3 @@ +/SA_Report +/Emulator +/res diff --git a/build/tizen/.project b/build/tizen/.project new file mode 100644 index 000000000000..3488b1a8ea0d --- /dev/null +++ b/build/tizen/.project @@ -0,0 +1,295 @@ + + + libcocos2dx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecore.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecore.apichecker.core.tizenCppNature + + + + cocos + 2 + PARENT-2-PROJECT_LOC/cocos + + + extensions + 2 + PARENT-2-PROJECT_LOC/extensions + + + external + 2 + PARENT-2-PROJECT_LOC/external + + + + + 1423558551456 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + 1423558551461 + + 22 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-Android.mk + + + + 1423558551465 + + 22 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-CMakeLists.txt + + + + 1423558551469 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*_props$ + + + + 1423558551473 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-libcocos2d_8_1 + + + + 1423558551477 + + 22 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*.props$ + + + + 1423558551482 + + 22 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*vcxproj.* + + + + 1423558551486 + + 22 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*\.def$ + + + + 1423558551490 + + 22 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*\.mm$ + + + + 1423558551494 + + 22 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*\.m$ + + + + 1423558551498 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-proj.win32 + + + + 1423558551503 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-proj.wp8 + + + + 1423558551508 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-^proj.win.* + + + + 1423558551513 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-android + + + + 1423558551518 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-apple + + + + 1423558551523 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-desktop + + + + 1423558551528 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-ios + + + + 1423558551533 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-linux + + + + 1423558551537 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-mac + + + + 1423558551542 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*win8.1.* + + + + 1423558551559 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*wp8.* + + + + 1423558551564 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*winrt.* + + + + 1423558551578 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-scripting + + + + 1423558551597 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-lua + + + + 1423558551615 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*win32.* + + + + 1423558551627 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-true-.*wp_8.* + + + + 1414416409298 + cocos/audio + 10 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-openal + + + + diff --git a/build/tizen/.tproject b/build/tizen/.tproject new file mode 100644 index 000000000000..824eaa1748c9 --- /dev/null +++ b/build/tizen/.tproject @@ -0,0 +1,12 @@ + + + + + mobile-2.4 + + + + + + + diff --git a/cocos/2d/CCAutoPolygon.cpp b/cocos/2d/CCAutoPolygon.cpp index aadbaf8e57c7..54bd0bc62a07 100644 --- a/cocos/2d/CCAutoPolygon.cpp +++ b/cocos/2d/CCAutoPolygon.cpp @@ -40,8 +40,8 @@ const static float PRECISION = 10.0f; PolygonInfo::PolygonInfo(const PolygonInfo& other): triangles(), -isVertsOwner(true), -rect() +rect(), +isVertsOwner(true) { filename = other.filename; isVertsOwner = true; diff --git a/cocos/2d/CCAutoPolygon.h b/cocos/2d/CCAutoPolygon.h index 45764aacba20..25cebe9303ad 100644 --- a/cocos/2d/CCAutoPolygon.h +++ b/cocos/2d/CCAutoPolygon.h @@ -55,9 +55,9 @@ class CC_DLL PolygonInfo * @return PolygonInfo object */ PolygonInfo(): - isVertsOwner(true), rect(cocos2d::Rect::ZERO), - filename("") + filename(""), + isVertsOwner(true) { triangles.verts = nullptr; triangles.indices = nullptr; diff --git a/cocos/audio/AudioEngine.cpp b/cocos/audio/AudioEngine.cpp index f638b535541f..0f822147befe 100644 --- a/cocos/audio/AudioEngine.cpp +++ b/cocos/audio/AudioEngine.cpp @@ -40,6 +40,8 @@ #include "audio/winrt/AudioEngine-winrt.h" #elif CC_TARGET_PLATFORM == CC_PLATFORM_LINUX #include "audio/linux/AudioEngine-linux.h" +#elif CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN +#include "audio/tizen/AudioEngine-tizen.h" #endif #define TIME_DELAY_PRECISION 0.0001 diff --git a/cocos/audio/tizen/AudioEngine-tizen.cpp b/cocos/audio/tizen/AudioEngine-tizen.cpp new file mode 100644 index 000000000000..43fe9b22d3cd --- /dev/null +++ b/cocos/audio/tizen/AudioEngine-tizen.cpp @@ -0,0 +1,402 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "audio/tizen/AudioEngine-tizen.h" + +// for native asset manager +#include +#include +#include +#include "audio/include/AudioEngine.h" +#include "base/CCDirector.h" +#include "base/CCScheduler.h" +#include "platform/CCFileUtils.h" + +#include + +class AudioEngineThreadPool +{ +public: + AudioEngineThreadPool() + : _running(true) { + _threads = std::thread(std::bind(&AudioEngineThreadPool::threadFunc, this)); + } + + ~AudioEngineThreadPool() + { + _running = false; + _sleepCondition.notify_one(); + _threads.join(); + } + + void addTask(const std::function &task) { + _tasks.push(task); + _sleepCondition.notify_one(); + } +private: + bool _running; + std::thread _threads; + std::queue< std::function > _tasks; + + void threadFunc(void) { + while (true) { + std::function task = nullptr; + + if (_tasks.empty()) + { + if (!_running) + { + break; + } + std::unique_lock lk(_sleepMutex); + _sleepCondition.wait(lk); + continue; + } + + task = _tasks.front(); + + task(); + + _tasks.pop(); + } + } + + std::mutex _sleepMutex; + std::condition_variable _sleepCondition; +}; + +static AudioEngineThreadPool* _threadPool = nullptr; + +using namespace cocos2d; +using namespace cocos2d::experimental; + +AudioPlayer::AudioPlayer() + : _playerHandle(nullptr) + , _finishCallback(nullptr) + , _initCallback(nullptr) + , _duration(0.0f) + , _playOver(false) + , _initSucceed(false) +{ +} + +static void _stopPlayer(player_h player) +{ + player_state_e state = PLAYER_STATE_NONE; + player_get_state(player, &state); + if (state == PLAYER_STATE_PLAYING || state == PLAYER_STATE_PAUSED) + { + player_stop(player); + } + player_unprepare(player); +} + +static void _pausePlayer(player_h player) +{ + player_state_e state; + player_get_state(player, &state); + + if(state == PLAYER_STATE_PLAYING) + { + player_pause(player); + } +} + +static void _resumePlayer(player_h player) +{ + player_state_e state; + player_get_state(player, &state); + + if(state != PLAYER_STATE_PLAYING) + { + player_start(player); + } +} + +AudioPlayer::~AudioPlayer() +{ + _taskMutex.lock(); + _threadPool->addTask(std::bind(_stopPlayer, _playerHandle)); + _threadPool->addTask(std::bind(player_destroy, _playerHandle)); + _taskMutex.unlock(); +} + +void AudioPlayer::stopPlayer() +{ + _playOver = true; +} + +static void completed_callback(void* user_data) +{ + AudioPlayer* player = (AudioPlayer*)user_data; + player->stopPlayer(); +} + +void AudioPlayer::init(const std::string& fileFullPath, float volume, bool loop) +{ + do + { + player_h player; + auto playerRet = player_create(&player); + if(playerRet != PLAYER_ERROR_NONE) + { + log("Fail to create player.Error code:%d",playerRet); + break; + } + + _playerHandle = player; + playerRet = player_set_uri(player, fileFullPath.c_str()); + if(playerRet != PLAYER_ERROR_NONE) + { + log("Fail to sets the data source for player.Error code:%d",playerRet); + break; + } + + player_set_volume(player, volume, volume); + player_set_completed_cb(player, completed_callback, this); + if (loop) + { + player_set_looping(player, true); + } + playerRet = player_prepare(player); + if(playerRet != PLAYER_ERROR_NONE){ + log("Fail to prepares the media player for playback.Error code:%d",playerRet); + break; + } + + playerRet = player_start(player); + if(playerRet != PLAYER_ERROR_NONE){ + log("Fail to starts playback.Error code:%d",playerRet); + break; + } + + _initSucceed = true; + } while (0); + + if (_initCallback) + { + _initCallback(); + } + _taskMutex.unlock(); +} + +//==================================================== +AudioEngineImpl::AudioEngineImpl() + : currentAudioID(0) + , _lazyInitLoop(true) +{ + +} + +AudioEngineImpl::~AudioEngineImpl() +{ + this->stopAll(); + + if (_threadPool) + { + delete _threadPool; + _threadPool = nullptr; + } + auto scheduler = Director::getInstance()->getScheduler(); + scheduler->unschedule(schedule_selector(AudioEngineImpl::update), this); +} + +bool AudioEngineImpl::init() +{ + sound_manager_set_session_type(SOUND_SESSION_TYPE_MEDIA); + sound_manager_set_media_session_option(SOUND_SESSION_OPTION_MIX_WITH_OTHERS_WHEN_START, + SOUND_SESSION_OPTION_INTERRUPTIBLE_DURING_PLAY); + sound_manager_set_media_session_resumption_option(SOUND_SESSION_OPTION_RESUMPTION_BY_SYSTEM_OR_MEDIA_PAUSED); + + if (!_threadPool) + { + _threadPool = new (std::nothrow) AudioEngineThreadPool(); + } + + return true; +} + +int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume) +{ + auto audioId = AudioEngine::INVALID_AUDIO_ID; + + do + { + audioId = currentAudioID++; + + auto& player = _audioPlayers[audioId]; + player._audioID = audioId; + player._initCallback = std::bind(&AudioEngineImpl::initPlayerCallback,this,&player,audioId); + + player._taskMutex.lock(); + _threadPool->addTask(std::bind(&AudioPlayer::init,&player,FileUtils::getInstance()->fullPathForFilename(filePath), volume, loop)); + + if (_lazyInitLoop) { + _lazyInitLoop = false; + + auto scheduler = Director::getInstance()->getScheduler(); + scheduler->schedule(schedule_selector(AudioEngineImpl::update), this, 0.03f, false); + } + } while (0); + + return audioId; +} + +void AudioEngineImpl::initPlayerCallback(AudioPlayer *player, int audioID) +{ + if (player->_initSucceed) + { + AudioEngine::_audioIDInfoMap[audioID].state = AudioEngine::AudioState::PLAYING; + } + else + { + _threadMutex.lock(); + _toRemoveAudioIDs.push_back(audioID); + _threadMutex.unlock(); + } +} + +void AudioEngineImpl::update(float dt) +{ + if (_threadMutex.try_lock()) { + int audioID; + size_t removeAudioCount = _toRemoveAudioIDs.size(); + for (size_t index = 0; index < removeAudioCount; ++index) { + audioID = _toRemoveAudioIDs[index]; + auto playerIt = _audioPlayers.find(audioID); + if (playerIt != _audioPlayers.end()) { + if(playerIt->second._finishCallback) { + auto& audioInfo = AudioEngine::_audioIDInfoMap[audioID]; + playerIt->second._finishCallback(audioID, *audioInfo.filePath); + } + _audioPlayers.erase(audioID); + AudioEngine::remove(audioID); + } + } + _threadMutex.unlock(); + } + + auto itend = _audioPlayers.end(); + for (auto iter = _audioPlayers.begin(); iter != itend; ++iter) + { + if(iter->second._playOver) + { + if (iter->second._finishCallback) + iter->second._finishCallback(iter->second._audioID, *AudioEngine::_audioIDInfoMap[iter->second._audioID].filePath); + + AudioEngine::remove(iter->second._audioID); + _audioPlayers.erase(iter); + break; + } + } + + if(_audioPlayers.empty()){ + _lazyInitLoop = true; + + auto scheduler = Director::getInstance()->getScheduler(); + scheduler->unschedule(schedule_selector(AudioEngineImpl::update), this); + } +} + +void AudioEngineImpl::setVolume(int audioID,float volume) +{ + auto& player = _audioPlayers[audioID]; + player_set_volume(player._playerHandle, volume, volume); +} + +void AudioEngineImpl::setLoop(int audioID, bool loop) +{ + auto& player = _audioPlayers[audioID]; + player_set_looping(player._playerHandle, loop); +} + +void AudioEngineImpl::pause(int audioID) +{ + auto& player = _audioPlayers[audioID]; + _threadPool->addTask(std::bind(_pausePlayer, player._playerHandle)); +} + +void AudioEngineImpl::resume(int audioID) +{ + auto& player = _audioPlayers[audioID]; + _threadPool->addTask(std::bind(_resumePlayer, player._playerHandle)); +} + +void AudioEngineImpl::stop(int audioID) +{ + _audioPlayers.erase(audioID); +} + +void AudioEngineImpl::stopAll() +{ + _audioPlayers.clear(); +} + +float AudioEngineImpl::getDuration(int audioID) +{ + int duration; + auto& player = _audioPlayers[audioID]; + auto ret = player_get_duration(player._playerHandle, &duration); + if(ret != PLAYER_ERROR_NONE) + { + log("Fail to get duration:%d",ret); + } + return duration / 1000.0f; +} + +float AudioEngineImpl::getCurrentTime(int audioID) +{ + int currPos; + auto& player = _audioPlayers[audioID]; + auto ret = player_get_play_position(player._playerHandle, &currPos); + if(ret != PLAYER_ERROR_NONE) + { + CCLOG("Fail to get position:%d",ret); + } + return currPos / 1000.0f; +} + +bool AudioEngineImpl::setCurrentTime(int audioID, float time) +{ + auto& player = _audioPlayers[audioID]; + int pos = 1000 * time; + player_set_play_position(player._playerHandle, pos, true, NULL, NULL); + + return true; +} + +void AudioEngineImpl::setFinishCallback(int audioID, const std::function &callback) +{ + _audioPlayers[audioID]._finishCallback = callback; +} + +void AudioEngineImpl::preload(const std::string& filePath, std::function callback) +{ + //TODO: implement preload on Tizen platform. +} + +#endif diff --git a/cocos/audio/tizen/AudioEngine-tizen.h b/cocos/audio/tizen/AudioEngine-tizen.h new file mode 100644 index 000000000000..9616fc60141b --- /dev/null +++ b/cocos/audio/tizen/AudioEngine-tizen.h @@ -0,0 +1,117 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#ifndef __AUDIO_ENGINE_TIZEN_H_ +#define __AUDIO_ENGINE_TIZEN_H_ + +#include +#include +#include +#include +#include + +#include "base/CCRef.h" +#include "base/ccUtils.h" + +#define MAX_AUDIOINSTANCES 8 + +#define ERRORLOG(msg) log("fun:%s,line:%d,msg:%s",__func__,__LINE__,#msg) + +NS_CC_BEGIN + namespace experimental{ +class AudioEngineImpl; + +class AudioPlayer +{ +public: + AudioPlayer(); + ~AudioPlayer(); + + void init(const std::string& fileFullPath, float volume, bool loop); + void stopPlayer(); + + player_h _playerHandle; + std::function _initCallback; + std::mutex _taskMutex; + +private: + bool _playOver; + float _duration; + int _audioID; + bool _initSucceed; + + std::function _finishCallback; + + friend class AudioEngineImpl; +}; + +class AudioEngineImpl : public cocos2d::Ref +{ +public: + AudioEngineImpl(); + ~AudioEngineImpl(); + + bool init(); + int play2d(const std::string &fileFullPath ,bool loop ,float volume); + void setVolume(int audioID,float volume); + void setLoop(int audioID, bool loop); + void pause(int audioID); + void resume(int audioID); + void stop(int audioID); + void stopAll(); + float getDuration(int audioID); + float getCurrentTime(int audioID); + bool setCurrentTime(int audioID, float time); + void setFinishCallback(int audioID, const std::function &callback); + + void uncache(const std::string& filePath){} + void uncacheAll(){} + + void update(float dt); + + void preload(const std::string& filePath, std::function callback); + +private: + void initPlayerCallback(AudioPlayer *player, int audioID); + + //audioID,AudioInfo + std::unordered_map _audioPlayers; + + std::mutex _threadMutex; + std::vector _toRemoveAudioIDs; + + int currentAudioID; + + bool _lazyInitLoop; +}; + + } +NS_CC_END + +#endif // __AUDIO_ENGINE_TIZEN_H_ + +#endif diff --git a/cocos/audio/tizen/SimpleAudioEngineTizen.cpp b/cocos/audio/tizen/SimpleAudioEngineTizen.cpp new file mode 100644 index 000000000000..8d28f8689297 --- /dev/null +++ b/cocos/audio/tizen/SimpleAudioEngineTizen.cpp @@ -0,0 +1,217 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "audio/include/SimpleAudioEngine.h" +#include "audio/include/AudioEngine.h" + +USING_NS_CC; +using namespace cocos2d::experimental; + +static float s_bgMusicVolume = 1.0f; +static float s_effectVolume = 1.0f; + +namespace CocosDenshion { + +SimpleAudioEngine::SimpleAudioEngine() { + +} + +SimpleAudioEngine::~SimpleAudioEngine() { +} + +SimpleAudioEngine* SimpleAudioEngine::getInstance() { + static SimpleAudioEngine s_SharedEngine; + return &s_SharedEngine; +} + +void SimpleAudioEngine::end() { + AudioEngine::end(); +} + +static int s_bgAudioID = AudioEngine::INVALID_AUDIO_ID; +static std::string bgMusicFilePath; +////////////////////////////////////////////////////////////////////////// +// BackgroundMusic +////////////////////////////////////////////////////////////////////////// + +void SimpleAudioEngine::playBackgroundMusic(const char* pszFilePath,bool bLoop) { + if (s_bgAudioID != AudioEngine::INVALID_AUDIO_ID) + { + AudioEngine::stop(s_bgAudioID); + s_bgAudioID = AudioEngine::INVALID_AUDIO_ID; + } + + if (pszFilePath) + { + bgMusicFilePath = pszFilePath; + s_bgAudioID = AudioEngine::play2d(pszFilePath,bLoop,s_bgMusicVolume); + } +} + +void SimpleAudioEngine::stopBackgroundMusic(bool bReleaseData) { + AudioEngine::stop(s_bgAudioID); +} + +void SimpleAudioEngine::pauseBackgroundMusic() { + AudioEngine::pause(s_bgAudioID); +} + +void SimpleAudioEngine::resumeBackgroundMusic() { + AudioEngine::resume(s_bgAudioID); +} + +void SimpleAudioEngine::rewindBackgroundMusic() { + AudioEngine::stop(s_bgAudioID); + if (!bgMusicFilePath.empty()) + { + s_bgAudioID = AudioEngine::play2d(bgMusicFilePath); + } +} + +bool SimpleAudioEngine::willPlayBackgroundMusic() { + return false; +} + +bool SimpleAudioEngine::isBackgroundMusicPlaying() { + auto state = AudioEngine::getState(s_bgAudioID); + if (state == AudioEngine::AudioState::PLAYING) + { + return true; + } + return false; +} + +void SimpleAudioEngine::preloadBackgroundMusic(const char* pszFilePath) { + bgMusicFilePath = pszFilePath; +} + +////////////////////////////////////////////////////////////////////////// +// effect function +////////////////////////////////////////////////////////////////////////// + +unsigned int SimpleAudioEngine::playEffect(const char* pszFilePath, bool bLoop, + float pitch, float pan, float gain) { + return AudioEngine::play2d(pszFilePath,bLoop,s_effectVolume); +} + +void SimpleAudioEngine::stopEffect(unsigned int nSoundId) { + AudioEngine::stop(nSoundId); +} + +void SimpleAudioEngine::preloadEffect(const char* pszFilePath) { + // FIXME: need implementation +} + +void SimpleAudioEngine::unloadEffect(const char* pszFilePath) { + AudioEngine::uncache(pszFilePath); +} + +void SimpleAudioEngine::pauseEffect(unsigned int uSoundId) { + AudioEngine::pause(uSoundId); +} + +void SimpleAudioEngine::pauseAllEffects() { + bool resumeBGMusic = false; + auto state = AudioEngine::getState(s_bgAudioID); + if (state == AudioEngine::AudioState::PLAYING) + { + resumeBGMusic = true; + } + AudioEngine::pauseAll(); + if (resumeBGMusic) + { + AudioEngine::resume(s_bgAudioID); + } +} + +void SimpleAudioEngine::resumeEffect(unsigned int uSoundId) { + AudioEngine::resume(uSoundId); +} + +void SimpleAudioEngine::resumeAllEffects() { + bool pauseBGMusic = false; + auto state = AudioEngine::getState(s_bgAudioID); + if (state == AudioEngine::AudioState::PAUSED) + { + pauseBGMusic = true; + } + AudioEngine::resumeAll(); + if (pauseBGMusic) + { + AudioEngine::pause(s_bgAudioID); + } +} + +void SimpleAudioEngine::stopAllEffects() { + //FIXME + AudioEngine::stopAll(); +} + + + +////////////////////////////////////////////////////////////////////////// +// volume interface +////////////////////////////////////////////////////////////////////////// + +float SimpleAudioEngine::getBackgroundMusicVolume() { + return s_bgMusicVolume; +} + +void SimpleAudioEngine::setBackgroundMusicVolume(float volume) { + if (volume > 1.0f) + { + volume = 1.0f; + } + else if(volume < 0.0f) + { + volume = 0.0f; + } + s_bgMusicVolume = volume; + AudioEngine::setVolume(s_bgAudioID, s_bgMusicVolume); +} + +float SimpleAudioEngine::getEffectsVolume() { + return s_effectVolume; +} + +void SimpleAudioEngine::setEffectsVolume(float volume) { + if (volume > 1.0f) + { + volume = 1.0f; + } + else if(volume < 0.0f) + { + volume = 0.0f; + } + s_effectVolume = volume; + //FIXME +} + + +} // end of namespace CocosDenshion + +#endif diff --git a/cocos/base/allocator/CCAllocatorMutex.h b/cocos/base/allocator/CCAllocatorMutex.h index 48e52ce1a486..026aca94752f 100644 --- a/cocos/base/allocator/CCAllocatorMutex.h +++ b/cocos/base/allocator/CCAllocatorMutex.h @@ -29,7 +29,7 @@ #include "platform/CCPlatformMacros.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX #include "pthread.h" #define MUTEX pthread_mutex_t #define MUTEX_INIT(m) \ diff --git a/cocos/cocos2d.h b/cocos/cocos2d.h index 576ced2ad60c..86e664bd14f5 100644 --- a/cocos/cocos2d.h +++ b/cocos/cocos2d.h @@ -249,6 +249,13 @@ THE SOFTWARE. #include "platform/winrt/CCStdC.h" #endif // CC_TARGET_PLATFORM == CC_PLATFORM_WINRT +#if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) + #include "platform/tizen/CCApplication-tizen.h" + #include "platform/tizen/CCGLViewImpl-tizen.h" + #include "platform/tizen/CCGL-tizen.h" + #include "platform/tizen/CCStdC-tizen.h" +#endif + // script_support #include "base/CCScriptSupport.h" diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index f5ca3f3ae437..dfb1c4d85042 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -42,6 +42,11 @@ THE SOFTWARE. #include "editor-support/cocostudio/CocoLoader.h" #include "tinyxml2.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" +#include "base/CCDirector.h" +#include "base/ccUtils.h" + using namespace cocos2d; using namespace cocos2d::ui; diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.h b/cocos/editor-support/cocostudio/CCSGUIReader.h index 22defb349e3c..f78458cc1772 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.h +++ b/cocos/editor-support/cocostudio/CCSGUIReader.h @@ -30,6 +30,7 @@ THE SOFTWARE. #include "editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h" #include "base/ObjectFactory.h" #include "editor-support/cocostudio/CocosStudioExport.h" +#include "base/CCValue.h" namespace protocolbuffers { diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index e2c02f2cbc68..0149fea626f7 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -10,6 +10,9 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" +#include "2d/CCLabel.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index 1e3ef68696ef..b9005131c33a 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -9,6 +9,8 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp index 7e5fbcd30eb5..b7827dc5ffc0 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.cpp @@ -9,6 +9,8 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp index 01139eebd762..a7c1da8e0510 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.cpp @@ -12,6 +12,9 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "base/CCDirector.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp index 9184fbfee9fe..216e45a1b8ce 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp @@ -9,6 +9,8 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp index 50ef988a9ff7..826d8a8e0a6f 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.cpp @@ -9,6 +9,8 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp index c29c6f9dafcd..cc0e6fc6699e 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.cpp @@ -10,6 +10,8 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp index 47441c67aecc..dda6fa07b107 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.cpp @@ -9,6 +9,8 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp index 91acde79eeb7..c135dd5978a8 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp @@ -9,6 +9,8 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" +#include "2d/CCSpriteFrameCache.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp index 6a40f306ad59..644c0fbcb4d4 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.cpp @@ -9,6 +9,7 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp index 378308a5184e..cd9c57204d00 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.cpp @@ -10,6 +10,7 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp index f8900f8ee1a0..00ff390b6527 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp @@ -9,6 +9,7 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp index a98be26f7b12..563bac858464 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextReader/TextReader.cpp @@ -9,6 +9,7 @@ #include "tinyxml2.h" #include "flatbuffers/flatbuffers.h" +#include "platform/CCFileUtils.h" USING_NS_CC; using namespace ui; diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h b/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h index 0cf625f32a39..2fa255b02ab3 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReaderProtocol.h @@ -25,7 +25,7 @@ #ifndef __TestCpp__WidgetReaderProtocol__ #define __TestCpp__WidgetReaderProtocol__ -#include "cocos2d.h" + #include "editor-support/cocostudio/DictionaryHelper.h" #include "editor-support/cocostudio/CocosStudioExport.h" diff --git a/cocos/platform/CCApplication.h b/cocos/platform/CCApplication.h index 27e3d499c0bb..21aa673d99f4 100644 --- a/cocos/platform/CCApplication.h +++ b/cocos/platform/CCApplication.h @@ -41,6 +41,8 @@ THE SOFTWARE. #include "platform/winrt/CCApplication.h" #elif CC_TARGET_PLATFORM == CC_PLATFORM_LINUX #include "platform/linux/CCApplication-linux.h" +#elif CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN +#include "platform/tizen/CCApplication-tizen.h" #endif /// @endcond diff --git a/cocos/platform/CCGL.h b/cocos/platform/CCGL.h index 9c754d265902..a5ba7cfb2688 100644 --- a/cocos/platform/CCGL.h +++ b/cocos/platform/CCGL.h @@ -41,6 +41,8 @@ THE SOFTWARE. #include "platform/winrt/CCGL.h" #elif CC_TARGET_PLATFORM == CC_PLATFORM_LINUX #include "platform/linux/CCGL-linux.h" +#elif CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN +#include "platform/tizen/CCGL-tizen.h" #endif /// @endcond diff --git a/cocos/platform/CCImage.cpp b/cocos/platform/CCImage.cpp index a27685b49d7f..675157db7c8b 100644 --- a/cocos/platform/CCImage.cpp +++ b/cocos/platform/CCImage.cpp @@ -1025,7 +1025,7 @@ bool Image::initWithPngData(const unsigned char * data, ssize_t dataLen) info_ptr = png_create_info_struct(png_ptr); CC_BREAK_IF(!info_ptr); -#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA && CC_TARGET_PLATFORM != CC_PLATFORM_NACL) +#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA && CC_TARGET_PLATFORM != CC_PLATFORM_NACL && CC_TARGET_PLATFORM != CC_PLATFORM_TIZEN) CC_BREAK_IF(setjmp(png_jmpbuf(png_ptr))); #endif @@ -2241,7 +2241,7 @@ bool Image::saveImageToPNG(const std::string& filePath, bool isToRGB) png_destroy_write_struct(&png_ptr, nullptr); break; } -#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA && CC_TARGET_PLATFORM != CC_PLATFORM_NACL) +#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA && CC_TARGET_PLATFORM != CC_PLATFORM_NACL && CC_TARGET_PLATFORM != CC_PLATFORM_TIZEN) if (setjmp(png_jmpbuf(png_ptr))) { fclose(fp); diff --git a/cocos/platform/CCPlatformDefine.h b/cocos/platform/CCPlatformDefine.h index 786714eb0c8d..1f6fbec0f690 100644 --- a/cocos/platform/CCPlatformDefine.h +++ b/cocos/platform/CCPlatformDefine.h @@ -41,6 +41,8 @@ THE SOFTWARE. #include "platform/winrt/CCPlatformDefine-winrt.h" #elif CC_TARGET_PLATFORM == CC_PLATFORM_LINUX #include "platform/linux/CCPlatformDefine-linux.h" +#elif CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN +#include "platform/tizen/CCPlatformDefine-tizen.h" #endif /// @endcond diff --git a/cocos/platform/CCStdC.h b/cocos/platform/CCStdC.h index f22fddff4b80..69ce64ad61ac 100644 --- a/cocos/platform/CCStdC.h +++ b/cocos/platform/CCStdC.h @@ -40,6 +40,8 @@ THE SOFTWARE. #include "platform/winrt/CCStdC.h" #elif CC_TARGET_PLATFORM == CC_PLATFORM_LINUX #include "platform/linux/CCStdC-linux.h" +#elif CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN +#include "platform/tizen/CCStdC-tizen.h" #endif #endif /* __PLATFORM_CCSTDC_H__*/ diff --git a/cocos/platform/tizen/CCApplication-tizen.cpp b/cocos/platform/tizen/CCApplication-tizen.cpp new file mode 100644 index 000000000000..bdda5bcb6b48 --- /dev/null +++ b/cocos/platform/tizen/CCApplication-tizen.cpp @@ -0,0 +1,663 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "platform/tizen/CCApplication-tizen.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "platform/tizen/CCGLViewImpl-tizen.h" +#include "base/CCDirector.h" +#include "base/CCEventKeyboard.h" +#include "base/CCEventDispatcher.h" +#include "platform/CCFileUtils.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "cocos2d-x" + +ELEMENTARY_GLVIEW_GLOBAL_DEFINE(); + +NS_CC_BEGIN + +void stopAccelerometerSensor(); +void pauseAccelerometerSensor(); +void resumeAccelerometerSensor(); + +static void win_back_cb(void *data, Evas_Object *obj, void *event_info) { + //Application *ad = (Application *)data; + /* Let window go to hidden state. */ + //elm_win_lower(ad->_win); + // cocos2d::EventKeyboard event(cocos2d::EventKeyboard::KeyCode::KEY_ESCAPE, false); + // cocos2d::Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); + stopAccelerometerSensor(); + Director::getInstance()->end(); +} + +static void win_more_cb(void *data, Evas_Object *obj, void *event_info) { + cocos2d::EventKeyboard event(cocos2d::EventKeyboard::KeyCode::KEY_MENU, false); + cocos2d::Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); +} + +static void makeCurrent(void) +{ + Application* app = Application::getInstance(); + evas_gl_make_current(app->_evasGL, app->_sfc, app->_ctx); +} + +static void draw_gl(Evas_Object *obj) +{ + auto director = Director::getInstance(); + auto glview = director->getOpenGLView(); + + director->mainLoop(); + glview->pollEvents(); +} + +static void del_gl(Evas_Object *obj) { + +} + +// sharedApplication pointer +Application* Application::__instance = nullptr; + +Application::Application() +: _win(nullptr) +, _conform(nullptr) +, _animationInterval(1.0f/60.0f*1000.0f) +{ + _orientation = APP_DEVICE_ORIENTATION_0; + CC_ASSERT(! __instance); + __instance = this; +} + +Application::~Application() +{ + CC_ASSERT(this == __instance); + __instance = nullptr; +} + +static void del_anim(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + Ecore_Animator *ani = (Ecore_Animator *)evas_object_data_get(obj, "ani"); + ecore_animator_del(ani); +} + +static Eina_Bool anim(void *data) { + elm_glview_changed_set((Evas_Object*)data); + return EINA_TRUE; +} + +static void init_gl(Evas_Object *obj) { + Application *ad = Application::getInstance(); + + //save current ctx + ad->_evasGL = elm_glview_evas_gl_get(obj); + ad->_ctx = evas_gl_current_context_get(ad->_evasGL); + ad->_sfc = evas_gl_current_surface_get(ad->_evasGL); + + auto director = Director::getInstance(); + auto glview = director->getOpenGLView(); + if (glview == nullptr) { + glview = GLViewImpl::create("Cocos2dxTizen"); + + int w, h; + elm_glview_size_get(obj, &w, &h); + glview->setFrameSize(w, h); + director->setOpenGLView(glview); + } + + ad->initGLContextAttrs(); + // Initialize instance and cocos2d. + if (! ad->applicationDidFinishLaunching()) + { + return; + } +} + +static void create_indicator(Application *ad) { + elm_win_conformant_set(ad->_win, EINA_TRUE); + + elm_win_indicator_mode_set(ad->_win, ELM_WIN_INDICATOR_HIDE); + + ad->_conform = elm_conformant_add(ad->_win); + evas_object_size_hint_weight_set(ad->_conform, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_win_resize_object_add(ad->_win, ad->_conform); + evas_object_show(ad->_conform); +} + +static Evas_Object* add_win(const char *name) { + Evas_Object *win; + + win = elm_win_util_standard_add(name, "tizen"); + + if (!win) + return nullptr; + //fix openURL tests not goes to another program issue + // elm_win_fullscreen_set(win, EINA_TRUE); + evas_object_show(win); + + return win; +} + +//touch call back +static void touches_down_cb(void *data, Evas *e , Evas_Object *obj , void *event_info) +{ + auto ev = (Evas_Event_Multi_Down *)event_info; + int id = ev->device; + float x = ev->canvas.x; + float y = ev->canvas.y; + + makeCurrent(); + cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesBegin(1, &id, &x, &y); +} + +static void touches_move_cb(void *data, Evas *e , Evas_Object *obj , void *event_info) +{ + auto ev = (Evas_Event_Multi_Move *)event_info; + int id = ev->device; + float x = ev->cur.canvas.x; + float y = ev->cur.canvas.y; + + makeCurrent(); + cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesMove(1, &id, &x, &y); +} + +static void touches_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info) +{ + auto ev = (Evas_Event_Multi_Up *)event_info; + int id = ev->device; + float x = ev->canvas.x; + float y = ev->canvas.y; + + makeCurrent(); + cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesEnd(1, &id, &x, &y); +} + +static void touch_down_cb(void *data, Evas *e , Evas_Object *obj , void *event_info) +{ + auto ev = (Evas_Event_Mouse_Down *)event_info; + int id = ev->button; + float x = ev->canvas.x; + float y = ev->canvas.y; + + makeCurrent(); + cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesBegin(1, &id, &x, &y); +} + +static void touch_move_cb(void *data, Evas *e , Evas_Object *obj , void *event_info) +{ + auto ev = (Evas_Event_Mouse_Move *)event_info; + int id = ev->buttons; + float x = ev->cur.canvas.x; + float y = ev->cur.canvas.y; + + makeCurrent(); + cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesMove(1, &id, &x, &y); +} + +static void touch_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info) +{ + auto ev = (Evas_Event_Mouse_Up *)event_info; + int id = ev->button; + float x = ev->canvas.x; + float y = ev->canvas.y; + + makeCurrent(); + cocos2d::Director::getInstance()->getOpenGLView()->handleTouchesEnd(1, &id, &x, &y); +} + +static void get_glview_mode(GLContextAttrs &attrs, char* gl_mode) +{ + strcat(gl_mode, "opengl"); + + if (attrs.alphaBits > 0) + { + strcat(gl_mode, ":alpha"); + } + + if (attrs.depthBits > 0) + { + strcat(gl_mode, ":depth"); + if (attrs.depthBits <= 8) + { + strcat(gl_mode, "8"); + } + else if (attrs.depthBits <= 16) + { + strcat(gl_mode, "16"); + } + else if (attrs.depthBits <= 24) + { + strcat(gl_mode, "24"); + } + else + { + strcat(gl_mode, "32"); + } + } + + if (attrs.stencilBits > 0) + { + strcat(gl_mode, ":stencil"); + if (attrs.stencilBits == 1) + { + strcat(gl_mode, "1"); + } + else if (attrs.stencilBits == 2) + { + strcat(gl_mode, "2"); + } + else if (attrs.stencilBits <= 4) + { + strcat(gl_mode, "4"); + } + else if (attrs.stencilBits <= 8) + { + strcat(gl_mode, "8"); + } + else + { + strcat(gl_mode, "16"); + } + } + + strcat(gl_mode, "\0"); +} + +static bool app_create(void *data) { + /* Hook to take necessary actions before main event loop starts + * Initialize UI resources and application's data + * If this function returns true, the main loop of application starts + * If this function returns false, the application is terminated. */ + + Evas_Object *bx, *gl; + Ecore_Animator *ani; + Application *ad = (Application *)data; + + if (!data) + return false; + + /* Create and initialize GLView */ + ad->initGLContextAttrs(); + GLContextAttrs attrs = GLView::getGLContextAttrs(); + char gl_mode[100] = ""; + get_glview_mode(attrs, gl_mode); + elm_config_accel_preference_set("opengl");//(gl_mode); + /* Create the window */ + ad->_win = add_win("cocos2d-x"); + + if (!ad->_win) + return false; + + int rots[2]; + rots[0] = ad->_orientation; + rots[1] = rots[0] + 180 % 360; + elm_win_wm_rotation_available_rotations_set(ad->_win, rots, 2); + + eext_object_event_callback_add(ad->_win, EEXT_CALLBACK_BACK, win_back_cb, ad); + eext_object_event_callback_add(ad->_win, EEXT_CALLBACK_MORE, win_more_cb, ad); + + /* Add a box to contain our GLView */ + bx = elm_box_add(ad->_win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(ad->_win, bx); + evas_object_show(bx); + + gl = elm_glview_add(ad->_win); + ELEMENTARY_GLVIEW_GLOBAL_USE(gl); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + /* Request a surface with alpha and a depth buffer */ + Elm_GLView_Mode mode = (Elm_GLView_Mode)(ELM_GLVIEW_DIRECT | ELM_GLVIEW_DEPTH | ELM_GLVIEW_STENCIL); + elm_glview_mode_set(gl, mode); + + /* The resize policy tells GLView what to do with the surface when it + * resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE will tell it to + * destroy the current surface and recreate it to the new size. + */ + //elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); + + /* The render policy sets how GLView should render GL code. + * ELM_GLVIEW_RENDER_POLICY_ON_DEMAND will have the GL callback + * called only when the object is visible. + * ELM_GLVIEW_RENDER_POLICY_ALWAYS would cause the callback to be + * called even if the object were hidden. + */ + elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); + + /* The initialize callback function gets registered here */ + elm_glview_init_func_set(gl, init_gl); + + /* The delete callback function gets registered here */ + elm_glview_del_func_set(gl, del_gl); + + /* The resize callback function gets registered here */ + // Cocos2d-x doesn't support to change orientation from portrait to landscape. + // So comment next line. +// elm_glview_resize_func_set(gl, resize_gl); + + /* The render callback function gets registered here */ + elm_glview_render_func_set(gl, draw_gl); + + /* Add the GLView to the box and show it */ + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + elm_object_focus_set(gl, EINA_TRUE); + + /* This adds an animator so that the app will regularly + * trigger updates of the GLView using elm_glview_changed_set(). + * + * NOTE: If you delete GL, this animator will keep running trying to access + * GL so this animator needs to be deleted with ecore_animator_del(). + */ + ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER); + ani = ecore_animator_add(anim, gl); + evas_object_data_set(gl, "ani", ani); + //evas_object_data_set(gl, "ad", ad); + evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, del_anim, gl); + + /* Add Mouse Event Callbacks */ + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, touch_down_cb, ad); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_MOVE, touch_move_cb, ad); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_UP, touch_up_cb, ad); + + evas_object_event_callback_add(gl, EVAS_CALLBACK_MULTI_DOWN, touches_down_cb, ad); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MULTI_MOVE, touches_move_cb, ad); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MULTI_UP, touches_up_cb, ad); + + evas_object_show(ad->_win); + + create_indicator(ad); + + return true; +} + +static void app_pause(void *data) +{ + /* Take necessary actions when application becomes invisible. */ + if(!data) + { + return; + } + pauseAccelerometerSensor(); + + Application* app = ((Application *)data); + app->applicationDidEnterBackground(); +} + +static void app_resume(void *data) +{ + /* Take necessary actions when application becomes visible. */ + if(!data) + { + return; + } + + Application* app = ((Application *)data); + app->applicationWillEnterForeground(); + resumeAccelerometerSensor(); +} + +static void app_terminate(void *data) +{ + /* Release all resources. */ + if(!data) + { + return; + } + stopAccelerometerSensor(); + Director::getInstance()->end(); + // Application* app = ((Application *)data); + // delete app; +} + +static void app_control(app_control_h app_control, void *data) +{ + /* Handle the launch request. */ +} + +int Application::run() +{ + ui_app_lifecycle_callback_s event_callback = {0,}; + //app_event_handler_h handlers[5] = {NULL, }; + + event_callback.create = app_create; + event_callback.terminate = app_terminate; + event_callback.pause = app_pause; + event_callback.resume = app_resume; + event_callback.app_control = app_control; + +/* ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad); + ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]); +*/ + int ret = ui_app_main(_argc, _argv, &event_callback, this); + if (ret != APP_ERROR_NONE) { + dlog_print(DLOG_ERROR, LOG_TAG, "The application failed to start, and returned %d", ret); + } + + return ret; +} + +void Application::setAnimationInterval(float interval) +{ + _animationInterval = interval*1000.0f; + ecore_animator_frametime_set(interval); +} + +void Application::setResourceRootPath(const std::string& rootResDir) +{ + _resourceRootPath = rootResDir; + if (_resourceRootPath[_resourceRootPath.length() - 1] != '/') + { + _resourceRootPath += '/'; + } + FileUtils* pFileUtils = FileUtils::getInstance(); + std::vector searchPaths = pFileUtils->getSearchPaths(); + searchPaths.insert(searchPaths.begin(), _resourceRootPath); + pFileUtils->setSearchPaths(searchPaths); +} + +const std::string& Application::getResourceRootPath(void) +{ + return _resourceRootPath; +} + +Application::Platform Application::getTargetPlatform() +{ + return Platform::OS_TIZEN; +} + +void Application::setDeviceOrientation(int orientation) +{ + _orientation = orientation; +} + +void Application::setMainArgs(int argc, char **argv) +{ + _argc = argc; + _argv = argv; +} +bool Application::openURL(const std::string &url) +{ + bool flag = false; + if(0==url.length()) + { + return flag; + } + app_control_h app_control; + + app_control_create(&app_control); + app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW); + app_control_set_uri(app_control, url.c_str()); + + int ctrlError; + if ((ctrlError=app_control_send_launch_request(app_control, NULL, NULL)) == APP_CONTROL_ERROR_NONE) + { + flag = true; + } + else + { + dlog_print(DLOG_ERROR, LOG_TAG, "open url failed, and returned %d", ctrlError); + } + + app_control_destroy(app_control); + return flag; +} + +////////////////////////////////////////////////////////////////////////// +// static member function +////////////////////////////////////////////////////////////////////////// +Application* Application::getInstance() +{ + CC_ASSERT(__instance); + return __instance; +} + +// @deprecated Use getInstance() instead +Application* Application::sharedApplication() +{ + return Application::getInstance(); +} + +const char * Application::getCurrentLanguageCode() +{ + static char code[3]={0}; + char *pLanguageName = getenv("LANG"); + if (!pLanguageName) + return "en"; + strtok(pLanguageName, "_"); + if (!pLanguageName) + return "en"; + strncpy(code,pLanguageName,2); + code[2]='\0'; + return code; +} + +std::string Application::getVersion() +{ + //TODO + return ""; +} + +LanguageType Application::getCurrentLanguage() +{ + char *pLanguageName = getenv("LANG"); + LanguageType ret = LanguageType::ENGLISH; + if (!pLanguageName) + { + return LanguageType::ENGLISH; + } + strtok(pLanguageName, "_"); + if (!pLanguageName) + { + return LanguageType::ENGLISH; + } + + if (0 == strcmp("zh", pLanguageName)) + { + ret = LanguageType::CHINESE; + } + else if (0 == strcmp("en", pLanguageName)) + { + ret = LanguageType::ENGLISH; + } + else if (0 == strcmp("fr", pLanguageName)) + { + ret = LanguageType::FRENCH; + } + else if (0 == strcmp("it", pLanguageName)) + { + ret = LanguageType::ITALIAN; + } + else if (0 == strcmp("de", pLanguageName)) + { + ret = LanguageType::GERMAN; + } + else if (0 == strcmp("es", pLanguageName)) + { + ret = LanguageType::SPANISH; + } + else if (0 == strcmp("nl", pLanguageName)) + { + ret = LanguageType::DUTCH; + } + else if (0 == strcmp("ru", pLanguageName)) + { + ret = LanguageType::RUSSIAN; + } + else if (0 == strcmp("ko", pLanguageName)) + { + ret = LanguageType::KOREAN; + } + else if (0 == strcmp("ja", pLanguageName)) + { + ret = LanguageType::JAPANESE; + } + else if (0 == strcmp("hu", pLanguageName)) + { + ret = LanguageType::HUNGARIAN; + } + else if (0 == strcmp("pt", pLanguageName)) + { + ret = LanguageType::PORTUGUESE; + } + else if (0 == strcmp("ar", pLanguageName)) + { + ret = LanguageType::ARABIC; + } + else if (0 == strcmp("nb", pLanguageName)) + { + ret = LanguageType::NORWEGIAN; + } + else if (0 == strcmp("pl", pLanguageName)) + { + ret = LanguageType::POLISH; + } + + return ret; +} + +NS_CC_END + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + diff --git a/cocos/platform/tizen/CCApplication-tizen.h b/cocos/platform/tizen/CCApplication-tizen.h new file mode 100644 index 000000000000..6fead5c1267f --- /dev/null +++ b/cocos/platform/tizen/CCApplication-tizen.h @@ -0,0 +1,142 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#ifndef CCAPLICATION_TIZEN_H_ +#define CCAPLICATION_TIZEN_H_ + +#include "platform/CCCommon.h" +#include "platform/CCApplicationProtocol.h" +#include + +#include +#include +#include +#include + +#include + +struct _Evas_GL; +struct _Evas_GL_Context; +struct _Evas_GL_Surface; + +NS_CC_BEGIN +class Rect; + +class Application : public ApplicationProtocol +{ +public: + /** + * @js ctor + */ + Application(); + /** + * @js NA + * @lua NA + */ + virtual ~Application(); + + /** + @brief Callback by Director for limit FPS. + @param interval The time, which expressed in second in second, between current frame and next. + */ + void setAnimationInterval(float interval) override; + + /** + @brief Run the message loop. + */ + int run(); + + /** + @brief Get current applicaiton instance. + @return Current application instance pointer. + */ + static Application* getInstance(); + + /** @deprecated Use getInstance() instead */ + CC_DEPRECATED_ATTRIBUTE static Application* sharedApplication(); + + /* override functions */ + virtual LanguageType getCurrentLanguage() override; + + std::string getVersion() override; + + /** + @brief Get current language iso 639-1 code + @return Current language iso 639-1 code + */ + virtual const char * getCurrentLanguageCode() override; + + /** + @brief Open url in default browser + @param String with url to open. + @return true if the resource located by the URL was successfully opened; otherwise false. + */ + virtual bool openURL(const std::string &url) override; + + /** + * Sets the Resource root path. + * @deprecated Please use FileUtils::getInstance()->setSearchPaths() instead. + */ + CC_DEPRECATED_ATTRIBUTE void setResourceRootPath(const std::string& rootResDir); + + /** + * Gets the Resource root path. + * @deprecated Please use FileUtils::getInstance()->getSearchPaths() instead. + */ + CC_DEPRECATED_ATTRIBUTE const std::string& getResourceRootPath(void); + + /** + @brief Get target platform + */ + virtual Platform getTargetPlatform() override; + + void setDeviceOrientation(int orientation); + void setMainArgs(int argc, char **argv); + +public: + Evas_Object * _win; + Evas_Object * _conform; + + _Evas_GL * _evasGL; + _Evas_GL_Context * _ctx; + _Evas_GL_Surface * _sfc; + + int _orientation; + int _argc; + char **_argv; +protected: + long _animationInterval; //micro second + std::string _resourceRootPath; + + static Application * __instance; +}; + +NS_CC_END + +#endif // CCAPLICATION_TIZEN_H_ + +#endif /* CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN */ diff --git a/cocos/platform/tizen/CCCommon-tizen.cpp b/cocos/platform/tizen/CCCommon-tizen.cpp new file mode 100644 index 000000000000..049af4c1b871 --- /dev/null +++ b/cocos/platform/tizen/CCCommon-tizen.cpp @@ -0,0 +1,46 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "platform/CCCommon.h" +#include "platform/tizen/CCStdC-tizen.h" +#include "base/CCConsole.h" + +NS_CC_BEGIN + +void MessageBox(const char * msg, const char * title) +{ + log("%s: %s", title, msg); +} + +void LuaLog(const char * format) +{ + puts(format); +} + +NS_CC_END + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN diff --git a/cocos/platform/tizen/CCDevice-tizen.cpp b/cocos/platform/tizen/CCDevice-tizen.cpp new file mode 100644 index 000000000000..7673ee2bd85b --- /dev/null +++ b/cocos/platform/tizen/CCDevice-tizen.cpp @@ -0,0 +1,358 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "platform/CCDevice.h" + +#include +#include +#include +#include +#include +#include + +#include "base/CCEventDispatcher.h" +#include "base/CCEventAcceleration.h" +#include "base/CCDirector.h" +#include "platform/CCFileUtils.h" +#include "platform/tizen/CCApplication-tizen.h" + +using namespace std; +NS_CC_BEGIN + +static sensor_h s_sensorHandle = nullptr; +static sensor_listener_h s_sensorListener = nullptr; +static float s_sensorInterval = 30.0f; + +#define GRAVITY_EARTH 9.80665f + +static bool checkAccelerometerValues(sensor_event_s *sensor_data) +{ + for(int i = 0; i < sensor_data->value_count; ++i) + { + float value = sensor_data->values[i]; + + if(isnan(value))//or other limitations + { + return false; + } + } + return true; +} + +static void accelerometer_sensor_cb(sensor_h _sensor, sensor_event_s *sensor_data, void *user_data) +{ + if(!checkAccelerometerValues(sensor_data)) + { + CCLOG("sensor value is invalid!!"); + return; + } + if(3 != sensor_data->value_count) + { + return; + } + Acceleration *_acceleration = new Acceleration(); + _acceleration->x = sensor_data->values[0] / GRAVITY_EARTH; + _acceleration->y = sensor_data->values[1] / GRAVITY_EARTH; + _acceleration->z = sensor_data->values[2] / GRAVITY_EARTH; + _acceleration->timestamp = sensor_data->timestamp; + + double tmp = _acceleration->x; + Application *app = Application::getInstance(); + int oritentation = elm_win_rotation_get(app->_win); + + switch (oritentation) + { + case 0: + _acceleration->x = _acceleration->y; + _acceleration->y = tmp; + break; + + case 90: + _acceleration->x = -_acceleration->y; + _acceleration->y = tmp; + break; + + case 180: + _acceleration->x = -_acceleration->y; + _acceleration->y = -tmp; + break; + + case 270: + _acceleration->x = _acceleration->y; + _acceleration->y = -tmp; + break; + default: + CCLOG("unknow orientation"); + } + + cocos2d::EventAcceleration event(*_acceleration); + auto dispatcher = cocos2d::Director::getInstance()->getEventDispatcher(); + dispatcher->dispatchEvent(&event); +} + +void stopAccelerometerSensor() +{ + if (s_sensorListener) + { + sensor_listener_stop(s_sensorListener); + sensor_destroy_listener(s_sensorListener); + s_sensorListener = nullptr; + s_sensorHandle = nullptr; + } +} + +void startAccelerometerSensor() +{ + if (!s_sensorListener) + { + sensor_get_default_sensor(SENSOR_ACCELEROMETER, &s_sensorHandle); + auto err = sensor_create_listener(s_sensorHandle, &s_sensorListener); + if(SENSOR_ERROR_NONE != err) + { + CCLOG("create sensor failed!"); + } + sensor_listener_set_event_cb(s_sensorListener, s_sensorInterval, accelerometer_sensor_cb, NULL); + sensor_listener_start(s_sensorListener); + } +} + +static bool s_resumeAccelerometerSensor = false; + +void pauseAccelerometerSensor() +{ + if (s_sensorListener) + { + s_resumeAccelerometerSensor = true; + stopAccelerometerSensor(); + } + else + { + s_resumeAccelerometerSensor = false; + } +} + +void resumeAccelerometerSensor() +{ + if (s_resumeAccelerometerSensor) + { + startAccelerometerSensor(); + } +} + +void Device::setAccelerometerEnabled(bool isEnabled) +{ + if(isEnabled) + { + startAccelerometerSensor(); + } + else + { + stopAccelerometerSensor(); + } +} + +void Device::setAccelerometerInterval(float interval) +{ + s_sensorInterval = interval; + if(s_sensorListener) + { + sensor_listener_set_interval(s_sensorListener, s_sensorInterval); + } +} + +int Device::getDPI() +{ + static int dpi = -1; + if (dpi == -1) + { + auto ret = system_info_get_platform_int("tizen.org/feature/screen.dpi",&dpi); + if(ret != SYSTEM_INFO_ERROR_NONE) + { + //error handing + dpi = -1; + } + } + return dpi; +} + +static void getTextBitmapData(const char * text, const FontDefinition& textDefinition, Data& bitmapData, int &bitmapWidth, int &bitmapHeight) +{ + //create canvas object + auto method = evas_render_method_lookup("buffer"); + if (method <= 0) + { + log("ERROR: evas was not compiled with 'buffer' engine!"); + return ; + } + + //evas_init();//not necessary, removed when use Tizen 2.4. + auto canvas = evas_new(); + if(!canvas){ + log("ERROR: could not instantiate new evas canvas."); + return; + } + evas_output_method_set(canvas, method); + + std::string fontFullPath; + if(textDefinition._fontName.empty()) + { + fontFullPath = "Sans"; + } + else + { + fontFullPath= FileUtils::getInstance()->fullPathForFilename(textDefinition._fontName); + } + + const char* fontName = fontFullPath.c_str(); + const char* textAlign = "left"; + const char* textValign = "top"; + char richTextStyle[50]; + richTextStyle[0] = 0; + + if (textDefinition._stroke._strokeEnabled) + { + sprintf(richTextStyle,"style=outline outline_color=#%02X%02X%02X", + textDefinition._stroke._strokeColor.r, textDefinition._stroke._strokeColor.g, textDefinition._stroke._strokeColor.b); + } + + switch (textDefinition._alignment) + { + case TextHAlignment::CENTER: + textAlign = "center"; + break; + case TextHAlignment::RIGHT: + textAlign = "right"; + break; + default: + break; + } + double valignment = 0.0; + switch(textDefinition._vertAlignment) + { + case TextVAlignment::CENTER: + textValign = "center"; + valignment = 0.5; + break; + case TextVAlignment::BOTTOM: + textValign = "bottom"; + valignment = 1.0; + break; + default: + break; + } + + auto richText = (char*)malloc(strlen(text) + 150); + sprintf(richText,"DEFAULT='font=%s font_size=%d align=%s valign=%s %s color=#%02X%02X%02X wrap=word'", + fontName, textDefinition._fontSize, textAlign, textValign, richTextStyle, + textDefinition._fontFillColor.b, textDefinition._fontFillColor.g, textDefinition._fontFillColor.r); + + auto entry = evas_object_textblock_add(canvas); + auto st = evas_textblock_style_new(); + evas_textblock_style_set(st, richText); + evas_object_textblock_style_set(entry, st); + evas_textblock_style_free(st); + evas_object_textblock_valign_set(entry, valignment); + + evas_object_textblock_text_markup_set(entry, evas_textblock_text_utf8_to_markup(entry, text)); + free(richText); + + evas_object_resize(entry, 2048, 0);//allocate one default size first. + + Evas_Coord width = textDefinition._dimensions.width; + Evas_Coord height = textDefinition._dimensions.height; + if(0==width*height) + { + evas_object_textblock_size_formatted_get(entry, &width, &height); + } + + evas_object_resize(entry, width, height); + + //init canvas + evas_output_size_set(canvas, width, height); + evas_output_viewport_set(canvas, 0, 0, width, height); + + auto einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(canvas); + if (!einfo){ + log("ERROR: could not get evas engine info!"); + evas_free(canvas); + return ; + } + + // ARGB32 is sizeof(int), that is 4 bytes, per pixel + bitmapWidth = width; + bitmapHeight = height; + void* pixels = malloc(bitmapWidth * bitmapHeight * 4); + if (!pixels){ + log("ERROR: could not allocate canvas pixels!"); + evas_free(canvas); + return; + } + + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32; + einfo->info.dest_buffer = pixels; + einfo->info.dest_buffer_row_bytes = bitmapWidth * sizeof(int); + einfo->info.use_color_key = 0; + einfo->info.alpha_threshold = 0; + einfo->info.func.new_update_region = NULL; + einfo->info.func.free_update_region = NULL; + evas_engine_info_set(canvas, (Evas_Engine_Info *)einfo); + + //render + evas_object_show(entry); + auto updates = evas_render_updates(canvas); + evas_render_updates_free(updates); + + bitmapData.fastSet((unsigned char*)pixels,bitmapWidth * bitmapHeight * 4); + + evas_free(canvas); + //evas_shutdown();//not necessary, removed when use Tizen 2.4. +} + +Data Device::getTextureDataForText(const char * text, const FontDefinition& textDefinition, TextAlign align, int &width, int &height, bool& hasPremultipliedAlpha) +{ + Data ret; + do + { + getTextBitmapData(text, textDefinition, ret, width, height); + hasPremultipliedAlpha = true; + } while (0); + + return ret; +} + +void Device::setKeepScreenOn(bool value) +{ +} + +void Device::vibrate(float duration) +{ + CC_UNUSED_PARAM(duration); +} + +NS_CC_END + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN diff --git a/cocos/platform/tizen/CCFileUtils-tizen.cpp b/cocos/platform/tizen/CCFileUtils-tizen.cpp new file mode 100644 index 000000000000..8060866a997f --- /dev/null +++ b/cocos/platform/tizen/CCFileUtils-tizen.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "platform/tizen/CCFileUtils-tizen.h" +#include +#include + +using namespace std; +NS_CC_BEGIN + +FileUtils* FileUtils::getInstance() +{ + if (s_sharedFileUtils == nullptr) + { + s_sharedFileUtils = new FileUtilsTizen(); + if(!s_sharedFileUtils->init()) + { + delete s_sharedFileUtils; + s_sharedFileUtils = nullptr; + CCLOG("ERROR: Could not init FileUtilsTizen"); + } + } + + return s_sharedFileUtils; +} + +FileUtilsTizen::FileUtilsTizen() +{ + +} + +bool FileUtilsTizen::init() +{ + _defaultResRootPath = app_get_resource_path(); + _writablePath = app_get_data_path(); + + return FileUtils::init(); +} + +string FileUtilsTizen::getWritablePath() const +{ + return _writablePath; +} + +bool FileUtilsTizen::isFileExistInternal(const std::string& strFilePath) const +{ + if (strFilePath.empty()) + { + return false; + } + + std::string strPath = strFilePath; + if (!isAbsolutePath(strPath)) + { // Not absolute path, add the default root path at the beginning. + strPath.insert(0, _defaultResRootPath); + } + + struct stat sts; + return (stat(strPath.c_str(), &sts) != -1) ? true : false; +} + +NS_CC_END + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN diff --git a/cocos/platform/tizen/CCFileUtils-tizen.h b/cocos/platform/tizen/CCFileUtils-tizen.h new file mode 100644 index 000000000000..ab28c7d59915 --- /dev/null +++ b/cocos/platform/tizen/CCFileUtils-tizen.h @@ -0,0 +1,70 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#ifndef __CC_FILEUTILS_TIZEN_H__ +#define __CC_FILEUTILS_TIZEN_H__ + +#include "platform/CCFileUtils.h" +#include "platform/CCPlatformMacros.h" +#include "base/ccTypes.h" +#include + +NS_CC_BEGIN + +/** + * @addtogroup platform + * @{ + */ + +//! @brief Helper class to handle file operations +class CC_DLL FileUtilsTizen : public FileUtils +{ +public: + /* override funtions */ + virtual bool init() override; + + virtual std::string getWritablePath() const override; + +private: + FileUtilsTizen(); + + std::string _writablePath; + + virtual bool isFileExistInternal(const std::string& strFilePath) const override; + + friend class FileUtils; +}; + +// end of platform group +/// @} + +NS_CC_END + +#endif // __CC_FILEUTILS_TIZEN_H__ + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + diff --git a/cocos/platform/tizen/CCGL-tizen.h b/cocos/platform/tizen/CCGL-tizen.h new file mode 100644 index 000000000000..1b61bf331fc1 --- /dev/null +++ b/cocos/platform/tizen/CCGL-tizen.h @@ -0,0 +1,49 @@ +/**************************************************************************** + Copyright (c) 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 __CCGL_H__ +#define __CCGL_H__ + +#include "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#define GL_WRITE_ONLY GL_WRITE_ONLY_OES +#define glMapBuffer glMapBufferOES +#define GL_BGRA GL_BGRA_EXT +#define glClearDepth glClearDepthf + +//fixme, if Tizen 2.4, don't need these define, but Tizen 2.3 need them +//#define glGenVertexArrays glGenVertexArraysOES +//#define glDeleteVertexArrays glDeleteVertexArraysOES +//#define glUnmapBuffer glUnmapBufferOES +//#define glBindVertexArray glBindVertexArrayOES +//#define GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES + +#include + +ELEMENTARY_GLVIEW_GLOBAL_DECLARE(); + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#endif // __CCGL_H__ diff --git a/cocos/platform/tizen/CCGLViewImpl-tizen.cpp b/cocos/platform/tizen/CCGLViewImpl-tizen.cpp new file mode 100644 index 000000000000..ef8e51ca6c63 --- /dev/null +++ b/cocos/platform/tizen/CCGLViewImpl-tizen.cpp @@ -0,0 +1,217 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "platform/tizen/CCGLViewImpl-tizen.h" +#include +#include +#include +#include +#include "platform/CCApplication.h" +#include "base/CCIMEDispatcher.h" +#include "base/CCDirector.h" + +NS_CC_BEGIN + +GLViewImpl* GLViewImpl::createWithRect(const std::string& viewName, Rect rect, float frameZoomFactor) +{ + auto ret = new GLViewImpl; + if(ret && ret->initWithRect(viewName, rect, frameZoomFactor)) { + ret->autorelease(); + return ret; + } + + return nullptr; +} + +GLViewImpl* GLViewImpl::create(const std::string& viewName) +{ + auto ret = new GLViewImpl; + if(ret && ret->initWithFullScreen(viewName)) { + ret->autorelease(); + return ret; + } + + return nullptr; +} + +GLViewImpl* GLViewImpl::createWithFullScreen(const std::string& viewName) +{ + auto ret = new GLViewImpl(); + if(ret && ret->initWithFullScreen(viewName)) { + ret->autorelease(); + return ret; + } + + return nullptr; +} + +GLViewImpl::GLViewImpl() +{ + +} + +GLViewImpl::~GLViewImpl() +{ + +} + +bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float frameZoomFactor) +{ + return true; +} + +bool GLViewImpl::initWithFullScreen(const std::string& viewName) +{ + return true; +} + + +bool GLViewImpl::isOpenGLReady() +{ + return (_screenSize.width != 0 && _screenSize.height != 0); +} + +void GLViewImpl::end() +{ + exit(0); +} + +void GLViewImpl::swapBuffers() +{ +} + +//============================================================================================ +static Evas_Object * s_keypadWin = nullptr; +static Evas_Object * s_keypadEntry = nullptr; +Ecore_IMF_Context *s_imf = nullptr; + +static void imfEventCommitCallback(void *data, Ecore_IMF_Context *ctx, void *event_info) +{ + auto commit_str = (char *)event_info; + if (commit_str) + { + cocos2d::IMEDispatcher::sharedDispatcher()->dispatchInsertText(commit_str, strlen(commit_str)); + } +} + +static void entryKeyCallback(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + auto keyInfo = (Evas_Event_Key_Up*)event_info; + if (keyInfo->key && !strcmp(keyInfo->key,"BackSpace")) + { + cocos2d::IMEDispatcher::sharedDispatcher()->dispatchDeleteBackward(); + } +} + +static void stateChangedCallback(void *data, Ecore_IMF_Context *ctx, int value) +{ + if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) + { + evas_object_del(s_keypadWin); + s_keypadWin = nullptr; + s_imf = nullptr; + } +} + +static void closeKeypad() +{ + ecore_imf_context_input_panel_event_callback_add (s_imf, ECORE_IMF_INPUT_PANEL_STATE_EVENT, stateChangedCallback, NULL); + elm_entry_input_panel_hide(s_keypadEntry); +} + +static void entryActivatedCallback(void *data, Evas_Object *obj, void *event_info) +{ + closeKeypad(); +} + +static void keyPadBackCallback(void *data, Evas_Object *obj, void *event_info) +{ + closeKeypad(); +} + +static void blankAreaClickedCallback(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + closeKeypad(); +} + +void GLViewImpl::setIMEKeyboardState(bool open) +{ + if (open) + { + if (!s_keypadWin) + { + auto frameSize = Director::getInstance()->getOpenGLView()->getFrameSize(); + auto app = Application::getInstance(); + + s_keypadWin = elm_win_add(app->_win, "cocos2d-x textfield", ELM_WIN_BASIC); + elm_win_autodel_set(s_keypadWin, EINA_TRUE); + elm_win_conformant_set(s_keypadWin, EINA_TRUE); + elm_win_alpha_set(s_keypadWin, EINA_TRUE); + eext_object_event_callback_add(s_keypadWin, EEXT_CALLBACK_BACK, keyPadBackCallback, NULL); + evas_object_show(s_keypadWin); + + int rots[2]; + rots[0] = (int)elm_win_rotation_get(app->_win); + rots[1] = rots[0] + 180 % 360; + elm_win_wm_rotation_available_rotations_set(s_keypadWin, rots, 2); + + auto rectangle = elm_bg_add(s_keypadWin); + evas_object_resize(rectangle, frameSize.width, frameSize.height + 50); + evas_object_color_set(rectangle, 0xff, 0xff, 0xff, 0); + evas_object_move(rectangle, 0, -50); + evas_object_show(rectangle); + + evas_object_repeat_events_set(rectangle, EINA_TRUE); + evas_object_event_callback_add(rectangle, EVAS_CALLBACK_MOUSE_UP, blankAreaClickedCallback, NULL); + evas_object_event_callback_add(rectangle, EVAS_CALLBACK_MULTI_UP, blankAreaClickedCallback, NULL); + + s_keypadEntry = elm_entry_add(rectangle); + elm_entry_single_line_set(s_keypadEntry, EINA_TRUE); + evas_object_resize(s_keypadEntry, frameSize.width, 50); + evas_object_move(s_keypadEntry, 0, -50); + elm_entry_input_panel_return_key_type_set(s_keypadEntry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); + elm_entry_prediction_allow_set(s_keypadEntry, EINA_FALSE); + evas_object_event_callback_add(s_keypadEntry, EVAS_CALLBACK_KEY_UP, entryKeyCallback, NULL); + evas_object_show(s_keypadEntry); + + elm_object_focus_set(s_keypadEntry, EINA_TRUE); + evas_object_smart_callback_add(s_keypadEntry, "activated", entryActivatedCallback, NULL); + elm_entry_input_panel_show(s_keypadEntry); + + s_imf = (Ecore_IMF_Context*)elm_entry_imf_context_get(s_keypadEntry); + ecore_imf_context_event_callback_add(s_imf, ECORE_IMF_CALLBACK_COMMIT, imfEventCommitCallback, s_keypadEntry); + } + } + else if (s_keypadWin) + { + closeKeypad(); + } +} + +NS_CC_END + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN diff --git a/cocos/platform/tizen/CCGLViewImpl-tizen.h b/cocos/platform/tizen/CCGLViewImpl-tizen.h new file mode 100644 index 000000000000..b3f17031c0e6 --- /dev/null +++ b/cocos/platform/tizen/CCGLViewImpl-tizen.h @@ -0,0 +1,61 @@ +/**************************************************************************** + Copyright (c) 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_EGLVIEWIMPL_TIZEN_H__ +#define __CC_EGLVIEWIMPL_TIZEN_H__ + +#include "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "platform/CCGLView.h" + +NS_CC_BEGIN + +class CC_DLL GLViewImpl : public GLView +{ +public: + + // static function + static GLViewImpl* create(const std::string &viewname); + static GLViewImpl* createWithRect(const std::string& viewName, Rect rect, float frameZoomFactor = 1.0f); + static GLViewImpl* createWithFullScreen(const std::string& viewName); + + bool isOpenGLReady() override; + void end() override; + void swapBuffers() override; + void setIMEKeyboardState(bool bOpen) override; + +protected: + GLViewImpl(); + virtual ~GLViewImpl(); + + bool initWithRect(const std::string& viewName, Rect rect, float frameZoomFactor); + bool initWithFullScreen(const std::string& viewName); +}; + +NS_CC_END + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#endif // end of __CC_EGLVIEWIMPL_TIZEN_H__ diff --git a/cocos/platform/tizen/CCPlatformDefine-tizen.h b/cocos/platform/tizen/CCPlatformDefine-tizen.h new file mode 100644 index 000000000000..5fcf0542763c --- /dev/null +++ b/cocos/platform/tizen/CCPlatformDefine-tizen.h @@ -0,0 +1,51 @@ +/**************************************************************************** + Copyright (c) 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 __CCPLATFORMDEFINE_H__ +#define __CCPLATFORMDEFINE_H__ + +#include "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include + +#define CC_DLL + +#include +#define CC_ASSERT(cond) assert(cond) +#define CC_UNUSED_PARAM(unusedparam) (void)unusedparam + +/* Define NULL pointer value */ +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif +#endif + + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#endif /* __CCPLATFORMDEFINE_H__*/ diff --git a/cocos/platform/tizen/CCStdC-tizen.cpp b/cocos/platform/tizen/CCStdC-tizen.cpp new file mode 100644 index 000000000000..a0b94607d732 --- /dev/null +++ b/cocos/platform/tizen/CCStdC-tizen.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** + Copyright (c) 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 "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "platform/tizen/CCStdC-tizen.h" + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + +int CC_DLL gettimeofday(struct timeval * val, struct timezone *) +{ + if (val) + { + SYSTEMTIME wtm; + GetLocalTime(&wtm); + + struct tm tTm; + tTm.tm_year = wtm.wYear - 1900; + tTm.tm_mon = wtm.wMonth - 1; + tTm.tm_mday = wtm.wDay; + tTm.tm_hour = wtm.wHour; + tTm.tm_min = wtm.wMinute; + tTm.tm_sec = wtm.wSecond; + tTm.tm_isdst = -1; + + val->tv_sec = (long)mktime(&tTm); // time_t is 64-bit on win32 + val->tv_usec = wtm.wMilliseconds * 1000; + } + return 0; +} +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_BADA) + +using namespace Osp::System; + +int CC_DLL gettimeofday(struct timeval * val, struct timezone *) +{ + if (val) + { + long long curTick = 0; + SystemTime::GetTicks(curTick); + unsigned int ms = curTick; + val->tv_sec = ms / 1000; + val->tv_usec = (ms % 1000) * 1000; + } + return 0; +} + +#endif // CC_PLATFORM_WIN32 + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN diff --git a/cocos/platform/tizen/CCStdC-tizen.h b/cocos/platform/tizen/CCStdC-tizen.h new file mode 100644 index 000000000000..ae6c7cb563cb --- /dev/null +++ b/cocos/platform/tizen/CCStdC-tizen.h @@ -0,0 +1,60 @@ +/**************************************************************************** + Copyright (c) 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_STD_C_H__ +#define __CC_STD_C_H__ + +#include "platform/CCPlatformConfig.h" +#if CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#include "platform/CCPlatformMacros.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef MIN +#define MIN(x,y) (((x) > (y)) ? (y) : (x)) +#endif // MIN + +#ifndef MAX +#define MAX(x,y) (((x) < (y)) ? (y) : (x)) +#endif // MAX + +// some function linux do not have +#define tanf tan +#define sqrtf sqrt +#define cosf cos +#define sinf sin + +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN + +#endif // __CC_STD_C_H__ diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp index 6385de7dbc60..9dfc02be25c3 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp @@ -1,5 +1,5 @@ #include "scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 +#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN #include "audio/include/AudioEngine.h" #include "scripting/lua-bindings/manual/tolua_fix.h" #include "scripting/lua-bindings/manual/LuaBasicConversions.h" @@ -612,10 +612,10 @@ int lua_cocos2dx_audioengine_AudioEngine_preload(lua_State* tolua_S) if (!ok) { break; } std::function arg1; do { - // Lambda binding for lua is not supported. - assert(false); - } while(0) - ; + // Lambda binding for lua is not supported. + assert(false); + } while(0) + ; if (!ok) { break; } cocos2d::experimental::AudioEngine::preload(arg0, arg1); lua_settop(tolua_S, 1); @@ -1039,16 +1039,16 @@ int lua_register_cocos2dx_audioengine_AudioEngine(lua_State* tolua_S) } TOLUA_API int register_all_cocos2dx_audioengine(lua_State* tolua_S) { - tolua_open(tolua_S); - - tolua_module(tolua_S,"ccexp",0); - tolua_beginmodule(tolua_S,"ccexp"); + tolua_open(tolua_S); + + tolua_module(tolua_S,"ccexp",0); + tolua_beginmodule(tolua_S,"ccexp"); - lua_register_cocos2dx_audioengine_AudioProfile(tolua_S); - lua_register_cocos2dx_audioengine_AudioEngine(tolua_S); + lua_register_cocos2dx_audioengine_AudioProfile(tolua_S); + lua_register_cocos2dx_audioengine_AudioEngine(tolua_S); - tolua_endmodule(tolua_S); - return 1; + tolua_endmodule(tolua_S); + return 1; } #endif diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp index 01e014651068..9f1461f3e52f 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp @@ -1,5 +1,5 @@ #include "base/ccConfig.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 +#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN #ifndef __cocos2dx_audioengine_h__ #define __cocos2dx_audioengine_h__ diff --git a/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.cpp b/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.cpp index b81761f9cb9d..99017031fb8a 100644 --- a/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.cpp @@ -25,7 +25,7 @@ #include "scripting/lua-bindings/manual/audioengine/lua_cocos2dx_audioengine_manual.h" -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 +#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN #include "scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp" #include "scripting/lua-bindings/manual/tolua_fix.h" diff --git a/cocos/scripting/lua-bindings/proj.tizen/.cproject b/cocos/scripting/lua-bindings/proj.tizen/.cproject new file mode 100644 index 000000000000..cd425c04d2ee --- /dev/null +++ b/cocos/scripting/lua-bindings/proj.tizen/.cproject @@ -0,0 +1,1166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cocos/scripting/lua-bindings/proj.tizen/.gitignore b/cocos/scripting/lua-bindings/proj.tizen/.gitignore new file mode 100644 index 000000000000..bfc40a35ed1f --- /dev/null +++ b/cocos/scripting/lua-bindings/proj.tizen/.gitignore @@ -0,0 +1,2 @@ +/res +/Emulator diff --git a/cocos/scripting/lua-bindings/proj.tizen/.project b/cocos/scripting/lua-bindings/proj.tizen/.project new file mode 100644 index 000000000000..3486dacac07a --- /dev/null +++ b/cocos/scripting/lua-bindings/proj.tizen/.project @@ -0,0 +1,137 @@ + + + libcocos2dxluabindings + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecore.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecore.apichecker.core.tizenCppNature + + + + auto + 2 + PARENT-1-PROJECT_LOC/auto + + + lua + 2 + PARENT-4-PROJECT_LOC/external/lua + + + manual + 2 + PARENT-1-PROJECT_LOC/manual + + + script + 2 + PARENT-1-PROJECT_LOC/script + + + + + 1414551199494 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + 1414551199497 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-luajit + + + + 1414551199500 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-android + + + + 1414551199504 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-ios + + + + 1414551199507 + + 22 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-true-false-wsocket.c + + + + 1426065422920 + lua + 9 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-lua + + + + 1426065422967 + lua + 9 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-tolua + + + + 1426065422983 + lua + 9 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-luasocket + + + + 1426065452420 + lua/lua + 6 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-lua.c + + + + diff --git a/cocos/scripting/lua-bindings/proj.tizen/.tproject b/cocos/scripting/lua-bindings/proj.tizen/.tproject new file mode 100644 index 000000000000..824eaa1748c9 --- /dev/null +++ b/cocos/scripting/lua-bindings/proj.tizen/.tproject @@ -0,0 +1,12 @@ + + + + + mobile-2.4 + + + + + + + diff --git a/cocos/ui/CocosGUI.h b/cocos/ui/CocosGUI.h index 8f32d2d3fc74..87fae1bb79a9 100644 --- a/cocos/ui/CocosGUI.h +++ b/cocos/ui/CocosGUI.h @@ -46,10 +46,10 @@ THE SOFTWARE. #include "ui/UIHBox.h" #include "ui/UIVBox.h" #include "ui/UIRelativeBox.h" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) #include "ui/UIVideoPlayer.h" #endif -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) #include "ui/UIWebView.h" #endif #include "ui/UIDeprecated.h" diff --git a/cocos/ui/UIEditBox/UIEditBoxImpl-tizen.cpp b/cocos/ui/UIEditBox/UIEditBoxImpl-tizen.cpp new file mode 100644 index 000000000000..1108db04d83a --- /dev/null +++ b/cocos/ui/UIEditBox/UIEditBoxImpl-tizen.cpp @@ -0,0 +1,439 @@ +/**************************************************************************** + Copyright (c) 2010-2012 cocos2d-x.org + Copyright (c) 2012 James Chen + + 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 "ui/UIEditBox/UIEditBoxImpl-tizen.h" + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) + +#include +#include +#include + +#include "ui/UIEditBox/UIEditBox.h" +#include "2d/CCLabel.h" +#include "base/ccUTF8.h" + + +#include "platform/tizen/CCApplication-tizen.h" +#include "base/CCDirector.h" + +NS_CC_BEGIN + +namespace ui { + +EditBoxImpl* __createSystemEditBox(EditBox* pEditBox) +{ + return new EditBoxImplTizen(pEditBox); +} + +EditBoxImplTizen::EditBoxImplTizen(EditBox* pEditText) +: EditBoxImpl(pEditText) +, _label(nullptr) +, _labelPlaceHolder(nullptr) +, _editBoxInputMode(EditBox::InputMode::SINGLE_LINE) +, _editBoxInputFlag(EditBox::InputFlag::INITIAL_CAPS_ALL_CHARACTERS) +, _keyboardReturnType(EditBox::KeyboardReturnType::DEFAULT) +, _colText(Color3B::WHITE) +, _colPlaceHolder(Color3B::GRAY) +, _maxLength(-1) +{ + +} + +EditBoxImplTizen::~EditBoxImplTizen() +{ + +} + +void EditBoxImplTizen::doAnimationWhenKeyboardMove(float duration, float distance) +{ // don't need to be implemented on tizen platform. + +} + +static const int CC_EDIT_BOX_PADDING = 5; + +bool EditBoxImplTizen::initWithSize(const Size& size) +{ + int fontSize = size.height-12; + _label = Label::create(); + _label->setSystemFontSize(size.height-12); + // align the text vertically center + _label->setAnchorPoint(Vec2(0, 0.5f)); + _label->setPosition(Vec2(CC_EDIT_BOX_PADDING, size.height / 2.0f)); + _label->setTextColor(_colText); + _editBox->addChild(_label); + + _labelPlaceHolder = Label::create(); + _labelPlaceHolder->setSystemFontSize(size.height-12); + // align the text vertically center + _labelPlaceHolder->setAnchorPoint(Vec2(0, 0.5f)); + _labelPlaceHolder->setPosition(CC_EDIT_BOX_PADDING, size.height / 2.0f); + _labelPlaceHolder->setVisible(false); + _labelPlaceHolder->setTextColor(_colPlaceHolder); + _editBox->addChild(_labelPlaceHolder); + + _editSize = size; + return true; +} + +void EditBoxImplTizen::setFont(const char* pFontName, int fontSize) +{ + if(_label != NULL) { + _label->setSystemFontName(pFontName); + _label->setSystemFontSize(fontSize); + } + + if(_labelPlaceHolder != NULL) { + _labelPlaceHolder->setSystemFontName(pFontName); + _labelPlaceHolder->setSystemFontSize(fontSize); + } +} + +void EditBoxImplTizen::setFontColor(const Color4B& color) +{ + _colText = color; + _label->setTextColor(color); +} + +void EditBoxImplTizen::setPlaceholderFont(const char* pFontName, int fontSize) +{ + if(_labelPlaceHolder != NULL) { + _labelPlaceHolder->setSystemFontName(pFontName); + _labelPlaceHolder->setSystemFontSize(fontSize); + } +} + +void EditBoxImplTizen::setPlaceholderFontColor(const Color4B& color) +{ + _colPlaceHolder = color; + _labelPlaceHolder->setTextColor(color); +} + +void EditBoxImplTizen::setInputMode(EditBox::InputMode inputMode) +{ + _editBoxInputMode = inputMode; +} + +void EditBoxImplTizen::setMaxLength(int maxLength) +{ + _maxLength = maxLength; +} + +int EditBoxImplTizen::getMaxLength() +{ + return _maxLength; +} + +void EditBoxImplTizen::setInputFlag(EditBox::InputFlag inputFlag) +{ + _editBoxInputFlag = inputFlag; +} + +void EditBoxImplTizen::setReturnType(EditBox::KeyboardReturnType returnType) +{ + _keyboardReturnType = returnType; +} + +bool EditBoxImplTizen::isEditing() +{ + return false; +} + +void EditBoxImplTizen::setText(const char* pText) +{ + if (pText != NULL) + { + _text = pText; + + if (_text.length() > 0) + { + _labelPlaceHolder->setVisible(false); + + std::string strToShow; + + if (EditBox::InputFlag::PASSWORD == _editBoxInputFlag) + { + long length = cc_utf8_strlen(_text.c_str(), -1); + for (long i = 0; i < length; i++) + { + strToShow.append("*"); + } + } + else + { + strToShow = _text; + } + + _label->setString(strToShow.c_str()); + + // Clip the text width to fit to the text box + + float fMaxWidth = _editSize.width - CC_EDIT_BOX_PADDING * 2; + auto labelSize = _label->getContentSize(); + if(labelSize.width > fMaxWidth) { + _label->setDimensions(fMaxWidth,labelSize.height); + } + } + else + { + _labelPlaceHolder->setVisible(true); + _label->setString(""); + } + + } +} + +const char* EditBoxImplTizen::getText(void) +{ + return _text.c_str(); +} + +void EditBoxImplTizen::setPlaceHolder(const char* pText) +{ + if (pText != NULL) + { + _placeHolder = pText; + if (_placeHolder.length() > 0 && _text.length() == 0) + { + _labelPlaceHolder->setVisible(true); + } + + _labelPlaceHolder->setString(_placeHolder.c_str()); + } +} + +void EditBoxImplTizen::setPosition(const Vec2& pos) +{ // don't need to be implemented on tizen platform. + +} + +void EditBoxImplTizen::setVisible(bool visible) +{ // don't need to be implemented on tizen platform. + +} + +void EditBoxImplTizen::setContentSize(const Size& size) +{ // don't need to be implemented on tizen platform. + +} + +void EditBoxImplTizen::setAnchorPoint(const Vec2& anchorPoint) +{ // don't need to be implemented on tizen platform. + +} + +void EditBoxImplTizen::visit(void) +{ // don't need to be implemented on tizen platform. + +} + +void EditBoxImplTizen::onEnter(void) +{ // don't need to be implemented on tizen platform. + +} + +static void editBoxCallbackFunc(const char* pText, void* ctx) +{ + EditBoxImplTizen* thiz = (EditBoxImplTizen*)ctx; + thiz->setText(pText); + + if (thiz->getDelegate() != NULL) + { + thiz->getDelegate()->editBoxTextChanged(thiz->getEditBox(), thiz->getText()); + thiz->getDelegate()->editBoxEditingDidEnd(thiz->getEditBox()); + thiz->getDelegate()->editBoxReturn(thiz->getEditBox()); + } + +#if CC_ENABLE_SCRIPT_BINDING + EditBox* pEditBox = thiz->getEditBox(); + if (NULL != pEditBox && 0 != pEditBox->getScriptEditBoxHandler()) + { + CommonScriptData data(pEditBox->getScriptEditBoxHandler(), "changed",pEditBox); + ScriptEvent event(kCommonEvent,(void*)&data); + ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event); + memset(data.eventName, 0, sizeof(data.eventName)); + strncpy(data.eventName, "ended", sizeof(data.eventName)); + event.data = (void*)&data; + ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event); + memset(data.eventName, 0, sizeof(data.eventName)); + strncpy(data.eventName, "return", sizeof(data.eventName)); + event.data = (void*)&data; + ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event); + } +#endif +} + +static Evas_Object * s_keypadWin = nullptr; + +static void entry_back_cb(void *data, Evas_Object *obj, void *event_info) +{ + evas_object_del(s_keypadWin); + s_keypadWin = nullptr; +} + +static void entry_activated_cb(void *data, Evas_Object *obj, void *event_info) +{ + char *commit_str = (char *)event_info; + const char* text = elm_entry_entry_get(obj); + editBoxCallbackFunc(text, data); + elm_entry_input_panel_hide(obj); + evas_object_del(s_keypadWin); + s_keypadWin = nullptr; +} + +void EditBoxImplTizen::openKeyboard() +{ + if (s_keypadWin) + { + return; + } + + if (_delegate != NULL) + { + _delegate->editBoxEditingDidBegin(_editBox); + } + +#if CC_ENABLE_SCRIPT_BINDING + EditBox* pEditBox = this->getEditBox(); + if (NULL != pEditBox && 0 != pEditBox->getScriptEditBoxHandler()) + { + CommonScriptData data(pEditBox->getScriptEditBoxHandler(), "began",pEditBox); + ScriptEvent event(cocos2d::kCommonEvent,(void*)&data); + ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event); + } +#endif + + Evas_Object* parent = Application::getInstance()->_win; + GLView* glView = Director::getInstance()->getOpenGLView(); + Size frameSize = glView->getFrameSize(); + + s_keypadWin = elm_win_add(parent, "cocos2d-x", ELM_WIN_BASIC); + elm_win_autodel_set(s_keypadWin, EINA_TRUE); + elm_win_conformant_set(s_keypadWin, EINA_TRUE); + elm_win_alpha_set(s_keypadWin, EINA_TRUE); + evas_object_show(s_keypadWin); + eext_object_event_callback_add(s_keypadWin, EEXT_CALLBACK_BACK, entry_back_cb, this); + int rots[2]; + rots[0] = (int)(elm_win_rotation_get(parent)); + rots[1] = rots[0] + 180 % 360; + elm_win_wm_rotation_available_rotations_set(s_keypadWin, rots, 2); + + Evas_Object* bgFull = elm_bg_add(s_keypadWin); + evas_object_color_set(bgFull, 0, 0, 0, 0xa0); + evas_object_resize(bgFull, frameSize.width, frameSize.height); + evas_object_show(bgFull); + + int height = frameSize.height / 10; + Evas_Object* rectangle = elm_bg_add(bgFull); + evas_object_resize(rectangle, frameSize.width, height); + evas_object_move(rectangle, 0, height); + evas_object_color_set(rectangle, 0xff, 0xff, 0xff, 0xff); + evas_object_show(rectangle); + + Evas_Object* title = elm_entry_add(rectangle); + evas_object_resize(title, frameSize.width, height); + auto text = _placeHolder.c_str(); + auto richText = (char*)malloc(strlen(text) + 50); + sprintf(richText,"%s", text); + elm_entry_entry_set(title, richText); + elm_entry_editable_set(title, EINA_FALSE); + //elm_entry_drag_disabled_set(title, EINA_TRUE); + //elm_entry_drop_disabled_set(title, EINA_TRUE); + evas_object_show(title); + free(richText); + + Evas_Object* entry = elm_entry_add(bgFull); + elm_object_focus_set(entry, EINA_TRUE); + evas_object_resize(entry, frameSize.width, height); + evas_object_move(entry, 0, height); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_line_wrap_set(entry, ELM_WRAP_MIXED); + elm_entry_entry_set(entry, _text.c_str()); + evas_object_show(entry); + elm_object_focus_set(entry, EINA_TRUE); + eext_entry_selection_back_event_allow_set(entry, EINA_TRUE); + Elm_Entry_Filter_Limit_Size limit_size = { 0, }; + limit_size.max_char_count = _maxLength; + elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_size); + elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); + elm_entry_prediction_allow_set(entry, EINA_FALSE); + + evas_object_smart_callback_add(entry, "activated", entry_activated_cb, this); + + switch(_editBoxInputFlag) + { + case EditBox::InputFlag::PASSWORD: + elm_entry_password_set(entry, EINA_TRUE); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_EMAIL); + break; + case EditBox::InputFlag::SENSITIVE: + elm_entry_input_hint_set(entry, ELM_INPUT_HINT_SENSITIVE_DATA); + break; + case EditBox::InputFlag::INITIAL_CAPS_WORD: + elm_entry_autocapital_type_set(entry, ELM_AUTOCAPITAL_TYPE_WORD); + break; + case EditBox::InputFlag::INITIAL_CAPS_SENTENCE: + elm_entry_autocapital_type_set(entry, ELM_AUTOCAPITAL_TYPE_SENTENCE); + break; + case EditBox::InputFlag::INITIAL_CAPS_ALL_CHARACTERS: + elm_entry_autocapital_type_set(entry, ELM_AUTOCAPITAL_TYPE_ALLCHARACTER); + break; + } + + switch(_editBoxInputMode) + { + case EditBox::InputMode::ANY: + break; + case EditBox::InputMode::EMAIL_ADDRESS: + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_EMAIL); + break; + case EditBox::InputMode::NUMERIC: + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NUMBER); + break; + case EditBox::InputMode::PHONE_NUMBER: + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_PHONENUMBER); + break; + case EditBox::InputMode::URL: + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_URL); + break; + case EditBox::InputMode::DECIMAL: + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_HEX); //fixme? + break; + case EditBox::InputMode::SINGLE_LINE: + break; + } +} + +void EditBoxImplTizen::closeKeyboard() +{ + +} + +} + +NS_CC_END + +#endif /* #if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) */ + diff --git a/cocos/ui/UIEditBox/UIEditBoxImpl-tizen.h b/cocos/ui/UIEditBox/UIEditBoxImpl-tizen.h new file mode 100644 index 000000000000..b4ca623ff02e --- /dev/null +++ b/cocos/ui/UIEditBox/UIEditBoxImpl-tizen.h @@ -0,0 +1,117 @@ +/**************************************************************************** + Copyright (c) 2010-2012 cocos2d-x.org + Copyright (c) 2012 James Chen + + 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 __UIEDITBOXIMPLTIZEN_H__ +#define __UIEDITBOXIMPLTIZEN_H__ + +#include "platform/CCPlatformConfig.h" + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) + +#include "ui/UIEditBox/UIEditBoxImpl.h" +#include "platform/CCGLView.h" + +NS_CC_BEGIN + +class Label; + +namespace ui { + +class EditBox; + +class EditBoxImplTizen : public EditBoxImpl +{ +public: + /** + * @js NA + */ + EditBoxImplTizen(EditBox* pEditText); + /** + * @js NA + * @lua NA + */ + virtual ~EditBoxImplTizen(); + + virtual void draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, uint32_t flags) {}; + + virtual bool initWithSize(const Size& size); + virtual void setFont(const char* pFontName, int fontSize); + virtual void setFontColor(const Color4B& color); + virtual void setPlaceholderFont(const char* pFontName, int fontSize); + virtual void setPlaceholderFontColor(const Color4B& color); + virtual void setInputMode(EditBox::InputMode inputMode); + virtual void setInputFlag(EditBox::InputFlag inputFlag); + virtual void setMaxLength(int maxLength); + virtual int getMaxLength(); + virtual void setReturnType(EditBox::KeyboardReturnType returnType); + virtual bool isEditing(); + + virtual void setText(const char* pText); + virtual const char* getText(void); + virtual void setPlaceHolder(const char* pText); + virtual void setPosition(const Vec2& pos); + virtual void setVisible(bool visible); + virtual void setContentSize(const Size& size); + virtual void setAnchorPoint(const Vec2& anchorPoint); + /** + * @js NA + * @lua NA + */ + virtual void visit(void); + /** + * @js NA + * @lua NA + */ + virtual void onEnter(void); + virtual void doAnimationWhenKeyboardMove(float duration, float distance); + virtual void openKeyboard(); + virtual void closeKeyboard(); + +private: + Label* _label; + Label* _labelPlaceHolder; + EditBox::InputMode _editBoxInputMode; + EditBox::InputFlag _editBoxInputFlag; + EditBox::KeyboardReturnType _keyboardReturnType; + + std::string _text; + std::string _placeHolder; + + Color4B _colText; + Color4B _colPlaceHolder; + + int _maxLength; + Size _editSize; +}; + + +} + +NS_CC_END + +#endif /* #if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) */ + +#endif /* __UIEDITBOXIMPLTIZEN_H__ */ + diff --git a/cocos/ui/UIVideoPlayer-tizen.cpp b/cocos/ui/UIVideoPlayer-tizen.cpp new file mode 100644 index 000000000000..fb9fb559529a --- /dev/null +++ b/cocos/ui/UIVideoPlayer-tizen.cpp @@ -0,0 +1,428 @@ +/**************************************************************************** + Copyright (c) 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 "ui/UIVideoPlayer.h" + + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) + +#include +#include +#include "base/CCDirector.h" +#include "base/CCEventListenerKeyboard.h" + +#include "player.h" +#include "platform/tizen/CCApplication-tizen.h" + +#include +#include +#include + +//----------------------------------------------------------------------------------------------------------- +USING_NS_CC; + +#define QUIT_FULLSCREEN 1000 + +using namespace cocos2d::experimental::ui; + +class _VideoPlayerTizen +{ +public: + _VideoPlayerTizen(VideoPlayer* videoPlayer) + { + _videoPlayer = videoPlayer; + + Application* app = Application::getInstance(); + _layout = elm_layout_add(app->_win); + Evas *evas = evas_object_evas_get(_layout); + _image = evas_object_image_filled_add(evas); + evas_object_show(_image); + player_create(&_player); + + evas_object_event_callback_add(_image, EVAS_CALLBACK_MOUSE_UP, _VideoPlayerTizen::mouse_up_cb, this); + eext_object_event_callback_add(app->_win, EEXT_CALLBACK_BACK, _VideoPlayerTizen::win_back_cb, this); + } + + virtual ~_VideoPlayerTizen() + { + Application* app = Application::getInstance(); + eext_object_event_callback_del(app->_win, EEXT_CALLBACK_BACK, _VideoPlayerTizen::win_back_cb); + evas_object_event_callback_del(_image, EVAS_CALLBACK_MOUSE_UP, _VideoPlayerTizen::mouse_up_cb); + + player_stop(_player); + player_unprepare(_player); + player_destroy(_player); + evas_object_del(_image); + evas_object_del(_layout); + } + + static void mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) + { + _VideoPlayerTizen* videoPlayerTizen = (_VideoPlayerTizen*)data; + if (videoPlayerTizen->_videoPlayer->isPlaying()) + { + videoPlayerTizen->_videoPlayer->pause(); + } + else + { + videoPlayerTizen->_videoPlayer->resume(); + } + } + + static void win_back_cb(void *data, Evas_Object *obj, void *event_info) { + _VideoPlayerTizen* videoPlayerTizen = (_VideoPlayerTizen*)data; + videoPlayerTizen->_videoPlayer->onPlayEvent(QUIT_FULLSCREEN); + evas_object_resize(videoPlayerTizen->_image, videoPlayerTizen->_width, videoPlayerTizen->_height); + evas_object_move(videoPlayerTizen->_image, videoPlayerTizen->_x, videoPlayerTizen->_y); + } + + void setRectangle(Evas_Coord x, Evas_Coord y, Evas_Coord width, Evas_Coord height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } + + player_h _player; + Evas_Object* _image; + Evas_Object* _layout; + VideoPlayer* _videoPlayer; + Evas_Coord _x; + Evas_Coord _y; + Evas_Coord _width; + Evas_Coord _height; +}; + +VideoPlayer::VideoPlayer() +: _videoPlayerIndex(-1) +, _eventCallback(nullptr) +, _fullScreenEnabled(false) +, _fullScreenDirty(false) +, _keepAspectRatioEnabled(false) +{ + _videoView = (void*) new (std::nothrow) _VideoPlayerTizen(this); + +#if CC_VIDEOPLAYER_DEBUG_DRAW + _debugDrawNode = DrawNode::create(); + addchild(_debugDrawNode); +#endif +} + +VideoPlayer::~VideoPlayer() +{ + delete (_VideoPlayerTizen*)_videoView; +} + +void VideoPlayer::setFileName(const std::string& fileName) +{ + _videoURL = fileName; + _videoSource = VideoPlayer::Source::FILENAME; + + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + + const char* uri = _videoURL.c_str(); + std::string fullpath; + fullpath.append(app_get_resource_path()); + fullpath.append(fileName.c_str()); + player_set_uri(impl->_player, fullpath.c_str()); +} + +void VideoPlayer::setURL(const std::string& videoUrl) +{ + _videoURL = videoUrl; + _videoSource = VideoPlayer::Source::URL; + + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + player_set_uri(impl->_player, videoUrl.c_str()); +} + +void VideoPlayer::draw(Renderer* renderer, const Mat4 &transform, uint32_t flags) +{ + cocos2d::ui::Widget::draw(renderer,transform,flags); + + if (flags & FLAGS_TRANSFORM_DIRTY) + { + auto directorInstance = Director::getInstance(); + auto glView = directorInstance->getOpenGLView(); + auto frameSize = glView->getFrameSize(); + + auto winSize = directorInstance->getWinSize(); + + auto leftBottom = convertToWorldSpace(Point::ZERO); + auto rightTop = convertToWorldSpace(Point(_contentSize.width,_contentSize.height)); + + auto uiLeft = frameSize.width / 2 + (leftBottom.x - winSize.width / 2 ) * glView->getScaleX(); + auto uiTop = frameSize.height /2 - (rightTop.y - winSize.height / 2) * glView->getScaleY(); + + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + Evas_Coord width = (rightTop.x - leftBottom.x) * glView->getScaleX(); + Evas_Coord height = (rightTop.y - leftBottom.y) * glView->getScaleY(); + Evas_Coord x = leftBottom.x * glView->getScaleX(); + Evas_Coord y = leftBottom.y * glView->getScaleY(); + + impl->setRectangle(x, y, width, height); + evas_object_resize(impl->_image, width, height); + evas_object_move(impl->_image, uiLeft, uiTop); + } + +#if CC_VIDEOPLAYER_DEBUG_DRAW + _debugDrawNode->clear(); + auto size = getContentSize(); + Point vertices[4]= + { + Point::ZERO, + Point(size.width, 0), + Point(size.width, size.height), + Point(0, size.height) + }; + _debugdrawNode->drawPoly(vertices, 4, true, Color4F(1.0, 1.0, 1.0, 1.0)); +#endif +} + +void VideoPlayer::setFullScreenEnabled(bool enabled) +{ + if (_fullScreenEnabled != enabled) + { + _fullScreenEnabled = enabled; + + auto directorInstance = Director::getInstance(); + auto glView = directorInstance->getOpenGLView(); + auto frameSize = glView->getFrameSize(); + + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + evas_object_resize(impl->_image, frameSize.width, frameSize.height); + evas_object_move(impl->_image, 0, 0); + } +} + +bool VideoPlayer::isFullScreenEnabled()const +{ + return _fullScreenEnabled; +} + +void VideoPlayer::setKeepAspectRatioEnabled(bool enable) +{ + if (_keepAspectRatioEnabled != enable) + { + _keepAspectRatioEnabled = enable; + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + if (_keepAspectRatioEnabled == enable) + { + player_set_display_mode(impl->_player, PLAYER_DISPLAY_MODE_LETTER_BOX); + } + else + { + player_set_display_mode(impl->_player, PLAYER_DISPLAY_MODE_FULL_SCREEN); + } + } +} + +#if CC_VIDEOPLAYER_DEBUG_DRAW +void VideoPlayer::drawDebugData() +{ + Director* director = Director::getInstance(); + CCASSERT(nullptr != director, "Director is null when seting matrix stack"); + + director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); + director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewTransform); + + auto size = getContentSize(); + + Point vertices[4]= + { + Point::ZERO, + Point(size.width, 0), + Point(size.width, size.height), + Point(0, size.height) + }; + + DrawPrimitives::drawPoly(vertices, 4, true); + + director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); +} +#endif + +static void _player_completed_cb(void *user_data) +{ + VideoPlayer* player = (VideoPlayer*)user_data; + player->onPlayEvent((int)VideoPlayer::EventType::COMPLETED); +} + +static void _player_interrupted_cb(player_interrupted_code_e code, void *user_data) +{ + VideoPlayer* player = (VideoPlayer*)user_data; + player->onPlayEvent((int)VideoPlayer::EventType::PAUSED); +} + +static void _player_video_frame_decoded_cb(unsigned char *data, int width, int height, unsigned int size, void *user_data) +{ + VideoPlayer* player = (VideoPlayer*)user_data; + player->onPlayEvent((int)VideoPlayer::EventType::PLAYING); +} + +void VideoPlayer::play() +{ + if (! _videoURL.empty()) + { + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + player_set_sound_type(impl->_player, SOUND_TYPE_MEDIA); + player_set_display(impl->_player, PLAYER_DISPLAY_TYPE_EVAS, GET_DISPLAY(impl->_image)); + + if (_keepAspectRatioEnabled) + { + player_set_display_mode(impl->_player, PLAYER_DISPLAY_MODE_LETTER_BOX); + } + else + { + player_set_display_mode(impl->_player, PLAYER_DISPLAY_MODE_FULL_SCREEN); + } + player_set_display_visible(impl->_player, true); + + player_set_completed_cb(impl->_player, _player_completed_cb, this); + player_set_interrupted_cb(impl->_player, _player_interrupted_cb, this); + + player_prepare(impl->_player); + int ret = player_start(impl->_player); + if (ret == PLAYER_ERROR_NONE) + { + this->onPlayEvent((int)VideoPlayer::EventType::PLAYING); + } + } +} + +void VideoPlayer::pause() +{ + if (! _videoURL.empty()) + { + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + int ret = player_pause(impl->_player); + if (ret == PLAYER_ERROR_NONE) + { + this->onPlayEvent((int)VideoPlayer::EventType::PAUSED); + } + } +} + +void VideoPlayer::resume() +{ + if (! _videoURL.empty()) + { + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + int ret = player_start(impl->_player); + if (ret == PLAYER_ERROR_NONE) + { + this->onPlayEvent((int)VideoPlayer::EventType::PLAYING); + } + } +} + +void VideoPlayer::stop() +{ + if (! _videoURL.empty()) + { + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + int ret = player_stop(impl->_player); + if (ret == PLAYER_ERROR_NONE) + { + this->onPlayEvent((int)VideoPlayer::EventType::STOPPED); + } + } +} + +void VideoPlayer::seekTo(float sec) +{ + if (! _videoURL.empty()) + { + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + player_set_play_position(impl->_player, sec, false, NULL, NULL); + } +} + +bool VideoPlayer::isPlaying() const +{ + return _isPlaying; +} + +void VideoPlayer::setVisible(bool visible) +{ + cocos2d::ui::Widget::setVisible(visible); + + if (! _videoURL.empty()) + { + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + player_set_display_visible(impl->_player, visible); + } +} + +void VideoPlayer::addEventListener(const VideoPlayer::ccVideoPlayerCallback& callback) +{ + _eventCallback = callback; +} + +void VideoPlayer::onPlayEvent(int event) +{ + if (event == QUIT_FULLSCREEN) + { + _fullScreenEnabled = false; + } + else + { + VideoPlayer::EventType videoEvent = (VideoPlayer::EventType)event; + if (videoEvent == VideoPlayer::EventType::PLAYING) { + _isPlaying = true; + } else { + _isPlaying = false; + } + + if (_eventCallback) + { + _eventCallback(this,videoEvent); + } + } +} + +cocos2d::ui::Widget* VideoPlayer::createCloneInstance() +{ + return VideoPlayer::create(); +} + +void VideoPlayer::copySpecialProperties(Widget *widget) +{ + VideoPlayer* videoPlayer = dynamic_cast(widget); + if (videoPlayer) + { + _isPlaying = videoPlayer->_isPlaying; + _fullScreenEnabled = videoPlayer->_fullScreenEnabled; + _fullScreenDirty = videoPlayer->_fullScreenDirty; + _videoURL = videoPlayer->_videoURL; + _keepAspectRatioEnabled = videoPlayer->_keepAspectRatioEnabled; + _videoSource = videoPlayer->_videoSource; + _videoPlayerIndex = videoPlayer->_videoPlayerIndex; + _eventCallback = videoPlayer->_eventCallback; + _videoView = videoPlayer->_videoView; + } +} + +#endif diff --git a/cocos/ui/UIVideoPlayer.h b/cocos/ui/UIVideoPlayer.h index 16016fb118de..67a2dd625ef1 100644 --- a/cocos/ui/UIVideoPlayer.h +++ b/cocos/ui/UIVideoPlayer.h @@ -25,7 +25,7 @@ #ifndef __COCOS2D_UI_VIDEOWEIGTH_H_ #define __COCOS2D_UI_VIDEOWEIGTH_H_ -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_PLATFORM_OS_TVOS) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) && !defined(CC_PLATFORM_OS_TVOS) #include "ui/UIWidget.h" diff --git a/cocos/ui/UIWebView-inl.h b/cocos/ui/UIWebView-inl.h index 3c265e7d1023..d60a2f2a0f48 100644 --- a/cocos/ui/UIWebView-inl.h +++ b/cocos/ui/UIWebView-inl.h @@ -28,6 +28,7 @@ #include "platform/CCGLView.h" #include "base/CCDirector.h" #include "platform/CCFileUtils.h" +#include "ui/UIWebViewImpl-tizen.h" NS_CC_BEGIN namespace experimental{ diff --git a/cocos/ui/UIWebView.cpp b/cocos/ui/UIWebView.cpp index 62657952844a..af795785e058 100644 --- a/cocos/ui/UIWebView.cpp +++ b/cocos/ui/UIWebView.cpp @@ -23,7 +23,7 @@ ****************************************************************************/ #include "platform/CCPlatformConfig.h" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) #include "ui/UIWebViewImpl-android.h" #include "ui/UIWebView-inl.h" diff --git a/cocos/ui/UIWebView.h b/cocos/ui/UIWebView.h index 50b7d67b61a4..c63d0f100f08 100644 --- a/cocos/ui/UIWebView.h +++ b/cocos/ui/UIWebView.h @@ -27,7 +27,7 @@ #include "platform/CCPlatformConfig.h" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_PLATFORM_OS_TVOS) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) && !defined(CC_PLATFORM_OS_TVOS) #include "ui/UIWidget.h" diff --git a/cocos/ui/UIWebViewImpl-tizen.cpp b/cocos/ui/UIWebViewImpl-tizen.cpp new file mode 100644 index 000000000000..6792e7cf4b79 --- /dev/null +++ b/cocos/ui/UIWebViewImpl-tizen.cpp @@ -0,0 +1,162 @@ +/**************************************************************************** + Copyright (c) 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. + ****************************************************************************/ + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) + +#include "ui/UIWebViewImpl-tizen.h" + +#include +#include +#include + +#include "platform/tizen/CCApplication-tizen.h" +#include "ui/UIWebView.h" +#include "platform/CCGLView.h" +#include "base/CCDirector.h" +#include "platform/CCFileUtils.h" +#include "EWebKit.h" + +void JScallback(Evas_Object* o, const char* result_value, void* user_data) +{ +} + +namespace cocos2d { + namespace experimental { + namespace ui{ + + WebViewImpl::WebViewImpl(WebView *webView) : _webView(webView) { + Application* app = Application::getInstance(); + Evas *evas = evas_object_evas_get(app->_win); + _ewkView = ewk_view_add(evas); + } + + WebViewImpl::~WebViewImpl() { + evas_object_del(_ewkView); + } + + void WebViewImpl::loadData(const Data &data, const std::string &MIMEType, const std::string &encoding, const std::string &baseURL) { + const char* contents = nullptr; + size_t contents_size = 0; + char* mime_type = (char*)MIMEType.c_str(); + char* encode = (char*)encoding.c_str(); + char* base_uri = (char*)baseURL.c_str(); + ewk_view_contents_set(_ewkView, contents, contents_size, mime_type, encode, base_uri); + } + + void WebViewImpl::loadHTMLString(const std::string &string, const std::string &baseURL) { + + const char* contents = string.c_str(); + size_t contents_size = string.length(); + char* mime_type = (char*)baseURL.c_str(); + char* encoding = nullptr; + char* base_uri = nullptr;//(char*)baseURL.c_str(); + ewk_view_contents_set(_ewkView, contents, contents_size, mime_type, encoding, base_uri); + } + + void WebViewImpl::loadURL(const std::string &url) { + + const char* urlchar = url.c_str(); + ewk_view_url_set(_ewkView, urlchar); + } + + void WebViewImpl::loadFile(const std::string &fileName) { + auto fileUtiles = FileUtils::getInstance(); + auto fileFullPath = fileUtiles->fullPathForFilename(fileName); + auto contentsString = fileUtiles->getStringFromFile(fileFullPath); + loadHTMLString(contentsString, "text/html"); + } + + void WebViewImpl::stopLoading() { + ewk_view_stop(_ewkView); + } + + void WebViewImpl::reload() { + ewk_view_reload(_ewkView); + } + + bool WebViewImpl::canGoBack() { + return ewk_view_back_possible(_ewkView); + } + + bool WebViewImpl::canGoForward() { + return ewk_view_forward_possible(_ewkView); + } + + void WebViewImpl::goBack() { + ewk_view_back(_ewkView); + } + + void WebViewImpl::goForward() { + ewk_view_forward(_ewkView); + } + + void WebViewImpl::setJavascriptInterfaceScheme(const std::string &scheme) { + } + + void WebViewImpl::evaluateJS(const std::string &js) { + const char* script = js.c_str(); + Eina_Bool ret = ewk_view_script_execute(_ewkView, script, JScallback, this); + } + + void WebViewImpl::setScalesPageToFit(const bool scalesPageToFit) { + } + + void WebViewImpl::draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, int flags) { + if (flags & cocos2d::Node::FLAGS_TRANSFORM_DIRTY) { + auto directorInstance = cocos2d::Director::getInstance(); + auto glView = directorInstance->getOpenGLView(); + auto frameSize = glView->getFrameSize(); + + auto winSize = directorInstance->getWinSize(); + + auto leftBottom = this->_webView->convertToWorldSpace(cocos2d::Point::ZERO); + auto rightTop = this->_webView->convertToWorldSpace(cocos2d::Point(this->_webView->getContentSize().width,this->_webView->getContentSize().height)); + + auto uiLeft = frameSize.width / 2 + (leftBottom.x - winSize.width / 2 ) * glView->getScaleX(); + auto uiTop = frameSize.height /2 - (rightTop.y - winSize.height / 2) * glView->getScaleY(); + + Evas_Coord width = (rightTop.x - leftBottom.x) * glView->getScaleX(); + Evas_Coord height = (rightTop.y - leftBottom.y) * glView->getScaleY(); + + evas_object_resize(_ewkView, width, height); + evas_object_move(_ewkView, uiLeft, uiTop); + evas_object_show(_ewkView); + } + } + + void WebViewImpl::setVisible(bool visible) { + if (visible) + { + evas_object_show(_ewkView); + } + else + { + evas_object_hide(_ewkView); + } + } + } // namespace ui + } // namespace experimental +} //namespace cocos2d + +#endif // #if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) diff --git a/cocos/ui/UIWebViewImpl-tizen.h b/cocos/ui/UIWebViewImpl-tizen.h new file mode 100644 index 000000000000..0a58d1cfa052 --- /dev/null +++ b/cocos/ui/UIWebViewImpl-tizen.h @@ -0,0 +1,99 @@ +/**************************************************************************** + Copyright (c) 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 __COCOS2D__UI__WEBVIEWIMPL_TIZEN_H_ +#define __COCOS2D__UI__WEBVIEWIMPL_TIZEN_H_ + +#include "platform/CCPlatformConfig.h" + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) + +#include +#include "Evas.h" + +namespace cocos2d { + class Data; + class Renderer; + class Mat4; + + namespace experimental { + namespace ui{ + class WebView; + } + } +} + +namespace cocos2d { + namespace experimental { + namespace ui{ + + class WebViewImpl { + public: + WebViewImpl(cocos2d::experimental::ui::WebView *webView); + + virtual ~WebViewImpl(); + + void setJavascriptInterfaceScheme(const std::string &scheme); + + void loadData(const cocos2d::Data &data, const std::string &MIMEType, const std::string &encoding, const std::string &baseURL); + + void loadHTMLString(const std::string &string, const std::string &baseURL); + + void loadURL(const std::string &url); + + void loadFile(const std::string &fileName); + + void stopLoading(); + + void reload(); + + bool canGoBack(); + + bool canGoForward(); + + void goBack(); + + void goForward(); + + void evaluateJS(const std::string &js); + + void setScalesPageToFit(const bool scalesPageToFit); + + virtual void draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, int flags); + + virtual void setVisible(bool visible); + + Evas_Object* _ewkWin;; + Evas_Object* _ewkView; + private: + WebView *_webView; + }; + + } // namespace ui + } // namespace experimental +} //cocos2d + +#endif // #if (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) + +#endif /* __COCOS2D__UI__WEBVIEWIMPL_TIZEN_H_ */ diff --git a/extensions/Particle3D/PU/CCPUMaterialManager.cpp b/extensions/Particle3D/PU/CCPUMaterialManager.cpp index 8f0adeb92c69..2fb33bbea773 100644 --- a/extensions/Particle3D/PU/CCPUMaterialManager.cpp +++ b/extensions/Particle3D/PU/CCPUMaterialManager.cpp @@ -36,7 +36,7 @@ #include #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC) #include -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) #include #include #include @@ -161,7 +161,7 @@ bool PUMaterialCache::loadMaterialsFromSearchPaths( const std::string &fileFolde #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC) ftw(fileFolder.c_str(), iterPath, 500); -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) DIR *d; //dir handle struct dirent *file; //readdir struct stat statbuf; diff --git a/extensions/assets-manager/CCEventListenerAssetsManagerEx.cpp b/extensions/assets-manager/CCEventListenerAssetsManagerEx.cpp index 20c034876c79..210dd9c48c75 100644 --- a/extensions/assets-manager/CCEventListenerAssetsManagerEx.cpp +++ b/extensions/assets-manager/CCEventListenerAssetsManagerEx.cpp @@ -25,7 +25,7 @@ #include "CCEventListenerAssetsManagerEx.h" #include "CCEventAssetsManagerEx.h" #include "AssetsManagerEx.h" -#include "cocos2d.h" +#include "deprecated/CCString.h" NS_CC_EXT_BEGIN @@ -95,4 +95,4 @@ bool EventListenerAssetsManagerEx::checkAvailable() return ret; } -NS_CC_EXT_END \ No newline at end of file +NS_CC_EXT_END diff --git a/external/config.json b/external/config.json index 839299e5a75d..f21d3ff8edb9 100644 --- a/external/config.json +++ b/external/config.json @@ -1,6 +1,6 @@ { - "version":"v3-deps-91", - "zip_file_size":"124463259", + "version":"v3-deps-92", + "zip_file_size":"128440074", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", "move_dirs":{ diff --git a/templates/cpp-template-default/cocos-project-template.json b/templates/cpp-template-default/cocos-project-template.json index e5e3104fa380..12e64b517ac6 100644 --- a/templates/cpp-template-default/cocos-project-template.json +++ b/templates/cpp-template-default/cocos-project-template.json @@ -23,7 +23,8 @@ "proj.win10/PROJECT_NAME.sln", "proj.win10/App/PROJECT_NAME.vcxproj", "proj.win10/App/PROJECT_NAME.vcxproj.filters", - "proj.win10/App/PROJECT_NAME_TemporaryKey.pfx" + "proj.win10/App/PROJECT_NAME_TemporaryKey.pfx", + "proj.tizen/shared/res/PROJECT_NAME.png" ] }, "project_replace_project_name":{ @@ -57,7 +58,9 @@ "proj.win10/App/PROJECT_NAME.vcxproj", "proj.win10/App/PROJECT_NAME.vcxproj.filters", "proj.win10/App/Package.appxmanifest", - "CMakeLists.txt" + "CMakeLists.txt", + "proj.tizen/.project", + "proj.tizen/tizen-manifest.xml" ] }, "project_replace_package_name":{ @@ -65,7 +68,8 @@ "files":[ "proj.android/AndroidManifest.xml", "proj.android-studio/app/build.gradle", - "proj.android-studio/app/AndroidManifest.xml" + "proj.android-studio/app/AndroidManifest.xml", + "proj.tizen/tizen-manifest.xml" ] }, "project_replace_mac_bundleid": { diff --git a/templates/cpp-template-default/proj.tizen/.cproject b/templates/cpp-template-default/proj.tizen/.cproject new file mode 100644 index 000000000000..71b6342231c5 --- /dev/null +++ b/templates/cpp-template-default/proj.tizen/.cproject @@ -0,0 +1,793 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/cpp-template-default/proj.tizen/.exportMap b/templates/cpp-template-default/proj.tizen/.exportMap new file mode 100644 index 000000000000..43e310e053e2 --- /dev/null +++ b/templates/cpp-template-default/proj.tizen/.exportMap @@ -0,0 +1,4 @@ +{ + global: main; + local: *; +}; diff --git a/templates/cpp-template-default/proj.tizen/.gitignore b/templates/cpp-template-default/proj.tizen/.gitignore new file mode 100644 index 000000000000..70a41975ef9b --- /dev/null +++ b/templates/cpp-template-default/proj.tizen/.gitignore @@ -0,0 +1,7 @@ +/SA_Report +/.sign +/crash-info +.checkers +.sdk_delta.info + +/Emulator diff --git a/templates/cpp-template-default/proj.tizen/.project b/templates/cpp-template-default/proj.tizen/.project new file mode 100644 index 000000000000..721071c551bc --- /dev/null +++ b/templates/cpp-template-default/proj.tizen/.project @@ -0,0 +1,56 @@ + + + HelloCpp + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecore.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecore.apichecker.core.tizenCppNature + + + + Classes + 2 + PARENT-1-PROJECT_LOC/Classes + + + + + 0 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + + + Classes + $%7BPARENT-1-PROJECT_LOC%7D/Classes + + + diff --git a/templates/cpp-template-default/proj.tizen/.tproject b/templates/cpp-template-default/proj.tizen/.tproject new file mode 100644 index 000000000000..f1cc1fd7a086 --- /dev/null +++ b/templates/cpp-template-default/proj.tizen/.tproject @@ -0,0 +1,11 @@ + + + + + mobile-2.3 + + + + + + diff --git a/templates/cpp-template-default/proj.tizen/copy_resource.sh b/templates/cpp-template-default/proj.tizen/copy_resource.sh new file mode 100755 index 000000000000..9010488aeac9 --- /dev/null +++ b/templates/cpp-template-default/proj.tizen/copy_resource.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cp -r ../../Resources/* ../res/ diff --git a/templates/cpp-template-default/proj.tizen/res/.gitkeep b/templates/cpp-template-default/proj.tizen/res/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/templates/cpp-template-default/proj.tizen/shared/res/HelloCpp.png b/templates/cpp-template-default/proj.tizen/shared/res/HelloCpp.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b49ccbb1993e3e5eb1a3d6e6a690b79ddbee73 GIT binary patch literal 23871 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�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 literal 0 HcmV?d00001 diff --git a/templates/cpp-template-default/proj.tizen/src/main.cpp b/templates/cpp-template-default/proj.tizen/src/main.cpp new file mode 100644 index 000000000000..213595895ab4 --- /dev/null +++ b/templates/cpp-template-default/proj.tizen/src/main.cpp @@ -0,0 +1,17 @@ +#include "../../Classes/AppDelegate.h" + +#include +#include +#include +#include +#include + +USING_NS_CC; + +int main(int argc, char **argv) +{ + // create the application instance + AppDelegate app; + Application::getInstance()->setDeviceOrientation(APP_DEVICE_ORIENTATION_90); + return Application::getInstance()->run(); +} diff --git a/templates/cpp-template-default/proj.tizen/tizen-manifest.xml b/templates/cpp-template-default/proj.tizen/tizen-manifest.xml new file mode 100644 index 000000000000..3d89f420b9e9 --- /dev/null +++ b/templates/cpp-template-default/proj.tizen/tizen-manifest.xml @@ -0,0 +1,7 @@ + + + + + HelloCpp.png + + diff --git a/templates/lua-template-default/cocos-project-template.json b/templates/lua-template-default/cocos-project-template.json index ab7db1332774..82d58aeb04c3 100644 --- a/templates/lua-template-default/cocos-project-template.json +++ b/templates/lua-template-default/cocos-project-template.json @@ -156,7 +156,8 @@ "frameworks/runtime-src/proj.win32/PROJECT_NAME.vcxproj.filters", "frameworks/runtime-src/proj.win32/PROJECT_NAME.vcxproj.user", "frameworks/runtime-src/proj.win32/PROJECT_NAME.sln", - "frameworks/runtime-src/proj.ios_mac/PROJECT_NAME.xcodeproj" + "frameworks/runtime-src/proj.ios_mac/PROJECT_NAME.xcodeproj", + "frameworks/runtime-src/proj.tizen/shared/res/PROJECT_NAME.png" ] }, "project_replace_project_name": { @@ -178,7 +179,9 @@ "frameworks/runtime-src/proj.ios_mac/ios/main.m", "frameworks/runtime-src/proj.ios_mac/ios/Prefix.pch", "frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm", - "frameworks/runtime-src/proj.ios_mac/PROJECT_NAME.xcodeproj/project.pbxproj" + "frameworks/runtime-src/proj.ios_mac/PROJECT_NAME.xcodeproj/project.pbxproj", + "frameworks/runtime-src/proj.tizen/.project", + "frameworks/runtime-src/proj.tizen/tizen-manifest.xml" ] }, "project_replace_package_name": { @@ -186,7 +189,8 @@ "files": [ "frameworks/runtime-src/proj.android/AndroidManifest.xml", "frameworks/runtime-src/proj.android-studio/app/build.gradle", - "frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml" + "frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml", + "frameworks/runtime-src/proj.tizen/tizen-manifest.xml" ] }, "project_replace_mac_bundleid": { diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.cproject b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.cproject new file mode 100644 index 000000000000..0306af5f129b --- /dev/null +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.cproject @@ -0,0 +1,813 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.exportMap b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.exportMap new file mode 100644 index 000000000000..43e310e053e2 --- /dev/null +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.exportMap @@ -0,0 +1,4 @@ +{ + global: main; + local: *; +}; diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.gitignore b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.gitignore new file mode 100644 index 000000000000..3533c4378eb6 --- /dev/null +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.gitignore @@ -0,0 +1,4 @@ +/SA_Report +.sdk_delta.info +/.sign +/Emulator diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.project b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.project new file mode 100644 index 000000000000..eab7f781b1b8 --- /dev/null +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.project @@ -0,0 +1,50 @@ + + + HelloLua + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecore.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecore.apichecker.core.tizenCppNature + + + + Classes + 2 + PARENT-1-PROJECT_LOC/Classes + + + + + 1414577218136 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.tproject b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.tproject new file mode 100644 index 000000000000..f1cc1fd7a086 --- /dev/null +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.tproject @@ -0,0 +1,11 @@ + + + + + mobile-2.3 + + + + + + diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/copy_resource.sh b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/copy_resource.sh new file mode 100755 index 000000000000..b616a02ec901 --- /dev/null +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/copy_resource.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +cp -r ../../../../res/* ../res/ +cp -r ../../../../src/* ../res/src/ +mkdir -p ../res/src/cocos/ +cp -r ../../../cocos2d-x/cocos/scripting/lua-bindings/script/* ../res/src/cocos/ diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/res/.gitkeep b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/res/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/shared/res/HelloLua.png b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/shared/res/HelloLua.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b49ccbb1993e3e5eb1a3d6e6a690b79ddbee73 GIT binary patch literal 23871 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�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 literal 0 HcmV?d00001 diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/src/main.cpp b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/src/main.cpp new file mode 100644 index 000000000000..213595895ab4 --- /dev/null +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/src/main.cpp @@ -0,0 +1,17 @@ +#include "../../Classes/AppDelegate.h" + +#include +#include +#include +#include +#include + +USING_NS_CC; + +int main(int argc, char **argv) +{ + // create the application instance + AppDelegate app; + Application::getInstance()->setDeviceOrientation(APP_DEVICE_ORIENTATION_90); + return Application::getInstance()->run(); +} diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/tizen-manifest.xml b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/tizen-manifest.xml new file mode 100644 index 000000000000..34ab9ccb5ab2 --- /dev/null +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/tizen-manifest.xml @@ -0,0 +1,7 @@ + + + + HelloLua.png + + + diff --git a/tests/cpp-empty-test/proj.tizen/.cproject b/tests/cpp-empty-test/proj.tizen/.cproject new file mode 100644 index 000000000000..de91d797ec4e --- /dev/null +++ b/tests/cpp-empty-test/proj.tizen/.cproject @@ -0,0 +1,909 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/cpp-empty-test/proj.tizen/.exportMap b/tests/cpp-empty-test/proj.tizen/.exportMap new file mode 100644 index 000000000000..43e310e053e2 --- /dev/null +++ b/tests/cpp-empty-test/proj.tizen/.exportMap @@ -0,0 +1,4 @@ +{ + global: main; + local: *; +}; diff --git a/tests/cpp-empty-test/proj.tizen/.gitignore b/tests/cpp-empty-test/proj.tizen/.gitignore new file mode 100644 index 000000000000..70a41975ef9b --- /dev/null +++ b/tests/cpp-empty-test/proj.tizen/.gitignore @@ -0,0 +1,7 @@ +/SA_Report +/.sign +/crash-info +.checkers +.sdk_delta.info + +/Emulator diff --git a/tests/cpp-empty-test/proj.tizen/.project b/tests/cpp-empty-test/proj.tizen/.project new file mode 100644 index 000000000000..2da645e0d285 --- /dev/null +++ b/tests/cpp-empty-test/proj.tizen/.project @@ -0,0 +1,65 @@ + + + cpp-empty-test + + + + + + org.tizen.nativecore.apichecker.apicheckerbuilder + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecore.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecore.apichecker.core.tizenCppNature + org.tizen.nativecore.apichecker.apicheckernature + + + + Classes + 2 + PARENT-1-PROJECT_LOC/Classes + + + + + 1460537028087 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + 1460537028097 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + diff --git a/tests/cpp-empty-test/proj.tizen/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/tests/cpp-empty-test/proj.tizen/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 000000000000..f5d6957a56d3 --- /dev/null +++ b/tests/cpp-empty-test/proj.tizen/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,13 @@ +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/CPATH/delimiter=\: +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/CPATH/operation=remove +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/CPLUS_INCLUDE_PATH/delimiter=\: +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/C_INCLUDE_PATH/delimiter=\: +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/append=true +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/appendContributed=true +environment/buildEnvironmentLibrary/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/LIBRARY_PATH/delimiter=\: +environment/buildEnvironmentLibrary/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/append=true +environment/buildEnvironmentLibrary/org.tizen.nativecore.config.sbi.gcc45.app.debug.825230192/appendContributed=true diff --git a/tests/cpp-empty-test/proj.tizen/.tproject b/tests/cpp-empty-test/proj.tizen/.tproject new file mode 100644 index 000000000000..824eaa1748c9 --- /dev/null +++ b/tests/cpp-empty-test/proj.tizen/.tproject @@ -0,0 +1,12 @@ + + + + + mobile-2.4 + + + + + + + diff --git a/tests/cpp-empty-test/proj.tizen/copy_resource.sh b/tests/cpp-empty-test/proj.tizen/copy_resource.sh new file mode 100755 index 000000000000..9010488aeac9 --- /dev/null +++ b/tests/cpp-empty-test/proj.tizen/copy_resource.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cp -r ../../Resources/* ../res/ diff --git a/tests/cpp-empty-test/proj.tizen/res/.gitkeep b/tests/cpp-empty-test/proj.tizen/res/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/cpp-empty-test/proj.tizen/shared/res/cpp-empty-test.png b/tests/cpp-empty-test/proj.tizen/shared/res/cpp-empty-test.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b49ccbb1993e3e5eb1a3d6e6a690b79ddbee73 GIT binary patch literal 23871 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�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 literal 0 HcmV?d00001 diff --git a/tests/cpp-empty-test/proj.tizen/src/main.cpp b/tests/cpp-empty-test/proj.tizen/src/main.cpp new file mode 100644 index 000000000000..e4e664a7206f --- /dev/null +++ b/tests/cpp-empty-test/proj.tizen/src/main.cpp @@ -0,0 +1,20 @@ +#include "AppDelegate.h" + +#include +#include +#include +#include +#include + +USING_NS_CC; + +int main(int argc, char **argv) +{ + // create the application instance + AppDelegate app; +#ifdef TIZEN + Application::getInstance()->setMainArgs(argc, argv);//For Tizen 2.4, we need these two arguments. +#endif + Application::getInstance()->setDeviceOrientation(APP_DEVICE_ORIENTATION_90); + return Application::getInstance()->run(); +} diff --git a/tests/cpp-empty-test/proj.tizen/tizen-manifest.xml b/tests/cpp-empty-test/proj.tizen/tizen-manifest.xml new file mode 100644 index 000000000000..53eed9a4074b --- /dev/null +++ b/tests/cpp-empty-test/proj.tizen/tizen-manifest.xml @@ -0,0 +1,8 @@ + + + + + + cpp-empty-test.png + + diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.cpp index 88dfb0bfe67d..2823636d89a1 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.cpp @@ -41,7 +41,7 @@ bool SceneEditorTestBase::init() return true; } - + return false; } @@ -52,39 +52,52 @@ std::string SceneEditorTestBase::title() const void SceneEditorTestBase::changeLoadTypeCallback(cocos2d::Ref *pSender) { - _isCsbLoad = !_isCsbLoad; - _loadtypelb->setString(_loadtypeStr[(int)_isCsbLoad]); - loadFileChangeHelper(_filePath); - - if(_rootNode != nullptr) - { + _isCsbLoad = !_isCsbLoad; + _loadtypelb->setString(_loadtypeStr[(int)_isCsbLoad]); + loadFileChangeHelper(_filePath); + + if(_rootNode != nullptr) + { ActionManagerEx::getInstance()->releaseActions(); - this->removeChild(_rootNode); - _rootNode = SceneReader::getInstance()->createNodeWithSceneFile(_filePath.c_str()); - if (_rootNode == nullptr) - { - return ; - } - defaultPlay(); - this->addChild(_rootNode); - } + this->removeChild(_rootNode); + _rootNode = SceneReader::getInstance()->createNodeWithSceneFile(_filePath.c_str()); + if (_rootNode == nullptr) + { + return ; + } + defaultPlay(); + this->addChild(_rootNode); + } +} + +void SceneEditorTestBase::doCleanupOnExit() +{ + ArmatureDataManager::destroyInstance(); + // FIXME: Tizen will crash when call SceneReader::destroyInstance(); + // error msg: ERR<2453>:evas_main evas_font_dir.c:70 _evas_font_init_instance() ENTER:: evas_font_init + // ERR<2453>:evas_main evas_font_dir.c:90 evas_font_init() DONE:: evas_font_init +#if (CC_TARGET_PLATFORM != CC_PLATFORM_TIZEN) + SceneReader::destroyInstance(); +#endif + ActionManagerEx::destroyInstance(); + GUIReader::destroyInstance(); } void SceneEditorTestBase::loadFileChangeHelper(std::string& filePathName) { std::string::size_type n = filePathName.find_last_of("."); - if(n == std::string::npos) - return; - filePathName = filePathName.substr(0,n); - if(_isCsbLoad) - filePathName.append(".csb"); - else - filePathName.append(".json"); + if(n == std::string::npos) + return; + filePathName = filePathName.substr(0,n); + if(_isCsbLoad) + filePathName.append(".csb"); + else + filePathName.append(".json"); } LoadSceneEdtiorFileTest::LoadSceneEdtiorFileTest() { - + } LoadSceneEdtiorFileTest::~LoadSceneEdtiorFileTest() @@ -100,21 +113,18 @@ std::string LoadSceneEdtiorFileTest::title() const void LoadSceneEdtiorFileTest::onEnter() { SceneEditorTestBase::onEnter(); - do - { + do + { Node *root = createGameScene(); CC_BREAK_IF(!root); this->addChild(root, 0, 1); - } while (0); + } while (0); } void LoadSceneEdtiorFileTest::onExit() { - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); - SceneEditorTestBase::onExit(); + this->doCleanupOnExit(); + SceneEditorTestBase::onExit(); } @@ -123,22 +133,22 @@ cocos2d::Node* LoadSceneEdtiorFileTest::createGameScene() _filePath = "scenetest/LoadSceneEdtiorFileTest/FishJoy2.json"; //default is json _rootNode = SceneReader::getInstance()->createNodeWithSceneFile(_filePath.c_str()); ActionManagerEx::getInstance()->playActionByName("startMenu_1.json", "Animation1"); - if (_rootNode == nullptr) - { - return nullptr; - } - defaultPlay(); + if (_rootNode == nullptr) + { + return nullptr; + } + defaultPlay(); return _rootNode; } void LoadSceneEdtiorFileTest::defaultPlay() { - + } SpriteComponentTest::SpriteComponentTest() { - + } SpriteComponentTest::~SpriteComponentTest() @@ -154,33 +164,30 @@ std::string SpriteComponentTest::title() const void SpriteComponentTest::onEnter() { SceneEditorTestBase::onEnter(); - do - { + do + { Node *root = createGameScene(); CC_BREAK_IF(!root); this->addChild(root, 0, 1); - } while (0); + } while (0); } void SpriteComponentTest::onExit() { - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); - SceneEditorTestBase::onExit(); + this->doCleanupOnExit(); + SceneEditorTestBase::onExit(); } cocos2d::Node* SpriteComponentTest::createGameScene() { - _filePath = "scenetest/SpriteComponentTest/SpriteComponentTest.json"; + _filePath = "scenetest/SpriteComponentTest/SpriteComponentTest.json"; _rootNode = SceneReader::getInstance()->createNodeWithSceneFile(_filePath.c_str()); - if (_rootNode == nullptr) - { - return nullptr; - } + if (_rootNode == nullptr) + { + return nullptr; + } - defaultPlay(); + defaultPlay(); return _rootNode; } @@ -188,24 +195,24 @@ cocos2d::Node* SpriteComponentTest::createGameScene() void SpriteComponentTest::defaultPlay() { - ActionInterval* action1 = Blink::create(2, 10); - ActionInterval* action2 = Blink::create(2, 5); + ActionInterval* action1 = Blink::create(2, 10); + ActionInterval* action2 = Blink::create(2, 5); - ComRender *pSister1 = static_cast(_rootNode->getChildByTag(10003)->getComponent("CCSprite")); - pSister1->getNode()->runAction(action1); + ComRender *pSister1 = static_cast(_rootNode->getChildByTag(10003)->getComponent("CCSprite")); + pSister1->getNode()->runAction(action1); - ComRender *pSister2 = static_cast(_rootNode->getChildByTag(10004)->getComponent("CCSprite")); - pSister2->getNode()->runAction(action2); + ComRender *pSister2 = static_cast(_rootNode->getChildByTag(10004)->getComponent("CCSprite")); + pSister2->getNode()->runAction(action2); } ArmatureComponentTest::ArmatureComponentTest() { - + } ArmatureComponentTest::~ArmatureComponentTest() { - + } std::string ArmatureComponentTest::title() const @@ -216,48 +223,45 @@ std::string ArmatureComponentTest::title() const void ArmatureComponentTest::onEnter() { SceneEditorTestBase::onEnter(); - do - { + do + { Node *root = createGameScene(); CC_BREAK_IF(!root); this->addChild(root, 0, 1); - } while (0); + } while (0); } void ArmatureComponentTest::onExit() { - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); - SceneEditorTestBase::onExit(); + this->doCleanupOnExit(); + SceneEditorTestBase::onExit(); } cocos2d::Node* ArmatureComponentTest::createGameScene() { - _filePath = "scenetest/ArmatureComponentTest/ArmatureComponentTest.json"; + _filePath = "scenetest/ArmatureComponentTest/ArmatureComponentTest.json"; _rootNode = SceneReader::getInstance()->createNodeWithSceneFile(_filePath.c_str()); - if (_rootNode == nullptr) - { - return nullptr; - } - defaultPlay(); + if (_rootNode == nullptr) + { + return nullptr; + } + defaultPlay(); return _rootNode; } void ArmatureComponentTest::defaultPlay() { - ComRender *pBlowFish = static_cast(_rootNode->getChildByTag(10007)->getComponent("CCArmature")); - pBlowFish->getNode()->runAction(MoveBy::create(10.0f, Point(-1000.0f, 0))); + ComRender *pBlowFish = static_cast(_rootNode->getChildByTag(10007)->getComponent("CCArmature")); + pBlowFish->getNode()->runAction(MoveBy::create(10.0f, Point(-1000.0f, 0))); - ComRender *pButterflyfish = static_cast(_rootNode->getChildByTag(10008)->getComponent("CCArmature")); - pButterflyfish->getNode()->runAction(MoveBy::create(10.0f, Point(-1000.0f, 0))); + ComRender *pButterflyfish = static_cast(_rootNode->getChildByTag(10008)->getComponent("CCArmature")); + pButterflyfish->getNode()->runAction(MoveBy::create(10.0f, Point(-1000.0f, 0))); } UIComponentTest::UIComponentTest() { - + } UIComponentTest::~UIComponentTest() @@ -272,66 +276,63 @@ std::string UIComponentTest::title() const void UIComponentTest::onEnter() { SceneEditorTestBase::onEnter(); - do - { + do + { Node *root = createGameScene(); CC_BREAK_IF(!root); this->addChild(root, 0, 1); - } while (0); + } while (0); } void UIComponentTest::onExit() { - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); - SceneEditorTestBase::onExit(); + this->doCleanupOnExit(); + SceneEditorTestBase::onExit(); } cocos2d::Node* UIComponentTest::createGameScene() { - _filePath = "scenetest/UIComponentTest/UIComponentTest.json"; + _filePath = "scenetest/UIComponentTest/UIComponentTest.json"; _rootNode = SceneReader::getInstance()->createNodeWithSceneFile(_filePath.c_str()); - if (_rootNode == nullptr) - { - return nullptr; - } - defaultPlay(); + if (_rootNode == nullptr) + { + return nullptr; + } + defaultPlay(); return _rootNode; } void UIComponentTest::touchEvent(Ref *pSender, ui::Widget::TouchEventType type) { - switch (type) - { + switch (type) + { case ui::Widget::TouchEventType::BEGAN: - { - ComRender *pBlowFish = static_cast(_rootNode->getChildByTag(10010)->getComponent("CCArmature")); - pBlowFish->getNode()->runAction(MoveBy::create(10.0f, Vec2(-1000.0f, 0))); - - ComRender *pButterflyfish = static_cast(_rootNode->getChildByTag(10011)->getComponent("CCArmature")); - pButterflyfish->getNode()->runAction(MoveBy::create(10.0f, Vec2(-1000.0f, 0))); - } - break; - default: - break; - } + { + ComRender *pBlowFish = static_cast(_rootNode->getChildByTag(10010)->getComponent("CCArmature")); + pBlowFish->getNode()->runAction(MoveBy::create(10.0f, Vec2(-1000.0f, 0))); + + ComRender *pButterflyfish = static_cast(_rootNode->getChildByTag(10011)->getComponent("CCArmature")); + pButterflyfish->getNode()->runAction(MoveBy::create(10.0f, Vec2(-1000.0f, 0))); + } + break; + default: + break; + } } void UIComponentTest::defaultPlay() { ComRender *render = static_cast(_rootNode->getChildByTag(10025)->getComponent("GUIComponent")); - Widget* widget = static_cast(render->getNode()); - Button* button = static_cast(widget->getChildByName("Button_156")); + Widget* widget = static_cast(render->getNode()); + Button* button = static_cast(widget->getChildByName("Button_156")); button->addTouchEventListener(CC_CALLBACK_2(UIComponentTest::touchEvent, this)); } TmxMapComponentTest::TmxMapComponentTest() { - + } TmxMapComponentTest::~TmxMapComponentTest() @@ -347,54 +348,51 @@ std::string TmxMapComponentTest::title() const void TmxMapComponentTest::onEnter() { SceneEditorTestBase::onEnter(); - do - { + do + { Node *root = createGameScene(); CC_BREAK_IF(!root); this->addChild(root, 0, 1); - } while (0); + } while (0); } void TmxMapComponentTest::onExit() { - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); + this->doCleanupOnExit(); SceneEditorTestBase::onExit(); } cocos2d::Node* TmxMapComponentTest::createGameScene() { - _filePath = "scenetest/TmxMapComponentTest/TmxMapComponentTest.json"; + _filePath = "scenetest/TmxMapComponentTest/TmxMapComponentTest.json"; _rootNode = SceneReader::getInstance()->createNodeWithSceneFile(_filePath.c_str()); - if (_rootNode == nullptr) - { - return nullptr; - } + if (_rootNode == nullptr) + { + return nullptr; + } defaultPlay(); return _rootNode; } void TmxMapComponentTest::defaultPlay() { - ComRender *tmxMap = static_cast(_rootNode->getChildByTag(10015)->getComponent("CCTMXTiledMap")); - ActionInterval *actionTo = SkewTo::create(2, 0.f, 2.f); - ActionInterval *rotateTo = RotateTo::create(2, 61.0f); - ActionInterval *actionScaleTo = ScaleTo::create(2, -0.44f, 0.47f); + ComRender *tmxMap = static_cast(_rootNode->getChildByTag(10015)->getComponent("CCTMXTiledMap")); + ActionInterval *actionTo = SkewTo::create(2, 0.f, 2.f); + ActionInterval *rotateTo = RotateTo::create(2, 61.0f); + ActionInterval *actionScaleTo = ScaleTo::create(2, -0.44f, 0.47f); - ActionInterval *actionScaleToBack = ScaleTo::create(2, 1.0f, 1.0f); - ActionInterval *rotateToBack = RotateTo::create(2, 0); - ActionInterval *actionToBack = SkewTo::create(2, 0, 0); + ActionInterval *actionScaleToBack = ScaleTo::create(2, 1.0f, 1.0f); + ActionInterval *rotateToBack = RotateTo::create(2, 0); + ActionInterval *actionToBack = SkewTo::create(2, 0, 0); - tmxMap->getNode()->runAction(Sequence::create(actionTo, actionToBack, nullptr)); - tmxMap->getNode()->runAction(Sequence::create(rotateTo, rotateToBack, nullptr)); - tmxMap->getNode()->runAction(Sequence::create(actionScaleTo, actionScaleToBack, nullptr)); + tmxMap->getNode()->runAction(Sequence::create(actionTo, actionToBack, nullptr)); + tmxMap->getNode()->runAction(Sequence::create(rotateTo, rotateToBack, nullptr)); + tmxMap->getNode()->runAction(Sequence::create(actionScaleTo, actionScaleToBack, nullptr)); } ParticleComponentTest::ParticleComponentTest() { - + } ParticleComponentTest::~ParticleComponentTest() @@ -409,47 +407,44 @@ std::string ParticleComponentTest::title() const void ParticleComponentTest::onEnter() { SceneEditorTestBase::onEnter(); - do - { + do + { Node *root = createGameScene(); CC_BREAK_IF(!root); this->addChild(root, 0, 1); - } while (0); + } while (0); } void ParticleComponentTest::onExit() { - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); + this->doCleanupOnExit(); SceneEditorTestBase::onExit(); } cocos2d::Node* ParticleComponentTest::createGameScene() { - _filePath = "scenetest/ParticleComponentTest/ParticleComponentTest.json"; + _filePath = "scenetest/ParticleComponentTest/ParticleComponentTest.json"; _rootNode = SceneReader::getInstance()->createNodeWithSceneFile(_filePath.c_str()); - if (_rootNode == nullptr) - { - return nullptr; - } - defaultPlay(); + if (_rootNode == nullptr) + { + return nullptr; + } + defaultPlay(); return _rootNode; } void ParticleComponentTest::defaultPlay() { - ComRender* Particle = static_cast(_rootNode->getChildByTag(10020)->getComponent("CCParticleSystemQuad")); - ActionInterval* jump = JumpBy::create(5, Point(-500,0), 50, 4); - FiniteTimeAction* action = Sequence::create( jump, jump->reverse(), nullptr); - Particle->getNode()->runAction(action); + ComRender* Particle = static_cast(_rootNode->getChildByTag(10020)->getComponent("CCParticleSystemQuad")); + ActionInterval* jump = JumpBy::create(5, Point(-500,0), 50, 4); + FiniteTimeAction* action = Sequence::create( jump, jump->reverse(), nullptr); + Particle->getNode()->runAction(action); } EffectComponentTest::EffectComponentTest() { - + } EffectComponentTest::~EffectComponentTest() @@ -464,59 +459,56 @@ std::string EffectComponentTest::title() const void EffectComponentTest::onEnter() { SceneEditorTestBase::onEnter(); - do - { + do + { Node *root = createGameScene(); CC_BREAK_IF(!root); this->addChild(root, 0, 1); - } while (0); + } while (0); } void EffectComponentTest::onExit() { - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); + this->doCleanupOnExit(); SceneEditorTestBase::onExit(); } cocos2d::Node* EffectComponentTest::createGameScene() { - _filePath = "scenetest/EffectComponentTest/EffectComponentTest.json"; + _filePath = "scenetest/EffectComponentTest/EffectComponentTest.json"; _rootNode = SceneReader::getInstance()->createNodeWithSceneFile(_filePath.c_str()); - if (_rootNode == nullptr) - { - return nullptr; - } + if (_rootNode == nullptr) + { + return nullptr; + } defaultPlay(); - return _rootNode; + return _rootNode; } void EffectComponentTest::animationEvent(Armature *armature, MovementEventType movementType, const std::string& movementID) { - std::string id = movementID; + std::string id = movementID; - if (movementType == LOOP_COMPLETE) - { - if (id.compare("Fire") == 0) - { - ComAudio *pAudio = static_cast(_rootNode->getChildByTag(10015)->getComponent("CCComAudio")); - pAudio->playEffect(); - } - } + if (movementType == LOOP_COMPLETE) + { + if (id.compare("Fire") == 0) + { + ComAudio *pAudio = static_cast(_rootNode->getChildByTag(10015)->getComponent("CCComAudio")); + pAudio->playEffect(); + } + } } void EffectComponentTest::defaultPlay() { ComRender *render = static_cast(_rootNode->getChildByTag(10015)->getComponent("CCArmature")); - Armature *pAr = static_cast(render->getNode()); - pAr->getAnimation()->setMovementEventCallFunc(CC_CALLBACK_0(EffectComponentTest::animationEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + Armature *pAr = static_cast(render->getNode()); + pAr->getAnimation()->setMovementEventCallFunc(CC_CALLBACK_0(EffectComponentTest::animationEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); } BackgroundComponentTest::BackgroundComponentTest() { - + } BackgroundComponentTest::~BackgroundComponentTest() @@ -541,10 +533,7 @@ void BackgroundComponentTest::onEnter() void BackgroundComponentTest::onExit() { - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); + this->doCleanupOnExit(); SceneEditorTestBase::onExit(); } @@ -569,7 +558,7 @@ void BackgroundComponentTest::defaultPlay() AttributeComponentTest::AttributeComponentTest() { - + } AttributeComponentTest::~AttributeComponentTest() @@ -595,10 +584,7 @@ void AttributeComponentTest::onEnter() void AttributeComponentTest::onExit() { - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); + this->doCleanupOnExit(); SceneEditorTestBase::onExit(); } @@ -636,7 +622,7 @@ void AttributeComponentTest::defaultPlay() TriggerTest::TriggerTest() : _touchListener(nullptr) { - + } TriggerTest::~TriggerTest() @@ -675,10 +661,7 @@ void TriggerTest::onExit() auto dispatcher = Director::getInstance()->getEventDispatcher(); dispatcher->removeEventListener(_touchListener); Device::setAccelerometerEnabled(false); - ArmatureDataManager::destroyInstance(); - SceneReader::destroyInstance(); - ActionManagerEx::destroyInstance(); - GUIReader::destroyInstance(); + this->doCleanupOnExit(); SceneEditorTestBase::onExit(); } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.h b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.h index f59f8e2703eb..f2e5648fec00 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.h @@ -11,24 +11,25 @@ DEFINE_TEST_SUITE(CocoStudioSceneEditTests); class SceneEditorTestBase : public TestCase { public: - virtual bool init() override; + virtual bool init() override; - virtual std::string title() const override; + virtual std::string title() const override; protected: + void doCleanupOnExit(); cocos2d::MenuItemImage* restartItem; cocos2d::MenuItemImage* nextItem; cocos2d::MenuItemImage* backItem; protected: - virtual void changeLoadTypeCallback(cocos2d::Ref *pSender); - virtual void defaultPlay() = 0; // must to be overrided - void loadFileChangeHelper(std::string& filePathName ); // switch json& csb + virtual void changeLoadTypeCallback(cocos2d::Ref *pSender); + virtual void defaultPlay() = 0; // must to be overrided + void loadFileChangeHelper(std::string& filePathName ); // switch json& csb private: - bool _isCsbLoad; // default is false + bool _isCsbLoad; // default is false cocos2d::Label* _loadtypelb; - static const char* _loadtypeStr[2]; + static const char* _loadtypeStr[2]; protected: cocos2d::Node* _rootNode; @@ -40,15 +41,15 @@ class LoadSceneEdtiorFileTest : public SceneEditorTestBase public: CREATE_FUNC(LoadSceneEdtiorFileTest); - LoadSceneEdtiorFileTest(); - ~LoadSceneEdtiorFileTest(); + LoadSceneEdtiorFileTest(); + ~LoadSceneEdtiorFileTest(); virtual std::string title() const override; - virtual void onEnter() override; + virtual void onEnter() override; virtual void onExit() override; cocos2d::Node* createGameScene(); private: - void defaultPlay()override; + void defaultPlay()override; }; @@ -57,16 +58,16 @@ class SpriteComponentTest : public SceneEditorTestBase public: CREATE_FUNC(SpriteComponentTest); - SpriteComponentTest(); - ~SpriteComponentTest(); + SpriteComponentTest(); + ~SpriteComponentTest(); virtual std::string title() const override; - virtual void onEnter() override; + virtual void onEnter() override; virtual void onExit() override; cocos2d::Node* createGameScene(); private: - void defaultPlay()override; + void defaultPlay()override; }; class ArmatureComponentTest : public SceneEditorTestBase @@ -74,16 +75,16 @@ class ArmatureComponentTest : public SceneEditorTestBase public: CREATE_FUNC(ArmatureComponentTest); - ArmatureComponentTest(); - ~ArmatureComponentTest(); + ArmatureComponentTest(); + ~ArmatureComponentTest(); virtual std::string title() const override; - virtual void onEnter() override; + virtual void onEnter() override; virtual void onExit() override; cocos2d::Node* createGameScene(); private: - void defaultPlay()override; + void defaultPlay()override; }; class UIComponentTest : public SceneEditorTestBase @@ -91,16 +92,16 @@ class UIComponentTest : public SceneEditorTestBase public: CREATE_FUNC(UIComponentTest); - UIComponentTest(); - ~UIComponentTest(); + UIComponentTest(); + ~UIComponentTest(); virtual std::string title() const override; - virtual void onEnter() override; + virtual void onEnter() override; virtual void onExit() override; cocos2d::Node* createGameScene(); - void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type); + void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type); private: - void defaultPlay()override; + void defaultPlay()override; }; class TmxMapComponentTest : public SceneEditorTestBase @@ -108,15 +109,15 @@ class TmxMapComponentTest : public SceneEditorTestBase public: CREATE_FUNC(TmxMapComponentTest); - TmxMapComponentTest(); - ~TmxMapComponentTest(); + TmxMapComponentTest(); + ~TmxMapComponentTest(); virtual std::string title() const override; - virtual void onEnter() override; + virtual void onEnter() override; virtual void onExit() override; cocos2d::Node* createGameScene(); private: - void defaultPlay()override; + void defaultPlay()override; }; @@ -125,15 +126,15 @@ class ParticleComponentTest : public SceneEditorTestBase public: CREATE_FUNC(ParticleComponentTest); - ParticleComponentTest(); - ~ParticleComponentTest(); + ParticleComponentTest(); + ~ParticleComponentTest(); virtual std::string title() const override; - virtual void onEnter() override; + virtual void onEnter() override; virtual void onExit() override; cocos2d::Node* createGameScene(); protected: - void defaultPlay()override; + void defaultPlay()override; }; class EffectComponentTest : public SceneEditorTestBase @@ -141,17 +142,17 @@ class EffectComponentTest : public SceneEditorTestBase public: CREATE_FUNC(EffectComponentTest); - EffectComponentTest(); - ~EffectComponentTest(); + EffectComponentTest(); + ~EffectComponentTest(); virtual std::string title() const override; - virtual void onEnter() override; + virtual void onEnter() override; virtual void onExit() override; cocos2d::Node* createGameScene(); void animationEvent(cocostudio::Armature *armature, cocostudio::MovementEventType movementType, const std::string& movementID); private: - void defaultPlay()override; - + void defaultPlay()override; + }; class BackgroundComponentTest : public SceneEditorTestBase @@ -159,15 +160,15 @@ class BackgroundComponentTest : public SceneEditorTestBase public: CREATE_FUNC(BackgroundComponentTest); - BackgroundComponentTest(); - ~BackgroundComponentTest(); + BackgroundComponentTest(); + ~BackgroundComponentTest(); virtual std::string title() const override; - virtual void onEnter() override; + virtual void onEnter() override; virtual void onExit() override; cocos2d::Node* createGameScene(); private: - void defaultPlay()override; + void defaultPlay()override; }; class AttributeComponentTest : public SceneEditorTestBase @@ -175,17 +176,17 @@ class AttributeComponentTest : public SceneEditorTestBase public: CREATE_FUNC(AttributeComponentTest); - AttributeComponentTest(); - ~AttributeComponentTest(); + AttributeComponentTest(); + ~AttributeComponentTest(); virtual std::string title() const override; - virtual void onEnter() override; + virtual void onEnter() override; virtual void onExit() override; - bool initData(); + bool initData(); cocos2d::Node* createGameScene(); private: - void defaultPlay()override; + void defaultPlay()override; }; class TriggerTest : public SceneEditorTestBase @@ -193,21 +194,21 @@ class TriggerTest : public SceneEditorTestBase public: CREATE_FUNC(TriggerTest); - TriggerTest(); - ~TriggerTest(); + TriggerTest(); + ~TriggerTest(); virtual std::string title() const override; virtual void onEnter() override; virtual void onExit() override; - // default implements are used to call script callback if exist - virtual bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* unused_event); + // default implements are used to call script callback if exist + virtual bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* unused_event); virtual void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* unused_event); virtual void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* unused_event); virtual void onTouchCancelled(cocos2d::Touch* touch, cocos2d::Event* unused_event); - // update of game - void gameLogic(float dt); + // update of game + void gameLogic(float dt); // create scene cocos2d::Node* createGameScene(); diff --git a/tests/cpp-tests/Classes/JNITest/JNITest.cpp b/tests/cpp-tests/Classes/JNITest/JNITest.cpp index d9f68551323f..ed4aadc7ba83 100644 --- a/tests/cpp-tests/Classes/JNITest/JNITest.cpp +++ b/tests/cpp-tests/Classes/JNITest/JNITest.cpp @@ -1,4 +1,8 @@ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + #include "JNITest.h" + + #include "platform/android/jni/JniHelper.h" #include @@ -60,3 +64,5 @@ JNITest::JNITest() // should not compile // JniHelper::callStaticVoidMethod(classPath, "voidMethod4", std::vector()); } + +#endif diff --git a/tests/cpp-tests/Classes/JNITest/JNITest.h b/tests/cpp-tests/Classes/JNITest/JNITest.h index 041559910645..ecfcde6bcdbb 100644 --- a/tests/cpp-tests/Classes/JNITest/JNITest.h +++ b/tests/cpp-tests/Classes/JNITest/JNITest.h @@ -1,6 +1,8 @@ #ifndef _JNI_TEST_H_ #define _JNI_TEST_H_ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + #include "cocos2d.h" #include "../BaseTest.h" @@ -13,5 +15,5 @@ class JNITest : public TestCase JNITest(); }; - +#endif #endif // _JNI_TEST_H_ diff --git a/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp b/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp index ce8cdab05975..acecb2ce3e97 100644 --- a/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp +++ b/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp @@ -13,7 +13,10 @@ SpritePolygonTest::SpritePolygonTest() ADD_TEST_CASE(SpritePolygonTest5); ADD_TEST_CASE(SpritePolygonPerformanceTestDynamic); ADD_TEST_CASE(SpritePerformanceTestDynamic); + // FIXME: Tizen will crash with this example +#if (CC_TARGET_PLATFORM != CC_PLATFORM_TIZEN) ADD_TEST_CASE(SpritePolygonTestNoCrash); +#endif ADD_TEST_CASE(SpritePolygonTestTPIsland); ADD_TEST_CASE(SpritePolygonTestAutoPolyIsland); ADD_TEST_CASE(SpritePolygonTestFrameAnim); @@ -115,6 +118,7 @@ void SpritePolygonTestCase::updateDrawNode() bool SpritePolygonTestDemo::init() { if (SpritePolygonTestCase::init()) { + _polygonSprite = nullptr; initSprites(); initTouches(); return true; @@ -124,18 +128,20 @@ bool SpritePolygonTestDemo::init() void SpritePolygonTestDemo::initTouches() { - auto touchListener = EventListenerTouchOneByOne::create(); - touchListener->onTouchBegan = [&](Touch* touch, Event* event){ - return true; - }; - touchListener->onTouchMoved = [&](Touch* touch, Event* event){ - auto pos = touch->getDelta(); - float newScale = clampf(_polygonSprite->getScale() + pos.x * 0.01f, 0.1f, 2.f); - _polygonSprite->setScale(newScale); - _normalSprite->setScale(newScale); - updateDrawNode(); - }; - _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); + if(_polygonSprite) { + auto touchListener = EventListenerTouchOneByOne::create(); + touchListener->onTouchBegan = [&](Touch* touch, Event* event){ + return true; + }; + touchListener->onTouchMoved = [&](Touch* touch, Event* event){ + auto pos = touch->getDelta(); + float newScale = clampf(_polygonSprite->getScale() + pos.x * 0.01f, 0.1f, 2.f); + _polygonSprite->setScale(newScale); + _normalSprite->setScale(newScale); + updateDrawNode(); + }; + _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); + } } SpritePolygonTest1::SpritePolygonTest1() diff --git a/tests/cpp-tests/proj.tizen/.cproject b/tests/cpp-tests/proj.tizen/.cproject new file mode 100644 index 000000000000..22518ceb463d --- /dev/null +++ b/tests/cpp-tests/proj.tizen/.cproject @@ -0,0 +1,1274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/cpp-tests/proj.tizen/.exportMap b/tests/cpp-tests/proj.tizen/.exportMap new file mode 100644 index 000000000000..43e310e053e2 --- /dev/null +++ b/tests/cpp-tests/proj.tizen/.exportMap @@ -0,0 +1,4 @@ +{ + global: main; + local: *; +}; diff --git a/tests/cpp-tests/proj.tizen/.gitignore b/tests/cpp-tests/proj.tizen/.gitignore new file mode 100644 index 000000000000..70a41975ef9b --- /dev/null +++ b/tests/cpp-tests/proj.tizen/.gitignore @@ -0,0 +1,7 @@ +/SA_Report +/.sign +/crash-info +.checkers +.sdk_delta.info + +/Emulator diff --git a/tests/cpp-tests/proj.tizen/.project b/tests/cpp-tests/proj.tizen/.project new file mode 100644 index 000000000000..485400cb3643 --- /dev/null +++ b/tests/cpp-tests/proj.tizen/.project @@ -0,0 +1,62 @@ + + + cpp-tests + + + + + + org.tizen.nativecore.apichecker.apicheckerbuilder + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecore.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecore.apichecker.core.tizenCppNature + org.tizen.nativecore.apichecker.apicheckernature + + + + Classes + 2 + PARENT-1-PROJECT_LOC/Classes + + + res/Resources + 2 + PARENT-1-PROJECT_LOC/Resources + + + + + 1422330880115 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + diff --git a/tests/cpp-tests/proj.tizen/.tproject b/tests/cpp-tests/proj.tizen/.tproject new file mode 100644 index 000000000000..824eaa1748c9 --- /dev/null +++ b/tests/cpp-tests/proj.tizen/.tproject @@ -0,0 +1,12 @@ + + + + + mobile-2.4 + + + + + + + diff --git a/tests/cpp-tests/proj.tizen/copy_resource.sh b/tests/cpp-tests/proj.tizen/copy_resource.sh new file mode 100755 index 000000000000..9010488aeac9 --- /dev/null +++ b/tests/cpp-tests/proj.tizen/copy_resource.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cp -r ../../Resources/* ../res/ diff --git a/tests/cpp-tests/proj.tizen/res/.gitkeep b/tests/cpp-tests/proj.tizen/res/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/cpp-tests/proj.tizen/shared/res/cpp-tests.png b/tests/cpp-tests/proj.tizen/shared/res/cpp-tests.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b49ccbb1993e3e5eb1a3d6e6a690b79ddbee73 GIT binary patch literal 23871 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�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 literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/proj.tizen/src/main.cpp b/tests/cpp-tests/proj.tizen/src/main.cpp new file mode 100644 index 000000000000..1584980efed5 --- /dev/null +++ b/tests/cpp-tests/proj.tizen/src/main.cpp @@ -0,0 +1,22 @@ +#include "../../Classes/AppDelegate.h" + +#include +#include +#include +#include +#include + +USING_NS_CC; + +int main(int argc, char **argv) +{ + // create the application instance + AppDelegate app; + +#ifdef TIZEN + Application::getInstance()->setMainArgs(argc, argv);//For Tizen 2.4, we need these two arguments. +#endif + Application::getInstance()->setDeviceOrientation(APP_DEVICE_ORIENTATION_90); + + return Application::getInstance()->run(); +} diff --git a/tests/cpp-tests/proj.tizen/tizen-manifest.xml b/tests/cpp-tests/proj.tizen/tizen-manifest.xml new file mode 100644 index 000000000000..3b941f7cc660 --- /dev/null +++ b/tests/cpp-tests/proj.tizen/tizen-manifest.xml @@ -0,0 +1,13 @@ + + + + + cpp-tests.png + + + http://tizen.org/privilege/mediastorage + http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/internet + http://tizen.org/privilege/camera + + diff --git a/tests/lua-empty-test/project/proj.tizen/.cproject b/tests/lua-empty-test/project/proj.tizen/.cproject new file mode 100644 index 000000000000..9bc9e2e97e0b --- /dev/null +++ b/tests/lua-empty-test/project/proj.tizen/.cproject @@ -0,0 +1,958 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/lua-empty-test/project/proj.tizen/.exportMap b/tests/lua-empty-test/project/proj.tizen/.exportMap new file mode 100644 index 000000000000..43e310e053e2 --- /dev/null +++ b/tests/lua-empty-test/project/proj.tizen/.exportMap @@ -0,0 +1,4 @@ +{ + global: main; + local: *; +}; diff --git a/tests/lua-empty-test/project/proj.tizen/.gitignore b/tests/lua-empty-test/project/proj.tizen/.gitignore new file mode 100644 index 000000000000..c4f915d7b25c --- /dev/null +++ b/tests/lua-empty-test/project/proj.tizen/.gitignore @@ -0,0 +1,8 @@ +/SA_Report +/.sign +/crash-info +.checkers +.sdk_delta.info + +/Emulator +/Debug diff --git a/tests/lua-empty-test/project/proj.tizen/.project b/tests/lua-empty-test/project/proj.tizen/.project new file mode 100644 index 000000000000..a9e5a976ac3b --- /dev/null +++ b/tests/lua-empty-test/project/proj.tizen/.project @@ -0,0 +1,50 @@ + + + lua-empty-test + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecore.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecore.apichecker.core.tizenCppNature + + + + Classes + 2 + PARENT-1-PROJECT_LOC/Classes + + + + + 1426053993877 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + diff --git a/tests/lua-empty-test/project/proj.tizen/.tproject b/tests/lua-empty-test/project/proj.tizen/.tproject new file mode 100644 index 000000000000..824eaa1748c9 --- /dev/null +++ b/tests/lua-empty-test/project/proj.tizen/.tproject @@ -0,0 +1,12 @@ + + + + + mobile-2.4 + + + + + + + diff --git a/tests/lua-empty-test/project/proj.tizen/copy_resource.sh b/tests/lua-empty-test/project/proj.tizen/copy_resource.sh new file mode 100755 index 000000000000..587a01789982 --- /dev/null +++ b/tests/lua-empty-test/project/proj.tizen/copy_resource.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +cp -r ../../../res/* ../res/ +cp -r ../../../src/* ../res/src/ +mkdir -p ../res/src/cocos/ +cp -r ../../../../../cocos/scripting/lua-bindings/script/* ../res/src/cocos/ + diff --git a/tests/lua-empty-test/project/proj.tizen/res/.gitignore b/tests/lua-empty-test/project/proj.tizen/res/.gitignore new file mode 100644 index 000000000000..1d65afe3660c --- /dev/null +++ b/tests/lua-empty-test/project/proj.tizen/res/.gitignore @@ -0,0 +1,2 @@ +#Do now ignore Marmalade icf files +!*.icf diff --git a/tests/lua-empty-test/project/proj.tizen/res/.gitkeep b/tests/lua-empty-test/project/proj.tizen/res/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/lua-empty-test/project/proj.tizen/shared/res/lua-empty-test.png b/tests/lua-empty-test/project/proj.tizen/shared/res/lua-empty-test.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b49ccbb1993e3e5eb1a3d6e6a690b79ddbee73 GIT binary patch literal 23871 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�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 literal 0 HcmV?d00001 diff --git a/tests/lua-empty-test/project/proj.tizen/src/main.cpp b/tests/lua-empty-test/project/proj.tizen/src/main.cpp new file mode 100644 index 000000000000..f181cc20146a --- /dev/null +++ b/tests/lua-empty-test/project/proj.tizen/src/main.cpp @@ -0,0 +1,20 @@ +#include "../../Classes/AppDelegate.h" + +#include +#include +#include +#include +#include + +USING_NS_CC; + +int main(int argc, char **argv) +{ + // create the application instance + AppDelegate app; +#ifdef TIZEN + Application::getInstance()->setMainArgs(argc, argv);//For Tizen 2.4, we need these two arguments. +#endif + Application::getInstance()->setDeviceOrientation(APP_DEVICE_ORIENTATION_90); + return Application::getInstance()->run(); +} diff --git a/tests/lua-empty-test/project/proj.tizen/tizen-manifest.xml b/tests/lua-empty-test/project/proj.tizen/tizen-manifest.xml new file mode 100644 index 000000000000..e6f195a4b636 --- /dev/null +++ b/tests/lua-empty-test/project/proj.tizen/tizen-manifest.xml @@ -0,0 +1,8 @@ + + + + + + lua-empty-test.png + + diff --git a/tests/lua-tests/project/proj.tizen/.cproject b/tests/lua-tests/project/proj.tizen/.cproject new file mode 100644 index 000000000000..0c8aee581f72 --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/.cproject @@ -0,0 +1,934 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/lua-tests/project/proj.tizen/.exportMap b/tests/lua-tests/project/proj.tizen/.exportMap new file mode 100644 index 000000000000..43e310e053e2 --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/.exportMap @@ -0,0 +1,4 @@ +{ + global: main; + local: *; +}; diff --git a/tests/lua-tests/project/proj.tizen/.gitignore b/tests/lua-tests/project/proj.tizen/.gitignore new file mode 100644 index 000000000000..c4f915d7b25c --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/.gitignore @@ -0,0 +1,8 @@ +/SA_Report +/.sign +/crash-info +.checkers +.sdk_delta.info + +/Emulator +/Debug diff --git a/tests/lua-tests/project/proj.tizen/.project b/tests/lua-tests/project/proj.tizen/.project new file mode 100644 index 000000000000..18ba69daedd9 --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/.project @@ -0,0 +1,50 @@ + + + lua-tests + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecore.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecore.apichecker.core.tizenCppNature + + + + Classes + 2 + PARENT-1-PROJECT_LOC/Classes + + + + + 1426055470782 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + diff --git a/tests/lua-tests/project/proj.tizen/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/tests/lua-tests/project/proj.tizen/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 000000000000..bc781cf60e12 --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,13 @@ +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/CPATH/delimiter=\: +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/CPATH/operation=remove +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/CPLUS_INCLUDE_PATH/delimiter=\: +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/C_INCLUDE_PATH/delimiter=\: +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/append=true +environment/buildEnvironmentInclude/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/appendContributed=true +environment/buildEnvironmentLibrary/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/LIBRARY_PATH/delimiter=\: +environment/buildEnvironmentLibrary/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/append=true +environment/buildEnvironmentLibrary/org.tizen.nativecore.config.sbi.gcc45.app.debug.309623021/appendContributed=true diff --git a/tests/lua-tests/project/proj.tizen/.tproject b/tests/lua-tests/project/proj.tizen/.tproject new file mode 100644 index 000000000000..824eaa1748c9 --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/.tproject @@ -0,0 +1,12 @@ + + + + + mobile-2.4 + + + + + + + diff --git a/tests/lua-tests/project/proj.tizen/copy_resource.sh b/tests/lua-tests/project/proj.tizen/copy_resource.sh new file mode 100755 index 000000000000..c48ef410a4ce --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/copy_resource.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +cp -r ../../../res/* ../res/ +mkdir -p ../res/src/ +cp -r ../../../src/* ../res/src/ +mkdir -p ../res/src/cocos/ +cp -r ../../../../../cocos/scripting/lua-bindings/script/* ../res/src/cocos/ +cp -r ../../../../cpp-tests/Resources/* ../res/ + diff --git a/tests/lua-tests/project/proj.tizen/res/.gitignore b/tests/lua-tests/project/proj.tizen/res/.gitignore new file mode 100644 index 000000000000..1d65afe3660c --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/res/.gitignore @@ -0,0 +1,2 @@ +#Do now ignore Marmalade icf files +!*.icf diff --git a/tests/lua-tests/project/proj.tizen/res/.gitkeep b/tests/lua-tests/project/proj.tizen/res/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/lua-tests/project/proj.tizen/shared/res/lua-tests.png b/tests/lua-tests/project/proj.tizen/shared/res/lua-tests.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b49ccbb1993e3e5eb1a3d6e6a690b79ddbee73 GIT binary patch literal 23871 zcmX6^dpy(M|KEkpWsHaoxhLf|mvU#wEpn^eW3CZJa?5R-%iQnEwM+u#~dU7d)Oe% zS55B=-{^Ct*M{TAR<(U+ZTH z4C`+%ueJdIz3!b0fmT`;od=RupZTlO{;5hn?UqhMnxqyhU9#y6@yv3We^MSR@YA+` z)mzl1bGGct&rgBMdnu98gd8c)PSZ|Sq^s4_l%RA+Rr8|$lN&B~0#%ZWxdCa??>IGH zM)H=X6m`P6LwPqs0KrvFN*W8C0>SkxvqsHTRlZxzcQ!yD6fLrE-@NsO7#*ULuK~hW z=;z<>oqzjR@$9D>OScPv^c!?}`po0{AV_^-$c;- zq8{!s5Aei2n~9yNqlE-G>ujmuQ>`}|d*!UhN3VlZ_j3m_k3<$vAS`dNA0X2MW&_xV zZ~$rG$zJeDA}|y$fdbo;1T;YEb)bDbhKG9uB#;9AgoCRXD2~B6(7a=;yYZK7z{>_w ze!w$ms0NoJu5VhaiG2+R#js=~EMg$7z%3pY4+)iv_<4zIW}GUxesPF5yxBm{Mx3A9 z*ys)q{DfiikU%xtxukOy&egn!0$Qxsajy-*L%M$aCGl}dlN2_~_?kMEmt4XW*ckgR zAz|ixut*tXk#s<{Y687Z$R_`zvhHieKt=K8l(%f?6gDnfBN#7aHhy1%*G#^{^n!Sj znWkNGgZOnbr4UY}!PDFbSy)>9<4TzAJ6Y?iY-vfCjBcS%R-Uspwf$EuI;=1(dlRz5 ze%VB>f@|o4pVIcZP!TP@>o`SIb>gp~!l8(vxg~W3j6nEGcJ$Cuo+)DK*RoVz06aZ; zS5y^;r1X2falH2uIKsV>?BmHg23n0 zN9sr?K(eqY)zLu5s?|{Bbeq(toNaT(Dzm(thWyaP&_|)!+i8|E0r{ss@p=RAooUXE z$)y$1?BgXpq-Rc(AB@S`p8l$+EW2TNLaFBTU+HFh71Mgx&8m5>PyT0H3*Hr^^Iy4{ zaP|K1*&2@;C;zmDnuhYw`p`F_`PFkyvrzsxyZOL)b$$|D{~lrB{tbO7AO=% zeLnqJf>Rg6Y{4|eMP-f{k8fV-ll$RmrECnEgs(=vKk`ztryBF z-Er=4s`oPQ%Ojt@8vv8$Vai&w0{XcG4mK{`P&){gJb$?3b^UT(h^`wXwQ3SsP<}&pGMoY;_*d?rDg< z&!zj1Z`OXkrf@~~*j_w<@bFtI#UT>g|Bh z_4?Ndw@Yq6T)U;4A!?*#yN;W@9P2n`sPEQ(i9rAcV*E+xH87|;{*S{^XM_BIfAcWP ztH}2tc)Xpd=Ka#!BRg14SxS2I^iJZ&?K!tOYZ(C0S9Rk!nt>0(A z)A!b&B`%OctM5k6R?qZ?2L_h~f4h4rSZiUs<7a2_`ox0HqUT)w{2AL#>F|2kbI-cr+55%YgC0sgN)H?=NBcQmoLq6(j?8aOXqEd| zzQ1%tjr|bgF?F&nI!5gEu=6LEpEFQeD{XgQcXM>ZdW)e4;F}h+IZ0I;QbVcNsi&Oa zKRL|5Ei!|oL_T^%rX*e=E&8z3^AIr}1t_R&#-9NkjrIw~eq$p*VFMJ4=YgXdZ;k$Wa;l%NY zY-vU5q|=Qub9t5d)*IfDsjZLr?-#r*z+X)mjvvldD{c7buNo5+XQWloCiC$M`sA_Y z4trRVOHw6r7kLdCq-vyU?Q4ExqyDgd=WT?y^?cJ}%t!9Vtj5>c4hj)>*OsE5?KBD# zxs-)JsNW3ipVDaiaA*smKc&5SCF)YjDb2CZO8FJ| z{zstct;O5xQyy(zj4bP<)s6sT8RI|3VrfoYqirh3&u3pGJ$$2mWFc?Cz1Fch`%h^6 zU)_;kO{l-s-!aiC-G4sY^&R!2(UrSy3hwr9Z?o&Hn}Vu3o;|+XzCgczq<^*BVX`LV z_03oI&nInlBXF@8DshhdKRTqnTVB zT*h2t+0?8I5iXta?|whV#;S&|euJrVmOjfe7Hv7mTv30hKu~CW)iCmSZn}xO|2C+y z{gl>B?BgTpIq$v*=c#M&ZO1u&RqU?r7H92e@K@xl!Xkc#H^v5SALo9*`Rv6& z@1wJt78<44@EO;E=ATY*o76yc&1lS$k!@SuWhc z%Du5UYFTK`xhJe|@9sq+R#YQ@dvdQA*mD20rKIj0q7R;^bPt?lht=eCs z>n~eXQT!^Q5gH+p^NL4n^B=3CmDX=elw<4uN*sF3NY$AB$-XZ-dR)EdwUY9ux7c>{ zYugzEYtf81-H#Xr^zX?Vv}g0r{_s8L%gp!9fA(zR*=;?S<3QTI<*kFi@#Rmjuj49? zW?S4vuzyRP&a2Y%7$GyGvksfJS*>onAEHOFyBnqR>RWe{g8od2#`Z*x9_g(fcg8G0 zSCiASqr_VD?qQ>va$4)C!h4BZN1tYEKQoyn%MF9e1^~dDte7L)eCB&`FEhK#06^4f z005T&030xw<6i(E3I-$pM8MObwc(o`0n=r(p*i5#xS%IG_@Rw6kh{2A23i^t`M^#Bbr=aZ)eqB z_CXLorJS*XWT^H-)AU$A(+x%;Jm?JA5SsVkD9L~}a2J9x#O!ZneL2uqbpe7o-=3yS zO?AL5`(ZFF19+b} zDI8J6l7twmnn%#V=`}Olq|-m9+A$1OmHJ>+6;&tt(Ux`Afqo?kYtpUf-3S17%C8E2 z8HiaQ5ktx-6ByVysH(C`BOuIQ6&JEnu202@RGA|kAJ(B_G-C^9D9cH(m)}BQFHhK^ zm7mU(=X=}%rTL|}AK-EW`Zwp)<<@@%-C&ud(WIz{a$q#zO)%~7AbSQ{M?c>9eyB}h zoWsPvfDC*mO=$Z`3FH>wGYz;QzKXXAN~U|D9ky zfc!?sjeL>pXCOi}+8OsY$~PDw8+i~5&s$s1&UUP!&@6*~eACz4D+2PP5ti`gbr&xg z_EMhY$y~8^(HhYvIzguX+jJsK)w%*ZXkFrI zJ1htQN^#P8Rj{#$^^Nf5&I-l6{^PU16-`}qEszu%ySu-WFthj86gH*w&|{x*EKC^` zE=07sw~zpVF{nBYcGbF+6r)+hM2nY58!v2ITGjykLZO0z#m0Jhd+Gsr(EXlHJMmch zaSi01K_;DX)T1VSMS+JNwTYWq*#HO6w2MtD$AC@tYpunQxZi9L0b6B=jMZAj6|Gzs zR|fbfdqL)_xx>aq=N51>T|x68LZ_UrCSQ3jzAq)fG7i&77bKfXEc=zlc~ z*Z<osMk z>8j#swFa7^TxUHQt#Msc)J zQy*{a@9uInojcs2ic;Q7MI*+psv*ao{E^VSR~_*rM-m~9!||3~;W+mKX=?%?ZP~%7 zB41K2a+R1t!k~`iu%-3ILB!;%vO%h^J)F7L9Qz0X12uV`SFe)rs7(*74y}7~ydjmq zk@E$x$~P4iTs||{5`hV0;F^(Fy;a%Mm4kcblu`9}VE@ca(lGx;VAdyy2}&NyNDfsX z9bbg72n)1K`!_QZB=eBPPWU_2?3u-n!muFwey{zeTU<>(86wK%`dD8cetvK2<|fE= z*Bt|1p(H?IpKm^g>5x(wEW?bofm6Lh+Ne=RQylNaAI~c`z8H{+%AC!uNC{&U8lcQ+ zd?Q|}i1!u@{=|>)XOdyIag3c#yJeFLD=DQ%9m-Pr%wNIWamK3*rSj=4ufz|31?%2) zefjc*=hUe$B-k(o`Z8G`e0Sr$LoH(X+Eql=zg5H}NZ4ITR2MYb$I!!i@5lWS0ZYNf zz@-K9b;4ce=cSliTa-lRrImA@em-5itFPuIWvV7r&g&Nby{5Sz6h3tWQ`J^7@tHce z%!*mrgM-i1SE)H)e$*)s`}_o~B$bN_dyni`e-MJ~-G+D%C)i`jzi%mtnO}8-On4_cI~8ySvkmi;_!|XVyNpOw$$FsNf^gz`($CFZ3_# z$sd+X5E*oD#q4h!o=MGHT>@ic0L)DpPwJ9zf3cK=HIXPFb)n5n5U;FEF0IQ>s7}XtsdN$gJH2W41kM9YmMa^Tg7-{9PE5B3p1zkcwtP)fnh7s ze_;6L7<37NI(#SHz~udO%utMSK1h$1EViyRXd zuzdix(hHq{|6-T$Orr5|uF0FBWv}@O&H$gv;l5xzqq?}LW1^pp<0|GWEso4j82zq= zq{l_Uvt6-REaC7lDtL_s$RM7Svqy<&hi6DADrQNXKF#VX|DvWwxs_$4nK+@qJXUqV zt2Yvs=ij4a+uN`=Fu)6K`}ik`MUCev)}k2Y_GtA^_4YWB%V;5qONkp}nps#F^;G>KT|aH(9WUhCt62<1 ze%Jqm zVcptsPm3ATBIDn_bzoQmffUkQPc~A~t+jW0X{i(A=f@@p{S(Uc=OEXvT`TBi1=`!& z*J&szDN&S&r3}1`D30A&z)}53`i!c^ReKc_c*SSP?`OH7HFEN0Sr65tCo1>|thT7d z|NqBYB`)M-7VB;%gt_<+TDg~=>++2nw~3wTx{#ZRvYEyUX_muRF_F5J$umqe0tblT zojcE;KR+EMFyeQ3e56hxCqR*FQ|*I8BO{R8t`aXjSxlv?Cw)3Sm8#2Wd}Gi!c*fNs z9(KMuE8n;+0$$iLB3)YpMPoIgR=&MK+UjR8cQ(842GWtqBsG3CRQMlG5eLWsAWIg8 zz<>?Kp>87kQ(X5{44)u!S3LdPi*wm)`VvJps(r;xJ_Sd-AcZNShT5i@`l*jw9?Xo! zngt*W`V5VXkk6k#C*^W}&LmF2RQL*_;bMBQwR88PqCDrX(mcp)ud}DX>5JKVVrHiBjISL?9<83EM4< zxR^oe;))=|$|nrs3#>3W#oV7xc|-x5;$w!?;AvV` zXerq70c|6yQD4U$DL#lgHa!Q(=}Ay-aUBaeKgMmdH@9a^MMJ7>S&=TjfRSg9VRsk$ zeS$+mI-HXYg?`C1!Cv-^-3c;LQmnucU5T+Inn66o%UNXyYF~XJJ*n;u7IZvGV=>Y4 zGng7IEkqV286%rQVdQ+VrLOZ$5|GzzbS}sLVLc8j>0OWK6*4m0k$)KhE{{ZeyH%Ba zO6mP==A$n4AOx9*%@w|FqiQhMhmBK?(W@_<`7+E+XkT|Tl5)tXXlTfgkdy>Xd?7oJ zgMR~_8*Lb`6)L$S+&)IJzV1P8%&XZ*ajSt@m#?TMEZ-RmdGtOA>1dG3<|y_S#CO8a zY)f#+a)={mebE{f+GBSDJK8(OCTym^lSKDpyM0T%c#x-+Kt?TCQKxk)0x zp|gf&Fsa5YE_4O+-3vG;1Ogs$>{YcCM3_pha=pwqpE?s39aDFnlX<)35!lwXTHm2~# zdvmHc5Ok2s2$2=5kK;1DeK#6n@4*|X3spJ#O*qNK9$g;{bmYf$g?-e{!~f;*B6RF9 zgMp!B^IUi-mOhZYozGCAF*sL*RnhYv={q^wI0D+ks3cgGUb%r^z@=Rnvgfm5Z0_YJ z!z>x%(R~Ix3bG*{%~^RL+ll^^-z^cUp%D?P6D<+&pbh{RAtfb+bViO82QcOyf<0In zMegG@N0pVb4Z6N?y51Ha(`7H3SyUe{nKdCSc)ux4IA8N}#R#^X$D$~MUlqYN3RAM8xr zAq$EoWr|CfFEUsvroo-2+(g=jhTFZf9Ctl?`cV-TG_!C z`4*E4uv6Yw9wFlNTcK{TDm(xtC!Ur{We!j7vE#zOvt28eHKSho=)+*u@V>i0Q zhSCGuNrO2Xf*h3M3&&~4+dw@k;9Q9TSV(+_m~y~riJr&s0K&?%L^MH)PYpaR9>{w* zHU&#G$wGDt8JMq9pf6oSHahfFG59-?J;gMe$?n-rPC0gH+`q5P257OJe$9tcakuur zu@4j~@bCnhta%Z~ya-tI9s?+_o)g=*9pumCPJG~T`5^|@k8+=3(?w?_Z6bMi`*8fJ z)I@4FkODKioh&dTA2^NPZ;Iff1Pxhog+73)JrfoagFEp+IWQPvemWTluQEswCw78L z3ILa-21?blX9gZ>Q-Q_pW>M(yO#okUQ4-vL+ZfA`(8d zXoH#4bt+=kj+;1_#4sN@onIXYjyXWi)c4&$#OcPeIW?N!V9H%fL@uD#f+4Zb$h}K- zUuu}aMqZ~e7}%!Dae`q^&t<0^g9xJx2!Z$bpdkYec1W>Rr~% zuZO}^G`%%|sU43ZAl`CJt);wm&sgf!b6WOzlEH1;N|>Cgr&uXH8#^F2f`H!J?s*sh z3o5ko*+1Uqb+j@zPLhz40=Ej!Xrs>H7W~OOVol=v)UmMhc^V3RAR6UQCBer%Pw1-?g!4B05pwyEDUaWDjFHa=4UJRWptBC41u7O z;wjbV+xlSea*6!B=JiPUU;W(_ZwzkqnXE6vRCEcQ5vUAw$;axodhCZ{geir(rPB*l zPoChV5W}G3os}~Ux_e@_S~)la-oAnE0qW{cRRZ#@FaDXp+}tc84scgWHaWh#o|T0K z!F@`nmsn9lCiV2dZ)cEwd(g%gsy_gVw>ZW+pz7~172sFt2B&%WP(T_);E$((04y7? zd8moXBVR(V)Z@b?60lQxs=>0)mFvz{11vK1L(~7$gocyZ+hR2utXmAp+F@K2_mj1x zFf1lPwEFtFivhyQ-&vMJXsy`vnXTRXDX&wDWE1dspvI5^=K>w?vQxeD*WGT}jd-1C zH~lBQ5Y}zd4I>+nr@P0MFhmB6zzh901|~S{jt?6Q#$uvTC&qb|bHHDAf#x+m_Xqrb z-ryQ*R3TjC6Z-8KF84ERIG~{9Gf7D<-8n|$WRHFj;O=?9&-nvJCCt3vzbKI8Go$@2 zM>UjF#&uIH&{hY$&)sA5g=!|l&VB?_;{Q^h1T4t}39mb*?$Tok>ZI;pm zKo-!Fk*@!z=m`3;ky@gS%n?K4!^Pf!*F$FxJp$_K5)m~yf)KQFWOYjM%+XFd%zalP z%~#=;0`;4)hlB*vCb2&w3u45h>_%CoA&*2^w91Oscx6@S3F-b9s5~;&DaLEu$3TT5 z#tx_36y4}8+*`l87m~y$3%$FwiTlNpLl|>sgIqu`@Za=?M0Pm^5svt-Mk5#DgmZOV z_(ook{Dby~y4;f)+@h7fj|V+CnA^(|@Q-Phi8Znr3jH)}XkZvzQG8CrE}@}mqTb4W zZ{Q^;M%0c7r8at0q6=F0=Fj2^^bv@*{fAT1kbzD&U-CO4dj|jEy!vZ*C{)dFiAOs5 zZ4sd{g@I0Uj|>pG%%w4l=RJUrq?zPH|3Vv=?%_50^M=s-`k;gfpwQ=-qX&5QB|RW! z?lNRaP;uz7E>WbqQBgvQLXs0_8(`5NEXVAJFR*!^NU)0aWJawgExY07=9GSwYpNcN zZKY50k8`AAvVC9g?JTej*0;3>Tw)u=&rmnE1YE`&wSqoWL(5m!Tk?-oTue0$A~Zfr4YOoPejg>|z}F!Ux~MM_=j!4?-|F27V-)Vf*7dAYm0yC_pj;WF{v# z|CxR)_VEWd2RBh@L7hp^f+oCqa&x?M?uK|zKPd3dVHr7oE>r?LVP{7LFz&1fMMlHG z4@W|QEId^y^mNDden2{rQC;Z-GYebA&VQA|%rR|+1jbH>Ex~#w`r z*pFK|H{m%%g!n0_R$Fu2+@KrZJe#n@Ahn&THgj$8`Ho;3gO&vIh(GLfs72Mq(mTbgpL`MLl7H@V5Q*f+9|y(_2`T%< z!iCD|_f~{LyEAwHCwgssaYHTY42DGJ6{(X`X3Jy+3!-WJ>h(eDy>&=%Y(L=DGmp2X z;^(K79(nHHIZ~PM3=$KAT;}2;1i80A=6^E%DI9~to8%8X((b9l%)}6$k?8WW@_KPJ zwyQ_NZ`-6<=U%jYMOAwra>_q7IL+>N0;Dp_T7$Jc{4LG^@k#ro!sY6U=(K%hiYcZ> znpOTG%fUV(630su8%YA4+#x>XBTcgCGU=Iw^H*3-9IDkeQSS#dAmx~m{1pLy&(R*k z^6ms2uu_yhq^ejfZmiBjk2@%sS)6O3p4K2fc|Pv!JZ-`z8~^o28oEoedhC&k4+qn4 zgG(3-qioQ;u;q8OqvY`-$wUv$6W(yYClJdFq8kxwu#2Yw&iOl{pRv)p^kO(3X@F%c z7hK*W+Eyn%k=QK@VnR0mvpIaH3v)0wVG*X5?jVZ~<=JBBf#E7;08_L>=FJn^Q_i9b z-uNtuvt1fxud!fVO+cYGH&kh?nKrlFyQ$FD2?8&(1?sPux+03!6b`w4*6$z_RtMZ% zSyT!xWF1Zd&P)xNhuh$;L*Eq{yhRglbNih>T|F4ZJ9Y~AgTf=nd&oA^K4b)OeSx-lDSO^Q!@>=8^nI81IuojNEu)ikEx@c2;Q`3={ti^_%~M_ZHU z3AKyafR#T=7&tD1wKcMny7$kb>B*%_mtZsyZTf!3Scp>fQT?4clVET4;ZfDju5Oj3 zzso8*_cjw}D9PE>2{YHVW3aneIIsx)ZhZ`x3bR?+6I0GdV#%+3WqdIKLTa+0@_uyn z0bKYD;BZeF1-%RW{R$#qQG`FHi@7s%F5uq@o|9e}mhf`Ynd8XC z%XXmqenN48_>7O_w0VZv^-^rL9EvWLZB2=s{=e zBn)=r1fC{@P=lyB^X`#f;iW)Os*+Y4n-OaM!Q5kh;KoEH_vU^o=U8O?HR%4AeRypxIiLZqqM`Li!VeGVm+cC-Ag?lcOtYCXAh9xmvS=iXOhwGVy(aE zeS(-3WPt{P-f>38fa_Vy-kNgE;dUmb zO;erygcFar1NZ_kULYGmC8S(PT9JJt3NVvylj-|;DUu@PnmH!2!gbQPX1;@=4ThOf zewj$ww1;JIG-TY=m*oQDCr)iC6o}Zry90{MD(V}Cd^3K+%e?3UV+RE!(23>l_BzTF za+k7nJtHCg=Dtd#jWX9tw}jF!1EE#=9{oI}=VZP?1(^y*Ac@1ZuU@eZd=%fUb$3VP z^l9XbMPQ~A7H)s(|AN%PX&(RD3!1LDnDPnBM8Ys}WpieH)MeJo=)!Q=Rl zYnpz6&9wy*cqZnsgLH-j6}?K<^o3vUWsvhFiQj=^#M_K6(l$fCNZG9!DLpAQ~8cTDt!^$-Si?XXFHP(>x$mf7E3&m8(26cz?ge z#F8NW*+I$16c1JCuWDv z$T=HaSF`yJx@xT-eaPRs$HwnOG>_vsT5WziU1R7Q{E;E}0-2MV+)iC)o6v_U@OOR_ zH0d`sGG&>Goo7swd1Qw0DAH|-(lU9S_Y68Mb!O_lQp$;Z$p5R}h+aQ;B#8aG6QHRs4vEuJ7OZB*1-y1D^*c7sxua{$| zv%r32oybhJCjJBXR1Mo5ihJGz9%bMQAshFSQ4&wXk;peQmdkZ9k=EZ&iZVH1VymUV z&KLn}CMV6Hm_Dg{UC*-UX(FO6MC2Rnmxmd4#1HM*>+^oUZ3AaJ7th}(+1|2V zA-T2QP%IxD{GA(8t;B;hD?&wdT3pgL4M?BKM7NtL{Ez$$q`DE)Pm!ojh?-k5eRc>!-d6mCFy-Yw;3M5o>7EX(;TOQK#%* z^<|c5zDZ(MSnt2E$AkI#?|eRYiF9~hSkE#=q08=V)gk=43a7ImSII8;)IWd_*AYkH z#{`H1+QRS8pFa}6uHkmHHf!Rh<5!fbW}uf|W|!;uMsDvbCp?Y^#T0g7sjJ94fQbz7 zcppfz+_6~^U0g<$|u>n-~L-z>z2dv=WXOE6o)VBf}y(wqr zQ1N_xvUvZS{>qL{j)nvigD1@T?!&%qXqg--ipdf7)O^g_y0lvALK6tE`bLX!u;eSHvX~#HaHIjF{dP zW=5y>;!g!a9v6%Au})v@+7^3rNoZmnlepT0KMnFr$jHrye@%r(EvVKdv7MWpn3zD^ zo@)D27d?6#6055le335=TtTxh>?!ripYV$**06Tf#TzN_G&x~@(Msw=~H1zZ)l|-XM`blM+%O-a~7NR!kN17r&QV6Yd`Fk03)bhr#ye;n8JMAMQNN1jhp!YUvrjCLitZm^ZZX_eEZE>^Hj#U1 z)pFf?9n|>^FrkoSFYgz5f`3V#*)j6i4rgHJ{J_B3in|}eH9-23;2SElR4-~{WNzpR zs{gjRF1AmXa+K`&@zE=B@)Ju*W7N?C7p1YU5TCjVjhSYhH?e8Acf80lrp<%5I&CQQ zFvIVcmqFKoKBkchZ)Hg-#$R_P%&2Z_q+p4+PsDsYvjao}#s_>^4a8ICuyU1DyAjQd z>YiTcK+oB*w;*=@ghWX#mYb?8ukH7EHi*3)t3keHO3^!h#dg*PHv^KSb&~A9cbj@e zJYlnMDfgcb>?7qdcwc^Yn46&9|LfACX!xe5duzUkb?s;-$Z~{j{AmEkmo{^HFQ4tS z)WofgrYWX(SLn4dXxi|yF8oYjYN-z>X+A8w4N}Cvn!Tj$!3k1_LmFRf0c%X ziY%WVhh_xxfbi>5mrvA`_+XN`eZ>cBd%v-GouKv?dtDsxdFXSl%`IT*62eV5S?5eR zIHA?p_r=z;;Tade8(g4$v7o1}?Q;CUHDQBL?7T0&?g!eewD7edlsLdm=r_imgP zGh3t4kPUWoN==jCMp1*~!K8En<<;Nsv&o}9!ez5$iz^0r)9c>Y)VVzI z_Qs_;fF|$9Pdx1O2kd|?!m zzb6n`c4mGH6V|8NP<4RQiN;;x=YO}i4_yZ3kcn8V1m~Jllg5nK1Z+rA@Y1oNF@Oj6 zF2LMCoKR7FE>7Sh4kf&fJ$WaX<^A%KeP8tp@<`11KCtlh2iYe>RiFASO0tHhI9%_s zE8h>6O;8$;EVl75b7s$}20e;8Hbvd-&CrOhk&`*KEGCT;7T`Cn5At=+yR0^)XwLVI ztKD5Ya9QYCxb@mZUs>O^^w(;MZ@xOcNcYe___JDwHvkclFF!m%e~c>(Ly^c0U=f;>rdsY_=SZ zs)U=*l z_}Ae$yZ#|r!M#)T!F#CoW``ebp`m7{x!KN5UbXetMmD=uO4t&vIB28a&CB9#(t452 zZ(ad&iIUsT?%cs|wcoc2)ic;^X&^gE`HX<}o}nhAe10yjuu5!f8O4fBeN(M?DU3U^ z#wheSS!S{d4RqqKw6zFG>8OqMW3MdUzhq+gi8FT|==xgo8gTK7w#pUqSyNeeyKLjT zi*Tq$3@h=Ut1}M)FFs*n!%LTiJh<=nl3ReS1`-$otUuAn2}o3{-*CCkwK=Dbt*?-82gqc0toAAwn8E z8v|Y|E4n2%Qhds5UvNpJ?dx8isZDqi{lqe0d-YEHwO?Px{h})(*2}jm2mA52Q$>=) z&vdK2vFtUEqe&)({jSkkRzJP0cyfAI06h&tOKKU!&ph$(8H+EKqfI2pc7OJ!<`T zBNxx9#@{it!BG9n6X%M5RRR7;Uypl0;Ob(#W{e!2F>P36fnpS*fiC4(jaNDd zl6gAv~;n-zuB-skjW)~E3p2ZViI3jgzp*0! z>?!HXqh_&!<5!yhPUFOxGRV&=scTk${;a4>CjiHO zMtDEgQU9+n7ii4dt?6VI@QPmf@3P^lZv3seeX!!|ViqDV?9v~S2vE!aRO?+)XYb0} zUum3^giSCahd6SkS{D2xmiU#pRj8!u+7_27osDzuSHC^wp%J&BM!A9U;=C#pb9Bh6 zL&#_Yh{iMUg8Q++g%JB8Pc4kbqn60xnX#Jh7flsmxNwunSSmmVP2mWH#XHXvXAxJm zj`9CG0i%&5x;Dyzfg4atkODZ~MA2@LCVn1>9mFVa)|&rkvCVtsPisSG~+M8k=O0i3^q&%J&GSo!#CZ>?hZ z$3<&i(7)!eMN!Hp)kTuAPPO&npYLaSJ;NG~+r^IzQh6Hc`Gz&Lv42%4U-{0E6=FgF zOYzy!d+P}fIXHrHF`}5fOUFMv-_gtB)C?Mb4sJ}~9rN`NC?tryVbM-vD|luAJ~xf$ znZLr{o9@kYKMW^>365WZUtZf74bgL9N;gYLcMP{@bH)dNmgVXa%z>!p2m|1XpW&GaMq6r2Wj zY)Du>5+p$;9=7aJv$FZXqWaMT)HO=9-)K5A>?gM>r$#&$D4bSTVJQ5*6l3w%n=GRWPdPH)4P|F+Q zU|)K3LRM|lSOTqV^Lt-t?C^g6eekX>w(`_fZcR&?QZ*U;QfBQpmPDQYDkZ&zw6U5n z)++(I0}_@G_ekN;YM()lN9qJ=UuK)2m>eaDnd;-SVsJ9jGC&LqXPV)t&oOkWWq)ht z7D1^8j;c#HM^O(52|sYEJba-6N`YP=J}KK5XaI;B7N*ITfNH{o7VB@Ym8P0*vpwp~ z-}hBHe>*xDin16g`tc6e1?^Ft!5bdL$yVo`RQL@XUd%M(=IcW_C+e6>YGA5^sfq;; zYsuc6=)Ih+?6chZI{{$#t1i}m`L;ei3XckFj=wv&L3*0>y_@#@s`4!MhN&%1a)=xeV?tP$&jYWJc)1Ghku6~q7 zL|_E;CO)!8_)Ujtb(Eqd9Pq)6AGhIrmu5U|F#ACg;(-;Cuy30VKOvQ7V%Im|x>0}Qc z$YTP>*_#g6YQOocWAi7((^H;`=?C&ZGZ*|R&T0{p@g*Z!9!^iZ(6s?8ihrcFLZjllXe;n%g-s^nWN31L~Xv8YMjxGMz92FR^S0TM9 zd1k(;(hBv4e8jhs_|LFH;rVhxZ>OP}xEqm?KhA7BJdM10QTUyc>-A69ckeyt-F`ui zKectun);2w{41Yo54jvB!6m3UC1&?py*+e1D*aY&o5*n5tH#OW7&-@fv~gaXt#jxO zf_5=p(J?1d96o*g9+FzLWXQ+b-4bXh>pe8~Go;Z0UD)V^ zd_K#0UPRdNv%1}`#oODSUu`D;PRIaJQ^=mLdwu=+l5E2|KLSWM4a}6(CqCxC;)I|b z1%AKJTv>Opqtd|hmivlUyfJFTg~%=&kU(|+_mwsL_)u@!j0 z*W;wskQ?_$eD`;@FHjhT5u``D_m-s-bn3{IGbDITaxtbb3WXlgH86cs7co!NL=;3D z@ckjqSYk#EWwkR6NCVtsJRUdpA^j(V9=!J6Z}Z_qJ=-u!3$Phr*;Q)C9&;njnQ=@@ ze)q0eqZl7MqCZ_>UT2DS0O1sg-WVT@{S{vxD=WEckKzkX z5PMnot}`S*WSS|%gt8%jy%JwbVOcGw;Ul#-_V;Er6Edo#6Y?bME_V#}1$ZVP@+mMXYjm+;R>gFGiB~l9UbRIKrJ|Bl+{#eU=5qagJ=S6d>!) zxOJVx?$7#5v!_g|e#3?yrV^t{i`_HuNJsAu4#^<^DH`K|D@}&l70?dgL1podA|wDl z^hvP15cIT)%?A590+#MIy|d-R6JB=%1HQ}-x<(aV0=uZ|BOd`>X0YoM7oY1_th^?1 zeQ2jDT*&Ch@?!s=(vd5J`Igv&i!AN2l4KZj_H8f3`!`RB%MwP1JxF}H=3%QoRUEa&S$C?w zo?AryHWal^Cz^XSkT!~7SBoXA^8z$lHi}Tm5?<<>Z6wRnb5QvaWSY5_39Ya70hamo zgQfCZvk$*J1g{6coVNgCB4LOK^}y19Xa}glDt@Rqvxpopf_dO8C_%?3fCm3z10H{2 z#U^O50cai<4;O=hjt-6m;EYJcH7f%XJ3Gd_I1^}ikeeIDy`Z^XK_OwJlimNp?FJ2S zZ~=>a(0*RT5e7g#pyf2IEU4ZF_fUY1K^`8|!4ND19iWyo=v*z(VgcBS7B)7>jisRO z(a%4>8D0Vt`kSXu5UWTPRl$ubNHvF=X<%XfANfcPtS9jQhj!BuXP$v*fB+(GP6|4r z13#<Shz5-ib9RZ6*IbdgR6LfQy_euLFYOG$#w1oe0SfX1Vd&Y%SKRk?ws256B0q@Vi}Tz~z0{*2-6 zqNNP)cI{>O{q8-(-!ESoKApeF@N)hlhToT=M?`_~UyOkcP_Zm4D+4*25!fd9hjfxW zC`W^Oymw!}VR#AZD*c5FFmY-dG4NQrK+YS3W)9SYUKtQaYy3r;FF-j-AIk;Z(4#p3 z0*IpX^x!-D|1lyhdxSRKfwex1m@)&i@C}APUmzD^+*j{~zaXmsQYWSQ&VKd2*GKp-M444(h~16?i*ZvTMRYytUy zdAS�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 literal 0 HcmV?d00001 diff --git a/tests/lua-tests/project/proj.tizen/src/main.cpp b/tests/lua-tests/project/proj.tizen/src/main.cpp new file mode 100644 index 000000000000..3ce9bd4d668f --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/src/main.cpp @@ -0,0 +1,20 @@ +#include "../../Classes/AppDelegate.h" + +#include +#include +#include +#include +#include + +USING_NS_CC; + +int main(int argc, char **argv) +{ + // create the application instance + AppDelegate app; +#ifdef TIZEN + Application::getInstance()->setMainArgs(argc, argv);//For Tizen 2.4, we need these two arguments. +#endif + Application::getInstance()->setDeviceOrientation(APP_DEVICE_ORIENTATION_90); + return Application::getInstance()->run(); +} diff --git a/tests/lua-tests/project/proj.tizen/tizen-manifest.xml b/tests/lua-tests/project/proj.tizen/tizen-manifest.xml new file mode 100644 index 000000000000..19f7729edd78 --- /dev/null +++ b/tests/lua-tests/project/proj.tizen/tizen-manifest.xml @@ -0,0 +1,11 @@ + + + + + lua-tests.png + + + http://tizen.org/privilege/network.get + http://tizen.org/privilege/internet + + diff --git a/tests/lua-tests/src/ByteCodeEncryptTest/ByteCodeEncryptTest.lua b/tests/lua-tests/src/ByteCodeEncryptTest/ByteCodeEncryptTest.lua index 11ef1db1a7b9..843920996a0b 100644 --- a/tests/lua-tests/src/ByteCodeEncryptTest/ByteCodeEncryptTest.lua +++ b/tests/lua-tests/src/ByteCodeEncryptTest/ByteCodeEncryptTest.lua @@ -1,7 +1,7 @@ local targetPlatform = cc.Application:getInstance():getTargetPlatform() local is64BitIOSDevice = cc.Application:getInstance():is64BitIOSDevice() -if cc.PLATFORM_OS_LINUX ~= targetPlatform and is64BitIOSDevice ~= true then +if cc.PLATFORM_OS_LINUX ~= targetPlatform and cc.PLATFORM_OS_TIZEN ~= targetPlatform and is64BitIOSDevice ~= true then require("ByteCodeEncryptTest/ByteCodeTest") require("ByteCodeEncryptTest/ByteCodeAndEncryptTest") end diff --git a/tests/lua-tests/src/Particle3DTest/Particle3DTest.lua b/tests/lua-tests/src/Particle3DTest/Particle3DTest.lua index 8e6e3e89cdba..6b7382fcf489 100644 --- a/tests/lua-tests/src/Particle3DTest/Particle3DTest.lua +++ b/tests/lua-tests/src/Particle3DTest/Particle3DTest.lua @@ -8,7 +8,7 @@ local function baseInit(self) self._angle = 0 local targetPlatform = cc.Application:getInstance():getTargetPlatform() - if targetPlatform == cc.PLATFORM_OS_MAC or targetPlatform == cc.PLATFORM_OS_IPHONE or targetPlatform == cc.PLATFORM_OS_IPAD then + if targetPlatform == cc.PLATFORM_OS_MAC or targetPlatform == cc.PLATFORM_OS_IPHONE or targetPlatform == cc.PLATFORM_OS_IPAD or targetPlatform == cc.PLATFORM_OS_TIZEN then cc.FileUtils:getInstance():addSearchPath("Particle3D/materials") cc.FileUtils:getInstance():addSearchPath("Particle3D/scripts") else diff --git a/tests/lua-tests/src/mainMenu.lua b/tests/lua-tests/src/mainMenu.lua index fc0794238752..01bb893eafe2 100644 --- a/tests/lua-tests/src/mainMenu.lua +++ b/tests/lua-tests/src/mainMenu.lua @@ -78,20 +78,30 @@ if (cc.PLATFORM_OS_WINDOWS == currPlatform or cc.PLATFORM_OS_MAC == currPlatform audioEndineSupported = true end +local assetManagerSupported = true; +if (currPlatform == cc.PLATFORM_OS_TIZEN) then + assetManagerSupported = false; +end + +local luaByteCodeSupported = true; +if (currPlatform == cc.PLATFORM_OS_TIZEN) then + luaByteCodeSupported = false; +end + local _allTests = { { isSupported = true, name = "Accelerometer" , create_func= AccelerometerMain }, { isSupported = true, name = "ActionManagerTest" , create_func = ActionManagerTestMain }, { isSupported = true, name = "ActionsEaseTest" , create_func = EaseActionsTest }, { isSupported = true, name = "ActionsProgressTest" , create_func = ProgressActionsTest }, { isSupported = true, name = "ActionsTest" , create_func = ActionsTest }, - { isSupported = true, name = "AssetsManagerTest" , create_func = AssetsManagerTestMain }, + { isSupported = assetManagerSupported, name = "AssetsManagerTest" , create_func = AssetsManagerTestMain }, { isSupported = true, name = "AssetsManagerExTest" , create_func = AssetsManagerExTestMain }, { isSupported = audioEndineSupported, name = "AudioEngineTest", create_func = AudioEngineTest}, { isSupported = false, name = "Box2dTest" , create_func= Box2dTestMain }, { isSupported = false, name = "Box2dTestBed" , create_func= Box2dTestBedMain }, { isSupported = true, name = "BillBoardTest" , create_func= BillBoardTestMain}, { isSupported = true, name = "BugsTest" , create_func= BugsTestMain }, - { isSupported = true, name = "ByteCodeEncryptTest" , create_func= ByteCodeEncryptTestMain }, + { isSupported = luaByteCodeSupported, name = "ByteCodeEncryptTest" , create_func= ByteCodeEncryptTestMain }, { isSupported = true, name = "Camera3DTest" , create_func= Camera3DTestMain }, { isSupported = true, name = "CaptureScreenTest" , create_func = CaptureScreenTestMain }, { isSupported = false, name = "ChipmunkAccelTouchTest" , create_func= ChipmunkAccelTouchTestMain }, diff --git a/tools/tolua/cocos2dx_audioengine.ini b/tools/tolua/cocos2dx_audioengine.ini index 2822f90f08b0..e16aea43b779 100644 --- a/tools/tolua/cocos2dx_audioengine.ini +++ b/tools/tolua/cocos2dx_audioengine.ini @@ -7,7 +7,7 @@ prefix = cocos2dx_audioengine # all classes will be embedded in that namespace target_namespace = ccexp -macro_judgement = #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 +macro_judgement = #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/include android_flags = -D_SIZE_T_DEFINED_ From 011523cb56427b750bb50eaa20b15b4ad5be6d96 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 28 Apr 2016 01:52:35 +0000 Subject: [PATCH 047/241] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 0f97afe1b1c4..a60187b13080 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -13,6 +13,10 @@ "build/cocos2d_libs.xcodeproj/project.pbxproj", "build/cocos2d_tests.xcodeproj/project.pbxproj", "build/install-deps-linux.sh", + "build/tizen/.cproject", + "build/tizen/.exportMap", + "build/tizen/.project", + "build/tizen/.tproject", "build/win32-msvc-2013-x86.cmd", "cmake/AndroidNdkGdb.cmake", "cmake/AndroidNdkModules.cmake", @@ -308,6 +312,9 @@ "cocos/audio/openal/OpenALDecoder.cpp", "cocos/audio/openal/OpenALDecoder.h", "cocos/audio/openal/SimpleAudioEngineOpenAL.cpp", + "cocos/audio/tizen/AudioEngine-tizen.cpp", + "cocos/audio/tizen/AudioEngine-tizen.h", + "cocos/audio/tizen/SimpleAudioEngineTizen.cpp", "cocos/audio/win32/AudioCache.cpp", "cocos/audio/win32/AudioCache.h", "cocos/audio/win32/AudioEngine-win32.cpp", @@ -1035,6 +1042,18 @@ "cocos/platform/mac/CCPlatformDefine-mac.h", "cocos/platform/mac/CCStdC-mac.h", "cocos/platform/mac/cocos2d-prefix.pch", + "cocos/platform/tizen/CCApplication-tizen.cpp", + "cocos/platform/tizen/CCApplication-tizen.h", + "cocos/platform/tizen/CCCommon-tizen.cpp", + "cocos/platform/tizen/CCDevice-tizen.cpp", + "cocos/platform/tizen/CCFileUtils-tizen.cpp", + "cocos/platform/tizen/CCFileUtils-tizen.h", + "cocos/platform/tizen/CCGL-tizen.h", + "cocos/platform/tizen/CCGLViewImpl-tizen.cpp", + "cocos/platform/tizen/CCGLViewImpl-tizen.h", + "cocos/platform/tizen/CCPlatformDefine-tizen.h", + "cocos/platform/tizen/CCStdC-tizen.cpp", + "cocos/platform/tizen/CCStdC-tizen.h", "cocos/platform/win32/CCApplication-win32.cpp", "cocos/platform/win32/CCApplication-win32.h", "cocos/platform/win32/CCCommon-win32.cpp", @@ -1237,6 +1256,8 @@ "cocos/ui/UIEditBox/UIEditBoxImpl-mac.h", "cocos/ui/UIEditBox/UIEditBoxImpl-mac.mm", "cocos/ui/UIEditBox/UIEditBoxImpl-stub.cpp", + "cocos/ui/UIEditBox/UIEditBoxImpl-tizen.cpp", + "cocos/ui/UIEditBox/UIEditBoxImpl-tizen.h", "cocos/ui/UIEditBox/UIEditBoxImpl-win32.cpp", "cocos/ui/UIEditBox/UIEditBoxImpl-win32.h", "cocos/ui/UIEditBox/UIEditBoxImpl-winrt.cpp", @@ -1303,6 +1324,7 @@ "cocos/ui/UIVBox.h", "cocos/ui/UIVideoPlayer-android.cpp", "cocos/ui/UIVideoPlayer-ios.mm", + "cocos/ui/UIVideoPlayer-tizen.cpp", "cocos/ui/UIVideoPlayer.h", "cocos/ui/UIWebView-inl.h", "cocos/ui/UIWebView.cpp", @@ -1312,6 +1334,8 @@ "cocos/ui/UIWebViewImpl-android.h", "cocos/ui/UIWebViewImpl-ios.h", "cocos/ui/UIWebViewImpl-ios.mm", + "cocos/ui/UIWebViewImpl-tizen.cpp", + "cocos/ui/UIWebViewImpl-tizen.h", "cocos/ui/UIWidget.cpp", "cocos/ui/UIWidget.h", "cocos/ui/proj.win32/libui.vcxproj", @@ -2329,6 +2353,8 @@ "external/chipmunk/prebuilt/ios/libchipmunk.a", "external/chipmunk/prebuilt/linux/64-bit/libchipmunk.a", "external/chipmunk/prebuilt/mac/libchipmunk.a", + "external/chipmunk/prebuilt/tizen/arm/libchipmunk.a", + "external/chipmunk/prebuilt/tizen/x86/libchipmunk.a", "external/chipmunk/prebuilt/win10/arm/chipmunk.lib", "external/chipmunk/prebuilt/win10/win32/chipmunk.lib", "external/chipmunk/prebuilt/win32/debug-lib/libchipmunk-2015.lib", @@ -2954,6 +2980,9 @@ "external/jpeg/include/mac/jconfig.h", "external/jpeg/include/mac/jmorecfg.h", "external/jpeg/include/mac/jpeglib.h", + "external/jpeg/include/tizen/jconfig.h", + "external/jpeg/include/tizen/jmorecfg.h", + "external/jpeg/include/tizen/jpeglib.h", "external/jpeg/include/win32/jconfig.h", "external/jpeg/include/win32/jmorecfg.h", "external/jpeg/include/win32/jpeglib.h", @@ -2965,6 +2994,8 @@ "external/jpeg/prebuilt/linux/32-bit/libjpeg.a", "external/jpeg/prebuilt/linux/64-bit/libjpeg.a", "external/jpeg/prebuilt/mac/libjpeg.a", + "external/jpeg/prebuilt/tizen/arm/libjpeg.a", + "external/jpeg/prebuilt/tizen/x86/libjpeg.a", "external/jpeg/prebuilt/win32/libjpeg-2015.lib", "external/jpeg/prebuilt/win32/libjpeg.lib", "external/json/allocators.h", @@ -3016,6 +3047,9 @@ "external/png/include/mac/png.h", "external/png/include/mac/pngconf.h", "external/png/include/mac/pnglibconf.h", + "external/png/include/tizen/png.h", + "external/png/include/tizen/pngconf.h", + "external/png/include/tizen/pnglibconf.h", "external/png/include/win32/png.h", "external/png/include/win32/pngconf.h", "external/png/include/win32/pnglibconf.h", @@ -3025,6 +3059,8 @@ "external/png/prebuilt/android/x86/libpng.a", "external/png/prebuilt/ios/libpng.a", "external/png/prebuilt/mac/libpng.a", + "external/png/prebuilt/tizen/arm/libpng.a", + "external/png/prebuilt/tizen/x86/libpng.a", "external/png/prebuilt/win32/libpng-2015.lib", "external/png/prebuilt/win32/libpng.lib", "external/poly2tri/common/shapes.cc", @@ -3143,6 +3179,10 @@ "external/tiff/include/mac/tiffconf.h", "external/tiff/include/mac/tiffio.h", "external/tiff/include/mac/tiffvers.h", + "external/tiff/include/tizen/tiff.h", + "external/tiff/include/tizen/tiffconf.h", + "external/tiff/include/tizen/tiffio.h", + "external/tiff/include/tizen/tiffvers.h", "external/tiff/include/win32/tiff.h", "external/tiff/include/win32/tiffconf.h", "external/tiff/include/win32/tiffio.h", @@ -3155,6 +3195,8 @@ "external/tiff/prebuilt/linux/32-bit/libtiff.a", "external/tiff/prebuilt/linux/64-bit/libtiff.a", "external/tiff/prebuilt/mac/libtiff.a", + "external/tiff/prebuilt/tizen/arm/libtiff.a", + "external/tiff/prebuilt/tizen/x86/libtiff.a", "external/tiff/prebuilt/win32/libtiff-2015.lib", "external/tiff/prebuilt/win32/libtiff.dll", "external/tiff/prebuilt/win32/libtiff.lib", @@ -3183,6 +3225,9 @@ "external/webp/include/mac/decode.h", "external/webp/include/mac/encode.h", "external/webp/include/mac/types.h", + "external/webp/include/tizen/decode.h", + "external/webp/include/tizen/encode.h", + "external/webp/include/tizen/types.h", "external/webp/include/win32/decode.h", "external/webp/include/win32/encode.h", "external/webp/include/win32/types.h", @@ -3194,6 +3239,8 @@ "external/webp/prebuilt/linux/32-bit/libwebp.a", "external/webp/prebuilt/linux/64-bit/libwebp.a", "external/webp/prebuilt/mac/libwebp.a", + "external/webp/prebuilt/tizen/arm/libwebp.a", + "external/webp/prebuilt/tizen/x86/libwebp.a", "external/webp/prebuilt/win32/libwebp.lib", "external/websockets/include/android/libwebsockets.h", "external/websockets/include/android/lws_config.h", @@ -3203,6 +3250,8 @@ "external/websockets/include/linux/lws_config.h", "external/websockets/include/mac/libwebsockets.h", "external/websockets/include/mac/lws_config.h", + "external/websockets/include/tizen/libwebsockets.h", + "external/websockets/include/tizen/lws_config.h", "external/websockets/include/win10/libwebsockets.h", "external/websockets/include/win10/lws_config.h", "external/websockets/include/win10/private-libwebsockets.h", @@ -3225,6 +3274,8 @@ "external/websockets/prebuilt/linux/32-bit/libwebsockets.a", "external/websockets/prebuilt/linux/64-bit/libwebsockets.a", "external/websockets/prebuilt/mac/libwebsockets.a", + "external/websockets/prebuilt/tizen/arm/libwebsockets.a", + "external/websockets/prebuilt/tizen/x86/libwebsockets.a", "external/websockets/prebuilt/win10/arm/libwebsockets.lib", "external/websockets/prebuilt/win10/win32/libwebsockets.lib", "external/websockets/prebuilt/win32/websockets.lib", @@ -7021,6 +7072,9 @@ "cocos/scripting/lua-bindings/manual/video/lua_cocos2dx_experimental_video_manual.hpp", "cocos/scripting/lua-bindings/proj.android/Android.mk", "cocos/scripting/lua-bindings/proj.ios_mac/cocos2d_lua_bindings.xcodeproj/project.pbxproj", + "cocos/scripting/lua-bindings/proj.tizen/.cproject", + "cocos/scripting/lua-bindings/proj.tizen/.project", + "cocos/scripting/lua-bindings/proj.tizen/.tproject", "cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj", "cocos/scripting/lua-bindings/proj.win32/libluacocos2d.vcxproj.filters", "cocos/scripting/lua-bindings/script/3d/3dConstants.lua", From 198acb9466c8ef86ddd4b9737c7192d37cd60a35 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 28 Apr 2016 01:56:50 +0000 Subject: [PATCH 048/241] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../auto/lua_cocos2dx_audioengine_auto.cpp | 24 +++++++++---------- .../auto/lua_cocos2dx_audioengine_auto.hpp | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp index 9dfc02be25c3..51de59350b66 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp @@ -612,10 +612,10 @@ int lua_cocos2dx_audioengine_AudioEngine_preload(lua_State* tolua_S) if (!ok) { break; } std::function arg1; do { - // Lambda binding for lua is not supported. - assert(false); - } while(0) - ; + // Lambda binding for lua is not supported. + assert(false); + } while(0) + ; if (!ok) { break; } cocos2d::experimental::AudioEngine::preload(arg0, arg1); lua_settop(tolua_S, 1); @@ -1039,16 +1039,16 @@ int lua_register_cocos2dx_audioengine_AudioEngine(lua_State* tolua_S) } TOLUA_API int register_all_cocos2dx_audioengine(lua_State* tolua_S) { - tolua_open(tolua_S); - - tolua_module(tolua_S,"ccexp",0); - tolua_beginmodule(tolua_S,"ccexp"); + tolua_open(tolua_S); + + tolua_module(tolua_S,"ccexp",0); + tolua_beginmodule(tolua_S,"ccexp"); - lua_register_cocos2dx_audioengine_AudioProfile(tolua_S); - lua_register_cocos2dx_audioengine_AudioEngine(tolua_S); + lua_register_cocos2dx_audioengine_AudioProfile(tolua_S); + lua_register_cocos2dx_audioengine_AudioEngine(tolua_S); - tolua_endmodule(tolua_S); - return 1; + tolua_endmodule(tolua_S); + return 1; } #endif diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp index 9f1461f3e52f..58f93112b115 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp @@ -41,4 +41,4 @@ int register_all_cocos2dx_audioengine(lua_State* tolua_S); #endif // __cocos2dx_audioengine_h__ -#endif //#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 +#endif //#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN From c432b23ef66aa3313b0f274dd87fb6d62084075b Mon Sep 17 00:00:00 2001 From: Ricardo Quesada Date: Wed, 27 Apr 2016 18:57:41 -0700 Subject: [PATCH 049/241] fix: removes `friend class Game` fixes Github issue #15221 --- cocos/base/CCProperties.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/cocos/base/CCProperties.h b/cocos/base/CCProperties.h index 651e6ec453aa..fc4a49269d3e 100644 --- a/cocos/base/CCProperties.h +++ b/cocos/base/CCProperties.h @@ -159,8 +159,6 @@ class Data; */ class CC_DLL Properties { - friend class Game; - public: /** From d8d6e5575609996c25d40ed491e14b3a88fe4bcf Mon Sep 17 00:00:00 2001 From: pandamicro Date: Thu, 28 Apr 2016 15:14:03 +0800 Subject: [PATCH 050/241] Fix clipping node memory management issue --- cocos/2d/CCClippingNode.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/cocos/2d/CCClippingNode.cpp b/cocos/2d/CCClippingNode.cpp index b5229c8bd4b5..cf91f494ab9c 100644 --- a/cocos/2d/CCClippingNode.cpp +++ b/cocos/2d/CCClippingNode.cpp @@ -107,9 +107,7 @@ bool ClippingNode::init() bool ClippingNode::init(Node *stencil) { - CC_SAFE_RELEASE(_stencil); setStencil(stencil); - CC_SAFE_RETAIN(_stencil); return true; } From 27b9510f2c4f2603f513f673cc218b91c9ccb465 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Thu, 28 Apr 2016 16:12:29 +0800 Subject: [PATCH 051/241] Upgrade web engine to v3.11 beta and fix issues with js-tests --- tests/js-tests/resjs/Shaders/example_Blur.fsh | 46 +++++++++++++++++++ .../resjs/Shaders/example_ColorBars.vsh | 2 +- .../resjs/Shaders/example_Outline.vsh | 2 +- tests/js-tests/src/OpenGLTest/OpenGLTest.js | 2 +- .../RenderTextureTest/RenderTextureTest.js | 9 ++-- tests/js-tests/src/SpriteTest/SpriteTest.js | 2 +- tests/js-tests/src/tests_resources.js | 4 -- web | 2 +- 8 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 tests/js-tests/resjs/Shaders/example_Blur.fsh diff --git a/tests/js-tests/resjs/Shaders/example_Blur.fsh b/tests/js-tests/resjs/Shaders/example_Blur.fsh new file mode 100644 index 000000000000..3841f862b7a5 --- /dev/null +++ b/tests/js-tests/resjs/Shaders/example_Blur.fsh @@ -0,0 +1,46 @@ +#ifdef GL_ES +precision mediump float; +#endif + +varying vec4 v_fragmentColor; +varying vec2 v_texCoord; + +uniform vec2 resolution; +uniform float blurRadius; +uniform float sampleNum; + +vec4 blur(vec2); + +void main(void) +{ + vec4 col = blur(v_texCoord); //* v_fragmentColor.rgb; + gl_FragColor = vec4(col) * v_fragmentColor; +} + +vec4 blur(vec2 p) +{ + if (blurRadius > 0.0 && sampleNum > 1.0) + { + vec4 col = vec4(0); + vec2 unit = 1.0 / resolution.xy; + + float r = blurRadius; + float sampleStep = r / sampleNum; + + float count = 0.0; + + for(float x = -r; x < r; x += sampleStep) + { + for(float y = -r; y < r; y += sampleStep) + { + float weight = (r - abs(x)) * (r - abs(y)); + col += texture2D(CC_Texture0, p + vec2(x * unit.x, y * unit.y)) * weight; + count += weight; + } + } + + return col / count; + } + + return texture2D(CC_Texture0, p); +} diff --git a/tests/js-tests/resjs/Shaders/example_ColorBars.vsh b/tests/js-tests/resjs/Shaders/example_ColorBars.vsh index ab26a39c04cf..ccaabbf4e384 100644 --- a/tests/js-tests/resjs/Shaders/example_ColorBars.vsh +++ b/tests/js-tests/resjs/Shaders/example_ColorBars.vsh @@ -11,6 +11,6 @@ varying vec2 v_texCoord; void main() { - gl_Position = CC_PMatrix * a_position; + gl_Position = (CC_PMatrix * CC_MVMatrix) * a_position; v_texCoord = a_texCoord; } \ No newline at end of file diff --git a/tests/js-tests/resjs/Shaders/example_Outline.vsh b/tests/js-tests/resjs/Shaders/example_Outline.vsh index 8cda2a8438b1..0bcce55b80ce 100644 --- a/tests/js-tests/resjs/Shaders/example_Outline.vsh +++ b/tests/js-tests/resjs/Shaders/example_Outline.vsh @@ -7,7 +7,7 @@ varying vec2 v_texCoord; void main() { - gl_Position = CC_PMatrix * CC_MVMatrix * a_position; + gl_Position = CC_PMatrix * a_position; v_fragmentColor = a_color; v_texCoord = a_texCoord; } \ No newline at end of file diff --git a/tests/js-tests/src/OpenGLTest/OpenGLTest.js b/tests/js-tests/src/OpenGLTest/OpenGLTest.js index c3bfe31e7ef1..8443e52ec64e 100644 --- a/tests/js-tests/src/OpenGLTest/OpenGLTest.js +++ b/tests/js-tests/src/OpenGLTest/OpenGLTest.js @@ -905,7 +905,7 @@ var ShaderOutlineEffect = OpenGLTestLayer.extend({ }else{ this.sprite.shaderProgram = this.shader; } - + this.addChild(this.sprite); this.scheduleUpdate(); diff --git a/tests/js-tests/src/RenderTextureTest/RenderTextureTest.js b/tests/js-tests/src/RenderTextureTest/RenderTextureTest.js index 6cf84c76ab7c..10ade1db8aa5 100644 --- a/tests/js-tests/src/RenderTextureTest/RenderTextureTest.js +++ b/tests/js-tests/src/RenderTextureTest/RenderTextureTest.js @@ -154,10 +154,10 @@ var RenderTextureSave = RenderTextureBaseLayer.extend({ var distance = cc.pDistance(location, this._lastLocation); if (distance > 1) { - var locLastLocation = this._lastLocation; + var locLastLocation = this._lastLocation, i; this._target.begin(); this._brushs = []; - for(var i = 0; i < distance; ++i) { + for(i = 0; i < distance; ++i) { var diffX = locLastLocation.x - location.x; var diffY = locLastLocation.y - location.y; var delta = i / distance; @@ -170,10 +170,11 @@ var RenderTextureSave = RenderTextureBaseLayer.extend({ scale: Math.random() + 0.25, opacity: 20 }); + sprite.parent = this; sprite.retain(); this._brushs.push(sprite); } - for (var i = 0; i < distance; i++) { + for (i = 0; i < distance; i++) { this._brushs[i].visit(); } this._target.end(); @@ -530,8 +531,6 @@ var RenderTextureTargetNode = RenderTextureBaseLayer.extend({ renderTexture.x = winSize.width / 2; renderTexture.y = winSize.height / 2; - // [renderTexture setPosition:cc.p(s.width, s.height)]; - // renderTexture.scale = 2; /* add the sprites to the render texture */ renderTexture.addChild(this._sprite1); diff --git a/tests/js-tests/src/SpriteTest/SpriteTest.js b/tests/js-tests/src/SpriteTest/SpriteTest.js index 0969ac88ab9f..27fa0b95b270 100644 --- a/tests/js-tests/src/SpriteTest/SpriteTest.js +++ b/tests/js-tests/src/SpriteTest/SpriteTest.js @@ -992,7 +992,7 @@ var SpriteZVertex = SpriteTestDemo.extend({ // // Configure shader to mimic glAlphaTest // - var alphaTestShader = cc.shaderCache.getProgram("ShaderPositionTextureColorAlphaTest"); + var alphaTestShader = cc.shaderCache.getProgram(cc.SHADER_SPRITE_POSITION_TEXTURECOLORALPHATEST); var glprogram = alphaTestShader.getProgram(); var alphaValueLocation = gl.getUniformLocation(glprogram, cc.UNIFORM_ALPHA_TEST_VALUE_S); diff --git a/tests/js-tests/src/tests_resources.js b/tests/js-tests/src/tests_resources.js index b41f7d1e6f07..d323dd5d352e 100644 --- a/tests/js-tests/src/tests_resources.js +++ b/tests/js-tests/src/tests_resources.js @@ -774,8 +774,6 @@ var g_cocoStudio = [ "ccs-res/cocosui/UIEditorTest/UIScrollView/Vertical/selected01.png", "ccs-res/cocosui/UIEditorTest/UIScrollView/Vertical/selected02.png", "ccs-res/cocosui/UIEditorTest/UIScrollView/Vertical/vertical_1.json", - "ccs-res/cocosui/UIEditorTest/UISlider/2014-1-26 11-42-09.png", - "ccs-res/cocosui/UIEditorTest/UISlider/2014-1-26 11-43-52.png", "ccs-res/cocosui/UIEditorTest/UISlider/background.png", "ccs-res/cocosui/UIEditorTest/UISlider/buttonBackground.png", "ccs-res/cocosui/UIEditorTest/UISlider/ribbon.png", @@ -897,8 +895,6 @@ var g_cocoStudio = [ "ccs-res/cocosui/UIEditorTest/2.1/plist1/Plist.plist", "ccs-res/cocosui/UIEditorTest/2.1/Plist/ui.plist", "ccs-res/cocosui/UIEditorTest/2.1/LoadingBar/pipe2.png", - "ccs-res/cocosui/UIEditorTest/2.1/Slider/2013-8-13 15-44-11.png", - "ccs-res/cocosui/UIEditorTest/2.1/Slider/teehanlax - iOS 6 - iPhone_slider01.png", "ccs-res/cocosui/UIEditorTest/2.1/particle/blue.plist", "ccs-res/cocosui/UIEditorTest/2.1/Default/Slider_Back.png", "ccs-res/cocosui/UIEditorTest/2.1/Default/SliderNode_Normal.png", diff --git a/web b/web index ff19fd2880a1..e4397b60924d 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit ff19fd2880a1dd014151170166bcb1cb5b2bf9a7 +Subproject commit e4397b60924d5dd92774ea14213ec3373117a863 From 8f371305697a9106beb10ab1c832c5ac41a4f38d Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Thu, 28 Apr 2016 08:37:55 -0700 Subject: [PATCH 052/241] added missing winrt template code for inplace EditBox --- .../proj.win10/App/App.xaml | 127 +---------------- .../App/Cocos2dEngine/Cocos2dRenderer.cpp | 1 - .../App/Cocos2dEngine/Cocos2dRenderer.h | 2 +- .../App/Cocos2dEngine/OpenGLESPage.xaml | 17 +-- .../proj.win8.1-universal/App.Shared/App.xaml | 132 ++---------------- .../App.Shared/OpenGLESPage.xaml | 6 +- .../App.Shared/OpenGLESPage.xaml | 17 +-- 7 files changed, 19 insertions(+), 283 deletions(-) diff --git a/templates/cpp-template-default/proj.win10/App/App.xaml b/templates/cpp-template-default/proj.win10/App/App.xaml index dfdb2af4f113..4851359f9ef2 100644 --- a/templates/cpp-template-default/proj.win10/App/App.xaml +++ b/templates/cpp-template-default/proj.win10/App/App.xaml @@ -5,126 +5,9 @@ xmlns:local="using:CocosAppWinRT" xmlns:localData="using:Shared"> - - - - - HelloCpp - + + + HelloCpp + + diff --git a/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/Cocos2dRenderer.cpp b/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/Cocos2dRenderer.cpp index 7e329b48557c..a46169445cb8 100644 --- a/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/Cocos2dRenderer.cpp +++ b/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/Cocos2dRenderer.cpp @@ -20,7 +20,6 @@ #include "AppDelegate.h" #include "platform/winrt/CCGLViewImpl-winrt.h" #include "platform/CCApplication.h" -#include "cocos2d.h" #include "renderer/CCTextureCache.h" // These are used by the shader compilation methods. diff --git a/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/Cocos2dRenderer.h b/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/Cocos2dRenderer.h index 5da628c459cd..49319358b50c 100644 --- a/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/Cocos2dRenderer.h +++ b/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/Cocos2dRenderer.h @@ -19,7 +19,7 @@ #include -#include "cocos2d.h" + class AppDelegate; diff --git a/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/OpenGLESPage.xaml b/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/OpenGLESPage.xaml index c8e3e922f97a..b59232a2fa6f 100644 --- a/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/OpenGLESPage.xaml +++ b/templates/cpp-template-default/proj.win10/App/Cocos2dEngine/OpenGLESPage.xaml @@ -8,21 +8,6 @@ mc:Ignorable="d"> - - - - - - + diff --git a/templates/cpp-template-default/proj.win8.1-universal/App.Shared/App.xaml b/templates/cpp-template-default/proj.win8.1-universal/App.Shared/App.xaml index 60186cc73820..4851359f9ef2 100644 --- a/templates/cpp-template-default/proj.win8.1-universal/App.Shared/App.xaml +++ b/templates/cpp-template-default/proj.win8.1-universal/App.Shared/App.xaml @@ -2,128 +2,12 @@ x:Class="CocosAppWinRT.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="using:CocosAppWinRT"> + xmlns:local="using:CocosAppWinRT" + xmlns:localData="using:Shared"> - - - - - HelloCpp - - \ No newline at end of file + + + HelloCpp + + + diff --git a/templates/cpp-template-default/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml b/templates/cpp-template-default/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml index 3b6ea858d119..b59232a2fa6f 100644 --- a/templates/cpp-template-default/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml +++ b/templates/cpp-template-default/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml @@ -7,7 +7,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - - - + + + diff --git a/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml b/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml index c8e3e922f97a..b59232a2fa6f 100644 --- a/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml +++ b/templates/js-template-default/frameworks/runtime-src/proj.win8.1-universal/App.Shared/OpenGLESPage.xaml @@ -8,21 +8,6 @@ mc:Ignorable="d"> - - - - - - + From b1da4b9c808608c77c710b7d0e027a39e5972734 Mon Sep 17 00:00:00 2001 From: slackmoehrle Date: Thu, 28 Apr 2016 15:17:55 -0400 Subject: [PATCH 053/241] started Release Notes changes for v3.11 --- docs/RELEASE_NOTES.md | 44 +++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 505c60d9c183..6535796a8a81 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -52,7 +52,7 @@ * ndk-r10c for Android * Visual Studio 2013 or newer for Windows (win32) * Visual Studio 2013 update4 or newer for Windows 8.1 universal Apps -* Visual Studio 2015 RC or newer and Windows 10.0 (build 10074 or higher) for Windows 10.0 UWP Apps +* Visual Studio 2015 or newer and Windows 10.0 (build 10074 or higher) for Windows 10.0 UWP Apps ## How to run tests @@ -81,16 +81,17 @@ cocos run -p android -m release ``` ### Mac OSX & iOS +You can run the samples by: -* Enter `cocos2d-x/build` folder, open `cocos2d_test.xcodeproj` -* Select `cpp-tests`, `lua-tests`, `js-tests` for `iOS` or `OS X` target in scheme toolbar -* Click `run` button +* Open __cocos2d-x/build__ folder, open __cocos2d_test.xcodeproj__ +* Select `cpp-tests`, `lua-tests`, `js-tests` for __iOS__ or __OS X__ target in scheme toolbar +* Click __run__ button ### Android - -You can run the samples... +You can run the samples by either using the command-line or Eclipse: **Using command line:** +Perform the following steps: $ cd cocos2d-x $ ./setup.py @@ -101,47 +102,49 @@ You can run the samples... Then click item on Android device to run tests. Available value of `-p` is the API level, cocos2d-x supports from level 10. **Using Eclipse:** +Perform the following steps: $ cd cocos2d-x $ ./setup.py $ cd build $ ./android-build.py cpp-empty-test -p 10 -Then +Next: -* Import cocos2d-x Android project into Eclipse, the path used to import is `cocos/2d/platform/android` -* Import `cpp-empty-test` Android project into Eclipse, the path used to import is `tests/cpp-empty-test/proj.android` +* Import cocos2d-x Android project into Eclipse, the path used to import is __cocos/2d/platform/android__ +* Import `cpp-empty-test` Android project into Eclipse, the path used to import is __tests/cpp-empty-test/proj.android__ * Build `cpp-empty-test` Android project and run ### Windows +You can run the samples by: -* For win32 project, enter `cocos2d-x/build`, and open `cocos2d-win32.sln` -* For win 8.1 project, enter `cocos2d-x/build`, and open `cocos2d-win8.1-universal.sln` -* For win 10 project, enter `cocos2d-x/build`, and open `cocos2d-win10.sln` +* For win32 project, enter __cocos2d-x/build__, and open __cocos2d-win32.sln__ +* For win 8.1 project, enter __cocos2d-x/build__, and open __cocos2d-win8.1-universal.sln__ +* For win 10 project, enter __cocos2d-x/build__, and open __cocos2d-win10.sln__ * Select running target * Click run button ### Linux +You can run the samples by: $ cd cocos2d-x/build $ ./install-deps-linux.sh $ cd ../.. -Then +Next: $ mkdir build $ cd build $ cmake ../cocos2d-x $ make -j4 -Run +Then run: $ cd bin/cpp-empty-test $ ./cpp-empty-test ## How to start a new game - -Use Cocos Console to create a new game: +Use the __cocos__ console app to create a new game: ``` cocos new -l cpp|js|lua MyNewGame @@ -171,16 +174,13 @@ TBD ### OpenSSL -Beginning July 11, 2016, Google Play will block publishing of any new apps or updates that use older versions of OpenSSL. So coocs2d-x upgrades OpenSSL to latest version(v1.0.2g). +Beginning July 11, 2016, Google Play will block publishing of any new apps or updates that use older versions of OpenSSL. OpenSSL has been upgraded to latest version __v1.0.2g__. -If you use v2.x or use older versions of v3.x, you can just update CURL and OpenSSL. This guild shows you how to do. [TBD: Add guide link]() +If you use v2.x or use older versions of v3.x, you can just update CURL and OpenSSL. This guide shows you how to do. [TBD: Add guide link]() ### Tizen support - -TBD: doc links of Tizen +Tizen is now supported! You can read about how to use Tizen [here](http://cocos2d-x.org/docs/static-pages/installation.html). ## Other changes You can also take a look at the [full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG). - - \ No newline at end of file From 0c427541c0c53105c2257dc5d6b0195d5fdf966a Mon Sep 17 00:00:00 2001 From: slackmoehrle Date: Thu, 28 Apr 2016 20:15:41 -0400 Subject: [PATCH 054/241] updated OpenSSL section --- docs/RELEASE_NOTES.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 6535796a8a81..9038529031f6 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -173,14 +173,30 @@ TBD ``` ### OpenSSL +Cocos2d-x has upgraded __OpenSSL__ to version __1.0.2g<__. -Beginning July 11, 2016, Google Play will block publishing of any new apps or updates that use older versions of OpenSSL. OpenSSL has been upgraded to latest version __v1.0.2g__. +Beginning __July 11, 2016__, Google Play will block publishing of any new apps or updates that use older versions of __OpenSSL__. It is important that you update the use of __OpenSSL__ in your projects. -If you use v2.x or use older versions of v3.x, you can just update CURL and OpenSSL. This guide shows you how to do. [TBD: Add guide link]() +If you use v2.x or use older versions of v3.x, you can just update __CURL__ and __OpenSSL__>. To do this, just execute the __download-deps.py__ script in your __Cocos2d-x root__. +```sh +(jtsm @ 15 ~) $ cd cocos2d-x + +(jtsm @ 15 ~/cocos2d-x) $ ./download-deps.py + +======================================================= +==> Prepare to download external libraries! +==> Ready to download 'v3-deps-92.zip' from 'https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/archive/v3-deps-92.zip' +==> WARNING: Couldnt grab the file size from remote, use 'zip_file_size' section in '/Users/jtsm/Chukong-Inc/cocos2d-x/external/config.json' +==> Start to download, please wait ... +==> Downloading finished! +==> Extracting files, please wait ... +==> Extraction done! ==> Copying files... +==> Cleaning... +``` +Feel free to post on our forums if you run into difficulty. ### Tizen support Tizen is now supported! You can read about how to use Tizen [here](http://cocos2d-x.org/docs/static-pages/installation.html). ## Other changes - You can also take a look at the [full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG). From f11158321441f67c3ce052093d7d9c26fd5c7c40 Mon Sep 17 00:00:00 2001 From: Xpol Wan Date: Fri, 29 Apr 2016 09:29:54 +0800 Subject: [PATCH 055/241] Refactor FileUtils::getFileData() and CCFreeTypeFont::loadFont(). * Remove unnecessary memory copy in FileUtils::getFileData() * Add Data::takeBuffer() to simplify FileUtils::getFileData() and CCFreeTypeFont::loadFont(). --- cocos/base/CCData.cpp | 15 +++++-- cocos/base/CCData.h | 59 +++++++++++++++++-------- cocos/platform/CCFileUtils.cpp | 16 +++---- cocos/platform/winrt/CCFreeTypeFont.cpp | 12 +---- 4 files changed, 59 insertions(+), 43 deletions(-) diff --git a/cocos/base/CCData.cpp b/cocos/base/CCData.cpp index 7c5a1e1bdf68..9ad33a2cfccb 100644 --- a/cocos/base/CCData.cpp +++ b/cocos/base/CCData.cpp @@ -1,7 +1,7 @@ /**************************************************************************** Copyright (c) 2010-2012 cocos2d-x.org 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 @@ -77,7 +77,7 @@ void Data::move(Data& other) { _bytes = other._bytes; _size = other._size; - + other._bytes = nullptr; other._size = 0; } @@ -100,7 +100,7 @@ ssize_t Data::getSize() const void Data::copy(const unsigned char* bytes, const ssize_t size) { clear(); - + if (size > 0) { _size = size; @@ -122,4 +122,13 @@ void Data::clear() _size = 0; } +unsigned char* Data::takeBuffer(ssize_t* size) +{ + auto buffer = getBytes(); + if (size) + *size = getSize(); + fastSet(nullptr, 0); + return buffer; +} + NS_CC_END diff --git a/cocos/base/CCData.h b/cocos/base/CCData.h index 4c0d5aea3d0d..5fb840d7c1ae 100644 --- a/cocos/base/CCData.h +++ b/cocos/base/CCData.h @@ -1,7 +1,7 @@ /**************************************************************************** Copyright (c) 2010-2012 cocos2d-x.org 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 @@ -41,64 +41,64 @@ NS_CC_BEGIN class CC_DLL Data { friend class Properties; - + public: /** * This parameter is defined for convenient reference if a null Data object is needed. */ static const Data Null; - + /** * Constructor of Data. */ Data(); - + /** * Copy constructor of Data. */ Data(const Data& other); - + /** * Copy constructor of Data. */ Data(Data&& other); - + /** * Destructor of Data. */ ~Data(); - + /** * Overloads of operator=. */ Data& operator= (const Data& other); - + /** * Overloads of operator=. */ Data& operator= (Data&& other); - + /** * Gets internal bytes of Data. It will return the pointer directly used in Data, so don't delete it. * * @return Pointer of bytes used internal in Data. */ unsigned char* getBytes() const; - + /** * Gets the size of the bytes. * * @return The size of bytes of Data. */ ssize_t getSize() const; - + /** Copies the buffer pointer and its size. * @note This method will copy the whole buffer. * Developer should free the pointer after invoking this method. * @see Data::fastSet */ void copy(const unsigned char* bytes, const ssize_t size); - + /** Fast set the buffer pointer and its size. Please use it carefully. * @param bytes The buffer pointer, note that it have to be allocated by 'malloc' or 'calloc', * since in the destructor of Data, the buffer will be deleted by 'free'. @@ -107,22 +107,45 @@ class CC_DLL Data * @see Data::copy */ void fastSet(unsigned char* bytes, const ssize_t size); - - /** + + /** * Clears data, free buffer and reset data size. */ void clear(); - - /** + + /** * Check whether the data is null. * * @return True if the Data is null, false if not. */ bool isNull() const; - + + /** + * Get the internal buffer of data and set data to empty state. + * + * The ownership of the buffer removed from the data object. + * That is the user have to free the returned buffer. + * The data object is set to empty state, that is internal buffer is set to nullptr + * and size is set to zero. + * Usage: + *
+     *  {@code
+     *  Data d;
+     *  // ...
+     *  ssize_t size;
+     *  unsigned char* buffer = d.takeBuffer(&size);
+     *  // use buffer and size
+     *  free(buffer);
+     *  }
+     * 
& glyphs, FT_BBox *abbox) *abbox = bbox; } -namespace { - inline unsigned char* takeBuffer(Data& data, ssize_t* size) { - auto buffer = data.getBytes(); - if (size) - *size = data.getSize(); - data.fastSet(nullptr, 0); - return buffer; - } -} - unsigned char* CCFreeTypeFont::loadFont(const char *pFontName, ssize_t *size) { @@ -623,7 +613,7 @@ unsigned char* CCFreeTypeFont::loadFont(const char *pFontName, ssize_t *size) Data d; FileUtils::getInstance()->getContents(fullpath, &d); - return takeBuffer(d, size); + return d.takeBuffer(size); } unsigned char* CCFreeTypeFont::loadSystemFont(const char *pFontName, ssize_t *size) From a18ea0036c3feefcd1a9914c877455fdbb33a718 Mon Sep 17 00:00:00 2001 From: slackmoehrle Date: Thu, 28 Apr 2016 21:46:53 -0400 Subject: [PATCH 056/241] added step for incrementing dependency version number --- docs/RELEASE_NOTES.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 9038529031f6..451772b71c13 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -177,7 +177,12 @@ Cocos2d-x has upgraded __OpenSSL__ to version __1.0.2g<__. Beginning __July 11, 2016__, Google Play will block publishing of any new apps or updates that use older versions of __OpenSSL__. It is important that you update the use of __OpenSSL__ in your projects. -If you use v2.x or use older versions of v3.x, you can just update __CURL__ and __OpenSSL__>. To do this, just execute the __download-deps.py__ script in your __Cocos2d-x root__. +If you use v2.x or use older versions of v3.x, you can just update __CURL__ and __OpenSSL__>. +To do this: + +* modify __Cocos2d-x root/external/config.json__ to update the dependency version. For v3.x the dependency version is `v3-deps-92`, and for v2.x it is `v2-deps-5` +* execute the __download-deps.py__ script in your __Cocos2d-x root__. + ```sh (jtsm @ 15 ~) $ cd cocos2d-x From 3d09e529ee436fe4e6dc7a8ed0df13baf83e596e Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 29 Apr 2016 17:11:36 +0800 Subject: [PATCH 057/241] use Ref::release() to release Ref instance --- .../simulator/libsimulator/lib/runtime/ConnectWaitLayer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/simulator/libsimulator/lib/runtime/ConnectWaitLayer.cpp b/tools/simulator/libsimulator/lib/runtime/ConnectWaitLayer.cpp index b482fe2e1e36..8cac5561d18e 100644 --- a/tools/simulator/libsimulator/lib/runtime/ConnectWaitLayer.cpp +++ b/tools/simulator/libsimulator/lib/runtime/ConnectWaitLayer.cpp @@ -150,9 +150,9 @@ ConnectWaitLayer::ConnectWaitLayer() ConnectWaitLayer::~ConnectWaitLayer() { - CC_SAFE_DELETE(_imagebg); - CC_SAFE_DELETE(_imageplay); - CC_SAFE_DELETE(_imageShine); + CC_SAFE_RELEASE(_imagebg); + CC_SAFE_RELEASE(_imageplay); + CC_SAFE_RELEASE(_imageShine); } // clean up: ignore stdin, stdout and stderr From 915ea19e2e81ae359bd18847ef9f99a46d1a6612 Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Fri, 29 Apr 2016 17:13:05 +0800 Subject: [PATCH 058/241] fix tizen cpp template settings --- build/tizen/.cproject | 20 +- .../cpp-template-default/proj.tizen/.cproject | 435 +++++++++++------- .../cpp-template-default/proj.tizen/.tproject | 3 +- 3 files changed, 299 insertions(+), 159 deletions(-) diff --git a/build/tizen/.cproject b/build/tizen/.cproject index a5aea8d190d3..b833b8ab2e51 100644 --- a/build/tizen/.cproject +++ b/build/tizen/.cproject @@ -567,7 +567,25 @@ - diff --git a/templates/cpp-template-default/proj.tizen/.cproject b/templates/cpp-template-default/proj.tizen/.cproject index 71b6342231c5..8d7f5fdd6862 100644 --- a/templates/cpp-template-default/proj.tizen/.cproject +++ b/templates/cpp-template-default/proj.tizen/.cproject @@ -12,10 +12,11 @@ + - + @@ -31,69 +32,87 @@ @@ -270,10 +310,11 @@ + - + @@ -283,69 +324,87 @@ - @@ -516,10 +596,11 @@ + - + @@ -535,69 +616,87 @@ diff --git a/templates/cpp-template-default/proj.tizen/.tproject b/templates/cpp-template-default/proj.tizen/.tproject index f1cc1fd7a086..824eaa1748c9 100644 --- a/templates/cpp-template-default/proj.tizen/.tproject +++ b/templates/cpp-template-default/proj.tizen/.tproject @@ -2,10 +2,11 @@ - mobile-2.3 + mobile-2.4 + From b2b774b66b4b7ac0cf7ea6e5653b5dfb57b06c96 Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Fri, 29 Apr 2016 17:53:12 +0800 Subject: [PATCH 059/241] fix tizen lua template --- .../runtime-src/proj.tizen/.cproject | 434 +++++++++++------- .../runtime-src/proj.tizen/.tproject | 3 +- 2 files changed, 279 insertions(+), 158 deletions(-) diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.cproject b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.cproject index 0306af5f129b..380cebcf2388 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.cproject +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.cproject @@ -12,10 +12,11 @@ + - + @@ -25,69 +26,87 @@ @@ -277,10 +317,11 @@ + - + @@ -290,69 +331,87 @@ @@ -528,10 +608,11 @@ + - + @@ -541,69 +622,87 @@ diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.tproject b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.tproject index f1cc1fd7a086..824eaa1748c9 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.tproject +++ b/templates/lua-template-default/frameworks/runtime-src/proj.tizen/.tproject @@ -2,10 +2,11 @@ - mobile-2.3 + mobile-2.4 + From a640f007efd4ab300ed9b60e27d2bd93debdcb62 Mon Sep 17 00:00:00 2001 From: Zhe Wang Date: Sat, 30 Apr 2016 15:20:24 +0800 Subject: [PATCH 060/241] Fix doxygen format mistakes in enum class Platform An user reported this error in the forum http://forum.cocos.com/t/api-document/36199/2 I noticed that our doxygen was written in wrong format. --- cocos/platform/CCApplicationProtocol.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/cocos/platform/CCApplicationProtocol.h b/cocos/platform/CCApplicationProtocol.h index 9ac60baa2b98..8c3532c0d394 100644 --- a/cocos/platform/CCApplicationProtocol.h +++ b/cocos/platform/CCApplicationProtocol.h @@ -46,18 +46,18 @@ class CC_DLL ApplicationProtocol */ enum class Platform { - OS_WINDOWS,/** Windows */ - OS_LINUX,/** Linux */ - OS_MAC,/** Mac*/ - OS_ANDROID,/** Android */ - OS_IPHONE,/** Iphone */ - OS_IPAD,/** Ipad */ - OS_BLACKBERRY,/** BLACKBERRY */ - OS_NACL,/** Nacl */ - OS_EMSCRIPTEN,/** Emscripten */ - OS_TIZEN,/** Tizen */ - OS_WINRT,/** Windows Store Applications */ - OS_WP8/** Windows Phone Applications */ + OS_WINDOWS, /**< Windows */ + OS_LINUX, /**< Linux */ + OS_MAC, /**< Mac OS X*/ + OS_ANDROID, /**< Android */ + OS_IPHONE, /**< iPhone */ + OS_IPAD, /**< iPad */ + OS_BLACKBERRY, /**< BlackBerry */ + OS_NACL, /**< Native Client in Chrome */ + OS_EMSCRIPTEN, /**< Emscripten */ + OS_TIZEN, /**< Tizen */ + OS_WINRT, /**< Windows Runtime Applications */ + OS_WP8 /**< Windows Phone 8 Applications */ }; /** From 6433172fae492cb53d4b476ab8f9b5768d112bec Mon Sep 17 00:00:00 2001 From: mogemimi Date: Mon, 2 May 2016 10:57:03 +0900 Subject: [PATCH 061/241] Fix shadow variable warning in GameNode3DReader --- .../GameNode3DReader/GameNode3DReader.cpp | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/GameNode3DReader/GameNode3DReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/GameNode3DReader/GameNode3DReader.cpp index dba7e5569491..164412b4219d 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/GameNode3DReader/GameNode3DReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/GameNode3DReader/GameNode3DReader.cpp @@ -161,26 +161,26 @@ namespace cocostudio const tinyxml2::XMLElement* child = objectData->FirstChildElement(); while (child) { - std::string name = child->Name(); + std::string childName = child->Name(); - if (name == "LeftImage") + if (childName == "LeftImage") { attribute = child->FirstAttribute(); while (attribute) { - name = attribute->Name(); + std::string attributeName = attribute->Name(); std::string value = attribute->Value(); - if (name == "Path") + if (attributeName == "Path") { leftPath = value; } - else if (name == "Type") + else if (attributeName == "Type") { leftResourceType = getResourceType(value);; } - else if (name == "Plist") + else if (attributeName == "Plist") { leftPlistFile = value; } @@ -194,24 +194,24 @@ namespace cocostudio fbs->_textures.push_back(builder->CreateString(leftPlistFile)); } } - else if (name == "RightImage") + else if (childName == "RightImage") { attribute = child->FirstAttribute(); while (attribute) { - name = attribute->Name(); + std::string attributeName = attribute->Name(); std::string value = attribute->Value(); - if (name == "Path") + if (attributeName == "Path") { rightPath = value; } - else if (name == "Type") + else if (attributeName == "Type") { rightResourceType = getResourceType(value);; } - else if (name == "Plist") + else if (attributeName == "Plist") { rightPlistFile = value; } @@ -225,24 +225,24 @@ namespace cocostudio fbs->_textures.push_back(builder->CreateString(rightPlistFile)); } } - else if (name == "UpImage") + else if (childName == "UpImage") { attribute = child->FirstAttribute(); while (attribute) { - name = attribute->Name(); + std::string attributeName = attribute->Name(); std::string value = attribute->Value(); - if (name == "Path") + if (attributeName == "Path") { upPath = value; } - else if (name == "Type") + else if (attributeName == "Type") { upResourceType = getResourceType(value);; } - else if (name == "Plist") + else if (attributeName == "Plist") { upPlistFile = value; } @@ -256,24 +256,24 @@ namespace cocostudio fbs->_textures.push_back(builder->CreateString(upPlistFile)); } } - else if (name == "DownImage") + else if (childName == "DownImage") { attribute = child->FirstAttribute(); while (attribute) { - name = attribute->Name(); + std::string attributeName = attribute->Name(); std::string value = attribute->Value(); - if (name == "Path") + if (attributeName == "Path") { downPath = value; } - else if (name == "Type") + else if (attributeName == "Type") { downResourceType = getResourceType(value);; } - else if (name == "Plist") + else if (attributeName == "Plist") { downPlistFile = value; } @@ -287,24 +287,24 @@ namespace cocostudio fbs->_textures.push_back(builder->CreateString(downPlistFile)); } } - else if (name == "ForwardImage") + else if (childName == "ForwardImage") { attribute = child->FirstAttribute(); while (attribute) { - name = attribute->Name(); + std::string attributeName = attribute->Name(); std::string value = attribute->Value(); - if (name == "Path") + if (attributeName == "Path") { forwardPath = value; } - else if (name == "Type") + else if (attributeName == "Type") { forwardResourceType = getResourceType(value);; } - else if (name == "Plist") + else if (attributeName == "Plist") { forwardPlistFile = value; } @@ -318,24 +318,24 @@ namespace cocostudio fbs->_textures.push_back(builder->CreateString(forwardPlistFile)); } } - else if (name == "BackImage") + else if (childName == "BackImage") { attribute = child->FirstAttribute(); while (attribute) { - name = attribute->Name(); + std::string attributeName = attribute->Name(); std::string value = attribute->Value(); - if (name == "Path") + if (attributeName == "Path") { backPath = value; } - else if (name == "Type") + else if (attributeName == "Type") { backResourceType = getResourceType(value);; } - else if (name == "Plist") + else if (attributeName == "Plist") { backPlistFile = value; } From d41207e99a289fb084a745d16ac7db854616fd3e Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 3 May 2016 10:56:03 +0800 Subject: [PATCH 062/241] avoid remove event listener multiple times --- cocos/base/CCEventDispatcher.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cocos/base/CCEventDispatcher.cpp b/cocos/base/CCEventDispatcher.cpp index 9be52d8bfcaf..c53f6903cc44 100644 --- a/cocos/base/CCEventDispatcher.cpp +++ b/cocos/base/CCEventDispatcher.cpp @@ -604,6 +604,10 @@ void EventDispatcher::removeEventListener(EventListener* listener) { if (listener == nullptr) return; + + // just return if listener is in _toRemovedListeners to avoid remove listeners more than onece + if (std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), listener) != _toRemovedListeners.end()) + return; bool isFound = false; From 675fe8e811c952e4e755b5daa0e69d10ec69987d Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Tue, 3 May 2016 11:02:22 +0800 Subject: [PATCH 063/241] fix template project running --- build/tizen/.project | 6 +++++ .../cpp-template-default/proj.tizen/.cproject | 14 +++++++---- .../cpp-template-default/proj.tizen/.project | 23 +++++++++++++------ .../proj.tizen/src/main.cpp | 5 +++- .../runtime-src/proj.tizen/src/main.cpp | 3 +++ 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/build/tizen/.project b/build/tizen/.project index 3488b1a8ea0d..c19e93581851 100644 --- a/build/tizen/.project +++ b/build/tizen/.project @@ -5,6 +5,11 @@ + + org.tizen.nativecore.apichecker.apicheckerbuilder + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder clean,full,incremental, @@ -29,6 +34,7 @@ org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature org.tizen.nativecore.apichecker.core.tizenCppNature + org.tizen.nativecore.apichecker.apicheckernature diff --git a/templates/cpp-template-default/proj.tizen/.cproject b/templates/cpp-template-default/proj.tizen/.cproject index 8d7f5fdd6862..4bb8c7643962 100644 --- a/templates/cpp-template-default/proj.tizen/.cproject +++ b/templates/cpp-template-default/proj.tizen/.cproject @@ -16,7 +16,7 @@ - + @@ -122,6 +122,7 @@ @@ -129,6 +130,7 @@ @@ -254,13 +256,13 @@ @@ -705,8 +708,9 @@
\ No newline at end of file diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems index f3434dec099b..48a92cdf6e89 100644 --- a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems +++ b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems @@ -76,17 +76,6 @@ - - - - - - - - - - - @@ -122,7 +111,6 @@ - @@ -152,59 +140,28 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -336,18 +293,6 @@ - - - - - - - - - - - - @@ -383,7 +328,6 @@ - @@ -417,58 +361,29 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters index 76d7807cc29e..1be490e7ad89 100644 --- a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters +++ b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters @@ -339,42 +339,6 @@ Classes\ExtensionsTest\CocosBuilderTest\ScrollViewTest - - Classes\ExtensionsTest\CocoStudioActionTimelineTest - - - Classes\ExtensionsTest\CocoStudioArmatureTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioSceneTest - - - Classes\ExtensionsTest\CocoStudioSceneTest\TriggerCode - - - Classes\ExtensionsTest\CocoStudioSceneTest\TriggerCode - - - Classes\ExtensionsTest\CocoStudioSceneTest\TriggerCode - Classes\ExtensionsTest\ControlExtensionTest @@ -543,18 +507,6 @@ Classes\UITest\CocostudioGUISceneTest - - Classes\UITest\CocostudioGUISceneTest - - - Classes\UITest\CocostudioGUISceneTest - - - Classes\UITest\CocostudioGUISceneTest - - - Classes\UITest\CocostudioGUISceneTest - Classes\UITest\CocostudioGUISceneTest @@ -564,15 +516,9 @@ Classes\UITest\CocostudioGUISceneTest - - Classes\UITest\CocostudioGUISceneTest - Classes\UITest\CocostudioGUISceneTest - - Classes\UITest\CocostudioGUISceneTest - Classes\UnitTest @@ -591,120 +537,54 @@ Classes\UITest - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomImageTest - - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomParticleWidgetTest - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - Classes\UITest\CocostudioGUISceneTest\UIButtonTest - - Classes\UITest\CocostudioGUISceneTest\UIButtonTest - Classes\UITest\CocostudioGUISceneTest\UICheckBoxTest - - Classes\UITest\CocostudioGUISceneTest\UICheckBoxTest - Classes\UITest\CocostudioGUISceneTest\UIFocusTest Classes\UITest\CocostudioGUISceneTest\UIImageViewTest - - Classes\UITest\CocostudioGUISceneTest\UIImageViewTest - Classes\UITest\CocostudioGUISceneTest\UILayoutTest - - Classes\UITest\CocostudioGUISceneTest\UILayoutTest - Classes\UITest\CocostudioGUISceneTest\UIListViewTest - - Classes\UITest\CocostudioGUISceneTest\UIListViewTest - Classes\UITest\CocostudioGUISceneTest\UILoadingBarTest - - Classes\UITest\CocostudioGUISceneTest\UILoadingBarTest - Classes\UITest\CocostudioGUISceneTest\UIPageViewTest - - Classes\UITest\CocostudioGUISceneTest\UIPageViewTest - Classes\UITest\CocostudioGUISceneTest\UIRichTextTest Classes\UITest\CocostudioGUISceneTest\UIScrollViewTest - - Classes\UITest\CocostudioGUISceneTest\UIScrollViewTest - Classes\UITest\CocostudioGUISceneTest\UISliderTest - - Classes\UITest\CocostudioGUISceneTest\UISliderTest - Classes\UITest\CocostudioGUISceneTest\UITextAtlasTest - - Classes\UITest\CocostudioGUISceneTest\UITextAtlasTest - Classes\UITest\CocostudioGUISceneTest\UITextBMFontTest - - Classes\UITest\CocostudioGUISceneTest\UITextBMFontTest - Classes\UITest\CocostudioGUISceneTest\UITextFieldTest - - Classes\UITest\CocostudioGUISceneTest\UITextFieldTest - Classes\UITest\CocostudioGUISceneTest\UITextTest - - Classes\UITest\CocostudioGUISceneTest\UITextTest - Classes\UITest\CocostudioGUISceneTest\UIWidgetAddNodeTest - - Classes\UITest\CocostudioGUISceneTest\UIWidgetAddNodeTest - - - Classes\UITest\CocostudioGUISceneTest\CocostudioParserTest - Classes\ExtensionsTest\AssetsManagerExTest @@ -712,9 +592,6 @@ - - Classes\UITest\CocostudioGUISceneTest\UITextFieldTest - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomWidgetCallbackBindTest @@ -730,9 +607,6 @@ Classes\Particle3DTest - - Classes\CocosStudio3DTest - Classes\TerrainTest @@ -917,39 +791,6 @@ Classes\ExtensionsTest\CocosBuilderTest\TestHeader - - Classes\ExtensionsTest\CocoStudioActionTimelineTest - - - Classes\ExtensionsTest\CocoStudioArmatureTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioComponentsTest - - - Classes\ExtensionsTest\CocoStudioSceneTest - - - Classes\ExtensionsTest\CocoStudioSceneTest\TriggerCode - - - Classes\ExtensionsTest\CocoStudioSceneTest\TriggerCode - Classes\ExtensionsTest\ControlExtensionTest @@ -1112,18 +953,6 @@ Classes\UITest\CocostudioGUISceneTest - - Classes\UITest\CocostudioGUISceneTest - - - Classes\UITest\CocostudioGUISceneTest - - - Classes\UITest\CocostudioGUISceneTest - - - Classes\UITest\CocostudioGUISceneTest - Classes\UITest\CocostudioGUISceneTest @@ -1133,15 +962,9 @@ Classes\UITest\CocostudioGUISceneTest - - Classes\UITest\CocostudioGUISceneTest - Classes\UITest\CocostudioGUISceneTest - - Classes\UITest\CocostudioGUISceneTest - Classes\UnitTest @@ -1160,117 +983,54 @@ Classes\UITest - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomImageTest - - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomParticleWidgetTest - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - - - Classes\UITest\CocostudioGUISceneTest\CustomWidget - Classes\UITest\CocostudioGUISceneTest\UIButtonTest - - Classes\UITest\CocostudioGUISceneTest\UIButtonTest - Classes\UITest\CocostudioGUISceneTest\UICheckBoxTest - - Classes\UITest\CocostudioGUISceneTest\UICheckBoxTest - Classes\UITest\CocostudioGUISceneTest\UIFocusTest Classes\UITest\CocostudioGUISceneTest\UIImageViewTest - - Classes\UITest\CocostudioGUISceneTest\UIImageViewTest - Classes\UITest\CocostudioGUISceneTest\UILayoutTest - - Classes\UITest\CocostudioGUISceneTest\UILayoutTest - Classes\UITest\CocostudioGUISceneTest\UIListViewTest - - Classes\UITest\CocostudioGUISceneTest\UIListViewTest - Classes\UITest\CocostudioGUISceneTest\UILoadingBarTest - - Classes\UITest\CocostudioGUISceneTest\UILoadingBarTest - Classes\UITest\CocostudioGUISceneTest\UIPageViewTest - - Classes\UITest\CocostudioGUISceneTest\UIPageViewTest - Classes\UITest\CocostudioGUISceneTest\UIRichTextTest Classes\UITest\CocostudioGUISceneTest\UIScrollViewTest - - Classes\UITest\CocostudioGUISceneTest\UIScrollViewTest - Classes\UITest\CocostudioGUISceneTest\UISliderTest - - Classes\UITest\CocostudioGUISceneTest\UISliderTest - Classes\UITest\CocostudioGUISceneTest\UITextAtlasTest - - Classes\UITest\CocostudioGUISceneTest\UITextAtlasTest - Classes\UITest\CocostudioGUISceneTest\UITextBMFontTest - - Classes\UITest\CocostudioGUISceneTest\UITextBMFontTest - Classes\UITest\CocostudioGUISceneTest\UITextFieldTest Classes\UITest\CocostudioGUISceneTest\UITextTest - - Classes\UITest\CocostudioGUISceneTest\UITextTest - Classes\UITest\CocostudioGUISceneTest\UIWidgetAddNodeTest - - Classes\UITest\CocostudioGUISceneTest\UIWidgetAddNodeTest - - - Classes\UITest\CocostudioGUISceneTest\CocostudioParserTest - Classes\ExtensionsTest\AssetsManagerExTest @@ -1361,18 +1121,6 @@ {fa9c060e-9543-478f-bcb8-ab8398ce816d} - - {8a717ab0-bedc-49b7-b8e2-59b8af5f9619} - - - {afafc668-64ed-4e5e-9c8e-67c6bd9d78cf} - - - {661a29a4-770b-45d5-a958-b2e6cac37196} - - - {125637c8-3613-4d92-ba03-3b09d35ba748} - {1e03c44a-f6bc-4668-9ed3-6e597a94a94b} @@ -1544,9 +1292,6 @@ {cf276f2c-502f-4752-9f0a-49910b3a5af3} - - {054ab72c-845e-43ab-8a02-4f73569f7e02} - {6af0635b-c984-43a1-9263-0074e904b50c} @@ -1559,15 +1304,6 @@ {3fd77e97-6478-4076-bcce-78366417556f} - - {5cfc03ef-b92a-4907-aee5-7907fc6a2ec8} - - - {53b3883b-75fd-449a-bff0-049666bcb37f} - - - {acae99cc-d880-4639-8ca6-ea86280f8717} - {4d2df976-e166-4594-9623-f08b80cc89da} @@ -1619,15 +1355,9 @@ {9ce60738-6f45-4d73-9774-2a80062b3944} - - {4f4b4f24-d906-4845-a6fa-52a27d3ec99c} - {2c5dd382-6534-4369-b33c-6b18995e6576} - - {f93dc8a9-3901-446e-bb08-5e51a31a470c} - {2840e615-0b65-4bd3-87b5-b1b36b5e4a3f} @@ -1667,24 +1397,12 @@ - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomWidgetCallbackBindTest - - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomWidgetCallbackBindTest - - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomWidgetCallbackBindTest - Classes\AllocatorTest Classes\Particle3DTest - - Classes\CocosStudio3DTest - Classes\TerrainTest From d72fadf6cc182d7c76836fdf45a8b578022a4b8e Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Fri, 6 May 2016 05:44:31 +0000 Subject: [PATCH 087/241] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js | 4 ++-- cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp | 4 ++-- cocos/scripting/lua-bindings/auto/api/Node.lua | 2 +- cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js index bd3d59153b63..d13ad8ad23fb 100644 --- a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js +++ b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js @@ -755,10 +755,10 @@ str /** * @method setPhysicsBody - * @param {cc.Component} arg0 + * @param {cc.PhysicsBody} arg0 */ setPhysicsBody : function ( -component +physicsbody ) { }, diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp index e267a38347b0..43030aa1a59d 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp @@ -1997,14 +1997,14 @@ bool js_cocos2dx_Node_setPhysicsBody(JSContext *cx, uint32_t argc, jsval *vp) cocos2d::Node* cobj = (cocos2d::Node *)(proxy ? proxy->ptr : NULL); JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Node_setPhysicsBody : Invalid Native Object"); if (argc == 1) { - cocos2d::Component* arg0 = nullptr; + cocos2d::PhysicsBody* arg0 = nullptr; do { if (args.get(0).isNull()) { arg0 = nullptr; break; } if (!args.get(0).isObject()) { ok = false; break; } js_proxy_t *jsProxy; JS::RootedObject tmpObj(cx, args.get(0).toObjectOrNull()); jsProxy = jsb_get_js_proxy(tmpObj); - arg0 = (cocos2d::Component*)(jsProxy ? jsProxy->ptr : NULL); + arg0 = (cocos2d::PhysicsBody*)(jsProxy ? jsProxy->ptr : NULL); JSB_PRECONDITION2( arg0, cx, false, "Invalid Native Object"); } while (0); JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_Node_setPhysicsBody : Error processing arguments"); diff --git a/cocos/scripting/lua-bindings/auto/api/Node.lua b/cocos/scripting/lua-bindings/auto/api/Node.lua index 680e3f4c0f3d..ca2b99431c98 100644 --- a/cocos/scripting/lua-bindings/auto/api/Node.lua +++ b/cocos/scripting/lua-bindings/auto/api/Node.lua @@ -28,7 +28,7 @@ -- -- @function [parent=#Node] setPhysicsBody -- @param self --- @param #cc.Component physicsBody +-- @param #cc.PhysicsBody physicsBody -- @return Node#Node self (return value: cc.Node) -------------------------------- diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index ca80d6c79ba2..7aa6a6297325 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -3768,9 +3768,9 @@ int lua_cocos2dx_Node_setPhysicsBody(lua_State* tolua_S) argc = lua_gettop(tolua_S)-1; if (argc == 1) { - cocos2d::Component* arg0; + cocos2d::PhysicsBody* arg0; - ok &= luaval_to_object(tolua_S, 2, "cc.Component",&arg0, "cc.Node:setPhysicsBody"); + ok &= luaval_to_object(tolua_S, 2, "cc.PhysicsBody",&arg0, "cc.Node:setPhysicsBody"); if(!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Node_setPhysicsBody'", nullptr); From 44958d7361400c806f1764aa217cab90f49e82e8 Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 6 May 2016 15:37:10 +0800 Subject: [PATCH 088/241] not add invalid search paths --- tests/cpp-tests/Classes/AppDelegate.cpp | 75 +------------------------ 1 file changed, 1 insertion(+), 74 deletions(-) diff --git a/tests/cpp-tests/Classes/AppDelegate.cpp b/tests/cpp-tests/Classes/AppDelegate.cpp index 6b949c43b9ff..90d188a0ef6c 100644 --- a/tests/cpp-tests/Classes/AppDelegate.cpp +++ b/tests/cpp-tests/Classes/AppDelegate.cpp @@ -83,90 +83,17 @@ bool AppDelegate::applicationDidFinishLaunching() auto resourceSize = Size(960, 640); searchPaths.push_back("hd"); searchPaths.push_back("ccs-res/hd"); - searchPaths.push_back("ccs-res/hd/scenetest"); - searchPaths.push_back("ccs-res/hd/scenetest/ArmatureComponentTest"); - searchPaths.push_back("ccs-res/hd/scenetest/AttributeComponentTest"); - searchPaths.push_back("ccs-res/hd/scenetest/BackgroundComponentTest"); - searchPaths.push_back("ccs-res/hd/scenetest/EffectComponentTest"); - searchPaths.push_back("ccs-res/hd/scenetest/LoadSceneEdtiorFileTest"); - searchPaths.push_back("ccs-res/hd/scenetest/ParticleComponentTest"); - searchPaths.push_back("ccs-res/hd/scenetest/SpriteComponentTest"); - searchPaths.push_back("ccs-res/hd/scenetest/TmxMapComponentTest"); - searchPaths.push_back("ccs-res/hd/scenetest/UIComponentTest"); - searchPaths.push_back("ccs-res/hd/scenetest/TriggerTest"); searchPaths.push_back("ccs-res"); searchPaths.push_back("Manifests"); director->setContentScaleFactor(resourceSize.height/designSize.height); - - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UIButton"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UICheckBox"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UIImageView"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UILabel"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UILabelBMFont"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UILayout/BackgroundImage"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UILayout/Color"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UILayout/Layout"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UILayout/Gradient_Color"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UILayout/Scale9_BackgroundImage"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UILayout/LayoutComponent"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UILoadingBar"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UIPageView"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UIScrollView/Both"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UIScrollView/Horizontal"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UIScrollView/Vertical"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UIScrollView/ScrollViewAndButton"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UISlider"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UITextField"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UIWidgetAddNode"); - searchPaths.push_back("ccs-res/hd/cocosui/UIEditorTest/UIListView/New"); - - searchPaths.push_back("ccs-res/hd/cocosui/CustomTest/CustomWidgetCallbackBindTest"); - searchPaths.push_back("hd/ActionTimeline"); - searchPaths.push_back("ccs-res/hd/armature"); - searchPaths.push_back("ccs-res/hd/scene3DTest"); + searchPaths.push_back("hd/ActionTimeline"); } else { searchPaths.push_back("ccs-res"); - searchPaths.push_back("ccs-res/scenetest/ArmatureComponentTest"); - searchPaths.push_back("ccs-res/scenetest/AttributeComponentTest"); - searchPaths.push_back("ccs-res/scenetest/BackgroundComponentTest"); - searchPaths.push_back("ccs-res/scenetest/EffectComponentTest"); - searchPaths.push_back("ccs-res/scenetest/LoadSceneEdtiorFileTest"); - searchPaths.push_back("ccs-res/scenetest/ParticleComponentTest"); - searchPaths.push_back("ccs-res/scenetest/SpriteComponentTest"); - searchPaths.push_back("ccs-res/scenetest/TmxMapComponentTest"); - searchPaths.push_back("ccs-res/scenetest/UIComponentTest"); - searchPaths.push_back("ccs-res/scenetest/TriggerTest"); - - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UIButton"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UICheckBox"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UIImageView"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UILabel"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UILabelBMFont"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UILayout/BackgroundImage"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UILayout/Color"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UILayout/Layout"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UILayout/Gradient_Color"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UILayout/Scale9_BackgroundImage"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UILayout/LayoutComponent"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UILoadingBar"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UIPageView"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UIScrollView/Both"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UIScrollView/Horizontal"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UIScrollView/Vertical"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UIScrollView/ScrollViewAndButton"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UISlider"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UITextField"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UIWidgetAddNode"); - searchPaths.push_back("ccs-res/cocosui/UIEditorTest/UIListView/New"); - searchPaths.push_back("ccs-res/cocosui/CustomTest/CustomWidgetCallbackBindTest"); searchPaths.push_back("ActionTimeline"); - searchPaths.push_back("ccs-res/armature"); - - searchPaths.push_back("ccs-res/scene3DTest"); } fileUtils->setSearchPaths(searchPaths); From 997011601ef8f349e1d1246819cf449bd3436cfb Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 6 May 2016 15:58:43 +0800 Subject: [PATCH 089/241] revert correct search path --- tools/simulator/libsimulator/lib/runtime/ConfigParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/simulator/libsimulator/lib/runtime/ConfigParser.cpp b/tools/simulator/libsimulator/lib/runtime/ConfigParser.cpp index 2d345dfe8cb8..4e4fa64850d0 100644 --- a/tools/simulator/libsimulator/lib/runtime/ConfigParser.cpp +++ b/tools/simulator/libsimulator/lib/runtime/ConfigParser.cpp @@ -43,7 +43,7 @@ void ConfigParser::readConfig(const string &filepath) #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // revert search path - searchPathArray.erase(searchPathArray.end() - 1); + searchPathArray.erase(searchPathArray.begin()); FileUtils::getInstance()->setSearchPaths(searchPathArray); #endif From 086df25fdcd3275e56a51238deb32896535bc13b Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 6 May 2016 16:19:48 +0800 Subject: [PATCH 090/241] update bindings-generator to fix compiling issues on ubuntu 16.04 --- tools/bindings-generator | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bindings-generator b/tools/bindings-generator index b8cdfb9d3732..353df5756b10 160000 --- a/tools/bindings-generator +++ b/tools/bindings-generator @@ -1 +1 @@ -Subproject commit b8cdfb9d3732ca2cc5dd9609c88ac8294e2d761b +Subproject commit 353df5756b10a2e9662b2866687b30e533cd17a8 From cb8cde63b1bba0cfbcf09f5ba972ecf9936e29eb Mon Sep 17 00:00:00 2001 From: ViusualSJ Date: Fri, 6 May 2016 17:19:33 +0800 Subject: [PATCH 091/241] loader test bug --- tests/js-tests/src/LoaderTest/LoaderTest.js | 33 ++++++--------------- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/tests/js-tests/src/LoaderTest/LoaderTest.js b/tests/js-tests/src/LoaderTest/LoaderTest.js index f9b9d8d6ff78..7ecd0e5e49aa 100644 --- a/tests/js-tests/src/LoaderTest/LoaderTest.js +++ b/tests/js-tests/src/LoaderTest/LoaderTest.js @@ -101,16 +101,19 @@ var LoaderCycleLayer = BaseTestLayer.extend({ var index = 0; var winSize = cc.director.getWinSize(); + + var resultTTF = new cc.LabelTTF("result: unknown"); + resultTTF.x = winSize.width / 2; + resultTTF.y = winSize.height / 2; + var t = this, cb = function(num){ - var labelTTF = new cc.LabelTTF(num + " file failed"); - labelTTF.x = index++*100 + winSize.width - 150; - labelTTF.y = winSize.height / 2 - 20; + resultTTF.setString("result: " + num + " file load failed"); if(num === 1) - labelTTF.setColor(cc.color.GREEN); + resultTTF.setColor(cc.color.GREEN); else - labelTTF.setColor(cc.color.RED); - t.addChild(labelTTF); + resultTTF.setColor(cc.color.RED); + t.addChild(resultTTF); if(index < 4) t.test(cb); }; @@ -161,24 +164,6 @@ var LoaderCycleLayer = BaseTestLayer.extend({ this.addChild(info1); this.addChild(info2); this.addChild(info3); - - var info4 = new cc.LabelTTF("test 1"); - info4.x = winSize.width / 2 - 50; - info4.y = winSize.height / 2; - var info5 = new cc.LabelTTF("test 2"); - info5.x = winSize.width / 2 - 150; - info5.y = winSize.height / 2; - var info6 = new cc.LabelTTF("test 3"); - info6.x = winSize.width / 2 + 50; - info6.y = winSize.height / 2; - var info7 = new cc.LabelTTF("test 4"); - info7.x = winSize.width / 2 + 150; - info7.y = winSize.height / 2; - - this.addChild(info4); - this.addChild(info5); - this.addChild(info6); - this.addChild(info7); }, test: function(cb){ From e4d91f55775464a0c7ed47914957a4c7e50a4141 Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Fri, 6 May 2016 18:43:26 +0800 Subject: [PATCH 092/241] fix tizen videoplayer issue --- cocos/ui/UIVideoPlayer-tizen.cpp | 12 ++++++++++++ templates/cpp-template-default/proj.tizen/.cproject | 2 +- .../UITest/CocoStudioGUITest/CocosGUIScene.cpp | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cocos/ui/UIVideoPlayer-tizen.cpp b/cocos/ui/UIVideoPlayer-tizen.cpp index fb9fb559529a..ed8c3c0eb12c 100644 --- a/cocos/ui/UIVideoPlayer-tizen.cpp +++ b/cocos/ui/UIVideoPlayer-tizen.cpp @@ -365,6 +365,18 @@ bool VideoPlayer::isPlaying() const return _isPlaying; } +void VideoPlayer::onEnter() +{ + Widget::onEnter(); + this->setVisible(false); +} + +void VideoPlayer::onExit() +{ + Widget::onExit(); + this->setVisible(true); +} + void VideoPlayer::setVisible(bool visible) { cocos2d::ui::Widget::setVisible(visible); diff --git a/templates/cpp-template-default/proj.tizen/.cproject b/templates/cpp-template-default/proj.tizen/.cproject index 4bb8c7643962..ed828ab30f47 100644 --- a/templates/cpp-template-default/proj.tizen/.cproject +++ b/templates/cpp-template-default/proj.tizen/.cproject @@ -16,7 +16,7 @@ - + diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CocosGUIScene.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CocosGUIScene.cpp index 2a553cd91573..33afe20945cd 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CocosGUIScene.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CocosGUIScene.cpp @@ -19,7 +19,7 @@ #include "UIFocusTest/UIFocusTest.h" #include "UITabControlTest/UITabControlTest.h" -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) && !defined(CC_TARGET_OS_TVOS) #include "UIVideoPlayerTest/UIVideoPlayerTest.h" #include "UIWebViewTest/UIWebViewTest.h" #endif @@ -30,7 +30,7 @@ GUIDynamicCreateTests::GUIDynamicCreateTests() { -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) && !defined(CC_TARGET_OS_TVOS) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) && !defined(CC_TARGET_OS_TVOS) addTest("VideoPlayer Test", [](){ return new (std::nothrow) VideoPlayerTests; }); addTest("WebView Test", [](){ return new (std::nothrow) WebViewTests; }); #endif From 25b9f787fc57f190257faf45ef1aff1dffd2ae2b Mon Sep 17 00:00:00 2001 From: pandamicro Date: Fri, 6 May 2016 22:10:38 +0800 Subject: [PATCH 093/241] update web engine ref --- web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web b/web index 7b25ebce6e6e..cb118aaa2b35 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 7b25ebce6e6ebf07df41b53439bfad1df40894a9 +Subproject commit cb118aaa2b3551c0fa3d7b880d76edc7a7ce46b5 From d0fc3ec4c431b0ee6c08e0782c28d89a8e518212 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Sat, 7 May 2016 14:37:36 +0800 Subject: [PATCH 094/241] Add cc.game.end to close game window --- .../js-bindings/manual/ScriptingCore.cpp | 19 +++++++++++++++++++ .../js-bindings/manual/ScriptingCore.h | 1 + .../scripting/js-bindings/script/jsb_boot.js | 7 +++++++ .../src/ClippingNodeTest/ClippingNodeTest.js | 2 +- tests/js-tests/src/GUITest/UISceneManager.js | 10 ++++++++++ tests/js-tests/src/tests-main.js | 2 +- tests/js-tests/src/tests_resources.js | 4 ++-- web | 2 +- 8 files changed, 42 insertions(+), 5 deletions(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp index 33d7d12f1a52..856726f1b70b 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp @@ -384,6 +384,16 @@ bool JSB_core_restartVM(JSContext *cx, uint32_t argc, jsval *vp) return true; }; +bool JSB_closeWindow(JSContext *cx, uint32_t argc, jsval *vp) +{ + ScriptingCore::getInstance()->cleanup(); + Director::getInstance()->end(); +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + exit(0); +#endif + return true; +}; + void registerDefaultClasses(JSContext* cx, JS::HandleObject global) { // first, try to get the ns JS::RootedValue nsval(cx); @@ -427,6 +437,7 @@ void registerDefaultClasses(JSContext* cx, JS::HandleObject global) { JS_DefineFunction(cx, global, "__restartVM", JSB_core_restartVM, 0, JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_ENUMERATE ); JS_DefineFunction(cx, global, "__cleanScript", JSB_cleanScript, 1, JSPROP_READONLY | JSPROP_PERMANENT); JS_DefineFunction(cx, global, "__isObjectValid", ScriptingCore::isObjectValid, 1, JSPROP_READONLY | JSPROP_PERMANENT); + JS_DefineFunction(cx, global, "close", JSB_closeWindow, 0, JSPROP_READONLY | JSPROP_PERMANENT); } static void sc_finalize(JSFreeOp *freeOp, JSObject *obj) { @@ -461,6 +472,7 @@ ScriptingCore::ScriptingCore() : _rt(nullptr) , _cx(nullptr) , _jsInited(false) +, _needCleanup(false) //, _global(nullptr) //, _debugGlobal(nullptr) , _callFromScript(false) @@ -625,6 +637,8 @@ void ScriptingCore::createGlobalContext() { sc_register_sth callback = *it; callback(_cx, _global.ref()); } + + _needCleanup = true; } static std::string RemoveFileExt(const std::string& filePath) { @@ -820,6 +834,9 @@ ScriptingCore::~ScriptingCore() void ScriptingCore::cleanup() { + if (!_needCleanup) { + return; + } localStorageFree(); removeAllRoots(_cx); garbageCollect(); @@ -849,6 +866,8 @@ void ScriptingCore::cleanup() _js_global_type_map.clear(); filename_script.clear(); registrationList.clear(); + + _needCleanup = false; } void ScriptingCore::reportError(JSContext *cx, const char *message, JSErrorReport *report) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.h b/cocos/scripting/js-bindings/manual/ScriptingCore.h index 586cb783175c..fad025305005 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.h +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.h @@ -85,6 +85,7 @@ class CC_JS_DLL ScriptingCore : public cocos2d::ScriptEngineProtocol mozilla::Maybe _debugGlobal; SimpleRunLoop* _runLoop; bool _jsInited; + bool _needCleanup; bool _callFromScript; ScriptingCore(); diff --git a/cocos/scripting/js-bindings/script/jsb_boot.js b/cocos/scripting/js-bindings/script/jsb_boot.js index f1299ef9aba9..7d8a62745597 100644 --- a/cocos/scripting/js-bindings/script/jsb_boot.js +++ b/cocos/scripting/js-bindings/script/jsb_boot.js @@ -1662,6 +1662,13 @@ cc.game = /** @lends cc.game# */{ __restartVM(); }, + /** + * End game, it will close the game window + */ + end: function () { + close(); + }, + // @Game loading /** * Prepare game. diff --git a/tests/js-tests/src/ClippingNodeTest/ClippingNodeTest.js b/tests/js-tests/src/ClippingNodeTest/ClippingNodeTest.js index 0628af6facd7..d0211126c6da 100644 --- a/tests/js-tests/src/ClippingNodeTest/ClippingNodeTest.js +++ b/tests/js-tests/src/ClippingNodeTest/ClippingNodeTest.js @@ -705,7 +705,7 @@ var arrayOfClippingNodeTest = [ ]; -if (!cc.sys.isNative && ("opengl" in cc.sys.capabilities)) { +if (!cc.sys.isNative && cc._renderType !== cc.game.RENDER_TYPE_CANVAS) { arrayOfClippingNodeTest.push( ShapeInvertedTest, SpriteNoAlphaTest, diff --git a/tests/js-tests/src/GUITest/UISceneManager.js b/tests/js-tests/src/GUITest/UISceneManager.js index 18b0cd4d04b2..aca4e74b5f62 100644 --- a/tests/js-tests/src/GUITest/UISceneManager.js +++ b/tests/js-tests/src/GUITest/UISceneManager.js @@ -673,6 +673,16 @@ } ]; } + else { + testingItems["UIRichText"] = [ + { + title: "UIRichTextTest", + func: function () { + return new UIRichTextTest(); + } + } + ]; + } if (cc.sys.os == cc.sys.OS_ANDROID || cc.sys.os == cc.sys.OS_IOS || !cc.sys.isNative) { diff --git a/tests/js-tests/src/tests-main.js b/tests/js-tests/src/tests-main.js index 8d3df7811522..168696ec9906 100644 --- a/tests/js-tests/src/tests-main.js +++ b/tests/js-tests/src/tests-main.js @@ -215,7 +215,7 @@ var TestController = cc.LayerGradient.extend({ onCloseCallback:function () { if (cc.sys.isNative) { - cc.director.end(); + cc.game.end(); } else { window.history && window.history.go(-1); diff --git a/tests/js-tests/src/tests_resources.js b/tests/js-tests/src/tests_resources.js index d323dd5d352e..ba63ccad3656 100644 --- a/tests/js-tests/src/tests_resources.js +++ b/tests/js-tests/src/tests_resources.js @@ -237,6 +237,7 @@ var g_resources = [ s_pathF1, s_pathF2, s_pathBlock, + s_back2, s_back3, s_fire, s_pathClose, @@ -399,8 +400,7 @@ var g_label = [ ]; var g_transitions = [ - s_back1, - s_back2 + s_back1 ]; var g_box2d = [ diff --git a/web b/web index cb118aaa2b35..f21308833d4f 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit cb118aaa2b3551c0fa3d7b880d76edc7a7ce46b5 +Subproject commit f21308833d4ff8594c691f001a235a7e8a2dcd0b From 04ebba425f88960c6ef60a282d3519a0887bcccf Mon Sep 17 00:00:00 2001 From: Naoyuki Totani Date: Sat, 7 May 2016 16:23:23 +0900 Subject: [PATCH 095/241] add missing lua const values --- .../lua-bindings/script/framework/extends/UIListView.lua | 4 ++++ .../lua-bindings/script/framework/extends/UIScrollView.lua | 4 ++++ cocos/scripting/lua-bindings/script/ui/DeprecatedUIEnum.lua | 2 ++ cocos/scripting/lua-bindings/script/ui/GuiConstants.lua | 2 ++ 4 files changed, 12 insertions(+) diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UIListView.lua b/cocos/scripting/lua-bindings/script/framework/extends/UIListView.lua index cab47a935cbf..a9f7f1ef324e 100644 --- a/cocos/scripting/lua-bindings/script/framework/extends/UIListView.lua +++ b/cocos/scripting/lua-bindings/script/framework/extends/UIListView.lua @@ -60,6 +60,10 @@ function ListView:onScroll(callback) event.name = "BOUNCE_LEFT" elseif eventType == 8 then event.name = "BOUNCE_RIGHT" + elseif eventType == 9 then + event.name = "CONTAINER_MOVED" + elseif eventType == 10 then + event.name = "AUTOSCROLL_ENDED" end event.target = sender callback(event) diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UIScrollView.lua b/cocos/scripting/lua-bindings/script/framework/extends/UIScrollView.lua index 601faf936bb7..0fd4c69f519d 100644 --- a/cocos/scripting/lua-bindings/script/framework/extends/UIScrollView.lua +++ b/cocos/scripting/lua-bindings/script/framework/extends/UIScrollView.lua @@ -46,6 +46,10 @@ function ScrollView:onEvent(callback) event.name = "BOUNCE_LEFT" elseif eventType == 8 then event.name = "BOUNCE_RIGHT" + elseif eventType == 9 then + event.name = "CONTAINER_MOVED" + elseif eventType == 10 then + event.name = "AUTOSCROLL_ENDED" end event.target = sender callback(event) diff --git a/cocos/scripting/lua-bindings/script/ui/DeprecatedUIEnum.lua b/cocos/scripting/lua-bindings/script/ui/DeprecatedUIEnum.lua index ae7d63f96418..219d4db4cce3 100644 --- a/cocos/scripting/lua-bindings/script/ui/DeprecatedUIEnum.lua +++ b/cocos/scripting/lua-bindings/script/ui/DeprecatedUIEnum.lua @@ -59,6 +59,8 @@ SCROLLVIEW_EVENT_BOUNCE_TOP = ccui.ScrollviewEventType.bounceTop SCROLLVIEW_EVENT_BOUNCE_BOTTOM = ccui.ScrollviewEventType.bounceBottom SCROLLVIEW_EVENT_BOUNCE_LEFT = ccui.ScrollviewEventType.bounceLeft SCROLLVIEW_EVENT_BOUNCE_RIGHT = ccui.ScrollviewEventType.bounceRight +SCROLLVIEW_EVENT_CONTAINER_MOVED = ccui.ScrollviewEventType.containerMoved +SCROLLVIEW_EVENT_AUTOSCROLL_ENDED = ccui.ScrollviewEventType.autoscrollEnded PAGEVIEW_EVENT_TURNING = ccui.PageViewEventType.turning diff --git a/cocos/scripting/lua-bindings/script/ui/GuiConstants.lua b/cocos/scripting/lua-bindings/script/ui/GuiConstants.lua index 3a522ffa40a7..58bdd6358e41 100644 --- a/cocos/scripting/lua-bindings/script/ui/GuiConstants.lua +++ b/cocos/scripting/lua-bindings/script/ui/GuiConstants.lua @@ -152,6 +152,8 @@ ccui.ScrollviewEventType = { bounceBottom = 6, bounceLeft = 7, bounceRight = 8, + containerMoved = 9, + autoscrollEnded = 10, } ccui.ListViewDirection = { From 1980311204c5956f552a4d0ac9fbadce266aaf71 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Sat, 7 May 2016 17:31:58 +0800 Subject: [PATCH 096/241] Fix OpenGL test issue on web --- tests/js-tests/src/OpenGLTest/OpenGLTest.js | 8 +++++--- web | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/js-tests/src/OpenGLTest/OpenGLTest.js b/tests/js-tests/src/OpenGLTest/OpenGLTest.js index 8443e52ec64e..f8072bc4ae81 100644 --- a/tests/js-tests/src/OpenGLTest/OpenGLTest.js +++ b/tests/js-tests/src/OpenGLTest/OpenGLTest.js @@ -458,7 +458,8 @@ var GLNodeCCAPITest = OpenGLTestLayer.extend({ this.shader.use(); this.shader.setUniformsForBuiltins(); - cc.glEnableVertexAttribs( cc.VERTEX_ATTRIB_FLAG_COLOR | cc.VERTEX_ATTRIB_FLAG_POSITION); + gl.enableVertexAttribArray(cc.VERTEX_ATTRIB_COLOR); + gl.enableVertexAttribArray(cc.VERTEX_ATTRIB_POSITION); // Draw fullscreen Square gl.bindBuffer(gl.ARRAY_BUFFER, this.squareVertexPositionBuffer); @@ -604,7 +605,7 @@ var ShaderNode = cc.GLNode.extend({ this.shader.setUniformLocationF32( this.uniformCenter, centerx, centery); this.shader.setUniformLocationF32( this.uniformResolution, 256, 256); - cc.glEnableVertexAttribs( cc.VERTEX_ATTRIB_FLAG_POSITION ); + gl.enableVertexAttribArray( cc.VERTEX_ATTRIB_POSITION ); // Draw fullscreen Square gl.bindBuffer(gl.ARRAY_BUFFER, this.squareVertexPositionBuffer); @@ -1088,7 +1089,8 @@ var TexImage2DTest = OpenGLTestLayer.extend({ this.shader.setUniformsForBuiltins(); gl.bindTexture(gl.TEXTURE_2D, this.my_texture); - cc.glEnableVertexAttribs( cc.VERTEX_ATTRIB_FLAG_TEX_COORDS | cc.VERTEX_ATTRIB_FLAG_POSITION); + gl.enableVertexAttribArray(cc.VERTEX_ATTRIB_POSITION); + gl.enableVertexAttribArray(cc.VERTEX_ATTRIB_TEX_COORDS); // Draw fullscreen Square gl.bindBuffer(gl.ARRAY_BUFFER, this.squareVertexPositionBuffer); diff --git a/web b/web index f21308833d4f..d176dc4f7439 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit f21308833d4ff8594c691f001a235a7e8a2dcd0b +Subproject commit d176dc4f74396746445112d030c2fa63875e5bf8 From fc9880ab4983a53327b1f1b6393450c348291a2f Mon Sep 17 00:00:00 2001 From: halx99 Date: Sat, 7 May 2016 09:10:53 -0500 Subject: [PATCH 097/241] Add captureNode for cocos2d::utils (#15558) * Add captureNode for cocos2d::utils Add captureNode for cocos2d::utils and fix CC_DLL syntax. * Add test case for utils::captureNode Add test case for utils::captureNode. * Store captured image to disk with RGB. * Trigger jenkins check --- cocos/base/ccUtils.cpp | 45 ++++++++++++ cocos/base/ccUtils.h | 28 +++++--- .../NewRendererTest/NewRendererTest.cpp | 69 ++++++++++++++++++- .../Classes/NewRendererTest/NewRendererTest.h | 17 +++++ 4 files changed, 149 insertions(+), 10 deletions(-) diff --git a/cocos/base/ccUtils.cpp b/cocos/base/ccUtils.cpp index 4655d98eb184..36d66f03475d 100644 --- a/cocos/base/ccUtils.cpp +++ b/cocos/base/ccUtils.cpp @@ -33,9 +33,11 @@ THE SOFTWARE. #include "base/base64.h" #include "renderer/CCCustomCommand.h" #include "renderer/CCRenderer.h" + #include "platform/CCImage.h" #include "platform/CCFileUtils.h" #include "2d/CCSprite.h" +#include "2d/CCRenderTexture.h" NS_CC_BEGIN @@ -174,6 +176,49 @@ void captureScreen(const std::function& afterCap }); } +Image* captureNode(Node* startNode, float scale) +{ // The best snapshot API, support Scene and any Node + auto& size = startNode->getContentSize(); + + Director::getInstance()->setNextDeltaTimeZero(true); + + RenderTexture* finalRtx = nullptr; + + auto rtx = RenderTexture::create(size.width, size.height, Texture2D::PixelFormat::RGBA8888, GL_DEPTH24_STENCIL8); + // rtx->setKeepMatrix(true); + Point savedPos = startNode->getPosition(); + Point anchor; + if (!startNode->isIgnoreAnchorPointForPosition()) { + anchor = startNode->getAnchorPoint(); + } + startNode->setPosition(Point(size.width * anchor.x, size.height * anchor.y)); + rtx->begin(); + startNode->visit(); + rtx->end(); + startNode->setPosition(savedPos); + + if (std::abs(scale - 1.0f) < 1e-6/* no scale */) + finalRtx = rtx; + else { + /* scale */ + auto finalRect = Rect(0, 0, size.width, size.height); + Sprite *sprite = Sprite::createWithTexture(rtx->getSprite()->getTexture(), finalRect); + sprite->setAnchorPoint(Point(0, 0)); + sprite->setFlippedY(true); + + finalRtx = RenderTexture::create(size.width * scale, size.height * scale, Texture2D::PixelFormat::RGBA8888, GL_DEPTH24_STENCIL8); + + sprite->setScale(scale); // or use finalRtx->setKeepMatrix(true); + finalRtx->begin(); + sprite->visit(); + finalRtx->end(); + } + + Director::getInstance()->getRenderer()->render(); + + return finalRtx->newImage(); +} + std::vector findChildren(const Node &node, const std::string &name) { std::vector vec; diff --git a/cocos/base/ccUtils.h b/cocos/base/ccUtils.h index 170093660817..32acf3384453 100644 --- a/cocos/base/ccUtils.h +++ b/cocos/base/ccUtils.h @@ -53,6 +53,7 @@ ccNextPOT function is licensed under the same license that is used in Texture2D. int ccNextPOT(int value); class Sprite; +class Image; namespace utils { @@ -64,7 +65,16 @@ namespace utils * base filename ("hello.png" etc.), don't use a relative path containing directory names.("mydir/hello.png" etc.). * @since v3.2 */ - void CC_DLL captureScreen(const std::function& afterCaptured, const std::string& filename); + CC_DLL void captureScreen(const std::function& afterCaptured, const std::string& filename); + + /** Capture a specific Node. + * @param startNode: specify the snapshot Node. It chould be cocos2d::Scene + * @param scale + * @returns: return a Image, then can call saveToFile to save the image as "xxx.png or xxx.jpg". + * @since v3.11 + * !!! remark: Caller is responsible for releasing it by calling delete. + */ + CC_DLL Image* captureNode(Node* startNode, float scale = 1.0f); /** Find children by name, it will return all child that has the same name. * It supports c++ 11 regular expression. It is a helper function of `Node::enumerateChildren()`. @@ -75,7 +85,7 @@ namespace utils * @return Array of Nodes that matches the name * @since v3.2 */ - std::vector CC_DLL findChildren(const Node &node, const std::string &name); + CC_DLL std::vector findChildren(const Node &node, const std::string &name); /** Same to ::atof, but strip the string, remain 7 numbers after '.' before call atof. * Why we need this? Because in android c++_static, atof ( and std::atof ) is unsupported for numbers have long decimal part and contain @@ -83,46 +93,46 @@ namespace utils * @param str The string be to converted to double. * @return Returns converted value of a string. */ - double CC_DLL atof(const char* str); + CC_DLL double atof(const char* str); /** Get current exact time, accurate to nanoseconds. * @return Returns the time in seconds since the Epoch. */ - double CC_DLL gettime(); + CC_DLL double gettime(); /** * Get current time in milliseconds, accurate to nanoseconds * * @return Returns the time in milliseconds since the Epoch. */ - long long CC_DLL getTimeInMilliseconds(); + CC_DLL long long getTimeInMilliseconds(); /** * Calculate unionof bounding box of a node and its children. * @return Returns unionof bounding box of a node and its children. */ - Rect CC_DLL getCascadeBoundingBox(Node *node); + CC_DLL Rect getCascadeBoundingBox(Node *node); /** * Create a sprite instance from base64 encoded image. * @return Returns an instance of sprite */ - Sprite* createSpriteFromBase64(const char* base64String); + CC_DLL Sprite* createSpriteFromBase64(const char* base64String); /** * Find a child by name recursively * @return Returns found node or nullptr */ - Node* findChild(Node* levelRoot, const char* name); + CC_DLL Node* findChild(Node* levelRoot, const char* name); /** * Find a child by tag recursively * @return Returns found node or nullptr */ - Node* findChild(Node* levelRoot, int tag); + CC_DLL Node* findChild(Node* levelRoot, int tag); /** * Find a child by name recursively diff --git a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp index 632fe0925387..17949fdd877d 100644 --- a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp +++ b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.cpp @@ -35,6 +35,7 @@ NewRendererTests::NewRendererTests() ADD_TEST_CASE(NewCullingTest); ADD_TEST_CASE(VBOFullTest); ADD_TEST_CASE(CaptureScreenTest); + ADD_TEST_CASE(CaptureNodeTest); ADD_TEST_CASE(BugAutoCulling); ADD_TEST_CASE(RendererBatchQuadTri); }; @@ -478,6 +479,72 @@ void CaptureScreenTest::afterCaptured(bool succeed, const std::string& outputFil } } +CaptureNodeTest::CaptureNodeTest() +{ + Size s = Director::getInstance()->getWinSize(); + Vec2 left(s.width / 4, s.height / 2); + Vec2 right(s.width / 4 * 3, s.height / 2); + + auto sp1 = Sprite::create("Images/grossini.png"); + sp1->setPosition(left); + auto move1 = MoveBy::create(1, Vec2(s.width / 2, 0)); + auto seq1 = RepeatForever::create(Sequence::create(move1, move1->reverse(), nullptr)); + addChild(sp1); + sp1->runAction(seq1); + auto sp2 = Sprite::create("Images/grossinis_sister1.png"); + sp2->setPosition(right); + auto move2 = MoveBy::create(1, Vec2(-s.width / 2, 0)); + auto seq2 = RepeatForever::create(Sequence::create(move2, move2->reverse(), nullptr)); + addChild(sp2); + sp2->runAction(seq2); + + auto label1 = Label::createWithTTF(TTFConfig("fonts/arial.ttf"), "capture this scene"); + auto mi1 = MenuItemLabel::create(label1, CC_CALLBACK_1(CaptureNodeTest::onCaptured, this)); + auto menu = Menu::create(mi1, nullptr); + addChild(menu); + menu->setPosition(s.width / 2, s.height / 4); + + _filename = ""; +} + +CaptureNodeTest::~CaptureNodeTest() +{ + Director::getInstance()->getTextureCache()->removeTextureForKey(_filename); +} + +std::string CaptureNodeTest::title() const +{ + return "New Renderer"; +} + +std::string CaptureNodeTest::subtitle() const +{ + return "Capture node test, press the menu items to capture this scene with scale 0.5"; +} + +void CaptureNodeTest::onCaptured(Ref*) +{ + Director::getInstance()->getTextureCache()->removeTextureForKey(_filename); + removeChildByTag(childTag); + + _filename = FileUtils::getInstance()->getWritablePath() + "/CaptureNodeTest.png"; + + // capture this + auto image = utils::captureNode(this, 0.5); + + // create a sprite with the captured image directly + auto sp = Sprite::createWithTexture(Director::getInstance()->getTextureCache()->addImage(image, _filename)); + addChild(sp, 0, childTag); + Size s = Director::getInstance()->getWinSize(); + sp->setPosition(s.width / 2, s.height / 2); + + // store to disk + image->saveToFile(_filename); + + // release the captured image + image->release(); +} + BugAutoCulling::BugAutoCulling() { Size s = Director::getInstance()->getWinSize(); @@ -542,4 +609,4 @@ std::string RendererBatchQuadTri::title() const std::string RendererBatchQuadTri::subtitle() const { return "QuadCommand and TriangleCommands are batched together"; -} \ No newline at end of file +} diff --git a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.h b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.h index f48a5535c971..95dd625064e8 100644 --- a/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.h +++ b/tests/cpp-tests/Classes/NewRendererTest/NewRendererTest.h @@ -129,6 +129,23 @@ class CaptureScreenTest : public MultiSceneTest std::string _filename; }; +class CaptureNodeTest : public MultiSceneTest +{ + static const int childTag = 120; +public: + CREATE_FUNC(CaptureNodeTest); + virtual std::string title() const override; + virtual std::string subtitle() const override; + +protected: + CaptureNodeTest(); + ~CaptureNodeTest(); + + void onCaptured(cocos2d::Ref*); + + std::string _filename; +}; + class BugAutoCulling : public MultiSceneTest { public: From bbbb7e498d47eefd162e77b05d013de82f719bf9 Mon Sep 17 00:00:00 2001 From: mogemimi Date: Sun, 8 May 2016 12:32:36 +0900 Subject: [PATCH 098/241] Prevent variable shadowing warnings --- cocos/base/ccUtils.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/cocos/base/ccUtils.cpp b/cocos/base/ccUtils.cpp index 36d66f03475d..a64017d8be5e 100644 --- a/cocos/base/ccUtils.cpp +++ b/cocos/base/ccUtils.cpp @@ -338,9 +338,11 @@ Node* findChild(Node* levelRoot, const char* name) return nullptr; // Find this node - auto target = levelRoot->getChildByName(name); - if (target != nullptr) - return target; + { + auto target = levelRoot->getChildByName(name); + if (target != nullptr) + return target; + } // Find recursively for (auto& child : levelRoot->getChildren()) @@ -358,9 +360,11 @@ Node* findChild(Node* levelRoot, int tag) return nullptr; // Find this node - auto target = levelRoot->getChildByTag(tag); - if (target != nullptr) - return target; + { + auto target = levelRoot->getChildByTag(tag); + if (target != nullptr) + return target; + } // Find recursively for (auto& child : levelRoot->getChildren()) From d17fdfe3cc16f797cbeb1048210d9af30e2184ed Mon Sep 17 00:00:00 2001 From: TAKEDA Yutaka Date: Mon, 9 May 2016 13:49:29 +0900 Subject: [PATCH 099/241] CCSprite::createNode bug fix. --- cocos/3d/CCSprite3D.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 587986b5b38f..cc79203d18e2 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -589,6 +589,7 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m setScaleY(scale.y); setScaleZ(scale.z); + node = this; } } else From e8acf3821298ce6883ace6ccbe3cf00df3d18f44 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 9 May 2016 15:21:19 +0800 Subject: [PATCH 100/241] fix animate 3d bug --- cocos/3d/CCAnimate3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/3d/CCAnimate3D.cpp b/cocos/3d/CCAnimate3D.cpp index 325c9437a714..7163ddbbb372 100644 --- a/cocos/3d/CCAnimate3D.cpp +++ b/cocos/3d/CCAnimate3D.cpp @@ -248,7 +248,7 @@ void Animate3D::startWithTarget(Node *target) action->_accTransTime = 0.0f; action->_weight = 1.0f; action->_lastTime = 0.f; - + s_runningAnimates.erase(target); s_fadeInAnimates[target] = this; _accTransTime = 0.0f; _state = Animate3D::Animate3DState::FadeIn; From 2a712a0c3b7fb68174966869cb3c6e9c09e469a8 Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 9 May 2016 18:14:53 +0800 Subject: [PATCH 101/241] set correct package name --- cocos/platform/android/libcocos2dx/AndroidManifest.xml | 2 +- .../proj.android-studio/app/AndroidManifest.xml | 1 + .../runtime-src/proj.android-studio/app/AndroidManifest.xml | 1 + .../runtime-src/proj.android-studio/app/AndroidManifest.xml | 1 + .../cpp-empty-test/proj.android-studio/app/AndroidManifest.xml | 1 + tests/cpp-tests/proj.android-studio/app/AndroidManifest.xml | 1 + tests/cpp-tests/proj.android/.classpath | 2 +- .../proj.android-studio/app/AndroidManifest.xml | 1 + .../project/proj.android-studio/app/AndroidManifest.xml | 1 + .../project/proj.android-studio/app/AndroidManifest.xml | 1 + .../project/proj.android-studio/app/AndroidManifest.xml | 1 + .../project/proj.android-studio/app/AndroidManifest.xml | 1 + .../project/proj.android-studio/app/AndroidManifest.xml | 1 + .../proj.android-studio/app/AndroidManifest.xml | 1 + 14 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cocos/platform/android/libcocos2dx/AndroidManifest.xml b/cocos/platform/android/libcocos2dx/AndroidManifest.xml index 46f24443b43c..bd550c554777 100644 --- a/cocos/platform/android/libcocos2dx/AndroidManifest.xml +++ b/cocos/platform/android/libcocos2dx/AndroidManifest.xml @@ -1,6 +1,6 @@ - + diff --git a/templates/cpp-template-default/proj.android-studio/app/AndroidManifest.xml b/templates/cpp-template-default/proj.android-studio/app/AndroidManifest.xml index 2acf5adcf7fb..f8a8d00f4f07 100644 --- a/templates/cpp-template-default/proj.android-studio/app/AndroidManifest.xml +++ b/templates/cpp-template-default/proj.android-studio/app/AndroidManifest.xml @@ -6,6 +6,7 @@ diff --git a/templates/js-template-default/frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml b/templates/js-template-default/frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml index 59cb2ffb847d..7c53b4d93c05 100644 --- a/templates/js-template-default/frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml +++ b/templates/js-template-default/frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml @@ -6,6 +6,7 @@ diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml b/templates/lua-template-default/frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml index c1b4d259ef8a..86fd1b77dc55 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml +++ b/templates/lua-template-default/frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml @@ -6,6 +6,7 @@ diff --git a/tests/cpp-empty-test/proj.android-studio/app/AndroidManifest.xml b/tests/cpp-empty-test/proj.android-studio/app/AndroidManifest.xml index 908029d414d6..61e5799c0a4e 100644 --- a/tests/cpp-empty-test/proj.android-studio/app/AndroidManifest.xml +++ b/tests/cpp-empty-test/proj.android-studio/app/AndroidManifest.xml @@ -6,6 +6,7 @@ diff --git a/tests/cpp-tests/proj.android-studio/app/AndroidManifest.xml b/tests/cpp-tests/proj.android-studio/app/AndroidManifest.xml index 0589a83fed67..5286307eeb76 100644 --- a/tests/cpp-tests/proj.android-studio/app/AndroidManifest.xml +++ b/tests/cpp-tests/proj.android-studio/app/AndroidManifest.xml @@ -8,6 +8,7 @@ diff --git a/tests/cpp-tests/proj.android/.classpath b/tests/cpp-tests/proj.android/.classpath index 5cc5eb909cf2..51769745b2c3 100644 --- a/tests/cpp-tests/proj.android/.classpath +++ b/tests/cpp-tests/proj.android/.classpath @@ -2,7 +2,7 @@ - + diff --git a/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml b/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml index 2bdd039e17e1..c4cc598c0fe3 100644 --- a/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml +++ b/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml @@ -13,6 +13,7 @@ diff --git a/tests/js-memory-gc-tests/project/proj.android-studio/app/AndroidManifest.xml b/tests/js-memory-gc-tests/project/proj.android-studio/app/AndroidManifest.xml index e7922a2b1ea0..05f9386b5d0d 100644 --- a/tests/js-memory-gc-tests/project/proj.android-studio/app/AndroidManifest.xml +++ b/tests/js-memory-gc-tests/project/proj.android-studio/app/AndroidManifest.xml @@ -14,6 +14,7 @@ diff --git a/tests/js-tests/project/proj.android-studio/app/AndroidManifest.xml b/tests/js-tests/project/proj.android-studio/app/AndroidManifest.xml index e7922a2b1ea0..05f9386b5d0d 100644 --- a/tests/js-tests/project/proj.android-studio/app/AndroidManifest.xml +++ b/tests/js-tests/project/proj.android-studio/app/AndroidManifest.xml @@ -14,6 +14,7 @@ diff --git a/tests/lua-empty-test/project/proj.android-studio/app/AndroidManifest.xml b/tests/lua-empty-test/project/proj.android-studio/app/AndroidManifest.xml index ab2f62caf80c..e6576946d0fe 100644 --- a/tests/lua-empty-test/project/proj.android-studio/app/AndroidManifest.xml +++ b/tests/lua-empty-test/project/proj.android-studio/app/AndroidManifest.xml @@ -7,6 +7,7 @@ diff --git a/tests/lua-game-controller-test/project/proj.android-studio/app/AndroidManifest.xml b/tests/lua-game-controller-test/project/proj.android-studio/app/AndroidManifest.xml index fabdbb64914a..2d05294b2023 100644 --- a/tests/lua-game-controller-test/project/proj.android-studio/app/AndroidManifest.xml +++ b/tests/lua-game-controller-test/project/proj.android-studio/app/AndroidManifest.xml @@ -11,6 +11,7 @@ diff --git a/tests/lua-tests/project/proj.android-studio/app/AndroidManifest.xml b/tests/lua-tests/project/proj.android-studio/app/AndroidManifest.xml index 7ee41536d2e7..0caa6cc2a621 100644 --- a/tests/lua-tests/project/proj.android-studio/app/AndroidManifest.xml +++ b/tests/lua-tests/project/proj.android-studio/app/AndroidManifest.xml @@ -8,6 +8,7 @@ diff --git a/tests/performance-tests/proj.android-studio/app/AndroidManifest.xml b/tests/performance-tests/proj.android-studio/app/AndroidManifest.xml index 2bc6807a3620..1102ae0b3dc0 100644 --- a/tests/performance-tests/proj.android-studio/app/AndroidManifest.xml +++ b/tests/performance-tests/proj.android-studio/app/AndroidManifest.xml @@ -6,6 +6,7 @@ From 79b9a191d0ea26b96c61df65de5a06acea780828 Mon Sep 17 00:00:00 2001 From: Naruto TAKAHASHI Date: Mon, 9 May 2016 21:08:56 +0900 Subject: [PATCH 102/241] declare explicitly FileUtilsApple destructor --- cocos/platform/apple/CCFileUtils-apple.h | 1 + cocos/platform/apple/CCFileUtils-apple.mm | 2 ++ 2 files changed, 3 insertions(+) diff --git a/cocos/platform/apple/CCFileUtils-apple.h b/cocos/platform/apple/CCFileUtils-apple.h index 2aa75c24d5d0..0843163ec77b 100644 --- a/cocos/platform/apple/CCFileUtils-apple.h +++ b/cocos/platform/apple/CCFileUtils-apple.h @@ -46,6 +46,7 @@ class CC_DLL FileUtilsApple : public FileUtils { public: FileUtilsApple(); + virtual ~FileUtilsApple(); /* override functions */ virtual std::string getWritablePath() const override; virtual std::string getFullPathForDirectoryAndFilename(const std::string& directory, const std::string& filename) const override; diff --git a/cocos/platform/apple/CCFileUtils-apple.mm b/cocos/platform/apple/CCFileUtils-apple.mm index 32ac2457dcb9..a9ddeba70da9 100644 --- a/cocos/platform/apple/CCFileUtils-apple.mm +++ b/cocos/platform/apple/CCFileUtils-apple.mm @@ -320,6 +320,8 @@ static void addObjectToNSDict(const std::string& key, const Value& value, NSMuta FileUtilsApple::FileUtilsApple() : pimpl_(new IMPL([NSBundle mainBundle])) { } +FileUtilsApple::~FileUtilsApple() = default; + #if CC_FILEUTILS_APPLE_ENABLE_OBJC void FileUtilsApple::setBundle(NSBundle* bundle) { pimpl_->setBundle(bundle); From aa94836190f56e24e1841039b50db57cbbc44e55 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 10 May 2016 10:34:16 +0800 Subject: [PATCH 103/241] update release note --- docs/RELEASE_NOTES.md | 17 +++++------ docs/RELEASE_NOTES_CN.md | 65 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 docs/RELEASE_NOTES_CN.md diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 5f66430bdc87..5d91d69b162f 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -2,8 +2,7 @@ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* -- [Cocos2d-x 3.10 Release Notes](#cocos2d-x- -- -release-notes) +- [Cocos2d-x 3.11 Release Notes](#cocos2d-x-311-release-notes) - [Misc Information](#misc-information) - [Requirements](#requirements) - [Runtime Requirements](#runtime-requirements) @@ -15,14 +14,14 @@ - [Windows](#windows) - [Linux](#linux) - [How to start a new game](#how-to-start-a-new-game) -- [v3.10](#v310) - - [Highlights features, improvements and API updates of v3.10](#highlights-features-improvements-and-api-updates-of-v310) - - [The main features in detail of Cocos2d-x v3.10:](#the-main-features-in-detail-of-cocos2d-x-v310) - - [UI System](#ui-system) - - [AudioEngine](#audioengine) - - [Others](#others) +- [v3.11](#v311) + - [Highlights features](#highlights-features) + - [The main features in detail of Cocos2d-x v3.11](#the-main-features-in-detail-of-cocos2d-x-v311) + - [New memory model in JSB](#new-memory-model-in-jsb) + - [OpenSSL](#openssl) + - [Tizen support](#tizen-support) + - [Cocos2d-x JSB program debugging](#cocos2d-x-jsb-program-debugging) - [Other changes](#other-changes) - - [NEW APIS](#new-apis) diff --git a/docs/RELEASE_NOTES_CN.md b/docs/RELEASE_NOTES_CN.md new file mode 100644 index 000000000000..f0692144de36 --- /dev/null +++ b/docs/RELEASE_NOTES_CN.md @@ -0,0 +1,65 @@ +# v3.11 + +## 新特性 + +* Chipmunk升级到v7.0.1 +* JSB使用新的内存模型,在JS脚本不需要关心对象的生命周期,该特性默认关闭 +* 支持Tizen平台 +* CURL升级到v7.48 +* OpenSSL升级到v1.0.2g +* 可以使用VSCode或者新版本的Firefox调试JSB程序 + +## 主要特性的详细介绍 + +### JSB的新内存模型 + +使用新的内存模型后,开发者不需要关心对象的声明周期。这就意味着不需要在JS代码里手动调用`retain/release`函数。 + +不过该内存模型默认是关闭的。虽然我们已经做了很多的测试,但是还是无法保证它没有任何问题,所以你需要手动开启该功能,开启的方法是在`base/ccConfig.h`里把`CC_ENABLE_GC_FOR_NATIVE`的值改为1: + +```c++ +#ifdef CC_ENABLE_SCRIPT_BINDING + #ifndef CC_ENABLE_GC_FOR_NATIVE_OBJECTS + #define CC_ENABLE_GC_FOR_NATIVE_OBJECTS 1 // change to 1 + #endif +#endif +``` + +### OpenSSL +Cocos2d-x已经把__OpenSSL__升级到__1.0.2.g__。 + +从__2016年7月11__日开始,Google Play将不再接受使用低版本的__OpenSSL__的新应用程序或者应用程序更新。更新程序中使用的__OpenSSL__版本变得十分重要。更详细的信息可以参考[这个帖子](http://discuss.cocos2d-x.org/t/openssl-problem-again/28270)。 + +如果你使用的是v2.x或者低版本的v3.x引擎,那么你可以只更新__CURL__和__OpenSSL__,具体步骤如下: + +* 修改__Cocos2d-x root/external/config.json__文件中的`version`字段。如果是v3.x的话,那么`version`字段的值改为`v3-dpes-92`,如果是v2.x的话,那么值是`v2-deps-5` +* 在Cocos2d-x根目录下执行__download-deps.py__脚本 + +```sh +(jtsm @ 15 ~) $ cd cocos2d-x + +(jtsm @ 15 ~/cocos2d-x) $ ./download-deps.py + +======================================================= +==> Prepare to download external libraries! +==> Ready to download 'v3-deps-92.zip' from 'https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/archive/v3-deps-92.zip' +==> WARNING: Couldnt grab the file size from remote, use 'zip_file_size' section in '/Users/jtsm/Chukong-Inc/cocos2d-x/external/config.json' +==> Start to download, please wait ... +==> Downloading finished! +==> Extracting files, please wait ... +==> Extraction done! ==> Copying files... +==> Cleaning... +``` +有任何问题可以在引擎的[中文论坛](http://forum.cocos.com/)上发帖反馈。 + +### Tizen平台支持 +引擎从v3.11版本支持Tizen平台!你可以阅读[这篇文档](http://cocos2d-x.org/docs/static-pages/installation.html)来了解如何在Tizen平台开发。 + +### Cocos2d-x JSB程序调试 + +v3.11版本之前,不能使用Firefox 30+版本来调试cocos2d-x JSB程序。这个版本修复了该问题,同时支持了web console功能。如果你不了解如何使用Firefox调试cocos2d-x JSB程序,可以参考[这篇文档](This documentation](http://www.cocos2d-x.org/wiki/Javascript_Remote_Debugging)。 + +当然你也可以使用[VSCode](https://code.visualstudio.com/)来调试,具体的使用方法参考[这篇文档](http://discuss.cocos2d-x.org/t/use-vscode-to-debug-cocos2d-x-jsb-programs/27588)。 + +## 其他改动 +更完整的改动列表可以阅读[full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG)。 From 530d890c6c355f40ea7457c521c060867e8f3352 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 10 May 2016 02:41:22 +0000 Subject: [PATCH 104/241] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index a60187b13080..670bf00c4d5f 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -1346,6 +1346,7 @@ "docs/MainPageWhiteBook.h", "docs/RELEASE_ENGINEERING.md", "docs/RELEASE_NOTES.md", + "docs/RELEASE_NOTES_CN.md", "docs/cocos2dx_portrait.png", "docs/doxygen.config", "docs/doxygen_white_book.config", From 1ab81a5e40e5f56d73e817077dcc8a2e9a7de0d5 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 10 May 2016 14:47:09 +0800 Subject: [PATCH 105/241] update deps version --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index f21d3ff8edb9..5bf17af67c8c 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version":"v3-deps-92", + "version":"v3-deps-93", "zip_file_size":"128440074", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", From d7fea4b08b5e078f27da37e6574f149c22e22220 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 10 May 2016 16:19:58 +0800 Subject: [PATCH 106/241] reduce loop times to be quicker on low performace devices --- tests/cpp-tests/Classes/NodeTest/NodeTest.cpp | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp index ebcb0a597d96..d595e5189c40 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp @@ -1309,19 +1309,18 @@ void NodeNameTest::test(float dt) }); CCAssert(i == 1, ""); - // enumerateChildren // name = node[[digit]]+/node parent = Node::create(); - for (int i = 0; i < 100; ++i) + for (int i = 0; i < 10; ++i) { auto node = Node::create(); sprintf(name, "node%d", i); node->setName(name); parent->addChild(node); - for (int j = 0; j < 100; ++j) + for (int j = 0; j < 10; ++j) { auto child = Node::create(); child->setName("node"); @@ -1334,7 +1333,7 @@ void NodeNameTest::test(float dt) ++i; return false; }); - CCAssert(i == 100, ""); + CCAssert(i == 10, ""); i = 0; parent->enumerateChildren("node1/node", [&i](Node* node) -> bool { @@ -1345,14 +1344,14 @@ void NodeNameTest::test(float dt) // search from root parent = Node::create(); - for (int i = 0; i < 100; ++i) + for (int i = 0; i < 10; ++i) { auto node = Node::create(); sprintf(name, "node%d", i); node->setName(name); parent->addChild(node); - for (int j = 0; j < 100; ++j) + for (int j = 0; j < 10; ++j) { auto child = Node::create(); child->setName("node"); @@ -1365,7 +1364,7 @@ void NodeNameTest::test(float dt) ++i; return false; }); - CCAssert(i == 10000, ""); + CCAssert(i == 100, ""); i = 0; parent->enumerateChildren("node[[:digit:]]+/node", [&i](Node* node) -> bool { @@ -1388,18 +1387,18 @@ void NodeNameTest::test(float dt) ++i; return false; }); - CCAssert(i == 10000, ""); + CCAssert(i == 100, ""); // name = //xxx : search recursively parent = Node::create(); - for (int j = 0; j < 100; j++) + for (int j = 0; j < 10; j++) { auto node = Node::create(); sprintf(name, "node%d", j); node->setName(name); parent->addChild(node); - for (int k = 0; k < 100; ++k) + for (int k = 0; k < 10; ++k) { auto child = Node::create(); sprintf(name, "node%d", k); @@ -1413,7 +1412,7 @@ void NodeNameTest::test(float dt) ++i; return false; }); - CCAssert(i == 10100, ""); // 10000(children) + 100(parent) + CCAssert(i == 110, ""); // 100(children) + 10(parent) i = 0; parent->enumerateChildren("//node[[:digit:]]+", [&i](Node* node) -> bool { @@ -1427,7 +1426,7 @@ void NodeNameTest::test(float dt) ++i; return false; }); - CCAssert(i == 10000, ""); + CCAssert(i == 100, ""); // utils::findChildren() @@ -1440,5 +1439,4 @@ void NodeNameTest::test(float dt) } auto findChildren = utils::findChildren(*parent, "node"); CCAssert(findChildren.size() == 50, ""); - } From 04f52d0e216f44819c99aae04dbb75df185dae4a Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 10 May 2016 16:39:24 +0800 Subject: [PATCH 107/241] update deps version --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index f21d3ff8edb9..5bf17af67c8c 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version":"v3-deps-92", + "version":"v3-deps-93", "zip_file_size":"128440074", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", From b2a592ce36b5414a3b6aefe1da90c07c6c661a95 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 10 May 2016 17:55:36 +0800 Subject: [PATCH 108/241] fix crash when back to parent test case --- .../ExtensionsTest/NetworkTest/WebSocketTest.cpp | 12 ++++++++++-- .../ExtensionsTest/NetworkTest/WebSocketTest.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp index 632785cffc12..8b3e7042d8ef 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp @@ -268,7 +268,8 @@ WebSocketCloseTest::WebSocketCloseTest() if (!_wsiTest->init(*this, "ws://echo.websocket.org")) { - CC_SAFE_DELETE(_wsiTest); + delete _wsiTest; + _wsiTest = nullptr; } auto closeItem = MenuItemImage::create(s_pathClose, s_pathClose, [](Ref* sender){ @@ -289,6 +290,12 @@ WebSocketCloseTest::WebSocketCloseTest() addChild(notifyLabel, 1); } +WebSocketCloseTest::~WebSocketCloseTest() +{ + if (_wsiTest) + _wsiTest->close(); +} + // Delegate methods void WebSocketCloseTest::onOpen(network::WebSocket* ws) { @@ -303,7 +310,8 @@ void WebSocketCloseTest::onMessage(network::WebSocket* ws, const network::WebSoc void WebSocketCloseTest::onClose(network::WebSocket* ws) { log("websocket (%p) closed.", ws); - CC_SAFE_DELETE(ws); + delete ws; + _wsiTest = nullptr; } void WebSocketCloseTest::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error) diff --git a/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.h b/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.h index 45cc8fce352d..8f50a7cc8343 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.h @@ -64,6 +64,7 @@ class WebSocketCloseTest : public TestCase virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error)override; WebSocketCloseTest(); + ~WebSocketCloseTest(); virtual std::string title() const override { return "WebSocket close by resetDirector event Test"; } std::string subtitle() const override { return "Click close button, Program should close without crash."; } From fd160a1611bf70226903dad544eb6856a0f91a70 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 10 May 2016 18:15:57 +0800 Subject: [PATCH 109/241] remove Content-Type limitation --- cocos/network/HttpClient-apple.mm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cocos/network/HttpClient-apple.mm b/cocos/network/HttpClient-apple.mm index 72299bd90e43..997e095ec926 100644 --- a/cocos/network/HttpClient-apple.mm +++ b/cocos/network/HttpClient-apple.mm @@ -170,12 +170,7 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque //if request type is post or put,set header and data if([requestType isEqual: @"POST"] || [requestType isEqual: @"PUT"]) - { - if ([requestType isEqual: @"PUT"]) - { - [nsrequest setValue: @"application/x-www-form-urlencoded" forHTTPHeaderField: @"Content-Type"]; - } - + { char* requestDataBuffer = request->getRequestData(); if (nullptr != requestDataBuffer && 0 != request->getRequestDataSize()) { From 05dd3bb608463991034036b2d1d34e2901b64ea1 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 10 May 2016 20:34:35 +0800 Subject: [PATCH 110/241] Fix web engine issues in test cases --- tests/js-tests/src/EventTest/EventTest.js | 7 +++++-- tests/js-tests/src/SceneTest/SceneTest.js | 3 ++- web | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/js-tests/src/EventTest/EventTest.js b/tests/js-tests/src/EventTest/EventTest.js index edaa70efcfa1..c6bdaaceec3a 100644 --- a/tests/js-tests/src/EventTest/EventTest.js +++ b/tests/js-tests/src/EventTest/EventTest.js @@ -253,8 +253,11 @@ var TouchAllAtOnce = EventTest.extend({ var touch = touches[i]; var pos = touch.getLocation(); var id = touch.getID(); - var force = touch.getCurrentForce(); - var maxForce = touch.getMaxForce(); + var force = 0, maxForce = 0; + if (touch.getCurrentForce) { + force = touch.getCurrentForce(); + maxForce = touch.getMaxForce(); + } cc.log("Touch #" + i + ". onTouchesMoved at: " + pos.x + " " + pos.y + " Id:" + id + " current force:" + force + " maximum postible force:" + maxForce); target.update_id(id, pos); } diff --git a/tests/js-tests/src/SceneTest/SceneTest.js b/tests/js-tests/src/SceneTest/SceneTest.js index 30367e8721fb..820b3f5a2e5e 100644 --- a/tests/js-tests/src/SceneTest/SceneTest.js +++ b/tests/js-tests/src/SceneTest/SceneTest.js @@ -41,7 +41,7 @@ var SceneTestLayer1 = cc.Layer.extend({ var item1 = new cc.MenuItemFont("Test pushScene", this.onPushScene, this); var item2 = new cc.MenuItemFont("Test pushScene w/transition", this.onPushSceneTran, this); var item3 = new cc.MenuItemFont("Quit", function () { - cc.log("quit!") + cc.log("quit!"); }, this); var item4 = new cc.MenuItemFont("setNotificationNode", function () { var layerTemp = new cc.LayerColor(cc.color(0, 255, 255, 120)); @@ -105,6 +105,7 @@ var SceneTestLayer1 = cc.Layer.extend({ }, onExit:function (sender) { cc.director.setNotificationNode(null); + this._super(); } //CREATE_NODE(SceneTestLayer1); diff --git a/web b/web index d176dc4f7439..29e12e52e4d8 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit d176dc4f74396746445112d030c2fa63875e5bf8 +Subproject commit 29e12e52e4d8f47aa5a256967613b353fbbb424d From 85812b4f5b90d524b1e269d70baba51d873311c5 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 10 May 2016 20:35:02 +0800 Subject: [PATCH 111/241] Remove client_no_context_takeover extension in WebSocket (not working on Android/iOS/Mac) --- cocos/network/WebSocket.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/cocos/network/WebSocket.cpp b/cocos/network/WebSocket.cpp index 11a0462e2630..89da4889aceb 100644 --- a/cocos/network/WebSocket.cpp +++ b/cocos/network/WebSocket.cpp @@ -570,13 +570,10 @@ void WebSocket::onSubThreadStarted() { "permessage-deflate", lws_extension_callback_pm_deflate, - // iOS doesn't support client_no_context_takeover extension in the current version, it will cause iOS connection fail - // It may be a bug of lib websocket iOS build -#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + // client_no_context_takeover extension is not supported in the current version, it will cause connection fail + // It may be a bug of lib websocket build +// "permessage-deflate; client_no_context_takeover; client_max_window_bits" "permessage-deflate; client_max_window_bits" -#else - "permessage-deflate; client_no_context_takeover; client_max_window_bits" -#endif }, { "deflate-frame", From c4f3ad7e47daedebf36c43e91ed98c84f6234b46 Mon Sep 17 00:00:00 2001 From: Slack-Moehrle Date: Tue, 10 May 2016 17:38:56 -0400 Subject: [PATCH 112/241] change Culr to Curl --- docs/RELEASE_NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 5d91d69b162f..c3751e274b54 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -156,7 +156,7 @@ cocos new -l cpp|js|lua MyNewGame * upgrade Chipmunk to v7.0.1 * use new memory model in JSB, don't have to invoke `retain/release` in JS, it is disabled by default * support Tizen platform -* upgrade Culr to v7.48 +* upgrade Curl to v7.48 * upgrade OpenSSL to 1.0.2g * can use VSCode and new Firefox to debug cocos2d-x JSB programs From 48937ca3e6035ff1b92994f2225172bd5549f992 Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 11 May 2016 11:10:11 +0800 Subject: [PATCH 113/241] disable new JSB memory model by default --- cocos/base/ccConfig.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/base/ccConfig.h b/cocos/base/ccConfig.h index ed74b3acd4c0..90c519a8aaad 100644 --- a/cocos/base/ccConfig.h +++ b/cocos/base/ccConfig.h @@ -338,7 +338,7 @@ THE SOFTWARE. */ #ifdef CC_ENABLE_SCRIPT_BINDING #ifndef CC_ENABLE_GC_FOR_NATIVE_OBJECTS - #define CC_ENABLE_GC_FOR_NATIVE_OBJECTS 1 + #define CC_ENABLE_GC_FOR_NATIVE_OBJECTS 0 #endif #endif From 1cbbde5d8b264201657f5a2532402f7417608a0e Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 11 May 2016 11:57:54 +0800 Subject: [PATCH 114/241] Fix android LocalStorage return null for empty string value --- .../java/src/org/cocos2dx/lib/Cocos2dxLocalStorage.java | 2 +- cocos/storage/local-storage/LocalStorage-android.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxLocalStorage.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxLocalStorage.java index d2dc8e7c0489..cdab16b3a86e 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxLocalStorage.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxLocalStorage.java @@ -89,7 +89,7 @@ public static String getItem(String key) { } catch (Exception e) { e.printStackTrace(); } - return ret == null ? "" : ret; + return ret; } public static void removeItem(String key) { diff --git a/cocos/storage/local-storage/LocalStorage-android.cpp b/cocos/storage/local-storage/LocalStorage-android.cpp index 329b9c430cf7..d3dc6e5b37a0 100644 --- a/cocos/storage/local-storage/LocalStorage-android.cpp +++ b/cocos/storage/local-storage/LocalStorage-android.cpp @@ -94,6 +94,10 @@ bool localStorageGetItem( const std::string& key, std::string *outItem ) { jstring jkey = t.env->NewStringUTF(key.c_str()); jstring jret = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID, jkey); + if (jret == nullptr) + { + return false; + } outItem->assign(JniHelper::jstring2string(jret)); t.env->DeleteLocalRef(jret); t.env->DeleteLocalRef(jkey); From 1023c8730eaef16645a2088ef1adfd4281a00b23 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 11 May 2016 11:58:24 +0800 Subject: [PATCH 115/241] [JSB] Made cc.log overwrite-able --- cocos/scripting/js-bindings/manual/ScriptingCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp index 33d7d12f1a52..ac27c15301e1 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp @@ -417,7 +417,7 @@ void registerDefaultClasses(JSContext* cx, JS::HandleObject global) { // register some global functions JS_DefineFunction(cx, global, "require", ScriptingCore::executeScript, 1, JSPROP_PERMANENT); - JS_DefineFunction(cx, global, "log", ScriptingCore::log, 0, JSPROP_READONLY | JSPROP_PERMANENT); + JS_DefineFunction(cx, global, "log", ScriptingCore::log, 0, JSPROP_PERMANENT); JS_DefineFunction(cx, global, "executeScript", ScriptingCore::executeScript, 1, JSPROP_READONLY | JSPROP_PERMANENT); JS_DefineFunction(cx, global, "forceGC", ScriptingCore::forceGC, 0, JSPROP_READONLY | JSPROP_PERMANENT); From cf305a56b1d51e226d5dea3524dbd5a7b57779af Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Tue, 10 May 2016 21:41:39 -0700 Subject: [PATCH 116/241] removed missing files from project --- tests/cpp-tests/proj.win10/cpp-tests.vcxproj | 4 ---- tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters | 12 +++--------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj index 02b98e29153f..9b9338f20dd3 100644 --- a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj +++ b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj @@ -423,7 +423,6 @@ - @@ -437,7 +436,6 @@ - @@ -599,7 +597,6 @@ - @@ -613,7 +610,6 @@ - diff --git a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters index dba6f4cd9834..cd11abf1483f 100644 --- a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters +++ b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters @@ -686,9 +686,6 @@ Classes\UITest\CocoStudioGUITest - - Classes\UITest\CocoStudioGUITest - Classes\UITest\CocoStudioGUITest\UIButtonTest @@ -1318,9 +1315,6 @@ Classes\UITest\CocoStudioGUITest - - Classes\UITest\CocoStudioGUITest - Classes\UITest\CocoStudioGUITest @@ -1330,9 +1324,6 @@ Classes\UITest\CocoStudioGUITest - - Classes\UITest\CocoStudioGUITest - Classes\UITest\CocoStudioGUITest\UIButtonTest @@ -1437,6 +1428,9 @@ Classes\UITest\CocoStudioGUITest\UITabContorlTest + + + From 1c77d8fd5ca7f0a4c95aafebf389a2da5c0eb0e9 Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 11 May 2016 14:59:15 +0800 Subject: [PATCH 117/241] update release note --- docs/RELEASE_NOTES.md | 5 ----- docs/RELEASE_NOTES_CN.md | 4 ---- 2 files changed, 9 deletions(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index c3751e274b54..fcbac2a97002 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -19,7 +19,6 @@ - [The main features in detail of Cocos2d-x v3.11](#the-main-features-in-detail-of-cocos2d-x-v311) - [New memory model in JSB](#new-memory-model-in-jsb) - [OpenSSL](#openssl) - - [Tizen support](#tizen-support) - [Cocos2d-x JSB program debugging](#cocos2d-x-jsb-program-debugging) - [Other changes](#other-changes) @@ -155,7 +154,6 @@ cocos new -l cpp|js|lua MyNewGame * upgrade Chipmunk to v7.0.1 * use new memory model in JSB, don't have to invoke `retain/release` in JS, it is disabled by default -* support Tizen platform * upgrade Curl to v7.48 * upgrade OpenSSL to 1.0.2g * can use VSCode and new Firefox to debug cocos2d-x JSB programs @@ -204,9 +202,6 @@ To do this: ``` Feel free to post on our forums if you run into difficulty. -### Tizen support -Tizen is now supported! You can read about how to use Tizen [here](http://cocos2d-x.org/docs/static-pages/installation.html). - ### Cocos2d-x JSB program debugging In previous version, can not use Firefox 30+ to debug cocos2d-x JSB programs. This limit is fixed since v3.11. And web console feature is added too. [This documentation](http://www.cocos2d-x.org/wiki/Javascript_Remote_Debugging) shows how to use Firefox to debug cocos2d-x JSB programs(this is a little difference from current usage). diff --git a/docs/RELEASE_NOTES_CN.md b/docs/RELEASE_NOTES_CN.md index f0692144de36..845a5c821ba9 100644 --- a/docs/RELEASE_NOTES_CN.md +++ b/docs/RELEASE_NOTES_CN.md @@ -4,7 +4,6 @@ * Chipmunk升级到v7.0.1 * JSB使用新的内存模型,在JS脚本不需要关心对象的生命周期,该特性默认关闭 -* 支持Tizen平台 * CURL升级到v7.48 * OpenSSL升级到v1.0.2g * 可以使用VSCode或者新版本的Firefox调试JSB程序 @@ -52,9 +51,6 @@ Cocos2d-x已经把__OpenSSL__升级到__1.0.2.g__。 ``` 有任何问题可以在引擎的[中文论坛](http://forum.cocos.com/)上发帖反馈。 -### Tizen平台支持 -引擎从v3.11版本支持Tizen平台!你可以阅读[这篇文档](http://cocos2d-x.org/docs/static-pages/installation.html)来了解如何在Tizen平台开发。 - ### Cocos2d-x JSB程序调试 v3.11版本之前,不能使用Firefox 30+版本来调试cocos2d-x JSB程序。这个版本修复了该问题,同时支持了web console功能。如果你不了解如何使用Firefox调试cocos2d-x JSB程序,可以参考[这篇文档](This documentation](http://www.cocos2d-x.org/wiki/Javascript_Remote_Debugging)。 From 072424e2965709d2556533e0771acbb0fbbb0a82 Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 11 May 2016 16:10:58 +0800 Subject: [PATCH 118/241] update changelog --- CHANGELOG | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f1f2963a6890..6b858212d42f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,10 +1,9 @@ -cocos2d-x-3.11 Apr ? 2016 +cocos2d-x-3.11 May 11 2016 [HIGHLIGHT] Physics: upgrade chipmunk to v7.0.1 [HIGHLIGHT] JS: new memory model, don't have to use retain/release in JS [HIGHLIGHT] Curl: upgrade to v7.48 [HIGHLIGHT] OpenSSL: upgrade to 1.0.2g -[HiGHLIGHT] Support Tizen platform [NEW] JS: web console is enabled debugging JSB projects via firefox [NEW] UI: add a setter for touch total time threshold in ScrollView From ae7c91c1b816c861d51f9136adcec7914e8bfe79 Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 11 May 2016 16:12:18 +0800 Subject: [PATCH 119/241] update changelog --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 6b858212d42f..e2b9912bf965 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ cocos2d-x-3.11 May 11 2016 [HIGHLIGHT] JS: new memory model, don't have to use retain/release in JS [HIGHLIGHT] Curl: upgrade to v7.48 [HIGHLIGHT] OpenSSL: upgrade to 1.0.2g +[HIGHLIGHT] JS: can use Firefox 30+ and VSCode to debug cocos2d-x JSB programs [NEW] JS: web console is enabled debugging JSB projects via firefox [NEW] UI: add a setter for touch total time threshold in ScrollView From 6b59dc24c73c7cec3a66905146b9bd82bdd5825b Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 11 May 2016 16:35:36 +0800 Subject: [PATCH 120/241] Add Image::setPNGPremultipliedAlphaEnabled --- cocos/platform/CCImage.cpp | 3 ++- cocos/platform/CCImage.h | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/cocos/platform/CCImage.cpp b/cocos/platform/CCImage.cpp index 291090fde8b7..193783bab1bf 100644 --- a/cocos/platform/CCImage.cpp +++ b/cocos/platform/CCImage.cpp @@ -455,6 +455,7 @@ Texture2D::PixelFormat getDevicePixelFormat(Texture2D::PixelFormat format) ////////////////////////////////////////////////////////////////////////// // Implement Image ////////////////////////////////////////////////////////////////////////// +bool Image::PNG_PREMULTIPLIED_ALPHA_ENABLED = true; Image::Image() : _data(nullptr) @@ -1125,7 +1126,7 @@ bool Image::initWithPngData(const unsigned char * data, ssize_t dataLen) png_read_end(png_ptr, nullptr); // premultiplied alpha for RGBA8888 - if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + if (PNG_PREMULTIPLIED_ALPHA_ENABLED && color_type == PNG_COLOR_TYPE_RGB_ALPHA) { premultipliedAlpha(); } diff --git a/cocos/platform/CCImage.h b/cocos/platform/CCImage.h index 86e80f1a5480..3bbc3618c040 100644 --- a/cocos/platform/CCImage.h +++ b/cocos/platform/CCImage.h @@ -144,7 +144,13 @@ class CC_DLL Image : public Ref @param isToRGB whether the image is saved as RGB format. */ bool saveToFile(const std::string &filename, bool isToRGB = true); - + + /** + * Enables or disables premultiplied alpha for PNG files. + * + * @param enabled (default: true) + */ + static void setPNGPremultipliedAlphaEnabled(bool enabled) { PNG_PREMULTIPLIED_ALPHA_ENABLED = enabled; } /** treats (or not) PVR files as if they have alpha premultiplied. Since it is impossible to know at runtime if the PVR images have the alpha channel premultiplied, it is @@ -183,6 +189,10 @@ class CC_DLL Image : public Ref It's same as define but it respects namespaces */ static const int MIPMAP_MAX = 16; + /** + @brief Determine whether we premultiply alpha for png files. + */ + static bool PNG_PREMULTIPLIED_ALPHA_ENABLED; unsigned char *_data; ssize_t _dataLen; int _width; @@ -199,8 +209,8 @@ class CC_DLL Image : public Ref protected: // noncopyable - Image(const Image& rImg); - Image & operator=(const Image&); + Image(const Image& rImg); + Image& operator=(const Image&); /* @brief The same result as with initWithImageFile, but thread safe. It is caused by From ada1d1dfe817506f1cb86e2cd4268be0c5d8c184 Mon Sep 17 00:00:00 2001 From: ViusualSJ Date: Wed, 11 May 2016 17:24:14 +0800 Subject: [PATCH 121/241] audio search path (android) --- .../js-bindings/script/jsb_cocos2d.js | 20 +++++++++++++++++++ .../CocosDenshionTest/CocosDenshionTest.js | 3 --- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/cocos/scripting/js-bindings/script/jsb_cocos2d.js b/cocos/scripting/js-bindings/script/jsb_cocos2d.js index 691c9170642a..114280b02395 100644 --- a/cocos/scripting/js-bindings/script/jsb_cocos2d.js +++ b/cocos/scripting/js-bindings/script/jsb_cocos2d.js @@ -2626,6 +2626,26 @@ _p.setDisabledSpriteFrame = function(frame) { cc.MenuItemToggle.prototype.selectedItem = cc.MenuItemToggle.prototype.getSelectedItem; +// playMusic searchPaths +if (cc.sys.os === cc.sys.OS_ANDROID && cc.audioEngine) { + cc.audioEngine._playMusic = cc.audioEngine.playMusic; + cc.audioEngine.playMusic = function () { + var args = arguments; + var searchPaths = jsb.fileUtils.getSearchPaths(); + var path = args[0]; + searchPaths.some(function (item) { + var temp = item + '/' + path; + var exists = jsb.fileUtils.isFileExist(temp); + if (exists) { + path = temp; + return true; + } + }); + args[0] = path; + cc.audioEngine._playMusic.apply(cc.audioEngine, args); + }; +} + // // LabelTTF API wrappers // diff --git a/tests/js-tests/src/CocosDenshionTest/CocosDenshionTest.js b/tests/js-tests/src/CocosDenshionTest/CocosDenshionTest.js index bb72b4553bf4..56f1bcfa1fe4 100644 --- a/tests/js-tests/src/CocosDenshionTest/CocosDenshionTest.js +++ b/tests/js-tests/src/CocosDenshionTest/CocosDenshionTest.js @@ -232,9 +232,6 @@ var soundId = null; var playMusic = function () { cc.log("play background music"); var musicFile = MUSIC_FILE; - if (cc.sys.os == cc.sys.OS_ANDROID) { - musicFile = "res/"+musicFile; - } audioEngine.playMusic(musicFile, false); }; From 1c1fc53255f7ab40b02182148a80d948acbda1fe Mon Sep 17 00:00:00 2001 From: pandamicro Date: Thu, 12 May 2016 10:56:51 +0800 Subject: [PATCH 122/241] Add web engine feature in release note --- docs/RELEASE_NOTES.md | 12 ++++++++++++ docs/RELEASE_NOTES_CN.md | 13 ++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index c3751e274b54..70cf6f221312 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -21,6 +21,7 @@ - [OpenSSL](#openssl) - [Tizen support](#tizen-support) - [Cocos2d-x JSB program debugging](#cocos2d-x-jsb-program-debugging) + - [New WebGL renderer](#new-webgl-renderer) - [Other changes](#other-changes) @@ -159,6 +160,7 @@ cocos new -l cpp|js|lua MyNewGame * upgrade Curl to v7.48 * upgrade OpenSSL to 1.0.2g * can use VSCode and new Firefox to debug cocos2d-x JSB programs +* refactor WebGL renderer ## The main features in detail of Cocos2d-x v3.11 @@ -213,5 +215,15 @@ In previous version, can not use Firefox 30+ to debug cocos2d-x JSB programs. Th Of course you can use [VSCode](https://code.visualstudio.com/) to debug cocos2d-x JSB programs too. You can read about how to use VSCode to debug cocos2d-x JSB programs [here](http://discuss.cocos2d-x.org/t/use-vscode-to-debug-cocos2d-x-jsb-programs/27588). +### New WebGL renderer + +In v3.11, we have refactored the WebGL renderer in web engine, here is the detailed changes: + +1. Activate WebGL on Android by default. +2. Add sprite auto batching in WebGL. +3. Shared rendering buffer for Sprites. + +Compare with old version, the draw calls in your game should be significantly reduced if the textures is well managed. This improves also the CPU usage and memory usage. The above is just a first step of WebGL renderer upgrade, we will continue to investigate in this direction in the future versions. + ## Other changes You can also take a look at the [full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG). diff --git a/docs/RELEASE_NOTES_CN.md b/docs/RELEASE_NOTES_CN.md index f0692144de36..4cfc2ffe538d 100644 --- a/docs/RELEASE_NOTES_CN.md +++ b/docs/RELEASE_NOTES_CN.md @@ -8,6 +8,7 @@ * CURL升级到v7.48 * OpenSSL升级到v1.0.2g * 可以使用VSCode或者新版本的Firefox调试JSB程序 +* 全面升级 WebGL 渲染器 ## 主要特性的详细介绍 @@ -15,7 +16,7 @@ 使用新的内存模型后,开发者不需要关心对象的声明周期。这就意味着不需要在JS代码里手动调用`retain/release`函数。 -不过该内存模型默认是关闭的。虽然我们已经做了很多的测试,但是还是无法保证它没有任何问题,所以你需要手动开启该功能,开启的方法是在`base/ccConfig.h`里把`CC_ENABLE_GC_FOR_NATIVE`的值改为1: +不过该内存模型默认是关闭的。虽然我们已经做了很多的测试,目前没有发现任何问题,但是保险起见,你需要手动开启该功能,开启的方法是在`base/ccConfig.h`里把`CC_ENABLE_GC_FOR_NATIVE`的值改为1: ```c++ #ifdef CC_ENABLE_SCRIPT_BINDING @@ -61,5 +62,15 @@ v3.11版本之前,不能使用Firefox 30+版本来调试cocos2d-x JSB程序。 当然你也可以使用[VSCode](https://code.visualstudio.com/)来调试,具体的使用方法参考[这篇文档](http://discuss.cocos2d-x.org/t/use-vscode-to-debug-cocos2d-x-jsb-programs/27588)。 +### 全面升级 WebGL 渲染器 + +在v3.11中,为了提升性能,我们重构了WebGL渲染器,下面是几项重要的改进: + +1. 在 Android 浏览器上默认开启 WebGL(支持的话) +2. WebGL 模式下自动批处理 Sprite +3. Sprite 共享全局的渲染数据缓存,并减少 GL 函数调用 + +在这些优化后,与旧版本相比,合并贴图后的游戏中draw call数量将得到显著的降低。不仅如此,v3.11中的CPU使用率和内存使用也都得到了降低。在我们的bunnymark测试中,v3.11相比之前的版本有4倍以上的渲染性能提升。当然,这是我们对WebGL渲染器做的第一步升级,在后续版本中,WebGL渲染器还将得到持续优化。 + ## 其他改动 更完整的改动列表可以阅读[full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG)。 From 16878a53b115a28a55d9179e535ed5e6025a81a0 Mon Sep 17 00:00:00 2001 From: mogemimi Date: Fri, 13 May 2016 11:44:17 +0900 Subject: [PATCH 123/241] Suppress MSVC warning C4800 --- .../cocostudio/WidgetReader/Light3DReader/Light3DReader.cpp | 2 +- .../WidgetReader/TabControlReader/TabControlReader.cpp | 2 +- cocos/network/WebSocket.cpp | 2 +- cocos/platform/CCImage.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/Light3DReader/Light3DReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/Light3DReader/Light3DReader.cpp index ca009461c438..b7538acc1493 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/Light3DReader/Light3DReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/Light3DReader/Light3DReader.cpp @@ -161,7 +161,7 @@ namespace cocostudio float intensity = options->intensity(); float range = options->range(); float outerAngle = options->outerAngle()*0.5f; - bool enabled = options->enabled(); + bool enabled = (options->enabled() != 0); switch (type) { case cocos2d::LightType::DIRECTIONAL: diff --git a/cocos/editor-support/cocostudio/WidgetReader/TabControlReader/TabControlReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TabControlReader/TabControlReader.cpp index 0e542c3b1ee0..350154ccdba8 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TabControlReader/TabControlReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TabControlReader/TabControlReader.cpp @@ -180,7 +180,7 @@ void TabControlReader::setPropsWithFlatBuffers(cocos2d::Node* node, const flatbu auto options = (flatbuffers::TabControlOption*)nodeOption; int headerPlace = options->headerPlace(); - tabControl->ignoreHeadersTextureSize((bool)options->ignoreHeaderTextureSize()); + tabControl->ignoreHeadersTextureSize(options->ignoreHeaderTextureSize() != 0); tabControl->setHeaderDockPlace((cocos2d::ui::TabControl::Dock)headerPlace); tabControl->setHeaderWidth(options->headerWidth()); tabControl->setHeaderHeight(options->headerHeight()); diff --git a/cocos/network/WebSocket.cpp b/cocos/network/WebSocket.cpp index c1b355d7a5d2..8b6a1bd7a101 100644 --- a/cocos/network/WebSocket.cpp +++ b/cocos/network/WebSocket.cpp @@ -811,7 +811,7 @@ void WebSocket::onClientReceivedData(void* in, ssize_t len) ssize_t frameSize = frameData->size(); - bool isBinary = lws_frame_is_binary(_wsInstance); + bool isBinary = (lws_frame_is_binary(_wsInstance) != 0); if (!isBinary) { diff --git a/cocos/platform/CCImage.cpp b/cocos/platform/CCImage.cpp index e3e661f4e996..fa18b1384d14 100644 --- a/cocos/platform/CCImage.cpp +++ b/cocos/platform/CCImage.cpp @@ -2126,7 +2126,7 @@ bool Image::initWithWebpData(const unsigned char * data, ssize_t dataLen) _height = config.input.height; //we ask webp to give data with premultiplied alpha - _hasPremultipliedAlpha = config.input.has_alpha; + _hasPremultipliedAlpha = (config.input.has_alpha != 0); _dataLen = _width * _height * (config.input.has_alpha?4:3); _data = static_cast(malloc(_dataLen * sizeof(unsigned char))); From cad762a4f9e8bdb0ef498c127f38e34ca24f2e33 Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Fri, 13 May 2016 07:33:51 -0700 Subject: [PATCH 124/241] added updated .filters file --- .../cpp-tests.Shared.vcxitems.filters | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters index 1be490e7ad89..fbd16e3bec96 100644 --- a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters +++ b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters @@ -592,15 +592,6 @@ - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomWidgetCallbackBindTest - - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomWidgetCallbackBindTest - - - Classes\UITest\CocostudioGUISceneTest\CustomTest\CustomWidgetCallbackBindTest - Classes\AllocatorTest @@ -1163,9 +1154,6 @@ {f21347d1-eee3-41d8-93b8-f078be49cbba} - - {00f84260-18d5-4666-b444-e83cb00108fa} - {1b3d89b1-5eb3-4634-affb-39bf18b4601c} @@ -1440,5 +1428,7 @@ Classes\UITest\CocostudioGUISceneTest\UITabControlTest + + \ No newline at end of file From f0343bf219cb597d67a0aeb27ea15c8f19195e71 Mon Sep 17 00:00:00 2001 From: "Wilson E. Alvarez" Date: Fri, 13 May 2016 20:49:39 -0400 Subject: [PATCH 125/241] Fixed APP_NAME for cpp, cpp-empty, js, and lua tests. --- tests/cpp-empty-test/CMakeLists.txt | 2 +- tests/cpp-tests/CMakeLists.txt | 2 +- tests/js-tests/project/CMakeLists.txt | 2 +- tests/lua-tests/project/CMakeLists.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/cpp-empty-test/CMakeLists.txt b/tests/cpp-empty-test/CMakeLists.txt index a2dbf3a51bec..bf1af9314aae 100644 --- a/tests/cpp-empty-test/CMakeLists.txt +++ b/tests/cpp-empty-test/CMakeLists.txt @@ -22,7 +22,7 @@ # THE SOFTWARE. # ****************************************************************************/ -set(APP_NAME cpp_empty_test) +set(APP_NAME cpp-empty-test) if(ANDROID) set(PLATFORM_SRC proj.android/jni/main.cpp) diff --git a/tests/cpp-tests/CMakeLists.txt b/tests/cpp-tests/CMakeLists.txt index 0739a7c53b77..bc473f640157 100644 --- a/tests/cpp-tests/CMakeLists.txt +++ b/tests/cpp-tests/CMakeLists.txt @@ -1,4 +1,4 @@ -set(APP_NAME cpp_tests) +set(APP_NAME cpp-tests) # Use same method as in cocos library cocos_find_package(CURL CURL REQUIRED) diff --git a/tests/js-tests/project/CMakeLists.txt b/tests/js-tests/project/CMakeLists.txt index 575e6d215a33..04afe8b7e931 100644 --- a/tests/js-tests/project/CMakeLists.txt +++ b/tests/js-tests/project/CMakeLists.txt @@ -22,7 +22,7 @@ # THE SOFTWARE. # ****************************************************************************/ -set(APP_NAME js_tests) +set(APP_NAME js-tests) if(WIN32) diff --git a/tests/lua-tests/project/CMakeLists.txt b/tests/lua-tests/project/CMakeLists.txt index c5c75470e3ca..c7b617335cb4 100644 --- a/tests/lua-tests/project/CMakeLists.txt +++ b/tests/lua-tests/project/CMakeLists.txt @@ -1,4 +1,4 @@ -set(APP_NAME lua_tests) +set(APP_NAME lua-tests) set(SAMPLE_SRC Classes/AppDelegate.cpp From a7d9dd9a75f57b1080da7cabcfd43321df8effe3 Mon Sep 17 00:00:00 2001 From: Xpol Wan Date: Sat, 14 May 2016 14:09:58 +0800 Subject: [PATCH 126/241] Print as Lua 5.1 does and remove duplicate code. --- .../lua-bindings/manual/CCLuaStack.cpp | 111 ++++++------------ 1 file changed, 34 insertions(+), 77 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp index 3e56bbf6bdc5..be53250526d7 100644 --- a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp +++ b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp @@ -60,89 +60,46 @@ extern "C" { #include "platform/CCFileUtils.h" namespace { -int lua_print(lua_State * luastate) -{ - int nargs = lua_gettop(luastate); - - std::string t; - for (int i=1; i <= nargs; i++) - { - if (lua_istable(luastate, i)) - t += "table"; - else if (lua_isnone(luastate, i)) - t += "none"; - else if (lua_isnil(luastate, i)) - t += "nil"; - else if (lua_isboolean(luastate, i)) - { - if (lua_toboolean(luastate, i) != 0) - t += "true"; - else - t += "false"; - } - else if (lua_isfunction(luastate, i)) - t += "function"; - else if (lua_islightuserdata(luastate, i)) - t += "lightuserdata"; - else if (lua_isthread(luastate, i)) - t += "thread"; - else - { - const char * str = lua_tostring(luastate, i); - if (str) - t += lua_tostring(luastate, i); - else - t += lua_typename(luastate, lua_type(luastate, i)); + int get_string_for_print(lua_State * L, std::string* out) + { + int n = lua_gettop(L); /* number of arguments */ + int i; + + lua_getglobal(L, "tostring"); + for (i=1; i<=n; i++) { + const char *s; + lua_pushvalue(L, -1); /* function to be called */ + lua_pushvalue(L, i); /* value to print */ + lua_call(L, 1, 1); + size_t sz; + s = lua_tolstring(L, -1, &sz); /* get result */ + if (s == NULL) + return luaL_error(L, LUA_QL("tostring") " must return a string to " + LUA_QL("print")); + if (i>1) out->append("\t"); + out->append(s, sz); + lua_pop(L, 1); /* pop result */ } - if (i!=nargs) - t += "\t"; + return 0; } - CCLOG("[LUA-print] %s", t.c_str()); - return 0; -} + int lua_print(lua_State * L) + { + std::string t; + get_string_for_print(L, &t); + CCLOG("[LUA-print] %s", t.c_str()); -int lua_release_print(lua_State * L) -{ - int nargs = lua_gettop(L); + return 0; + } - std::string t; - for (int i=1; i <= nargs; i++) + int lua_release_print(lua_State * L) { - if (lua_istable(L, i)) - t += "table"; - else if (lua_isnone(L, i)) - t += "none"; - else if (lua_isnil(L, i)) - t += "nil"; - else if (lua_isboolean(L, i)) - { - if (lua_toboolean(L, i) != 0) - t += "true"; - else - t += "false"; - } - else if (lua_isfunction(L, i)) - t += "function"; - else if (lua_islightuserdata(L, i)) - t += "lightuserdata"; - else if (lua_isthread(L, i)) - t += "thread"; - else - { - const char * str = lua_tostring(L, i); - if (str) - t += lua_tostring(L, i); - else - t += lua_typename(L, lua_type(L, i)); - } - if (i!=nargs) - t += "\t"; - } - log("[LUA-print] %s", t.c_str()); + std::string t; + get_string_for_print(L, &t); + log("[LUA-print] %s", t.c_str()); - return 0; -} + return 0; + } } NS_CC_BEGIN @@ -818,7 +775,7 @@ int LuaStack::luaLoadChunksFromZIP(lua_State *L) bool isXXTEA = stack && stack->_xxteaEnabled && size >= stack->_xxteaSignLen && memcmp(stack->_xxteaSign, bytes, stack->_xxteaSignLen) == 0; - + if (isXXTEA) { // decrypt XXTEA xxtea_long len = 0; buffer = xxtea_decrypt(bytes + stack->_xxteaSignLen, From 8ca09f7c2a27ddc905ebf655c460ed9a8fe25a7c Mon Sep 17 00:00:00 2001 From: Ryan Davis Date: Sun, 15 May 2016 12:30:30 +1000 Subject: [PATCH 127/241] Fix crash due to reallocation of shared indices memory --- cocos/renderer/CCQuadCommand.cpp | 12 +++++++++--- cocos/renderer/CCQuadCommand.h | 3 +++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/cocos/renderer/CCQuadCommand.cpp b/cocos/renderer/CCQuadCommand.cpp index 9467eb2c28b1..b7762e34d64d 100644 --- a/cocos/renderer/CCQuadCommand.cpp +++ b/cocos/renderer/CCQuadCommand.cpp @@ -39,13 +39,18 @@ NS_CC_BEGIN int QuadCommand::__indexCapacity = -1; GLushort* QuadCommand::__indices = nullptr; -QuadCommand::QuadCommand() -: _indexSize(-1) +QuadCommand::QuadCommand(): +_indexSize(-1), +_ownedIndices() { } QuadCommand::~QuadCommand() { + for (auto& indices : _ownedIndices) + { + CC_SAFE_DELETE_ARRAY(indices); + } } void QuadCommand::init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, const BlendFunc& blendType, V3F_C4B_T2F_Quad* quads, ssize_t quadCount, @@ -70,7 +75,8 @@ void QuadCommand::reIndex(int indicesCount) if (indicesCount > __indexCapacity) { CCLOG("cocos2d: QuadCommand: resizing index size from [%d] to [%d]", __indexCapacity, indicesCount); - __indices = (GLushort*) realloc(__indices, indicesCount * sizeof(__indices[0])); + _ownedIndices.push_back(__indices); + __indices = new (std::nothrow) GLushort[indicesCount]; __indexCapacity = indicesCount; } diff --git a/cocos/renderer/CCQuadCommand.h b/cocos/renderer/CCQuadCommand.h index e54674a238b2..7bec874e18b5 100644 --- a/cocos/renderer/CCQuadCommand.h +++ b/cocos/renderer/CCQuadCommand.h @@ -25,6 +25,8 @@ #ifndef _CC_QUADCOMMAND_H_ #define _CC_QUADCOMMAND_H_ +#include + #include "renderer/CCTrianglesCommand.h" #include "renderer/CCGLProgramState.h" @@ -69,6 +71,7 @@ class CC_DLL QuadCommand : public TrianglesCommand void reIndex(int indices); int _indexSize; + std::vector _ownedIndices; // shared across all instances static int __indexCapacity; From 251ee4e85a29fbf588ee733dda28e3be891a05c7 Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 16 May 2016 14:01:55 +0800 Subject: [PATCH 128/241] Add web engine feature in release note (#15648) --- docs/RELEASE_NOTES.md | 12 ++++++++++++ docs/RELEASE_NOTES_CN.md | 13 ++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index fcbac2a97002..8fea5876bb4a 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -20,6 +20,7 @@ - [New memory model in JSB](#new-memory-model-in-jsb) - [OpenSSL](#openssl) - [Cocos2d-x JSB program debugging](#cocos2d-x-jsb-program-debugging) + - [New WebGL renderer](#new-webgl-renderer) - [Other changes](#other-changes) @@ -157,6 +158,7 @@ cocos new -l cpp|js|lua MyNewGame * upgrade Curl to v7.48 * upgrade OpenSSL to 1.0.2g * can use VSCode and new Firefox to debug cocos2d-x JSB programs +* refactor WebGL renderer ## The main features in detail of Cocos2d-x v3.11 @@ -208,5 +210,15 @@ In previous version, can not use Firefox 30+ to debug cocos2d-x JSB programs. Th Of course you can use [VSCode](https://code.visualstudio.com/) to debug cocos2d-x JSB programs too. You can read about how to use VSCode to debug cocos2d-x JSB programs [here](http://discuss.cocos2d-x.org/t/use-vscode-to-debug-cocos2d-x-jsb-programs/27588). +### New WebGL renderer + +In v3.11, we have refactored the WebGL renderer in web engine, here is the detailed changes: + +1. Activate WebGL on Android by default. +2. Add sprite auto batching in WebGL. +3. Shared rendering buffer for Sprites. + +Compare with old version, the draw calls in your game should be significantly reduced if the textures is well managed. This improves also the CPU usage and memory usage. The above is just a first step of WebGL renderer upgrade, we will continue to investigate in this direction in the future versions. + ## Other changes You can also take a look at the [full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG). diff --git a/docs/RELEASE_NOTES_CN.md b/docs/RELEASE_NOTES_CN.md index 845a5c821ba9..ee135b043d50 100644 --- a/docs/RELEASE_NOTES_CN.md +++ b/docs/RELEASE_NOTES_CN.md @@ -7,6 +7,7 @@ * CURL升级到v7.48 * OpenSSL升级到v1.0.2g * 可以使用VSCode或者新版本的Firefox调试JSB程序 +* 全面升级 WebGL 渲染器 ## 主要特性的详细介绍 @@ -14,7 +15,7 @@ 使用新的内存模型后,开发者不需要关心对象的声明周期。这就意味着不需要在JS代码里手动调用`retain/release`函数。 -不过该内存模型默认是关闭的。虽然我们已经做了很多的测试,但是还是无法保证它没有任何问题,所以你需要手动开启该功能,开启的方法是在`base/ccConfig.h`里把`CC_ENABLE_GC_FOR_NATIVE`的值改为1: +不过该内存模型默认是关闭的。虽然我们已经做了很多的测试,目前没有发现任何问题,但是保险起见,你需要手动开启该功能,开启的方法是在`base/ccConfig.h`里把`CC_ENABLE_GC_FOR_NATIVE`的值改为1: ```c++ #ifdef CC_ENABLE_SCRIPT_BINDING @@ -57,5 +58,15 @@ v3.11版本之前,不能使用Firefox 30+版本来调试cocos2d-x JSB程序。 当然你也可以使用[VSCode](https://code.visualstudio.com/)来调试,具体的使用方法参考[这篇文档](http://discuss.cocos2d-x.org/t/use-vscode-to-debug-cocos2d-x-jsb-programs/27588)。 +### 全面升级 WebGL 渲染器 + +在v3.11中,为了提升性能,我们重构了WebGL渲染器,下面是几项重要的改进: + +1. 在 Android 浏览器上默认开启 WebGL(支持的话) +2. WebGL 模式下自动批处理 Sprite +3. Sprite 共享全局的渲染数据缓存,并减少 GL 函数调用 + +在这些优化后,与旧版本相比,合并贴图后的游戏中draw call数量将得到显著的降低。不仅如此,v3.11中的CPU使用率和内存使用也都得到了降低。在我们的bunnymark测试中,v3.11相比之前的版本有4倍以上的渲染性能提升。当然,这是我们对WebGL渲染器做的第一步升级,在后续版本中,WebGL渲染器还将得到持续优化。 + ## 其他改动 更完整的改动列表可以阅读[full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG)。 From 2b480a75bfdfa350f55d3871a3d371a3a8f89690 Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 16 May 2016 14:45:09 +0800 Subject: [PATCH 129/241] use AF_UNSPEC to support ipv6 --- cocos/base/CCConsole.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/base/CCConsole.cpp b/cocos/base/CCConsole.cpp index 1509d62fde00..682fb7da422e 100644 --- a/cocos/base/CCConsole.cpp +++ b/cocos/base/CCConsole.cpp @@ -422,7 +422,7 @@ bool Console::listenOnTCP(int port) bzero(&hints, sizeof(struct addrinfo)); hints.ai_flags = AI_PASSIVE; - hints.ai_family = AF_INET; // AF_UNSPEC: Do we need IPv6 ? + hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) From 88db5d3660fa32d90940c8f0d95910473ac14b8d Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 16 May 2016 15:15:29 +0800 Subject: [PATCH 130/241] use AF_UNSPEC to support ipv6 --- cocos/scripting/js-bindings/manual/ScriptingCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp index d9b111c33289..991fbd06c169 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp @@ -1867,7 +1867,7 @@ static void serverEntryPoint(unsigned int port) struct addrinfo hints, *result = nullptr, *rp = nullptr; int s = 0; memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_INET; // IPv4 + hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; // TCP stream sockets hints.ai_flags = AI_PASSIVE; // fill in my IP for me From 3ae5b1075b1e0a0cb3f375048dcbf865e75e7a9e Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Mon, 16 May 2016 15:22:11 +0800 Subject: [PATCH 131/241] fix native control onEnter issue --- cocos/ui/UIVideoPlayer-android.cpp | 11 ++-- cocos/ui/UIVideoPlayer-ios.mm | 87 ++++++++++++++------------- cocos/ui/UIWebView-inl.h | 96 ++++++++++++++++-------------- cocos/ui/UIWebView.h | 1 - 4 files changed, 105 insertions(+), 90 deletions(-) diff --git a/cocos/ui/UIVideoPlayer-android.cpp b/cocos/ui/UIVideoPlayer-android.cpp index 2b009458cf73..c3b473d9e43a 100644 --- a/cocos/ui/UIVideoPlayer-android.cpp +++ b/cocos/ui/UIVideoPlayer-android.cpp @@ -234,22 +234,25 @@ void VideoPlayer::setVisible(bool visible) { cocos2d::ui::Widget::setVisible(visible); - if (! _videoURL.empty()) + if (!visible || isRunning()) { JniHelper::callStaticVoidMethod(videoHelperClassName, "setVideoVisible", _videoPlayerIndex, visible); - } + } } void VideoPlayer::onEnter() { Widget::onEnter(); - this->setVisible(true); + if (isVisible() && !_videoURL.empty()) + { + JniHelper::callStaticVoidMethod(videoHelperClassName, "setVideoVisible", _videoPlayerIndex, true); + } } void VideoPlayer::onExit() { Widget::onExit(); - this->setVisible(false); + JniHelper::callStaticVoidMethod(videoHelperClassName, "setVideoVisible", _videoPlayerIndex, false); } void VideoPlayer::addEventListener(const VideoPlayer::ccVideoPlayerCallback& callback) diff --git a/cocos/ui/UIVideoPlayer-ios.mm b/cocos/ui/UIVideoPlayer-ios.mm index f1032983ec12..3cbd28b96fa0 100644 --- a/cocos/ui/UIVideoPlayer-ios.mm +++ b/cocos/ui/UIVideoPlayer-ios.mm @@ -46,10 +46,10 @@ - (void) pause; - (void) resume; - (void) stop; - (void) seekTo:(float) sec; -- (void) setVisible:(bool) visible; -- (void) setKeepRatioEnabled:(bool) enabled; -- (void) setFullScreenEnabled:(bool) enabled; -- (bool) isFullScreenEnabled; +- (void) setVisible:(BOOL) visible; +- (void) setKeepRatioEnabled:(BOOL) enabled; +- (void) setFullScreenEnabled:(BOOL) enabled; +- (BOOL) isFullScreenEnabled; -(id) init:(void*) videoPlayer; @@ -66,7 +66,7 @@ @implementation UIVideoViewWrapperIos int _width; int _height; bool _keepRatioEnabled; - + VideoPlayer* _videoPlayer; } @@ -77,7 +77,7 @@ -(id)init:(void*)videoPlayer _videoPlayer = (VideoPlayer*)videoPlayer; _keepRatioEnabled = false; } - + return self; } @@ -86,7 +86,7 @@ -(void) dealloc if (self.moviePlayer != nullptr) { [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer]; - + [self.moviePlayer stop]; [self.moviePlayer.view removeFromSuperview]; self.moviePlayer = nullptr; @@ -106,19 +106,19 @@ -(void) setFrame:(int)left :(int)top :(int)width :(int)height } } --(void) setFullScreenEnabled:(bool) enabled +-(void) setFullScreenEnabled:(BOOL) enabled { if (self.moviePlayer != nullptr) { [self.moviePlayer setFullscreen:enabled animated:(true)]; } } --(bool) isFullScreenEnabled +-(BOOL) isFullScreenEnabled { if (self.moviePlayer != nullptr) { return [self.moviePlayer isFullscreen]; } - + return false; } @@ -127,12 +127,12 @@ -(void) setURL:(int)videoSource :(std::string &)videoUrl if (self.moviePlayer != nullptr) { [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer]; - + [self.moviePlayer stop]; [self.moviePlayer.view removeFromSuperview]; self.moviePlayer = nullptr; } - + if (videoSource == 1) { self.moviePlayer = [[[MPMoviePlayerController alloc] init] autorelease]; self.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming; @@ -144,24 +144,24 @@ -(void) setURL:(int)videoSource :(std::string &)videoUrl self.moviePlayer.allowsAirPlay = false; self.moviePlayer.controlStyle = MPMovieControlStyleEmbedded; self.moviePlayer.view.userInteractionEnabled = true; - + auto clearColor = [UIColor clearColor]; self.moviePlayer.backgroundView.backgroundColor = clearColor; self.moviePlayer.view.backgroundColor = clearColor; for (UIView * subView in self.moviePlayer.view.subviews) { subView.backgroundColor = clearColor; } - + if (_keepRatioEnabled) { self.moviePlayer.scalingMode = MPMovieScalingModeAspectFit; } else { self.moviePlayer.scalingMode = MPMovieScalingModeFill; } - + auto view = cocos2d::Director::getInstance()->getOpenGLView(); auto eaglview = (CCEAGLView *) view->getEAGLView(); [eaglview addSubview:self.moviePlayer.view]; - + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playStateChange) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer]; } @@ -208,14 +208,14 @@ -(void) seekTo:(float)sec } } --(void) setVisible:(bool)visible +-(void) setVisible:(BOOL)visible { if (self.moviePlayer != NULL) { [self.moviePlayer.view setHidden:!visible]; } } --(void) setKeepRatioEnabled:(bool)enabled +-(void) setKeepRatioEnabled:(BOOL)enabled { _keepRatioEnabled = enabled; if (self.moviePlayer != NULL) { @@ -303,27 +303,27 @@ -(void) stop void VideoPlayer::draw(Renderer* renderer, const Mat4 &transform, uint32_t flags) { cocos2d::ui::Widget::draw(renderer,transform,flags); - + if (flags & FLAGS_TRANSFORM_DIRTY) { auto directorInstance = Director::getInstance(); auto glView = directorInstance->getOpenGLView(); auto frameSize = glView->getFrameSize(); auto scaleFactor = [static_cast(glView->getEAGLView()) contentScaleFactor]; - + auto winSize = directorInstance->getWinSize(); - + auto leftBottom = convertToWorldSpace(Vec2::ZERO); auto rightTop = convertToWorldSpace(Vec2(_contentSize.width,_contentSize.height)); - + auto uiLeft = (frameSize.width / 2 + (leftBottom.x - winSize.width / 2 ) * glView->getScaleX()) / scaleFactor; auto uiTop = (frameSize.height /2 - (rightTop.y - winSize.height / 2) * glView->getScaleY()) / scaleFactor; - + [((UIVideoViewWrapperIos*)_videoView) setFrame :uiLeft :uiTop :(rightTop.x - leftBottom.x) * glView->getScaleX() / scaleFactor :( (rightTop.y - leftBottom.y) * glView->getScaleY()/scaleFactor)]; } - + #if CC_VIDEOPLAYER_DEBUG_DRAW _debugDrawNode->clear(); auto size = getContentSize(); @@ -343,18 +343,6 @@ -(void) stop return [((UIVideoViewWrapperIos*)_videoView) isFullScreenEnabled]; } -void VideoPlayer::onEnter() -{ - Widget::onEnter(); - [((UIVideoViewWrapperIos*)_videoView) setVisible:YES]; -} - -void VideoPlayer::onExit() -{ - Widget::onExit(); - [((UIVideoViewWrapperIos*)_videoView) setVisible:NO]; -} - void VideoPlayer::setFullScreenEnabled(bool enabled) { [((UIVideoViewWrapperIos*)_videoView) setFullScreenEnabled:enabled]; @@ -417,13 +405,32 @@ -(void) stop void VideoPlayer::setVisible(bool visible) { cocos2d::ui::Widget::setVisible(visible); - - if (! _videoURL.empty()) + + if (!visible) { - [((UIVideoViewWrapperIos*)_videoView) setVisible:visible]; + [((UIVideoViewWrapperIos*)_videoView) setVisible:NO]; + } + else if(isRunning()) + { + [((UIVideoViewWrapperIos*)_videoView) setVisible:YES]; } } +void VideoPlayer::onEnter() +{ + Widget::onEnter(); + if (isVisible()) + { + [((UIVideoViewWrapperIos*)_videoView) setVisible: YES]; + } +} + +void VideoPlayer::onExit() +{ + Widget::onExit(); + [((UIVideoViewWrapperIos*)_videoView) setVisible: NO]; +} + void VideoPlayer::addEventListener(const VideoPlayer::ccVideoPlayerCallback& callback) { _eventCallback = callback; @@ -436,7 +443,7 @@ -(void) stop } else { _isPlaying = false; } - + if (_eventCallback) { _eventCallback(this, (VideoPlayer::EventType)event); diff --git a/cocos/ui/UIWebView-inl.h b/cocos/ui/UIWebView-inl.h index 43644093b76b..09676345d426 100644 --- a/cocos/ui/UIWebView-inl.h +++ b/cocos/ui/UIWebView-inl.h @@ -1,18 +1,18 @@ /**************************************************************************** Copyright (c) 2014-2015 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 @@ -33,7 +33,7 @@ NS_CC_BEGIN namespace experimental{ namespace ui{ - + WebView::WebView() : _impl(new WebViewImpl(this)), _onJSCallback(nullptr), @@ -42,12 +42,12 @@ namespace experimental{ _onDidFailLoading(nullptr) { } - + WebView::~WebView() { CC_SAFE_DELETE(_impl); } - + WebView *WebView::create() { auto webView = new(std::nothrow) WebView(); @@ -59,12 +59,12 @@ namespace experimental{ CC_SAFE_DELETE(webView); return nullptr; } - + void WebView::setJavascriptInterfaceScheme(const std::string &scheme) { _impl->setJavascriptInterfaceScheme(scheme); } - + void WebView::loadData(const cocos2d::Data &data, const std::string &MIMEType, const std::string &encoding, @@ -72,74 +72,92 @@ namespace experimental{ { _impl->loadData(data, MIMEType, encoding, baseURL); } - + void WebView::loadHTMLString(const std::string &string, const std::string &baseURL) { _impl->loadHTMLString(string, baseURL); } - + void WebView::loadURL(const std::string &url) { _impl->loadURL(url); } - + void WebView::loadFile(const std::string &fileName) { _impl->loadFile(fileName); } - + void WebView::stopLoading() { _impl->stopLoading(); } - + void WebView::reload() { _impl->reload(); } - + bool WebView::canGoBack() { return _impl->canGoBack(); } - + bool WebView::canGoForward() { return _impl->canGoForward(); } - + void WebView::goBack() { _impl->goBack(); } - + void WebView::goForward() { _impl->goForward(); } - + void WebView::evaluateJS(const std::string &js) { _impl->evaluateJS(js); } - + void WebView::setScalesPageToFit(bool const scalesPageToFit) { _impl->setScalesPageToFit(scalesPageToFit); } - + void WebView::draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, uint32_t flags) { cocos2d::ui::Widget::draw(renderer, transform, flags); _impl->draw(renderer, transform, flags); } - + void WebView::setVisible(bool visible) { Node::setVisible(visible); - _impl->setVisible(visible); + if (!visible || isRunning()) + { + _impl->setVisible(visible); + } + } + + void WebView::onEnter() + { + Widget::onEnter(); + if(isVisible()) + { + _impl->setVisible(true); + } + } + + void WebView::onExit() + { + Widget::onExit(); + _impl->setVisible(false); } - + cocos2d::ui::Widget* WebView::createCloneInstance() { return WebView::create(); @@ -157,59 +175,47 @@ namespace experimental{ this->_onJSCallback = webView->_onJSCallback; } } - + void WebView::setOnDidFailLoading(const ccWebViewCallback &callback) { _onDidFailLoading = callback; } - + void WebView::setOnDidFinishLoading(const ccWebViewCallback &callback) { _onDidFinishLoading = callback; } - + void WebView::setOnShouldStartLoading(const std::function &callback) { _onShouldStartLoading = callback; } - + void WebView::setOnJSCallback(const ccWebViewCallback &callback) { _onJSCallback = callback; } - + std::function WebView::getOnShouldStartLoading()const { return _onShouldStartLoading; } - + WebView::ccWebViewCallback WebView::getOnDidFailLoading()const { return _onDidFailLoading; } - + WebView::ccWebViewCallback WebView::getOnDidFinishLoading()const { return _onDidFinishLoading; } - + WebView::ccWebViewCallback WebView::getOnJSCallback()const { return _onJSCallback; } - - void WebView::onEnter() - { - Widget::onEnter(); - _impl->setVisible(true); - } - - void WebView::onExit() - { - Widget::onExit(); - _impl->setVisible(false); - } - + } // namespace ui } // namespace experimental } //namespace cocos2d diff --git a/cocos/ui/UIWebView.h b/cocos/ui/UIWebView.h index a0d698e8f717..20ac7e45d1d7 100644 --- a/cocos/ui/UIWebView.h +++ b/cocos/ui/UIWebView.h @@ -203,7 +203,6 @@ class CC_GUI_DLL WebView : public cocos2d::ui::Widget { * Toggle visibility of WebView. */ virtual void setVisible(bool visible) override; - virtual void onEnter() override; virtual void onExit() override; From a1a8feed710de96193b6071e68e79373239e5645 Mon Sep 17 00:00:00 2001 From: mogemimi Date: Sat, 14 May 2016 15:53:26 +0900 Subject: [PATCH 132/241] Add missing references to avoid unnecessary copies --- cocos/network/HttpClient-android.cpp | 4 ++-- cocos/network/HttpCookie.cpp | 2 +- cocos/network/HttpCookie.h | 2 +- cocos/renderer/CCTextureCache.cpp | 2 +- cocos/renderer/CCTextureCache.h | 2 +- cocos/ui/UIRichText.cpp | 2 +- cocos/ui/UIRichText.h | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cocos/network/HttpClient-android.cpp b/cocos/network/HttpClient-android.cpp index 1d5d50025945..a507ec213f8d 100644 --- a/cocos/network/HttpClient-android.cpp +++ b/cocos/network/HttpClient-android.cpp @@ -383,7 +383,7 @@ class HttpURLConnection return header; } - const std::string getCookieFileName() + const std::string& getCookieFileName() const { return _cookieFileName; } @@ -608,7 +608,7 @@ class HttpURLConnection return len; } - const std::string getCookieString() + const std::string& getCookieString() const { return _responseCookies; } diff --git a/cocos/network/HttpCookie.cpp b/cocos/network/HttpCookie.cpp index c293819daa34..74b1962846b0 100644 --- a/cocos/network/HttpCookie.cpp +++ b/cocos/network/HttpCookie.cpp @@ -152,7 +152,7 @@ void HttpCookie::writeFile() fclose(out); } -void HttpCookie::setCookieFileName(std::string filename) +void HttpCookie::setCookieFileName(const std::string& filename) { _cookieFileName = filename; } diff --git a/cocos/network/HttpCookie.h b/cocos/network/HttpCookie.h index 9dbae315da53..a4065e2dfd71 100644 --- a/cocos/network/HttpCookie.h +++ b/cocos/network/HttpCookie.h @@ -46,7 +46,7 @@ class HttpCookie void readFile(); void writeFile(); - void setCookieFileName(const std::string fileName); + void setCookieFileName(const std::string& fileName); const std::vector* getCookies()const; const CookiesInfo* getMatchCookie(const std::string& url) const; diff --git a/cocos/renderer/CCTextureCache.cpp b/cocos/renderer/CCTextureCache.cpp index 20e0bd353347..424b0480e26e 100644 --- a/cocos/renderer/CCTextureCache.cpp +++ b/cocos/renderer/CCTextureCache.cpp @@ -600,7 +600,7 @@ std::string TextureCache::getCachedTextureInfo() const return buffer; } -void TextureCache::renameTextureWithKey(const std::string srcName, const std::string dstName) +void TextureCache::renameTextureWithKey(const std::string& srcName, const std::string& dstName) { std::string key = srcName; auto it = _textures.find(key); diff --git a/cocos/renderer/CCTextureCache.h b/cocos/renderer/CCTextureCache.h index 4225fb98a880..a301905ecbc7 100644 --- a/cocos/renderer/CCTextureCache.h +++ b/cocos/renderer/CCTextureCache.h @@ -212,7 +212,7 @@ class CC_DLL TextureCache : public Ref * * @since v3.10 */ - void renameTextureWithKey(const std::string srcName, const std::string dstName); + void renameTextureWithKey(const std::string& srcName, const std::string& dstName); private: diff --git a/cocos/ui/UIRichText.cpp b/cocos/ui/UIRichText.cpp index fb042f5fb5e1..7d213a43053a 100644 --- a/cocos/ui/UIRichText.cpp +++ b/cocos/ui/UIRichText.cpp @@ -1691,7 +1691,7 @@ void RichText::handleTextRenderer(const std::string& text, const std::string& fo } } -void RichText::handleImageRenderer(const std::string& filePath, const Color3B &color, GLubyte opacity, int width, int height, const std::string url) +void RichText::handleImageRenderer(const std::string& filePath, const Color3B &color, GLubyte opacity, int width, int height, const std::string& url) { Sprite* imageRenderer = Sprite::create(filePath); if (imageRenderer) diff --git a/cocos/ui/UIRichText.h b/cocos/ui/UIRichText.h index 0062993889c5..539d38cb860a 100644 --- a/cocos/ui/UIRichText.h +++ b/cocos/ui/UIRichText.h @@ -553,7 +553,7 @@ class CC_GUI_DLL RichText : public Widget const Color3B& outlineColor = Color3B::WHITE, int outlineSize = -1, const Color3B& shadowColor = Color3B::BLACK, const cocos2d::Size& shadowOffset = Size(2.0, -2.0), int shadowBlurRadius = 0, const Color3B& glowColor = Color3B::WHITE); - void handleImageRenderer(const std::string& fileParh, const Color3B& color, GLubyte opacity, int width, int height, const std::string url); + void handleImageRenderer(const std::string& fileParh, const Color3B& color, GLubyte opacity, int width, int height, const std::string& url); void handleCustomRenderer(Node* renderer); void formarRenderers(); void addNewLine(); From c96bd9a4dfbbe67eaf57a368925ddc88c375a717 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 17 May 2016 12:06:28 +0800 Subject: [PATCH 133/241] Resolve local reference leak and function order --- cocos/platform/CCImage.h | 30 +++++++++---------- .../local-storage/LocalStorage-android.cpp | 16 ++++++---- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/cocos/platform/CCImage.h b/cocos/platform/CCImage.h index 3bbc3618c040..de8466db91a2 100644 --- a/cocos/platform/CCImage.h +++ b/cocos/platform/CCImage.h @@ -100,6 +100,21 @@ class CC_DLL Image : public Ref UNKNOWN }; + /** + * Enables or disables premultiplied alpha for PNG files. + * + * @param enabled (default: true) + */ + static void setPNGPremultipliedAlphaEnabled(bool enabled) { PNG_PREMULTIPLIED_ALPHA_ENABLED = enabled; } + + /** treats (or not) PVR files as if they have alpha premultiplied. + Since it is impossible to know at runtime if the PVR images have the alpha channel premultiplied, it is + possible load them as if they have (or not) the alpha channel premultiplied. + + By default it is disabled. + */ + static void setPVRImagesHavePremultipliedAlpha(bool haveAlphaPremultiplied); + /** @brief Load the image from the specified path. @param path the absolute file path. @@ -145,21 +160,6 @@ class CC_DLL Image : public Ref */ bool saveToFile(const std::string &filename, bool isToRGB = true); - /** - * Enables or disables premultiplied alpha for PNG files. - * - * @param enabled (default: true) - */ - static void setPNGPremultipliedAlphaEnabled(bool enabled) { PNG_PREMULTIPLIED_ALPHA_ENABLED = enabled; } - - /** treats (or not) PVR files as if they have alpha premultiplied. - Since it is impossible to know at runtime if the PVR images have the alpha channel premultiplied, it is - possible load them as if they have (or not) the alpha channel premultiplied. - - By default it is disabled. - */ - static void setPVRImagesHavePremultipliedAlpha(bool haveAlphaPremultiplied); - protected: #if defined(CC_USE_WIC) bool encodeWithWIC(const std::string& filePath, bool isToRGB, GUID containerFormat); diff --git a/cocos/storage/local-storage/LocalStorage-android.cpp b/cocos/storage/local-storage/LocalStorage-android.cpp index d3dc6e5b37a0..89768115ed73 100644 --- a/cocos/storage/local-storage/LocalStorage-android.cpp +++ b/cocos/storage/local-storage/LocalStorage-android.cpp @@ -96,13 +96,19 @@ bool localStorageGetItem( const std::string& key, std::string *outItem ) jstring jret = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID, jkey); if (jret == nullptr) { + t.env->DeleteLocalRef(jret); + t.env->DeleteLocalRef(jkey); + t.env->DeleteLocalRef(t.classID); return false; } - outItem->assign(JniHelper::jstring2string(jret)); - t.env->DeleteLocalRef(jret); - t.env->DeleteLocalRef(jkey); - t.env->DeleteLocalRef(t.classID); - return true; + else + { + outItem->assign(JniHelper::jstring2string(jret)); + t.env->DeleteLocalRef(jret); + t.env->DeleteLocalRef(jkey); + t.env->DeleteLocalRef(t.classID); + return true; + } } else { From 948f64631fc67994a4888fe64fbc6d468129cd00 Mon Sep 17 00:00:00 2001 From: mogemimi Date: Tue, 17 May 2016 13:17:56 +0900 Subject: [PATCH 134/241] Use const references whenever possible --- cocos/2d/CCActionCatmullRom.cpp | 2 +- cocos/2d/CCActionCatmullRom.h | 2 +- cocos/2d/CCActionGrid3D.cpp | 4 ++-- cocos/2d/CCActionGrid3D.h | 4 ++-- cocos/2d/CCAutoPolygon.cpp | 2 +- cocos/2d/CCAutoPolygon.h | 2 +- cocos/2d/CCFastTMXLayer.cpp | 2 +- cocos/2d/CCFastTMXLayer.h | 2 +- cocos/2d/CCTMXLayer.cpp | 4 ++-- cocos/2d/CCTMXLayer.h | 4 ++-- cocos/3d/CCTerrain.cpp | 12 ++++++------ cocos/3d/CCTerrain.h | 12 ++++++------ cocos/base/CCConsole.cpp | 2 +- cocos/base/CCConsole.h | 2 +- cocos/base/ccUTF8.cpp | 2 +- cocos/base/ccUTF8.h | 2 +- cocos/network/HttpClient-android.cpp | 2 +- cocos/network/HttpConnection-winrt.cpp | 14 +++++++------- cocos/network/HttpConnection-winrt.h | 12 ++++++------ cocos/network/HttpRequest.h | 2 +- cocos/network/SocketIO.cpp | 4 ++-- cocos/platform/ios/CCGLViewImpl-ios.h | 4 ++-- cocos/platform/ios/CCGLViewImpl-ios.mm | 4 ++-- 23 files changed, 51 insertions(+), 51 deletions(-) diff --git a/cocos/2d/CCActionCatmullRom.cpp b/cocos/2d/CCActionCatmullRom.cpp index e169e02d16f7..48022a025d52 100644 --- a/cocos/2d/CCActionCatmullRom.cpp +++ b/cocos/2d/CCActionCatmullRom.cpp @@ -112,7 +112,7 @@ void PointArray::setControlPoints(vector *controlPoints) _controlPoints = controlPoints; } -void PointArray::addControlPoint(Vec2 controlPoint) +void PointArray::addControlPoint(const Vec2& controlPoint) { _controlPoints->push_back(new Vec2(controlPoint.x, controlPoint.y)); } diff --git a/cocos/2d/CCActionCatmullRom.h b/cocos/2d/CCActionCatmullRom.h index 83d132e7cd2a..7dedd927f93a 100644 --- a/cocos/2d/CCActionCatmullRom.h +++ b/cocos/2d/CCActionCatmullRom.h @@ -88,7 +88,7 @@ class CC_DLL PointArray : public Ref, public Clonable * @js NA * @param controlPoint A control point. */ - void addControlPoint(Vec2 controlPoint); + void addControlPoint(const Vec2& controlPoint); /** Inserts a controlPoint at index. * diff --git a/cocos/2d/CCActionGrid3D.cpp b/cocos/2d/CCActionGrid3D.cpp index 95704e2f194f..8cd6564d5510 100644 --- a/cocos/2d/CCActionGrid3D.cpp +++ b/cocos/2d/CCActionGrid3D.cpp @@ -653,7 +653,7 @@ void Waves::update(float time) // implementation of Twirl -Twirl* Twirl::create(float duration, const Size& gridSize, Vec2 position, unsigned int twirls, float amplitude) +Twirl* Twirl::create(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude) { Twirl *action = new (std::nothrow) Twirl(); @@ -672,7 +672,7 @@ Twirl* Twirl::create(float duration, const Size& gridSize, Vec2 position, unsign return action; } -bool Twirl::initWithDuration(float duration, const Size& gridSize, Vec2 position, unsigned int twirls, float amplitude) +bool Twirl::initWithDuration(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude) { if (Grid3DAction::initWithDuration(duration, gridSize)) { diff --git a/cocos/2d/CCActionGrid3D.h b/cocos/2d/CCActionGrid3D.h index fe782db0361b..16f2ca22067d 100644 --- a/cocos/2d/CCActionGrid3D.h +++ b/cocos/2d/CCActionGrid3D.h @@ -545,7 +545,7 @@ class CC_DLL Twirl : public Grid3DAction @param amplitude Specify the amplitude of the Twirl action. @return If the creation success, return a pointer of Twirl action; otherwise, return nil. */ - static Twirl* create(float duration, const Size& gridSize, Vec2 position, unsigned int twirls, float amplitude); + static Twirl* create(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude); /** @brief Get the center position of twirl action. @@ -598,7 +598,7 @@ class CC_DLL Twirl : public Grid3DAction @param amplitude Specify the amplitude of the Twirl action. @return If the initialization success, return true; otherwise, return false. */ - bool initWithDuration(float duration, const Size& gridSize, Vec2 position, unsigned int twirls, float amplitude); + bool initWithDuration(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude); protected: /* twirl center */ diff --git a/cocos/2d/CCAutoPolygon.cpp b/cocos/2d/CCAutoPolygon.cpp index c708d6870683..fe80c26f3e8c 100644 --- a/cocos/2d/CCAutoPolygon.cpp +++ b/cocos/2d/CCAutoPolygon.cpp @@ -421,7 +421,7 @@ float AutoPolygon::perpendicularDistance(const cocos2d::Vec2& i, const cocos2d:: } return res; } -std::vector AutoPolygon::rdp(std::vector v, const float& optimization) +std::vector AutoPolygon::rdp(const std::vector& v, float optimization) { if(v.size() < 3) return v; diff --git a/cocos/2d/CCAutoPolygon.h b/cocos/2d/CCAutoPolygon.h index 25cebe9303ad..5863351407e8 100644 --- a/cocos/2d/CCAutoPolygon.h +++ b/cocos/2d/CCAutoPolygon.h @@ -260,7 +260,7 @@ class CC_DLL AutoPolygon int getIndexFromPos(const unsigned int& x, const unsigned int& y){return y*_width+x;}; cocos2d::Vec2 getPosFromIndex(const unsigned int& i){return cocos2d::Vec2(i%_width, i/_width);}; - std::vector rdp(std::vector v, const float& optimization); + std::vector rdp(const std::vector& v, float optimization); float perpendicularDistance(const cocos2d::Vec2& i, const cocos2d::Vec2& start, const cocos2d::Vec2& end); //real rect is the size that is in scale with the texture file diff --git a/cocos/2d/CCFastTMXLayer.cpp b/cocos/2d/CCFastTMXLayer.cpp index 34e4f046cc54..6d367cc0375f 100644 --- a/cocos/2d/CCFastTMXLayer.cpp +++ b/cocos/2d/CCFastTMXLayer.cpp @@ -828,7 +828,7 @@ void TMXLayer::setTileGID(int gid, const Vec2& tileCoordinate, TMXTileFlags flag } } -void TMXLayer::setupTileSprite(Sprite* sprite, Vec2 pos, int gid) +void TMXLayer::setupTileSprite(Sprite* sprite, const Vec2& pos, int gid) { sprite->setPosition(getPositionAt(pos)); sprite->setPositionZ((float)getVertexZForPos(pos)); diff --git a/cocos/2d/CCFastTMXLayer.h b/cocos/2d/CCFastTMXLayer.h index 745f93fc06c4..085bfb659982 100644 --- a/cocos/2d/CCFastTMXLayer.h +++ b/cocos/2d/CCFastTMXLayer.h @@ -261,7 +261,7 @@ class CC_DLL TMXLayer : public Node * @param pos The tile coordinate. * @param gid The tile gid. */ - void setupTileSprite(Sprite* sprite, Vec2 pos, int gid); + void setupTileSprite(Sprite* sprite, const Vec2& pos, int gid); // // Override diff --git a/cocos/2d/CCTMXLayer.cpp b/cocos/2d/CCTMXLayer.cpp index 05217b29901d..49a2314f029a 100644 --- a/cocos/2d/CCTMXLayer.cpp +++ b/cocos/2d/CCTMXLayer.cpp @@ -224,7 +224,7 @@ void TMXLayer::parseInternalProperties() } } -void TMXLayer::setupTileSprite(Sprite* sprite, Vec2 pos, int gid) +void TMXLayer::setupTileSprite(Sprite* sprite, const Vec2& pos, int gid) { sprite->setPosition(getPositionAt(pos)); sprite->setPositionZ((float)getVertexZForPos(pos)); @@ -281,7 +281,7 @@ void TMXLayer::setupTileSprite(Sprite* sprite, Vec2 pos, int gid) } } -Sprite* TMXLayer::reusedTileWithRect(Rect rect) +Sprite* TMXLayer::reusedTileWithRect(const Rect& rect) { if (! _reusedTile) { diff --git a/cocos/2d/CCTMXLayer.h b/cocos/2d/CCTMXLayer.h index c0936db07a50..33bfbb475cb6 100644 --- a/cocos/2d/CCTMXLayer.h +++ b/cocos/2d/CCTMXLayer.h @@ -307,8 +307,8 @@ class CC_DLL TMXLayer : public SpriteBatchNode /* The layer recognizes some special properties, like cc_vertexz */ void parseInternalProperties(); - void setupTileSprite(Sprite* sprite, Vec2 pos, int gid); - Sprite* reusedTileWithRect(Rect rect); + void setupTileSprite(Sprite* sprite, const Vec2& pos, int gid); + Sprite* reusedTileWithRect(const Rect& rect); int getVertexZForPos(const Vec2& pos); // index diff --git a/cocos/3d/CCTerrain.cpp b/cocos/3d/CCTerrain.cpp index 03a5959c48b0..e7e9d7da4039 100644 --- a/cocos/3d/CCTerrain.cpp +++ b/cocos/3d/CCTerrain.cpp @@ -294,7 +294,7 @@ Terrain::Terrain() #endif } -void Terrain::setChunksLOD(Vec3 cameraPos) +void Terrain::setChunksLOD(const Vec3& cameraPos) { int chunk_amount_y = _imageHeight/_chunkSize.height; int chunk_amount_x = _imageWidth/_chunkSize.width; @@ -369,9 +369,9 @@ float Terrain::getHeight(float x, float z, Vec3 * normal) const } } -float Terrain::getHeight(Vec2 pos, Vec3*Normal) const +float Terrain::getHeight(const Vec2& pos, Vec3* normal) const { - return getHeight(pos.x,pos.y,Normal); + return getHeight(pos.x, pos.y, normal); } float Terrain::getImageHeight(int pixel_x,int pixel_y) const @@ -606,7 +606,7 @@ void Terrain::setMaxDetailMapAmount(int max_value) _maxDetailMapValue = max_value; } -cocos2d::Vec2 Terrain::convertToTerrainSpace(Vec2 worldSpaceXZ) const +cocos2d::Vec2 Terrain::convertToTerrainSpace(const Vec2& worldSpaceXZ) const { Vec2 pos(worldSpaceXZ.x,worldSpaceXZ.y); @@ -1638,14 +1638,14 @@ Terrain::DetailMap::DetailMap() _detailMapSize = 35; } -Terrain::Triangle::Triangle(Vec3 p1, Vec3 p2, Vec3 p3) +Terrain::Triangle::Triangle(const Vec3& p1, const Vec3& p2, const Vec3& p3) { _p1 = p1; _p2 = p2; _p3 = p3; } -void Terrain::Triangle::transform(cocos2d::Mat4 matrix) +void Terrain::Triangle::transform(const cocos2d::Mat4& matrix) { matrix.transformPoint(&_p1); matrix.transformPoint(&_p2); diff --git a/cocos/3d/CCTerrain.h b/cocos/3d/CCTerrain.h index 173d4fb3e046..00a259a2a845 100644 --- a/cocos/3d/CCTerrain.h +++ b/cocos/3d/CCTerrain.h @@ -114,9 +114,9 @@ class CC_DLL Terrain : public Node */ struct Triangle { - Triangle(Vec3 p1, Vec3 p2, Vec3 p3); + Triangle(const Vec3& p1, const Vec3& p2, const Vec3& p3); bool getInsterctPoint(const Ray &ray, Vec3& interScetPoint) const; - void transform(Mat4 matrix); + void transform(const Mat4& matrix); Vec3 _p1, _p2, _p3; }; @@ -181,7 +181,7 @@ class CC_DLL Terrain : public Node { /*constructor*/ TerrainVertexData(){}; - TerrainVertexData(Vec3 v1, Tex2F v2) + TerrainVertexData(const Vec3& v1, const Tex2F& v2) { _position = v1; _texcoord = v2; @@ -334,7 +334,7 @@ class CC_DLL Terrain : public Node * @param normal the specified position's normal vector in terrain . if this argument is NULL or nullptr,Normal calculation shall be skip. * @return the height value of the specified position of the terrain, if the (X,Z) position is out of the terrain bounds,it shall return 0; **/ - float getHeight(Vec2 pos, Vec3*Normal = nullptr) const; + float getHeight(const Vec2& pos, Vec3* normal = nullptr) const; /**get the normal of the specified position in terrain * @return the normal vector of the specified position of the terrain. @@ -387,7 +387,7 @@ class CC_DLL Terrain : public Node /** * Convert a world Space position (X,Z) to terrain space position (X,Z) */ - Vec2 convertToTerrainSpace(Vec2 worldSpace) const; + Vec2 convertToTerrainSpace(const Vec2& worldSpace) const; /** * reset the heightmap data. @@ -442,7 +442,7 @@ class CC_DLL Terrain : public Node * recursively set each chunk's LOD * @param cameraPos the camera position in world space **/ - void setChunksLOD(Vec3 cameraPos); + void setChunksLOD(const Vec3& cameraPos); /** * load Vertices from height filed for the whole terrain. diff --git a/cocos/base/CCConsole.cpp b/cocos/base/CCConsole.cpp index 682fb7da422e..d8048fc1321f 100644 --- a/cocos/base/CCConsole.cpp +++ b/cocos/base/CCConsole.cpp @@ -247,7 +247,7 @@ std::vector Console::Utility::split(const std::string& s, char deli } //isFloat taken from http://stackoverflow.com/questions/447206/c-isfloat-function -bool Console::Utility::isFloat(std::string myString) { +bool Console::Utility::isFloat(const std::string& myString) { std::istringstream iss(myString); float f; iss >> std::noskipws >> f; // noskipws considers leading whitespace invalid diff --git a/cocos/base/CCConsole.h b/cocos/base/CCConsole.h index ea18b874036c..f9b66b361846 100644 --- a/cocos/base/CCConsole.h +++ b/cocos/base/CCConsole.h @@ -88,7 +88,7 @@ class CC_DLL Console static std::vector split(const std::string& s, char delim); /** Checks myString is a floating-point type. */ - static bool isFloat(std::string myString); + static bool isFloat(const std::string& myString); /** send a message to console */ static ssize_t sendToConsole(int fd, const void* buffer, size_t length, int flags = 0); diff --git a/cocos/base/ccUTF8.cpp b/cocos/base/ccUTF8.cpp index 8b4f1e94a68d..05b1c36a54bf 100644 --- a/cocos/base/ccUTF8.cpp +++ b/cocos/base/ccUTF8.cpp @@ -228,7 +228,7 @@ std::string getStringUTFCharsJNI(JNIEnv* env, jstring srcjStr, bool* ret) return utf8Str; } -jstring newStringUTFJNI(JNIEnv* env, std::string utf8Str, bool* ret) +jstring newStringUTFJNI(JNIEnv* env, const std::string& utf8Str, bool* ret) { std::u16string utf16Str; bool flag = cocos2d::StringUtils::UTF8ToUTF16(utf8Str, utf16Str); diff --git a/cocos/base/ccUTF8.h b/cocos/base/ccUTF8.h index 4e6a85253302..90cc4d40505e 100644 --- a/cocos/base/ccUTF8.h +++ b/cocos/base/ccUTF8.h @@ -118,7 +118,7 @@ CC_DLL std::string getStringUTFCharsJNI(JNIEnv* env, jstring srcjStr, bool* ret * @param ret True if the conversion succeeds and the ret pointer isn't null * @returns the result of jstring,the jstring need to DeleteLocalRef(jstring); */ -CC_DLL jstring newStringUTFJNI(JNIEnv* env, std::string utf8Str, bool* ret = nullptr); +CC_DLL jstring newStringUTFJNI(JNIEnv* env, const std::string& utf8Str, bool* ret = nullptr); #endif /** diff --git a/cocos/network/HttpClient-android.cpp b/cocos/network/HttpClient-android.cpp index a507ec213f8d..cfd90fe8f49e 100644 --- a/cocos/network/HttpClient-android.cpp +++ b/cocos/network/HttpClient-android.cpp @@ -399,7 +399,7 @@ class HttpURLConnection } private: - void createHttpURLConnection(std::string url) + void createHttpURLConnection(const std::string& url) { JniMethodInfo methodInfo; if (JniHelper::getStaticMethodInfo(methodInfo, diff --git a/cocos/network/HttpConnection-winrt.cpp b/cocos/network/HttpConnection-winrt.cpp index 6e344cc0bc2e..d7fcd81ef366 100644 --- a/cocos/network/HttpConnection-winrt.cpp +++ b/cocos/network/HttpConnection-winrt.cpp @@ -53,7 +53,7 @@ namespace network { } // Get user authentication token (Platform specific approach) - static bool getAuthenticationToken(std::string verb, std::string url, std::string headersXST, std::string bodyXST, std::string& token, std::string& signature) + static bool getAuthenticationToken(const std::string& verb, const std::string& url, const std::string& headersXST, const std::string& bodyXST, std::string& token, std::string& signature) { #if defined(_XBOX_ONE) using namespace Windows::Xbox::System; @@ -565,22 +565,22 @@ namespace network { return _isInitialized = SUCCEEDED(hr); } - bool HttpConnection::open(std::string verb) + bool HttpConnection::open(const std::string& verb) { return open(verb, false, ""); } - bool HttpConnection::open(std::string verb, bool userAuthentication) + bool HttpConnection::open(const std::string& verb, bool userAuthentication) { return open(verb, userAuthentication, ""); } - bool HttpConnection::open(std::string verb, std::string cookieFile) + bool HttpConnection::open(const std::string& verb, const std::string& cookieFile) { return open(verb, false, cookieFile); } - bool HttpConnection::open(std::string verb, bool userAuthentication, std::string cookieFile) + bool HttpConnection::open(const std::string& verb, bool userAuthentication, const std::string& cookieFile) { if (!_isInitialized) { return false; @@ -629,7 +629,7 @@ namespace network { return SUCCEEDED(hr); } - HRESULT HttpConnection::authenticateUser(std::string& verb, std::string& url, std::string& headers) + HRESULT HttpConnection::authenticateUser(const std::string& verb, const std::string& url, const std::string& headers) { HRESULT hr = S_OK; std::string authToken; @@ -654,7 +654,7 @@ namespace network { return hr; } - HRESULT HttpConnection::processCookieFile(std::string& url, std::string& cookieFile) + HRESULT HttpConnection::processCookieFile(const std::string& url, const std::string& cookieFile) { HRESULT hr = S_OK; diff --git a/cocos/network/HttpConnection-winrt.h b/cocos/network/HttpConnection-winrt.h index 0cfe480cb295..e211ad883ab3 100644 --- a/cocos/network/HttpConnection-winrt.h +++ b/cocos/network/HttpConnection-winrt.h @@ -132,10 +132,10 @@ namespace network { ~HttpConnection(); bool init(HttpRequest *pRequest, DWORD timeOutInMs = 0); - bool open(std::string verb); - bool open(std::string verb, bool userAuthentication); - bool open(std::string verb, std::string cookieFile); - bool open(std::string verb, bool userAuthentication, std::string cookieFile); + bool open(const std::string& verb); + bool open(const std::string& verb, bool userAuthentication); + bool open(const std::string& verb, const std::string& cookieFile); + bool open(const std::string& verb, bool userAuthentication, const std::string& cookieFile); bool send(); DWORD getStatusCode(); std::string getErrorMessage(); @@ -144,8 +144,8 @@ namespace network { protected: void cancelRequest(HRESULT hrError); - HRESULT authenticateUser(std::string& verb, std::string& url, std::string& headers); - HRESULT processCookieFile(std::string& url, std::string& cookieFile); + HRESULT authenticateUser(const std::string& verb, const std::string& url, const std::string& headers); + HRESULT processCookieFile(const std::string& url, const std::string& cookieFile); private: bool _isInitialized; diff --git a/cocos/network/HttpRequest.h b/cocos/network/HttpRequest.h index ab61ff927a88..2b972415b392 100644 --- a/cocos/network/HttpRequest.h +++ b/cocos/network/HttpRequest.h @@ -318,7 +318,7 @@ class CC_DLL HttpRequest : public Ref * * @param pHeaders the string vector of custom-defined headers. */ - inline void setHeaders(std::vector pHeaders) + inline void setHeaders(const std::vector& pHeaders) { _headers = pHeaders; } diff --git a/cocos/network/SocketIO.cpp b/cocos/network/SocketIO.cpp index 60f37a207c13..6d086d3f0be7 100644 --- a/cocos/network/SocketIO.cpp +++ b/cocos/network/SocketIO.cpp @@ -76,7 +76,7 @@ class SocketIOPacket std::vector getData()const{ return _args; }; virtual std::string stringify()const; - static SocketIOPacket * createPacketWithType(std::string type, SocketIOVersion version); + static SocketIOPacket * createPacketWithType(const std::string& type, SocketIOVersion version); static SocketIOPacket * createPacketWithTypeIndex(int type, SocketIOVersion version); protected: std::string _pId;//id message @@ -302,7 +302,7 @@ SocketIOPacketV10x::~SocketIOPacketV10x() _endpoint = ""; } -SocketIOPacket * SocketIOPacket::createPacketWithType(std::string type, SocketIOPacket::SocketIOVersion version) +SocketIOPacket * SocketIOPacket::createPacketWithType(const std::string& type, SocketIOPacket::SocketIOVersion version) { SocketIOPacket *ret; switch (version) diff --git a/cocos/platform/ios/CCGLViewImpl-ios.h b/cocos/platform/ios/CCGLViewImpl-ios.h index 83a7607df8ac..6f3eef52a7e5 100644 --- a/cocos/platform/ios/CCGLViewImpl-ios.h +++ b/cocos/platform/ios/CCGLViewImpl-ios.h @@ -48,7 +48,7 @@ class CC_DLL GLViewImpl : public GLView static GLViewImpl* create(const std::string& viewName); /** creates a GLViewImpl with a title name, a rect and the zoom factor */ - static GLViewImpl* createWithRect(const std::string& viewName, Rect rect, float frameZoomFactor = 1.0f); + static GLViewImpl* createWithRect(const std::string& viewName, const Rect& rect, float frameZoomFactor = 1.0f); /** creates a GLViewImpl with a name in fullscreen mode */ static GLViewImpl* createWithFullScreen(const std::string& viewName); @@ -80,7 +80,7 @@ class CC_DLL GLViewImpl : public GLView virtual ~GLViewImpl(); bool initWithEAGLView(void* eaGLView); - bool initWithRect(const std::string& viewName, Rect rect, float frameZoomFactor); + bool initWithRect(const std::string& viewName, const Rect& rect, float frameZoomFactor); bool initWithFullScreen(const std::string& viewName); // the objective-c CCEAGLView instance diff --git a/cocos/platform/ios/CCGLViewImpl-ios.mm b/cocos/platform/ios/CCGLViewImpl-ios.mm index 65a37a00aaf0..d68e213c738b 100644 --- a/cocos/platform/ios/CCGLViewImpl-ios.mm +++ b/cocos/platform/ios/CCGLViewImpl-ios.mm @@ -61,7 +61,7 @@ of this software and associated documentation files (the "Software"), to deal return nullptr; } -GLViewImpl* GLViewImpl::createWithRect(const std::string& viewName, Rect rect, float frameZoomFactor) +GLViewImpl* GLViewImpl::createWithRect(const std::string& viewName, const Rect& rect, float frameZoomFactor) { auto ret = new (std::nothrow) GLViewImpl; if(ret && ret->initWithRect(viewName, rect, frameZoomFactor)) { @@ -130,7 +130,7 @@ of this software and associated documentation files (the "Software"), to deal return true; } -bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float frameZoomFactor) +bool GLViewImpl::initWithRect(const std::string& viewName, const Rect& rect, float frameZoomFactor) { CGRect r = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); convertAttrs(); From 8c9138601c0ec06da53f88cd67242ed7bc6b8abd Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 17 May 2016 16:41:07 +0800 Subject: [PATCH 135/241] make AssetsManagerExTest can connect to the url --- tests/cpp-tests/proj.ios/Info.plist | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/cpp-tests/proj.ios/Info.plist b/tests/cpp-tests/proj.ios/Info.plist index 84b34b2f9004..c8bf001b629b 100644 --- a/tests/cpp-tests/proj.ios/Info.plist +++ b/tests/cpp-tests/proj.ios/Info.plist @@ -8,6 +8,15 @@ NSExceptionDomains + itharbors.com + + NSIncludesSubdomains + + NSTemporaryExceptionAllowsInsecureHTTPLoads + + NSTemporaryExceptionMinimumTLSVersion + TLSv1.1 + sdkbox.com NSIncludesSubdomains From 2d0007365316529f969b68d46ec598e09b6eb178 Mon Sep 17 00:00:00 2001 From: zhangbin Date: Tue, 17 May 2016 17:25:31 +0800 Subject: [PATCH 136/241] Update the reference of submodule cocos2d-console. --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 5e5a8f279c5d..78d6c743c2df 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 5e5a8f279c5df0c98cafd27ffb43ce7e4e6a2082 +Subproject commit 78d6c743c2df425b4774a80d6fee785795617acf From 320ec027f71c58239e5eaadc46920ac39a51af57 Mon Sep 17 00:00:00 2001 From: mogemimi Date: Wed, 18 May 2016 01:49:35 +0900 Subject: [PATCH 137/241] Replace CCAssert macros with CCASSERT --- cocos/platform/CCImage.cpp | 6 +++--- cocos/ui/UIEditBox/UIEditBoxImpl-win32.cpp | 4 ++-- extensions/Particle3D/PU/CCPURibbonTrail.cpp | 22 ++++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cocos/platform/CCImage.cpp b/cocos/platform/CCImage.cpp index 91d0ac06e937..ee977724c668 100644 --- a/cocos/platform/CCImage.cpp +++ b/cocos/platform/CCImage.cpp @@ -844,7 +844,7 @@ bool Image::decodeWithWIC(const unsigned char *data, ssize_t dataLen) _dataLen = img.getImageDataSize(); - CCAssert(_dataLen > 0, "Image: Decompressed data length is invalid"); + CCASSERT(_dataLen > 0, "Image: Decompressed data length is invalid"); _data = new (std::nothrow) unsigned char[_dataLen]; bRet = (img.getImageData(_data, _dataLen) > 0); @@ -1599,7 +1599,7 @@ bool Image::initWithPVRv3Data(const unsigned char * data, ssize_t dataLen) memcpy(_data, static_cast(data) + sizeof(PVRv3TexHeader) + header->metadataLength, _dataLen); _numberOfMipmaps = header->numberOfMipmaps; - CCAssert(_numberOfMipmaps < MIPMAP_MAX, "Image: Maximum number of mimpaps reached. Increase the CC_MIPMAP_MAX value"); + CCASSERT(_numberOfMipmaps < MIPMAP_MAX, "Image: Maximum number of mimpaps reached. Increase the CC_MIPMAP_MAX value"); for (int i = 0; i < _numberOfMipmaps; i++) { @@ -1687,7 +1687,7 @@ bool Image::initWithPVRv3Data(const unsigned char * data, ssize_t dataLen) } dataOffset += packetLength; - CCAssert(dataOffset <= _dataLen, "CCTexurePVR: Invalid length"); + CCASSERT(dataOffset <= _dataLen, "Image: Invalid length"); width = MAX(width >> 1, 1); diff --git a/cocos/ui/UIEditBox/UIEditBoxImpl-win32.cpp b/cocos/ui/UIEditBox/UIEditBoxImpl-win32.cpp index 52742df51d35..07b282ca1cf5 100644 --- a/cocos/ui/UIEditBox/UIEditBoxImpl-win32.cpp +++ b/cocos/ui/UIEditBox/UIEditBoxImpl-win32.cpp @@ -307,7 +307,7 @@ INT_PTR CWin32InputBox::InputBoxEx(WIN32INPUTBOX_PARAM *param, dlgTemplate->y = param->yPos; } - CCAssert(s_win32InputBox == nullptr, "Only one instance of Win32InputBox allowed"); + CCASSERT(s_win32InputBox == nullptr, "Only one instance of Win32InputBox allowed"); s_win32InputBox = new (std::nothrow) CWin32InputBox(param); s_win32InputBox->_returnType = eReturnType; @@ -492,7 +492,7 @@ void CWin32InputBox::InitDialog() break; } - CCAssert(_getMsgHook == NULL, "Windows Message hook already set"); + CCASSERT(_getMsgHook == nullptr, "Windows Message hook already set"); // To make the enter key work, here need a Windows Message hook. // Please refer to https://support.microsoft.com/en-us/kb/187988 diff --git a/extensions/Particle3D/PU/CCPURibbonTrail.cpp b/extensions/Particle3D/PU/CCPURibbonTrail.cpp index 8127a768a283..66188f3506a0 100644 --- a/extensions/Particle3D/PU/CCPURibbonTrail.cpp +++ b/extensions/Particle3D/PU/CCPURibbonTrail.cpp @@ -58,7 +58,7 @@ void PURibbonTrail::addNode(Node* n) { if (_nodeList.size() == _chainCount) { - CCAssert(false, " cannot monitor any more nodes, chain count exceeded"); + CCASSERT(false, " cannot monitor any more nodes, chain count exceeded"); } //if (n->getListener()) @@ -87,7 +87,7 @@ size_t PURibbonTrail::getChainIndexForNode(const Node* n) NodeToChainSegmentMap::const_iterator i = _nodeToSegMap.find(n); if (i == _nodeToSegMap.end()) { - CCAssert(false, "This node is not being tracked"); + CCASSERT(false, "This node is not being tracked"); } return i->second; } @@ -130,7 +130,7 @@ void PURibbonTrail::setMaxChainElements(size_t maxElements) //----------------------------------------------------------------------- void PURibbonTrail::setNumberOfChains(size_t numChains) { - CCAssert(numChains >= _nodeList.size(), "Can't shrink the number of chains less than number of tracking nodes"); + CCASSERT(numChains >= _nodeList.size(), "Can't shrink the number of chains less than number of tracking nodes"); size_t oldChains = getNumberOfChains(); @@ -181,7 +181,7 @@ void PURibbonTrail::setInitialColour(size_t chainIndex, const Vec4& col) //----------------------------------------------------------------------- void PURibbonTrail::setInitialColour(size_t chainIndex, float r, float g, float b, float a) { - CCAssert(chainIndex < _chainCount, "chainIndex out of bounds"); + CCASSERT(chainIndex < _chainCount, "chainIndex out of bounds"); _initialColor[chainIndex].x = r; _initialColor[chainIndex].y = g; _initialColor[chainIndex].z = b; @@ -190,19 +190,19 @@ void PURibbonTrail::setInitialColour(size_t chainIndex, float r, float g, float //----------------------------------------------------------------------- const Vec4& PURibbonTrail::getInitialColour(size_t chainIndex) const { - CCAssert(chainIndex < _chainCount, "chainIndex out of bounds"); + CCASSERT(chainIndex < _chainCount, "chainIndex out of bounds"); return _initialColor[chainIndex]; } //----------------------------------------------------------------------- void PURibbonTrail::setInitialWidth(size_t chainIndex, float width) { - CCAssert(chainIndex < _chainCount, "chainIndex out of bounds"); + CCASSERT(chainIndex < _chainCount, "chainIndex out of bounds"); _initialWidth[chainIndex] = width; } //----------------------------------------------------------------------- float PURibbonTrail::getInitialWidth(size_t chainIndex) const { - CCAssert(chainIndex < _chainCount, "chainIndex out of bounds"); + CCASSERT(chainIndex < _chainCount, "chainIndex out of bounds"); return _initialWidth[chainIndex]; } //----------------------------------------------------------------------- @@ -214,7 +214,7 @@ void PURibbonTrail::setColourChange(size_t chainIndex, const Vec4& valuePerSecon //----------------------------------------------------------------------- void PURibbonTrail::setColourChange(size_t chainIndex, float r, float g, float b, float a) { - CCAssert(chainIndex < _chainCount, "chainIndex out of bounds"); + CCASSERT(chainIndex < _chainCount, "chainIndex out of bounds"); _deltaColor[chainIndex].x = r; _deltaColor[chainIndex].y = g; _deltaColor[chainIndex].z = b; @@ -226,20 +226,20 @@ void PURibbonTrail::setColourChange(size_t chainIndex, float r, float g, float b //----------------------------------------------------------------------- const Vec4& PURibbonTrail::getColourChange(size_t chainIndex) const { - CCAssert(chainIndex < _chainCount, "chainIndex out of bounds"); + CCASSERT(chainIndex < _chainCount, "chainIndex out of bounds"); return _deltaColor[chainIndex]; } //----------------------------------------------------------------------- void PURibbonTrail::setWidthChange(size_t chainIndex, float widthDeltaPerSecond) { - CCAssert(chainIndex < _chainCount, "chainIndex out of bounds"); + CCASSERT(chainIndex < _chainCount, "chainIndex out of bounds"); _deltaWidth[chainIndex] = widthDeltaPerSecond; manageController(); } //----------------------------------------------------------------------- float PURibbonTrail::getWidthChange(size_t chainIndex) const { - CCAssert(chainIndex < _chainCount, "chainIndex out of bounds"); + CCASSERT(chainIndex < _chainCount, "chainIndex out of bounds"); return _deltaWidth[chainIndex]; } From a03c45ce6230871b9c052e3d4cf9d21129f816f4 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 18 May 2016 12:54:16 +0800 Subject: [PATCH 138/241] Update network licenses and reformat --- cocos/network/CCDownloader-apple.h | 14 +- cocos/network/CCDownloader-apple.mm | 63 ++-- cocos/network/CCDownloader-curl.cpp | 184 +++++----- cocos/network/CCDownloader-curl.h | 8 +- cocos/network/CCDownloader.cpp | 27 +- cocos/network/CCDownloader.h | 25 +- cocos/network/CCIDownloaderImpl.h | 11 +- cocos/network/HttpAsynConnection-apple.h | 23 +- cocos/network/HttpAsynConnection-apple.m | 92 ++--- cocos/network/HttpClient-android.cpp | 183 +++++----- cocos/network/HttpClient-apple.mm | 91 +++-- cocos/network/HttpClient.cpp | 415 +++++++++++------------ cocos/network/HttpClient.h | 87 ++--- cocos/network/HttpCookie.cpp | 47 +-- cocos/network/HttpCookie.h | 22 +- cocos/network/HttpRequest.h | 153 +++++---- cocos/network/HttpResponse.h | 108 +++--- cocos/network/SocketIO.cpp | 95 +++--- cocos/network/SocketIO.h | 13 +- cocos/network/WebSocket.cpp | 4 +- cocos/network/WebSocket.h | 20 +- 21 files changed, 847 insertions(+), 838 deletions(-) diff --git a/cocos/network/CCDownloader-apple.h b/cocos/network/CCDownloader-apple.h index 7f59d0c52d13..7c08eb47a940 100644 --- a/cocos/network/CCDownloader-apple.h +++ b/cocos/network/CCDownloader-apple.h @@ -1,18 +1,18 @@ /**************************************************************************** - Copyright (c) 2015 Chukong Technologies Inc. - + Copyright (c) 2015-2016 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 @@ -34,9 +34,9 @@ namespace cocos2d { namespace network public: DownloaderApple(const DownloaderHints& hints); virtual ~DownloaderApple(); - + virtual IDownloadTask *createCoTask(std::shared_ptr& task) override; - + private: void* _impl; }; diff --git a/cocos/network/CCDownloader-apple.mm b/cocos/network/CCDownloader-apple.mm index 8ec7fec24858..e20131f2ee4c 100644 --- a/cocos/network/CCDownloader-apple.mm +++ b/cocos/network/CCDownloader-apple.mm @@ -1,18 +1,18 @@ /**************************************************************************** - Copyright (c) 2015 Chukong Technologies Inc. - + Copyright (c) 2015-2016 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 @@ -79,12 +79,12 @@ -(void)doDestroy; { DLLOG("Construct DownloadTaskApple %p", this); } - + virtual ~DownloadTaskApple() { DLLOG("Destruct DownloadTaskApple %p", this); } - + NSURLSessionDataTask *dataTask; NSURLSessionDownloadTask *downloadTask; }; @@ -96,7 +96,7 @@ -(void)doDestroy; DLLOG("Construct DownloaderApple %p", this); _impl = (__bridge void*)[[DownloaderAppleImpl alloc] init: this hints:hints]; } - + DownloaderApple::~DownloaderApple() { DeclareDownloaderImplVar; @@ -148,7 +148,7 @@ -(int64_t) transferDataToBuffer:(void*)buffer lengthOfBuffer:(int64_t)len { int64_t bytesReceived = 0; int receivedDataObject = 0; - + __block char *p = (char *)buffer; for (NSData* data in _dataArray) { @@ -157,7 +157,7 @@ -(int64_t) transferDataToBuffer:(void*)buffer lengthOfBuffer:(int64_t)len { break; } - + // copy data [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, @@ -167,12 +167,12 @@ -(int64_t) transferDataToBuffer:(void*)buffer lengthOfBuffer:(int64_t)len p += byteRange.length; *stop = NO; }]; - + // accumulate bytesReceived += data.length; ++receivedDataObject; } - + // remove receivedNSDataObject from dataArray [_dataArray removeObjectsInRange:NSMakeRange(0, receivedDataObject)]; self.bytesReceived -= bytesReceived; @@ -196,10 +196,10 @@ - (id)init: (const cocos2d::network::DownloaderApple*)o hints:(const cocos2d::ne // save outer task ref _outer = o; _hints = hints; - + // create task dictionary self.taskDict = [NSMutableDictionary dictionary]; - + // create download session NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; self.downloadSession = [NSURLSession sessionWithConfiguration:defaultConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]]; @@ -281,7 +281,7 @@ -(void)doDestroy for (NSURLSessionDownloadTask *task in enumeratorKey) { DownloadTaskWrapper *wrapper = [self.taskDict objectForKey:task]; - + // no resume support for a data task std::string storagePath = [wrapper get]->storagePath; if(storagePath.length() == 0) { @@ -321,7 +321,7 @@ -(void)doDestroy } } _outer = nullptr; - + [self.downloadSession invalidateAndCancel]; [self release]; } @@ -386,7 +386,7 @@ - (void)URLSession:(NSURLSession *)session task :(NSURLSessionTask *)task // clean wrapper C++ object DownloadTaskWrapper *wrapper = [self.taskDict objectForKey:task]; - + if(_outer) { if(error) @@ -408,7 +408,7 @@ - (void)URLSession:(NSURLSession *)session task :(NSURLSessionTask *)task char buf[buflen]; [wrapper transferDataToBuffer:buf lengthOfBuffer:buflen]; std::vector data(buf, buf + buflen); - + _outer->onTaskFinish(*[wrapper get], cocos2d::network::DownloadTask::ERROR_NO_ERROR, 0, @@ -418,14 +418,14 @@ - (void)URLSession:(NSURLSession *)session task :(NSURLSessionTask *)task else { NSInteger statusCode = ((NSHTTPURLResponse*)task.response).statusCode; - + // Check for error status code if (statusCode >= 400) { std::vector buf; // just a placeholder const char *orignalURL = [task.originalRequest.URL.absoluteString cStringUsingEncoding:NSUTF8StringEncoding]; std::string errorMessage = cocos2d::StringUtils::format("Downloader: Failed to download %s with status code (%d)", orignalURL, (int)statusCode); - + _outer->onTaskFinish(*[wrapper get], cocos2d::network::DownloadTask::ERROR_IMPL_INTERNAL, 0, @@ -487,13 +487,13 @@ - (void)URLSession:(NSURLSession *)session dataTask :(NSURLSessionDataTask *)dat } DownloadTaskWrapper *wrapper = [self.taskDict objectForKey:dataTask]; [wrapper addData:data]; - + std::function transferDataToBuffer = [wrapper](void *buffer, int64_t bufLen)->int64_t { return [wrapper transferDataToBuffer:buffer lengthOfBuffer: bufLen]; }; - + _outer->onTaskProgress(*[wrapper get], wrapper.bytesReceived, wrapper.totalBytesReceived, @@ -528,7 +528,7 @@ - (void)URLSession:(NSURLSession *)session downloadTask :(NSURLSessionDownloadTa { return; } - + // On iOS 9 a response with status code 4xx(Client Error) or 5xx(Server Error) // might end up calling this delegate method, saving the error message to the storage path // and treating this download task as a successful one, so we need to check the status code here @@ -537,7 +537,7 @@ - (void)URLSession:(NSURLSession *)session downloadTask :(NSURLSessionDownloadTa { return; } - + DownloadTaskWrapper *wrapper = [self.taskDict objectForKey:downloadTask]; const char * storagePath = [wrapper get]->storagePath.c_str(); NSString *destPath = [NSString stringWithUTF8String:storagePath]; @@ -550,7 +550,7 @@ - (void)URLSession:(NSURLSession *)session downloadTask :(NSURLSessionDownloadTa { break; } - + if ('/' == [destPath characterAtIndex:0]) { // absolute path, need add prefix @@ -558,21 +558,21 @@ - (void)URLSession:(NSURLSession *)session downloadTask :(NSURLSessionDownloadTa destURL = [NSURL URLWithString:[prefix stringByAppendingString: destPath]]; break; } - + // relative path, store to user domain default NSArray *URLs = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; NSURL *documentsDirectory = URLs[0]; destURL = [documentsDirectory URLByAppendingPathComponent:destPath]; } while (0); - + // Make sure we overwrite anything that's already there [fileManager removeItemAtURL:destURL error:NULL]; - + // copy file to dest location int errorCode = cocos2d::network::DownloadTask::ERROR_NO_ERROR; int errorCodeInternal = 0; std::string errorString; - + NSError *error = nil; if ([fileManager copyItemAtURL:location toURL:destURL error:&error]) { @@ -611,9 +611,9 @@ - (void)URLSession:(NSURLSession *)session downloadTask :(NSURLSessionDownloadTa { return; } - + DownloadTaskWrapper *wrapper = [self.taskDict objectForKey:downloadTask]; - + std::function transferDataToBuffer; // just a placeholder _outer->onTaskProgress(*[wrapper get], bytesWritten, totalBytesWritten, totalBytesExpectedToWrite, transferDataToBuffer); } @@ -633,3 +633,4 @@ - (void)URLSession:(NSURLSession *)session downloadTask :(NSURLSessionDownloadTa } @end + diff --git a/cocos/network/CCDownloader-curl.cpp b/cocos/network/CCDownloader-curl.cpp index 248e70686c80..61218485dc88 100644 --- a/cocos/network/CCDownloader-curl.cpp +++ b/cocos/network/CCDownloader-curl.cpp @@ -1,5 +1,5 @@ /**************************************************************************** - Copyright (c) 2015 Chukong Technologies Inc. + Copyright (c) 2015-2016 Chukong Technologies Inc. http://www.cocos2d-x.org @@ -40,20 +40,20 @@ namespace cocos2d { namespace network { using namespace std; - + //////////////////////////////////////////////////////////////////////////////// // Implementation DownloadTaskCURL class DownloadTaskCURL : public IDownloadTask { static int _sSerialId; - + // if more than one task write to one file, cause file broken // so use a set to check this situation static set _sStoragePathSet; public: int serialId; - + DownloadTaskCURL() : serialId(_sSerialId++) , _fp(nullptr) @@ -61,7 +61,7 @@ namespace cocos2d { namespace network { _initInternal(); DLLOG("Construct DownloadTaskCURL %p", this); } - + virtual ~DownloadTaskCURL() { // if task destroyed unnormally, we should release WritenFileName stored in set. @@ -77,7 +77,7 @@ namespace cocos2d { namespace network { } DLLOG("Destruct DownloadTaskCURL %p", this); } - + bool init(const string& filename, const string& tempSuffix) { if (0 == filename.length()) @@ -86,12 +86,12 @@ namespace cocos2d { namespace network { _buf.reserve(CURL_MAX_WRITE_SIZE); return true; } - + // file task _fileName = filename; _tempFileName = filename; _tempFileName.append(tempSuffix); - + if (_sStoragePathSet.end() != _sStoragePathSet.find(_tempFileName)) { // there is another task uses this storage path @@ -102,7 +102,7 @@ namespace cocos2d { namespace network { return false; } _sStoragePathSet.insert(_tempFileName); - + // open temp file handle for write bool ret = false; do @@ -116,7 +116,7 @@ namespace cocos2d { namespace network { _errDescription = "Can't find dirname in storagePath."; break; } - + // ensure directory is exist auto util = FileUtils::getInstance(); dir = _tempFileName.substr(0, found+1); @@ -152,7 +152,7 @@ namespace cocos2d { namespace network { lock_guard lock(_mutex); _initInternal(); } - + void setErrorProc(int code, int codeInternal, const char *desc) { lock_guard lock(_mutex); @@ -160,7 +160,7 @@ namespace cocos2d { namespace network { _errCodeInternal = codeInternal; _errDescription = desc; } - + size_t writeDataProc(unsigned char *buffer, size_t size, size_t count) { lock_guard lock(_mutex); @@ -187,35 +187,35 @@ namespace cocos2d { namespace network { } return ret; } - + private: friend class DownloaderCURL; - + // for lock object instance mutex _mutex; - + // header info bool _acceptRanges; bool _headerAchieved; int64_t _totalBytesExpected; - + string _header; // temp buffer for receive header string, only used in thread proc - + // progress int64_t _bytesReceived; int64_t _totalBytesReceived; - + // error int _errCode; int _errCodeInternal; string _errDescription; - + // for saving data string _fileName; string _tempFileName; vector _buf; FILE* _fp; - + void _initInternal() { _acceptRanges = (false); @@ -231,9 +231,9 @@ namespace cocos2d { namespace network { }; int DownloadTaskCURL::_sSerialId; set DownloadTaskCURL::_sStoragePathSet; - + typedef pair< shared_ptr, DownloadTaskCURL *> TaskWrapper; - + //////////////////////////////////////////////////////////////////////////////// // Implementation DownloaderCURL::Impl // This class shared by DownloaderCURL and work thread. @@ -241,18 +241,18 @@ namespace cocos2d { namespace network { { public: DownloaderHints hints; - + Impl() // : _thread(nullptr) { DLLOG("Construct DownloaderCURL::Impl %p", this); } - + ~Impl() { DLLOG("Destruct DownloaderCURL::Impl %p %d", this, _thread.joinable()); } - + void addTask(std::shared_ptr task, DownloadTaskCURL* coTask) { if (DownloadTask::ERROR_NO_ERROR == coTask->_errCode) @@ -266,7 +266,7 @@ namespace cocos2d { namespace network { _finishedQueue.push_back(make_pair(task, coTask)); } } - + void run() { lock_guard lock(_threadMutex); @@ -276,7 +276,7 @@ namespace cocos2d { namespace network { _thread.swap(newThread); } } - + void stop() { lock_guard lock(_threadMutex); @@ -285,20 +285,20 @@ namespace cocos2d { namespace network { _thread.detach(); } } - + bool stoped() { lock_guard lock(_threadMutex); return false == _thread.joinable() ? true : false; } - + void getProcessTasks(vector& outList) { lock_guard lock(_processMutex); outList.reserve(_processSet.size()); outList.insert(outList.end(), _processSet.begin(), _processSet.end()); } - + void getFinishedTasks(vector& outList) { lock_guard lock(_finishedMutex); @@ -316,7 +316,7 @@ namespace cocos2d { namespace network { coTask._header.append((const char *)buffer, strLen); return strLen; } - + static size_t _outputDataCallbackProc(void *buffer, size_t size, size_t count, void *userdata) { // DLLOG(" _outputDataCallbackProc: size(%ld), count(%ld)", size, count); @@ -333,10 +333,10 @@ namespace cocos2d { namespace network { { const DownloadTask& task = *wrapper.first; const DownloadTaskCURL* coTask = wrapper.second; - + // set url curl_easy_setopt(handle, CURLOPT_URL, task.requestURL.c_str()); - + // set write func if (forContent) { @@ -347,14 +347,14 @@ namespace cocos2d { namespace network { curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, DownloaderCURL::Impl::_outputHeaderCallbackProc); } curl_easy_setopt(handle, CURLOPT_WRITEDATA, coTask); - + curl_easy_setopt(handle, CURLOPT_NOPROGRESS, true); // curl_easy_setopt(handle, CURLOPT_XFERINFOFUNCTION, DownloaderCURL::Impl::_progressCallbackProc); // curl_easy_setopt(handle, CURLOPT_XFERINFODATA, coTask); curl_easy_setopt(handle, CURLOPT_FAILONERROR, true); curl_easy_setopt(handle, CURLOPT_NOSIGNAL, 1L); - + if (forContent) { /** if server acceptRanges and local has part of file, we continue to download **/ @@ -378,12 +378,12 @@ namespace cocos2d { namespace network { { curl_easy_setopt(handle, CURLOPT_CONNECTTIMEOUT, hints.timeoutInSeconds); } - + static const long LOW_SPEED_LIMIT = 1; static const long LOW_SPEED_TIME = 5; curl_easy_setopt(handle, CURLOPT_LOW_SPEED_LIMIT, LOW_SPEED_LIMIT); curl_easy_setopt(handle, CURLOPT_LOW_SPEED_TIME, LOW_SPEED_TIME); - + static const int MAX_REDIRS = 2; if (MAX_REDIRS) { @@ -391,7 +391,7 @@ namespace cocos2d { namespace network { curl_easy_setopt(handle, CURLOPT_MAXREDIRS, MAX_REDIRS); } } - + // get header info, if success set handle to content download state bool _getHeaderInfoProc(CURL *handle, TaskWrapper& wrapper) { @@ -414,7 +414,7 @@ namespace cocos2d { namespace network { , httpResponseCode); coTask.setErrorProc(DownloadTask::ERROR_IMPL_INTERNAL, CURLE_OK, buf); } - + // curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &effectiveUrl); // curl_easy_getinfo(handle, CURLINFO_CONTENT_TYPE, &contentType); double contentLen = 0; @@ -423,9 +423,9 @@ namespace cocos2d { namespace network { { break; } - + bool acceptRanges = (string::npos != coTask._header.find("Accept-Ranges")) ? true : false; - + // get current file size int64_t fileSize = 0; if (acceptRanges && coTask._tempFileName.length()) @@ -443,14 +443,14 @@ namespace cocos2d { namespace network { } coTask._headerAchieved = true; } while (0); - + if (CURLE_OK != rc) { coTask.setErrorProc(DownloadTask::ERROR_IMPL_INTERNAL, rc, curl_easy_strerror(rc)); } return coTask._headerAchieved; } - + void _threadProc() { DLLOG("++++DownloaderCURL::Impl::_threadProc begin %p", this); @@ -464,7 +464,7 @@ namespace cocos2d { namespace network { int runningHandles = 0; CURLMcode mcode = CURLM_OK; int rc = 0; // select return code - + do { // check the thread should exit or not @@ -482,28 +482,28 @@ namespace cocos2d { namespace network { // get timeout setting from multi-handle long timeoutMS = -1; curl_multi_timeout(curlmHandle, &timeoutMS); - + if(timeoutMS < 0) { timeoutMS = 1000; } - + /* get file descriptors from the transfers */ fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd = -1; - + FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); - + mcode = curl_multi_fdset(curlmHandle, &fdread, &fdwrite, &fdexcep, &maxfd); if (CURLM_OK != mcode) { break; } - + // do wait action if(maxfd == -1) { @@ -513,19 +513,19 @@ namespace cocos2d { namespace network { else { struct timeval timeout; - + timeout.tv_sec = timeoutMS / 1000; timeout.tv_usec = (timeoutMS % 1000) * 1000; - + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); } - + if (rc < 0) { DLLOG(" _threadProc: select return unexpect code: %d", rc); } } - + if (coTaskMap.size()) { mcode = CURLM_CALL_MULTI_PERFORM; @@ -537,7 +537,7 @@ namespace cocos2d { namespace network { { break; } - + struct CURLMsg *m; do { int msgq = 0; @@ -548,7 +548,7 @@ namespace cocos2d { namespace network { CURLcode errCode = m->data.result; TaskWrapper wrapper = coTaskMap[curlHandle]; - + // remove from multi-handle curl_multi_remove_handle(curlmHandle, curlHandle); bool reinited = false; @@ -559,13 +559,13 @@ namespace cocos2d { namespace network { wrapper.second->setErrorProc(DownloadTask::ERROR_IMPL_INTERNAL, errCode, curl_easy_strerror(errCode)); break; } - + // if the task is content download task, cleanup the handle if (wrapper.second->_headerAchieved) { break; } - + // the task is get header task // first, we get info from response if (false == _getHeaderInfoProc(curlHandle, wrapper)) @@ -573,7 +573,7 @@ namespace cocos2d { namespace network { // the error info has been set in _getHeaderInfoProc break; } - + // after get header info success // wrapper.second->_totalBytesReceived inited by local file size // if the local file size equal with the content size from header, the file has downloaded finish @@ -595,17 +595,17 @@ namespace cocos2d { namespace network { } reinited = true; } while (0); - + if (reinited) { continue; } curl_easy_cleanup(curlHandle); DLLOG(" _threadProc task clean cur handle :%p with errCode:%d", curlHandle, errCode); - + // remove from coTaskMap coTaskMap.erase(curlHandle); - + // remove from _processSet { lock_guard lock(_processMutex); @@ -613,7 +613,7 @@ namespace cocos2d { namespace network { _processSet.erase(wrapper); } } - + // add to finishedQueue { lock_guard lock(_finishedMutex); @@ -622,7 +622,7 @@ namespace cocos2d { namespace network { } } while(m); } - + // process tasks in _requestList while (0 == countOfMaxProcessingTasks || coTaskMap.size() < countOfMaxProcessingTasks) { @@ -636,18 +636,18 @@ namespace cocos2d { namespace network { _requestQueue.pop_front(); } } - + // if request queue is empty, the wrapper.first is nullptr if (! wrapper.first) { break; } - + wrapper.second->initProc(); - + // create curl handle from task and add into curl multi handle CURL* curlHandle = curl_easy_init(); - + if (nullptr == curlHandle) { wrapper.second->setErrorProc(DownloadTask::ERROR_IMPL_INTERNAL, 0, "Alloc curl handle failed."); @@ -655,10 +655,10 @@ namespace cocos2d { namespace network { _finishedQueue.push_back(wrapper); continue; } - + // init curl handle for get header info _initCurlHandleProc(curlHandle, wrapper); - + // add curl handle to process list mcode = curl_multi_add_handle(curlmHandle, curlHandle); if (CURLM_OK != mcode) @@ -668,30 +668,30 @@ namespace cocos2d { namespace network { _finishedQueue.push_back(wrapper); continue; } - + DLLOG(" _threadProc task create curl handle:%p", curlHandle); coTaskMap[curlHandle] = wrapper; lock_guard lock(_processMutex); _processSet.insert(wrapper); } } while (coTaskMap.size()); - + curl_multi_cleanup(curlmHandle); this->stop(); DLLOG("----DownloaderCURL::Impl::_threadProc end"); } - + thread _thread; deque _requestQueue; set _processSet; deque _finishedQueue; - + mutex _threadMutex; mutex _requestMutex; mutex _processMutex; mutex _finishedMutex; }; - + //////////////////////////////////////////////////////////////////////////////// // Implementation DownloaderCURL @@ -703,7 +703,7 @@ namespace cocos2d { namespace network { _impl->hints = hints; _scheduler = Director::getInstance()->getScheduler(); _scheduler->retain(); - + _transferDataToBuffer = [this](void *buf, int64_t len)->int64_t { DownloadTaskCURL& coTask = *_currTask; @@ -712,37 +712,37 @@ namespace cocos2d { namespace network { { return 0; } - + memcpy(buf, coTask._buf.data(), dataLen); coTask._buf.resize(0); return dataLen; }; - + char key[128]; sprintf(key, "DownloaderCURL(%p)", this); _schedulerKey = key; - + _scheduler->schedule(bind(&DownloaderCURL::_onSchedule, this, placeholders::_1), this, 0.1f, true, _schedulerKey); } - + DownloaderCURL::~DownloaderCURL() { _scheduler->unschedule(_schedulerKey, this); _scheduler->release(); - + _impl->stop(); DLLOG("Destruct DownloaderCURL %p", this); } - + IDownloadTask *DownloaderCURL::createCoTask(std::shared_ptr& task) { DownloadTaskCURL *coTask = new (std::nothrow) DownloadTaskCURL; coTask->init(task->storagePath, _impl->hints.tempFileNameSuffix); - + DLLOG(" DownloaderCURL: createTask: Id(%d)", coTask->serialId); _impl->addTask(task, coTask); @@ -754,14 +754,14 @@ namespace cocos2d { namespace network { void DownloaderCURL::_onSchedule(float) { vector tasks; - + // update processing tasks _impl->getProcessTasks(tasks); for (auto& wrapper : tasks) { const DownloadTask& task = *wrapper.first; DownloadTaskCURL& coTask = *wrapper.second; - + lock_guard lock(coTask._mutex); if (coTask._bytesReceived) { @@ -776,10 +776,9 @@ namespace cocos2d { namespace network { } } tasks.resize(0); - + // update finished tasks _impl->getFinishedTasks(tasks); - if (_impl->stoped()) { _scheduler->pauseTarget(this); @@ -789,7 +788,7 @@ namespace cocos2d { namespace network { { const DownloadTask& task = *wrapper.first; DownloadTaskCURL& coTask = *wrapper.second; - + // if there is bytesReceived, call progress update first if (coTask._bytesReceived) { @@ -802,7 +801,7 @@ namespace cocos2d { namespace network { coTask._bytesReceived = 0; _currTask = nullptr; } - + // if file task, close file handle and rename file if needed if (coTask._fp) { @@ -814,7 +813,7 @@ namespace cocos2d { namespace network { { break; } - + auto util = FileUtils::getInstance(); // if file already exist, remove it if (util->isFileExist(coTask._fileName)) @@ -828,7 +827,7 @@ namespace cocos2d { namespace network { break; } } - + // rename file if (util->renameFile(coTask._tempFileName, coTask._fileName)) { @@ -844,12 +843,13 @@ namespace cocos2d { namespace network { coTask._errDescription.append(" to: "); coTask._errDescription.append(coTask._fileName); } while (0); - + } // needn't lock coTask here, because tasks has removed form _impl onTaskFinish(task, coTask._errCode, coTask._errCodeInternal, coTask._errDescription, coTask._buf); DLLOG(" DownloaderCURL: finish Task: Id(%d)", coTask.serialId); } } - + }} // namespace cocos2d::network + diff --git a/cocos/network/CCDownloader-curl.h b/cocos/network/CCDownloader-curl.h index 6e877ba6a1cd..4cfe5e3dda86 100644 --- a/cocos/network/CCDownloader-curl.h +++ b/cocos/network/CCDownloader-curl.h @@ -1,5 +1,5 @@ /**************************************************************************** - Copyright (c) 2015 Chukong Technologies Inc. + Copyright (c) 2015-2016 Chukong Technologies Inc. http://www.cocos2d-x.org @@ -34,7 +34,7 @@ namespace cocos2d { namespace network { class DownloadTaskCURL; class DownloaderHints; - + class DownloaderCURL : public IDownloaderImpl { public: @@ -46,11 +46,11 @@ namespace cocos2d { namespace network protected: class Impl; std::shared_ptr _impl; - + // for transfer data on schedule DownloadTaskCURL* _currTask; // temp ref std::function _transferDataToBuffer; - + // scheduler for update processing and finished task in main schedule void _onSchedule(float); std::string _schedulerKey; diff --git a/cocos/network/CCDownloader.cpp b/cocos/network/CCDownloader.cpp index 105b0cfd28ab..bce110f4b3fb 100644 --- a/cocos/network/CCDownloader.cpp +++ b/cocos/network/CCDownloader.cpp @@ -1,18 +1,18 @@ /**************************************************************************** - Copyright (c) 2013 cocos2d-x.org - + Copyright (c) 2015-2016 cocos2d-x.org + 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 @@ -54,7 +54,7 @@ namespace cocos2d { namespace network { { DLLOG("Construct DownloadTask %p", this); } - + DownloadTask::~DownloadTask() { DLLOG("Destruct DownloadTask %p", this); @@ -72,7 +72,7 @@ namespace cocos2d { namespace network { }; new(this)Downloader(hints); } - + Downloader::Downloader(const DownloaderHints& hints) { DLLOG("Construct Downloader %p", this); @@ -88,7 +88,7 @@ namespace cocos2d { namespace network { onTaskProgress(task, bytesReceived, totalBytesReceived, totalBytesExpected); } }; - + _impl->onTaskFinish = [this](const DownloadTask& task, int errorCode, int errorCodeInternal, @@ -122,12 +122,12 @@ namespace cocos2d { namespace network { } }; } - + Downloader::~Downloader() { DLLOG("Destruct Downloader %p", this); } - + std::shared_ptr Downloader::createDownloadDataTask(const std::string& srcUrl, const std::string& identifier/* = ""*/) { DownloadTask *task_ = new (std::nothrow) DownloadTask(); @@ -147,10 +147,10 @@ namespace cocos2d { namespace network { } task_->_coTask.reset(_impl->createCoTask(task)); } while (0); - + return task; } - + std::shared_ptr Downloader::createDownloadFileTask(const std::string& srcUrl, const std::string& storagePath, const std::string& identifier/* = ""*/) @@ -176,7 +176,7 @@ namespace cocos2d { namespace network { return task; } - + //std::string Downloader::getFileNameFromUrl(const std::string& srcUrl) //{ // // Find file name and file extension @@ -188,3 +188,4 @@ namespace cocos2d { namespace network { //} }} // namespace cocos2d::network + diff --git a/cocos/network/CCDownloader.h b/cocos/network/CCDownloader.h index 8caa88b4b824..41730421b847 100644 --- a/cocos/network/CCDownloader.h +++ b/cocos/network/CCDownloader.h @@ -1,5 +1,5 @@ /**************************************************************************** - Copyright (c) 2013 cocos2d-x.org + Copyright (c) 2015-2016 cocos2d-x.org http://www.cocos2d-x.org @@ -36,7 +36,7 @@ namespace cocos2d { namespace network { class IDownloadTask; class IDownloaderImpl; class Downloader; - + class CC_DLL DownloadTask final { public: @@ -44,19 +44,19 @@ namespace cocos2d { namespace network { const static int ERROR_INVALID_PARAMS = -1; const static int ERROR_FILE_OP_FAILED = -2; const static int ERROR_IMPL_INTERNAL = -3; - + std::string identifier; std::string requestURL; std::string storagePath; DownloadTask(); virtual ~DownloadTask(); - + private: friend class Downloader; std::unique_ptr _coTask; }; - + class CC_DLL DownloaderHints { public: @@ -64,35 +64,36 @@ namespace cocos2d { namespace network { uint32_t timeoutInSeconds; std::string tempFileNameSuffix; }; - + class CC_DLL Downloader final { public: Downloader(); Downloader(const DownloaderHints& hints); ~Downloader(); - + std::function& data)> onDataTaskSuccess; std::function onFileTaskSuccess; - + std::function onTaskProgress; - + std::function onTaskError; - + std::shared_ptr createDownloadDataTask(const std::string& srcUrl, const std::string& identifier = ""); - + std::shared_ptr createDownloadFileTask(const std::string& srcUrl, const std::string& storagePath, const std::string& identifier = ""); - + private: std::unique_ptr _impl; }; }} // namespace cocos2d::network + diff --git a/cocos/network/CCIDownloaderImpl.h b/cocos/network/CCIDownloaderImpl.h index ede11b14e2db..82a9465aa2c6 100644 --- a/cocos/network/CCIDownloaderImpl.h +++ b/cocos/network/CCIDownloaderImpl.h @@ -1,5 +1,5 @@ /**************************************************************************** -Copyright (c) 2015 Chukong Technologies Inc. +Copyright (c) 2015-2016 Chukong Technologies Inc. http://www.cocos2d-x.org @@ -40,7 +40,7 @@ THE SOFTWARE. namespace cocos2d { namespace network { class DownloadTask; - + class CC_DLL IDownloadTask { public: @@ -51,20 +51,21 @@ namespace cocos2d { namespace network { public: virtual ~IDownloaderImpl(){} - + std::function& transferDataToBuffer)> onTaskProgress; - + std::function& data)> onTaskFinish; - + virtual IDownloadTask *createCoTask(std::shared_ptr& task) = 0; }; }} // namespace cocos2d::network + diff --git a/cocos/network/HttpAsynConnection-apple.h b/cocos/network/HttpAsynConnection-apple.h index 3995cf2c0948..df370a91e98d 100644 --- a/cocos/network/HttpAsynConnection-apple.h +++ b/cocos/network/HttpAsynConnection-apple.h @@ -1,18 +1,18 @@ /**************************************************************************** - Copyright (c) 2013-2015 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -34,18 +34,6 @@ /// @cond @interface HttpAsynConnection : NSObject { - NSString *srcURL; - NSString *sslFile; - NSDictionary *responseHeader; - NSMutableData *responseData; - NSInteger getDataTime; - NSInteger responseCode; - NSString *statusString; - NSError *responseError; - NSError *connError; - NSURLConnection *conn; - bool finish; - NSRunLoop *runLoop; } // The original URL to download. Due to redirects the actual content may come from another URL @@ -80,3 +68,4 @@ /// @endcond #endif //__HTTPASYNCONNECTION_H__ + diff --git a/cocos/network/HttpAsynConnection-apple.m b/cocos/network/HttpAsynConnection-apple.m index 0d926c0a0fc8..a5cd41868b7d 100644 --- a/cocos/network/HttpAsynConnection-apple.m +++ b/cocos/network/HttpAsynConnection-apple.m @@ -1,18 +1,18 @@ /**************************************************************************** - Copyright (c) 2013-2014 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -25,7 +25,7 @@ of this software and associated documentation files (the "Software"), to deal #include "platform/CCPlatformConfig.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) -#import "network/HttpAsynConnection-apple.h" +#import "HttpAsynConnection-apple.h" @interface HttpAsynConnection () @@ -35,18 +35,18 @@ @interface HttpAsynConnection () @implementation HttpAsynConnection -@synthesize srcURL = srcURL; -@synthesize sslFile = sslFile; -@synthesize responseHeader = responseHeader; -@synthesize responseData = responseData; -@synthesize getDataTime = getDataTime; -@synthesize responseCode = responseCode; -@synthesize statusString = statusString; -@synthesize responseError = responseError; -@synthesize connError = connError; -@synthesize conn = conn; -@synthesize finish = finish; -@synthesize runLoop = runLoop; +@synthesize srcURL; +@synthesize sslFile; +@synthesize responseHeader; +@synthesize responseData; +@synthesize getDataTime; +@synthesize responseCode; +@synthesize statusString; +@synthesize responseError; +@synthesize connError; +@synthesize conn; +@synthesize finish; +@synthesize runLoop; - (void)dealloc { @@ -58,7 +58,7 @@ - (void)dealloc [conn release]; [runLoop release]; [connError release]; - + [super dealloc]; } @@ -67,7 +67,7 @@ - (void) startRequest:(NSURLRequest *)request #ifdef COCOS2D_DEBUG NSLog(@"Starting to load %@", srcURL); #endif - + finish = false; self.responseData = [NSMutableData data]; @@ -75,31 +75,31 @@ - (void) startRequest:(NSURLRequest *)request self.responseError = nil; self.connError = nil; - + // create the connection with the target request and this class as the delegate self.conn = [[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO] autorelease]; - + [self.conn scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; - + // start the connection [self.conn start]; } #pragma mark NSURLConnectionDelegate methods /** - * This delegate method is called when the NSURLConnection connects to the server. It contains the + * This delegate method is called when the NSURLConnection connects to the server. It contains the * NSURLResponse object with the headers returned by the server. This method may be called multiple times. * Therefore, it is important to reset the data on each call. Do not assume that it is the first call * of this method. **/ -- (void) connection:(NSURLConnection *)connection +- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { #ifdef COCOS2D_DEBUG NSLog(@"Received response from request to url %@", srcURL); #endif - + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; //NSLog(@"All headers = %@", [httpResponse allHeaderFields]); self.responseHeader = [httpResponse allHeaderFields]; @@ -108,7 +108,7 @@ - (void) connection:(NSURLConnection *)connection self.statusString = [NSHTTPURLResponse localizedStringForStatusCode:responseCode]; if(responseCode == 200) self.statusString = @"OK"; - + /*The individual values of the numeric status codes defined for HTTP/1.1 | "200" ; OK | "201" ; Created @@ -122,17 +122,17 @@ - (void) connection:(NSURLConnection *)connection {// something went wrong, abort the whole thing self.responseError = [NSError errorWithDomain:@"CCBackendDomain" code:responseCode - userInfo:@{NSLocalizedDescriptionKey: @"Bad HTTP Response Code"}]; + userInfo:@{NSLocalizedDescriptionKey: @"Bad HTTP Response Code"}]; } - + [responseData setLength:0]; } /** * This delegate method is called for each chunk of data received from the server. The chunk size - * is dependent on the network type and the server configuration. + * is dependent on the network type and the server configuration. */ -- (void)connection:(NSURLConnection *)connection +- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { //NSLog(@"get some data"); @@ -144,17 +144,17 @@ - (void)connection:(NSURLConnection *)connection * This delegate method is called if the connection cannot be established to the server. * The error object will have a description of the error **/ -- (void)connection:(NSURLConnection *)connection +- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { //NSLog(@"Load failed with error %@", [error localizedDescription]); self.connError = error; - + finish = true; } /** - * This delegate method is called when the data load is complete. The delegate will be released + * This delegate method is called when the data load is complete. The delegate will be released * following this call **/ - (void)connectionDidFinishLoading:(NSURLConnection *)connection @@ -172,42 +172,45 @@ - (BOOL) shouldTrustProtectionSpace:(NSURLProtectionSpace*)protectionSpace NSData *certData = [[NSData alloc] initWithContentsOfFile:certPath]; CFDataRef certDataRef = (CFDataRef)certData; SecCertificateRef cert = SecCertificateCreateWithData(NULL, certDataRef); - + //Establish a chain of trust anchored on our bundled certificate CFArrayRef certArrayRef = CFArrayCreate(NULL, (void*)&cert, 1, NULL); SecTrustRef serverTrust = protectionSpace.serverTrust; SecTrustSetAnchorCertificates(serverTrust, certArrayRef); - + //Verify that trust SecTrustResultType trustResult; SecTrustEvaluate(serverTrust, &trustResult); - + if(trustResult == kSecTrustResultRecoverableTrustFailure) { CFDataRef errDataRef = SecTrustCopyExceptions(serverTrust); SecTrustSetExceptions(serverTrust, errDataRef); SecTrustEvaluate(serverTrust, &trustResult); - [(id)errDataRef release]; + CFRelease(errDataRef); } [certData release]; - [(id)certArrayRef release]; - [(id)certArrayRef release]; + if (cert) + CFRelease(cert); + if (certArrayRef) + CFRelease(certArrayRef); + //Did our custom trust chain evaluate successfully? - return trustResult = kSecTrustResultUnspecified || trustResult == kSecTrustResultProceed; + return trustResult = kSecTrustResultUnspecified || trustResult == kSecTrustResultProceed; } - (void) connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { id sender = challenge.sender; NSURLProtectionSpace *protectionSpace = challenge.protectionSpace; - + //Should server trust client? if([self shouldTrustProtectionSpace:protectionSpace]) { SecTrustRef trust = [protectionSpace serverTrust]; -// +// // SecCertificateRef certificate = SecTrustGetCertificateAtIndex(trust, 0); -// +// // NSData *serverCertificateData = (NSData*)SecCertificateCopyData(certificate); // NSString *serverCertificateDataHash = [[serverCertificateData base64EncodedString] ] NSURLCredential *credential = [NSURLCredential credentialForTrust:trust]; @@ -222,3 +225,4 @@ - (void) connection:(NSURLConnection *)connection willSendRequestForAuthenticati @end #endif // #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + diff --git a/cocos/network/HttpClient-android.cpp b/cocos/network/HttpClient-android.cpp index 1d5d50025945..3467bcd14fda 100644 --- a/cocos/network/HttpClient-android.cpp +++ b/cocos/network/HttpClient-android.cpp @@ -1,20 +1,20 @@ /**************************************************************************** Copyright (c) 2012 greathqy Copyright (c) 2012 cocos2d-x.org - Copyright (c) 2013-2014 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -27,7 +27,7 @@ #include "platform/CCPlatformConfig.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) -#include "network/HttpClient.h" +#include "HttpClient.h" #include #include @@ -39,18 +39,18 @@ #include "platform/android/jni/JniHelper.h" #include "base/ccUTF8.h" - + NS_CC_BEGIN namespace network { - + typedef std::vector HttpRequestHeaders; typedef HttpRequestHeaders::iterator HttpRequestHeadersIter; typedef std::vector HttpCookies; typedef HttpCookies::iterator HttpCookiesIter; static HttpClient* _httpClient = nullptr; // pointer to singleton - + struct CookiesInfo { @@ -70,7 +70,7 @@ static size_t writeData(void* buffer, size_t sizes, HttpResponse* response) recvBuffer->clear(); recvBuffer->insert(recvBuffer->end(), (char*)buffer, ((char*)buffer) + sizes); return sizes; -} +} //static size_t writeHeaderData(void *ptr, size_t size, size_t nmemb, void *stream) size_t writeHeaderData(void* buffer, size_t sizes,HttpResponse* response) @@ -102,7 +102,7 @@ class HttpURLConnection JniHelper::getEnv()->DeleteGlobalRef(_httpURLConnection); } } - + void setRequestMethod(const char* method) { _requestmethod = method; @@ -120,7 +120,7 @@ class HttpURLConnection methodInfo.env->DeleteLocalRef(methodInfo.classID); } } - + bool init(HttpRequest* request) { createHttpURLConnection(request->getUrl()); @@ -136,7 +136,7 @@ class HttpURLConnection for (HttpRequestHeadersIter it = headers.begin(); it != headers.end(); ++it) { std::string val = *it; - + int len = val.length(); int pos = val.find(':'); if (-1 == pos || pos >= len) @@ -148,12 +148,12 @@ class HttpURLConnection addRequestHeader(str1.c_str(), str2.c_str()); } } - + addCookiesForRequestHeader(); - + return true; } - + int connect() { int suc = 0; @@ -167,10 +167,10 @@ class HttpURLConnection methodInfo.classID, methodInfo.methodID, _httpURLConnection); methodInfo.env->DeleteLocalRef(methodInfo.classID); } - + return suc; } - + void disconnect() { JniMethodInfo methodInfo; @@ -184,7 +184,7 @@ class HttpURLConnection methodInfo.env->DeleteLocalRef(methodInfo.classID); } } - + int getResponseCode() { int responseCode = 0; @@ -198,10 +198,10 @@ class HttpURLConnection methodInfo.classID, methodInfo.methodID, _httpURLConnection); methodInfo.env->DeleteLocalRef(methodInfo.classID); } - + return responseCode; } - + char* getResponseMessage() { char* message = nullptr; @@ -220,10 +220,10 @@ class HttpURLConnection } methodInfo.env->DeleteLocalRef(methodInfo.classID); } - + return message; } - + void sendRequest(HttpRequest* request) { JniMethodInfo methodInfo; @@ -232,7 +232,7 @@ class HttpURLConnection "sendRequest", "(Ljava/net/HttpURLConnection;[B)V")) { - + jbyteArray bytearray; ssize_t dataSize = request->getRequestDataSize(); bytearray = methodInfo.env->NewByteArray(dataSize); @@ -243,33 +243,33 @@ class HttpURLConnection methodInfo.env->DeleteLocalRef(methodInfo.classID); } } - + size_t saveResponseCookies(const char* responseCookies, size_t count) { if (nullptr == responseCookies || strlen(responseCookies) == 0 || count == 0) { return 0; } - + if (_cookieFileName.empty()) { _cookieFileName = FileUtils::getInstance()->getWritablePath() + "cookieFile.txt"; } - + FILE* fp = fopen(_cookieFileName.c_str(), "w"); if (nullptr == fp) { CCLOG("can't create or open response cookie files"); return 0; } - + fwrite(responseCookies, sizeof(char), count, fp); - + fclose(fp); - + return count; } - + char* getResponseHeaders() { char* headers = nullptr; @@ -287,18 +287,18 @@ class HttpURLConnection } methodInfo.env->DeleteLocalRef(methodInfo.classID); } - + return headers; - + } - + char* getResponseContent(HttpResponse* response) { if (nullptr == response) { return nullptr; } - + char* content = nullptr; JniMethodInfo methodInfo; if (JniHelper::getStaticMethodInfo(methodInfo, @@ -308,18 +308,18 @@ class HttpURLConnection { jobject jObj = methodInfo.env->CallStaticObjectMethod( methodInfo.classID, methodInfo.methodID, _httpURLConnection); - + _contentLength = getCStrFromJByteArray((jbyteArray)jObj, methodInfo.env, &content); - if (nullptr != jObj) + if (nullptr != jObj) { methodInfo.env->DeleteLocalRef(jObj); } methodInfo.env->DeleteLocalRef(methodInfo.classID); } - + return content; } - + char* getResponseHeaderByKey(const char* key) { char* value = nullptr; @@ -339,10 +339,10 @@ class HttpURLConnection } methodInfo.env->DeleteLocalRef(methodInfo.classID); } - + return value; } - + int getResponseHeaderByKeyInt(const char* key) { int contentLength = 0; @@ -358,10 +358,10 @@ class HttpURLConnection methodInfo.env->DeleteLocalRef(jstrKey); methodInfo.env->DeleteLocalRef(methodInfo.classID); } - + return contentLength; } - + char* getResponseHeaderByIdx(int idx) { char* header = nullptr; @@ -379,25 +379,25 @@ class HttpURLConnection } methodInfo.env->DeleteLocalRef(methodInfo.classID); } - + return header; } - + const std::string getCookieFileName() { return _cookieFileName; } - + void setCookieFileName(std::string& filename) { _cookieFileName = filename; } - + int getContentLength() { return _contentLength; } - + private: void createHttpURLConnection(std::string url) { @@ -417,7 +417,7 @@ class HttpURLConnection } } - void addRequestHeader(const char* key, const char* value) + void addRequestHeader(const char* key, const char* value) { JniMethodInfo methodInfo; if (JniHelper::getStaticMethodInfo(methodInfo, @@ -434,36 +434,36 @@ class HttpURLConnection methodInfo.env->DeleteLocalRef(methodInfo.classID); } } - + void addCookiesForRequestHeader() { if(_client->getCookieFilename().empty()) { return; } - + _cookieFileName = FileUtils::getInstance()->fullPathForFilename(_client->getCookieFilename()); - + std::string cookiesInfo = FileUtils::getInstance()->getStringFromFile(_cookieFileName); - + if (cookiesInfo.empty()) return; - + HttpCookies cookiesVec; cookiesVec.clear(); - + std::stringstream stream(cookiesInfo); std::string item; while (std::getline(stream, item, '\n')) { cookiesVec.push_back(item); } - + if (cookiesVec.empty()) return; - + HttpCookiesIter iter = cookiesVec.begin(); - + std::vector cookiesInfoVec; cookiesInfoVec.clear(); @@ -474,20 +474,20 @@ class HttpURLConnection { cookies = cookies.substr(10); } - + if(cookies.at(0) == '#') continue; - + CookiesInfo co; std::stringstream streamInfo(cookies); std::string item; std::vector elems; - + while (std::getline(streamInfo, item, '\t')) { elems.push_back(item); } - + co.domain = elems[0]; if (co.domain.at(0) == '.') { @@ -514,7 +514,7 @@ class HttpURLConnection keyValue.append(cookiesIter->value); if (cookiesCount != 0) sendCookiesInfo.append(";"); - + sendCookiesInfo.append(keyValue); } cookiesCount++; @@ -560,7 +560,7 @@ class HttpURLConnection } bool configure() - { + { if(nullptr == _httpURLConnection) { return false; @@ -704,14 +704,14 @@ void HttpClient::processResponse(HttpResponse* response, char* responseMessage) //content len int contentLength = urlConnection.getResponseHeaderByKeyInt("Content-Length"); char* contentInfo = urlConnection.getResponseContent(response); - if (nullptr != contentInfo) + if (nullptr != contentInfo) { std::vector * recvBuffer = (std::vector*)response->getResponseData(); recvBuffer->clear(); recvBuffer->insert(recvBuffer->begin(), (char*)contentInfo, ((char*)contentInfo) + urlConnection.getContentLength()); } free(contentInfo); - + char *messageInfo = urlConnection.getResponseMessage(); strcpy(responseMessage, messageInfo); free(messageInfo); @@ -734,10 +734,10 @@ void HttpClient::processResponse(HttpResponse* response, char* responseMessage) // Worker thread void HttpClient::networkThread() -{ +{ increaseThreadCount(); - while (true) + while (true) { HttpRequest *request; @@ -754,16 +754,16 @@ void HttpClient::networkThread() if (request == _requestSentinel) { break; } - + // Create a HttpResponse object, the default setting is http access failed HttpResponse *response = new (std::nothrow) HttpResponse(request); processResponse(response, _responseMessage); - + // add response packet into queue _responseQueueMutex.lock(); _responseQueue.pushBack(response); _responseQueueMutex.unlock(); - + _schedulerMutex.lock(); if (nullptr != _scheduler) { @@ -771,17 +771,17 @@ void HttpClient::networkThread() } _schedulerMutex.unlock(); } - + // cleanup: if worker thread received quit signal, clean up un-completed request queue _requestQueueMutex.lock(); _requestQueue.clear(); _requestQueueMutex.unlock(); - + _responseQueueMutex.lock(); _responseQueue.clear(); _responseQueueMutex.unlock(); - decreaseThreadCountAndMayDeleteThis(); + decreaseThreadCountAndMayDeleteThis(); } // Worker thread @@ -820,11 +820,11 @@ void HttpClient::networkThreadAlone(HttpRequest* request, HttpResponse* response // HttpClient implementation HttpClient* HttpClient::getInstance() { - if (_httpClient == nullptr) + if (_httpClient == nullptr) { _httpClient = new (std::nothrow) HttpClient(); } - + return _httpClient; } @@ -857,7 +857,7 @@ void HttpClient::destroyInstance() CCLOG("HttpClient::destroyInstance() finished!"); } -void HttpClient::enableCookies(const char* cookieFile) +void HttpClient::enableCookies(const char* cookieFile) { std::lock_guard lock(_cookieFileMutex); if (cookieFile) @@ -869,7 +869,7 @@ void HttpClient::enableCookies(const char* cookieFile) _cookieFilename = (FileUtils::getInstance()->getWritablePath() + "cookieFile.txt"); } } - + void HttpClient::setSSLVerification(const std::string& caFile) { std::lock_guard lock(_sslCaFileMutex); @@ -914,17 +914,17 @@ bool HttpClient::lazyInitThreadSemphore() //Add a get task to queue void HttpClient::send(HttpRequest* request) -{ - if (!lazyInitThreadSemphore()) +{ + if (!lazyInitThreadSemphore()) { return; } - + if (nullptr == request) { return; } - + request->retain(); _requestQueueMutex.lock(); @@ -956,7 +956,7 @@ void HttpClient::dispatchResponseCallbacks() // log("CCHttpClient::dispatchResponseCallbacks is running"); //occurs when cocos thread fires but the network thread has already quited HttpResponse* response = nullptr; - + _responseQueueMutex.lock(); if (!_responseQueue.empty()) @@ -966,7 +966,7 @@ void HttpClient::dispatchResponseCallbacks() } _responseQueueMutex.unlock(); - + if (response) { HttpRequest *request = response->getHttpRequest(); @@ -982,7 +982,7 @@ void HttpClient::dispatchResponseCallbacks() { (pTarget->*pSelector)(this, response); } - + response->release(); // do not release in other thread request->release(); @@ -1005,7 +1005,7 @@ void HttpClient::decreaseThreadCountAndMayDeleteThis() { needDeleteThis = true; } - + _threadCountMutex.unlock(); if (needDeleteThis) { @@ -1018,31 +1018,31 @@ void HttpClient::setTimeoutForConnect(int value) std::lock_guard lock(_timeoutForConnectMutex); _timeoutForConnect = value; } - + int HttpClient::getTimeoutForConnect() { std::lock_guard lock(_timeoutForConnectMutex); return _timeoutForConnect; } - + void HttpClient::setTimeoutForRead(int value) { std::lock_guard lock(_timeoutForReadMutex); _timeoutForRead = value; } - + int HttpClient::getTimeoutForRead() { std::lock_guard lock(_timeoutForReadMutex); return _timeoutForRead; } - + const std::string& HttpClient::getCookieFilename() { std::lock_guard lock(_cookieFileMutex); return _cookieFilename; } - + const std::string& HttpClient::getSSLVerification() { std::lock_guard lock(_sslCaFileMutex); @@ -1054,3 +1054,4 @@ const std::string& HttpClient::getSSLVerification() NS_CC_END #endif // #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + diff --git a/cocos/network/HttpClient-apple.mm b/cocos/network/HttpClient-apple.mm index 72299bd90e43..008e2061c2ce 100644 --- a/cocos/network/HttpClient-apple.mm +++ b/cocos/network/HttpClient-apple.mm @@ -1,20 +1,20 @@ /**************************************************************************** Copyright (c) 2012 greathqy Copyright (c) 2012 cocos2d-x.org - Copyright (c) 2013-2014 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -27,7 +27,7 @@ of this software and associated documentation files (the "Software"), to deal #include "platform/CCPlatformConfig.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) -#include "network/HttpClient.h" +#include "HttpClient.h" #include #include @@ -40,7 +40,7 @@ of this software and associated documentation files (the "Software"), to deal NS_CC_BEGIN namespace network { - + static HttpClient *_httpClient = nullptr; // pointer to singleton static int processTask(HttpClient* client, HttpRequest *request, NSString *requestType, void *stream, long *errorCode, void *headerStream, char *errorBuffer); @@ -297,7 +297,7 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque const void* ptr = [httpAsynConn.responseData bytes]; long len = [httpAsynConn.responseData length]; recvBuffer->insert(recvBuffer->end(), (char*)ptr, (char*)ptr+len); - + return 1; } @@ -308,7 +308,7 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque { _httpClient = new (std::nothrow) HttpClient(); } - + return _httpClient; } @@ -319,9 +319,9 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque CCLOG("HttpClient singleton is nullptr"); return; } - + CCLOG("HttpClient::destroyInstance begin"); - + auto thiz = _httpClient; _httpClient = nullptr; @@ -333,10 +333,10 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque thiz->_requestQueueMutex.lock(); thiz->_requestQueue.pushBack(thiz->_requestSentinel); thiz->_requestQueueMutex.unlock(); - + thiz->_sleepCondition.notify_one(); thiz->decreaseThreadCountAndMayDeleteThis(); - + CCLOG("HttpClient::destroyInstance() finished!"); } @@ -353,7 +353,7 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque _cookieFilename = (FileUtils::getInstance()->getWritablePath() + "cookieFile.txt"); } _cookieFileMutex.unlock(); - + if (nullptr == _cookie) { _cookie = new(std::nothrow)HttpCookie; @@ -361,7 +361,7 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque _cookie->setCookieFileName(_cookieFilename); _cookie->readFile(); } - + void HttpClient::setSSLVerification(const std::string& caFile) { std::lock_guard lock(_sslCaFileMutex); @@ -376,13 +376,12 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque , _requestSentinel(new HttpRequest()) , _cookie(nullptr) { - CCLOG("In the constructor of HttpClient!"); memset(_responseMessage, 0, sizeof(char) * RESPONSE_BUFFER_SIZE); _scheduler = Director::getInstance()->getScheduler(); increaseThreadCount(); } - + HttpClient::~HttpClient() { @@ -408,29 +407,29 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque t.detach(); _isInited = true; } - + return true; } //Add a get task to queue void HttpClient::send(HttpRequest* request) -{ - if (false == lazyInitThreadSemphore()) +{ + if (false == lazyInitThreadSemphore()) { return; } - + if (!request) { return; } - + request->retain(); - + _requestQueueMutex.lock(); _requestQueue.pushBack(request); _requestQueueMutex.unlock(); - + // Notify thread start to work _sleepCondition.notify_one(); } @@ -463,7 +462,7 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque _responseQueue.erase(0); } _responseQueueMutex.unlock(); - + if (response) { HttpRequest *request = response->getHttpRequest(); @@ -479,13 +478,13 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque { (pTarget->*pSelector)(this, response); } - + response->release(); // do not release in other thread request->release(); } } - + // Process Response void HttpClient::processResponse(HttpResponse* response, char* responseMessage) { @@ -493,31 +492,31 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque long responseCode = -1; int retValue = 0; NSString* requestType = nil; - + // Process the request -> get response packet switch (request->getRequestType()) { case HttpRequest::Type::GET: // HTTP GET requestType = @"GET"; break; - + case HttpRequest::Type::POST: // HTTP POST requestType = @"POST"; break; - + case HttpRequest::Type::PUT: requestType = @"PUT"; break; - + case HttpRequest::Type::DELETE: requestType = @"DELETE"; break; - + default: CCASSERT(true, "CCHttpClient: unknown request type, only GET and POSt are supported"); break; } - + retValue = processTask(this, request, requestType, @@ -525,11 +524,11 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque &responseCode, response->getResponseHeader(), responseMessage); - + // write data to HttpResponse response->setResponseCode(responseCode); - - if (retValue != 0) + + if (retValue != 0) { response->setSucceed(true); } @@ -540,7 +539,7 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque } } - + void HttpClient::increaseThreadCount() { _threadCountMutex.lock(); @@ -557,55 +556,53 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque { needDeleteThis = true; } - + _threadCountMutex.unlock(); if (needDeleteThis) { delete this; } } - + void HttpClient::setTimeoutForConnect(int value) { std::lock_guard lock(_timeoutForConnectMutex); _timeoutForConnect = value; } - + int HttpClient::getTimeoutForConnect() { std::lock_guard lock(_timeoutForConnectMutex); return _timeoutForConnect; } - + void HttpClient::setTimeoutForRead(int value) { std::lock_guard lock(_timeoutForReadMutex); _timeoutForRead = value; } - + int HttpClient::getTimeoutForRead() { std::lock_guard lock(_timeoutForReadMutex); return _timeoutForRead; } - + const std::string& HttpClient::getCookieFilename() { std::lock_guard lock(_cookieFileMutex); return _cookieFilename; } - + const std::string& HttpClient::getSSLVerification() { std::lock_guard lock(_sslCaFileMutex); return _sslCaFilename; } - + } NS_CC_END #endif // #if CC_TARGET_PLATFORM == CC_PLATFORM_MAC - - diff --git a/cocos/network/HttpClient.cpp b/cocos/network/HttpClient.cpp index c124e70829c8..835d9fd5f478 100644 --- a/cocos/network/HttpClient.cpp +++ b/cocos/network/HttpClient.cpp @@ -1,20 +1,20 @@ /**************************************************************************** Copyright (c) 2012 greathqy Copyright (c) 2012 cocos2d-x.org - Copyright (c) 2013-2014 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -24,7 +24,7 @@ THE SOFTWARE. ****************************************************************************/ -#include "network/HttpClient.h" +#include "HttpClient.h" #include #include #include @@ -48,11 +48,11 @@ static size_t writeData(void *ptr, size_t size, size_t nmemb, void *stream) { std::vector *recvBuffer = (std::vector*)stream; size_t sizes = size * nmemb; - + // add data to the end of recvBuffer // write data maybe called more than once in a single request recvBuffer->insert(recvBuffer->end(), (char*)ptr, (char*)ptr+sizes); - + return sizes; } @@ -61,11 +61,11 @@ static size_t writeHeaderData(void *ptr, size_t size, size_t nmemb, void *stream { std::vector *recvBuffer = (std::vector*)stream; size_t sizes = size * nmemb; - + // add data to the end of recvBuffer // write data maybe called more than once in a single request recvBuffer->insert(recvBuffer->end(), (char*)ptr, (char*)ptr+sizes); - + return sizes; } @@ -78,10 +78,10 @@ static int processDeleteTask(HttpClient* client, HttpRequest* request, write_ca // Worker thread void HttpClient::networkThread() -{ - increaseThreadCount(); - - while (true) +{ + increaseThreadCount(); + + while (true) { HttpRequest *request; @@ -89,7 +89,7 @@ void HttpClient::networkThread() { std::lock_guard lock(_requestQueueMutex); while (_requestQueue.empty()) - { + { _sleepCondition.wait(_requestQueueMutex); } request = _requestQueue.at(0); @@ -101,70 +101,70 @@ void HttpClient::networkThread() } // step 2: libcurl sync access - + // Create a HttpResponse object, the default setting is http access failed HttpResponse *response = new (std::nothrow) HttpResponse(request); - - processResponse(response, _responseMessage); - + + processResponse(response, _responseMessage); + // add response packet into queue _responseQueueMutex.lock(); _responseQueue.pushBack(response); _responseQueueMutex.unlock(); - - _schedulerMutex.lock(); - if (nullptr != _scheduler) - { - _scheduler->performFunctionInCocosThread(CC_CALLBACK_0(HttpClient::dispatchResponseCallbacks, this)); - } - _schedulerMutex.unlock(); + + _schedulerMutex.lock(); + if (nullptr != _scheduler) + { + _scheduler->performFunctionInCocosThread(CC_CALLBACK_0(HttpClient::dispatchResponseCallbacks, this)); + } + _schedulerMutex.unlock(); } - + // cleanup: if worker thread received quit signal, clean up un-completed request queue _requestQueueMutex.lock(); _requestQueue.clear(); _requestQueueMutex.unlock(); - - _responseQueueMutex.lock(); - _responseQueue.clear(); - _responseQueueMutex.unlock(); - decreaseThreadCountAndMayDeleteThis(); + _responseQueueMutex.lock(); + _responseQueue.clear(); + _responseQueueMutex.unlock(); + + decreaseThreadCountAndMayDeleteThis(); } // Worker thread void HttpClient::networkThreadAlone(HttpRequest* request, HttpResponse* response) { - increaseThreadCount(); - - char responseMessage[RESPONSE_BUFFER_SIZE] = { 0 }; - processResponse(response, responseMessage); - - _schedulerMutex.lock(); - if (nullptr != _scheduler) - { - _scheduler->performFunctionInCocosThread([this, response, request]{ - const ccHttpRequestCallback& callback = request->getCallback(); - Ref* pTarget = request->getTarget(); - SEL_HttpResponse pSelector = request->getSelector(); - - if (callback != nullptr) - { - callback(this, response); - } - else if (pTarget && pSelector) - { - (pTarget->*pSelector)(this, response); - } - response->release(); - // do not release in other thread - request->release(); - }); - } - _schedulerMutex.unlock(); - - decreaseThreadCountAndMayDeleteThis(); + increaseThreadCount(); + + char responseMessage[RESPONSE_BUFFER_SIZE] = { 0 }; + processResponse(response, responseMessage); + + _schedulerMutex.lock(); + if (nullptr != _scheduler) + { + _scheduler->performFunctionInCocosThread([this, response, request]{ + const ccHttpRequestCallback& callback = request->getCallback(); + Ref* pTarget = request->getTarget(); + SEL_HttpResponse pSelector = request->getSelector(); + + if (callback != nullptr) + { + callback(this, response); + } + else if (pTarget && pSelector) + { + (pTarget->*pSelector)(this, response); + } + response->release(); + // do not release in other thread + request->release(); + }); + } + _schedulerMutex.unlock(); + + decreaseThreadCountAndMayDeleteThis(); } //Configure curl's timeout property @@ -173,7 +173,7 @@ static bool configureCURL(HttpClient* client, CURL* handle, char* errorBuffer) if (!handle) { return false; } - + int32_t code; code = curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, errorBuffer); if (code != CURLE_OK) { @@ -188,18 +188,18 @@ static bool configureCURL(HttpClient* client, CURL* handle, char* errorBuffer) return false; } - std::string sslCaFilename = client->getSSLVerification(); - if (sslCaFilename.empty()) { + std::string sslCaFilename = client->getSSLVerification(); + if (sslCaFilename.empty()) { curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 0L); } else { curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 2L); - curl_easy_setopt(handle, CURLOPT_CAINFO, sslCaFilename.c_str()); + curl_easy_setopt(handle, CURLOPT_CAINFO, sslCaFilename.c_str()); } - + // FIXED #3224: The subthread of CCHttpClient interrupts main thread if timeout comes. - // Document is here: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTNOSIGNAL + // Document is here: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTNOSIGNAL curl_easy_setopt(handle, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(handle, CURLOPT_ACCEPT_ENCODING, ""); @@ -245,7 +245,7 @@ class CURLRaii { if (!_curl) return false; - if (!configureCURL(client, _curl, errorBuffer)) + if (!configureCURL(client, _curl, errorBuffer)) return false; /* get custom header data (if set) */ @@ -259,12 +259,12 @@ class CURLRaii if (!setOption(CURLOPT_HTTPHEADER, _headers)) return false; } - std::string cookieFilename = client->getCookieFilename(); - if (!cookieFilename.empty()) { - if (!setOption(CURLOPT_COOKIEFILE, cookieFilename.c_str())) { + std::string cookieFilename = client->getCookieFilename(); + if (!cookieFilename.empty()) { + if (!setOption(CURLOPT_COOKIEFILE, cookieFilename.c_str())) { return false; } - if (!setOption(CURLOPT_COOKIEJAR, cookieFilename.c_str())) { + if (!setOption(CURLOPT_COOKIEJAR, cookieFilename.c_str())) { return false; } } @@ -274,7 +274,7 @@ class CURLRaii && setOption(CURLOPT_WRITEDATA, stream) && setOption(CURLOPT_HEADERFUNCTION, headerCallback) && setOption(CURLOPT_HEADERDATA, headerStream); - + } /// @param responseCode Null not allowed @@ -288,7 +288,7 @@ class CURLRaii return false; } // Get some mor data. - + return true; } }; @@ -297,7 +297,7 @@ class CURLRaii static int processGetTask(HttpClient* client, HttpRequest* request, write_callback callback, void* stream, long* responseCode, write_callback headerCallback, void* headerStream, char* errorBuffer) { CURLRaii curl; - bool ok = curl.init(client, request, callback, stream, headerCallback, headerStream, errorBuffer) + bool ok = curl.init(client, request, callback, stream, headerCallback, headerStream, errorBuffer) && curl.setOption(CURLOPT_FOLLOWLOCATION, true) && curl.perform(responseCode); return ok ? 0 : 1; @@ -307,7 +307,7 @@ static int processGetTask(HttpClient* client, HttpRequest* request, write_callba static int processPostTask(HttpClient* client, HttpRequest* request, write_callback callback, void* stream, long* responseCode, write_callback headerCallback, void* headerStream, char* errorBuffer) { CURLRaii curl; - bool ok = curl.init(client, request, callback, stream, headerCallback, headerStream, errorBuffer) + bool ok = curl.init(client, request, callback, stream, headerCallback, headerStream, errorBuffer) && curl.setOption(CURLOPT_POST, 1) && curl.setOption(CURLOPT_POSTFIELDS, request->getRequestData()) && curl.setOption(CURLOPT_POSTFIELDSIZE, request->getRequestDataSize()) @@ -319,7 +319,7 @@ static int processPostTask(HttpClient* client, HttpRequest* request, write_callb static int processPutTask(HttpClient* client, HttpRequest* request, write_callback callback, void* stream, long* responseCode, write_callback headerCallback, void* headerStream, char* errorBuffer) { CURLRaii curl; - bool ok = curl.init(client, request, callback, stream, headerCallback, headerStream, errorBuffer) + bool ok = curl.init(client, request, callback, stream, headerCallback, headerStream, errorBuffer) && curl.setOption(CURLOPT_CUSTOMREQUEST, "PUT") && curl.setOption(CURLOPT_POSTFIELDS, request->getRequestData()) && curl.setOption(CURLOPT_POSTFIELDSIZE, request->getRequestDataSize()) @@ -331,7 +331,7 @@ static int processPutTask(HttpClient* client, HttpRequest* request, write_callba static int processDeleteTask(HttpClient* client, HttpRequest* request, write_callback callback, void* stream, long* responseCode, write_callback headerCallback, void* headerStream, char* errorBuffer) { CURLRaii curl; - bool ok = curl.init(client, request, callback, stream, headerCallback, headerStream, errorBuffer) + bool ok = curl.init(client, request, callback, stream, headerCallback, headerStream, errorBuffer) && curl.setOption(CURLOPT_CUSTOMREQUEST, "DELETE") && curl.setOption(CURLOPT_FOLLOWLOCATION, true) && curl.perform(responseCode); @@ -341,39 +341,39 @@ static int processDeleteTask(HttpClient* client, HttpRequest* request, write_cal // HttpClient implementation HttpClient* HttpClient::getInstance() { - if (_httpClient == nullptr) - { + if (_httpClient == nullptr) + { _httpClient = new (std::nothrow) HttpClient(); } - + return _httpClient; } void HttpClient::destroyInstance() { - if (nullptr == _httpClient) - { - CCLOG("HttpClient singleton is nullptr"); - return; - } + if (nullptr == _httpClient) + { + CCLOG("HttpClient singleton is nullptr"); + return; + } - CCLOG("HttpClient::destroyInstance begin"); - auto thiz = _httpClient; - _httpClient = nullptr; + CCLOG("HttpClient::destroyInstance begin"); + auto thiz = _httpClient; + _httpClient = nullptr; - thiz->_scheduler->unscheduleAllForTarget(thiz); - thiz->_schedulerMutex.lock(); - thiz->_scheduler = nullptr; - thiz->_schedulerMutex.unlock(); + thiz->_scheduler->unscheduleAllForTarget(thiz); + thiz->_schedulerMutex.lock(); + thiz->_scheduler = nullptr; + thiz->_schedulerMutex.unlock(); - thiz->_requestQueueMutex.lock(); - thiz->_requestQueue.pushBack(thiz->_requestSentinel); - thiz->_requestQueueMutex.unlock(); + thiz->_requestQueueMutex.lock(); + thiz->_requestQueue.pushBack(thiz->_requestSentinel); + thiz->_requestQueueMutex.unlock(); - thiz->_sleepCondition.notify_one(); - thiz->decreaseThreadCountAndMayDeleteThis(); + thiz->_sleepCondition.notify_one(); + thiz->decreaseThreadCountAndMayDeleteThis(); - CCLOG("HttpClient::destroyInstance() finished!"); + CCLOG("HttpClient::destroyInstance() finished!"); } void HttpClient::enableCookies(const char* cookieFile) @@ -388,7 +388,7 @@ void HttpClient::enableCookies(const char* cookieFile) _cookieFilename = (FileUtils::getInstance()->getWritablePath() + "cookieFile.txt"); } } - + void HttpClient::setSSLVerification(const std::string& caFile) { std::lock_guard lock(_sslCaFileMutex); @@ -403,56 +403,56 @@ HttpClient::HttpClient() , _requestSentinel(new HttpRequest()) , _cookie(nullptr) { - CCLOG("In the constructor of HttpClient!"); - memset(_responseMessage, 0, RESPONSE_BUFFER_SIZE * sizeof(char)); - _scheduler = Director::getInstance()->getScheduler(); - increaseThreadCount(); + CCLOG("In the constructor of HttpClient!"); + memset(_responseMessage, 0, RESPONSE_BUFFER_SIZE * sizeof(char)); + _scheduler = Director::getInstance()->getScheduler(); + increaseThreadCount(); } HttpClient::~HttpClient() { - CC_SAFE_DELETE(_requestSentinel); - CCLOG("HttpClient destructor"); + CC_SAFE_DELETE(_requestSentinel); + CCLOG("HttpClient destructor"); } //Lazy create semaphore & mutex & thread bool HttpClient::lazyInitThreadSemphore() { if (_isInited) - { + { return true; - } - else - { + } + else + { auto t = std::thread(CC_CALLBACK_0(HttpClient::networkThread, this)); t.detach(); - _isInited = true; + _isInited = true; } - + return true; } //Add a get task to queue void HttpClient::send(HttpRequest* request) -{ - if (false == lazyInitThreadSemphore()) +{ + if (false == lazyInitThreadSemphore()) { return; } - + if (!request) { return; } - + request->retain(); - _requestQueueMutex.lock(); - _requestQueue.pushBack(request); - _requestQueueMutex.unlock(); + _requestQueueMutex.lock(); + _requestQueue.pushBack(request); + _requestQueueMutex.unlock(); - // Notify thread start to work - _sleepCondition.notify_one(); + // Notify thread start to work + _sleepCondition.notify_one(); } void HttpClient::sendImmediate(HttpRequest* request) @@ -484,7 +484,7 @@ void HttpClient::dispatchResponseCallbacks() _responseQueue.erase(0); } _responseQueueMutex.unlock(); - + if (response) { HttpRequest *request = response->getHttpRequest(); @@ -500,7 +500,7 @@ void HttpClient::dispatchResponseCallbacks() { (pTarget->*pSelector)(this, response); } - + response->release(); // do not release in other thread request->release(); @@ -510,93 +510,93 @@ void HttpClient::dispatchResponseCallbacks() // Process Response void HttpClient::processResponse(HttpResponse* response, char* responseMessage) { - auto request = response->getHttpRequest(); - long responseCode = -1; - int retValue = 0; - - // Process the request -> get response packet - switch (request->getRequestType()) - { - case HttpRequest::Type::GET: // HTTP GET - retValue = processGetTask(this, request, - writeData, - response->getResponseData(), - &responseCode, - writeHeaderData, - response->getResponseHeader(), - responseMessage); - break; - - case HttpRequest::Type::POST: // HTTP POST - retValue = processPostTask(this, request, - writeData, - response->getResponseData(), - &responseCode, - writeHeaderData, - response->getResponseHeader(), - responseMessage); - break; - - case HttpRequest::Type::PUT: - retValue = processPutTask(this, request, - writeData, - response->getResponseData(), - &responseCode, - writeHeaderData, - response->getResponseHeader(), - responseMessage); - break; - - case HttpRequest::Type::DELETE: - retValue = processDeleteTask(this, request, - writeData, - response->getResponseData(), - &responseCode, - writeHeaderData, - response->getResponseHeader(), - responseMessage); - break; - - default: - CCASSERT(true, "CCHttpClient: unknown request type, only GET and POSt are supported"); - break; - } - - // write data to HttpResponse - response->setResponseCode(responseCode); - if (retValue != 0) - { - response->setSucceed(false); - response->setErrorBuffer(responseMessage); - } - else - { - response->setSucceed(true); - } + auto request = response->getHttpRequest(); + long responseCode = -1; + int retValue = 0; + + // Process the request -> get response packet + switch (request->getRequestType()) + { + case HttpRequest::Type::GET: // HTTP GET + retValue = processGetTask(this, request, + writeData, + response->getResponseData(), + &responseCode, + writeHeaderData, + response->getResponseHeader(), + responseMessage); + break; + + case HttpRequest::Type::POST: // HTTP POST + retValue = processPostTask(this, request, + writeData, + response->getResponseData(), + &responseCode, + writeHeaderData, + response->getResponseHeader(), + responseMessage); + break; + + case HttpRequest::Type::PUT: + retValue = processPutTask(this, request, + writeData, + response->getResponseData(), + &responseCode, + writeHeaderData, + response->getResponseHeader(), + responseMessage); + break; + + case HttpRequest::Type::DELETE: + retValue = processDeleteTask(this, request, + writeData, + response->getResponseData(), + &responseCode, + writeHeaderData, + response->getResponseHeader(), + responseMessage); + break; + + default: + CCASSERT(true, "CCHttpClient: unknown request type, only GET and POSt are supported"); + break; + } + + // write data to HttpResponse + response->setResponseCode(responseCode); + if (retValue != 0) + { + response->setSucceed(false); + response->setErrorBuffer(responseMessage); + } + else + { + response->setSucceed(true); + } } void HttpClient::increaseThreadCount() { - _threadCountMutex.lock(); - ++_threadCount; - _threadCountMutex.unlock(); + _threadCountMutex.lock(); + ++_threadCount; + _threadCountMutex.unlock(); } void HttpClient::decreaseThreadCountAndMayDeleteThis() { - bool needDeleteThis = false; - _threadCountMutex.lock(); - --_threadCount; - if (0 == _threadCount) - { - needDeleteThis = true; - } - - _threadCountMutex.unlock(); - if (needDeleteThis) - { - delete this; - } + bool needDeleteThis = false; + _threadCountMutex.lock(); + --_threadCount; + if (0 == _threadCount) + { + needDeleteThis = true; + } + + _threadCountMutex.unlock(); + if (needDeleteThis) + { + delete this; + } } void HttpClient::setTimeoutForConnect(int value) @@ -604,31 +604,31 @@ void HttpClient::setTimeoutForConnect(int value) std::lock_guard lock(_timeoutForConnectMutex); _timeoutForConnect = value; } - + int HttpClient::getTimeoutForConnect() { std::lock_guard lock(_timeoutForConnectMutex); return _timeoutForConnect; } - + void HttpClient::setTimeoutForRead(int value) { std::lock_guard lock(_timeoutForReadMutex); _timeoutForRead = value; } - + int HttpClient::getTimeoutForRead() { std::lock_guard lock(_timeoutForReadMutex); return _timeoutForRead; } - + const std::string& HttpClient::getCookieFilename() { std::lock_guard lock(_cookieFileMutex); return _cookieFilename; } - + const std::string& HttpClient::getSSLVerification() { std::lock_guard lock(_sslCaFileMutex); @@ -639,4 +639,3 @@ const std::string& HttpClient::getSSLVerification() NS_CC_END - diff --git a/cocos/network/HttpClient.h b/cocos/network/HttpClient.h index f1ef7a721194..b59ef81f71df 100644 --- a/cocos/network/HttpClient.h +++ b/cocos/network/HttpClient.h @@ -1,20 +1,20 @@ /**************************************************************************** Copyright (c) 2012 greathqy Copyright (c) 2012 cocos2d-x.org - Copyright (c) 2013-2014 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -43,7 +43,7 @@ NS_CC_BEGIN namespace network { - + /** Singleton that handles asynchronous http requests. @@ -55,10 +55,10 @@ namespace network { class CC_DLL HttpClient { public: - /** - * The buffer size of _responseMessage - */ - static const int RESPONSE_BUFFER_SIZE = 256; + /** + * The buffer size of _responseMessage + */ + static const int RESPONSE_BUFFER_SIZE = 256; /** * Get instance of HttpClient. @@ -66,40 +66,40 @@ class CC_DLL HttpClient * @return the instance of HttpClient. */ static HttpClient *getInstance(); - - /** - * Release the instance of HttpClient. + + /** + * Release the instance of HttpClient. */ static void destroyInstance(); - /** + /** * Enable cookie support. * * @param cookieFile the filepath of cookie file. */ void enableCookies(const char* cookieFile); - + /** * Get the cookie filename - * + * * @return the cookie filename */ const std::string& getCookieFilename(); - + /** * Set root certificate path for SSL verification. * * @param caFile a full path of root certificate.if it is empty, SSL verification is disabled. */ void setSSLVerification(const std::string& caFile); - + /** * Get the ssl CA filename - * + * * @return the ssl CA filename */ const std::string& getSSLVerification(); - + /** * Add a get request to task queue * @@ -115,21 +115,21 @@ class CC_DLL HttpClient please make sure request->_requestData is clear before calling "sendImmediate" here. */ void sendImmediate(HttpRequest* request); - + /** * Set the timeout value for connecting. * * @param value the timeout value for connecting. */ void setTimeoutForConnect(int value); - + /** * Get the timeout value for connecting. * * @return int the timeout value for connecting. */ int getTimeoutForConnect(); - + /** * Set the timeout value for reading. * @@ -143,17 +143,17 @@ class CC_DLL HttpClient * @return int the timeout value for reading. */ int getTimeoutForRead(); - + HttpCookie* getCookie() const {return _cookie; } - + std::mutex& getCookieFileMutex() {return _cookieFileMutex;} - + std::mutex& getSSLCaFileMutex() {return _sslCaFileMutex;} private: HttpClient(); virtual ~HttpClient(); - bool init(void); - + bool init(); + /** * Init pthread mutex, semaphore, and create new thread for http requests * @return bool @@ -163,44 +163,44 @@ class CC_DLL HttpClient void networkThreadAlone(HttpRequest* request, HttpResponse* response); /** Poll function called from main thread to dispatch callbacks when http requests finished **/ void dispatchResponseCallbacks(); - + void processResponse(HttpResponse* response, char* responseMessage); void increaseThreadCount(); void decreaseThreadCountAndMayDeleteThis(); - + private: bool _isInited; - + int _timeoutForConnect; std::mutex _timeoutForConnectMutex; - + int _timeoutForRead; std::mutex _timeoutForReadMutex; - + int _threadCount; std::mutex _threadCountMutex; - + Scheduler* _scheduler; std::mutex _schedulerMutex; - + Vector _requestQueue; std::mutex _requestQueueMutex; - + Vector _responseQueue; std::mutex _responseQueueMutex; - + std::string _cookieFilename; std::mutex _cookieFileMutex; - + std::string _sslCaFilename; std::mutex _sslCaFileMutex; - + HttpCookie* _cookie; - + std::condition_variable_any _sleepCondition; - - char _responseMessage[RESPONSE_BUFFER_SIZE]; - + + char _responseMessage[RESPONSE_BUFFER_SIZE]; + HttpRequest* _requestSentinel; }; @@ -212,3 +212,4 @@ NS_CC_END /// @} #endif //__CCHTTPCLIENT_H__ + diff --git a/cocos/network/HttpCookie.cpp b/cocos/network/HttpCookie.cpp index c293819daa34..e41ee5c71ceb 100644 --- a/cocos/network/HttpCookie.cpp +++ b/cocos/network/HttpCookie.cpp @@ -1,18 +1,18 @@ /**************************************************************************** - Copyright (c) 2013-2014 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -22,56 +22,56 @@ THE SOFTWARE. ****************************************************************************/ -#include "network/HttpCookie.h" -#include "platform/CCFileUtils.h" +#include "HttpCookie.h" +#include "CCFileUtils.h" #include #include void HttpCookie::readFile() { std::string inString = cocos2d::FileUtils::getInstance()->getStringFromFile(_cookieFileName); - if(inString.length() != 0) + if(!inString.empty()) { std::vector cookiesVec; cookiesVec.clear(); - + std::stringstream stream(inString); std::string item; while(std::getline(stream, item, '\n')) { cookiesVec.push_back(item); } - + if(cookiesVec.empty()) return; - + _cookies.clear(); - + for(auto iter = cookiesVec.begin();iter != cookiesVec.end(); iter++) { std::string cookie = *iter; - + if(cookie.length() == 0) continue; - + if(cookie.find("#HttpOnly_") != std::string::npos) { cookie = cookie.substr(10); } - + if(cookie.at(0) == '#') continue; - + CookiesInfo co; std::stringstream streamInfo(cookie); std::vector elems; std::string elemsItem; - + while (std::getline(streamInfo, elemsItem, '\t')) { elems.push_back(elemsItem); } - + co.domain = elems[0]; if (co.domain.at(0) == '.') { @@ -100,7 +100,7 @@ const CookiesInfo* HttpCookie::getMatchCookie(const std::string& url) const if(url.find(iter->domain) != std::string::npos) return &(*iter); } - + return nullptr; } @@ -126,7 +126,7 @@ void HttpCookie::writeFile() "# This file was generated by cocos2d-x! Edit at your own risk.\n" "# Test cocos2d-x cookie write.\n\n", out); - + std::string line; for(auto iter = _cookies.begin(); iter != _cookies.end(); iter++) { @@ -145,14 +145,15 @@ void HttpCookie::writeFile() line.append(1, '\t'); line.append(iter->value); //line.append(1, '\n'); - + fprintf(out, "%s\n", line.c_str()); } - + fclose(out); } -void HttpCookie::setCookieFileName(std::string filename) +void HttpCookie::setCookieFileName(const std::string& filename) { _cookieFileName = filename; } + diff --git a/cocos/network/HttpCookie.h b/cocos/network/HttpCookie.h index 9dbae315da53..87cc9820cca0 100644 --- a/cocos/network/HttpCookie.h +++ b/cocos/network/HttpCookie.h @@ -1,18 +1,18 @@ /**************************************************************************** - Copyright (c) 2013-2015 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -26,9 +26,6 @@ #define HTTP_COOKIE_H /// @cond DO_NOT_SHOW -#include -#include - struct CookiesInfo { std::string domain; @@ -44,14 +41,14 @@ class HttpCookie { public: void readFile(); - + void writeFile(); - void setCookieFileName(const std::string fileName); - + void setCookieFileName(const std::string& fileName); + const std::vector* getCookies()const; const CookiesInfo* getMatchCookie(const std::string& url) const; void updateOrAddCookie(CookiesInfo* cookie); - + private: std::string _cookieFileName; std::vector _cookies; @@ -59,3 +56,4 @@ class HttpCookie /// @endcond #endif /* HTTP_COOKIE_H */ + diff --git a/cocos/network/HttpRequest.h b/cocos/network/HttpRequest.h index c4255189da67..2a4109a32d82 100644 --- a/cocos/network/HttpRequest.h +++ b/cocos/network/HttpRequest.h @@ -1,19 +1,19 @@ /**************************************************************************** Copyright (c) 2010-2012 cocos2d-x.org - Copyright (c) 2013-2014 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -47,7 +47,7 @@ typedef std::function ccHttpRe typedef void (cocos2d::Ref::*SEL_HttpResponse)(HttpClient* client, HttpResponse* response); #define httpresponse_selector(_SELECTOR) (cocos2d::network::SEL_HttpResponse)(&_SELECTOR) -/** +/** * Defines the object which users must packed for HttpClient::send(HttpRequest*) method. * Please refer to tests/test-cpp/Classes/ExtensionTest/NetworkTest/HttpClientTest.cpp as a sample * @since v2.0.2 @@ -75,8 +75,8 @@ class CC_DLL HttpRequest : public Ref DELETE, UNKNOWN, }; - - /** + + /** * Constructor. * Because HttpRequest object will be used between UI thread and network thread, requestObj->autorelease() is forbidden to avoid crashes in AutoreleasePool @@ -84,17 +84,17 @@ class CC_DLL HttpRequest : public Ref Please refer to HttpRequestTest.cpp to find its usage. */ HttpRequest() + : _requestType(Type::UNKNOWN) + , _pTarget(nullptr) + , _pSelector(nullptr) + , _pCallback(nullptr) + , _pUserData(nullptr) { - _requestType = Type::UNKNOWN; _url.clear(); _requestData.clear(); _tag.clear(); - _pTarget = nullptr; - _pSelector = nullptr; - _pCallback = nullptr; - _pUserData = nullptr; - }; - + } + /** Destructor. */ virtual ~HttpRequest() { @@ -102,24 +102,24 @@ class CC_DLL HttpRequest : public Ref { _pTarget->release(); } - }; - - /** + } + + /** * Override autorelease method to avoid developers to call it. * If this function was called, it would trigger assert in debug mode * * @return Ref* always return nullptr. */ - Ref* autorelease(void) + Ref* autorelease() { CCASSERT(false, "HttpResponse is used between network thread and ui thread \ therefore, autorelease is forbidden here"); - return NULL; + return nullptr; } - + // setter/getters for properties - - /** + + /** * Set request type of HttpRequest object before being sent,now it support the enum value of HttpRequest::Type. * * @param type the request type. @@ -127,18 +127,19 @@ class CC_DLL HttpRequest : public Ref inline void setRequestType(Type type) { _requestType = type; - }; - /** + } + + /** * Get the request type of HttpRequest object. * * @return HttpRequest::Type. */ - inline Type getRequestType() + inline Type getRequestType() const { return _requestType; - }; - - /** + } + + /** * Set the url address of HttpRequest object. * The url value could be like these: "http://httpbin.org/ip" or "https://httpbin.org/get" * @@ -147,18 +148,19 @@ class CC_DLL HttpRequest : public Ref inline void setUrl(const std::string& url) { _url = url; - }; - /** + } + + /** * Get the url address of HttpRequest object. * * @return const char* the pointer of _url. */ - inline const char* getUrl() + inline const char* getUrl() const { return _url.c_str(); - }; - - /** + } + + /** * Set the request data of HttpRequest object. * * @param buffer the buffer of request data, it support binary data. @@ -167,30 +169,32 @@ class CC_DLL HttpRequest : public Ref inline void setRequestData(const char* buffer, size_t len) { _requestData.assign(buffer, buffer + len); - }; - /** + } + + /** * Get the request data pointer of HttpRequest object. * * @return char* the request data pointer. */ inline char* getRequestData() { - if(_requestData.size() != 0) - return &(_requestData.front()); + if(!_requestData.empty()) + return _requestData.data(); return nullptr; } - /** + + /** * Get the size of request data * * @return ssize_t the size of request data */ - inline ssize_t getRequestDataSize() + inline ssize_t getRequestDataSize() const { return _requestData.size(); } - - /** + + /** * Set a string tag to identify your request. * This tag can be found in HttpResponse->getHttpRequest->getTag(). * @@ -199,18 +203,19 @@ class CC_DLL HttpRequest : public Ref inline void setTag(const std::string& tag) { _tag = tag; - }; - /** + } + + /** * Get the string tag to identify the request. * The best practice is to use it in your MyClass::onMyHttpRequestCompleted(sender, HttpResponse*) callback. * * @return const char* the pointer of _tag */ - inline const char* getTag() + inline const char* getTag() const { return _tag.c_str(); - }; - + } + /** * Set user-customed data of HttpRequest object. * You can attach a customed data in each request, and get it back in response callback. @@ -221,14 +226,15 @@ class CC_DLL HttpRequest : public Ref inline void setUserData(void* pUserData) { _pUserData = pUserData; - }; - /** + } + + /** * Get the user-customed data pointer which were pre-setted. * Don't forget to delete it. HttpClient/HttpResponse/HttpRequest will do nothing with this pointer. * * @return void* the pointer of user-customed data. */ - inline void* getUserData() + inline void* getUserData() const { return _pUserData; }; @@ -272,14 +278,14 @@ class CC_DLL HttpRequest : public Ref * * @return Ref* the target of callback selector function */ - inline Ref* getTarget() + inline Ref* getTarget() const { return _pTarget; } /** * This sub class is just for migration SEL_CallFuncND to SEL_HttpResponse,someday this way will be removed. - * + * * @lua NA */ class _prxy @@ -295,47 +301,47 @@ class CC_DLL HttpRequest : public Ref protected: SEL_HttpResponse _cb; }; - - /** + + /** * Get _prxy object by the _pSelector. * * @return _prxy the _prxy object */ - inline _prxy getSelector() + inline _prxy getSelector() const { return _prxy(_pSelector); } - + /** * Get ccHttpRequestCallback callback function. * * @return const ccHttpRequestCallback& ccHttpRequestCallback callback function. */ - inline const ccHttpRequestCallback& getCallback() + inline const ccHttpRequestCallback& getCallback() const { return _pCallback; } - - /** + + /** * Set custom-defined headers. * * @param pHeaders the string vector of custom-defined headers. */ - inline void setHeaders(std::vector pHeaders) - { - _headers=pHeaders; - } - - /** + inline void setHeaders(const std::vector& headers) + { + _headers = headers; + } + + /** * Get custom headers. * * @return std::vector the string vector of custom-defined headers. */ - inline std::vector getHeaders() - { - return _headers; - } - + inline std::vector getHeaders() const + { + return _headers; + } + private: inline void doSetResponseCallback(Ref* pTarget, SEL_HttpResponse pSelector) { @@ -361,8 +367,8 @@ class CC_DLL HttpRequest : public Ref Ref* _pTarget; /// callback target of pSelector function SEL_HttpResponse _pSelector; /// callback function, e.g. MyLayer::onHttpResponse(HttpClient *sender, HttpResponse * response) ccHttpRequestCallback _pCallback; /// C++11 style callbacks - void* _pUserData; /// You can add your customed data here - std::vector _headers; /// custom http headers + void* _pUserData; /// You can add your customed data here + std::vector _headers; /// custom http headers }; } @@ -373,3 +379,4 @@ NS_CC_END /// @} #endif //__HTTP_REQUEST_H__ + diff --git a/cocos/network/HttpResponse.h b/cocos/network/HttpResponse.h index 4ae7aaff815b..cb163ed2d062 100644 --- a/cocos/network/HttpResponse.h +++ b/cocos/network/HttpResponse.h @@ -1,19 +1,19 @@ /**************************************************************************** Copyright (c) 2010-2012 cocos2d-x.org - Copyright (c) 2013-2014 Chukong Technologies Inc. - + Copyright (c) 2013-2016 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 @@ -37,7 +37,7 @@ NS_CC_BEGIN namespace network { -/** +/** * @brief defines the object which users will receive at onHttpCompleted(sender, HttpResponse) callback. * Please refer to samples/TestCpp/Classes/ExtensionTest/NetworkTest/HttpClientTest.cpp as a sample. * @since v2.0.2. @@ -46,25 +46,25 @@ namespace network { class CC_DLL HttpResponse : public cocos2d::Ref { public: - /** + /** * Constructor, it's used by HttpClient internal, users don't need to create HttpResponse manually. * @param request the corresponding HttpRequest which leads to this response. */ HttpResponse(HttpRequest* request) + : _pHttpRequest(request) + , _succeed(false) + , _responseDataString("") { - _pHttpRequest = request; if (_pHttpRequest) { _pHttpRequest->retain(); } - _succeed = false; _responseData.clear(); _errorBuffer.clear(); - _responseDataString = ""; } - - /** + + /** * Destructor, it will be called in HttpClient internal. * Users don't need to destruct HttpResponse object manually. */ @@ -75,43 +75,43 @@ class CC_DLL HttpResponse : public cocos2d::Ref _pHttpRequest->release(); } } - - /** + + /** * Override autorelease method to prevent developers from calling it. * If this method is called , it would trigger CCASSERT. * @return cocos2d::Ref* always return nullptr. */ - cocos2d::Ref* autorelease(void) + cocos2d::Ref* autorelease() { CCASSERT(false, "HttpResponse is used between network thread and ui thread \ therefore, autorelease is forbidden here"); - return NULL; + return nullptr; } - + // getters, will be called by users - - /** + + /** * Get the corresponding HttpRequest object which leads to this response. * There's no paired setter for it, because it's already setted in class constructor * @return HttpRequest* the corresponding HttpRequest object which leads to this response. */ - inline HttpRequest* getHttpRequest() + inline HttpRequest* getHttpRequest() const { return _pHttpRequest; } - - /** + + /** * To see if the http request is returned successfully. * Although users can judge if (http response code = 200), we want an easier way. * If this getter returns false, you can call getResponseCode and getErrorBuffer to find more details. * @return bool the flag that represent whether the http request return successfully or not. */ - inline bool isSucceed() + inline bool isSucceed() const { return _succeed; }; - - /** + + /** * Get the http response data. * @return std::vector* the pointer that point to the _responseData. */ @@ -119,7 +119,7 @@ class CC_DLL HttpResponse : public cocos2d::Ref { return &_responseData; } - + /** * Get the response headers. * @return std::vector* the pointer that point to the _responseHeader. @@ -129,31 +129,31 @@ class CC_DLL HttpResponse : public cocos2d::Ref return &_responseHeader; } - /** + /** * Get the http response code to judge whether response is successful or not. * I know that you want to see the _responseCode is 200. * If _responseCode is not 200, you should check the meaning for _responseCode by the net. * @return long the value of _responseCode */ - inline long getResponseCode() + inline long getResponseCode() const { return _responseCode; } - /** + /** * Get the error buffer which will tell you more about the reason why http request failed. * @return const char* the pointer that point to _errorBuffer. */ - inline const char* getErrorBuffer() + inline const char* getErrorBuffer() const { return _errorBuffer.c_str(); } - + // setters, will be called by HttpClient // users should avoid invoking these methods - - - /** + + + /** * Set whether the http request is returned successfully or not, * This setter is mainly used in HttpClient, users mustn't set it directly * @param value the flag represent whether the http request is successful or not. @@ -161,10 +161,9 @@ class CC_DLL HttpResponse : public cocos2d::Ref inline void setSucceed(bool value) { _succeed = value; - }; - - - /** + } + + /** * Set the http response data buffer, it is used by HttpClient. * @param data the pointer point to the response data buffer. */ @@ -172,8 +171,8 @@ class CC_DLL HttpResponse : public cocos2d::Ref { _responseData = *data; } - - /** + + /** * Set the http response headers buffer, it is used by HttpClient. * @param data the pointer point to the response headers buffer. */ @@ -181,9 +180,9 @@ class CC_DLL HttpResponse : public cocos2d::Ref { _responseHeader = *data; } - - - /** + + + /** * Set the http response code. * @param value the http response code that represent whether the request is successful or not. */ @@ -191,9 +190,9 @@ class CC_DLL HttpResponse : public cocos2d::Ref { _responseCode = value; } - - - /** + + + /** * Set the error buffer which will tell you more the reason why http request failed. * @param value a string pointer that point to the reason. */ @@ -201,8 +200,8 @@ class CC_DLL HttpResponse : public cocos2d::Ref { _errorBuffer.clear(); _errorBuffer.assign(value); - }; - + } + /** * Set the response data by the string pointer and the defined size. * @param value a string pointer that point to response data buffer. @@ -213,28 +212,28 @@ class CC_DLL HttpResponse : public cocos2d::Ref _responseDataString.clear(); _responseDataString.assign(value, n); } - + /** * Get the string pointer that point to the response data. * @return const char* the string pointer that point to the response data. */ - inline const char* getResponseDataString() + inline const char* getResponseDataString() const { return _responseDataString.c_str(); } - + protected: bool initWithRequest(HttpRequest* request); - + // properties - HttpRequest* _pHttpRequest; /// the corresponding HttpRequest pointer who leads to this response + HttpRequest* _pHttpRequest; /// the corresponding HttpRequest pointer who leads to this response bool _succeed; /// to indicate if the http request is successful simply std::vector _responseData; /// the returned raw data. You can also dump it as a string std::vector _responseHeader; /// the returned raw header data. You can also dump it as a string long _responseCode; /// the status code returned from libcurl, e.g. 200, 404 std::string _errorBuffer; /// if _responseCode != 200, please read _errorBuffer to find the reason std::string _responseDataString; // the returned raw data. You can also dump it as a string - + }; } @@ -245,3 +244,4 @@ NS_CC_END /// @} #endif //__HTTP_RESPONSE_H__ + diff --git a/cocos/network/SocketIO.cpp b/cocos/network/SocketIO.cpp index 62cd82081300..a528e8f80380 100644 --- a/cocos/network/SocketIO.cpp +++ b/cocos/network/SocketIO.cpp @@ -1,6 +1,6 @@ /**************************************************************************** Copyright (c) 2015 Chris Hannon http://www.channon.us - Copyright (c) 2013-2015 Chukong Technologies Inc. + Copyright (c) 2013-2016 Chukong Technologies Inc. http://www.cocos2d-x.org @@ -27,14 +27,14 @@ ****************************************************************************/ -#include "network/SocketIO.h" +#include "SocketIO.h" #include #include #include #include "base/CCDirector.h" #include "base/CCScheduler.h" -#include "network/WebSocket.h" -#include "network/HttpClient.h" +#include "WebSocket.h" +#include "HttpClient.h" #include "json/rapidjson.h" #include "json/document.h" @@ -76,7 +76,7 @@ class SocketIOPacket std::vector getData()const{ return _args; }; virtual std::string stringify()const; - static SocketIOPacket * createPacketWithType(std::string type, SocketIOVersion version); + static SocketIOPacket * createPacketWithType(const std::string& type, SocketIOVersion version); static SocketIOPacket * createPacketWithTypeIndex(int type, SocketIOVersion version); protected: std::string _pId;//id message @@ -154,7 +154,7 @@ std::string SocketIOPacket::toString()const encoded << this->_separator; - if (_args.size() != 0) + if (!_args.empty()) { std::string ackpId = ""; // This is an acknowledgement packet, so, prepend the ack pid to the data @@ -171,7 +171,7 @@ std::string SocketIOPacket::toString()const int SocketIOPacket::typeAsNumber()const { std::string::size_type num = 0; - std::vector::const_iterator item = std::find(_types.begin(), _types.end(), _type); + auto item = std::find(_types.begin(), _types.end(), _type); if (item != _types.end()) { num = item - _types.begin(); @@ -251,7 +251,7 @@ SocketIOPacketV10x::SocketIOPacketV10x() int SocketIOPacketV10x::typeAsNumber()const { std::vector::size_type num = 0; - std::vector::const_iterator item = std::find(_typesMessage.begin(), _typesMessage.end(), _type); + auto item = std::find(_typesMessage.begin(), _typesMessage.end(), _type); if (item != _typesMessage.end()) {//it's a message num = item - _typesMessage.begin(); @@ -302,7 +302,7 @@ SocketIOPacketV10x::~SocketIOPacketV10x() _endpoint = ""; } -SocketIOPacket * SocketIOPacket::createPacketWithType(std::string type, SocketIOPacket::SocketIOVersion version) +SocketIOPacket * SocketIOPacket::createPacketWithType(const std::string& type, SocketIOPacket::SocketIOVersion version) { SocketIOPacket *ret; switch (version) @@ -355,7 +355,7 @@ class SIOClientImpl : public: SIOClientImpl(const std::string& host, int port); - virtual ~SIOClientImpl(void); + virtual ~SIOClientImpl(); static SIOClientImpl* create(const std::string& host, int port); @@ -681,19 +681,19 @@ void SIOClientImpl::send(const std::string& endpoint, const std::string& s) { switch (_version) { case SocketIOPacket::SocketIOVersion::V09x: - { - SocketIOPacket *packet = SocketIOPacket::createPacketWithType("message", _version); - packet->setEndpoint(endpoint); - packet->addData(s); - this->send(packet); - break; - } + { + SocketIOPacket *packet = SocketIOPacket::createPacketWithType("message", _version); + packet->setEndpoint(endpoint); + packet->addData(s); + this->send(packet); + break; + } case SocketIOPacket::SocketIOVersion::V10x: - { - this->emit(endpoint, "message", s); - break; - } - } + { + this->emit(endpoint, "message", s); + break; + } + } } void SIOClientImpl::send(SocketIOPacket *packet) @@ -935,7 +935,7 @@ void SIOClientImpl::onMessage(WebSocket* ws, const WebSocket::Data& data) std::string eventname = payload.substr(payloadFirstSlashPos + 1, payloadSecondSlashPos - payloadFirstSlashPos + 1); - + CCLOGINFO("event name %s between %i and %i", eventname.c_str(), payloadFirstSlashPos, payloadSecondSlashPos); @@ -986,6 +986,12 @@ void SIOClientImpl::onClose(WebSocket* ws) { iter->second->socketClosed(); } + // discard this client + _connected = false; + if (Director::getInstance()) + Director::getInstance()->getScheduler()->unscheduleAllForTarget(this); + + SocketIO::getInstance()->removeSocket(_uri); } this->release(); @@ -1009,7 +1015,7 @@ SIOClient::SIOClient(const std::string& host, int port, const std::string& path, } -SIOClient::~SIOClient(void) +SIOClient::~SIOClient() { if (_connected) { @@ -1096,7 +1102,7 @@ void SIOClient::fireEvent(const std::string& eventName, const std::string& data) CCLOGINFO("SIOClient::fireEvent no native event with name %s found", eventName.c_str()); } - + void SIOClient::setTag(const char* tag) { _tag = tag; @@ -1109,7 +1115,7 @@ SocketIO::SocketIO() { } -SocketIO::~SocketIO(void) +SocketIO::~SocketIO() { } @@ -1199,24 +1205,24 @@ SIOClient* SocketIO::connect(const std::string& uri, SocketIO::SIODelegate& dele socket->addClient(path, c); socket->connectToEndpoint(path); - }else{ - CCLOG("SocketIO: disconnect previous client"); - c->disconnect(); - - CCLOG("SocketIO: recreate a new socket, new client, connect"); - SIOClientImpl* newSocket = nullptr; - SIOClient *newC = nullptr; - - newSocket = SIOClientImpl::create(host, port); - - newC = new (std::nothrow) SIOClient(host, port, path, newSocket, delegate); - - newSocket->addClient(path, newC); - - newSocket->connect(); - - return newC; - } + } + else + { + CCLOG("SocketIO: disconnect previous client"); + c->disconnect(); + + CCLOG("SocketIO: recreate a new socket, new client, connect"); + SIOClientImpl* newSocket = nullptr; + SIOClient *newC = nullptr; + + newSocket = SIOClientImpl::create(host, port); + newC = new (std::nothrow) SIOClient(host, port, path, newSocket, delegate); + + newSocket->addClient(path, newC); + newSocket->connect(); + + return newC; + } } return c; @@ -1240,3 +1246,4 @@ void SocketIO::removeSocket(const std::string& uri) } NS_CC_END + diff --git a/cocos/network/SocketIO.h b/cocos/network/SocketIO.h index 98df9318d020..dc928d58d2c0 100644 --- a/cocos/network/SocketIO.h +++ b/cocos/network/SocketIO.h @@ -1,6 +1,6 @@ /**************************************************************************** Copyright (c) 2015 Chris Hannon http://www.channon.us - Copyright (c) 2013-2015 Chukong Technologies Inc. + Copyright (c) 2013-2016 Chukong Technologies Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -104,7 +104,7 @@ class CC_DLL SocketIO virtual ~SIODelegate() {} /** * This is kept for backwards compatibility, connect is now fired as a socket.io event "connect" - * + * * This function would be called when the related SIOClient object receive messages that mean it have connected to endpoint successfully. * * @param client the connected SIOClient object. @@ -165,7 +165,7 @@ class CC_DLL SocketIO private: SocketIO(); - virtual ~SocketIO(void); + virtual ~SocketIO(); static SocketIO *_inst; @@ -225,7 +225,7 @@ class CC_DLL SIOClient /** * Destructor of SIOClient class. */ - virtual ~SIOClient(void); + virtual ~SIOClient(); /** * Get the delegate for the client @@ -256,14 +256,14 @@ class CC_DLL SIOClient * @param e the callback function. */ void on(const std::string& eventName, SIOEvent e); - + /** * Set tag of SIOClient. * The tag is used to distinguish the various SIOClient objects. * @param tag string object. */ void setTag(const char* tag); - + /** * Get tag of SIOClient. * @return const char* the pointer point to the _tag. @@ -283,3 +283,4 @@ NS_CC_END /// @} #endif /* defined(__CC_JSB_SOCKETIO_H__) */ + diff --git a/cocos/network/WebSocket.cpp b/cocos/network/WebSocket.cpp index 917804e33e74..431d0acd60b2 100644 --- a/cocos/network/WebSocket.cpp +++ b/cocos/network/WebSocket.cpp @@ -1,6 +1,6 @@ /**************************************************************************** Copyright (c) 2010-2012 cocos2d-x.org - Copyright (c) 2013-2014 Chukong Technologies Inc. + Copyright (c) 2013-2016 Chukong Technologies Inc. http://www.cocos2d-x.org @@ -27,7 +27,7 @@ ****************************************************************************/ -#include "network/WebSocket.h" +#include "WebSocket.h" #include "base/CCDirector.h" #include "base/CCScheduler.h" #include "base/CCEventDispatcher.h" diff --git a/cocos/network/WebSocket.h b/cocos/network/WebSocket.h index 4086c5451f3f..5cda9ed46c5c 100644 --- a/cocos/network/WebSocket.h +++ b/cocos/network/WebSocket.h @@ -1,6 +1,6 @@ /**************************************************************************** Copyright (c) 2010-2012 cocos2d-x.org - Copyright (c) 2013-2014 Chukong Technologies Inc. + Copyright (c) 2013-2016 Chukong Technologies Inc. http://www.cocos2d-x.org @@ -51,7 +51,6 @@ struct lws_protocols; NS_CC_BEGIN class EventListenerCustom; - namespace network { class WsThreadHelper; @@ -68,7 +67,7 @@ class CC_DLL WebSocket * @note This method has to be invoked on Cocos Thread */ static void closeAllConnections(); - + /** * Constructor of WebSocket. * @@ -130,7 +129,7 @@ class CC_DLL WebSocket /** * This function to be called after the client connection complete a handshake with the remote server. * This means that the WebSocket connection is ready to send and receive data. - * + * * @param ws The WebSocket object connected */ virtual void onOpen(WebSocket* ws) = 0; @@ -175,7 +174,7 @@ class CC_DLL WebSocket /** * @brief Sends string data to websocket server. - * + * * @param message string data. * @lua sendstring */ @@ -183,7 +182,7 @@ class CC_DLL WebSocket /** * @brief Sends binary data to websocket server. - * + * * @param binaryMsg binary string data. * @param len the size of binary string data. * @lua sendstring @@ -191,15 +190,15 @@ class CC_DLL WebSocket void send(const unsigned char* binaryMsg, unsigned int len); /** - * @brief Closes the connection to server synchronously. - * @note It's a synchronous method, it will not return until websocket thread exits. + * @brief Closes the connection to server synchronously. + * @note It's a synchronous method, it will not return until websocket thread exits. */ void close(); - + /** * @brief Closes the connection to server asynchronously. * @note It's an asynchronous method, it just notifies websocket thread to exit and returns directly, - * If using 'closeAsync' to close websocket connection, + * If using 'closeAsync' to close websocket connection, * be carefull of not using destructed variables in the callback of 'onClose'. */ void closeAsync(); @@ -254,3 +253,4 @@ NS_CC_END /// @} #endif /* defined(__CC_JSB_WEBSOCKET_H__) */ + From 25fea656c7d102a38e31fb9541c3e309ac549e8e Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 18 May 2016 15:45:46 +0800 Subject: [PATCH 139/241] update deps to support IPv6 only network --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index 5bf17af67c8c..41f0749df93d 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version":"v3-deps-93", + "version":"v3-deps-94", "zip_file_size":"128440074", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", From c4e6db4e9bc52fcb7905c5e3aa7a1839e3360d76 Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Wed, 18 May 2016 16:26:13 +0800 Subject: [PATCH 140/241] fix tizen related issues --- cocos/ui/UIVideoPlayer-tizen.cpp | 23 +++++++++++++------ tests/cpp-tests/Classes/NodeTest/NodeTest.cpp | 5 ++++ tests/cpp-tests/Classes/NodeTest/NodeTest.h | 1 + 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/cocos/ui/UIVideoPlayer-tizen.cpp b/cocos/ui/UIVideoPlayer-tizen.cpp index ed8c3c0eb12c..86f6f17aebdc 100644 --- a/cocos/ui/UIVideoPlayer-tizen.cpp +++ b/cocos/ui/UIVideoPlayer-tizen.cpp @@ -298,7 +298,6 @@ void VideoPlayer::play() { player_set_display_mode(impl->_player, PLAYER_DISPLAY_MODE_FULL_SCREEN); } - player_set_display_visible(impl->_player, true); player_set_completed_cb(impl->_player, _player_completed_cb, this); player_set_interrupted_cb(impl->_player, _player_interrupted_cb, this); @@ -309,6 +308,7 @@ void VideoPlayer::play() { this->onPlayEvent((int)VideoPlayer::EventType::PLAYING); } + this->setVisible(true); } } @@ -368,24 +368,33 @@ bool VideoPlayer::isPlaying() const void VideoPlayer::onEnter() { Widget::onEnter(); - this->setVisible(false); + if (isVisible()) + { + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + player_set_display_visible(impl->_player, true); + } } void VideoPlayer::onExit() { Widget::onExit(); - this->setVisible(true); + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; + player_set_display_visible(impl->_player, false); } void VideoPlayer::setVisible(bool visible) { cocos2d::ui::Widget::setVisible(visible); + _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; - if (! _videoURL.empty()) + if (!visible) { - _VideoPlayerTizen* impl = (_VideoPlayerTizen*)_videoView; - player_set_display_visible(impl->_player, visible); - } + player_set_display_visible(impl->_player, false); + } + else if(isRunning()) + { + player_set_display_visible(impl->_player, true); + } } void VideoPlayer::addEventListener(const VideoPlayer::ccVideoPlayerCallback& callback) diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp index d595e5189c40..deca07c968b3 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.cpp @@ -1262,6 +1262,11 @@ void NodeNameTest::onEnter() this->scheduleOnce(CC_CALLBACK_1(NodeNameTest::test, this), 0.05f, "test_key"); } +void NodeNameTest::onExit() +{ + TestCocosNodeDemo::onExit(); +} + void NodeNameTest::test(float dt) { auto parent = Node::create(); diff --git a/tests/cpp-tests/Classes/NodeTest/NodeTest.h b/tests/cpp-tests/Classes/NodeTest/NodeTest.h index 66b3b6455856..7124f7a70843 100644 --- a/tests/cpp-tests/Classes/NodeTest/NodeTest.h +++ b/tests/cpp-tests/Classes/NodeTest/NodeTest.h @@ -325,6 +325,7 @@ class NodeNameTest : public TestCocosNodeDemo virtual std::string subtitle() const override; virtual void onEnter() override; + virtual void onExit() override; void test(float dt); }; From ecf181036a384f0d284fcadba5f3388c1089e7bf Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 18 May 2016 16:44:06 +0800 Subject: [PATCH 141/241] remove unneeded files --- .../proj.android/build_native.py | 43 ----- .../runtime-src/proj.android/build_native.py | 174 ------------------ 2 files changed, 217 deletions(-) delete mode 100755 templates/cpp-template-default/proj.android/build_native.py delete mode 100755 templates/js-template-default/frameworks/runtime-src/proj.android/build_native.py diff --git a/templates/cpp-template-default/proj.android/build_native.py b/templates/cpp-template-default/proj.android/build_native.py deleted file mode 100755 index 4c4026544a4d..000000000000 --- a/templates/cpp-template-default/proj.android/build_native.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/python -# build_native.py -# Build native codes -# -# Please use cocos console instead - - -import sys -import os, os.path -import shutil -from optparse import OptionParser - -def build(build_mode): - - - current_dir = os.path.dirname(os.path.realpath(__file__)) - cocos_root = os.path.join(current_dir, "../cocos2d") - - app_android_root = os.path.join(current_dir, "../") - - if build_mode is None: - build_mode = 'debug' - elif build_mode != 'release': - build_mode = 'debug' - - command = 'cocos compile -p android -s %s -m %s' % (app_android_root, build_mode) - if os.system(command) != 0: - raise Exception("Build dynamic library for project [ " + app_android_root + " ] fails!") - -# -------------- main -------------- -if __name__ == '__main__': - - parser = OptionParser() - parser.add_option("-n", "--ndk", dest="ndk_build_param", help='it is not used', action="append") - parser.add_option("-p", "--platform", dest="android_platform", - help='it is not used') - parser.add_option("-b", "--build", dest="build_mode", - help='the build mode for java project,debug[default] or release.Get more information,please refer to http://developer.android.com/tools/building/building-cmdline.html') - (opts, args) = parser.parse_args() - - print "Please use cocos console instead.\n" - - build(opts.build_mode) diff --git a/templates/js-template-default/frameworks/runtime-src/proj.android/build_native.py b/templates/js-template-default/frameworks/runtime-src/proj.android/build_native.py deleted file mode 100755 index 576b43e3ef3a..000000000000 --- a/templates/js-template-default/frameworks/runtime-src/proj.android/build_native.py +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/python - -''' -build_native.py - -This script will copy resources to assets and build native code with NDK. -''' -import sys -import os, os.path -import shutil -from optparse import OptionParser - -def get_num_of_cpu(): - ''' The build process can be accelerated by running multiple concurrent job processes using the -j-option. - ''' - try: - platform = sys.platform - if platform == 'win32': - if 'NUMBER_OF_PROCESSORS' in os.environ: - return int(os.environ['NUMBER_OF_PROCESSORS']) - else: - return 1 - else: - from numpy.distutils import cpuinfo - return cpuinfo.cpu._getNCPUs() - except Exception: - print "Can't know cpuinfo, use default 1 cpu" - return 1 - -def check_environment_variables(): - ''' Checking the environment NDK_ROOT, which will be used for building - ''' - - try: - NDK_ROOT = os.environ['NDK_ROOT'] - except Exception: - print "NDK_ROOT not defined. Please define NDK_ROOT in your environment" - sys.exit(1) - - return NDK_ROOT - -def select_toolchain_version(ndk_root): - ret_version = "4.8" - - version_file_path = os.path.join(ndk_root, "RELEASE.TXT") - try: - versionFile = open(version_file_path) - lines = versionFile.readlines() - versionFile.close() - - version_num = None - version_char = None - pattern = r'^[a-zA-Z]+(\d+)(\w)' - for line in lines: - str_line = line.lstrip() - match = re.match(pattern, str_line) - if match: - version_num = int(match.group(1)) - version_char = match.group(2) - break - - if version_num is None: - print("Parse NDK version from file %s failed." % version_file_path) - else: - version_char = version_char.lower() - if version_num > 10 or (version_num == 10 and cmp(version_char, 'c') >= 0): - ret_version = "4.9" - - except: - print("Parse NDK version from file %s failed." % version_file_path) - - print("NDK_TOOLCHAIN_VERSION: %s" % ret_version) - if ret_version == "4.8": - print( - "Your application may crash when using c++ 11 regular expression with NDK_TOOLCHAIN_VERSION %s" % ret_version) - - return ret_version - -def do_build(cocos_root, ndk_root, app_android_root, ndk_build_param,sdk_root,build_mode): - - ndk_path = os.path.join(ndk_root, "ndk-build") - ndk_toolchain_version = select_toolchain_version(ndk_root) - - # windows should use ";" to seperate module paths - platform = sys.platform - if platform == 'win32': - ndk_module_path = 'NDK_MODULE_PATH=%s/..;%s;%s/external;%s/cocos NDK_TOOLCHAIN_VERSION=%s' % (cocos_root, cocos_root, cocos_root, cocos_root, ndk_toolchain_version) - else: - ndk_module_path = 'NDK_MODULE_PATH=%s/..:%s:%s/external:%s/cocos NDK_TOOLCHAIN_VERSION=%s' % (cocos_root, cocos_root, cocos_root, cocos_root, ndk_toolchain_version) - - num_of_cpu = get_num_of_cpu() - if ndk_build_param == None: - command = '%s -j%d -C %s NDK_DEBUG=%d %s' % (ndk_path, num_of_cpu, app_android_root, build_mode=='debug', ndk_module_path) - else: - command = '%s -j%d -C %s NDK_DEBUG=%d %s %s' % (ndk_path, num_of_cpu, app_android_root, build_mode=='debug', ndk_build_param, ndk_module_path) - print command - if os.system(command) != 0: - raise Exception("Build dynamic library for project [ " + app_android_root + " ] fails!") - -def copy_files(src, dst): - - for item in os.listdir(src): - path = os.path.join(src, item) - # Android can not package the file that ends with ".gz" - if not item.startswith('.') and not item.endswith('.gz') and os.path.isfile(path): - shutil.copy(path, dst) - if os.path.isdir(path): - new_dst = os.path.join(dst, item) - os.mkdir(new_dst) - copy_files(path, new_dst) - -def copy_resources(app_android_root): - - # remove app_android_root/assets if it exists - assets_dir = os.path.join(app_android_root, "assets") - if os.path.isdir(assets_dir): - shutil.rmtree(assets_dir) - - # copy resources - os.mkdir(assets_dir) - - assets_res_dir = assets_dir + "/res"; - assets_scripts_dir = assets_dir + "/src"; - assets_jsb_dir = assets_dir + "/script"; - os.mkdir(assets_res_dir); - os.mkdir(assets_scripts_dir); - os.mkdir(assets_jsb_dir); - - - shutil.copy(os.path.join(app_android_root, "../../../main.js"), assets_dir) - shutil.copy(os.path.join(app_android_root, "../../../project.json"), assets_dir) - - resources_dir = os.path.join(app_android_root, "../../../res") - copy_files(resources_dir, assets_res_dir) - - resources_dir = os.path.join(app_android_root, "../../../src") - copy_files(resources_dir, assets_scripts_dir) - - resources_dir = os.path.join(app_android_root, "../../../frameworks/cocos2d-x/cocos/js-bindings/bindings/script") - copy_files(resources_dir, assets_jsb_dir) - -def build(targets,ndk_build_param,build_mode): - - ndk_root = check_environment_variables() - sdk_root = None - - project_root = os.path.dirname(os.path.realpath(__file__)) - cocos_root = os.path.join(project_root, "..", "..", "cocos2d-x") - - print cocos_root - - if build_mode is None: - build_mode = 'debug' - elif build_mode != 'release': - build_mode = 'debug' - - copy_resources(project_root) - do_build(cocos_root, ndk_root, project_root,ndk_build_param,sdk_root,build_mode) - -# -------------- main -------------- -if __name__ == '__main__': - - parser = OptionParser() - parser.add_option("-n", "--ndk", dest="ndk_build_param", - help='Parameter for ndk-build') - parser.add_option("-b", "--build", dest="build_mode", - help='The build mode for NDK project, debug or release') - (opts, args) = parser.parse_args() - - try: - build(args, opts.ndk_build_param,opts.build_mode) - except Exception as e: - print e - sys.exit(1) From 36113f507e1a84534c915925a784e91d3dcbd179 Mon Sep 17 00:00:00 2001 From: fusijie Date: Wed, 18 May 2016 22:25:43 +0800 Subject: [PATCH 142/241] add comments for ps. --- cocos/2d/CCParticleSystem.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cocos/2d/CCParticleSystem.cpp b/cocos/2d/CCParticleSystem.cpp index 0cd468f232d3..b520ab744a46 100644 --- a/cocos/2d/CCParticleSystem.cpp +++ b/cocos/2d/CCParticleSystem.cpp @@ -932,6 +932,12 @@ void ParticleSystem::update(float dt) } else { + //Why use so many for-loop separately instead of putting them together? + //When the processor needs to read from or write to a location in memory, + //it first checks whether a copy of that data is in the cache. + //And every property's memory of the particle system is continuous, + //for the purpose of improving cache hit rate, we should process only one property in one for-loop AFAP. + //It was proved to be effective especially for low-end machine. for (int i = 0; i < _particleCount; ++i) { _particleData.modeB.angle[i] += _particleData.modeB.degreesPerSecond[i] * dt; From 03be0de2fa9965e920abf8b9ab9b8210e4310c73 Mon Sep 17 00:00:00 2001 From: mogemimi Date: Thu, 19 May 2016 01:40:00 +0900 Subject: [PATCH 143/241] Remove unnecessary trailing semicolons --- cocos/audio/linux/AudioEngine-linux.cpp | 40 ++++++++++---------- cocos/audio/linux/SimpleAudioEngine.cpp | 50 ++++++++++++------------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/cocos/audio/linux/AudioEngine-linux.cpp b/cocos/audio/linux/AudioEngine-linux.cpp index 5b8e2a7ca64f..d95f9edf04e8 100644 --- a/cocos/audio/linux/AudioEngine-linux.cpp +++ b/cocos/audio/linux/AudioEngine-linux.cpp @@ -42,7 +42,7 @@ FMOD_RESULT F_CALLBACK channelCallback(FMOD_CHANNELCONTROL *channelcontrol, AudioEngineImpl::AudioEngineImpl(){ -}; +} AudioEngineImpl::~AudioEngineImpl(){ FMOD_RESULT result; @@ -50,7 +50,7 @@ AudioEngineImpl::~AudioEngineImpl(){ ERRCHECKWITHEXIT(result); result = pSystem->release(); ERRCHECKWITHEXIT(result); -}; +} bool AudioEngineImpl::init(){ @@ -76,7 +76,7 @@ bool AudioEngineImpl::init(){ g_AudioEngineImpl = this; return true; -}; +} int AudioEngineImpl::play2d(const std::string &fileFullPath ,bool loop ,float volume){ int id = preload(fileFullPath, nullptr); @@ -88,7 +88,7 @@ int AudioEngineImpl::play2d(const std::string &fileFullPath ,bool loop ,float vo resume(id); } return id; -}; +} void AudioEngineImpl::setVolume(int audioID,float volume){ try{ @@ -96,7 +96,7 @@ void AudioEngineImpl::setVolume(int audioID,float volume){ }catch(const std::out_of_range& oor){ printf("AudioEngineImpl::setVolume: invalid audioID: %d\n", audioID); } -}; +} void AudioEngineImpl::setLoop(int audioID, bool loop){ try{ @@ -104,7 +104,7 @@ void AudioEngineImpl::setLoop(int audioID, bool loop){ }catch(const std::out_of_range& oor){ printf("AudioEngineImpl::setLoop: invalid audioID: %d\n", audioID); } -}; +} bool AudioEngineImpl::pause(int audioID){ try{ @@ -115,7 +115,7 @@ bool AudioEngineImpl::pause(int audioID){ printf("AudioEngineImpl::pause: invalid audioID: %d\n", audioID); return false; } -}; +} bool AudioEngineImpl::resume(int audioID){ try{ @@ -143,7 +143,7 @@ try{ printf("AudioEngineImpl::resume: invalid audioID: %d\n", audioID); return false; } -}; +} bool AudioEngineImpl::stop(int audioID){ try{ @@ -154,7 +154,7 @@ bool AudioEngineImpl::stop(int audioID){ printf("AudioEngineImpl::stop: invalid audioID: %d\n", audioID); return false; } -}; +} void AudioEngineImpl::stopAll(){ for (auto it = mapChannelInfo.begin(); it != mapChannelInfo.end(); ++it) { @@ -162,7 +162,7 @@ void AudioEngineImpl::stopAll(){ audioRef.channel->stop(); audioRef.channel = nullptr; } -}; +} float AudioEngineImpl::getDuration(int audioID){ try{ @@ -176,7 +176,7 @@ float AudioEngineImpl::getDuration(int audioID){ printf("AudioEngineImpl::getDuration: invalid audioID: %d\n", audioID); return AudioEngine::TIME_UNKNOWN; } -}; +} float AudioEngineImpl::getCurrentTime(int audioID){ try{ @@ -189,7 +189,7 @@ float AudioEngineImpl::getCurrentTime(int audioID){ printf("AudioEngineImpl::getCurrentTime: invalid audioID: %d\n", audioID); return AudioEngine::TIME_UNKNOWN; } -}; +} bool AudioEngineImpl::setCurrentTime(int audioID, float time){ try{ @@ -199,7 +199,7 @@ bool AudioEngineImpl::setCurrentTime(int audioID, float time){ }catch(const std::out_of_range& oor){ printf("AudioEngineImpl::setCurrentTime: invalid audioID: %d\n", audioID); } -}; +} void AudioEngineImpl::setFinishCallback(int audioID, const std::function &callback){ try{ @@ -210,7 +210,7 @@ void AudioEngineImpl::setFinishCallback(int audioID, const std::function callback){ @@ -282,12 +282,12 @@ int AudioEngineImpl::preload(const std::string& filePath, std::functionupdate(); -}; +} FMOD::Sound * AudioEngineImpl::findSound(const std::string &path){ @@ -303,4 +303,4 @@ FMOD::Channel * AudioEngineImpl::getChannel(FMOD::Sound *sound){ sound->getUserData(&data); id = (size_t) data; return mapChannelInfo[id].channel; -}; +} diff --git a/cocos/audio/linux/SimpleAudioEngine.cpp b/cocos/audio/linux/SimpleAudioEngine.cpp index e63f9a40d0c7..29f6859d32a2 100644 --- a/cocos/audio/linux/SimpleAudioEngine.cpp +++ b/cocos/audio/linux/SimpleAudioEngine.cpp @@ -24,7 +24,7 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ g_SimpleAudioEngineLinux->engine = new SimpleAudioEngine(); } return g_SimpleAudioEngineLinux->engine; -}; +} void SimpleAudioEngine::end(){ if(g_SimpleAudioEngineLinux){ @@ -32,54 +32,54 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ delete g_SimpleAudioEngineLinux; } g_SimpleAudioEngineLinux = nullptr; - }; + } SimpleAudioEngine::SimpleAudioEngine(){ g_SimpleAudioEngineLinux->musicid = -1; g_SimpleAudioEngineLinux->effectsvolume = 1.0f; - }; + } SimpleAudioEngine::~SimpleAudioEngine(){ - }; + } void SimpleAudioEngine::preloadBackgroundMusic(const char* filePath){ g_SimpleAudioEngineLinux->musicpath = filePath; AudioEngine::preload(filePath); - }; + } void SimpleAudioEngine::playBackgroundMusic(const char* filePath, bool loop){ g_SimpleAudioEngineLinux->musicpath = filePath; g_SimpleAudioEngineLinux->musicid = AudioEngine::play2d(filePath, loop); - }; + } void SimpleAudioEngine::stopBackgroundMusic(bool releaseData){ AudioEngine::stop(g_SimpleAudioEngineLinux->musicid); if(releaseData){ AudioEngine::uncache(g_SimpleAudioEngineLinux->musicpath.c_str()); } - }; + } void SimpleAudioEngine::pauseBackgroundMusic(){ AudioEngine::pause(g_SimpleAudioEngineLinux->musicid); - }; + } void SimpleAudioEngine::resumeBackgroundMusic(){ AudioEngine::resume(g_SimpleAudioEngineLinux->musicid); - }; + } void SimpleAudioEngine::rewindBackgroundMusic(){ AudioEngine::setCurrentTime(g_SimpleAudioEngineLinux->musicid, 0); - }; + } bool SimpleAudioEngine::willPlayBackgroundMusic(){ return g_SimpleAudioEngineLinux->musicid != -1; - }; + } bool SimpleAudioEngine::isBackgroundMusicPlaying(){ return AudioEngine::getState(g_SimpleAudioEngineLinux->musicid) == AudioEngine::AudioState::PLAYING; - }; + } // // properties @@ -92,7 +92,7 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ */ float SimpleAudioEngine::getBackgroundMusicVolume(){ return AudioEngine::getVolume(g_SimpleAudioEngineLinux->musicid); - }; + } /** * Set the volume of background music. @@ -103,14 +103,14 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ */ void SimpleAudioEngine::setBackgroundMusicVolume(float volume){ AudioEngine::setVolume(g_SimpleAudioEngineLinux->musicid, volume); - }; + } /** * The volume of the effects within the range of 0.0 as the minimum and 1.0 as the maximum. */ float SimpleAudioEngine::getEffectsVolume(){ return g_SimpleAudioEngineLinux->effectsvolume; - }; + } /** * Set the volume of sound effects. @@ -119,7 +119,7 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ */ void SimpleAudioEngine::setEffectsVolume(float volume){ g_SimpleAudioEngineLinux->effectsvolume = volume; - }; + } /** * Play sound effect with a file path, pitch, pan and gain. @@ -137,7 +137,7 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ */ unsigned int SimpleAudioEngine::playEffect(const char* filePath, bool loop, float pitch, float pan, float gain){ return AudioEngine::play2d(filePath, loop, gain); - }; + } /** * Pause playing sound effect. @@ -146,14 +146,14 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ */ void SimpleAudioEngine::pauseEffect(unsigned int soundId){ AudioEngine::pause(soundId); - }; + } /** * Pause all playing sound effect. */ void SimpleAudioEngine::pauseAllEffects(){ AudioEngine::pauseAll(); - }; + } /** * Resume playing sound effect. @@ -162,14 +162,14 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ */ void SimpleAudioEngine::resumeEffect(unsigned int soundId){ AudioEngine::resume(soundId); - }; + } /** * Resume all playing sound effect. */ void SimpleAudioEngine::resumeAllEffects(){ AudioEngine::resumeAll(); - }; + } /** * Stop playing sound effect. @@ -178,14 +178,14 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ */ void SimpleAudioEngine::stopEffect(unsigned int soundId){ AudioEngine::stop(soundId); - }; + } /** * Stop all playing sound effects. */ void SimpleAudioEngine::stopAllEffects(){ AudioEngine::stopAll(); - }; + } /** * Preload a compressed audio file. @@ -197,7 +197,7 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ */ void SimpleAudioEngine::preloadEffect(const char* filePath){ AudioEngine::preload(filePath); - }; + } /** * Unload the preloaded effect from internal buffer. @@ -206,6 +206,6 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ */ void SimpleAudioEngine::unloadEffect(const char* filePath){ AudioEngine::uncache(filePath); - }; + } \ No newline at end of file From 3a80e7d8fbf6a3d69474ca84eba06034b40c799a Mon Sep 17 00:00:00 2001 From: mogemimi Date: Thu, 19 May 2016 03:34:04 +0900 Subject: [PATCH 144/241] Change 2 spaces to 4 spaces indentation --- cocos/audio/linux/AudioEngine-linux.cpp | 346 ++++++++++++------------ cocos/audio/linux/SimpleAudioEngine.cpp | 196 +++++++------- 2 files changed, 271 insertions(+), 271 deletions(-) diff --git a/cocos/audio/linux/AudioEngine-linux.cpp b/cocos/audio/linux/AudioEngine-linux.cpp index d95f9edf04e8..f3e947243463 100644 --- a/cocos/audio/linux/AudioEngine-linux.cpp +++ b/cocos/audio/linux/AudioEngine-linux.cpp @@ -33,7 +33,7 @@ FMOD_RESULT F_CALLBACK channelCallback(FMOD_CHANNELCONTROL *channelcontrol, void *commandData1, void *commandData2) { - if(controltype == FMOD_CHANNELCONTROL_CHANNEL && callbacktype == FMOD_CHANNELCONTROL_CALLBACK_END){ + if(controltype == FMOD_CHANNELCONTROL_CHANNEL && callbacktype == FMOD_CHANNELCONTROL_CALLBACK_END){ g_AudioEngineImpl->onSoundFinished((FMOD::Channel *)channelcontrol); }else{ } @@ -45,262 +45,262 @@ AudioEngineImpl::AudioEngineImpl(){ } AudioEngineImpl::~AudioEngineImpl(){ - FMOD_RESULT result; - result = pSystem->close(); - ERRCHECKWITHEXIT(result); - result = pSystem->release(); - ERRCHECKWITHEXIT(result); + FMOD_RESULT result; + result = pSystem->close(); + ERRCHECKWITHEXIT(result); + result = pSystem->release(); + ERRCHECKWITHEXIT(result); } bool AudioEngineImpl::init(){ - FMOD_RESULT result; - /* - Create a System object and initialize. - */ - result = FMOD::System_Create(&pSystem); - ERRCHECKWITHEXIT(result); + FMOD_RESULT result; + /* + Create a System object and initialize. + */ + result = FMOD::System_Create(&pSystem); + ERRCHECKWITHEXIT(result); - result = pSystem->setOutput(FMOD_OUTPUTTYPE_PULSEAUDIO); - ERRCHECKWITHEXIT(result); + result = pSystem->setOutput(FMOD_OUTPUTTYPE_PULSEAUDIO); + ERRCHECKWITHEXIT(result); - result = pSystem->init(32, FMOD_INIT_NORMAL, 0); - ERRCHECKWITHEXIT(result); + result = pSystem->init(32, FMOD_INIT_NORMAL, 0); + ERRCHECKWITHEXIT(result); - mapChannelInfo.clear(); - mapSound.clear(); + mapChannelInfo.clear(); + mapSound.clear(); - auto scheduler = cocos2d::Director::getInstance()->getScheduler(); - scheduler->schedule(schedule_selector(AudioEngineImpl::update), this, 0.05f, false); + auto scheduler = cocos2d::Director::getInstance()->getScheduler(); + scheduler->schedule(schedule_selector(AudioEngineImpl::update), this, 0.05f, false); - g_AudioEngineImpl = this; + g_AudioEngineImpl = this; - return true; + return true; } int AudioEngineImpl::play2d(const std::string &fileFullPath ,bool loop ,float volume){ - int id = preload(fileFullPath, nullptr); - if(id >= 0){ - mapChannelInfo[id].loop=loop; - mapChannelInfo[id].channel->setPaused(true); - mapChannelInfo[id].volume = volume; - AudioEngine::_audioIDInfoMap[id].state = AudioEngine::AudioState::PAUSED; - resume(id); - } - return id; + int id = preload(fileFullPath, nullptr); + if(id >= 0){ + mapChannelInfo[id].loop=loop; + mapChannelInfo[id].channel->setPaused(true); + mapChannelInfo[id].volume = volume; + AudioEngine::_audioIDInfoMap[id].state = AudioEngine::AudioState::PAUSED; + resume(id); + } + return id; } void AudioEngineImpl::setVolume(int audioID,float volume){ - try{ - mapChannelInfo[audioID].channel->setVolume(volume); - }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::setVolume: invalid audioID: %d\n", audioID); - } + try{ + mapChannelInfo[audioID].channel->setVolume(volume); + }catch(const std::out_of_range& oor){ + printf("AudioEngineImpl::setVolume: invalid audioID: %d\n", audioID); + } } void AudioEngineImpl::setLoop(int audioID, bool loop){ - try{ - mapChannelInfo[audioID].channel->setLoopCount(loop?-1:0); - }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::setLoop: invalid audioID: %d\n", audioID); - } + try{ + mapChannelInfo[audioID].channel->setLoopCount(loop?-1:0); + }catch(const std::out_of_range& oor){ + printf("AudioEngineImpl::setLoop: invalid audioID: %d\n", audioID); + } } bool AudioEngineImpl::pause(int audioID){ - try{ - mapChannelInfo[audioID].channel->setPaused(true); - AudioEngine::_audioIDInfoMap[audioID].state = AudioEngine::AudioState::PAUSED; - return true; - }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::pause: invalid audioID: %d\n", audioID); - return false; - } + try{ + mapChannelInfo[audioID].channel->setPaused(true); + AudioEngine::_audioIDInfoMap[audioID].state = AudioEngine::AudioState::PAUSED; + return true; + }catch(const std::out_of_range& oor){ + printf("AudioEngineImpl::pause: invalid audioID: %d\n", audioID); + return false; + } } bool AudioEngineImpl::resume(int audioID){ -try{ - - if(!mapChannelInfo[audioID].channel){ - FMOD::Channel *channel = nullptr; - FMOD::ChannelGroup *channelgroup = nullptr; - //starts the sound in pause mode, use the channel to unpause - FMOD_RESULT result = pSystem->playSound(mapChannelInfo[audioID].sound, channelgroup, true, &channel); - if(ERRCHECK(result)){ - return false; - } - channel->setMode(mapChannelInfo[audioID].loop?FMOD_LOOP_NORMAL:FMOD_LOOP_OFF); - channel->setLoopCount(mapChannelInfo[audioID].loop?-1:0); - channel->setVolume(mapChannelInfo[audioID].volume); - channel->setUserData((void *)mapChannelInfo[audioID].id); - mapChannelInfo[audioID].channel = channel; - } + try{ + + if(!mapChannelInfo[audioID].channel){ + FMOD::Channel *channel = nullptr; + FMOD::ChannelGroup *channelgroup = nullptr; + //starts the sound in pause mode, use the channel to unpause + FMOD_RESULT result = pSystem->playSound(mapChannelInfo[audioID].sound, channelgroup, true, &channel); + if(ERRCHECK(result)){ + return false; + } + channel->setMode(mapChannelInfo[audioID].loop?FMOD_LOOP_NORMAL:FMOD_LOOP_OFF); + channel->setLoopCount(mapChannelInfo[audioID].loop?-1:0); + channel->setVolume(mapChannelInfo[audioID].volume); + channel->setUserData((void *)mapChannelInfo[audioID].id); + mapChannelInfo[audioID].channel = channel; + } - mapChannelInfo[audioID].channel->setPaused(false); - AudioEngine::_audioIDInfoMap[audioID].state = AudioEngine::AudioState::PLAYING; + mapChannelInfo[audioID].channel->setPaused(false); + AudioEngine::_audioIDInfoMap[audioID].state = AudioEngine::AudioState::PLAYING; - return true; - }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::resume: invalid audioID: %d\n", audioID); - return false; - } + return true; + }catch(const std::out_of_range& oor){ + printf("AudioEngineImpl::resume: invalid audioID: %d\n", audioID); + return false; + } } bool AudioEngineImpl::stop(int audioID){ - try{ - mapChannelInfo[audioID].channel->stop(); - mapChannelInfo[audioID].channel = nullptr; - return true; - }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::stop: invalid audioID: %d\n", audioID); - return false; - } + try{ + mapChannelInfo[audioID].channel->stop(); + mapChannelInfo[audioID].channel = nullptr; + return true; + }catch(const std::out_of_range& oor){ + printf("AudioEngineImpl::stop: invalid audioID: %d\n", audioID); + return false; + } } void AudioEngineImpl::stopAll(){ - for (auto it = mapChannelInfo.begin(); it != mapChannelInfo.end(); ++it) { - ChannelInfo & audioRef = it->second; - audioRef.channel->stop(); - audioRef.channel = nullptr; - } + for (auto it = mapChannelInfo.begin(); it != mapChannelInfo.end(); ++it) { + ChannelInfo & audioRef = it->second; + audioRef.channel->stop(); + audioRef.channel = nullptr; + } } float AudioEngineImpl::getDuration(int audioID){ - try{ - FMOD::Sound * sound = mapChannelInfo[audioID].sound; - unsigned int length; - FMOD_RESULT result = sound->getLength(&length, FMOD_TIMEUNIT_MS); - ERRCHECK(result); - float duration = (float)length / 1000.0f; - return duration; + try{ + FMOD::Sound * sound = mapChannelInfo[audioID].sound; + unsigned int length; + FMOD_RESULT result = sound->getLength(&length, FMOD_TIMEUNIT_MS); + ERRCHECK(result); + float duration = (float)length / 1000.0f; + return duration; }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::getDuration: invalid audioID: %d\n", audioID); - return AudioEngine::TIME_UNKNOWN; - } + printf("AudioEngineImpl::getDuration: invalid audioID: %d\n", audioID); + return AudioEngine::TIME_UNKNOWN; + } } float AudioEngineImpl::getCurrentTime(int audioID){ - try{ - unsigned int position; - FMOD_RESULT result = mapChannelInfo[audioID].channel->getPosition(&position, FMOD_TIMEUNIT_MS); - ERRCHECK(result); - float currenttime = position /1000.0f; - return currenttime; + try{ + unsigned int position; + FMOD_RESULT result = mapChannelInfo[audioID].channel->getPosition(&position, FMOD_TIMEUNIT_MS); + ERRCHECK(result); + float currenttime = position /1000.0f; + return currenttime; }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::getCurrentTime: invalid audioID: %d\n", audioID); - return AudioEngine::TIME_UNKNOWN; - } + printf("AudioEngineImpl::getCurrentTime: invalid audioID: %d\n", audioID); + return AudioEngine::TIME_UNKNOWN; + } } bool AudioEngineImpl::setCurrentTime(int audioID, float time){ - try{ - unsigned int position = (unsigned int)(time * 1000.0f); - FMOD_RESULT result = mapChannelInfo[audioID].channel->setPosition(position, FMOD_TIMEUNIT_MS); - ERRCHECK(result); + try{ + unsigned int position = (unsigned int)(time * 1000.0f); + FMOD_RESULT result = mapChannelInfo[audioID].channel->setPosition(position, FMOD_TIMEUNIT_MS); + ERRCHECK(result); }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::setCurrentTime: invalid audioID: %d\n", audioID); - } + printf("AudioEngineImpl::setCurrentTime: invalid audioID: %d\n", audioID); + } } void AudioEngineImpl::setFinishCallback(int audioID, const std::function &callback){ - try{ - FMOD::Channel * channel = mapChannelInfo[audioID].channel; - mapChannelInfo[audioID].callback = callback; - FMOD_RESULT result = channel->setCallback(channelCallback); - ERRCHECK(result); + try{ + FMOD::Channel * channel = mapChannelInfo[audioID].channel; + mapChannelInfo[audioID].callback = callback; + FMOD_RESULT result = channel->setCallback(channelCallback); + ERRCHECK(result); }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::setFinishCallback: invalid audioID: %d\n", audioID); - } + printf("AudioEngineImpl::setFinishCallback: invalid audioID: %d\n", audioID); + } } void AudioEngineImpl::onSoundFinished(FMOD::Channel * channel){ - size_t id; + size_t id; try{ - void * data; - channel->getUserData(&data); - id = (size_t) data; - if(mapChannelInfo[id].callback){ - mapChannelInfo[id].callback(id, mapChannelInfo[id].path); - } - mapChannelInfo[id].channel = nullptr; + void * data; + channel->getUserData(&data); + id = (size_t) data; + if(mapChannelInfo[id].callback){ + mapChannelInfo[id].callback(id, mapChannelInfo[id].path); + } + mapChannelInfo[id].channel = nullptr; }catch(const std::out_of_range& oor){ - printf("AudioEngineImpl::onSoundFinished: invalid audioID: %d\n", id); - } + printf("AudioEngineImpl::onSoundFinished: invalid audioID: %d\n", id); + } } void AudioEngineImpl::uncache(const std::string& path){ - std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); - std::map::const_iterator it = mapSound.find(fullPath); - if(it!=mapSound.end()){ - FMOD::Sound * sound = it->second; - if(sound){ - sound->release(); - } + std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); + std::map::const_iterator it = mapSound.find(fullPath); + if(it!=mapSound.end()){ + FMOD::Sound * sound = it->second; + if(sound){ + sound->release(); + } mapSound.erase(it); } } void AudioEngineImpl::uncacheAll(){ -for (auto it = mapSound.cbegin(); it != mapSound.cend(); ++it) { - auto sound = it->second; - if(sound){ - sound->release(); - } + for (auto it = mapSound.cbegin(); it != mapSound.cend(); ++it) { + auto sound = it->second; + if(sound){ + sound->release(); + } } mapSound.clear(); } int AudioEngineImpl::preload(const std::string& filePath, std::function callback){ - FMOD::Sound * sound = findSound(filePath); - if(!sound){ - std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath); - FMOD_RESULT result = pSystem->createSound(fullPath.c_str(), FMOD_LOOP_OFF, 0, &sound); - if (ERRCHECK(result)){ - printf("sound effect in %s could not be preload\n", filePath.c_str()); - if(callback){ - callback(false); - } - return -1; + FMOD::Sound * sound = findSound(filePath); + if(!sound){ + std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath); + FMOD_RESULT result = pSystem->createSound(fullPath.c_str(), FMOD_LOOP_OFF, 0, &sound); + if (ERRCHECK(result)){ + printf("sound effect in %s could not be preload\n", filePath.c_str()); + if(callback){ + callback(false); + } + return -1; + } + mapSound[fullPath] = sound; } - mapSound[fullPath] = sound; - } - int id = mapChannelInfo.size() + 1; - auto& chanelInfo = mapChannelInfo[id]; - chanelInfo.sound = sound; - chanelInfo.id = (size_t) id; - chanelInfo.channel = nullptr; - chanelInfo.callback = nullptr; - chanelInfo.path = filePath; - //we are going to use UserData to store pointer to Channel when playing - chanelInfo.sound->setUserData((void *)id); + int id = mapChannelInfo.size() + 1; + auto& chanelInfo = mapChannelInfo[id]; + chanelInfo.sound = sound; + chanelInfo.id = (size_t) id; + chanelInfo.channel = nullptr; + chanelInfo.callback = nullptr; + chanelInfo.path = filePath; + //we are going to use UserData to store pointer to Channel when playing + chanelInfo.sound->setUserData((void *)id); - if(callback){ - callback(true); - } - return id; + if(callback){ + callback(true); + } + return id; } void AudioEngineImpl::update(float dt){ - pSystem->update(); + pSystem->update(); } FMOD::Sound * AudioEngineImpl::findSound(const std::string &path){ - std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); - std::map::const_iterator it = mapSound.find(fullPath); - return (it!=mapSound.end())?(it->second):nullptr; + std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); + std::map::const_iterator it = mapSound.find(fullPath); + return (it!=mapSound.end())?(it->second):nullptr; } FMOD::Channel * AudioEngineImpl::getChannel(FMOD::Sound *sound){ - size_t id; - void * data; - sound->getUserData(&data); - id = (size_t) data; - return mapChannelInfo[id].channel; + size_t id; + void * data; + sound->getUserData(&data); + id = (size_t) data; + return mapChannelInfo[id].channel; } diff --git a/cocos/audio/linux/SimpleAudioEngine.cpp b/cocos/audio/linux/SimpleAudioEngine.cpp index 29f6859d32a2..3d3ce42d6403 100644 --- a/cocos/audio/linux/SimpleAudioEngine.cpp +++ b/cocos/audio/linux/SimpleAudioEngine.cpp @@ -9,50 +9,50 @@ using namespace cocos2d::experimental; struct SimpleAudioEngineLinux{ - SimpleAudioEngine * engine = nullptr; - int musicid; - float effectsvolume; - std::string musicpath; + SimpleAudioEngine * engine = nullptr; + int musicid; + float effectsvolume; + std::string musicpath; }; -SimpleAudioEngineLinux * g_SimpleAudioEngineLinux = nullptr; +SimpleAudioEngineLinux * g_SimpleAudioEngineLinux = nullptr; SimpleAudioEngine* SimpleAudioEngine::getInstance(){ - if(!g_SimpleAudioEngineLinux){ - g_SimpleAudioEngineLinux = new SimpleAudioEngineLinux(); - g_SimpleAudioEngineLinux->engine = new SimpleAudioEngine(); - } - return g_SimpleAudioEngineLinux->engine; + if(!g_SimpleAudioEngineLinux){ + g_SimpleAudioEngineLinux = new SimpleAudioEngineLinux(); + g_SimpleAudioEngineLinux->engine = new SimpleAudioEngine(); + } + return g_SimpleAudioEngineLinux->engine; } - void SimpleAudioEngine::end(){ +void SimpleAudioEngine::end(){ if(g_SimpleAudioEngineLinux){ - delete g_SimpleAudioEngineLinux->engine; - delete g_SimpleAudioEngineLinux; + delete g_SimpleAudioEngineLinux->engine; + delete g_SimpleAudioEngineLinux; } - g_SimpleAudioEngineLinux = nullptr; - } + g_SimpleAudioEngineLinux = nullptr; +} - SimpleAudioEngine::SimpleAudioEngine(){ - g_SimpleAudioEngineLinux->musicid = -1; - g_SimpleAudioEngineLinux->effectsvolume = 1.0f; - } +SimpleAudioEngine::SimpleAudioEngine(){ + g_SimpleAudioEngineLinux->musicid = -1; + g_SimpleAudioEngineLinux->effectsvolume = 1.0f; +} - SimpleAudioEngine::~SimpleAudioEngine(){ +SimpleAudioEngine::~SimpleAudioEngine(){ - } +} - void SimpleAudioEngine::preloadBackgroundMusic(const char* filePath){ - g_SimpleAudioEngineLinux->musicpath = filePath; - AudioEngine::preload(filePath); - } +void SimpleAudioEngine::preloadBackgroundMusic(const char* filePath){ + g_SimpleAudioEngineLinux->musicpath = filePath; + AudioEngine::preload(filePath); +} - void SimpleAudioEngine::playBackgroundMusic(const char* filePath, bool loop){ - g_SimpleAudioEngineLinux->musicpath = filePath; - g_SimpleAudioEngineLinux->musicid = AudioEngine::play2d(filePath, loop); - } +void SimpleAudioEngine::playBackgroundMusic(const char* filePath, bool loop){ + g_SimpleAudioEngineLinux->musicpath = filePath; + g_SimpleAudioEngineLinux->musicid = AudioEngine::play2d(filePath, loop); +} void SimpleAudioEngine::stopBackgroundMusic(bool releaseData){ AudioEngine::stop(g_SimpleAudioEngineLinux->musicid); @@ -61,38 +61,38 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ } } - void SimpleAudioEngine::pauseBackgroundMusic(){ - AudioEngine::pause(g_SimpleAudioEngineLinux->musicid); - } +void SimpleAudioEngine::pauseBackgroundMusic(){ + AudioEngine::pause(g_SimpleAudioEngineLinux->musicid); +} - void SimpleAudioEngine::resumeBackgroundMusic(){ - AudioEngine::resume(g_SimpleAudioEngineLinux->musicid); - } +void SimpleAudioEngine::resumeBackgroundMusic(){ + AudioEngine::resume(g_SimpleAudioEngineLinux->musicid); +} void SimpleAudioEngine::rewindBackgroundMusic(){ AudioEngine::setCurrentTime(g_SimpleAudioEngineLinux->musicid, 0); } - bool SimpleAudioEngine::willPlayBackgroundMusic(){ - return g_SimpleAudioEngineLinux->musicid != -1; - } +bool SimpleAudioEngine::willPlayBackgroundMusic(){ + return g_SimpleAudioEngineLinux->musicid != -1; +} bool SimpleAudioEngine::isBackgroundMusicPlaying(){ return AudioEngine::getState(g_SimpleAudioEngineLinux->musicid) == AudioEngine::AudioState::PLAYING; } - // - // properties - // +// +// properties +// - /** - * The volume of the background music within the range of 0.0 as the minimum and 1.0 as the maximum. - * @js getMusicVolume - * @lua getMusicVolume - */ - float SimpleAudioEngine::getBackgroundMusicVolume(){ - return AudioEngine::getVolume(g_SimpleAudioEngineLinux->musicid); - } +/** + * The volume of the background music within the range of 0.0 as the minimum and 1.0 as the maximum. + * @js getMusicVolume + * @lua getMusicVolume + */ +float SimpleAudioEngine::getBackgroundMusicVolume(){ + return AudioEngine::getVolume(g_SimpleAudioEngineLinux->musicid); +} /** * Set the volume of background music. @@ -105,12 +105,12 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ AudioEngine::setVolume(g_SimpleAudioEngineLinux->musicid, volume); } - /** - * The volume of the effects within the range of 0.0 as the minimum and 1.0 as the maximum. - */ - float SimpleAudioEngine::getEffectsVolume(){ - return g_SimpleAudioEngineLinux->effectsvolume; - } +/** + * The volume of the effects within the range of 0.0 as the minimum and 1.0 as the maximum. + */ +float SimpleAudioEngine::getEffectsVolume(){ + return g_SimpleAudioEngineLinux->effectsvolume; +} /** * Set the volume of sound effects. @@ -121,23 +121,23 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ g_SimpleAudioEngineLinux->effectsvolume = volume; } - /** - * Play sound effect with a file path, pitch, pan and gain. - * - * @param filePath The path of the effect file. - * @param loop Determines whether to loop the effect playing or not. The default value is false. - * @param pitch Frequency, normal value is 1.0. Will also change effect play time. - * @param pan Stereo effect, in the range of [-1..1] where -1 enables only left channel. - * @param gain Volume, in the range of [0..1]. The normal value is 1. - * @return The sound id. - * - * @note Full support is under development, now there are limitations: - * - no pitch effect on Samsung Galaxy S2 with OpenSL backend enabled; - * - no pitch/pan/gain on win32. - */ - unsigned int SimpleAudioEngine::playEffect(const char* filePath, bool loop, float pitch, float pan, float gain){ - return AudioEngine::play2d(filePath, loop, gain); - } +/** + * Play sound effect with a file path, pitch, pan and gain. + * + * @param filePath The path of the effect file. + * @param loop Determines whether to loop the effect playing or not. The default value is false. + * @param pitch Frequency, normal value is 1.0. Will also change effect play time. + * @param pan Stereo effect, in the range of [-1..1] where -1 enables only left channel. + * @param gain Volume, in the range of [0..1]. The normal value is 1. + * @return The sound id. + * + * @note Full support is under development, now there are limitations: + * - no pitch effect on Samsung Galaxy S2 with OpenSL backend enabled; + * - no pitch/pan/gain on win32. + */ +unsigned int SimpleAudioEngine::playEffect(const char* filePath, bool loop, float pitch, float pan, float gain){ + return AudioEngine::play2d(filePath, loop, gain); +} /** * Pause playing sound effect. @@ -148,12 +148,12 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ AudioEngine::pause(soundId); } - /** - * Pause all playing sound effect. - */ - void SimpleAudioEngine::pauseAllEffects(){ - AudioEngine::pauseAll(); - } +/** + * Pause all playing sound effect. + */ +void SimpleAudioEngine::pauseAllEffects(){ + AudioEngine::pauseAll(); +} /** * Resume playing sound effect. @@ -164,12 +164,12 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ AudioEngine::resume(soundId); } - /** - * Resume all playing sound effect. - */ - void SimpleAudioEngine::resumeAllEffects(){ - AudioEngine::resumeAll(); - } +/** + * Resume all playing sound effect. + */ +void SimpleAudioEngine::resumeAllEffects(){ + AudioEngine::resumeAll(); +} /** * Stop playing sound effect. @@ -180,12 +180,12 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ AudioEngine::stop(soundId); } - /** - * Stop all playing sound effects. - */ - void SimpleAudioEngine::stopAllEffects(){ - AudioEngine::stopAll(); - } +/** + * Stop all playing sound effects. + */ +void SimpleAudioEngine::stopAllEffects(){ + AudioEngine::stopAll(); +} /** * Preload a compressed audio file. @@ -199,13 +199,13 @@ SimpleAudioEngine* SimpleAudioEngine::getInstance(){ AudioEngine::preload(filePath); } - /** - * Unload the preloaded effect from internal buffer. - * - * @param filePath The path of the effect file. - */ - void SimpleAudioEngine::unloadEffect(const char* filePath){ - AudioEngine::uncache(filePath); - } +/** + * Unload the preloaded effect from internal buffer. + * + * @param filePath The path of the effect file. + */ +void SimpleAudioEngine::unloadEffect(const char* filePath){ + AudioEngine::uncache(filePath); +} \ No newline at end of file From 7b61aca64ea433541473cce905f816cdb991da11 Mon Sep 17 00:00:00 2001 From: mogemimi Date: Thu, 19 May 2016 03:34:38 +0900 Subject: [PATCH 145/241] Fix indentation and remove trailing whitespaces --- cocos/audio/linux/AudioEngine-linux.cpp | 43 +++----- cocos/audio/linux/SimpleAudioEngine.cpp | 141 ++++++++++++------------ 2 files changed, 84 insertions(+), 100 deletions(-) diff --git a/cocos/audio/linux/AudioEngine-linux.cpp b/cocos/audio/linux/AudioEngine-linux.cpp index f3e947243463..7aaa7d926a62 100644 --- a/cocos/audio/linux/AudioEngine-linux.cpp +++ b/cocos/audio/linux/AudioEngine-linux.cpp @@ -1,6 +1,6 @@ /** * @author cesarpachon - */ + */ #include #include "audio/linux/AudioEngine-linux.h" @@ -27,12 +27,11 @@ bool ERRCHECK(FMOD_RESULT result) { return false; } -FMOD_RESULT F_CALLBACK channelCallback(FMOD_CHANNELCONTROL *channelcontrol, - FMOD_CHANNELCONTROL_TYPE controltype, - FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, +FMOD_RESULT F_CALLBACK channelCallback(FMOD_CHANNELCONTROL *channelcontrol, + FMOD_CHANNELCONTROL_TYPE controltype, + FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, void *commandData1, void *commandData2) { - if(controltype == FMOD_CHANNELCONTROL_CHANNEL && callbacktype == FMOD_CHANNELCONTROL_CALLBACK_END){ g_AudioEngineImpl->onSoundFinished((FMOD::Channel *)channelcontrol); }else{ @@ -40,7 +39,6 @@ FMOD_RESULT F_CALLBACK channelCallback(FMOD_CHANNELCONTROL *channelcontrol, return FMOD_OK; } - AudioEngineImpl::AudioEngineImpl(){ } @@ -52,7 +50,6 @@ AudioEngineImpl::~AudioEngineImpl(){ ERRCHECKWITHEXIT(result); } - bool AudioEngineImpl::init(){ FMOD_RESULT result; /* @@ -60,7 +57,7 @@ bool AudioEngineImpl::init(){ */ result = FMOD::System_Create(&pSystem); ERRCHECKWITHEXIT(result); - + result = pSystem->setOutput(FMOD_OUTPUTTYPE_PULSEAUDIO); ERRCHECKWITHEXIT(result); @@ -69,12 +66,12 @@ bool AudioEngineImpl::init(){ mapChannelInfo.clear(); mapSound.clear(); - + auto scheduler = cocos2d::Director::getInstance()->getScheduler(); scheduler->schedule(schedule_selector(AudioEngineImpl::update), this, 0.05f, false); - + g_AudioEngineImpl = this; - + return true; } @@ -119,7 +116,6 @@ bool AudioEngineImpl::pause(int audioID){ bool AudioEngineImpl::resume(int audioID){ try{ - if(!mapChannelInfo[audioID].channel){ FMOD::Channel *channel = nullptr; FMOD::ChannelGroup *channelgroup = nullptr; @@ -134,10 +130,10 @@ bool AudioEngineImpl::resume(int audioID){ channel->setUserData((void *)mapChannelInfo[audioID].id); mapChannelInfo[audioID].channel = channel; } - + mapChannelInfo[audioID].channel->setPaused(false); AudioEngine::_audioIDInfoMap[audioID].state = AudioEngine::AudioState::PLAYING; - + return true; }catch(const std::out_of_range& oor){ printf("AudioEngineImpl::resume: invalid audioID: %d\n", audioID); @@ -212,7 +208,6 @@ void AudioEngineImpl::setFinishCallback(int audioID, const std::functionfullPathForFilename(path); @@ -237,22 +231,20 @@ void AudioEngineImpl::uncache(const std::string& path){ if(sound){ sound->release(); } - mapSound.erase(it); - } + mapSound.erase(it); + } } - void AudioEngineImpl::uncacheAll(){ for (auto it = mapSound.cbegin(); it != mapSound.cend(); ++it) { auto sound = it->second; if(sound){ sound->release(); } - } - mapSound.clear(); + } + mapSound.clear(); } - int AudioEngineImpl::preload(const std::string& filePath, std::function callback){ FMOD::Sound * sound = findSound(filePath); if(!sound){ @@ -267,7 +259,7 @@ int AudioEngineImpl::preload(const std::string& filePath, std::functionsetUserData((void *)id); - + if(callback){ callback(true); } return id; } - void AudioEngineImpl::update(float dt){ pSystem->update(); } - FMOD::Sound * AudioEngineImpl::findSound(const std::string &path){ std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); std::map::const_iterator it = mapSound.find(fullPath); return (it!=mapSound.end())?(it->second):nullptr; } - FMOD::Channel * AudioEngineImpl::getChannel(FMOD::Sound *sound){ size_t id; void * data; diff --git a/cocos/audio/linux/SimpleAudioEngine.cpp b/cocos/audio/linux/SimpleAudioEngine.cpp index 3d3ce42d6403..807c625529e6 100644 --- a/cocos/audio/linux/SimpleAudioEngine.cpp +++ b/cocos/audio/linux/SimpleAudioEngine.cpp @@ -7,7 +7,6 @@ using namespace CocosDenshion; using namespace cocos2d; using namespace cocos2d::experimental; - struct SimpleAudioEngineLinux{ SimpleAudioEngine * engine = nullptr; int musicid; @@ -17,7 +16,6 @@ struct SimpleAudioEngineLinux{ SimpleAudioEngineLinux * g_SimpleAudioEngineLinux = nullptr; - SimpleAudioEngine* SimpleAudioEngine::getInstance(){ if(!g_SimpleAudioEngineLinux){ g_SimpleAudioEngineLinux = new SimpleAudioEngineLinux(); @@ -33,33 +31,32 @@ void SimpleAudioEngine::end(){ } g_SimpleAudioEngineLinux = nullptr; } - - + SimpleAudioEngine::SimpleAudioEngine(){ g_SimpleAudioEngineLinux->musicid = -1; g_SimpleAudioEngineLinux->effectsvolume = 1.0f; } SimpleAudioEngine::~SimpleAudioEngine(){ - + } void SimpleAudioEngine::preloadBackgroundMusic(const char* filePath){ g_SimpleAudioEngineLinux->musicpath = filePath; AudioEngine::preload(filePath); } - + void SimpleAudioEngine::playBackgroundMusic(const char* filePath, bool loop){ g_SimpleAudioEngineLinux->musicpath = filePath; g_SimpleAudioEngineLinux->musicid = AudioEngine::play2d(filePath, loop); } - void SimpleAudioEngine::stopBackgroundMusic(bool releaseData){ - AudioEngine::stop(g_SimpleAudioEngineLinux->musicid); - if(releaseData){ - AudioEngine::uncache(g_SimpleAudioEngineLinux->musicpath.c_str()); - } +void SimpleAudioEngine::stopBackgroundMusic(bool releaseData){ + AudioEngine::stop(g_SimpleAudioEngineLinux->musicid); + if(releaseData){ + AudioEngine::uncache(g_SimpleAudioEngineLinux->musicpath.c_str()); } +} void SimpleAudioEngine::pauseBackgroundMusic(){ AudioEngine::pause(g_SimpleAudioEngineLinux->musicid); @@ -69,17 +66,17 @@ void SimpleAudioEngine::resumeBackgroundMusic(){ AudioEngine::resume(g_SimpleAudioEngineLinux->musicid); } - void SimpleAudioEngine::rewindBackgroundMusic(){ - AudioEngine::setCurrentTime(g_SimpleAudioEngineLinux->musicid, 0); - } +void SimpleAudioEngine::rewindBackgroundMusic(){ + AudioEngine::setCurrentTime(g_SimpleAudioEngineLinux->musicid, 0); +} bool SimpleAudioEngine::willPlayBackgroundMusic(){ return g_SimpleAudioEngineLinux->musicid != -1; } - bool SimpleAudioEngine::isBackgroundMusicPlaying(){ - return AudioEngine::getState(g_SimpleAudioEngineLinux->musicid) == AudioEngine::AudioState::PLAYING; - } +bool SimpleAudioEngine::isBackgroundMusicPlaying(){ + return AudioEngine::getState(g_SimpleAudioEngineLinux->musicid) == AudioEngine::AudioState::PLAYING; +} // // properties @@ -94,16 +91,16 @@ float SimpleAudioEngine::getBackgroundMusicVolume(){ return AudioEngine::getVolume(g_SimpleAudioEngineLinux->musicid); } - /** - * Set the volume of background music. - * - * @param volume must be within the range of 0.0 as the minimum and 1.0 as the maximum. - * @js setMusicVolume - * @lua setMusicVolume - */ - void SimpleAudioEngine::setBackgroundMusicVolume(float volume){ - AudioEngine::setVolume(g_SimpleAudioEngineLinux->musicid, volume); - } +/** + * Set the volume of background music. + * + * @param volume must be within the range of 0.0 as the minimum and 1.0 as the maximum. + * @js setMusicVolume + * @lua setMusicVolume + */ +void SimpleAudioEngine::setBackgroundMusicVolume(float volume){ + AudioEngine::setVolume(g_SimpleAudioEngineLinux->musicid, volume); +} /** * The volume of the effects within the range of 0.0 as the minimum and 1.0 as the maximum. @@ -112,14 +109,14 @@ float SimpleAudioEngine::getEffectsVolume(){ return g_SimpleAudioEngineLinux->effectsvolume; } - /** - * Set the volume of sound effects. - * - * @param volume must be within the range of 0.0 as the minimum and 1.0 as the maximum. - */ - void SimpleAudioEngine::setEffectsVolume(float volume){ - g_SimpleAudioEngineLinux->effectsvolume = volume; - } +/** + * Set the volume of sound effects. + * + * @param volume must be within the range of 0.0 as the minimum and 1.0 as the maximum. + */ +void SimpleAudioEngine::setEffectsVolume(float volume){ + g_SimpleAudioEngineLinux->effectsvolume = volume; +} /** * Play sound effect with a file path, pitch, pan and gain. @@ -130,7 +127,7 @@ float SimpleAudioEngine::getEffectsVolume(){ * @param pan Stereo effect, in the range of [-1..1] where -1 enables only left channel. * @param gain Volume, in the range of [0..1]. The normal value is 1. * @return The sound id. - * + * * @note Full support is under development, now there are limitations: * - no pitch effect on Samsung Galaxy S2 with OpenSL backend enabled; * - no pitch/pan/gain on win32. @@ -139,14 +136,14 @@ unsigned int SimpleAudioEngine::playEffect(const char* filePath, bool loop, floa return AudioEngine::play2d(filePath, loop, gain); } - /** - * Pause playing sound effect. - * - * @param soundId The return value of function playEffect. - */ - void SimpleAudioEngine::pauseEffect(unsigned int soundId){ - AudioEngine::pause(soundId); - } +/** + * Pause playing sound effect. + * + * @param soundId The return value of function playEffect. + */ +void SimpleAudioEngine::pauseEffect(unsigned int soundId){ + AudioEngine::pause(soundId); +} /** * Pause all playing sound effect. @@ -155,14 +152,14 @@ void SimpleAudioEngine::pauseAllEffects(){ AudioEngine::pauseAll(); } - /** - * Resume playing sound effect. - * - * @param soundId The return value of function playEffect. - */ - void SimpleAudioEngine::resumeEffect(unsigned int soundId){ - AudioEngine::resume(soundId); - } +/** + * Resume playing sound effect. + * + * @param soundId The return value of function playEffect. + */ +void SimpleAudioEngine::resumeEffect(unsigned int soundId){ + AudioEngine::resume(soundId); +} /** * Resume all playing sound effect. @@ -171,14 +168,14 @@ void SimpleAudioEngine::resumeAllEffects(){ AudioEngine::resumeAll(); } - /** - * Stop playing sound effect. - * - * @param soundId The return value of function playEffect. - */ - void SimpleAudioEngine::stopEffect(unsigned int soundId){ - AudioEngine::stop(soundId); - } +/** + * Stop playing sound effect. + * + * @param soundId The return value of function playEffect. + */ +void SimpleAudioEngine::stopEffect(unsigned int soundId){ + AudioEngine::stop(soundId); +} /** * Stop all playing sound effects. @@ -187,17 +184,17 @@ void SimpleAudioEngine::stopAllEffects(){ AudioEngine::stopAll(); } - /** - * Preload a compressed audio file. - * - * The compressed audio will be decoded to wave, then written into an internal buffer in SimpleAudioEngine. - * - * @param filePath The path of the effect file. - * @js NA - */ - void SimpleAudioEngine::preloadEffect(const char* filePath){ - AudioEngine::preload(filePath); - } +/** + * Preload a compressed audio file. + * + * The compressed audio will be decoded to wave, then written into an internal buffer in SimpleAudioEngine. + * + * @param filePath The path of the effect file. + * @js NA + */ +void SimpleAudioEngine::preloadEffect(const char* filePath){ + AudioEngine::preload(filePath); +} /** * Unload the preloaded effect from internal buffer. @@ -207,5 +204,3 @@ void SimpleAudioEngine::stopAllEffects(){ void SimpleAudioEngine::unloadEffect(const char* filePath){ AudioEngine::uncache(filePath); } - - \ No newline at end of file From 09d839be3549947cc46745c1052dac502473816b Mon Sep 17 00:00:00 2001 From: mogemimi Date: Thu, 19 May 2016 05:17:33 +0900 Subject: [PATCH 146/241] Format the code to better align with cocos2d-x code style --- cocos/audio/linux/AudioEngine-linux.cpp | 152 ++++++++++++++---------- cocos/audio/linux/SimpleAudioEngine.cpp | 84 ++++++++----- 2 files changed, 146 insertions(+), 90 deletions(-) diff --git a/cocos/audio/linux/AudioEngine-linux.cpp b/cocos/audio/linux/AudioEngine-linux.cpp index 7aaa7d926a62..ecd4ff009825 100644 --- a/cocos/audio/linux/AudioEngine-linux.cpp +++ b/cocos/audio/linux/AudioEngine-linux.cpp @@ -13,13 +13,15 @@ using namespace cocos2d::experimental; AudioEngineImpl * g_AudioEngineImpl = nullptr; -void ERRCHECKWITHEXIT(FMOD_RESULT result) { +void ERRCHECKWITHEXIT(FMOD_RESULT result) +{ if (result != FMOD_OK) { printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result)); } } -bool ERRCHECK(FMOD_RESULT result) { +bool ERRCHECK(FMOD_RESULT result) +{ if (result != FMOD_OK) { printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result)); return true; @@ -32,17 +34,18 @@ FMOD_RESULT F_CALLBACK channelCallback(FMOD_CHANNELCONTROL *channelcontrol, FMOD_CHANNELCONTROL_CALLBACK_TYPE callbacktype, void *commandData1, void *commandData2) { - if(controltype == FMOD_CHANNELCONTROL_CHANNEL && callbacktype == FMOD_CHANNELCONTROL_CALLBACK_END){ + if (controltype == FMOD_CHANNELCONTROL_CHANNEL && callbacktype == FMOD_CHANNELCONTROL_CALLBACK_END) { g_AudioEngineImpl->onSoundFinished((FMOD::Channel *)channelcontrol); - }else{ } return FMOD_OK; } -AudioEngineImpl::AudioEngineImpl(){ +AudioEngineImpl::AudioEngineImpl() +{ } -AudioEngineImpl::~AudioEngineImpl(){ +AudioEngineImpl::~AudioEngineImpl() +{ FMOD_RESULT result; result = pSystem->close(); ERRCHECKWITHEXIT(result); @@ -50,7 +53,8 @@ AudioEngineImpl::~AudioEngineImpl(){ ERRCHECKWITHEXIT(result); } -bool AudioEngineImpl::init(){ +bool AudioEngineImpl::init() +{ FMOD_RESULT result; /* Create a System object and initialize. @@ -75,9 +79,10 @@ bool AudioEngineImpl::init(){ return true; } -int AudioEngineImpl::play2d(const std::string &fileFullPath ,bool loop ,float volume){ +int AudioEngineImpl::play2d(const std::string &fileFullPath, bool loop, float volume) +{ int id = preload(fileFullPath, nullptr); - if(id >= 0){ + if (id >= 0) { mapChannelInfo[id].loop=loop; mapChannelInfo[id].channel->setPaused(true); mapChannelInfo[id].volume = volume; @@ -87,45 +92,52 @@ int AudioEngineImpl::play2d(const std::string &fileFullPath ,bool loop ,float vo return id; } -void AudioEngineImpl::setVolume(int audioID,float volume){ - try{ +void AudioEngineImpl::setVolume(int audioID, float volume) +{ + try { mapChannelInfo[audioID].channel->setVolume(volume); - }catch(const std::out_of_range& oor){ + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::setVolume: invalid audioID: %d\n", audioID); } } -void AudioEngineImpl::setLoop(int audioID, bool loop){ - try{ - mapChannelInfo[audioID].channel->setLoopCount(loop?-1:0); - }catch(const std::out_of_range& oor){ +void AudioEngineImpl::setLoop(int audioID, bool loop) +{ + try { + mapChannelInfo[audioID].channel->setLoopCount(loop ? -1 : 0); + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::setLoop: invalid audioID: %d\n", audioID); } } -bool AudioEngineImpl::pause(int audioID){ - try{ +bool AudioEngineImpl::pause(int audioID) +{ + try { mapChannelInfo[audioID].channel->setPaused(true); AudioEngine::_audioIDInfoMap[audioID].state = AudioEngine::AudioState::PAUSED; return true; - }catch(const std::out_of_range& oor){ + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::pause: invalid audioID: %d\n", audioID); return false; } } -bool AudioEngineImpl::resume(int audioID){ - try{ - if(!mapChannelInfo[audioID].channel){ +bool AudioEngineImpl::resume(int audioID) +{ + try { + if (!mapChannelInfo[audioID].channel) { FMOD::Channel *channel = nullptr; FMOD::ChannelGroup *channelgroup = nullptr; //starts the sound in pause mode, use the channel to unpause FMOD_RESULT result = pSystem->playSound(mapChannelInfo[audioID].sound, channelgroup, true, &channel); - if(ERRCHECK(result)){ + if (ERRCHECK(result)) { return false; } - channel->setMode(mapChannelInfo[audioID].loop?FMOD_LOOP_NORMAL:FMOD_LOOP_OFF); - channel->setLoopCount(mapChannelInfo[audioID].loop?-1:0); + channel->setMode(mapChannelInfo[audioID].loop ? FMOD_LOOP_NORMAL : FMOD_LOOP_OFF); + channel->setLoopCount(mapChannelInfo[audioID].loop ? -1 : 0); channel->setVolume(mapChannelInfo[audioID].volume); channel->setUserData((void *)mapChannelInfo[audioID].id); mapChannelInfo[audioID].channel = channel; @@ -135,24 +147,28 @@ bool AudioEngineImpl::resume(int audioID){ AudioEngine::_audioIDInfoMap[audioID].state = AudioEngine::AudioState::PLAYING; return true; - }catch(const std::out_of_range& oor){ + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::resume: invalid audioID: %d\n", audioID); return false; } } -bool AudioEngineImpl::stop(int audioID){ - try{ +bool AudioEngineImpl::stop(int audioID) +{ + try { mapChannelInfo[audioID].channel->stop(); mapChannelInfo[audioID].channel = nullptr; return true; - }catch(const std::out_of_range& oor){ + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::stop: invalid audioID: %d\n", audioID); return false; } } -void AudioEngineImpl::stopAll(){ +void AudioEngineImpl::stopAll() +{ for (auto it = mapChannelInfo.begin(); it != mapChannelInfo.end(); ++it) { ChannelInfo & audioRef = it->second; audioRef.channel->stop(); @@ -160,99 +176,112 @@ void AudioEngineImpl::stopAll(){ } } -float AudioEngineImpl::getDuration(int audioID){ - try{ +float AudioEngineImpl::getDuration(int audioID) +{ + try { FMOD::Sound * sound = mapChannelInfo[audioID].sound; unsigned int length; FMOD_RESULT result = sound->getLength(&length, FMOD_TIMEUNIT_MS); ERRCHECK(result); float duration = (float)length / 1000.0f; return duration; - }catch(const std::out_of_range& oor){ + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::getDuration: invalid audioID: %d\n", audioID); return AudioEngine::TIME_UNKNOWN; } } -float AudioEngineImpl::getCurrentTime(int audioID){ - try{ +float AudioEngineImpl::getCurrentTime(int audioID) +{ + try { unsigned int position; FMOD_RESULT result = mapChannelInfo[audioID].channel->getPosition(&position, FMOD_TIMEUNIT_MS); ERRCHECK(result); float currenttime = position /1000.0f; return currenttime; - }catch(const std::out_of_range& oor){ + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::getCurrentTime: invalid audioID: %d\n", audioID); return AudioEngine::TIME_UNKNOWN; } } -bool AudioEngineImpl::setCurrentTime(int audioID, float time){ - try{ +bool AudioEngineImpl::setCurrentTime(int audioID, float time) +{ + try { unsigned int position = (unsigned int)(time * 1000.0f); FMOD_RESULT result = mapChannelInfo[audioID].channel->setPosition(position, FMOD_TIMEUNIT_MS); ERRCHECK(result); - }catch(const std::out_of_range& oor){ + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::setCurrentTime: invalid audioID: %d\n", audioID); } } -void AudioEngineImpl::setFinishCallback(int audioID, const std::function &callback){ - try{ +void AudioEngineImpl::setFinishCallback(int audioID, const std::function &callback) +{ + try { FMOD::Channel * channel = mapChannelInfo[audioID].channel; mapChannelInfo[audioID].callback = callback; FMOD_RESULT result = channel->setCallback(channelCallback); ERRCHECK(result); - }catch(const std::out_of_range& oor){ + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::setFinishCallback: invalid audioID: %d\n", audioID); } } -void AudioEngineImpl::onSoundFinished(FMOD::Channel * channel){ +void AudioEngineImpl::onSoundFinished(FMOD::Channel * channel) +{ size_t id; - try{ + try { void * data; channel->getUserData(&data); id = (size_t) data; - if(mapChannelInfo[id].callback){ + if (mapChannelInfo[id].callback) { mapChannelInfo[id].callback(id, mapChannelInfo[id].path); } mapChannelInfo[id].channel = nullptr; - }catch(const std::out_of_range& oor){ + } + catch (const std::out_of_range& oor) { printf("AudioEngineImpl::onSoundFinished: invalid audioID: %d\n", id); } } -void AudioEngineImpl::uncache(const std::string& path){ +void AudioEngineImpl::uncache(const std::string& path) +{ std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); std::map::const_iterator it = mapSound.find(fullPath); - if(it!=mapSound.end()){ + if (it!=mapSound.end()) { FMOD::Sound * sound = it->second; - if(sound){ + if (sound) { sound->release(); } mapSound.erase(it); } } -void AudioEngineImpl::uncacheAll(){ +void AudioEngineImpl::uncacheAll() +{ for (auto it = mapSound.cbegin(); it != mapSound.cend(); ++it) { auto sound = it->second; - if(sound){ + if (sound) { sound->release(); } } mapSound.clear(); } -int AudioEngineImpl::preload(const std::string& filePath, std::function callback){ +int AudioEngineImpl::preload(const std::string& filePath, std::function callback) +{ FMOD::Sound * sound = findSound(filePath); - if(!sound){ + if (!sound) { std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath); FMOD_RESULT result = pSystem->createSound(fullPath.c_str(), FMOD_LOOP_OFF, 0, &sound); - if (ERRCHECK(result)){ + if (ERRCHECK(result)) { printf("sound effect in %s could not be preload\n", filePath.c_str()); - if(callback){ + if (callback) { callback(false); } return -1; @@ -270,23 +299,26 @@ int AudioEngineImpl::preload(const std::string& filePath, std::functionsetUserData((void *)id); - if(callback){ + if (callback) { callback(true); } return id; } -void AudioEngineImpl::update(float dt){ +void AudioEngineImpl::update(float dt) +{ pSystem->update(); } -FMOD::Sound * AudioEngineImpl::findSound(const std::string &path){ +FMOD::Sound * AudioEngineImpl::findSound(const std::string &path) +{ std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); std::map::const_iterator it = mapSound.find(fullPath); - return (it!=mapSound.end())?(it->second):nullptr; + return (it != mapSound.end()) ? (it->second) : nullptr; } -FMOD::Channel * AudioEngineImpl::getChannel(FMOD::Sound *sound){ +FMOD::Channel * AudioEngineImpl::getChannel(FMOD::Sound *sound) +{ size_t id; void * data; sound->getUserData(&data); diff --git a/cocos/audio/linux/SimpleAudioEngine.cpp b/cocos/audio/linux/SimpleAudioEngine.cpp index 807c625529e6..8d79b0428278 100644 --- a/cocos/audio/linux/SimpleAudioEngine.cpp +++ b/cocos/audio/linux/SimpleAudioEngine.cpp @@ -7,7 +7,7 @@ using namespace CocosDenshion; using namespace cocos2d; using namespace cocos2d::experimental; -struct SimpleAudioEngineLinux{ +struct SimpleAudioEngineLinux { SimpleAudioEngine * engine = nullptr; int musicid; float effectsvolume; @@ -16,65 +16,76 @@ struct SimpleAudioEngineLinux{ SimpleAudioEngineLinux * g_SimpleAudioEngineLinux = nullptr; -SimpleAudioEngine* SimpleAudioEngine::getInstance(){ - if(!g_SimpleAudioEngineLinux){ +SimpleAudioEngine* SimpleAudioEngine::getInstance() +{ + if (!g_SimpleAudioEngineLinux) { g_SimpleAudioEngineLinux = new SimpleAudioEngineLinux(); g_SimpleAudioEngineLinux->engine = new SimpleAudioEngine(); } return g_SimpleAudioEngineLinux->engine; } -void SimpleAudioEngine::end(){ - if(g_SimpleAudioEngineLinux){ +void SimpleAudioEngine::end() +{ + if (g_SimpleAudioEngineLinux) { delete g_SimpleAudioEngineLinux->engine; delete g_SimpleAudioEngineLinux; } g_SimpleAudioEngineLinux = nullptr; } -SimpleAudioEngine::SimpleAudioEngine(){ +SimpleAudioEngine::SimpleAudioEngine() +{ g_SimpleAudioEngineLinux->musicid = -1; g_SimpleAudioEngineLinux->effectsvolume = 1.0f; } -SimpleAudioEngine::~SimpleAudioEngine(){ - +SimpleAudioEngine::~SimpleAudioEngine() +{ } -void SimpleAudioEngine::preloadBackgroundMusic(const char* filePath){ +void SimpleAudioEngine::preloadBackgroundMusic(const char* filePath) +{ g_SimpleAudioEngineLinux->musicpath = filePath; AudioEngine::preload(filePath); } -void SimpleAudioEngine::playBackgroundMusic(const char* filePath, bool loop){ +void SimpleAudioEngine::playBackgroundMusic(const char* filePath, bool loop) +{ g_SimpleAudioEngineLinux->musicpath = filePath; g_SimpleAudioEngineLinux->musicid = AudioEngine::play2d(filePath, loop); } -void SimpleAudioEngine::stopBackgroundMusic(bool releaseData){ +void SimpleAudioEngine::stopBackgroundMusic(bool releaseData) +{ AudioEngine::stop(g_SimpleAudioEngineLinux->musicid); - if(releaseData){ + if (releaseData) { AudioEngine::uncache(g_SimpleAudioEngineLinux->musicpath.c_str()); } } -void SimpleAudioEngine::pauseBackgroundMusic(){ +void SimpleAudioEngine::pauseBackgroundMusic() +{ AudioEngine::pause(g_SimpleAudioEngineLinux->musicid); } -void SimpleAudioEngine::resumeBackgroundMusic(){ +void SimpleAudioEngine::resumeBackgroundMusic() +{ AudioEngine::resume(g_SimpleAudioEngineLinux->musicid); } -void SimpleAudioEngine::rewindBackgroundMusic(){ +void SimpleAudioEngine::rewindBackgroundMusic() +{ AudioEngine::setCurrentTime(g_SimpleAudioEngineLinux->musicid, 0); } -bool SimpleAudioEngine::willPlayBackgroundMusic(){ +bool SimpleAudioEngine::willPlayBackgroundMusic() +{ return g_SimpleAudioEngineLinux->musicid != -1; } -bool SimpleAudioEngine::isBackgroundMusicPlaying(){ +bool SimpleAudioEngine::isBackgroundMusicPlaying() +{ return AudioEngine::getState(g_SimpleAudioEngineLinux->musicid) == AudioEngine::AudioState::PLAYING; } @@ -87,7 +98,8 @@ bool SimpleAudioEngine::isBackgroundMusicPlaying(){ * @js getMusicVolume * @lua getMusicVolume */ -float SimpleAudioEngine::getBackgroundMusicVolume(){ +float SimpleAudioEngine::getBackgroundMusicVolume() +{ return AudioEngine::getVolume(g_SimpleAudioEngineLinux->musicid); } @@ -98,14 +110,16 @@ float SimpleAudioEngine::getBackgroundMusicVolume(){ * @js setMusicVolume * @lua setMusicVolume */ -void SimpleAudioEngine::setBackgroundMusicVolume(float volume){ +void SimpleAudioEngine::setBackgroundMusicVolume(float volume) +{ AudioEngine::setVolume(g_SimpleAudioEngineLinux->musicid, volume); } /** * The volume of the effects within the range of 0.0 as the minimum and 1.0 as the maximum. */ -float SimpleAudioEngine::getEffectsVolume(){ +float SimpleAudioEngine::getEffectsVolume() +{ return g_SimpleAudioEngineLinux->effectsvolume; } @@ -114,7 +128,8 @@ float SimpleAudioEngine::getEffectsVolume(){ * * @param volume must be within the range of 0.0 as the minimum and 1.0 as the maximum. */ -void SimpleAudioEngine::setEffectsVolume(float volume){ +void SimpleAudioEngine::setEffectsVolume(float volume) +{ g_SimpleAudioEngineLinux->effectsvolume = volume; } @@ -132,7 +147,8 @@ void SimpleAudioEngine::setEffectsVolume(float volume){ * - no pitch effect on Samsung Galaxy S2 with OpenSL backend enabled; * - no pitch/pan/gain on win32. */ -unsigned int SimpleAudioEngine::playEffect(const char* filePath, bool loop, float pitch, float pan, float gain){ +unsigned int SimpleAudioEngine::playEffect(const char* filePath, bool loop, float pitch, float pan, float gain) +{ return AudioEngine::play2d(filePath, loop, gain); } @@ -141,14 +157,16 @@ unsigned int SimpleAudioEngine::playEffect(const char* filePath, bool loop, floa * * @param soundId The return value of function playEffect. */ -void SimpleAudioEngine::pauseEffect(unsigned int soundId){ +void SimpleAudioEngine::pauseEffect(unsigned int soundId) +{ AudioEngine::pause(soundId); } /** * Pause all playing sound effect. */ -void SimpleAudioEngine::pauseAllEffects(){ +void SimpleAudioEngine::pauseAllEffects() +{ AudioEngine::pauseAll(); } @@ -157,14 +175,16 @@ void SimpleAudioEngine::pauseAllEffects(){ * * @param soundId The return value of function playEffect. */ -void SimpleAudioEngine::resumeEffect(unsigned int soundId){ +void SimpleAudioEngine::resumeEffect(unsigned int soundId) +{ AudioEngine::resume(soundId); } /** * Resume all playing sound effect. */ -void SimpleAudioEngine::resumeAllEffects(){ +void SimpleAudioEngine::resumeAllEffects() +{ AudioEngine::resumeAll(); } @@ -173,14 +193,16 @@ void SimpleAudioEngine::resumeAllEffects(){ * * @param soundId The return value of function playEffect. */ -void SimpleAudioEngine::stopEffect(unsigned int soundId){ +void SimpleAudioEngine::stopEffect(unsigned int soundId) +{ AudioEngine::stop(soundId); } /** * Stop all playing sound effects. */ -void SimpleAudioEngine::stopAllEffects(){ +void SimpleAudioEngine::stopAllEffects() +{ AudioEngine::stopAll(); } @@ -192,7 +214,8 @@ void SimpleAudioEngine::stopAllEffects(){ * @param filePath The path of the effect file. * @js NA */ -void SimpleAudioEngine::preloadEffect(const char* filePath){ +void SimpleAudioEngine::preloadEffect(const char* filePath) +{ AudioEngine::preload(filePath); } @@ -201,6 +224,7 @@ void SimpleAudioEngine::preloadEffect(const char* filePath){ * * @param filePath The path of the effect file. */ -void SimpleAudioEngine::unloadEffect(const char* filePath){ +void SimpleAudioEngine::unloadEffect(const char* filePath) +{ AudioEngine::uncache(filePath); } From 2f5b53ad590f26e1f9e5ec03e3d81e628212ddd4 Mon Sep 17 00:00:00 2001 From: zhangbin Date: Thu, 19 May 2016 11:30:28 +0800 Subject: [PATCH 147/241] Update the reference of submodule cocos2d-console. Solve the error when running cocos command if ~/.cocos is not existed. --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 78d6c743c2df..36cf53639e67 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 78d6c743c2df425b4774a80d6fee785795617acf +Subproject commit 36cf53639e6723213f2f0dfb5e9ebdacd22c057c From c68ecaffabaa30498c48d40a96d1460c96376cd6 Mon Sep 17 00:00:00 2001 From: zhangbin Date: Thu, 19 May 2016 12:04:56 +0800 Subject: [PATCH 148/241] Update the reference of submodule cocos2d-console. Solve the english grammar error. --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 36cf53639e67..4d46da39f8f5 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 36cf53639e6723213f2f0dfb5e9ebdacd22c057c +Subproject commit 4d46da39f8f59390b3f294cf285ca277bc9275f6 From 21fc67b358312e3f86d3d30806586b9fd4f026ca Mon Sep 17 00:00:00 2001 From: Greg Rynkowski Date: Wed, 18 May 2016 12:27:12 +0100 Subject: [PATCH 149/241] Enable WebView's local storage on Android Problem: cocos2d::experimental::ui::WebView' local storage wasn't working on Android. On iOS worked fine. Solution: Enable local storage of android.webkit.WebView in Android. References: https://developer.android.com/reference/android/webkit/WebSettings.html http://stackoverflow.com/questions/5899087/android-webview-localstorage --- .../android/java/src/org/cocos2dx/lib/Cocos2dxWebView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebView.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebView.java index 3a2229746a9d..a592dd50f98a 100755 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebView.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebView.java @@ -54,6 +54,7 @@ public Cocos2dxWebView(Context context, int viewTag) { this.getSettings().setSupportZoom(false); + this.getSettings().setDomStorageEnabled(true); this.getSettings().setJavaScriptEnabled(true); // `searchBoxJavaBridge_` has big security risk. http://jvn.jp/en/jp/JVN53768697 From 0f3b36e8344e6c7b151294f731e392430404850f Mon Sep 17 00:00:00 2001 From: mogemimi Date: Fri, 20 May 2016 01:39:40 +0900 Subject: [PATCH 150/241] Fix gcc warnings and type mismatch issues in AudioEngine for Linux --- cocos/audio/linux/AudioEngine-linux.cpp | 16 ++++++++-------- cocos/audio/linux/AudioEngine-linux.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cocos/audio/linux/AudioEngine-linux.cpp b/cocos/audio/linux/AudioEngine-linux.cpp index ecd4ff009825..63bad17ab064 100644 --- a/cocos/audio/linux/AudioEngine-linux.cpp +++ b/cocos/audio/linux/AudioEngine-linux.cpp @@ -2,6 +2,7 @@ * @author cesarpachon */ #include +#include #include "audio/linux/AudioEngine-linux.h" #include "base/CCDirector.h" @@ -139,7 +140,7 @@ bool AudioEngineImpl::resume(int audioID) channel->setMode(mapChannelInfo[audioID].loop ? FMOD_LOOP_NORMAL : FMOD_LOOP_OFF); channel->setLoopCount(mapChannelInfo[audioID].loop ? -1 : 0); channel->setVolume(mapChannelInfo[audioID].volume); - channel->setUserData((void *)mapChannelInfo[audioID].id); + channel->setUserData(reinterpret_cast(static_cast(mapChannelInfo[audioID].id))); mapChannelInfo[audioID].channel = channel; } @@ -234,11 +235,11 @@ void AudioEngineImpl::setFinishCallback(int audioID, const std::functiongetUserData(&data); - id = (size_t) data; + id = static_cast(reinterpret_cast(data)); if (mapChannelInfo[id].callback) { mapChannelInfo[id].callback(id, mapChannelInfo[id].path); } @@ -289,15 +290,15 @@ int AudioEngineImpl::preload(const std::string& filePath, std::function(mapChannelInfo.size()) + 1; auto& chanelInfo = mapChannelInfo[id]; chanelInfo.sound = sound; - chanelInfo.id = (size_t) id; + chanelInfo.id = id; chanelInfo.channel = nullptr; chanelInfo.callback = nullptr; chanelInfo.path = filePath; //we are going to use UserData to store pointer to Channel when playing - chanelInfo.sound->setUserData((void *)id); + chanelInfo.sound->setUserData(reinterpret_cast(static_cast(id))); if (callback) { callback(true); @@ -319,9 +320,8 @@ FMOD::Sound * AudioEngineImpl::findSound(const std::string &path) FMOD::Channel * AudioEngineImpl::getChannel(FMOD::Sound *sound) { - size_t id; void * data; sound->getUserData(&data); - id = (size_t) data; + int id = static_cast(reinterpret_cast(data)); return mapChannelInfo[id].channel; } diff --git a/cocos/audio/linux/AudioEngine-linux.h b/cocos/audio/linux/AudioEngine-linux.h index 79d5d1595bab..548a95b578ab 100644 --- a/cocos/audio/linux/AudioEngine-linux.h +++ b/cocos/audio/linux/AudioEngine-linux.h @@ -83,7 +83,7 @@ class CC_DLL AudioEngineImpl : public cocos2d::Ref FMOD::Channel * getChannel(FMOD::Sound *); struct ChannelInfo{ - size_t id; + int id; std::string path; FMOD::Sound * sound; FMOD::Channel * channel; From 8e1f1d2c14716ba7444ea8a6dfca053366f7fe66 Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 20 May 2016 11:19:40 +0800 Subject: [PATCH 151/241] fix compiling error --- tools/bindings-generator | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bindings-generator b/tools/bindings-generator index b8cdfb9d3732..353df5756b10 160000 --- a/tools/bindings-generator +++ b/tools/bindings-generator @@ -1 +1 @@ -Subproject commit b8cdfb9d3732ca2cc5dd9609c88ac8294e2d761b +Subproject commit 353df5756b10a2e9662b2866687b30e533cd17a8 From 565225c30291d8d8820cbe4b23035945cce144ae Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 20 May 2016 11:25:17 +0800 Subject: [PATCH 152/241] update deps --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index 41f0749df93d..3d2efa4b40bc 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version":"v3-deps-94", + "version":"v3-deps-95", "zip_file_size":"128440074", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", From 86d148c24ce3861afb132b739d5fe2b435caeae7 Mon Sep 17 00:00:00 2001 From: halx99 Date: Fri, 20 May 2016 23:10:28 +0800 Subject: [PATCH 153/241] change if (fontName.c_str()) to if(!fontName.empty()) fix warnning, change if (fontName.c_str()) to if(!fontName.empty()), The first expression's value always true. --- cocos/platform/win32/CCDevice-win32.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/platform/win32/CCDevice-win32.cpp b/cocos/platform/win32/CCDevice-win32.cpp index fe8bd50b16d3..20bb284cefeb 100644 --- a/cocos/platform/win32/CCDevice-win32.cpp +++ b/cocos/platform/win32/CCDevice-win32.cpp @@ -99,7 +99,7 @@ class BitmapDC } - bool setFont(const char * pFontName = nullptr, int nSize = 0) + bool setFont(const char * pFontName = "", int nSize = 0) { bool bRet = false; do @@ -110,7 +110,7 @@ class BitmapDC LOGFONTA tNewFont = {0}; LOGFONTA tOldFont = {0}; GetObjectA(hDefFont, sizeof(tNewFont), &tNewFont); - if (fontName.c_str()) + if (!fontName.empty()) { // create font from ttf file if (FileUtils::getInstance()->getFileExtension(fontName) == ".ttf") From ad3c3051720d80cc9cba14384a03c42180dc425f Mon Sep 17 00:00:00 2001 From: mogemimi Date: Sun, 22 May 2016 07:05:35 +0900 Subject: [PATCH 154/241] Prevent too many C4996 warnings caused by ignoreAnchorPointForPosition() --- cocos/2d/CCSprite.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/cocos/2d/CCSprite.h b/cocos/2d/CCSprite.h index 40d0b73790c0..883a08a0e530 100644 --- a/cocos/2d/CCSprite.h +++ b/cocos/2d/CCSprite.h @@ -470,9 +470,6 @@ class CC_DLL Sprite : public Node, public TextureProtocol virtual void setIgnoreAnchorPointForPosition(bool value) override; - // @deprecated Use setIgnoreAnchorPointForPosition() instead. - CC_DEPRECATED_ATTRIBUTE virtual void ignoreAnchorPointForPosition(bool value) override { setIgnoreAnchorPointForPosition(value); } - virtual void setVisible(bool bVisible) override; virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; virtual void setOpacityModifyRGB(bool modify) override; From b6d72e33d898cb2f7e61725990f9d1239faca179 Mon Sep 17 00:00:00 2001 From: Vladimir Perminov Date: Mon, 23 May 2016 04:48:15 +0300 Subject: [PATCH 155/241] Fix password style text in UTF-16 (#15620) * Fix password style text in UTF-16 Label used UTF-16 in internal. Need string in UTF-8. * Set correct char for Max and iOS * Add test for TextFiledTTF Secure Text Entry --- cocos/2d/CCTextFieldTTF.cpp | 4 +- .../Classes/TextInputTest/TextInputTest.cpp | 37 ++++++++++++++++++- .../Classes/TextInputTest/TextInputTest.h | 13 +++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/cocos/2d/CCTextFieldTTF.cpp b/cocos/2d/CCTextFieldTTF.cpp index 63e66625aba2..a592686e850f 100644 --- a/cocos/2d/CCTextFieldTTF.cpp +++ b/cocos/2d/CCTextFieldTTF.cpp @@ -34,7 +34,7 @@ NS_CC_BEGIN #define CURSOR_TIME_SHOW_HIDE 0.5f #define CURSOR_DEFAULT_CHAR '|' - +#define PASSWORD_STYLE_TEXT_DEFAULT "\xe2\x80\xa2" static int _calcCharCount(const char * text) { int n = 0; @@ -63,7 +63,7 @@ TextFieldTTF::TextFieldTTF() , _placeHolder("") // prevent Label initWithString assertion , _colorText(Color4B::WHITE) , _secureTextEntry(false) -,_passwordStyleText("\u25CF") +, _passwordStyleText(PASSWORD_STYLE_TEXT_DEFAULT) , _cursorEnabled(false) , _cursorPosition(0) , _cursorChar(CURSOR_DEFAULT_CHAR) diff --git a/tests/cpp-tests/Classes/TextInputTest/TextInputTest.cpp b/tests/cpp-tests/Classes/TextInputTest/TextInputTest.cpp index 93add405391b..3c419bf011e0 100644 --- a/tests/cpp-tests/Classes/TextInputTest/TextInputTest.cpp +++ b/tests/cpp-tests/Classes/TextInputTest/TextInputTest.cpp @@ -9,6 +9,7 @@ TextInputTests::TextInputTests() { ADD_TEST_CASE(TextFieldTTFDefaultTest); ADD_TEST_CASE(TextFieldTTFActionTest); + ADD_TEST_CASE(TextFieldTTFSecureTextEntryTest); } static Rect getRect(Node * node) @@ -158,7 +159,7 @@ void TextFieldTTFDefaultTest::onEnter() #else pTextField->setPosition(Vec2(s.width / 2, s.height / 2)); #endif - + _trackNode = pTextField; } @@ -340,3 +341,37 @@ void TextFieldTTFActionTest::callbackRemoveNodeWhenDidAction(Node * node) { this->removeChild(node, true); } + + +////////////////////////////////////////////////////////////////////////// +// implement TextFieldTTFSecureTextEntryTest +////////////////////////////////////////////////////////////////////////// + +std::string TextFieldTTFSecureTextEntryTest::subtitle() const +{ + return "TextFieldTTF with SecureTextEntry test"; +} + +void TextFieldTTFSecureTextEntryTest::onEnter() +{ + KeyboardNotificationLayer::onEnter(); + + // add TextFieldTTF + auto s = Director::getInstance()->getWinSize(); + + auto pTextField = TextFieldTTF::textFieldWithPlaceHolder("", + FONT_NAME, + FONT_SIZE); + addChild(pTextField); + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + // on android, TextFieldTTF cannot auto adjust its position when soft-keyboard pop up + // so we had to set a higher position to make it visable + pTextField->setPosition(Vec2(s.width / 2, s.height/2 + 50)); +#else + pTextField->setPosition(Vec2(s.width / 2, s.height / 2)); +#endif + pTextField->setSecureTextEntry(true); + + _trackNode = pTextField; +} \ No newline at end of file diff --git a/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h b/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h index 4c3f48a610d9..7a62a6b51b19 100644 --- a/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h +++ b/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h @@ -75,4 +75,17 @@ class TextFieldTTFActionTest : public KeyboardNotificationLayer, public cocos2d: virtual bool onDraw(cocos2d::TextFieldTTF* sender); }; +////////////////////////////////////////////////////////////////////////// +// TextFieldTTFSecureTextEntryTest for test TextFieldTTF SecureTextEntry. +////////////////////////////////////////////////////////////////////////// + +class TextFieldTTFSecureTextEntryTest : public TextFieldTTFDefaultTest +{ +public: + CREATE_FUNC(TextFieldTTFSecureTextEntryTest); + + virtual std::string subtitle() const override; + // Layer + virtual void onEnter() override; +}; #endif // __TEXT_INPUT_TEST_H__ From 758425cfd5a09bd53d33196e8729721a8b4ffae9 Mon Sep 17 00:00:00 2001 From: Shulepov Date: Mon, 23 May 2016 14:26:19 +0400 Subject: [PATCH 156/241] Refactor CCFileUtils-apple to remove code duplication (#15645) * Refactor CCFileUtils-apple to remove code duplication of conversion from CCValue to NSObject and vise versa * CCFileUtilsApple: rename helper functions --- cocos/platform/apple/CCFileUtils-apple.mm | 306 +++++++--------------- 1 file changed, 94 insertions(+), 212 deletions(-) diff --git a/cocos/platform/apple/CCFileUtils-apple.mm b/cocos/platform/apple/CCFileUtils-apple.mm index a9ddeba70da9..d415e21bb3c7 100644 --- a/cocos/platform/apple/CCFileUtils-apple.mm +++ b/cocos/platform/apple/CCFileUtils-apple.mm @@ -52,18 +52,75 @@ void setBundle(NSBundle* bundle) { NSBundle* bundle_; }; -static void addValueToDict(id nsKey, id nsValue, ValueMap& dict); -static void addObjectToNSDict(const std::string& key, const Value& value, NSMutableDictionary *dict); +static id convertCCValueToNSObject(const cocos2d::Value &value); +static cocos2d::Value convertNSObjectToCCValue(id object); -static void addItemToArray(id item, ValueVector& array) +static void addNSObjectToCCMap(id nsKey, id nsValue, ValueMap& dict); +static void addCCValueToNSDictionary(const std::string& key, const Value& value, NSMutableDictionary *dict); +static void addNSObjectToCCVector(id item, ValueVector& array); +static void addCCValueToNSArray(const Value& value, NSMutableArray *array); + +static id convertCCValueToNSObject(const cocos2d::Value &value) +{ + switch (value.getType()) + { + case Value::Type::NONE: + return [NSNull null]; + + case Value::Type::STRING: + return [NSString stringWithCString:value.asString().c_str() encoding:NSUTF8StringEncoding]; + + case Value::Type::BYTE: + return [NSNumber numberWithInt:value.asByte()]; + + case Value::Type::INTEGER: + return [NSNumber numberWithInt:value.asInt()]; + + case Value::Type::UNSIGNED: + return [NSNumber numberWithUnsignedInt:value.asUnsignedInt()]; + + case Value::Type::FLOAT: + return [NSNumber numberWithFloat:value.asFloat()]; + + case Value::Type::DOUBLE: + return [NSNumber numberWithDouble:value.asDouble()]; + + case Value::Type::BOOLEAN: + return [NSNumber numberWithBool:value.asBool()]; + + case Value::Type::VECTOR: { + NSMutableArray *array = [NSMutableArray array]; + const ValueVector &vector = value.asValueVector(); + for (const auto &e : vector) { + addCCValueToNSArray(e, array); + } + return array; + } + + case Value::Type::MAP: { + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + const ValueMap &map = value.asValueMap(); + for (auto iter = map.begin(); iter != map.end(); ++iter) { + addCCValueToNSDictionary(iter->first, iter->second, dictionary); + } + return dictionary; + } + + case Value::Type::INT_KEY_MAP: + break; + } + + return [NSNull null]; +} + +static cocos2d::Value convertNSObjectToCCValue(id item) { // add string value into array if ([item isKindOfClass:[NSString class]]) { - array.push_back(Value([item UTF8String])); - return; + return Value([item UTF8String]); } - + // add number value into array(such as int, float, bool and so on) // the value is a number if ([item isKindOfClass:[NSNumber class]]) @@ -73,23 +130,23 @@ static void addItemToArray(id item, ValueVector& array) if(num == (void*)kCFBooleanFalse || num == (void*)kCFBooleanTrue) { bool v = [num boolValue]; - array.push_back(Value(v)); + return Value(v); } else if(strcmp(numType, @encode(float)) == 0) { - array.push_back(Value([num floatValue])); + return Value([num floatValue]); } else if(strcmp(numType, @encode(double)) == 0) { - array.push_back(Value([num doubleValue])); + return Value([num doubleValue]); } - else{ - array.push_back(Value([num intValue])); + else + { + return Value([num intValue]); } - return; } - - + + // add dictionary value into array if ([item isKindOfClass:[NSDictionary class]]) { @@ -97,226 +154,51 @@ static void addItemToArray(id item, ValueVector& array) for (id subKey in [item allKeys]) { id subValue = [item objectForKey:subKey]; - addValueToDict(subKey, subValue, dict); + addNSObjectToCCMap(subKey, subValue, dict); } - - array.push_back(Value(dict)); - return; + + return Value(dict); } - + // add array value into array if ([item isKindOfClass:[NSArray class]]) { ValueVector subArray; for (id subItem in item) { - addItemToArray(subItem, subArray); + addNSObjectToCCVector(subItem, subArray); } - array.push_back(Value(subArray)); - return; + return Value(subArray); } + + return Value::Null; } -static void addObjectToNSArray(const Value& value, NSMutableArray *array) +static void addNSObjectToCCVector(id item, ValueVector& array) { - // add string into array - if (value.getType() == Value::Type::STRING) - { - NSString *element = [NSString stringWithCString:value.asString().c_str() encoding:NSUTF8StringEncoding]; - [array addObject:element]; - return; - } - - //add float into array - if (value.getType() == Value::Type::FLOAT) { - NSNumber *number = [NSNumber numberWithFloat:value.asFloat()]; - [array addObject:number]; - } - - //add double into array - if (value.getType() == Value::Type::DOUBLE) { - NSNumber *number = [NSNumber numberWithDouble:value.asDouble()]; - [array addObject:number]; - } - - //add boolean into array - if (value.getType() == Value::Type::BOOLEAN) { - NSNumber *element = [NSNumber numberWithBool:value.asBool()]; - [array addObject:element]; - } - - if (value.getType() == Value::Type::INTEGER) { - NSNumber *element = [NSNumber numberWithInt:value.asInt()]; - [array addObject:element]; - } - - //todo: add date and data support - - // add array into array - if (value.getType() == Value::Type::VECTOR) - { - NSMutableArray *element = [NSMutableArray array]; - - ValueVector valueArray = value.asValueVector(); - - for (const auto &e : valueArray) - { - addObjectToNSArray(e, element); - } - - [array addObject:element]; - return; - } - - // add dictionary value into array - if (value.getType() == Value::Type::MAP) - { - NSMutableDictionary *element = [NSMutableDictionary dictionary]; - - auto valueDict = value.asValueMap(); - for (auto iter = valueDict.begin(); iter != valueDict.end(); ++iter) - { - addObjectToNSDict(iter->first, iter->second, element); - } + array.push_back(convertNSObjectToCCValue(item)); +} - [array addObject:element]; - } +static void addCCValueToNSArray(const Value& value, NSMutableArray *array) +{ + [array addObject:convertCCValueToNSObject(value)]; } -static void addValueToDict(id nsKey, id nsValue, ValueMap& dict) +static void addNSObjectToCCMap(id nsKey, id nsValue, ValueMap& dict) { // the key must be a string CCASSERT([nsKey isKindOfClass:[NSString class]], "The key should be a string!"); std::string key = [nsKey UTF8String]; - - // the value is a string - if ([nsValue isKindOfClass:[NSString class]]) - { - dict[key] = Value([nsValue UTF8String]); - return; - } - - // the value is a number - if ([nsValue isKindOfClass:[NSNumber class]]) - { - NSNumber* num = nsValue; - const char* numType = [num objCType]; - if(num == (void*)kCFBooleanFalse || num == (void*)kCFBooleanTrue) - { - bool v = [num boolValue]; - dict[key] = Value(v); - } - else if(strcmp(numType, @encode(float)) == 0) - { - dict[key] = Value([num floatValue]); - } - else if(strcmp(numType, @encode(double)) == 0) - { - dict[key] = Value([num doubleValue]); - } - else{ - dict[key] = Value([num intValue]); - } - return; - } - - - // the value is a new dictionary - if ([nsValue isKindOfClass:[NSDictionary class]]) - { - ValueMap subDict; - - for (id subKey in [nsValue allKeys]) - { - id subValue = [nsValue objectForKey:subKey]; - addValueToDict(subKey, subValue, subDict); - } - dict[key] = Value(subDict); - return; - } - - // the value is a array - if ([nsValue isKindOfClass:[NSArray class]]) - { - ValueVector valueArray; - - for (id item in nsValue) - { - addItemToArray(item, valueArray); - } - dict[key] = Value(valueArray); - return; - } - + dict[key] = convertNSObjectToCCValue(nsValue); } -static void addObjectToNSDict(const std::string& key, const Value& value, NSMutableDictionary *dict) +static void addCCValueToNSDictionary(const std::string& key, const Value& value, NSMutableDictionary *dict) { NSString *NSkey = [NSString stringWithCString:key.c_str() encoding:NSUTF8StringEncoding]; - - // the object is a Dictionary - if (value.getType() == Value::Type::MAP) - { - NSMutableDictionary *dictElement = [NSMutableDictionary dictionary]; - ValueMap subDict = value.asValueMap(); - for (auto iter = subDict.begin(); iter != subDict.end(); ++iter) - { - addObjectToNSDict(iter->first, iter->second, dictElement); - } - - [dict setObject:dictElement forKey:NSkey]; - return; - } - - //add float into dict - if (value.getType() == Value::Type::FLOAT) { - NSNumber *number = [NSNumber numberWithFloat:value.asFloat()]; - [dict setObject:number forKey:NSkey]; - } - - //add double into dict - if (value.getType() == Value::Type::DOUBLE) { - NSNumber *number = [NSNumber numberWithDouble:value.asDouble()]; - [dict setObject:number forKey:NSkey]; - } - - //add boolean into dict - if (value.getType() == Value::Type::BOOLEAN) { - NSNumber *element = [NSNumber numberWithBool:value.asBool()]; - [dict setObject:element forKey:NSkey]; - } - - //add integer into dict - if (value.getType() == Value::Type::INTEGER) { - NSNumber *element = [NSNumber numberWithInt:value.asInt()]; - [dict setObject:element forKey:NSkey]; - } - - // the object is a String - if (value.getType() == Value::Type::STRING) - { - NSString *strElement = [NSString stringWithCString:value.asString().c_str() encoding:NSUTF8StringEncoding]; - [dict setObject:strElement forKey:NSkey]; - return; - } - - // the object is a Array - if (value.getType() == Value::Type::VECTOR) - { - NSMutableArray *arrElement = [NSMutableArray array]; - - ValueVector array = value.asValueVector(); - - for(const auto& v : array) - { - addObjectToNSArray(v, arrElement); - } - - [dict setObject:arrElement forKey:NSkey]; - return; - } + [dict setObject:convertCCValueToNSObject(value) forKey:NSkey]; } + FileUtilsApple::FileUtilsApple() : pimpl_(new IMPL([NSBundle mainBundle])) { } @@ -472,7 +354,7 @@ static int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, str for (id key in [dict allKeys]) { id value = [dict objectForKey:key]; - addValueToDict(key, value, ret); + addNSObjectToCCMap(key, value, ret); } } return ret; @@ -491,7 +373,7 @@ static int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, str for (auto iter = dict.begin(); iter != dict.end(); ++iter) { - addObjectToNSDict(iter->first, iter->second, nsDict); + addCCValueToNSDictionary(iter->first, iter->second, nsDict); } NSString *file = [NSString stringWithUTF8String:fullPath.c_str()]; @@ -508,7 +390,7 @@ static int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, str for (const auto &e : vecData) { - addObjectToNSArray(e, array); + addCCValueToNSArray(e, array); } [array writeToFile:path atomically:YES]; @@ -530,7 +412,7 @@ static int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, str for (id value in array) { - addItemToArray(value, ret); + addNSObjectToCCVector(value, ret); } return ret; From ce807225f89a11f503fb107b740bf598fb14f9e7 Mon Sep 17 00:00:00 2001 From: Ce Zheng Date: Mon, 23 May 2016 20:03:04 +0900 Subject: [PATCH 157/241] use manifestUrl from remote version In case if local version file is very old, and remote version has changed the manifest url ever since, this fix will make sure that AssetsManagerEx will download the correct manifest file --- extensions/assets-manager/AssetsManagerEx.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/extensions/assets-manager/AssetsManagerEx.cpp b/extensions/assets-manager/AssetsManagerEx.cpp index bd176ef50988..13375045621d 100644 --- a/extensions/assets-manager/AssetsManagerEx.cpp +++ b/extensions/assets-manager/AssetsManagerEx.cpp @@ -494,7 +494,13 @@ void AssetsManagerEx::downloadManifest() if (_updateState != State::PREDOWNLOAD_MANIFEST) return; - std::string manifestUrl = _localManifest->getManifestFileUrl(); + std::string manifestUrl; + if (_remoteManifest->isVersionLoaded()) { + manifestUrl = _remoteManifest->getManifestFileUrl(); + } else { + manifestUrl = _localManifest->getManifestFileUrl(); + } + if (manifestUrl.size() > 0) { _updateState = State::DOWNLOADING_MANIFEST; From 8d1aad0f96bc9608b76d84cab47f50756ca67c16 Mon Sep 17 00:00:00 2001 From: Mikhail Shulepov Date: Mon, 23 May 2016 18:10:00 +0300 Subject: [PATCH 158/241] Fix test cases with PVRTC textures loading on devices that don't support this formats --- .../SpriteFrameCacheTest/SpriteFrameCacheTest.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/cpp-tests/Classes/SpriteFrameCacheTest/SpriteFrameCacheTest.cpp b/tests/cpp-tests/Classes/SpriteFrameCacheTest/SpriteFrameCacheTest.cpp index a592b9563c7e..6ef895cdae1a 100644 --- a/tests/cpp-tests/Classes/SpriteFrameCacheTest/SpriteFrameCacheTest.cpp +++ b/tests/cpp-tests/Classes/SpriteFrameCacheTest/SpriteFrameCacheTest.cpp @@ -54,11 +54,12 @@ SpriteFrameCachePixelFormatTest::SpriteFrameCachePixelFormatTest() loadSpriteFrames("Images/sprite_frames_test/test_RGB888.plist", Texture2D::PixelFormat::RGB888); loadSpriteFrames("Images/sprite_frames_test/test_RGBA4444.plist", Texture2D::PixelFormat::RGBA4444); loadSpriteFrames("Images/sprite_frames_test/test_RGBA5551.plist", Texture2D::PixelFormat::RGB5A1); -#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC - loadSpriteFrames("Images/sprite_frames_test/test_PVRTC2.plist", Texture2D::PixelFormat::PVRTC2A); - loadSpriteFrames("Images/sprite_frames_test/test_PVRTC4.plist", Texture2D::PixelFormat::PVRTC4A); - loadSpriteFrames("Images/sprite_frames_test/test_PVRTC2_NOALPHA.plist", Texture2D::PixelFormat::PVRTC2); -#endif + + if (Configuration::getInstance()->supportsPVRTC()) { + loadSpriteFrames("Images/sprite_frames_test/test_PVRTC2.plist", Texture2D::PixelFormat::PVRTC2A); + loadSpriteFrames("Images/sprite_frames_test/test_PVRTC4.plist", Texture2D::PixelFormat::PVRTC4A); + loadSpriteFrames("Images/sprite_frames_test/test_PVRTC2_NOALPHA.plist", Texture2D::PixelFormat::PVRTC2); + } // test loading atlases wihtout PixelFormat specified Texture2D::setDefaultAlphaPixelFormat(Texture2D::PixelFormat::RGB5A1); @@ -75,8 +76,7 @@ void SpriteFrameCachePixelFormatTest::loadSpriteFrames(const std::string &file, Texture2D *texture = spriteFrame->getTexture(); const ssize_t bitsPerKB = 8 * 1024; const double memorySize = 1.0 * texture->getBitsPerPixelForFormat() * texture->getContentSizeInPixels().width * texture->getContentSizeInPixels().height / bitsPerKB; - //FIXME: texture->getPixelFormat() != expectedFormat all the time, such as Texture2D::PixelFormat::PVRTC2A -// CC_ASSERT(texture->getPixelFormat() == expectedFormat); + CC_ASSERT(texture->getPixelFormat() == expectedFormat); const std::string textureInfo = StringUtils::format("%s: %.2f KB\r\n", texture->getStringForFormat(), memorySize); infoLabel->setString(infoLabel->getString() + textureInfo); From 38fd8ebca9cc469bb691380578dc3c8ea5f4b972 Mon Sep 17 00:00:00 2001 From: mogemimi Date: Tue, 24 May 2016 10:14:36 +0900 Subject: [PATCH 159/241] Fix typo in function name: Keybard -> Keyboard --- cocos/scripting/js-bindings/manual/ScriptingCore.cpp | 2 +- cocos/scripting/js-bindings/manual/ScriptingCore.h | 2 +- .../js-bindings/manual/jsb_event_dispatcher_manual.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp index df0198b11bbb..d9a038058833 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp @@ -1525,7 +1525,7 @@ bool ScriptingCore::executeFunctionWithOwner(jsval owner, const char *name, cons return bRet; } -bool ScriptingCore::handleKeybardEvent(void* nativeObj, cocos2d::EventKeyboard::KeyCode keyCode, bool isPressed, cocos2d::Event* event) +bool ScriptingCore::handleKeyboardEvent(void* nativeObj, cocos2d::EventKeyboard::KeyCode keyCode, bool isPressed, cocos2d::Event* event) { JSAutoCompartment ac(_cx, _global.ref()); diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.h b/cocos/scripting/js-bindings/manual/ScriptingCore.h index 3213a4453feb..4574c74a274c 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.h +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.h @@ -548,7 +548,7 @@ class CC_JS_DLL ScriptingCore : public cocos2d::ScriptEngineProtocol bool handleMouseEvent(void* nativeObj, cocos2d::EventMouse::MouseEventType eventType, cocos2d::Event* event); bool handleMouseEvent(void* nativeObj, cocos2d::EventMouse::MouseEventType eventType, cocos2d::Event* event, JS::MutableHandleValue jsvalRet); - bool handleKeybardEvent(void* nativeObj, cocos2d::EventKeyboard::KeyCode keyCode, bool isPressed, cocos2d::Event* event); + bool handleKeyboardEvent(void* nativeObj, cocos2d::EventKeyboard::KeyCode keyCode, bool isPressed, cocos2d::Event* event); bool handleFocusEvent(void* nativeObj, cocos2d::ui::Widget* widgetLoseFocus, cocos2d::ui::Widget* widgetGetFocus); void restartVM(); diff --git a/cocos/scripting/js-bindings/manual/jsb_event_dispatcher_manual.cpp b/cocos/scripting/js-bindings/manual/jsb_event_dispatcher_manual.cpp index 900ee3e20520..948b2db45fa9 100644 --- a/cocos/scripting/js-bindings/manual/jsb_event_dispatcher_manual.cpp +++ b/cocos/scripting/js-bindings/manual/jsb_event_dispatcher_manual.cpp @@ -138,11 +138,11 @@ bool js_EventListenerKeyboard_create(JSContext *cx, uint32_t argc, jsval *vp) auto ret = EventListenerKeyboard::create(); ret->onKeyPressed = [ret](EventKeyboard::KeyCode keyCode, Event* event) { - ScriptingCore::getInstance()->handleKeybardEvent(ret, keyCode, true, event); + ScriptingCore::getInstance()->handleKeyboardEvent(ret, keyCode, true, event); }; ret->onKeyReleased = [ret](EventKeyboard::KeyCode keyCode, Event* event) { - ScriptingCore::getInstance()->handleKeybardEvent(ret, keyCode, false, event); + ScriptingCore::getInstance()->handleKeyboardEvent(ret, keyCode, false, event); }; jsval jsret = OBJECT_TO_JSVAL(js_get_or_create_jsobject(cx, ret)); From 5019dc7878cab90e5c534e51700eb512e76ac548 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 24 May 2016 10:06:28 +0800 Subject: [PATCH 160/241] don't strip png text --- build/cocos2d_tests.xcodeproj/project.pbxproj | 26 +++++++++++++++++++ .../HelloCpp.xcodeproj/project.pbxproj | 2 ++ .../HelloJavascript.xcodeproj/project.pbxproj | 2 ++ .../HelloJavascript.xcodeproj/project.pbxproj | 10 +++---- .../HelloLua.xcodeproj/project.pbxproj | 2 ++ 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/build/cocos2d_tests.xcodeproj/project.pbxproj b/build/cocos2d_tests.xcodeproj/project.pbxproj index ba368539ad30..9fcbdde80869 100644 --- a/build/cocos2d_tests.xcodeproj/project.pbxproj +++ b/build/cocos2d_tests.xcodeproj/project.pbxproj @@ -7672,6 +7672,7 @@ ); PRODUCT_NAME = "lua-game-controller-test iOS"; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/.. $(SRCROOT)/../external $(SRCROOT)/../external/lua/luajit/include $(SRCROOT)/../external/lua/tolua"; VALID_ARCHS = "arm64 armv7"; @@ -7705,6 +7706,7 @@ ); PRODUCT_NAME = "lua-game-controller-test iOS"; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/.. $(SRCROOT)/../external $(SRCROOT)/../external/lua/luajit/include $(SRCROOT)/../external/lua/tolua"; VALIDATE_PRODUCT = YES; @@ -7802,6 +7804,7 @@ PROVISIONING_PROFILE = ""; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/.. $(SRCROOT)/../cocos $(SRCROOT)/../extensions $(SRCROOT)/../external $(inherited) $(SRCROOT)/../external/spidermonkey/include/ios $(SRCROOT)/../external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; @@ -7834,6 +7837,7 @@ PROVISIONING_PROFILE = ""; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/.. $(SRCROOT)/../cocos $(SRCROOT)/../extensions $(SRCROOT)/../external $(inherited) $(SRCROOT)/../external/spidermonkey/include/ios $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; @@ -7921,6 +7925,7 @@ INFOPLIST_FILE = "$(SRCROOT)/../tests/cpp-empty-test/proj.ios/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; @@ -7939,6 +7944,7 @@ INFOPLIST_FILE = "$(SRCROOT)/../tests/cpp-empty-test/proj.ios/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; @@ -7968,6 +7974,7 @@ 100000000, ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/.. $(SRCROOT)/../external $(SRCROOT)/../external/lua/luajit/include $(SRCROOT)/../external/lua/tolua"; VALID_ARCHS = "arm64 armv7"; @@ -7996,6 +8003,7 @@ 100000000, ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/.. $(SRCROOT)/../external $(SRCROOT)/../external/lua/luajit/include $(SRCROOT)/../external/lua/tolua"; VALIDATE_PRODUCT = YES; @@ -8064,6 +8072,7 @@ 100000000, ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/.. $(SRCROOT)/../external $(SRCROOT)/../external/lua/luajit/include $(SRCROOT)/../external/lua/tolua $(SRCROOT)/../external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; @@ -8092,6 +8101,7 @@ 100000000, ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/.. $(SRCROOT)/../external $(SRCROOT)/../external/lua/luajit/include $(SRCROOT)/../external/lua/tolua $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; @@ -8146,6 +8156,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "game-controller-test IOS"; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; @@ -8166,6 +8177,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "game-controller-test IOS"; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; @@ -8190,6 +8202,7 @@ ); PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; + STRIP_PNG_TEXT = NO; TVOS_DEPLOYMENT_TARGET = 9.1; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; }; @@ -8212,6 +8225,7 @@ ); PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; + STRIP_PNG_TEXT = NO; TVOS_DEPLOYMENT_TARGET = 9.1; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; @@ -8237,6 +8251,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = appletvos; + STRIP_PNG_TEXT = NO; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/.. $(SRCROOT)/../cocos $(SRCROOT)/../extensions $(SRCROOT)/../external $(inherited) $(SRCROOT)/../external/spidermonkey/include/ios $(SRCROOT)/../external/curl/include/ios"; }; name = Debug; @@ -8261,6 +8276,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = appletvos; + STRIP_PNG_TEXT = NO; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/.. $(SRCROOT)/../cocos $(SRCROOT)/../extensions $(SRCROOT)/../external $(inherited) $(SRCROOT)/../external/spidermonkey/include/ios $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; }; @@ -8295,6 +8311,7 @@ ); PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/.. $(SRCROOT)/../external $(SRCROOT)/../external/lua/luajit/include $(SRCROOT)/../external/lua/tolua $(SRCROOT)/../external/curl/include/ios"; }; @@ -8315,6 +8332,7 @@ ); PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/.. $(SRCROOT)/../external $(SRCROOT)/../external/lua/luajit/include $(SRCROOT)/../external/lua/tolua $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; @@ -8332,6 +8350,7 @@ INFOPLIST_FILE = "$(SRCROOT)/../tests/game-controller-test/proj.ios/Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; + STRIP_PNG_TEXT = NO; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; }; name = Debug; @@ -8347,6 +8366,7 @@ INFOPLIST_FILE = "$(SRCROOT)/../tests/game-controller-test/proj.ios/Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; + STRIP_PNG_TEXT = NO; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; }; @@ -8442,6 +8462,7 @@ PROVISIONING_PROFILE = ""; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/.. $(SRCROOT)/../cocos $(SRCROOT)/../extensions $(SRCROOT)/../external $(inherited) $(SRCROOT)/../external/spidermonkey/include/ios $(SRCROOT)/../external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; @@ -8474,6 +8495,7 @@ PROVISIONING_PROFILE = ""; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/.. $(SRCROOT)/../cocos $(SRCROOT)/../extensions $(SRCROOT)/../external $(inherited) $(SRCROOT)/../external/spidermonkey/include/ios $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; @@ -8534,6 +8556,7 @@ "$(SRCROOT)/../external/curl/prebuilt/ios", ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; @@ -8559,6 +8582,7 @@ "$(SRCROOT)/../external/curl/prebuilt/ios", ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; @@ -8645,6 +8669,7 @@ ); PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; @@ -8672,6 +8697,7 @@ ); PROVISIONING_PROFILE = ""; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../external/curl/include/ios"; VALIDATE_PRODUCT = YES; diff --git a/templates/cpp-template-default/proj.ios_mac/HelloCpp.xcodeproj/project.pbxproj b/templates/cpp-template-default/proj.ios_mac/HelloCpp.xcodeproj/project.pbxproj index 1d1ec0875ba3..fc077016104c 100644 --- a/templates/cpp-template-default/proj.ios_mac/HelloCpp.xcodeproj/project.pbxproj +++ b/templates/cpp-template-default/proj.ios_mac/HelloCpp.xcodeproj/project.pbxproj @@ -554,6 +554,7 @@ "$(_COCOS_LIB_IOS_END)", ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; @@ -584,6 +585,7 @@ "$(_COCOS_LIB_IOS_END)", ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; diff --git a/templates/js-template-default/frameworks/runtime-src/proj.ios_mac/HelloJavascript.xcodeproj/project.pbxproj b/templates/js-template-default/frameworks/runtime-src/proj.ios_mac/HelloJavascript.xcodeproj/project.pbxproj index 3efca65d41fc..ed1226b241a9 100644 --- a/templates/js-template-default/frameworks/runtime-src/proj.ios_mac/HelloJavascript.xcodeproj/project.pbxproj +++ b/templates/js-template-default/frameworks/runtime-src/proj.ios_mac/HelloJavascript.xcodeproj/project.pbxproj @@ -897,6 +897,7 @@ LIBRARY_SEARCH_PATHS = ""; OTHER_LDFLAGS = ""; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/external/spidermonkey/include/ios $(SRCROOT)/../../cocos2d-x/plugin/jsbindings/auto $(SRCROOT)/../../cocos2d-x/plugin/jsbindings/manual $(SRCROOT)/../../cocos2d-x/cocos"; VALID_ARCHS = "arm64 armv7"; @@ -921,6 +922,7 @@ LIBRARY_SEARCH_PATHS = ""; OTHER_LDFLAGS = ""; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/external/spidermonkey/include/ios $(SRCROOT)/../../cocos2d-x/plugin/jsbindings/auto $(SRCROOT)/../../cocos2d-x/plugin/jsbindings/manual $(SRCROOT)/../../cocos2d-x/cocos"; VALID_ARCHS = "arm64 armv7"; diff --git a/templates/js-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloJavascript.xcodeproj/project.pbxproj b/templates/js-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloJavascript.xcodeproj/project.pbxproj index 2222f5ef39e2..b98fe9cdc91a 100644 --- a/templates/js-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloJavascript.xcodeproj/project.pbxproj +++ b/templates/js-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloJavascript.xcodeproj/project.pbxproj @@ -1129,9 +1129,7 @@ GCC_DYNAMIC_NO_PIC = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ios/Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - ); + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; GCC_SYMBOLS_PRIVATE_EXTERN = YES; HEADER_SEARCH_PATHS = ( "$(SRCROOT)/../Classes", @@ -1143,6 +1141,7 @@ LIBRARY_SEARCH_PATHS = ""; OTHER_LDFLAGS = ""; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos $(SRCROOT)/../../cocos2d-x/external/spidermonkey/include/ios $(SRCROOT)/../../cocos2d-x/plugin/jsbindings/auto $(SRCROOT)/../../cocos2d-x/plugin/jsbindings/manual $(SRCROOT)/../../cocos2d-x/external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; @@ -1159,9 +1158,7 @@ GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ios/Prefix.pch; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - ); + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; GCC_SYMBOLS_PRIVATE_EXTERN = YES; HEADER_SEARCH_PATHS = ( "$(SRCROOT)/../Classes", @@ -1173,6 +1170,7 @@ LIBRARY_SEARCH_PATHS = ""; OTHER_LDFLAGS = ""; SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos $(SRCROOT)/../../cocos2d-x/external/spidermonkey/include/ios $(SRCROOT)/../../cocos2d-x/plugin/jsbindings/auto $(SRCROOT)/../../cocos2d-x/plugin/jsbindings/manual $(SRCROOT)/../../cocos2d-x/external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj b/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj index 45d0239315d7..32984e8d0cc7 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj +++ b/templates/lua-template-default/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj @@ -901,6 +901,7 @@ 100000000, ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; @@ -938,6 +939,7 @@ 100000000, ); SDKROOT = iphoneos; + STRIP_PNG_TEXT = NO; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited) $(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; From fff7a78efe07f9ab5d10e8021bbe69350990b001 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 24 May 2016 15:59:00 +0800 Subject: [PATCH 161/241] lock mutext to get element from g_queue --- .../js-bindings/manual/ScriptingCore.cpp | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp index df0198b11bbb..d6079c589cd6 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp @@ -1757,20 +1757,26 @@ void ScriptingCore::garbageCollect() void SimpleRunLoop::update(float dt) { - g_qMutex.lock(); - size_t size = g_queue.size(); - g_qMutex.unlock(); - - while (size > 0) + std::string message; + size_t messageCount = 0; + while (true) { g_qMutex.lock(); - auto first = g_queue.begin(); - std::string str = *first; - g_queue.erase(first); - size = g_queue.size(); + messageCount = g_queue.size(); + if (messageCount > 0) + { + auto first = g_queue.begin(); + message = *first; + g_queue.erase(first); + --messageCount; + } g_qMutex.unlock(); - - ScriptingCore::getInstance()->debugProcessInput(str); + + if (messageCount == 0) + break; + + if (!message.empty()) + ScriptingCore::getInstance()->debugProcessInput(message); } } @@ -1788,20 +1794,26 @@ void ScriptingCore::debugProcessInput(const std::string& str) static bool NS_ProcessNextEvent() { - g_qMutex.lock(); - size_t size = g_queue.size(); - g_qMutex.unlock(); - - while (size > 0) + std::string message; + size_t messageCount = 0; + while (true) { g_qMutex.lock(); - auto first = g_queue.begin(); - std::string str = *first; - g_queue.erase(first); - size = g_queue.size(); + messageCount = g_queue.size(); + if (messageCount > 0) + { + auto first = g_queue.begin(); + message = *first; + g_queue.erase(first); + --messageCount; + } g_qMutex.unlock(); - - ScriptingCore::getInstance()->debugProcessInput(str); + + if (messageCount == 0) + break; + + if (!message.empty()) + ScriptingCore::getInstance()->debugProcessInput(message); } // std::this_thread::yield(); std::this_thread::sleep_for(std::chrono::milliseconds(10)); From 5daaa6e49bfe110160f79af455d0e5297a1e35e1 Mon Sep 17 00:00:00 2001 From: alecmilne Date: Tue, 24 May 2016 11:27:59 +0100 Subject: [PATCH 162/241] Adding setBounce to webview (#15623) * Adding setBounce to webview This makes the .bounces of the scrollview section of webview publically accessible When set to true it stops the grey over scroll of webviews * Adding empty function for setBounces to Android * Adding empty setBounces function for tizen * Adding comments for empty Android and Tizen setBounce functions * Small comment text change --- cocos/ui/UIWebView-inl.h | 7 ++++++- cocos/ui/UIWebView.h | 6 ++++++ cocos/ui/UIWebViewImpl-android.cpp | 4 ++++ cocos/ui/UIWebViewImpl-android.h | 2 ++ cocos/ui/UIWebViewImpl-ios.h | 2 ++ cocos/ui/UIWebViewImpl-ios.mm | 10 ++++++++++ cocos/ui/UIWebViewImpl-tizen.cpp | 4 ++++ cocos/ui/UIWebViewImpl-tizen.h | 2 ++ 8 files changed, 36 insertions(+), 1 deletion(-) diff --git a/cocos/ui/UIWebView-inl.h b/cocos/ui/UIWebView-inl.h index 09676345d426..fc7e33e860e3 100644 --- a/cocos/ui/UIWebView-inl.h +++ b/cocos/ui/UIWebView-inl.h @@ -157,7 +157,12 @@ namespace experimental{ Widget::onExit(); _impl->setVisible(false); } - + + void WebView::setBounces(bool bounces) + { + _impl->setBounces(bounces); + } + cocos2d::ui::Widget* WebView::createCloneInstance() { return WebView::create(); diff --git a/cocos/ui/UIWebView.h b/cocos/ui/UIWebView.h index 20ac7e45d1d7..42c422823f4b 100644 --- a/cocos/ui/UIWebView.h +++ b/cocos/ui/UIWebView.h @@ -30,6 +30,7 @@ #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) && !defined(CC_PLATFORM_OS_TVOS) + #include "ui/UIWidget.h" #include "ui/GUIExport.h" #include "base/CCData.h" @@ -197,6 +198,11 @@ class CC_GUI_DLL WebView : public cocos2d::ui::Widget { */ ccWebViewCallback getOnJSCallback()const; + /** + * Set whether the webview bounces at end of scroll of WebView. + */ + void setBounces(bool bounce); + virtual void draw(cocos2d::Renderer *renderer, cocos2d::Mat4 const &transform, uint32_t flags) override; /** diff --git a/cocos/ui/UIWebViewImpl-android.cpp b/cocos/ui/UIWebViewImpl-android.cpp index 233d607921ed..ad7c8013618e 100644 --- a/cocos/ui/UIWebViewImpl-android.cpp +++ b/cocos/ui/UIWebViewImpl-android.cpp @@ -281,6 +281,10 @@ namespace cocos2d { void WebViewImpl::setVisible(bool visible) { JniHelper::callStaticVoidMethod(className, "setVisible", _viewTag, visible); } + + void WebViewImpl::setBounces(bool bounces) { + // empty function as this was mainly a fix for iOS + } } // namespace ui } // namespace experimental } //namespace cocos2d diff --git a/cocos/ui/UIWebViewImpl-android.h b/cocos/ui/UIWebViewImpl-android.h index 2617618c7b8c..260d50e92628 100644 --- a/cocos/ui/UIWebViewImpl-android.h +++ b/cocos/ui/UIWebViewImpl-android.h @@ -83,6 +83,8 @@ namespace cocos2d { virtual void setVisible(bool visible); + void setBounces(bool bounces); + static bool shouldStartLoading(const int viewTag, const std::string &url); static void didFinishLoading(const int viewTag, const std::string &url); static void didFailLoading(const int viewTag, const std::string &url); diff --git a/cocos/ui/UIWebViewImpl-ios.h b/cocos/ui/UIWebViewImpl-ios.h index 00a993c1591c..4b25792a19ec 100644 --- a/cocos/ui/UIWebViewImpl-ios.h +++ b/cocos/ui/UIWebViewImpl-ios.h @@ -80,6 +80,8 @@ class WebViewImpl { virtual void setVisible(bool visible); + void setBounces(bool bounces); + private: UIWebViewWrapper *_uiWebViewWrapper; WebView *_webView; diff --git a/cocos/ui/UIWebViewImpl-ios.mm b/cocos/ui/UIWebViewImpl-ios.mm index 9def96fc552b..39a2a950ff6c 100644 --- a/cocos/ui/UIWebViewImpl-ios.mm +++ b/cocos/ui/UIWebViewImpl-ios.mm @@ -72,6 +72,8 @@ + (instancetype)webViewWrapper; - (void)setVisible:(bool)visible; +- (void)setBounces:(bool)bounces; + - (void)setFrameWithX:(float)x y:(float)y width:(float)width height:(float)height; - (void)setJavascriptInterfaceScheme:(const std::string &)scheme; @@ -146,6 +148,10 @@ - (void)setVisible:(bool)visible { self.uiWebView.hidden = !visible; } +- (void)setBounces:(bool)bounces { + self.uiWebView.scrollView.bounces = bounces; +} + - (void)setFrameWithX:(float)x y:(float)y width:(float)width height:(float)height { if (!self.uiWebView) {[self setupWebView];} CGRect newFrame = CGRectMake(x, y, width, height); @@ -342,6 +348,10 @@ - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { [_uiWebViewWrapper evaluateJS:js]; } +void WebViewImpl::setBounces(bool bounces) { + [_uiWebViewWrapper setBounces:bounces]; +} + void WebViewImpl::setScalesPageToFit(const bool scalesPageToFit) { [_uiWebViewWrapper setScalesPageToFit:scalesPageToFit]; } diff --git a/cocos/ui/UIWebViewImpl-tizen.cpp b/cocos/ui/UIWebViewImpl-tizen.cpp index 6792e7cf4b79..e730af2c7deb 100644 --- a/cocos/ui/UIWebViewImpl-tizen.cpp +++ b/cocos/ui/UIWebViewImpl-tizen.cpp @@ -155,6 +155,10 @@ namespace cocos2d { evas_object_hide(_ewkView); } } + + void WebViewImpl::setBounces(bool bounces) { + // empty function as this was mainly a fix for iOS + } } // namespace ui } // namespace experimental } //namespace cocos2d diff --git a/cocos/ui/UIWebViewImpl-tizen.h b/cocos/ui/UIWebViewImpl-tizen.h index 0a58d1cfa052..ae16e050baf8 100644 --- a/cocos/ui/UIWebViewImpl-tizen.h +++ b/cocos/ui/UIWebViewImpl-tizen.h @@ -84,6 +84,8 @@ namespace cocos2d { virtual void setVisible(bool visible); + void setBounces(bool bounces); + Evas_Object* _ewkWin;; Evas_Object* _ewkView; private: From 02a9c9aae3f5eaf09a8674fec695626ec7a096cc Mon Sep 17 00:00:00 2001 From: Ricardo Quesada Date: Tue, 24 May 2016 10:53:23 -0300 Subject: [PATCH 163/241] fix: update damping in physics github issue #15630 --- cocos/physics/CCPhysicsBody.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/physics/CCPhysicsBody.cpp b/cocos/physics/CCPhysicsBody.cpp index e62ba32666ab..6ffe1fc02e98 100644 --- a/cocos/physics/CCPhysicsBody.cpp +++ b/cocos/physics/CCPhysicsBody.cpp @@ -773,12 +773,12 @@ void PhysicsBody::setResting(bool rest) const void PhysicsBody::update(float delta) { // damping compute - /*if (_isDamping && _dynamic && !isResting()) + if (_isDamping && _dynamic && !isResting()) { _cpBody->v.x *= cpfclamp(1.0f - delta * _linearDamping, 0.0f, 1.0f); _cpBody->v.y *= cpfclamp(1.0f - delta * _linearDamping, 0.0f, 1.0f); _cpBody->w *= cpfclamp(1.0f - delta * _angularDamping, 0.0f, 1.0f); - }*/ + } } void PhysicsBody::setCategoryBitmask(int bitmask) From 1e04cb5950c54351e8c1ef4c8ea178f84033457f Mon Sep 17 00:00:00 2001 From: mogemimi Date: Wed, 25 May 2016 03:09:11 +0900 Subject: [PATCH 164/241] Use nullptr instead of 0 or NULL --- cocos/2d/CCActionInterval.cpp | 2 +- cocos/base/CCDirector.cpp | 2 +- cocos/base/CCIMEDispatcher.cpp | 8 ++++---- cocos/base/CCUserDefault.cpp | 2 +- cocos/navmesh/CCNavMesh.cpp | 2 +- cocos/navmesh/CCNavMeshUtils.cpp | 4 ++-- cocos/navmesh/CCNavMeshUtils.h | 2 +- cocos/physics3d/CCPhysics3DObject.cpp | 4 ++-- cocos/renderer/CCGLProgram.cpp | 4 ++-- cocos/renderer/CCGLProgramCache.cpp | 2 +- cocos/renderer/CCRenderState.cpp | 10 ++++----- cocos/renderer/CCTextureCache.cpp | 2 +- cocos/ui/UIScale9Sprite.cpp | 29 +++++++++++++-------------- 13 files changed, 36 insertions(+), 37 deletions(-) diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index ad91c57d7dcf..758981b252f4 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -1958,7 +1958,7 @@ bool Blink::initWithDuration(float duration, int blinks) void Blink::stop() { - if(NULL != _target) + if (nullptr != _target) _target->setVisible(_originalState); ActionInterval::stop(); } diff --git a/cocos/base/CCDirector.cpp b/cocos/base/CCDirector.cpp index a4f6797d4776..af12cfa64903 100644 --- a/cocos/base/CCDirector.cpp +++ b/cocos/base/CCDirector.cpp @@ -1088,7 +1088,7 @@ void Director::restartDirector() // Real restart in script level #if CC_ENABLE_SCRIPT_BINDING - ScriptEvent scriptEvent(kRestartGame, NULL); + ScriptEvent scriptEvent(kRestartGame, nullptr); ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&scriptEvent); #endif } diff --git a/cocos/base/CCIMEDispatcher.cpp b/cocos/base/CCIMEDispatcher.cpp index ab2420f0e5d7..e6f2baf5e8e7 100644 --- a/cocos/base/CCIMEDispatcher.cpp +++ b/cocos/base/CCIMEDispatcher.cpp @@ -273,7 +273,7 @@ void IMEDispatcher::dispatchKeyboardWillShow(IMEKeyboardNotificationInfo& info) { if (_impl) { - IMEDelegate * delegate = 0; + IMEDelegate * delegate = nullptr; DelegateIter last = _impl->_delegateList.end(); for (DelegateIter first = _impl->_delegateList.begin(); first != last; ++first) { @@ -290,7 +290,7 @@ void IMEDispatcher::dispatchKeyboardDidShow(IMEKeyboardNotificationInfo& info) { if (_impl) { - IMEDelegate * delegate = 0; + IMEDelegate * delegate = nullptr; DelegateIter last = _impl->_delegateList.end(); for (DelegateIter first = _impl->_delegateList.begin(); first != last; ++first) { @@ -307,7 +307,7 @@ void IMEDispatcher::dispatchKeyboardWillHide(IMEKeyboardNotificationInfo& info) { if (_impl) { - IMEDelegate * delegate = 0; + IMEDelegate * delegate = nullptr; DelegateIter last = _impl->_delegateList.end(); for (DelegateIter first = _impl->_delegateList.begin(); first != last; ++first) { @@ -324,7 +324,7 @@ void IMEDispatcher::dispatchKeyboardDidHide(IMEKeyboardNotificationInfo& info) { if (_impl) { - IMEDelegate * delegate = 0; + IMEDelegate * delegate = nullptr; DelegateIter last = _impl->_delegateList.end(); for (DelegateIter first = _impl->_delegateList.begin(); first != last; ++first) { diff --git a/cocos/base/CCUserDefault.cpp b/cocos/base/CCUserDefault.cpp index ebc674877c98..34c4e6167a0f 100644 --- a/cocos/base/CCUserDefault.cpp +++ b/cocos/base/CCUserDefault.cpp @@ -394,7 +394,7 @@ void UserDefault::setDataForKey(const char* pKey, const Data& value) { return; } - char *encodedData = 0; + char *encodedData = nullptr; base64Encode(value.getBytes(), static_cast(value.getSize()), &encodedData); diff --git a/cocos/navmesh/CCNavMesh.cpp b/cocos/navmesh/CCNavMesh.cpp index eb7d71211585..cc98bebc7dfc 100644 --- a/cocos/navmesh/CCNavMesh.cpp +++ b/cocos/navmesh/CCNavMesh.cpp @@ -229,7 +229,7 @@ bool NavMesh::loadNavMeshFile() bool NavMesh::loadGeomFile() { - unsigned char* buf = 0; + unsigned char* buf = nullptr; auto data = FileUtils::getInstance()->getDataFromFile(_geomFilePath); if (data.isNull()) return false; buf = data.getBytes(); diff --git a/cocos/navmesh/CCNavMeshUtils.cpp b/cocos/navmesh/CCNavMeshUtils.cpp index b332c9b91ed8..76341678c2cf 100644 --- a/cocos/navmesh/CCNavMeshUtils.cpp +++ b/cocos/navmesh/CCNavMeshUtils.cpp @@ -193,8 +193,8 @@ int fixupShortcuts(dtPolyRef* path, int npath, dtNavMeshQuery* navQuery) dtPolyRef neis[maxNeis]; int nneis = 0; - const dtMeshTile* tile = 0; - const dtPoly* poly = 0; + const dtMeshTile* tile = nullptr; + const dtPoly* poly = nullptr; if (dtStatusFailed(navQuery->getAttachedNavMesh()->getTileAndPolyByRef(path[0], &tile, &poly))) return npath; diff --git a/cocos/navmesh/CCNavMeshUtils.h b/cocos/navmesh/CCNavMeshUtils.h index 47299a56a5bc..83f3e8962491 100644 --- a/cocos/navmesh/CCNavMeshUtils.h +++ b/cocos/navmesh/CCNavMeshUtils.h @@ -125,7 +125,7 @@ bool getSteerTarget(dtNavMeshQuery* navQuery, const float* startPos, const float const float minTargetDist, const dtPolyRef* path, const int pathSize, float* steerPos, unsigned char& steerPosFlag, dtPolyRef& steerPosRef, - float* outPoints = 0, int* outPointCount = 0); + float* outPoints = nullptr, int* outPointCount = nullptr); /** @} */ NS_CC_END diff --git a/cocos/physics3d/CCPhysics3DObject.cpp b/cocos/physics3d/CCPhysics3DObject.cpp index 0134d41075c1..45ba53d61204 100644 --- a/cocos/physics3d/CCPhysics3DObject.cpp +++ b/cocos/physics3d/CCPhysics3DObject.cpp @@ -379,7 +379,7 @@ class btCollider : public btGhostObject ~btCollider(){}; ///this method is mainly for expert/internal use only. - virtual void addOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btBroadphaseProxy* thisProxy = 0) override + virtual void addOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btBroadphaseProxy* thisProxy = nullptr) override { btCollisionObject* otherObject = (btCollisionObject*)otherProxy->m_clientObject; btAssert(otherObject); @@ -395,7 +395,7 @@ class btCollider : public btGhostObject } ///this method is mainly for expert/internal use only. - virtual void removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btDispatcher* dispatcher, btBroadphaseProxy* thisProxy = 0) override + virtual void removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btDispatcher* dispatcher, btBroadphaseProxy* thisProxy = nullptr) override { btCollisionObject* otherObject = (btCollisionObject*)otherProxy->m_clientObject; btAssert(otherObject); diff --git a/cocos/renderer/CCGLProgram.cpp b/cocos/renderer/CCGLProgram.cpp index c7ce12d3d8f0..dd9314e479c7 100644 --- a/cocos/renderer/CCGLProgram.cpp +++ b/cocos/renderer/CCGLProgram.cpp @@ -349,7 +349,7 @@ void GLProgram::parseVertexAttribs() else { GLchar ErrorLog[1024]; - glGetProgramInfoLog(_program, sizeof(ErrorLog), NULL, ErrorLog); + glGetProgramInfoLog(_program, sizeof(ErrorLog), nullptr, ErrorLog); CCLOG("Error linking shader program: '%s'\n", ErrorLog); } } @@ -407,7 +407,7 @@ void GLProgram::parseUniforms() else { GLchar ErrorLog[1024]; - glGetProgramInfoLog(_program, sizeof(ErrorLog), NULL, ErrorLog); + glGetProgramInfoLog(_program, sizeof(ErrorLog), nullptr, ErrorLog); CCLOG("Error linking shader program: '%s'\n", ErrorLog); } diff --git a/cocos/renderer/CCGLProgramCache.cpp b/cocos/renderer/CCGLProgramCache.cpp index 59cf71edaa2c..e8f9a98554d4 100644 --- a/cocos/renderer/CCGLProgramCache.cpp +++ b/cocos/renderer/CCGLProgramCache.cpp @@ -71,7 +71,7 @@ enum { kShaderType_MAX, }; -static GLProgramCache *_sharedGLProgramCache = 0; +static GLProgramCache *_sharedGLProgramCache = nullptr; GLProgramCache* GLProgramCache::getInstance() { diff --git a/cocos/renderer/CCRenderState.cpp b/cocos/renderer/CCRenderState.cpp index 6f148038da9e..009794a2f017 100644 --- a/cocos/renderer/CCRenderState.cpp +++ b/cocos/renderer/CCRenderState.cpp @@ -55,7 +55,7 @@ RenderState::~RenderState() void RenderState::initialize() { - if (StateBlock::_defaultState == NULL) + if (StateBlock::_defaultState == nullptr) { StateBlock::_defaultState = StateBlock::create(); CC_SAFE_RETAIN(StateBlock::_defaultState); @@ -121,7 +121,7 @@ void RenderState::bind(Pass* pass) StateBlock::restore(stateOverrideBits); // Apply renderer state for the entire hierarchy, top-down. - rs = NULL; + rs = nullptr; while ((rs = getTopmost(rs))) { if (rs->_state) @@ -137,12 +137,12 @@ RenderState* RenderState::getTopmost(RenderState* below) if (rs == below) { // Nothing below ourself. - return NULL; + return nullptr; } while (rs) { - if (rs->_parent == below || rs->_parent == NULL) + if (rs->_parent == below || rs->_parent == nullptr) { // Stop traversing up here. return rs; @@ -150,7 +150,7 @@ RenderState* RenderState::getTopmost(RenderState* below) rs = rs->_parent; } - return NULL; + return nullptr; } RenderState::StateBlock* RenderState::getStateBlock() const diff --git a/cocos/renderer/CCTextureCache.cpp b/cocos/renderer/CCTextureCache.cpp index 424b0480e26e..b7508ca16718 100644 --- a/cocos/renderer/CCTextureCache.cpp +++ b/cocos/renderer/CCTextureCache.cpp @@ -679,7 +679,7 @@ void VolatileTextureMgr::addImage(Texture2D *tt, Image *image) VolatileTexture* VolatileTextureMgr::findVolotileTexture(Texture2D *tt) { - VolatileTexture *vt = 0; + VolatileTexture *vt = nullptr; auto i = _textures.begin(); while (i != _textures.end()) { diff --git a/cocos/ui/UIScale9Sprite.cpp b/cocos/ui/UIScale9Sprite.cpp index 41e70471cb3b..5f5d77983f5b 100644 --- a/cocos/ui/UIScale9Sprite.cpp +++ b/cocos/ui/UIScale9Sprite.cpp @@ -87,11 +87,11 @@ namespace ui { bool ret = false; do { Texture2D* texture = spriteFrame->getTexture(); - CCASSERT(texture != NULL, "CCTexture must be not nil"); + CCASSERT(texture != nullptr, "Texture2D must be not null"); if(texture == nullptr) break; Sprite *sprite = Sprite::createWithSpriteFrame(spriteFrame); - CCASSERT(sprite != NULL, "sprite must be not nil"); + CCASSERT(sprite != nullptr, "Sprite must be not null"); if(sprite == nullptr) break; ret = this->init(sprite, @@ -106,7 +106,7 @@ namespace ui { } bool Scale9Sprite::initWithSpriteFrame(SpriteFrame* spriteFrame) { - CCASSERT(spriteFrame != NULL, "Invalid spriteFrame for sprite"); + CCASSERT(spriteFrame != nullptr, "Invalid spriteFrame for sprite"); bool pReturn = this->initWithSpriteFrame(spriteFrame, Rect::ZERO); return pReturn; } @@ -137,7 +137,7 @@ namespace ui { bool Scale9Sprite::init() { - return this->init(NULL, Rect::ZERO, Rect::ZERO); + return this->init(nullptr, Rect::ZERO, Rect::ZERO); } bool Scale9Sprite::init(Sprite* sprite, const Rect& rect, const Rect& capInsets) @@ -236,7 +236,7 @@ namespace ui { return pReturn; } CC_SAFE_DELETE(pReturn); - return NULL; + return nullptr; } Scale9Sprite* Scale9Sprite::create(const std::string& file, @@ -250,7 +250,7 @@ namespace ui { return pReturn; } CC_SAFE_DELETE(pReturn); - return NULL; + return nullptr; } @@ -263,7 +263,7 @@ namespace ui { return pReturn; } CC_SAFE_DELETE(pReturn); - return NULL; + return nullptr; } @@ -278,7 +278,7 @@ namespace ui { return pReturn; } CC_SAFE_DELETE(pReturn); - return NULL; + return nullptr; } @@ -291,7 +291,7 @@ namespace ui { return pReturn; } CC_SAFE_DELETE(pReturn); - return NULL; + return nullptr; } @@ -305,7 +305,7 @@ namespace ui { return pReturn; } CC_SAFE_DELETE(pReturn); - return NULL; + return nullptr; } Scale9Sprite* Scale9Sprite::createWithSpriteFrame(SpriteFrame* spriteFrame) @@ -317,7 +317,7 @@ namespace ui { return pReturn; } CC_SAFE_DELETE(pReturn); - return NULL; + return nullptr; } @@ -331,7 +331,7 @@ namespace ui { return pReturn; } CC_SAFE_DELETE(pReturn); - return NULL; + return nullptr; } Scale9Sprite* Scale9Sprite::createWithSpriteFrameName(const std::string& spriteFrameName) @@ -345,8 +345,7 @@ namespace ui { CC_SAFE_DELETE(pReturn); log("Could not allocate Scale9Sprite()"); - return NULL; - + return nullptr; } void Scale9Sprite::cleanupSlicedSprites() @@ -582,7 +581,7 @@ namespace ui { return pReturn; } CC_SAFE_DELETE(pReturn); - return NULL; + return nullptr; } Scale9Sprite::State Scale9Sprite::getState()const From 9ad3db063503a2b1af97ce05c358c2e2fbb342e0 Mon Sep 17 00:00:00 2001 From: Ricardo Quesada Date: Tue, 24 May 2016 20:57:40 -0300 Subject: [PATCH 165/241] fix: make PolygonCode cleaner not sure if this fixes the bug, but it makes the interfaces cleaner. Github issue #15154 --- cocos/2d/CCAutoPolygon.cpp | 34 +++++++++++++------ cocos/2d/CCAutoPolygon.h | 15 ++------ cocos/2d/CCSprite.cpp | 2 +- cocos/2d/CCSprite.h | 4 +-- cocos/2d/CCSpriteFrame.cpp | 2 +- cocos/2d/CCSpriteFrame.h | 4 +-- cocos/ui/UIScale9Sprite.cpp | 4 ++- .../SpritePolygonTest/SpritePolygonTest.cpp | 14 ++++---- 8 files changed, 42 insertions(+), 37 deletions(-) diff --git a/cocos/2d/CCAutoPolygon.cpp b/cocos/2d/CCAutoPolygon.cpp index fe80c26f3e8c..315bdc12ae91 100644 --- a/cocos/2d/CCAutoPolygon.cpp +++ b/cocos/2d/CCAutoPolygon.cpp @@ -38,20 +38,32 @@ USING_NS_CC; static unsigned short quadIndices[]={0,1,2, 3,2,1}; const static float PRECISION = 10.0f; -PolygonInfo::PolygonInfo(const PolygonInfo& other): -triangles(), -rect(), -isVertsOwner(true) +PolygonInfo::PolygonInfo() +: rect(cocos2d::Rect::ZERO) +, filename("") +, isVertsOwner(true) +{ + triangles.verts = nullptr; + triangles.indices = nullptr; + triangles.vertCount = 0; + triangles.indexCount = 0; +}; + +PolygonInfo::PolygonInfo(const PolygonInfo& other) +: triangles() +, rect() +, isVertsOwner(true) { filename = other.filename; isVertsOwner = true; rect = other.rect; triangles.verts = new (std::nothrow) V3F_C4B_T2F[other.triangles.vertCount]; triangles.indices = new (std::nothrow) unsigned short[other.triangles.indexCount]; + CCASSERT(triangles.verts && triangles.indices, "not enough memory"); triangles.vertCount = other.triangles.vertCount; triangles.indexCount = other.triangles.indexCount; - memcpy(triangles.verts, other.triangles.verts, other.triangles.vertCount*sizeof(V3F_C4B_T2F)); - memcpy(triangles.indices, other.triangles.indices, other.triangles.indexCount*sizeof(unsigned short)); + memcpy(triangles.verts, other.triangles.verts, other.triangles.vertCount * sizeof(other.triangles.verts[0])); + memcpy(triangles.indices, other.triangles.indices, other.triangles.indexCount * sizeof(other.triangles.indices[0])); }; PolygonInfo& PolygonInfo::operator= (const PolygonInfo& other) @@ -64,10 +76,11 @@ PolygonInfo& PolygonInfo::operator= (const PolygonInfo& other) rect = other.rect; triangles.verts = new (std::nothrow) V3F_C4B_T2F[other.triangles.vertCount]; triangles.indices = new (std::nothrow) unsigned short[other.triangles.indexCount]; + CCASSERT(triangles.verts && triangles.indices, "not enough memory"); triangles.vertCount = other.triangles.vertCount; triangles.indexCount = other.triangles.indexCount; - memcpy(triangles.verts, other.triangles.verts, other.triangles.vertCount*sizeof(V3F_C4B_T2F)); - memcpy(triangles.indices, other.triangles.indices, other.triangles.indexCount*sizeof(unsigned short)); + memcpy(triangles.verts, other.triangles.verts, other.triangles.vertCount * sizeof(other.triangles.verts[0])); + memcpy(triangles.indices, other.triangles.indices, other.triangles.indexCount * sizeof(other.triangles.indices[0])); } return *this; } @@ -87,7 +100,7 @@ void PolygonInfo::setQuad(V3F_C4B_T2F_Quad *quad) triangles.verts = (V3F_C4B_T2F*)quad; } -void PolygonInfo::setTriangles(TrianglesCommand::Triangles other) +void PolygonInfo::setTriangles(const TrianglesCommand::Triangles& other) { this->releaseVertsAndIndices(); isVertsOwner = false; @@ -679,6 +692,5 @@ PolygonInfo AutoPolygon::generateTriangles(const Rect& rect, const float& epsilo PolygonInfo AutoPolygon::generatePolygon(const std::string& filename, const Rect& rect, const float epsilon, const float threshold) { AutoPolygon ap(filename); - auto ret = ap.generateTriangles(rect, epsilon, threshold); - return ret; + return ap.generateTriangles(rect, epsilon, threshold); } diff --git a/cocos/2d/CCAutoPolygon.h b/cocos/2d/CCAutoPolygon.h index 5863351407e8..422128dd60a4 100644 --- a/cocos/2d/CCAutoPolygon.h +++ b/cocos/2d/CCAutoPolygon.h @@ -54,17 +54,8 @@ class CC_DLL PolygonInfo * @memberof PolygonInfo * @return PolygonInfo object */ - PolygonInfo(): - rect(cocos2d::Rect::ZERO), - filename(""), - isVertsOwner(true) - { - triangles.verts = nullptr; - triangles.indices = nullptr; - triangles.vertCount = 0; - triangles.indexCount = 0; - }; - + PolygonInfo(); + /** * Create an polygoninfo from the data of another Polygoninfo * @param other another PolygonInfo to be copied @@ -95,7 +86,7 @@ class CC_DLL PolygonInfo * as the verts memory are managed by other objects * @param triangles a pointer to the TrianglesCommand::Triangles object */ - void setTriangles(TrianglesCommand::Triangles triangles); + void setTriangles(const TrianglesCommand::Triangles& triangles); /** * get vertex count diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index 347932859f3b..18b884850950 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -1183,7 +1183,7 @@ std::string Sprite::getDescription() const return StringUtils::format("", _tag, texture_id ); } -PolygonInfo& Sprite::getPolygonInfo() +const PolygonInfo& Sprite::getPolygonInfo() const { return _polyInfo; } diff --git a/cocos/2d/CCSprite.h b/cocos/2d/CCSprite.h index 883a08a0e530..b58166da34bb 100644 --- a/cocos/2d/CCSprite.h +++ b/cocos/2d/CCSprite.h @@ -406,9 +406,9 @@ class CC_DLL Sprite : public Node, public TextureProtocol /** * returns a reference of the polygon information associated with this sprite * - * @return a copy of PolygonInfo + * @return a reference of PolygonInfo */ - PolygonInfo& getPolygonInfo(); + const PolygonInfo& getPolygonInfo() const; /** * set the sprite to use this new PolygonInfo diff --git a/cocos/2d/CCSpriteFrame.cpp b/cocos/2d/CCSpriteFrame.cpp index 516d4f7157e7..18bf7fbc61cb 100644 --- a/cocos/2d/CCSpriteFrame.cpp +++ b/cocos/2d/CCSpriteFrame.cpp @@ -218,7 +218,7 @@ void SpriteFrame::setPolygonInfo(const PolygonInfo &polygonInfo) _polygonInfo = polygonInfo; } -const PolygonInfo &SpriteFrame::getPolygonInfo() const +const PolygonInfo& SpriteFrame::getPolygonInfo() const { return _polygonInfo; } diff --git a/cocos/2d/CCSpriteFrame.h b/cocos/2d/CCSpriteFrame.h index ae443b1ff301..a91ac54bea64 100644 --- a/cocos/2d/CCSpriteFrame.h +++ b/cocos/2d/CCSpriteFrame.h @@ -215,9 +215,9 @@ class CC_DLL SpriteFrame : public Ref, public Clonable /** Get the polygonInfo for this sprite * - * @return polygonInfo structure + * @return a reference to the polygonInfo structure */ - const PolygonInfo &getPolygonInfo() const; + const PolygonInfo& getPolygonInfo() const; /** Check if sprite frame is a polygon sprite * diff --git a/cocos/ui/UIScale9Sprite.cpp b/cocos/ui/UIScale9Sprite.cpp index 41e70471cb3b..6c4ec6c563ff 100644 --- a/cocos/ui/UIScale9Sprite.cpp +++ b/cocos/ui/UIScale9Sprite.cpp @@ -552,7 +552,9 @@ namespace ui { auto vertices = this->calculateVertices(capInsets, originalSize, offsets); auto triangles = this->calculateTriangles(uv, vertices); - _scale9Image->getPolygonInfo().setTriangles(triangles); + auto polyInfo = _scale9Image->getPolygonInfo(); + polyInfo.setTriangles(triangles); + _scale9Image->setPolygonInfo(polyInfo); } } diff --git a/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp b/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp index acecb2ce3e97..618e421bf63d 100644 --- a/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp +++ b/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.cpp @@ -91,23 +91,23 @@ void SpritePolygonTestCase::updateDrawNode() auto drawnode = _drawNodes.at(i); auto sp = (Sprite*)drawnode->getParent(); if(!sp) return; - auto polygoninfo = sp->getPolygonInfo(); + const auto& polygoninfo = sp->getPolygonInfo(); drawnode->clear(); - auto count = polygoninfo.triangles.indexCount/3; - auto indices = polygoninfo.triangles.indices; - auto verts = polygoninfo.triangles.verts; + const auto count = polygoninfo.triangles.indexCount/3; + const auto indices = polygoninfo.triangles.indices; + const auto verts = polygoninfo.triangles.verts; for(ssize_t i = 0; i < count; i++) { //draw 3 lines - Vec3 from =verts[indices[i*3]].vertices; + Vec3 from = verts[indices[i*3]].vertices; Vec3 to = verts[indices[i*3+1]].vertices; drawnode->drawLine(Vec2(from.x, from.y), Vec2(to.x,to.y), Color4F::GREEN); - from =verts[indices[i*3+1]].vertices; + from = verts[indices[i*3+1]].vertices; to = verts[indices[i*3+2]].vertices; drawnode->drawLine(Vec2(from.x, from.y), Vec2(to.x,to.y), Color4F::GREEN); - from =verts[indices[i*3+2]].vertices; + from = verts[indices[i*3+2]].vertices; to = verts[indices[i*3]].vertices; drawnode->drawLine(Vec2(from.x, from.y), Vec2(to.x,to.y), Color4F::GREEN); } From 1db3c1644dc08d182d34c766aeffbf34d9d0a5a3 Mon Sep 17 00:00:00 2001 From: James Chen Date: Wed, 25 May 2016 13:54:13 +0800 Subject: [PATCH 166/241] dlfree fix for HttpClient, the instances of Ref or its sub classes should be released by CC_SAFE_RELEASE rather than CC_SAFE_DELETE. --- cocos/network/HttpClient-android.cpp | 2 +- cocos/network/HttpClient-apple.mm | 2 +- cocos/network/HttpClient.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cocos/network/HttpClient-android.cpp b/cocos/network/HttpClient-android.cpp index cfd90fe8f49e..f167d0160af3 100644 --- a/cocos/network/HttpClient-android.cpp +++ b/cocos/network/HttpClient-android.cpp @@ -892,7 +892,7 @@ HttpClient::HttpClient() HttpClient::~HttpClient() { CCLOG("In the destructor of HttpClient!"); - CC_SAFE_DELETE(_requestSentinel); + CC_SAFE_RELEASE(_requestSentinel); } //Lazy create semaphore & mutex & thread diff --git a/cocos/network/HttpClient-apple.mm b/cocos/network/HttpClient-apple.mm index 997e095ec926..deae07a28a53 100644 --- a/cocos/network/HttpClient-apple.mm +++ b/cocos/network/HttpClient-apple.mm @@ -381,7 +381,7 @@ static int processTask(HttpClient* client, HttpRequest* request, NSString* reque HttpClient::~HttpClient() { - CC_SAFE_DELETE(_requestSentinel); + CC_SAFE_RELEASE(_requestSentinel); if (!_cookieFilename.empty() && nullptr != _cookie) { _cookie->writeFile(); diff --git a/cocos/network/HttpClient.cpp b/cocos/network/HttpClient.cpp index c124e70829c8..d6d4fd6d67f4 100644 --- a/cocos/network/HttpClient.cpp +++ b/cocos/network/HttpClient.cpp @@ -411,7 +411,7 @@ HttpClient::HttpClient() HttpClient::~HttpClient() { - CC_SAFE_DELETE(_requestSentinel); + CC_SAFE_RELEASE(_requestSentinel); CCLOG("HttpClient destructor"); } From e4bf6584dbccec2c47c0bbe045233ed4e76493ee Mon Sep 17 00:00:00 2001 From: Ce Zheng Date: Wed, 25 May 2016 18:34:05 +0900 Subject: [PATCH 167/241] correct assign to equal in cert trust expression --- cocos/network/HttpAsynConnection-apple.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/network/HttpAsynConnection-apple.m b/cocos/network/HttpAsynConnection-apple.m index 07b78478bd91..e63174b798ce 100644 --- a/cocos/network/HttpAsynConnection-apple.m +++ b/cocos/network/HttpAsynConnection-apple.m @@ -199,7 +199,7 @@ - (BOOL) shouldTrustProtectionSpace:(NSURLProtectionSpace*)protectionSpace CFRelease(certArrayRef); } //Did our custom trust chain evaluate successfully? - return trustResult = kSecTrustResultUnspecified || trustResult == kSecTrustResultProceed; + return trustResult == kSecTrustResultUnspecified || trustResult == kSecTrustResultProceed; } - (void) connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge From 896aeb2d0cf4426f2e5843699ca5dbb67f1d6ad9 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 25 May 2016 18:35:38 +0800 Subject: [PATCH 168/241] Fix android compilation issue with thumb mode --- cocos/editor-support/cocosbuilder/Android.mk | 4 ++++ cocos/editor-support/cocostudio/Android.mk | 4 ++++ cocos/editor-support/spine/Android.mk | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/cocos/editor-support/cocosbuilder/Android.mk b/cocos/editor-support/cocosbuilder/Android.mk index a93f8cf5aa19..0406e4d5781e 100644 --- a/cocos/editor-support/cocosbuilder/Android.mk +++ b/cocos/editor-support/cocosbuilder/Android.mk @@ -5,6 +5,10 @@ LOCAL_MODULE := cocosbuilder_static LOCAL_MODULE_FILENAME := libcocosbuilder +ifeq ($(USE_ARM_MODE),1) +LOCAL_ARM_MODE := arm +endif + LOCAL_SRC_FILES := CCBAnimationManager.cpp \ CCBFileLoader.cpp \ CCBKeyframe.cpp \ diff --git a/cocos/editor-support/cocostudio/Android.mk b/cocos/editor-support/cocostudio/Android.mk index 5a1ed035b6a9..720774bd7e49 100644 --- a/cocos/editor-support/cocostudio/Android.mk +++ b/cocos/editor-support/cocostudio/Android.mk @@ -5,6 +5,10 @@ LOCAL_MODULE := cocostudio_static LOCAL_MODULE_FILENAME := libcocostudio +ifeq ($(USE_ARM_MODE),1) +LOCAL_ARM_MODE := arm +endif + LOCAL_SRC_FILES := CCActionFrame.cpp \ CCActionFrameEasing.cpp \ CCActionManagerEx.cpp \ diff --git a/cocos/editor-support/spine/Android.mk b/cocos/editor-support/spine/Android.mk index cfc8769eb408..f357b68771c9 100644 --- a/cocos/editor-support/spine/Android.mk +++ b/cocos/editor-support/spine/Android.mk @@ -5,6 +5,10 @@ LOCAL_MODULE := spine_static LOCAL_MODULE_FILENAME := libspine +ifeq ($(USE_ARM_MODE),1) +LOCAL_ARM_MODE := arm +endif + LOCAL_SRC_FILES := Animation.c \ AnimationState.c \ AnimationStateData.c \ From 2c05ecc3cd0368914cff01e0276d7ceb6b4a4046 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 25 May 2016 18:36:02 +0800 Subject: [PATCH 169/241] Fix Component event issue --- cocos/scripting/js-bindings/manual/ScriptingCore.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp index ac27c15301e1..c1cb20d792f1 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp @@ -1311,12 +1311,10 @@ int ScriptingCore::handleComponentEvent(void* data) else if (action == kComponentOnEnter) { ret = executeFunctionWithOwner(nodeValue, "onEnter", 1, &dataVal, &retval); - resumeSchedulesAndActions(p); } else if (action == kComponentOnExit) { ret = executeFunctionWithOwner(nodeValue, "onExit", 1, &dataVal, &retval); - pauseSchedulesAndActions(p); } else if (action == kComponentOnUpdate) { From 8d5c102d75fc7bfd0e0edeb8e33b32346fdde1b8 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 25 May 2016 18:36:16 +0800 Subject: [PATCH 170/241] Update bindings generator --- tools/bindings-generator | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bindings-generator b/tools/bindings-generator index b8cdfb9d3732..32404751d539 160000 --- a/tools/bindings-generator +++ b/tools/bindings-generator @@ -1 +1 @@ -Subproject commit b8cdfb9d3732ca2cc5dd9609c88ac8294e2d761b +Subproject commit 32404751d5399ccb0cd9df4b72b211506cade321 From b830b7de4c12f18964944a19b9982cb6a4cd1732 Mon Sep 17 00:00:00 2001 From: Ricardo Quesada Date: Tue, 24 May 2016 17:05:08 -0300 Subject: [PATCH 171/241] fix: add code/resources to reproduce issue_15594 github issue #15594 --- build/cocos2d_tests.xcodeproj/project.pbxproj | 10 + .../cpp-tests/Classes/BugsTest/Bug-15594.cpp | 33 + tests/cpp-tests/Classes/BugsTest/Bug-15594.h | 15 + tests/cpp-tests/Classes/BugsTest/BugsTest.cpp | 2 + .../Resources/Images/bugs/bug15594.c3t | 2813 +++++++++++++++++ .../Resources/Images/bugs/bug15594.jpg | Bin 0 -> 431856 bytes 6 files changed, 2873 insertions(+) create mode 100644 tests/cpp-tests/Classes/BugsTest/Bug-15594.cpp create mode 100644 tests/cpp-tests/Classes/BugsTest/Bug-15594.h create mode 100644 tests/cpp-tests/Resources/Images/bugs/bug15594.c3t create mode 100755 tests/cpp-tests/Resources/Images/bugs/bug15594.jpg diff --git a/build/cocos2d_tests.xcodeproj/project.pbxproj b/build/cocos2d_tests.xcodeproj/project.pbxproj index 9fcbdde80869..1a316cee7723 100644 --- a/build/cocos2d_tests.xcodeproj/project.pbxproj +++ b/build/cocos2d_tests.xcodeproj/project.pbxproj @@ -773,6 +773,9 @@ 4B5C5BB61CA114E100D55A14 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B5C5BB41CA114DB00D55A14 /* Security.framework */; }; 4B5C5BB71CA114E700D55A14 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B5C5BB41CA114DB00D55A14 /* Security.framework */; }; 4B5C5BB81CA114EE00D55A14 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B5C5BB41CA114DB00D55A14 /* Security.framework */; }; + 500D1CD31CF4A48B00535D35 /* Bug-15594.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 500D1CD11CF4A48B00535D35 /* Bug-15594.cpp */; }; + 500D1CD41CF4A48B00535D35 /* Bug-15594.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 500D1CD11CF4A48B00535D35 /* Bug-15594.cpp */; }; + 500D1CD51CF4A48B00535D35 /* Bug-15594.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 500D1CD11CF4A48B00535D35 /* Bug-15594.cpp */; }; 5046AB4A1AF2A8D80060550B /* MaterialSystemTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5046AB481AF2A8D80060550B /* MaterialSystemTest.cpp */; }; 5046AB4B1AF2A8D80060550B /* MaterialSystemTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5046AB481AF2A8D80060550B /* MaterialSystemTest.cpp */; }; 5046AB5B1AF2C4180060550B /* Materials in Resources */ = {isa = PBXBuildFile; fileRef = 5046AB5A1AF2C4180060550B /* Materials */; }; @@ -2407,6 +2410,8 @@ 46A15F9C1807A4F8005B8026 /* cocos2d_libs.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = cocos2d_libs.xcodeproj; sourceTree = ""; }; 4B5C5BAA1CA1149900D55A14 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; 4B5C5BB41CA114DB00D55A14 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.1.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 500D1CD11CF4A48B00535D35 /* Bug-15594.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "Bug-15594.cpp"; sourceTree = ""; }; + 500D1CD21CF4A48B00535D35 /* Bug-15594.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Bug-15594.h"; sourceTree = ""; }; 5046AB481AF2A8D80060550B /* MaterialSystemTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MaterialSystemTest.cpp; sourceTree = ""; }; 5046AB491AF2A8D80060550B /* MaterialSystemTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MaterialSystemTest.h; sourceTree = ""; }; 5046AB5A1AF2C4180060550B /* Materials */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Materials; path = "../tests/cpp-tests/Resources/Materials"; sourceTree = ""; }; @@ -3572,6 +3577,8 @@ 59620E8E1921E5CF002021B6 /* Bug-Child.h */, 850F8A221B5F3A4F00780603 /* Bug-12847.cpp */, 850F8A231B5F3A4F00780603 /* Bug-12847.h */, + 500D1CD11CF4A48B00535D35 /* Bug-15594.cpp */, + 500D1CD21CF4A48B00535D35 /* Bug-15594.h */, ); path = BugsTest; sourceTree = ""; @@ -6875,6 +6882,7 @@ 1AC35BF518CECF0C00F37B72 /* HttpClientTest.cpp in Sources */, 1AC35B4F18CECF0C00F37B72 /* ClickAndMoveTest.cpp in Sources */, 29080DCF191B595E0066F8DF /* UISliderTest.cpp in Sources */, + 500D1CD31CF4A48B00535D35 /* Bug-15594.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7050,6 +7058,7 @@ buildActionMask = 2147483647; files = ( 507B42851C31E6070067B53E /* AppController.mm in Sources */, + 500D1CD51CF4A48B00535D35 /* Bug-15594.cpp in Sources */, 507B42861C31E6070067B53E /* main.m in Sources */, 507B42871C31E6070067B53E /* NativeOcClass.m in Sources */, 507B42881C31E6070067B53E /* js_Effect3D_bindings.cpp in Sources */, @@ -7180,6 +7189,7 @@ 1AC35C0418CECF0C00F37B72 /* FileUtilsTest.cpp in Sources */, 1AC35B5C18CECF0C00F37B72 /* CurlTest.cpp in Sources */, 1AC35C0018CECF0C00F37B72 /* CustomTableViewCell.cpp in Sources */, + 500D1CD41CF4A48B00535D35 /* Bug-15594.cpp in Sources */, 1AC35BF018CECF0C00F37B72 /* CCControlSwitchTest.cpp in Sources */, 1AC35B2C18CECF0C00F37B72 /* BaseTest.cpp in Sources */, 1AC35C9818CECF1400F37B72 /* main.m in Sources */, diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-15594.cpp b/tests/cpp-tests/Classes/BugsTest/Bug-15594.cpp new file mode 100644 index 000000000000..4ffbe6873cdf --- /dev/null +++ b/tests/cpp-tests/Classes/BugsTest/Bug-15594.cpp @@ -0,0 +1,33 @@ +// +// Bug-15594.cpp +// cocos2d_tests +// +// Created by Ricardo Quesada on 5/24/16. +// +// + +// https://github.com/cocos2d/cocos2d-x/pull/15594 + +#include "Bug-15594.h" + + +USING_NS_CC; + +bool Bug15594Layer::init() +{ + if (BugsTestBase::init()) + { + auto sprite3d = Sprite3D::create("Images/bugs/bug15594.c3t", "Images/bugs/bug15594.jpg"); + addChild(sprite3d); + auto size = Director::getInstance()->getWinSize(); + sprite3d->setPosition(size/2); + + auto animation = Animation3D::create("Images/bugs/bug15594.c3t"); + auto animate = Animate3D::create(animation); + auto repeate = RepeatForever::create(animate); + sprite3d->runAction(repeate); + return true; + } + + return false; +} diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-15594.h b/tests/cpp-tests/Classes/BugsTest/Bug-15594.h new file mode 100644 index 000000000000..60b72caccb0b --- /dev/null +++ b/tests/cpp-tests/Classes/BugsTest/Bug-15594.h @@ -0,0 +1,15 @@ +// https://github.com/cocos2d/cocos2d-x/pull/15594 +#ifndef __cocos2d_tests__Bug_15594__ +#define __cocos2d_tests__Bug_15594__ + +#include "BugsTest.h" + +class Bug15594Layer : public BugsTestBase +{ +public: + CREATE_FUNC(Bug15594Layer); + + virtual bool init() override; +}; + +#endif /* defined(__cocos2d_tests__Bug_15594__) */ diff --git a/tests/cpp-tests/Classes/BugsTest/BugsTest.cpp b/tests/cpp-tests/Classes/BugsTest/BugsTest.cpp index 5ea0363d2023..939e29f4500d 100644 --- a/tests/cpp-tests/Classes/BugsTest/BugsTest.cpp +++ b/tests/cpp-tests/Classes/BugsTest/BugsTest.cpp @@ -12,6 +12,7 @@ #include "Bug-Child.h" #include "Bug-CCDrawNode.h" #include "Bug-PageViewLayout.h" +#include "Bug-15594.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) #include "Bug-14327.h" @@ -33,6 +34,7 @@ BugsTests::BugsTests() ADD_TEST_CASE(BugDrawNodeLayer); ADD_TEST_CASE(BugPageViewLayer); ADD_TEST_CASE(Bug12847Layer); + ADD_TEST_CASE(Bug15594Layer); #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) ADD_TEST_CASE(Bug14327Layer); diff --git a/tests/cpp-tests/Resources/Images/bugs/bug15594.c3t b/tests/cpp-tests/Resources/Images/bugs/bug15594.c3t new file mode 100644 index 000000000000..e9c1884c12c0 --- /dev/null +++ b/tests/cpp-tests/Resources/Images/bugs/bug15594.c3t @@ -0,0 +1,2813 @@ +{ + "version": "0.7", + "id": "", + "meshes": [ + { + "attributes": [{ + "size": 3, + "type": "GL_FLOAT", + "attribute": "VERTEX_ATTRIB_POSITION" + }, { + "size": 3, + "type": "GL_FLOAT", + "attribute": "VERTEX_ATTRIB_NORMAL" + }, { + "size": 2, + "type": "GL_FLOAT", + "attribute": "VERTEX_ATTRIB_TEX_COORD" + }], + "vertices": [ + 0.000001, -0.000097, 0.163798, 0.707107, -0.707107, -0.000000, 0.507812, 1.000000, + -0.593922, -0.594019, -1.719537, 0.707107, -0.707107, -0.000000, 0.000000, 0.007812, + 0.000000, -0.000097, -1.719538, 0.707107, -0.707107, -0.000000, 0.507812, 0.007812, + -0.593920, -0.594019, 0.163798, 0.707107, -0.707107, -0.000000, 0.000000, 1.000000, + -0.001999, -0.000098, 0.164000, -0.707107, -0.707107, -0.000000, 0.507812, 1.000000, + 0.592922, -0.595018, -1.719536, -0.707107, -0.707107, -0.000000, 0.000000, 0.007812, + 0.592922, -0.595019, 0.164001, -0.707107, -0.707107, -0.000000, 0.000000, 1.000000, + -0.002000, -0.000097, -1.719537, -0.707107, -0.707107, -0.000000, 0.507812, 0.007812, + -1.200307, -1.259930, 1.963800, -0.000000, -1.000000, 0.000000, 0.496094, 0.750000, + -0.000738, -1.259930, 1.239796, -0.000000, -1.000000, 0.000000, 0.000000, 0.500000, + -0.000738, -1.259930, 1.963800, -0.000000, -1.000000, 0.000000, 0.000000, 0.750000, + -1.200307, -1.259930, 1.239796, -0.000000, -1.000000, 0.000000, 0.496094, 0.500000, + -1.200306, 1.260470, 1.963800, 0.000000, 1.000000, -0.000001, 0.500000, 0.750000, + -0.000738, 1.260469, 1.963800, 0.000000, 1.000000, -0.000001, 0.000000, 0.750000, + -0.000738, 1.260469, 1.239797, 0.000000, 1.000000, -0.000001, 0.000000, 0.500000, + -1.200306, 1.260468, 1.239797, 0.000000, 1.000000, -0.000001, 0.500000, 0.500000, + -1.200306, 1.260468, 1.239797, 0.000000, 0.000000, -1.000000, 1.000000, 0.250000, + -0.000738, -1.259930, 1.239796, 0.000000, 0.000000, -1.000000, 0.500000, 0.500000, + -1.200307, -1.259930, 1.239796, 0.000000, 0.000000, -1.000000, 1.000000, 0.500000, + -0.000738, 1.260469, 1.239797, 0.000000, 0.000000, -1.000000, 0.500000, 0.250000, + -1.200307, -1.259930, 1.963800, -1.000000, 0.000000, -0.000000, 0.507812, 0.250000, + -1.200306, 1.260468, 1.239797, -1.000000, 0.000000, -0.000000, 0.000000, 0.000000, + -1.200307, -1.259930, 1.239796, -1.000000, 0.000000, -0.000000, 0.507812, 0.000000, + -1.200306, 1.260470, 1.963800, -1.000000, 0.000000, -0.000000, 0.000000, 0.250000, + -1.200306, 1.260470, 1.963800, -0.000000, -0.000000, 1.000000, 0.992188, 0.507812, + -1.200307, -1.259930, 1.963800, -0.000000, -0.000000, 1.000000, 0.992188, 0.992188, + -0.000738, 1.260469, 1.963800, -0.000000, -0.000000, 1.000000, 0.500000, 0.507812, + -0.000738, -1.259930, 1.963800, -0.000000, -0.000000, 1.000000, 0.500000, 0.992188, + -1.200007, -1.259915, 1.963800, -1.000000, 0.000000, -0.000000, 0.507812, 0.250000, + -1.200006, 1.260484, 1.239797, -1.000000, 0.000000, -0.000000, 0.000000, 0.000000, + -1.200007, -1.259915, 1.239797, -1.000000, 0.000000, -0.000000, 0.507812, 0.000000, + -1.200006, 1.260484, 1.963800, -1.000000, 0.000000, -0.000000, 0.000000, 0.250000, + -1.156007, -1.259916, 1.239794, -0.000001, -1.000000, -0.000000, 0.000000, 1.000000, + -1.245011, -1.259915, -1.646208, -0.000001, -1.000000, -0.000000, 0.070312, 0.000000, + -1.156011, -1.259915, -1.646208, -0.000001, -1.000000, -0.000000, 0.000000, 0.000000, + -1.245007, -1.259916, 1.239794, -0.000001, -1.000000, -0.000000, 0.070312, 1.000000, + -1.156007, -1.209916, 1.239794, 0.000001, 1.000000, 0.000000, 0.179688, 1.000000, + -1.156011, -1.209915, -1.646208, 0.000001, 1.000000, 0.000000, 0.179688, 0.000000, + -1.245007, -1.209916, 1.239793, 0.000001, 1.000000, 0.000000, 0.117188, 1.000000, + -1.245010, -1.209915, -1.646208, 0.000001, 1.000000, 0.000000, 0.117188, 0.000000, + -1.245007, -1.209916, 1.239793, -1.000000, 0.000010, 0.000001, 0.125000, 1.000000, + -1.245011, -1.259915, -1.646208, -1.000000, 0.000010, 0.000001, 0.070312, 0.000000, + -1.245007, -1.259916, 1.239794, -1.000000, 0.000010, 0.000001, 0.070312, 1.000000, + -1.245010, -1.209915, -1.646208, -1.000000, 0.000010, 0.000001, 0.125000, 0.000000, + -1.156007, -1.209916, 1.239794, 1.000000, -0.000000, -0.000001, 0.125000, 1.000000, + -1.156011, -1.259915, -1.646208, 1.000000, -0.000000, -0.000001, 0.070312, 0.000000, + -1.156011, -1.209915, -1.646208, 1.000000, -0.000000, -0.000001, 0.125000, 0.000000, + -1.156007, -1.259916, 1.239794, 1.000000, -0.000000, -0.000001, 0.070312, 1.000000, + -1.156007, 1.260484, 1.239794, -0.000005, 1.000000, -0.000000, 0.257812, 1.000000, + -1.245010, 1.260483, -1.646207, -0.000005, 1.000000, -0.000000, 0.187500, 0.000000, + -1.245007, 1.260484, 1.239794, -0.000005, 1.000000, -0.000000, 0.187500, 1.000000, + -1.156011, 1.260484, -1.646207, -0.000005, 1.000000, -0.000000, 0.257812, 0.000000, + -1.245007, 1.210484, 1.239794, -0.000003, -1.000000, 0.000000, 0.367188, 1.000000, + -1.245010, 1.210484, -1.646207, -0.000003, -1.000000, 0.000000, 0.367188, 0.000000, + -1.156007, 1.210484, 1.239794, -0.000003, -1.000000, 0.000000, 0.304688, 1.000000, + -1.156011, 1.210483, -1.646207, -0.000003, -1.000000, 0.000000, 0.304688, 0.000000, + -1.156007, 1.210484, 1.239794, 1.000000, -0.000000, -0.000001, 0.312500, 1.000000, + -1.156011, 1.260484, -1.646207, 1.000000, -0.000000, -0.000001, 0.257812, 0.000000, + -1.156007, 1.260484, 1.239794, 1.000000, -0.000000, -0.000001, 0.257812, 1.000000, + -1.156011, 1.210483, -1.646207, 1.000000, -0.000000, -0.000001, 0.312500, 0.000000, + -1.245007, 1.210484, 1.239794, -1.000000, -0.000000, 0.000001, 0.312500, 1.000000, + -1.245010, 1.260483, -1.646207, -1.000000, -0.000000, 0.000001, 0.257812, 0.000000, + -1.245010, 1.210484, -1.646207, -1.000000, -0.000000, 0.000001, 0.312500, 0.000000, + -1.245007, 1.260484, 1.239794, -1.000000, -0.000000, 0.000001, 0.257812, 1.000000, + -1.200006, 1.219984, -0.261280, 1.000000, -0.000001, -0.000003, 0.828125, 0.000000, + -1.200006, -1.220415, 0.173645, 1.000000, -0.000001, -0.000003, 1.000000, 1.000000, + -1.200010, -1.220415, -0.705442, 1.000000, -0.000001, -0.000003, 0.500000, 1.000000, + -1.200006, 1.219983, -0.705443, 1.000000, -0.000001, -0.000003, 0.500000, 0.000000, + -1.175258, 1.224991, -0.271472, 0.818112, 0.571256, -0.066025, 0.531250, 0.000000, + -1.200006, 1.224990, -0.296220, -0.000001, 0.510552, -0.859847, 0.500000, 0.000000, + -1.224755, 1.224991, -0.271472, -0.818115, 0.571252, -0.066025, 0.500000, 0.000000, + -1.200006, 1.224991, -0.246723, -0.000001, 0.643826, 0.765172, 0.531250, 0.000000, + -1.200006, -1.221583, 0.148381, -0.000000, -0.643824, -0.765174, 0.500000, 1.000000, + -1.200006, -1.221583, 0.197879, -0.000000, -0.510559, 0.859843, 0.531250, 1.000000, + -1.224755, -1.221583, 0.173130, -0.818115, -0.571252, 0.066024, 0.500000, 1.000000, + -1.175257, -1.221584, 0.173130, 0.818114, -0.571253, 0.066024, 0.531250, 1.000000, + -1.246010, 1.260485, -0.768112, 0.000000, 0.000000, 1.000000, 0.968750, 0.914062, + -1.246006, -1.259915, -0.768111, 0.000000, 0.000000, 1.000000, 0.968750, 0.406250, + -1.155010, 1.260484, -0.768112, 0.000000, 0.000000, 1.000000, 0.992188, 0.914062, + -1.155006, -1.259915, -0.768111, 0.000000, 0.000000, 1.000000, 0.992188, 0.406250, + -1.155010, 1.260484, -0.768112, 1.000000, 0.000001, -0.000002, 0.992188, 0.312500, + -1.155006, -1.259915, -0.768111, 1.000000, 0.000001, -0.000002, 0.992188, 1.000000, + -1.155010, -1.259916, -1.623801, 1.000000, 0.000001, -0.000002, 0.500000, 1.000000, + -1.155010, 1.260484, -1.623803, 1.000000, 0.000001, -0.000002, 0.500000, 0.312500, + -1.246006, -1.259915, -0.768111, -1.000000, -0.000001, 0.000002, 0.992188, 1.000000, + -1.246010, 1.260485, -0.768112, -1.000000, -0.000001, 0.000002, 0.992188, 0.312500, + -1.246010, 1.260483, -1.623803, -1.000000, -0.000001, 0.000002, 0.500000, 0.312500, + -1.246010, -1.259916, -1.623801, -1.000000, -0.000001, 0.000002, 0.500000, 1.000000, + -1.350010, 1.288988, -1.662816, 0.000000, 0.000000, 1.000000, 0.695312, 0.125000, + -1.350009, -1.565369, -1.662815, 0.000000, 0.000000, 1.000000, 0.000000, 0.125000, + -1.050010, 1.288988, -1.662816, 0.000000, 0.000000, 1.000000, 0.695312, 0.000000, + -1.050010, -1.565369, -1.662815, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, + -2.400352, -1.259914, 1.963800, -0.000000, -1.000000, 0.000000, 1.000000, 1.000000, + -1.200007, -1.259914, 1.239797, -0.000000, -1.000000, 0.000000, 0.500000, 0.750000, + -1.200007, -1.259914, 1.963800, -0.000000, -1.000000, 0.000000, 0.500000, 1.000000, + -2.400352, -1.259914, 1.239796, -0.000000, -1.000000, 0.000000, 1.000000, 0.750000, + -1.200006, 1.260485, 1.963800, 0.000000, 1.000000, -0.000000, 0.500000, 1.000000, + -2.400352, 1.260485, 1.239797, 0.000000, 1.000000, -0.000000, 1.000000, 0.750000, + -2.400352, 1.260485, 1.963801, 0.000000, 1.000000, -0.000000, 1.000000, 1.000000, + -1.200007, 1.260484, 1.239797, 0.000000, 1.000000, -0.000000, 0.500000, 0.750000, + -2.400352, -1.259914, 1.239796, -0.000000, 0.000000, -1.000000, 1.000000, 0.500000, + -1.200007, 1.260484, 1.239797, -0.000000, 0.000000, -1.000000, 0.500000, 0.250000, + -1.200007, -1.259914, 1.239797, -0.000000, 0.000000, -1.000000, 0.500000, 0.500000, + -2.400352, 1.260485, 1.239797, -0.000000, 0.000000, -1.000000, 1.000000, 0.250000, + -2.400352, -1.259914, 1.963800, -1.000000, 0.000000, -0.000001, 0.507812, 0.250000, + -2.400352, 1.260485, 1.239797, -1.000000, 0.000000, -0.000001, 0.000000, 0.000000, + -2.400352, -1.259914, 1.239796, -1.000000, 0.000000, -0.000001, 0.507812, 0.000000, + -2.400352, 1.260485, 1.963801, -1.000000, 0.000000, -0.000001, 0.000000, 0.250000, + -2.400352, 1.260485, 1.963801, 0.000000, -0.000000, 1.000000, 0.484375, 0.507812, + -2.400352, -1.259914, 1.963800, 0.000000, -0.000000, 1.000000, 0.484375, 0.992188, + -1.200006, 1.260485, 1.963800, 0.000000, -0.000000, 1.000000, 0.000000, 0.507812, + -1.200007, -1.259914, 1.963800, 0.000000, -0.000000, 1.000000, 0.000000, 0.992188, + -2.356353, -1.259915, 1.239794, -0.000001, -1.000000, -0.000000, 0.000000, 1.000000, + -2.445353, -1.259914, -1.646208, -0.000001, -1.000000, -0.000000, 0.070312, 0.000000, + -2.356353, -1.259914, -1.646208, -0.000001, -1.000000, -0.000000, 0.000000, 0.000000, + -2.445353, -1.259915, 1.239794, -0.000001, -1.000000, -0.000000, 0.070312, 1.000000, + -2.356353, -1.209915, 1.239793, 0.000001, 1.000000, 0.000000, 0.179688, 1.000000, + -2.445353, -1.209914, -1.646208, 0.000001, 1.000000, 0.000000, 0.117188, 0.000000, + -2.445353, -1.209915, 1.239793, 0.000001, 1.000000, 0.000000, 0.117188, 1.000000, + -2.356353, -1.209914, -1.646208, 0.000001, 1.000000, 0.000000, 0.179688, 0.000000, + -2.445353, -1.209915, 1.239793, -1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -2.445353, -1.259914, -1.646208, -1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -2.445353, -1.259915, 1.239794, -1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -2.445353, -1.209914, -1.646208, -1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -2.356353, -1.209915, 1.239793, 1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -2.356353, -1.259914, -1.646208, 1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -2.356353, -1.209914, -1.646208, 1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -2.356353, -1.259915, 1.239794, 1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -2.356352, 1.260485, 1.239794, -0.000003, 1.000000, -0.000000, 0.257812, 1.000000, + -2.445353, 1.260485, -1.646209, -0.000003, 1.000000, -0.000000, 0.187500, 0.000000, + -2.445353, 1.260485, 1.239794, -0.000003, 1.000000, -0.000000, 0.187500, 1.000000, + -2.356352, 1.260485, -1.646209, -0.000003, 1.000000, -0.000000, 0.257812, 0.000000, + -2.445353, 1.210485, 1.239794, -0.000005, -1.000000, 0.000000, 0.367188, 1.000000, + -2.445353, 1.210485, -1.646209, -0.000005, -1.000000, 0.000000, 0.367188, 0.000000, + -2.356352, 1.210485, 1.239794, -0.000005, -1.000000, 0.000000, 0.304688, 1.000000, + -2.356352, 1.210484, -1.646209, -0.000005, -1.000000, 0.000000, 0.304688, 0.000000, + -2.356352, 1.210485, 1.239794, 1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -2.356352, 1.260485, -1.646209, 1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -2.356352, 1.260485, 1.239794, 1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -2.356352, 1.210484, -1.646209, 1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -2.445353, 1.210485, 1.239794, -1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -2.445353, 1.260485, -1.646209, -1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -2.445353, 1.210485, -1.646209, -1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -2.445353, 1.260485, 1.239794, -1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -2.400352, 1.219985, -0.261280, 1.000000, 0.000000, -0.000001, 0.828125, 0.000000, + -2.400352, -1.220414, 0.173645, 1.000000, 0.000000, -0.000001, 1.000000, 1.000000, + -2.400352, -1.220414, -0.705443, 1.000000, 0.000000, -0.000001, 0.500000, 1.000000, + -2.400352, 1.219985, -0.705443, 1.000000, 0.000000, -0.000001, 0.500000, 0.000000, + -2.375604, 1.224993, -0.271472, 0.818104, 0.571267, -0.066024, 0.531250, 0.000000, + -2.400352, 1.224991, -0.296221, -0.000008, 0.510547, -0.859850, 0.500000, 0.000000, + -2.425100, 1.224991, -0.271472, -0.818115, 0.571252, -0.066024, 0.500000, 0.000000, + -2.400352, 1.224992, -0.246723, -0.000011, 0.643821, 0.765176, 0.531250, 0.000000, + -2.400352, -1.221583, 0.148381, -0.000002, -0.643825, -0.765173, 0.500000, 1.000000, + -2.400352, -1.221583, 0.197878, -0.000006, -0.510562, 0.859841, 0.531250, 1.000000, + -2.425100, -1.221583, 0.173130, -0.818118, -0.571248, 0.066023, 0.500000, 1.000000, + -2.375603, -1.221583, 0.173130, 0.818115, -0.571252, 0.066027, 0.531250, 1.000000, + -2.446352, 1.260485, -0.768112, -0.000000, 0.000000, 1.000000, 0.968750, 0.914062, + -2.355351, -1.259915, -0.768111, -0.000000, 0.000000, 1.000000, 0.992188, 0.406250, + -2.355352, 1.260486, -0.768112, -0.000000, 0.000000, 1.000000, 0.992188, 0.914062, + -2.446352, -1.259915, -0.768111, -0.000000, 0.000000, 1.000000, 0.968750, 0.406250, + -2.355351, -1.259915, -0.768111, 1.000000, 0.000000, -0.000000, 0.992188, 1.000000, + -2.355352, 1.260485, -1.623804, 1.000000, 0.000000, -0.000000, 0.500000, 0.312500, + -2.355352, 1.260486, -0.768112, 1.000000, 0.000000, -0.000000, 0.992188, 0.312500, + -2.355351, -1.259915, -1.623802, 1.000000, 0.000000, -0.000000, 0.500000, 1.000000, + -2.446352, -1.259915, -0.768111, -1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + -2.446352, 1.260485, -0.768112, -1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + -2.446352, 1.260484, -1.623804, -1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + -2.446352, -1.259915, -1.623802, -1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -2.550352, 1.288990, -1.662817, -0.000002, 0.000000, 1.000000, 0.695312, 0.125000, + -2.550351, -1.565368, -1.662815, -0.000002, 0.000000, 1.000000, 0.000000, 0.125000, + -2.250352, 1.288989, -1.662816, -0.000002, 0.000000, 1.000000, 0.695312, 0.000000, + -2.250352, -1.565368, -1.662815, -0.000002, 0.000000, 1.000000, 0.000000, 0.000000, + -3.599796, -1.259913, 1.963800, -0.000000, -1.000000, -0.000000, 0.500000, 1.000000, + -2.400352, -1.259914, 1.239796, -0.000000, -1.000000, -0.000000, 0.000000, 0.750000, + -2.400352, -1.259913, 1.963800, -0.000000, -1.000000, -0.000000, 0.000000, 1.000000, + -3.599796, -1.259913, 1.239796, -0.000000, -1.000000, -0.000000, 0.500000, 0.750000, + -3.599796, 1.260487, 1.963801, 0.000000, 1.000000, -0.000001, 0.500000, 1.000000, + -2.400352, 1.260486, 1.963801, 0.000000, 1.000000, -0.000001, 0.000000, 1.000000, + -2.400352, 1.260486, 1.239797, 0.000000, 1.000000, -0.000001, 0.000000, 0.750000, + -3.599796, 1.260486, 1.239797, 0.000000, 1.000000, -0.000001, 0.500000, 0.750000, + -3.599796, -1.259913, 1.239796, 0.000000, 0.000000, -1.000000, 1.000000, 0.500000, + -2.400352, 1.260486, 1.239797, 0.000000, 0.000000, -1.000000, 0.500000, 0.250000, + -2.400352, -1.259914, 1.239796, 0.000000, 0.000000, -1.000000, 0.500000, 0.500000, + -3.599796, 1.260486, 1.239797, 0.000000, 0.000000, -1.000000, 1.000000, 0.250000, + -3.599796, -1.259913, 1.963800, -1.000000, 0.000000, 0.000000, 0.507812, 0.250000, + -3.599796, 1.260486, 1.239797, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, + -3.599796, -1.259913, 1.239796, -1.000000, 0.000000, 0.000000, 0.507812, 0.000000, + -3.599796, 1.260487, 1.963801, -1.000000, 0.000000, 0.000000, 0.000000, 0.250000, + -3.599796, 1.260487, 1.963801, 0.000000, -0.000000, 1.000000, 0.992188, 0.507812, + -3.599796, -1.259913, 1.963800, 0.000000, -0.000000, 1.000000, 0.992188, 0.992188, + -2.400352, 1.260486, 1.963801, 0.000000, -0.000000, 1.000000, 0.515625, 0.507812, + -2.400352, -1.259913, 1.963800, 0.000000, -0.000000, 1.000000, 0.515625, 0.992188, + -3.555797, -1.259914, 1.239793, -0.000001, -1.000000, -0.000000, 0.000000, 1.000000, + -3.644796, -1.259913, -1.646209, -0.000001, -1.000000, -0.000000, 0.070312, 0.000000, + -3.555797, -1.259913, -1.646209, -0.000001, -1.000000, -0.000000, 0.000000, 0.000000, + -3.644796, -1.259914, 1.239793, -0.000001, -1.000000, -0.000000, 0.070312, 1.000000, + -3.555797, -1.209914, 1.239793, 0.000001, 1.000000, 0.000000, 0.179688, 1.000000, + -3.555797, -1.209913, -1.646209, 0.000001, 1.000000, 0.000000, 0.179688, 0.000000, + -3.644796, -1.209914, 1.239793, 0.000001, 1.000000, 0.000000, 0.117188, 1.000000, + -3.644796, -1.209913, -1.646209, 0.000001, 1.000000, 0.000000, 0.117188, 0.000000, + -3.644796, -1.209914, 1.239793, -1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -3.644796, -1.259913, -1.646209, -1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -3.644796, -1.259914, 1.239793, -1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -3.644796, -1.209913, -1.646209, -1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -3.555797, -1.209913, -1.646209, 1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -3.555797, -1.209914, 1.239793, 1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -3.555797, -1.259914, 1.239793, 1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -3.555797, -1.259913, -1.646209, 1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -3.644796, 1.260487, 1.239794, 0.000001, 1.000000, -0.000000, 0.187500, 1.000000, + -3.555797, 1.260486, -1.646210, 0.000001, 1.000000, -0.000000, 0.257812, 0.000000, + -3.644796, 1.260486, -1.646210, 0.000001, 1.000000, -0.000000, 0.187500, 0.000000, + -3.555797, 1.260487, 1.239794, 0.000001, 1.000000, -0.000000, 0.257812, 1.000000, + -3.644796, 1.210486, 1.239794, 0.000007, -1.000000, 0.000000, 0.367188, 1.000000, + -3.644796, 1.210486, -1.646210, 0.000007, -1.000000, 0.000000, 0.367188, 0.000000, + -3.555797, 1.210487, 1.239794, 0.000007, -1.000000, 0.000000, 0.304688, 1.000000, + -3.555797, 1.210487, -1.646210, 0.000007, -1.000000, 0.000000, 0.304688, 0.000000, + -3.555797, 1.210487, 1.239794, 1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -3.555797, 1.260486, -1.646210, 1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -3.555797, 1.260487, 1.239794, 1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -3.555797, 1.210487, -1.646210, 1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -3.644796, 1.210486, 1.239794, -1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -3.644796, 1.260486, -1.646210, -1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -3.644796, 1.210486, -1.646210, -1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -3.644796, 1.260487, 1.239794, -1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -3.599796, 1.219985, -0.261280, 1.000000, 0.000000, 0.000000, 0.828125, 0.000000, + -3.599796, -1.220413, 0.173644, 1.000000, 0.000000, 0.000000, 1.000000, 1.000000, + -3.599796, -1.220414, -0.705443, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -3.599796, 1.219986, -0.705444, 1.000000, 0.000000, 0.000000, 0.500000, 0.000000, + -3.575047, 1.224993, -0.271473, 0.818116, 0.571251, -0.066027, 0.531250, 0.000000, + -3.599796, 1.224993, -0.296221, -0.000002, 0.510554, -0.859846, 0.500000, 0.000000, + -3.624545, 1.224993, -0.271473, -0.818112, 0.571256, -0.066027, 0.500000, 0.000000, + -3.599796, 1.224993, -0.246723, -0.000002, 0.643826, 0.765172, 0.531250, 0.000000, + -3.575047, -1.221582, 0.173129, 0.818114, -0.571254, 0.066022, 0.531250, 1.000000, + -3.624544, -1.221582, 0.173129, -0.818109, -0.571261, 0.066022, 0.500000, 1.000000, + -3.599796, -1.221582, 0.148380, -0.000004, -0.643819, -0.765178, 0.500000, 1.000000, + -3.599796, -1.221582, 0.197878, -0.000003, -0.510554, 0.859846, 0.531250, 1.000000, + -3.645796, 1.260487, -0.768113, -0.000000, 0.000000, 1.000000, 0.968750, 0.914062, + -3.554796, -1.259914, -0.768112, -0.000000, 0.000000, 1.000000, 0.992188, 0.406250, + -3.554796, 1.260487, -0.768113, -0.000000, 0.000000, 1.000000, 0.992188, 0.914062, + -3.645796, -1.259914, -0.768112, -0.000000, 0.000000, 1.000000, 0.968750, 0.406250, + -3.554796, -1.259914, -0.768112, 1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + -3.554796, 1.260486, -1.623804, 1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + -3.554796, 1.260487, -0.768113, 1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + -3.554796, -1.259914, -1.623803, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -3.645796, -1.259914, -0.768112, -1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + -3.645796, 1.260487, -0.768113, -1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + -3.645796, 1.260486, -1.623803, -1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + -3.645796, -1.259914, -1.623803, -1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -3.749796, 1.288990, -1.662819, -0.000000, 0.000001, 1.000000, 0.695312, 0.125000, + -3.449796, -1.565368, -1.662816, -0.000000, 0.000001, 1.000000, 0.000000, 0.000000, + -3.449797, 1.288991, -1.662819, -0.000000, 0.000001, 1.000000, 0.695312, 0.000000, + -3.749796, -1.565367, -1.662817, -0.000000, 0.000001, 1.000000, 0.000000, 0.125000, + -4.800468, -1.259913, 1.963800, -0.000000, -1.000000, 0.000000, 1.000000, 1.000000, + -3.599796, -1.259913, 1.239796, -0.000000, -1.000000, 0.000000, 0.500000, 0.750000, + -3.599796, -1.259913, 1.963800, -0.000000, -1.000000, 0.000000, 0.500000, 1.000000, + -4.800468, -1.259913, 1.239796, -0.000000, -1.000000, 0.000000, 1.000000, 0.750000, + -4.800468, 1.260487, 1.963800, 0.000000, 1.000000, -0.000000, 1.000000, 1.000000, + -3.599796, 1.260488, 1.963801, 0.000000, 1.000000, -0.000000, 0.500000, 1.000000, + -3.599796, 1.260486, 1.239797, 0.000000, 1.000000, -0.000000, 0.500000, 0.750000, + -4.800468, 1.260488, 1.239797, 0.000000, 1.000000, -0.000000, 1.000000, 0.750000, + -4.800468, -1.259913, 1.239796, 0.000000, 0.000000, -1.000000, 1.000000, 0.500000, + -3.599796, 1.260486, 1.239797, 0.000000, 0.000000, -1.000000, 0.500000, 0.250000, + -3.599796, -1.259913, 1.239796, 0.000000, 0.000000, -1.000000, 0.500000, 0.500000, + -4.800468, 1.260488, 1.239797, 0.000000, 0.000000, -1.000000, 1.000000, 0.250000, + -4.800468, 1.260487, 1.963800, -1.000000, 0.000000, 0.000000, 0.000000, 0.250000, + -4.800468, -1.259913, 1.239796, -1.000000, 0.000000, 0.000000, 0.507812, 0.000000, + -4.800468, -1.259913, 1.963800, -1.000000, 0.000000, 0.000000, 0.507812, 0.250000, + -4.800468, 1.260488, 1.239797, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, + -4.800468, 1.260487, 1.963800, -0.000000, -0.000000, 1.000000, 0.484375, 0.507812, + -3.599796, -1.259913, 1.963800, -0.000000, -0.000000, 1.000000, 0.000000, 0.992188, + -3.599796, 1.260488, 1.963801, -0.000000, -0.000000, 1.000000, 0.000000, 0.507812, + -4.800468, -1.259913, 1.963800, -0.000000, -0.000000, 1.000000, 0.484375, 0.992188, + -4.845469, -1.259913, 1.239793, -0.000001, -1.000000, -0.000000, 0.070312, 1.000000, + -4.756469, -1.259913, -1.646211, -0.000001, -1.000000, -0.000000, 0.000000, 0.000000, + -4.756469, -1.259914, 1.239794, -0.000001, -1.000000, -0.000000, 0.000000, 1.000000, + -4.845469, -1.259913, -1.646210, -0.000001, -1.000000, -0.000000, 0.070312, 0.000000, + -4.756469, -1.209913, 1.239794, 0.000001, 1.000000, 0.000000, 0.179688, 1.000000, + -4.756469, -1.209913, -1.646211, 0.000001, 1.000000, 0.000000, 0.179688, 0.000000, + -4.845469, -1.209913, 1.239793, 0.000001, 1.000000, 0.000000, 0.117188, 1.000000, + -4.845469, -1.209913, -1.646211, 0.000001, 1.000000, 0.000000, 0.117188, 0.000000, + -4.845469, -1.209913, 1.239793, -1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -4.845469, -1.259913, -1.646210, -1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -4.845469, -1.259913, 1.239793, -1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -4.845469, -1.209913, -1.646211, -1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -4.756469, -1.209913, 1.239794, 1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -4.756469, -1.259913, -1.646211, 1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -4.756469, -1.209913, -1.646211, 1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -4.756469, -1.259914, 1.239794, 1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -4.756469, 1.260489, 1.239794, -0.000019, 1.000000, 0.000000, 0.257812, 1.000000, + -4.845469, 1.260487, -1.646208, -0.000019, 1.000000, 0.000000, 0.187500, 0.000000, + -4.845469, 1.260487, 1.239794, -0.000019, 1.000000, 0.000000, 0.187500, 1.000000, + -4.756469, 1.260488, -1.646208, -0.000019, 1.000000, 0.000000, 0.257812, 0.000000, + -4.845469, 1.210488, 1.239794, -0.000017, -1.000000, 0.000000, 0.367188, 1.000000, + -4.845469, 1.210488, -1.646209, -0.000017, -1.000000, 0.000000, 0.367188, 0.000000, + -4.756469, 1.210487, 1.239793, -0.000017, -1.000000, 0.000000, 0.304688, 1.000000, + -4.756469, 1.210486, -1.646209, -0.000017, -1.000000, 0.000000, 0.304688, 0.000000, + -4.756469, 1.210487, 1.239793, 1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -4.756469, 1.260488, -1.646208, 1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -4.756469, 1.260489, 1.239794, 1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -4.756469, 1.210486, -1.646209, 1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -4.845469, 1.210488, 1.239794, -1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -4.845469, 1.260487, -1.646208, -1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -4.845469, 1.210488, -1.646209, -1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -4.845469, 1.260487, 1.239794, -1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -4.800468, 1.219988, -0.261280, 1.000000, 0.000000, 0.000000, 0.828125, 0.000000, + -4.800468, -1.220413, 0.173645, 1.000000, 0.000000, 0.000000, 1.000000, 1.000000, + -4.800468, -1.220413, -0.705444, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -4.800468, 1.219988, -0.705444, 1.000000, 0.000000, 0.000000, 0.500000, 0.000000, + -4.800468, 1.224994, -0.296222, -0.000012, 0.510564, -0.859840, 0.500000, 0.000000, + -4.800468, 1.224995, -0.246724, -0.000011, 0.643829, 0.765170, 0.531250, 0.000000, + -4.775720, 1.224995, -0.271473, 0.818107, 0.571264, -0.066026, 0.531250, 0.000000, + -4.825217, 1.224993, -0.271473, -0.818130, 0.571230, -0.066023, 0.500000, 0.000000, + -4.775720, -1.221581, 0.173129, 0.818115, -0.571252, 0.066024, 0.531250, 1.000000, + -4.825216, -1.221581, 0.173129, -0.818113, -0.571255, 0.066022, 0.500000, 1.000000, + -4.800468, -1.221582, 0.148380, -0.000004, -0.643823, -0.765175, 0.500000, 1.000000, + -4.800468, -1.221581, 0.197878, -0.000005, -0.510558, 0.859843, 0.531250, 1.000000, + -4.846468, 1.260489, -0.768113, 0.000000, 0.000000, 1.000000, 0.968750, 0.914062, + -4.846468, -1.259913, -0.768112, 0.000000, 0.000000, 1.000000, 0.968750, 0.406250, + -4.755468, 1.260489, -0.768113, 0.000000, 0.000000, 1.000000, 0.992188, 0.914062, + -4.755468, -1.259913, -0.768112, 0.000000, 0.000000, 1.000000, 0.992188, 0.406250, + -4.755468, -1.259913, -0.768112, 1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + -4.755468, 1.260488, -1.623804, 1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + -4.755468, 1.260489, -0.768113, 1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + -4.755468, -1.259913, -1.623804, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -4.846468, -1.259913, -0.768112, -1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + -4.846468, 1.260489, -0.768113, -1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + -4.846468, 1.260486, -1.623804, -1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + -4.846468, -1.259914, -1.623804, -1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -4.950468, 1.288993, -1.662818, 0.000000, 0.000000, 1.000000, 0.695312, 0.125000, + -4.950468, -1.565367, -1.662817, 0.000000, 0.000000, 1.000000, 0.000000, 0.125000, + -4.650469, 1.288991, -1.662819, 0.000000, 0.000000, 1.000000, 0.695312, 0.000000, + -4.650468, -1.565367, -1.662817, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, + -4.800468, -1.259912, 1.963800, 0.000000, -1.000000, 0.000000, 0.000000, 1.000000, + -5.999529, -1.259912, 1.239796, 0.000000, -1.000000, 0.000000, 0.500000, 0.750000, + -4.800468, -1.259912, 1.239796, 0.000000, -1.000000, 0.000000, 0.000000, 0.750000, + -5.999529, -1.259912, 1.963800, 0.000000, -1.000000, 0.000000, 0.500000, 1.000000, + -5.999529, 1.260489, 1.963801, 0.000001, 1.000000, 0.000001, 0.500000, 1.000000, + -4.800468, 1.260488, 1.963800, 0.000001, 1.000000, 0.000001, 0.000000, 1.000000, + -4.800468, 1.260489, 1.239797, 0.000001, 1.000000, 0.000001, 0.000000, 0.750000, + -5.999529, 1.260489, 1.239796, 0.000001, 1.000000, 0.000001, 0.500000, 0.750000, + -5.999529, -1.259912, 1.239796, 0.000000, 0.000000, -1.000000, 1.000000, 0.500000, + -4.800468, 1.260489, 1.239797, 0.000000, 0.000000, -1.000000, 0.500000, 0.250000, + -4.800468, -1.259912, 1.239796, 0.000000, 0.000000, -1.000000, 0.500000, 0.500000, + -5.999529, 1.260489, 1.239796, 0.000000, 0.000000, -1.000000, 1.000000, 0.250000, + -5.999529, 1.260489, 1.963801, -1.000000, 0.000000, 0.000000, 0.000000, 0.250000, + -5.999529, -1.259912, 1.239796, -1.000000, 0.000000, 0.000000, 0.507812, 0.000000, + -5.999529, -1.259912, 1.963800, -1.000000, 0.000000, 0.000000, 0.507812, 0.250000, + -5.999529, 1.260489, 1.239796, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, + -5.999529, 1.260489, 1.963801, 0.000000, -0.000000, 1.000000, 0.992188, 0.507812, + -5.999529, -1.259912, 1.963800, 0.000000, -0.000000, 1.000000, 0.992188, 0.992188, + -4.800468, 1.260488, 1.963800, 0.000000, -0.000000, 1.000000, 0.515625, 0.507812, + -4.800468, -1.259912, 1.963800, 0.000000, -0.000000, 1.000000, 0.515625, 0.992188, + -5.955529, -1.259913, 1.239793, -0.000000, -1.000000, -0.000000, 0.000000, 1.000000, + -6.044529, -1.259912, -1.646210, -0.000000, -1.000000, -0.000000, 0.070312, 0.000000, + -5.955529, -1.259912, -1.646210, -0.000000, -1.000000, -0.000000, 0.000000, 0.000000, + -6.044529, -1.259913, 1.239793, -0.000000, -1.000000, -0.000000, 0.070312, 1.000000, + -5.955529, -1.209913, 1.239793, -0.000001, 1.000000, 0.000000, 0.179688, 1.000000, + -6.044529, -1.209912, -1.646211, -0.000001, 1.000000, 0.000000, 0.117188, 0.000000, + -6.044529, -1.209913, 1.239793, -0.000001, 1.000000, 0.000000, 0.117188, 1.000000, + -5.955529, -1.209912, -1.646211, -0.000001, 1.000000, 0.000000, 0.179688, 0.000000, + -6.044529, -1.209913, 1.239793, -1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -6.044529, -1.259912, -1.646210, -1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -6.044529, -1.259913, 1.239793, -1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -6.044529, -1.209912, -1.646211, -1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -5.955529, -1.209913, 1.239793, 1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -5.955529, -1.259912, -1.646210, 1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -5.955529, -1.209912, -1.646211, 1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -5.955529, -1.259913, 1.239793, 1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -6.044529, 1.260489, 1.239793, 0.000012, 1.000000, -0.000000, 0.187500, 1.000000, + -5.955529, 1.260488, -1.646210, 0.000012, 1.000000, -0.000000, 0.257812, 0.000000, + -6.044529, 1.260489, -1.646210, 0.000012, 1.000000, -0.000000, 0.187500, 0.000000, + -5.955529, 1.260488, 1.239793, 0.000012, 1.000000, -0.000000, 0.257812, 1.000000, + -6.044529, 1.210489, 1.239794, 0.000011, -1.000000, 0.000000, 0.367188, 1.000000, + -5.955529, 1.210489, -1.646211, 0.000011, -1.000000, 0.000000, 0.304688, 0.000000, + -5.955529, 1.210489, 1.239794, 0.000011, -1.000000, 0.000000, 0.304688, 1.000000, + -6.044529, 1.210487, -1.646211, 0.000011, -1.000000, 0.000000, 0.367188, 0.000000, + -5.955529, 1.210489, 1.239794, 1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -5.955529, 1.260488, -1.646210, 1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -5.955529, 1.260488, 1.239793, 1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -5.955529, 1.210489, -1.646211, 1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -6.044529, 1.210489, 1.239794, -1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -6.044529, 1.260489, -1.646210, -1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -6.044529, 1.210487, -1.646211, -1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -6.044529, 1.260489, 1.239793, -1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -5.999529, 1.219990, -0.261281, 1.000000, 0.000000, 0.000000, 0.828125, 0.000000, + -5.999529, -1.220412, 0.173644, 1.000000, 0.000000, 0.000000, 1.000000, 1.000000, + -5.999529, -1.220412, -0.705444, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -5.999529, 1.219989, -0.705444, 1.000000, 0.000000, 0.000000, 0.500000, 0.000000, + -5.999529, 1.224996, -0.296222, -0.000008, 0.510562, -0.859841, 0.500000, 0.000000, + -6.024278, 1.224995, -0.271473, -0.818125, 0.571238, -0.066027, 0.500000, 0.000000, + -5.974780, 1.224996, -0.271473, 0.818110, 0.571259, -0.066029, 0.531250, 0.000000, + -5.999529, 1.224997, -0.246724, -0.000008, 0.643829, 0.765170, 0.531250, 0.000000, + -5.974780, -1.221581, 0.173129, 0.818112, -0.571257, 0.066022, 0.531250, 1.000000, + -6.024277, -1.221581, 0.173129, -0.818110, -0.571260, 0.066020, 0.500000, 1.000000, + -5.999529, -1.221580, 0.148380, -0.000004, -0.643818, -0.765179, 0.500000, 1.000000, + -5.999529, -1.221580, 0.197878, -0.000005, -0.510555, 0.859845, 0.531250, 1.000000, + -6.045528, 1.260489, -0.768113, -0.000004, 0.000000, 1.000000, 0.968750, 0.914062, + -5.954529, -1.259912, -0.768112, -0.000004, 0.000000, 1.000000, 0.992188, 0.406250, + -5.954529, 1.260489, -0.768113, -0.000004, 0.000000, 1.000000, 0.992188, 0.914062, + -6.045528, -1.259913, -0.768113, -0.000004, 0.000000, 1.000000, 0.968750, 0.406250, + -5.954529, -1.259912, -0.768112, 1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + -5.954529, 1.260487, -1.623807, 1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + -5.954529, 1.260489, -0.768113, 1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + -5.954529, -1.259913, -1.623803, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -6.045528, 1.260489, -0.768113, -1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + -6.045528, -1.259913, -1.623803, -1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -6.045528, -1.259913, -0.768113, -1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + -6.045528, 1.260488, -1.623807, -1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + -6.149529, 1.288994, -1.662819, 0.000000, 0.000001, 1.000000, 0.695312, 0.125000, + -6.149529, -1.565367, -1.662817, 0.000000, 0.000001, 1.000000, 0.000000, 0.125000, + -5.849529, 1.288993, -1.662818, 0.000000, 0.000001, 1.000000, 0.695312, 0.000000, + -5.849528, -1.565366, -1.662817, 0.000000, 0.000001, 1.000000, 0.000000, 0.000000, + -7.199987, -1.259911, 1.963800, -0.000000, -1.000000, -0.000000, 1.000000, 0.750000, + -5.999529, -1.259912, 1.239796, -0.000000, -1.000000, -0.000000, 0.500000, 0.500000, + -5.999529, -1.259912, 1.963800, -0.000000, -1.000000, -0.000000, 0.500000, 0.750000, + -7.199987, -1.259911, 1.239796, -0.000000, -1.000000, -0.000000, 1.000000, 0.500000, + -5.999529, 1.260490, 1.963801, -0.000000, 1.000000, -0.000001, 0.500000, 0.750000, + -7.199987, 1.260489, 1.239796, -0.000000, 1.000000, -0.000001, 1.000000, 0.500000, + -7.199987, 1.260491, 1.963800, -0.000000, 1.000000, -0.000001, 1.000000, 0.750000, + -5.999529, 1.260490, 1.239796, -0.000000, 1.000000, -0.000001, 0.500000, 0.500000, + -7.199987, 1.260489, 1.239796, -0.000000, 0.000000, -1.000000, 1.000000, 0.250000, + -5.999529, -1.259912, 1.239796, -0.000000, 0.000000, -1.000000, 0.500000, 0.500000, + -7.199987, -1.259911, 1.239796, -0.000000, 0.000000, -1.000000, 1.000000, 0.500000, + -5.999529, 1.260490, 1.239796, -0.000000, 0.000000, -1.000000, 0.500000, 0.250000, + -7.199987, -1.259911, 1.963800, -1.000000, 0.000000, 0.000000, 0.507812, 0.250000, + -7.199987, 1.260489, 1.239796, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, + -7.199987, -1.259911, 1.239796, -1.000000, 0.000000, 0.000000, 0.507812, 0.000000, + -7.199987, 1.260491, 1.963800, -1.000000, 0.000000, 0.000000, 0.000000, 0.250000, + -7.199987, 1.260491, 1.963800, -0.000000, -0.000000, 1.000000, 0.484375, 0.507812, + -7.199987, -1.259911, 1.963800, -0.000000, -0.000000, 1.000000, 0.484375, 0.992188, + -5.999529, 1.260490, 1.963801, -0.000000, -0.000000, 1.000000, 0.000000, 0.507812, + -5.999529, -1.259912, 1.963800, -0.000000, -0.000000, 1.000000, 0.000000, 0.992188, + -7.155988, -1.259912, 1.239793, -0.000002, -1.000000, -0.000000, 0.000000, 1.000000, + -7.244987, -1.259911, -1.646211, -0.000002, -1.000000, -0.000000, 0.070312, 0.000000, + -7.155988, -1.259912, -1.646211, -0.000002, -1.000000, -0.000000, 0.000000, 0.000000, + -7.244987, -1.259912, 1.239794, -0.000002, -1.000000, -0.000000, 0.070312, 1.000000, + -7.155988, -1.209912, 1.239793, 0.000001, 1.000000, 0.000000, 0.179688, 1.000000, + -7.155988, -1.209911, -1.646210, 0.000001, 1.000000, 0.000000, 0.179688, 0.000000, + -7.244987, -1.209912, 1.239793, 0.000001, 1.000000, 0.000000, 0.117188, 1.000000, + -7.244987, -1.209911, -1.646211, 0.000001, 1.000000, 0.000000, 0.117188, 0.000000, + -7.244987, -1.209912, 1.239793, -1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -7.244987, -1.259911, -1.646211, -1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -7.244987, -1.259912, 1.239794, -1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -7.244987, -1.209911, -1.646211, -1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -7.155988, -1.209911, -1.646210, 1.000000, 0.000000, 0.000000, 0.125000, 0.000000, + -7.155988, -1.209912, 1.239793, 1.000000, 0.000000, 0.000000, 0.125000, 1.000000, + -7.155988, -1.259912, 1.239793, 1.000000, 0.000000, 0.000000, 0.070312, 1.000000, + -7.155988, -1.259912, -1.646211, 1.000000, 0.000000, 0.000000, 0.070312, 0.000000, + -7.155988, 1.260490, 1.239793, -0.000003, 1.000000, -0.000000, 0.257812, 1.000000, + -7.244987, 1.260490, -1.646212, -0.000003, 1.000000, -0.000000, 0.187500, 0.000000, + -7.244987, 1.260491, 1.239794, -0.000003, 1.000000, -0.000000, 0.187500, 1.000000, + -7.155988, 1.260490, -1.646212, -0.000003, 1.000000, -0.000000, 0.257812, 0.000000, + -7.244987, 1.210490, 1.239793, 0.000004, -1.000000, 0.000000, 0.367188, 1.000000, + -7.155988, 1.210490, -1.646212, 0.000004, -1.000000, 0.000000, 0.304688, 0.000000, + -7.155988, 1.210490, 1.239794, 0.000004, -1.000000, 0.000000, 0.304688, 1.000000, + -7.244987, 1.210490, -1.646212, 0.000004, -1.000000, 0.000000, 0.367188, 0.000000, + -7.155988, 1.260490, 1.239793, 1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -7.155988, 1.210490, -1.646212, 1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -7.155988, 1.260490, -1.646212, 1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -7.155988, 1.210490, 1.239794, 1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -7.244987, 1.210490, 1.239793, -1.000000, 0.000000, 0.000000, 0.312500, 1.000000, + -7.244987, 1.260490, -1.646212, -1.000000, 0.000000, 0.000000, 0.257812, 0.000000, + -7.244987, 1.210490, -1.646212, -1.000000, 0.000000, 0.000000, 0.312500, 0.000000, + -7.244987, 1.260491, 1.239794, -1.000000, 0.000000, 0.000000, 0.257812, 1.000000, + -7.199987, 1.219989, -0.261281, 1.000000, 0.000000, 0.000000, 0.828125, 0.000000, + -7.199987, -1.220411, 0.173644, 1.000000, 0.000000, 0.000000, 1.000000, 1.000000, + -7.199987, -1.220411, -0.705444, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -7.199987, 1.219988, -0.705444, 1.000000, 0.000000, 0.000000, 0.500000, 0.000000, + -7.199987, 1.224995, -0.296222, -0.000000, 0.510548, -0.859849, 0.500000, 0.000000, + -7.199987, 1.224996, -0.246725, 0.000001, 0.643822, 0.765175, 0.531250, 0.000000, + -7.175239, 1.224996, -0.271473, 0.818115, 0.571251, -0.066025, 0.531250, 0.000000, + -7.224736, 1.224997, -0.271473, -0.818106, 0.571265, -0.066023, 0.500000, 0.000000, + -7.175239, -1.221580, 0.173129, 0.818116, -0.571250, 0.066025, 0.531250, 1.000000, + -7.224735, -1.221580, 0.173129, -0.818109, -0.571260, 0.066027, 0.500000, 1.000000, + -7.199987, -1.221580, 0.148380, -0.000004, -0.643821, -0.765176, 0.500000, 1.000000, + -7.199987, -1.221580, 0.197878, -0.000001, -0.510556, 0.859845, 0.531250, 1.000000, + -7.245987, 1.260491, -0.768114, 0.000001, 0.000000, 1.000000, 0.968750, 0.914062, + -7.245987, -1.259911, -0.768113, 0.000001, 0.000000, 1.000000, 0.968750, 0.406250, + -7.154987, 1.260490, -0.768114, 0.000001, 0.000000, 1.000000, 0.992188, 0.914062, + -7.154987, -1.259912, -0.768113, 0.000001, 0.000000, 1.000000, 0.992188, 0.406250, + -7.154987, 1.260490, -0.768114, 1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + -7.154987, -1.259912, -0.768113, 1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + -7.154987, -1.259912, -1.623805, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -7.154987, 1.260490, -1.623807, 1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + -7.245987, -1.259911, -0.768113, -1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + -7.245987, 1.260491, -0.768114, -1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + -7.245987, 1.260489, -1.623807, -1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + -7.245987, -1.259912, -1.623805, -1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -7.199987, 1.288995, -1.662821, -0.000003, 0.000001, 1.000000, 0.695312, 0.085938, + -7.049987, -1.565366, -1.662818, -0.000003, 0.000001, 1.000000, 0.000000, 0.000000, + -7.049988, 1.288995, -1.662821, -0.000003, 0.000001, 1.000000, 0.695312, 0.000000, + -7.199987, -1.565366, -1.662819, -0.000003, 0.000001, 1.000000, 0.000000, 0.085938, + 0.385430, -1.260212, 1.963800, -0.000405, -1.000000, -0.000363, 0.375000, 0.500000, + -0.000738, -1.259792, 1.239796, -0.000405, -1.000000, -0.000363, 0.187500, 0.250000, + 0.385580, -1.259793, 1.239796, -0.000405, -1.000000, -0.000363, 0.375000, 0.250000, + -0.000738, -1.259899, 1.963799, -0.000405, -1.000000, -0.000363, 0.187500, 0.500000, + 0.385430, 1.260214, 1.963800, 0.000266, 1.000000, 0.000289, 0.375000, 0.500000, + -0.000738, 1.260526, 1.239797, 0.000266, 1.000000, 0.000289, 0.187500, 0.250000, + -0.000739, 1.260526, 1.963801, 0.000266, 1.000000, 0.000289, 0.187500, 0.500000, + 0.385580, 1.260632, 1.239797, 0.000266, 1.000000, 0.000289, 0.375000, 0.250000, + -0.000738, 1.260526, 1.239797, -0.000000, 0.000000, -1.000000, 1.000000, 0.000000, + 0.385580, -1.259793, 1.239796, -0.000000, 0.000000, -1.000000, 0.507812, 0.250000, + -0.000738, -1.259792, 1.239796, -0.000000, 0.000000, -1.000000, 0.507812, 0.000000, + 0.385580, 1.260632, 1.239797, -0.000000, 0.000000, -1.000000, 1.000000, 0.250000, + -0.000739, 1.260526, 1.963801, -1.000000, -0.000000, -0.000000, 0.507812, 0.250000, + -0.000738, -1.259792, 1.239796, -1.000000, -0.000000, -0.000000, 0.000000, 0.000000, + -0.000738, -1.259899, 1.963799, -1.000000, -0.000000, -0.000000, 0.000000, 0.250000, + -0.000738, 1.260526, 1.239797, -1.000000, -0.000000, -0.000000, 0.507812, 0.000000, + -0.000739, 1.260526, 1.963801, -0.000000, -0.000000, 1.000000, 0.187500, 0.007812, + -0.000738, -1.259899, 1.963799, -0.000000, -0.000000, 1.000000, 0.187500, 0.500000, + 0.385430, 1.260214, 1.963800, -0.000000, -0.000000, 1.000000, 0.000000, 0.007812, + 0.385430, -1.260212, 1.963800, -0.000000, -0.000000, 1.000000, 0.000000, 0.500000, + 0.385580, -1.259793, 1.239796, 1.000000, 0.000000, 0.000206, 0.000000, 0.000000, + 0.385430, 1.260214, 1.963800, 1.000000, 0.000000, 0.000206, 0.507812, 0.250000, + 0.385430, -1.260212, 1.963800, 1.000000, 0.000000, 0.000206, 0.000000, 0.250000, + 0.385580, 1.260632, 1.239797, 1.000000, 0.000000, 0.000206, 0.507812, 0.000000, + 0.384649, 1.260579, 1.239795, 0.000016, 1.000000, -0.000179, 0.445312, 1.000000, + 0.338650, 1.260102, -1.424264, 0.000016, 1.000000, -0.000179, 0.500000, 0.000000, + 0.338649, 1.260579, 1.239795, 0.000016, 1.000000, -0.000179, 0.500000, 1.000000, + 0.384650, 1.260101, -1.424264, 0.000016, 1.000000, -0.000179, 0.445312, 0.000000, + 0.338650, 1.210580, 1.239795, -0.000013, -1.000000, 0.000179, 0.562500, 1.000000, + 0.384650, 1.210101, -1.424264, -0.000013, -1.000000, 0.000179, 0.625000, 0.000000, + 0.384650, 1.210579, 1.239796, -0.000013, -1.000000, 0.000179, 0.625000, 1.000000, + 0.338649, 1.210102, -1.424264, -0.000013, -1.000000, 0.000179, 0.562500, 0.000000, + 0.338649, 1.210102, -1.424264, 0.000000, -0.000000, -1.000000, 0.000000, 1.000000, + 0.384650, 1.260101, -1.424264, 0.000000, -0.000000, -1.000000, 1.000000, 0.000000, + 0.384650, 1.210101, -1.424264, 0.000000, -0.000000, -1.000000, 1.000000, 1.000000, + 0.338650, 1.260102, -1.424264, 0.000000, -0.000000, -1.000000, 0.000000, 0.000000, + 0.384650, 1.210579, 1.239796, 1.000000, 0.000005, 0.000000, 0.562500, 1.000000, + 0.384650, 1.260101, -1.424264, 1.000000, 0.000005, 0.000000, 0.500000, 0.000000, + 0.384649, 1.260579, 1.239795, 1.000000, 0.000005, 0.000000, 0.500000, 1.000000, + 0.384650, 1.210101, -1.424264, 1.000000, 0.000005, 0.000000, 0.562500, 0.000000, + 0.338649, 1.260579, 1.239795, -0.000003, 0.000003, 1.000000, 1.000000, 0.000000, + 0.338650, 1.210580, 1.239795, -0.000003, 0.000003, 1.000000, 1.000000, 1.000000, + 0.384649, 1.260579, 1.239795, -0.000003, 0.000003, 1.000000, 0.000000, 0.000000, + 0.384650, 1.210579, 1.239796, -0.000003, 0.000003, 1.000000, 0.000000, 1.000000, + 0.338650, 1.210580, 1.239795, -1.000000, 0.000000, 0.000000, 0.562500, 1.000000, + 0.338650, 1.260102, -1.424264, -1.000000, 0.000000, 0.000000, 0.500000, 0.000000, + 0.338649, 1.210102, -1.424264, -1.000000, 0.000000, 0.000000, 0.562500, 0.000000, + 0.338649, 1.260579, 1.239795, -1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + 0.338650, -1.259819, 1.239795, -0.000007, -1.000000, 0.000179, 0.445312, 1.000000, + 0.384648, -1.260298, -1.424265, -0.000007, -1.000000, 0.000179, 0.500000, 0.000000, + 0.384650, -1.259820, 1.239795, -0.000007, -1.000000, 0.000179, 0.500000, 1.000000, + 0.338648, -1.260297, -1.424265, -0.000007, -1.000000, 0.000179, 0.445312, 0.000000, + 0.384650, -1.209820, 1.239795, 0.000002, 1.000000, -0.000179, 0.562500, 1.000000, + 0.384650, -1.210298, -1.424265, 0.000002, 1.000000, -0.000179, 0.562500, 0.000000, + 0.338650, -1.209820, 1.239795, 0.000002, 1.000000, -0.000179, 0.625000, 1.000000, + 0.338650, -1.210297, -1.424265, 0.000002, 1.000000, -0.000179, 0.625000, 0.000000, + 0.338648, -1.260297, -1.424265, 0.000000, -0.000000, -1.000000, 1.000000, 0.000000, + 0.338650, -1.210297, -1.424265, 0.000000, -0.000000, -1.000000, 1.000000, 1.000000, + 0.384648, -1.260298, -1.424265, 0.000000, -0.000000, -1.000000, 0.000000, 0.000000, + 0.384650, -1.210298, -1.424265, 0.000000, -0.000000, -1.000000, 0.000000, 1.000000, + 0.338650, -1.259819, 1.239795, -1.000000, 0.000019, 0.000001, 0.500000, 1.000000, + 0.338650, -1.210297, -1.424265, -1.000000, 0.000019, 0.000001, 0.562500, 0.000000, + 0.338648, -1.260297, -1.424265, -1.000000, 0.000019, 0.000001, 0.500000, 0.000000, + 0.338650, -1.209820, 1.239795, -1.000000, 0.000019, 0.000001, 0.562500, 1.000000, + 0.384650, -1.209820, 1.239795, -0.000000, -0.000005, 1.000000, 1.000000, 1.000000, + 0.338650, -1.209820, 1.239795, -0.000000, -0.000005, 1.000000, 0.000000, 1.000000, + 0.338650, -1.259819, 1.239795, -0.000000, -0.000005, 1.000000, 0.000000, 0.000000, + 0.384650, -1.259820, 1.239795, -0.000000, -0.000005, 1.000000, 1.000000, 0.000000, + 0.384650, -1.210298, -1.424265, 1.000000, -0.000019, -0.000001, 0.562500, 0.000000, + 0.384650, -1.209820, 1.239795, 1.000000, -0.000019, -0.000001, 0.562500, 1.000000, + 0.384650, -1.259820, 1.239795, 1.000000, -0.000019, -0.000001, 0.500000, 1.000000, + 0.384648, -1.260298, -1.424265, 1.000000, -0.000019, -0.000001, 0.500000, 0.000000, + 0.043209, -1.229766, 1.243796, -0.003385, -0.999994, 0.000002, 0.804688, 1.000000, + 0.353938, -1.230820, 0.158839, -0.003385, -0.999994, 0.000002, 0.625000, 0.570312, + 0.354411, -1.230819, 1.243796, -0.003385, -0.999994, 0.000002, 0.625000, 1.000000, + 0.042735, -1.229766, 0.158839, -0.003385, -0.999994, 0.000002, 0.804688, 0.570312, + 0.043209, -1.229766, -0.385287, -0.003385, -0.999994, 0.000001, 0.625000, 0.109375, + 0.354410, -1.230820, -0.698838, -0.003385, -0.999994, 0.000001, 0.812500, 0.007812, + 0.354411, -1.230819, -0.385288, -0.003385, -0.999994, 0.000001, 0.812500, 0.109375, + 0.043208, -1.229766, -0.698837, -0.003385, -0.999994, 0.000001, 0.625000, 0.007812, + 0.354411, 1.229579, 0.063794, 0.003381, 0.999994, 0.000000, 0.625000, 0.562500, + 0.043208, 1.230631, -0.817209, 0.003380, 0.999994, 0.000001, 0.812500, 0.125000, + 0.043209, 1.230631, 0.063795, 0.003381, 0.999994, 0.000000, 0.812500, 0.562500, + 0.354410, 1.229580, -0.817210, 0.003380, 0.999994, 0.000001, 0.625000, 0.125000, + 0.354411, 1.229579, 1.243796, 0.003383, 0.999994, -0.000000, 0.625000, 1.000000, + 0.043209, 1.230631, 0.063795, 0.003381, 0.999994, 0.000000, 0.804688, 0.570312, + 0.043209, 1.230632, 1.243796, 0.003383, 0.999994, -0.000000, 0.804688, 1.000000, + 0.354411, 1.229579, 0.063794, 0.003381, 0.999994, 0.000000, 0.625000, 0.570312, + 0.045461, 1.240578, -0.849641, -0.000000, 0.000000, 1.000000, 0.003906, 0.441406, + 0.376211, -1.263974, -0.849641, -0.000000, 0.000000, 1.000000, 0.996094, 0.621094, + 0.376211, 1.240579, -0.849641, -0.000000, 0.000000, 1.000000, 0.003906, 0.621094, + 0.045461, -1.263974, -0.849641, -0.000000, 0.000000, 1.000000, 0.996094, 0.441406, + 0.045461, 1.240102, -1.362264, 0.000003, 0.000000, 1.000000, 0.003906, 0.441406, + 0.376209, -1.264453, -1.362264, 0.000003, 0.000000, 1.000000, 0.996094, 0.621094, + 0.376211, 1.240102, -1.362265, 0.000003, 0.000000, 1.000000, 0.003906, 0.621094, + 0.045459, -1.264452, -1.362263, 0.000003, 0.000000, 1.000000, 0.996094, 0.441406, + 0.335544, -1.244819, -0.850211, 1.000000, -0.000000, 0.000000, 0.000000, 1.000000, + 0.335545, 1.240102, -1.362263, 1.000000, -0.000000, 0.000000, 1.000000, 0.757812, + 0.335545, 1.240578, -0.850211, 1.000000, -0.000000, 0.000000, 1.000000, 1.000000, + 0.335545, -1.245297, -1.362263, 1.000000, -0.000000, 0.000000, 0.000000, 0.757812, + 0.385174, 1.261581, -0.818255, -0.000002, 1.000000, -0.000880, 0.000000, 0.375000, + 0.030025, 1.261101, -1.362264, -0.000002, 1.000000, -0.000880, 0.187500, 0.125000, + 0.030025, 1.261579, -0.818253, -0.000002, 1.000000, -0.000880, 0.187500, 0.375000, + 0.385174, 1.261101, -1.362265, -0.000002, 1.000000, -0.000880, 0.000000, 0.125000, + 0.044261, -1.249819, -0.849800, 0.000001, -1.000000, 0.000933, 0.187500, 0.375000, + 0.358324, -1.250297, -1.362264, 0.000001, -1.000000, 0.000933, 0.375000, 0.125000, + 0.358325, -1.249819, -0.849800, 0.000001, -1.000000, 0.000933, 0.375000, 0.375000, + 0.044261, -1.250297, -1.362263, 0.000001, -1.000000, 0.000933, 0.187500, 0.125000, + 0.097569, -2.319247, -1.362263, -0.000002, -0.999999, -0.001099, 1.000000, 0.187500, + 0.331475, -2.318768, -1.798211, -0.000002, -0.999999, -0.001099, 0.812500, 0.000000, + 0.331531, -2.319248, -1.362263, -0.000002, -0.999999, -0.001099, 0.812500, 0.187500, + 0.097569, -2.318768, -1.798210, -0.000002, -0.999999, -0.001099, 1.000000, 0.000000, + 0.343232, 2.081561, -1.362266, 0.000000, 0.999999, 0.001093, 0.812500, 0.187500, + 0.331479, 2.082037, -1.798211, 0.000000, 0.999999, 0.001093, 0.812500, 0.000000, + 0.085874, 2.081561, -1.362265, 0.000000, 0.999999, 0.001093, 1.000000, 0.187500, + 0.097572, 2.082038, -1.798210, 0.000000, 0.999999, 0.001093, 1.000000, 0.000000, + 0.044262, 1.260578, -1.798210, -0.000003, -0.000000, -1.000000, 1.000000, 0.187500, + 0.385431, -1.435487, -1.798211, -0.000003, -0.000000, -1.000000, 0.515625, 0.367188, + 0.044263, -1.435487, -1.798210, -0.000003, -0.000000, -1.000000, 0.515625, 0.187500, + 0.385431, 1.260579, -1.798211, -0.000003, -0.000000, -1.000000, 1.000000, 0.367188, + 0.044262, 1.260101, -1.362263, -1.000000, 0.000000, -0.000002, 0.992188, 0.757812, + 0.044263, -1.435487, -1.798210, -1.000000, 0.000000, -0.000002, 0.007812, 0.562500, + 0.044261, -1.435966, -1.362265, -1.000000, 0.000000, -0.000002, 0.007812, 0.757812, + 0.044262, 1.260578, -1.798210, -1.000000, 0.000000, -0.000002, 0.992188, 0.562500, + 0.385431, -1.435487, -1.798211, 1.000000, -0.000000, -0.000339, 0.003906, 0.812500, + 0.385580, 1.260101, -1.362265, 1.000000, -0.000000, -0.000339, 0.996094, 0.996094, + 0.385578, -1.435966, -1.362266, 1.000000, -0.000000, -0.000339, 0.003906, 0.996094, + 0.385431, 1.260579, -1.798211, 1.000000, -0.000000, -0.000339, 0.996094, 0.812500, + 0.385578, -1.435966, -1.362266, 0.998136, -0.061023, -0.000298, 0.496094, 0.812500, + 0.331475, -2.318768, -1.798211, 0.998136, -0.061023, -0.000298, 0.003906, 0.625000, + 0.385431, -1.435487, -1.798211, 0.998136, -0.061023, -0.000298, 0.496094, 0.625000, + 0.331531, -2.319248, -1.362263, 0.998136, -0.061023, -0.000298, 0.003906, 0.812500, + 0.044263, -1.435487, -1.798210, -0.998184, -0.060241, -0.000069, 0.492188, 0.382812, + 0.097569, -2.318768, -1.798210, -0.998184, -0.060241, -0.000069, 0.000000, 0.382812, + 0.044261, -1.435966, -1.362265, -0.998184, -0.060241, -0.000069, 0.492188, 0.554688, + 0.097569, -2.319247, -1.362263, -0.998184, -0.060241, -0.000069, 0.000000, 0.554688, + 0.097569, -2.318768, -1.798210, -0.000004, 0.000000, -1.000000, 0.500000, 0.187500, + 0.044263, -1.435487, -1.798210, -0.000004, 0.000000, -1.000000, 0.992188, 0.187500, + 0.331475, -2.318768, -1.798211, -0.000004, 0.000000, -1.000000, 0.500000, 0.367188, + 0.385431, -1.435487, -1.798211, -0.000004, 0.000000, -1.000000, 0.992188, 0.367188, + 0.044262, 1.260578, -1.798210, -0.000003, -0.000000, -1.000000, 0.992188, 0.187500, + 0.331479, 2.082037, -1.798211, -0.000003, -0.000000, -1.000000, 0.500000, 0.367188, + 0.385431, 1.260579, -1.798211, -0.000003, -0.000000, -1.000000, 0.992188, 0.367188, + 0.097572, 2.082038, -1.798210, -0.000003, -0.000000, -1.000000, 0.500000, 0.187500, + 0.085874, 2.081561, -1.362265, -0.998246, 0.057675, -0.013330, 0.000000, 0.554688, + 0.044262, 1.260578, -1.798210, -0.998246, 0.057675, -0.013330, 0.492188, 0.382812, + 0.044262, 1.260101, -1.362263, -0.998246, 0.057675, -0.013330, 0.492188, 0.554688, + 0.097572, 2.082038, -1.798210, -0.998246, 0.057675, -0.013330, 0.000000, 0.382812, + 0.385431, 1.260579, -1.798211, 0.998195, 0.058509, -0.013562, 0.496094, 0.625000, + 0.343232, 2.081561, -1.362266, 0.998195, 0.058509, -0.013562, 0.003906, 0.812500, + 0.385580, 1.260101, -1.362265, 0.998195, 0.058509, -0.013562, 0.496094, 0.812500, + 0.331479, 2.082037, -1.798211, 0.998195, 0.058509, -0.013562, 0.003906, 0.625000, + 0.044261, -1.261442, -1.361261, 0.000002, -0.000001, 1.000000, 0.996094, 0.433594, + 0.354928, -2.484831, -1.361263, 0.000002, -0.000001, 1.000000, 0.503906, 0.253906, + 0.387135, -1.261442, -1.361262, 0.000002, -0.000001, 1.000000, 0.996094, 0.253906, + 0.074173, -2.484831, -1.361262, 0.000002, -0.000001, 1.000000, 0.503906, 0.433594, + 0.085874, 2.081562, -1.362265, 0.000003, 0.000002, 1.000000, 0.507812, 0.375000, + 0.049762, 1.232390, -1.362263, 0.000003, 0.000002, 1.000000, 0.992188, 0.375000, + 0.343232, 2.081562, -1.362266, 0.000003, 0.000002, 1.000000, 0.507812, 0.562500, + 0.387564, 1.232391, -1.362264, 0.000003, 0.000002, 1.000000, 0.992188, 0.562500, + -7.199989, 1.260656, 1.963800, -0.000134, 1.000000, -0.000075, 0.187500, 0.500000, + -7.585761, 1.260549, 1.239795, -0.000134, 1.000000, -0.000075, 0.000000, 0.250000, + -7.586239, 1.260549, 1.963800, -0.000134, 1.000000, -0.000075, 0.000000, 0.500000, + -7.199989, 1.260547, 1.239796, -0.000134, 1.000000, -0.000075, 0.187500, 0.250000, + -7.586239, -1.259879, 1.963800, 0.000277, -1.000000, 0.000001, 0.000000, 0.500000, + -7.585761, -1.259879, 1.239796, 0.000277, -1.000000, 0.000001, 0.000000, 0.250000, + -7.199988, -1.259772, 1.963800, 0.000277, -1.000000, 0.000001, 0.187500, 0.500000, + -7.199988, -1.259773, 1.239797, 0.000277, -1.000000, 0.000001, 0.187500, 0.250000, + -7.585761, -1.259879, 1.239796, 0.000002, -0.000000, -1.000000, 1.000000, 0.250000, + -7.585761, 1.260549, 1.239795, 0.000002, -0.000000, -1.000000, 0.507812, 0.250000, + -7.199988, -1.259773, 1.239797, 0.000002, -0.000000, -1.000000, 1.000000, 0.000000, + -7.199989, 1.260547, 1.239796, 0.000002, -0.000000, -1.000000, 0.507812, 0.000000, + -7.199988, -1.259772, 1.963800, 1.000000, 0.000000, -0.000000, 0.507812, 0.250000, + -7.199989, 1.260547, 1.239796, 1.000000, 0.000000, -0.000000, 0.000000, 0.000000, + -7.199989, 1.260656, 1.963800, 1.000000, 0.000000, -0.000000, 0.000000, 0.250000, + -7.199988, -1.259773, 1.239797, 1.000000, 0.000000, -0.000000, 0.507812, 0.000000, + -7.586239, 1.260549, 1.963800, -0.000000, 0.000000, 1.000000, 0.000000, 0.500000, + -7.199988, -1.259772, 1.963800, -0.000000, 0.000000, 1.000000, 0.187500, 0.007812, + -7.199989, 1.260656, 1.963800, -0.000000, 0.000000, 1.000000, 0.187500, 0.500000, + -7.586239, -1.259879, 1.963800, -0.000000, 0.000000, 1.000000, 0.000000, 0.007812, + -7.585761, 1.260549, 1.239795, -1.000000, -0.000000, -0.000660, 0.000000, 0.000000, + -7.586239, -1.259879, 1.963800, -1.000000, -0.000000, -0.000660, 0.507812, 0.250000, + -7.586239, 1.260549, 1.963800, -1.000000, -0.000000, -0.000660, 0.000000, 0.250000, + -7.585761, -1.259879, 1.239796, -1.000000, -0.000000, -0.000660, 0.507812, 0.000000, + -7.583000, -1.259826, 1.239795, 0.000007, -1.000000, 0.000179, 0.445312, 1.000000, + -7.537001, -1.260304, -1.424267, 0.000007, -1.000000, 0.000179, 0.500000, 0.000000, + -7.537001, -1.259826, 1.239795, 0.000007, -1.000000, 0.000179, 0.500000, 1.000000, + -7.583000, -1.260304, -1.424267, 0.000007, -1.000000, 0.000179, 0.445312, 0.000000, + -7.537001, -1.209826, 1.239795, 0.000001, 1.000000, -0.000179, 0.562500, 1.000000, + -7.583000, -1.210304, -1.424266, 0.000001, 1.000000, -0.000179, 0.625000, 0.000000, + -7.583000, -1.209826, 1.239795, 0.000001, 1.000000, -0.000179, 0.625000, 1.000000, + -7.537001, -1.210304, -1.424266, 0.000001, 1.000000, -0.000179, 0.562500, 0.000000, + -7.583000, -1.259826, 1.239795, -1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -7.583000, -1.210304, -1.424266, -1.000000, 0.000000, 0.000000, 0.562500, 0.000000, + -7.583000, -1.260304, -1.424267, -1.000000, 0.000000, 0.000000, 0.500000, 0.000000, + -7.583000, -1.209826, 1.239795, -1.000000, 0.000000, 0.000000, 0.562500, 1.000000, + -7.583000, -1.209826, 1.239795, 0.000001, -0.000006, 1.000000, 0.000000, 1.000000, + -7.537001, -1.259826, 1.239795, 0.000001, -0.000006, 1.000000, 1.000000, 0.000000, + -7.537001, -1.209826, 1.239795, 0.000001, -0.000006, 1.000000, 1.000000, 1.000000, + -7.583000, -1.259826, 1.239795, 0.000001, -0.000006, 1.000000, 0.000000, 0.000000, + -7.537001, -1.210304, -1.424266, 1.000000, 0.000000, 0.000000, 0.562500, 0.000000, + -7.537001, -1.209826, 1.239795, 1.000000, 0.000000, 0.000000, 0.562500, 1.000000, + -7.537001, -1.259826, 1.239795, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -7.537001, -1.260304, -1.424267, 1.000000, 0.000000, 0.000000, 0.500000, 0.000000, + -7.537001, 1.260574, 1.239794, 0.000049, 1.000000, -0.000180, 0.445312, 1.000000, + -7.583001, 1.260098, -1.424267, 0.000049, 1.000000, -0.000180, 0.500000, 0.000000, + -7.583001, 1.260576, 1.239794, 0.000049, 1.000000, -0.000180, 0.500000, 1.000000, + -7.537001, 1.260095, -1.424267, 0.000049, 1.000000, -0.000180, 0.445312, 0.000000, + -7.583001, 1.210574, 1.239795, 0.000021, -1.000000, 0.000179, 0.562500, 1.000000, + -7.583001, 1.210096, -1.424267, 0.000021, -1.000000, 0.000179, 0.562500, 0.000000, + -7.537001, 1.210575, 1.239795, 0.000021, -1.000000, 0.000179, 0.625000, 1.000000, + -7.537001, 1.210097, -1.424267, 0.000021, -1.000000, 0.000179, 0.625000, 0.000000, + -7.537001, 1.210575, 1.239795, 1.000000, 0.000000, 0.000000, 0.562500, 1.000000, + -7.537001, 1.260095, -1.424267, 1.000000, 0.000000, 0.000000, 0.500000, 0.000000, + -7.537001, 1.260574, 1.239794, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -7.537001, 1.210097, -1.424267, 1.000000, 0.000000, 0.000000, 0.562500, 0.000000, + -7.583001, 1.260576, 1.239794, 0.000000, 0.000012, 1.000000, 1.000000, 0.000000, + -7.583001, 1.210574, 1.239795, 0.000000, 0.000012, 1.000000, 1.000000, 1.000000, + -7.537001, 1.260574, 1.239794, 0.000000, 0.000012, 1.000000, 0.000000, 0.000000, + -7.537001, 1.210575, 1.239795, 0.000000, 0.000012, 1.000000, 0.000000, 1.000000, + -7.583001, 1.210574, 1.239795, -1.000000, 0.000000, 0.000000, 0.562500, 1.000000, + -7.583001, 1.260098, -1.424267, -1.000000, 0.000000, 0.000000, 0.500000, 0.000000, + -7.583001, 1.210096, -1.424267, -1.000000, 0.000000, 0.000000, 0.562500, 0.000000, + -7.583001, 1.260576, 1.239794, -1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -7.555036, 1.264730, -0.849644, -0.000001, -0.000000, 1.000000, 0.996094, 0.621094, + -7.555036, -1.239826, -0.849644, -0.000001, -0.000000, 1.000000, 0.003906, 0.621094, + -7.246189, 1.264730, -0.849644, -0.000001, -0.000000, 1.000000, 0.996094, 0.441406, + -7.246189, -1.239826, -0.849644, -0.000001, -0.000000, 1.000000, 0.003906, 0.441406, + -7.530242, -1.239826, -0.850214, -1.000000, 0.000000, 0.000000, 1.000000, 1.000000, + -7.530242, 1.245575, -0.850214, -1.000000, 0.000000, 0.000000, 0.000000, 1.000000, + -7.530242, 1.245098, -1.362268, -1.000000, 0.000000, 0.000000, 0.000000, 0.757812, + -7.530242, -1.240306, -1.362267, -1.000000, 0.000000, 0.000000, 1.000000, 0.757812, + -7.245229, 1.210122, -1.424266, 0.000000, -0.000010, -1.000000, 1.000000, 1.000000, + -7.291229, 1.210122, -1.424266, 0.000000, -0.000010, -1.000000, 0.000000, 1.000000, + -7.291229, 1.260123, -1.424266, 0.000000, -0.000010, -1.000000, 0.000000, 0.000000, + -7.245229, 1.260124, -1.424266, 0.000000, -0.000010, -1.000000, 1.000000, 0.000000, + -7.291229, -1.260278, -1.424266, 0.000000, -0.000000, -1.000000, 1.000000, 0.000000, + -7.245229, -1.210278, -1.424266, 0.000000, -0.000000, -1.000000, 0.000000, 1.000000, + -7.245229, -1.260278, -1.424266, 0.000000, -0.000000, -1.000000, 0.000000, 0.000000, + -7.291229, -1.210278, -1.424266, 0.000000, -0.000000, -1.000000, 1.000000, 1.000000, + -7.585581, 1.240125, -1.362268, -0.000003, -0.000000, 1.000000, 0.996094, 0.621094, + -7.585581, -1.264433, -1.362268, -0.000003, -0.000000, 1.000000, 0.003906, 0.621094, + -7.246229, 1.240122, -1.362267, -0.000003, -0.000000, 1.000000, 0.996094, 0.441406, + -7.246229, -1.264433, -1.362268, -0.000003, -0.000000, 1.000000, 0.003906, 0.441406, + -7.469115, 1.194382, -1.367770, 0.510198, 0.860057, 0.000756, 0.000000, 0.000000, + -7.590491, 1.266861, -1.911406, 0.510198, 0.860057, 0.000756, 0.242188, 0.031250, + -7.590491, 1.266384, -1.367770, 0.510198, 0.860057, 0.000756, 0.000000, 0.031250, + -7.469115, 1.194860, -1.911406, 0.510198, 0.860057, 0.000756, 0.242188, 0.000000, + -7.590491, 1.266384, -1.367770, -1.000000, 0.000000, 0.000000, 0.000000, 0.031250, + -7.590491, 1.122859, -1.911406, -1.000000, 0.000000, 0.000000, 0.242188, 0.093750, + -7.590491, 1.122383, -1.367771, -1.000000, 0.000000, 0.000000, 0.000000, 0.093750, + -7.590491, 1.266861, -1.911406, -1.000000, 0.000000, 0.000000, 0.242188, 0.031250, + -7.590491, 1.122383, -1.367771, 0.510184, -0.860065, -0.000754, 0.000000, 0.093750, + -7.469115, 1.194860, -1.911406, 0.510185, -0.860065, -0.000754, 0.242188, 0.125000, + -7.469115, 1.194382, -1.367770, 0.510184, -0.860065, -0.000754, 0.000000, 0.125000, + -7.590491, 1.122859, -1.911406, 0.510184, -0.860065, -0.000754, 0.242188, 0.093750, + -7.299335, -2.319228, -1.362267, 0.000001, -0.999999, -0.001097, 0.812500, 0.187500, + -7.532668, -2.318750, -1.798213, 0.000001, -0.999999, -0.001097, 1.000000, 0.000000, + -7.299335, -2.318750, -1.798212, 0.000001, -0.999999, -0.001097, 0.812500, 0.000000, + -7.532668, -2.319229, -1.362267, 0.000001, -0.999999, -0.001097, 1.000000, 0.187500, + -7.287664, 2.081583, -1.362266, 0.000003, 0.999999, 0.001094, 0.812500, 0.187500, + -7.299331, 2.082060, -1.798213, 0.000003, 0.999999, 0.001094, 0.812500, 0.000000, + -7.544331, 2.081583, -1.362266, 0.000003, 0.999999, 0.001094, 1.000000, 0.187500, + -7.532664, 2.082061, -1.798214, 0.000003, 0.999999, 0.001094, 1.000000, 0.000000, + -7.585999, -1.435467, -1.798213, 0.000005, -0.000000, -1.000000, 0.515625, 0.187500, + -7.245230, 1.260600, -1.798211, 0.000005, -0.000000, -1.000000, 1.000000, 0.367188, + -7.245230, -1.435468, -1.798211, 0.000005, -0.000000, -1.000000, 0.515625, 0.367188, + -7.585999, 1.260601, -1.798214, 0.000005, -0.000000, -1.000000, 1.000000, 0.187500, + -7.585999, 1.260125, -1.362268, -1.000000, 0.000000, 0.000000, 0.992188, 0.757812, + -7.585999, -1.435467, -1.798213, -1.000000, 0.000000, 0.000000, 0.007812, 0.562500, + -7.585999, -1.435946, -1.362267, -1.000000, 0.000000, 0.000000, 0.007812, 0.757812, + -7.585999, 1.260601, -1.798214, -1.000000, 0.000000, 0.000000, 0.992188, 0.562500, + -7.245230, -1.435468, -1.798211, 1.000000, 0.000000, 0.000000, 0.007812, 0.562500, + -7.245230, 1.260124, -1.362267, 1.000000, 0.000000, 0.000000, 0.992188, 0.757812, + -7.245230, -1.435946, -1.362267, 1.000000, 0.000000, 0.000000, 0.007812, 0.757812, + -7.245230, 1.260600, -1.798211, 1.000000, 0.000000, 0.000000, 0.992188, 0.562500, + -7.245230, -1.435946, -1.362267, 0.998129, -0.061140, -0.000067, 0.492188, 0.554688, + -7.299335, -2.318750, -1.798212, 0.998129, -0.061140, -0.000067, 0.000000, 0.382812, + -7.245230, -1.435468, -1.798211, 0.998129, -0.061140, -0.000067, 0.492188, 0.382812, + -7.299335, -2.319228, -1.362267, 0.998129, -0.061140, -0.000067, 0.000000, 0.554688, + -7.585999, -1.435467, -1.798213, -0.998182, -0.060269, -0.000066, 0.492188, 0.382812, + -7.532668, -2.318750, -1.798213, -0.998182, -0.060269, -0.000066, 0.000000, 0.382812, + -7.585999, -1.435946, -1.362267, -0.998182, -0.060269, -0.000066, 0.492188, 0.554688, + -7.532668, -2.319229, -1.362267, -0.998182, -0.060269, -0.000066, 0.000000, 0.554688, + -7.532668, -2.318750, -1.798213, 0.000003, 0.000001, -1.000000, 0.500000, 0.187500, + -7.585999, -1.435467, -1.798213, 0.000003, 0.000001, -1.000000, 0.992188, 0.187500, + -7.299335, -2.318750, -1.798212, 0.000003, 0.000001, -1.000000, 0.500000, 0.367188, + -7.245230, -1.435468, -1.798211, 0.000003, 0.000001, -1.000000, 0.992188, 0.367188, + -7.585999, 1.260601, -1.798214, 0.000004, -0.000001, -1.000000, 0.992188, 0.187500, + -7.299331, 2.082060, -1.798213, 0.000004, -0.000001, -1.000000, 0.500000, 0.367188, + -7.245230, 1.260600, -1.798211, 0.000004, -0.000001, -1.000000, 0.992188, 0.367188, + -7.532664, 2.082061, -1.798214, 0.000004, -0.000001, -1.000000, 0.500000, 0.187500, + -7.544331, 2.081583, -1.362266, -0.998244, 0.057725, -0.013294, 0.000000, 0.554688, + -7.585999, 1.260601, -1.798214, -0.998244, 0.057725, -0.013294, 0.492188, 0.382812, + -7.585999, 1.260125, -1.362268, -0.998244, 0.057725, -0.013294, 0.492188, 0.554688, + -7.532664, 2.082061, -1.798214, -0.998244, 0.057725, -0.013294, 0.000000, 0.382812, + -7.245230, 1.260600, -1.798211, 0.998190, 0.058652, -0.013292, 0.492188, 0.382812, + -7.287664, 2.081583, -1.362266, 0.998190, 0.058652, -0.013292, 0.000000, 0.554688, + -7.245230, 1.260124, -1.362267, 0.998190, 0.058652, -0.013292, 0.492188, 0.554688, + -7.299331, 2.082060, -1.798213, 0.998190, 0.058652, -0.013292, 0.000000, 0.382812, + -7.556002, -2.484812, -1.361265, -0.000002, 0.000001, 1.000000, 0.503906, 0.253906, + -7.245230, -1.261422, -1.361265, -0.000002, 0.000001, 1.000000, 0.996094, 0.433594, + -7.586780, -1.261423, -1.361266, -0.000002, 0.000001, 1.000000, 0.996094, 0.253906, + -7.276001, -2.484812, -1.361264, -0.000002, 0.000001, 1.000000, 0.503906, 0.433594, + -7.339236, -2.401460, -1.382267, 0.000000, -0.000001, 1.000000, 0.890625, 1.000000, + -7.492763, -2.401460, -1.382267, 0.000000, -0.000001, 1.000000, 0.890625, 1.000000, + -7.415999, -2.478224, -1.382267, 0.000000, -0.000001, 1.000000, 0.992188, 1.000000, + -7.416000, -2.324697, -1.382267, 0.000000, -0.000001, 1.000000, 0.820312, 1.000000, + -7.544331, 2.081584, -1.362266, -0.000004, -0.000002, 1.000000, 0.507812, 0.375000, + -7.586055, 1.232412, -1.362269, -0.000004, -0.000002, 1.000000, 0.992188, 0.375000, + -7.287664, 2.081583, -1.362266, -0.000004, -0.000002, 1.000000, 0.507812, 0.562500, + -7.239729, 1.232411, -1.362267, -0.000004, -0.000002, 1.000000, 0.992188, 0.562500, + 0.043162, -1.259932, 1.239794, -0.000001, -1.000000, -0.000000, 0.000000, 1.000000, + -0.045838, -1.259930, -1.646209, -0.000001, -1.000000, -0.000000, 0.070312, 0.000000, + 0.043162, -1.259931, -1.646209, -0.000001, -1.000000, -0.000000, 0.000000, 0.000000, + -0.045838, -1.259932, 1.239794, -0.000001, -1.000000, -0.000000, 0.070312, 1.000000, + 0.043162, -1.209931, 1.239794, 0.000001, 1.000000, 0.000000, 0.179688, 1.000000, + 0.043161, -1.209930, -1.646209, 0.000001, 1.000000, 0.000000, 0.179688, 0.000000, + -0.045838, -1.209931, 1.239794, 0.000001, 1.000000, 0.000000, 0.117188, 1.000000, + -0.045839, -1.209931, -1.646209, 0.000001, 1.000000, 0.000000, 0.117188, 0.000000, + -0.045838, -1.209931, 1.239794, -1.000000, -0.000010, 0.000000, 0.125000, 1.000000, + -0.045838, -1.259930, -1.646209, -1.000000, -0.000010, 0.000000, 0.070312, 0.000000, + -0.045838, -1.259932, 1.239794, -1.000000, -0.000010, 0.000000, 0.070312, 1.000000, + -0.045839, -1.209931, -1.646209, -1.000000, -0.000010, 0.000000, 0.125000, 0.000000, + 0.043162, -1.209931, 1.239794, 1.000000, 0.000005, -0.000000, 0.125000, 1.000000, + 0.043162, -1.259931, -1.646209, 1.000000, 0.000005, -0.000000, 0.070312, 0.000000, + 0.043161, -1.209930, -1.646209, 1.000000, 0.000005, -0.000000, 0.125000, 0.000000, + 0.043162, -1.259932, 1.239794, 1.000000, 0.000005, -0.000000, 0.070312, 1.000000, + -0.045838, 1.260468, 1.239794, -0.000001, 1.000000, -0.000000, 0.187500, 1.000000, + 0.043161, 1.260468, -1.646207, -0.000001, 1.000000, -0.000000, 0.257812, 0.000000, + -0.045838, 1.260468, -1.646207, -0.000001, 1.000000, -0.000000, 0.187500, 0.000000, + 0.043162, 1.260468, 1.239794, -0.000001, 1.000000, -0.000000, 0.257812, 1.000000, + -0.045838, 1.210469, 1.239794, -0.000003, -1.000000, 0.000000, 0.367188, 1.000000, + -0.045838, 1.210468, -1.646207, -0.000003, -1.000000, 0.000000, 0.367188, 0.000000, + 0.043162, 1.210468, 1.239794, -0.000003, -1.000000, 0.000000, 0.304688, 1.000000, + 0.043161, 1.210468, -1.646208, -0.000003, -1.000000, 0.000000, 0.304688, 0.000000, + 0.043162, 1.210468, 1.239794, 1.000000, -0.000005, -0.000000, 0.312500, 1.000000, + 0.043161, 1.260468, -1.646207, 1.000000, -0.000005, -0.000000, 0.257812, 0.000000, + 0.043162, 1.260468, 1.239794, 1.000000, -0.000005, -0.000000, 0.257812, 1.000000, + 0.043161, 1.210468, -1.646208, 1.000000, -0.000005, -0.000000, 0.312500, 0.000000, + -0.045838, 1.210469, 1.239794, -1.000000, -0.000005, 0.000000, 0.312500, 1.000000, + -0.045838, 1.260468, -1.646207, -1.000000, -0.000005, 0.000000, 0.257812, 0.000000, + -0.045838, 1.210468, -1.646207, -1.000000, -0.000005, 0.000000, 0.312500, 0.000000, + -0.045838, 1.260468, 1.239794, -1.000000, -0.000005, 0.000000, 0.257812, 1.000000, + -0.000837, 1.219968, -0.261280, 1.000000, -0.000000, -0.000002, 0.828125, 0.000000, + -0.000837, -1.220430, 0.173645, 1.000000, -0.000000, -0.000002, 1.000000, 1.000000, + -0.000838, -1.220431, -0.705441, 1.000000, -0.000000, -0.000002, 0.500000, 1.000000, + -0.000838, 1.219969, -0.705441, 1.000000, -0.000000, -0.000002, 0.500000, 0.000000, + -0.000838, 1.224975, -0.296221, -0.000008, 0.510555, -0.859845, 0.500000, 0.000000, + -0.025586, 1.224975, -0.271472, -0.818117, 0.571248, -0.066027, 0.500000, 0.000000, + 0.023911, 1.224975, -0.271473, 0.818109, 0.571260, -0.066030, 0.531250, 0.000000, + -0.000838, 1.224975, -0.246723, -0.000006, 0.643823, 0.765174, 0.531250, 0.000000, + 0.023911, -1.221599, 0.173130, 0.818113, -0.571256, 0.066020, 0.531250, 1.000000, + -0.025586, -1.221599, 0.173130, -0.818112, -0.571256, 0.066020, 0.500000, 1.000000, + -0.000837, -1.221599, 0.148381, -0.000005, -0.643823, -0.765175, 0.500000, 1.000000, + -0.000837, -1.221599, 0.197879, -0.000003, -0.510553, 0.859846, 0.531250, 1.000000, + -0.046838, 1.260468, -0.768110, -0.000000, 0.000000, 1.000000, 0.968750, 0.914062, + 0.044162, -1.259931, -0.768110, -0.000000, 0.000000, 1.000000, 0.992188, 0.406250, + 0.044162, 1.260469, -0.768110, -0.000000, 0.000000, 1.000000, 0.992188, 0.914062, + -0.046838, -1.259931, -0.768110, -0.000000, 0.000000, 1.000000, 0.968750, 0.406250, + 0.044162, -1.259931, -0.768110, 1.000000, 0.000000, 0.000000, 0.992188, 1.000000, + 0.044162, 1.260468, -1.623804, 1.000000, 0.000000, 0.000000, 0.500000, 0.312500, + 0.044162, 1.260469, -0.768110, 1.000000, 0.000000, 0.000000, 0.992188, 0.312500, + 0.044163, -1.259931, -1.623802, 1.000000, 0.000000, 0.000000, 0.500000, 1.000000, + -0.046838, -1.259931, -0.768110, -1.000000, -0.000000, -0.000000, 0.992188, 1.000000, + -0.046838, 1.260468, -0.768110, -1.000000, -0.000000, -0.000000, 0.992188, 0.312500, + -0.046838, 1.260467, -1.623804, -1.000000, -0.000000, -0.000000, 0.500000, 0.312500, + -0.046837, -1.259931, -1.623802, -1.000000, -0.000000, -0.000000, 0.500000, 1.000000, + -0.150838, 1.288972, -1.662815, 0.000006, 0.000000, 1.000000, 0.695312, 0.125000, + -0.000739, -1.565385, -1.662816, 0.000006, 0.000000, 1.000000, 0.000000, 0.046875, + -0.000739, 1.288973, -1.662817, 0.000006, 0.000000, 1.000000, 0.695312, 0.046875, + -0.150837, -1.565385, -1.662816, 0.000006, 0.000000, 1.000000, 0.000000, 0.125000, + -7.553863, -1.240772, 1.243795, -0.003392, -0.999994, 0.000002, 0.625000, 1.000000, + -7.243762, -1.241826, 0.158838, -0.003392, -0.999994, 0.000002, 0.804688, 0.570312, + -7.243289, -1.241826, 1.243795, -0.003392, -0.999994, 0.000002, 0.804688, 1.000000, + -7.554336, -1.240773, 0.158838, -0.003392, -0.999994, 0.000002, 0.625000, 0.570312, + -7.243289, -1.241826, -0.385289, -0.003392, -0.999994, -0.000000, 0.812500, 0.109375, + -7.553863, -1.240773, -0.385289, -0.003392, -0.999994, -0.000000, 0.625000, 0.109375, + -7.553863, -1.240773, -0.698841, -0.003392, -0.999994, -0.000000, 0.625000, 0.007812, + -7.243289, -1.241826, -0.698841, -0.003392, -0.999994, -0.000000, 0.812500, 0.007812, + -7.243289, 1.218575, 0.063793, 0.003392, 0.999994, -0.000000, 0.804688, 0.562500, + -7.553863, 1.219627, -0.817212, 0.003390, 0.999994, -0.000001, 0.625000, 0.125000, + -7.553863, 1.219628, 0.063794, 0.003392, 0.999994, -0.000000, 0.625000, 0.562500, + -7.243289, 1.218574, -0.817213, 0.003390, 0.999994, -0.000001, 0.804688, 0.125000, + -7.243289, 1.218573, 1.243794, 0.003393, 0.999994, 0.000001, 0.804688, 1.000000, + -7.553863, 1.219628, 0.063794, 0.003392, 0.999994, -0.000000, 0.625000, 0.570312, + -7.553863, 1.219628, 1.243795, 0.003393, 0.999994, 0.000001, 0.625000, 1.000000, + -7.243289, 1.218575, 0.063793, 0.003392, 0.999994, -0.000000, 0.804688, 0.570312, + -7.567046, 1.250576, -0.818257, -0.000001, 1.000000, -0.000882, 0.187500, 0.375000, + -7.212525, 1.250096, -1.362268, -0.000001, 1.000000, -0.000882, 0.000000, 0.125000, + -7.567046, 1.250096, -1.362269, -0.000001, 1.000000, -0.000882, 0.187500, 0.125000, + -7.212525, 1.250576, -0.818258, -0.000001, 1.000000, -0.000882, 0.000000, 0.375000, + -7.198289, -1.260826, -0.849804, 0.000000, -1.000000, 0.000933, 0.375000, 0.375000, + -7.552809, -1.260826, -0.849803, 0.000000, -1.000000, 0.000933, 0.187500, 0.375000, + -7.552809, -1.261304, -1.362268, 0.000000, -1.000000, 0.000933, 0.187500, 0.125000, + -7.198289, -1.261304, -1.362268, 0.000000, -1.000000, 0.000933, 0.375000, 0.125000, + 0.371807, 1.595162, -1.367766, 0.000002, 0.000000, 1.000000, 0.000000, 0.031250, + 0.371807, 1.739162, -1.367766, 0.000002, 0.000000, 1.000000, 0.000000, 0.093750, + 0.250354, 1.667162, -1.367766, 0.000002, 0.000000, 1.000000, 0.226562, 0.281250 + ], + "parts": [ + { + "id": "shape2_part1", + "type": "TRIANGLES", + "indices": [ 0, 1, 2, 1, 0, 3], + "aabb": [-0.593922, -0.594019, -1.719538, 0.000001, -0.000097, 0.163798] + }, + { + "id": "shape3_part1", + "type": "TRIANGLES", + "indices": [ 4, 5, 6, 5, 4, 7], + "aabb": [-0.002000, -0.595019, -1.719537, 0.592922, -0.000097, 0.164001] + }, + { + "id": "shape4_part1", + "type": "TRIANGLES", + "indices": [ 4, 5, 6, 5, 4, 7], + "aabb": [-0.002000, -0.595019, -1.719537, 0.592922, -0.000097, 0.164001] + }, + { + "id": "shape5_part1", + "type": "TRIANGLES", + "indices": [ 0, 1, 2, 1, 0, 3], + "aabb": [-0.593922, -0.594019, -1.719538, 0.000001, -0.000097, 0.163798] + }, + { + "id": "shape6_part1", + "type": "TRIANGLES", + "indices": [ 0, 1, 2, 1, 0, 3], + "aabb": [-0.593922, -0.594019, -1.719538, 0.000001, -0.000097, 0.163798] + }, + { + "id": "shape7_part1", + "type": "TRIANGLES", + "indices": [ 4, 5, 6, 5, 4, 7], + "aabb": [-0.002000, -0.595019, -1.719537, 0.592922, -0.000097, 0.164001] + }, + { + "id": "shape8_part1", + "type": "TRIANGLES", + "indices": [ 0, 1, 2, 1, 0, 3], + "aabb": [-0.593922, -0.594019, -1.719538, 0.000001, -0.000097, 0.163798] + }, + { + "id": "shape9_part1", + "type": "TRIANGLES", + "indices": [ 4, 5, 6, 5, 4, 7], + "aabb": [-0.002000, -0.595019, -1.719537, 0.592922, -0.000097, 0.164001] + }, + { + "id": "shape10_part1", + "type": "TRIANGLES", + "indices": [ 0, 1, 2, 1, 0, 3], + "aabb": [-0.593922, -0.594019, -1.719538, 0.000001, -0.000097, 0.163798] + }, + { + "id": "shape11_part1", + "type": "TRIANGLES", + "indices": [ 4, 5, 6, 5, 4, 7], + "aabb": [-0.002000, -0.595019, -1.719537, 0.592922, -0.000097, 0.164001] + }, + { + "id": "shape12_part1", + "type": "TRIANGLES", + "indices": [ 0, 1, 2, 1, 0, 3], + "aabb": [-0.593922, -0.594019, -1.719538, 0.000001, -0.000097, 0.163798] + }, + { + "id": "shape13_part1", + "type": "TRIANGLES", + "indices": [ 4, 5, 6, 5, 4, 7], + "aabb": [-0.002000, -0.595019, -1.719537, 0.592922, -0.000097, 0.164001] + }, + { + "id": "shape1_part1", + "type": "TRIANGLES", + "indices": [ + 8, 9, 10, 9, 8, 11, 12, 13, 14, 12, 14, 15, + 16, 17, 18, 17, 16, 19, 20, 21, 22, 21, 20, 23, + 24, 25, 26, 26, 25, 27, 28, 29, 30, 29, 28, 31, + 32, 33, 34, 33, 32, 35, 36, 37, 38, 38, 37, 39, + 40, 41, 42, 41, 40, 43, 44, 45, 46, 45, 44, 47, + 48, 49, 50, 49, 48, 51, 52, 53, 54, 54, 53, 55, + 56, 57, 58, 57, 56, 59, 60, 61, 62, 61, 60, 63, + 64, 65, 66, 64, 66, 67, 68, 69, 70, 70, 71, 68, + 72, 73, 74, 73, 72, 75, 69, 72, 70, 74, 70, 72, + 68, 72, 69, 72, 68, 75, 71, 75, 68, 75, 71, 73, + 70, 74, 71, 73, 71, 74, 76, 77, 78, 78, 77, 79, + 80, 81, 82, 80, 82, 83, 84, 85, 86, 84, 86, 87, + 88, 89, 90, 90, 89, 91, 92, 93, 94, 93, 92, 95, + 96, 97, 98, 97, 96, 99, 100, 101, 102, 101, 100, 103, + 104, 105, 106, 105, 104, 107, 108, 109, 110, 110, 109, 111, + 112, 113, 114, 113, 112, 115, 116, 117, 118, 117, 116, 119, + 120, 121, 122, 121, 120, 123, 124, 125, 126, 125, 124, 127, + 128, 129, 130, 129, 128, 131, 132, 133, 134, 134, 133, 135, + 136, 137, 138, 137, 136, 139, 140, 141, 142, 141, 140, 143, + 144, 145, 146, 144, 146, 147, 148, 149, 150, 150, 151, 148, + 152, 153, 154, 153, 152, 155, 149, 152, 150, 154, 150, 152, + 148, 152, 149, 152, 148, 155, 151, 155, 148, 155, 151, 153, + 150, 154, 151, 153, 151, 154, 156, 157, 158, 157, 156, 159, + 160, 161, 162, 161, 160, 163, 164, 165, 166, 164, 166, 167, + 168, 169, 170, 170, 169, 171, 172, 173, 174, 173, 172, 175, + 176, 177, 178, 176, 178, 179, 180, 181, 182, 181, 180, 183, + 184, 185, 186, 185, 184, 187, 188, 189, 190, 190, 189, 191, + 192, 193, 194, 193, 192, 195, 196, 197, 198, 198, 197, 199, + 200, 201, 202, 201, 200, 203, 204, 205, 206, 206, 207, 204, + 208, 209, 210, 209, 208, 211, 212, 213, 214, 214, 213, 215, + 216, 217, 218, 217, 216, 219, 220, 221, 222, 221, 220, 223, + 224, 225, 226, 224, 226, 227, 228, 229, 230, 230, 231, 228, + 232, 233, 234, 233, 232, 235, 229, 234, 230, 233, 230, 234, + 234, 229, 232, 232, 229, 228, 231, 232, 228, 232, 231, 235, + 230, 233, 231, 235, 231, 233, 236, 237, 238, 237, 236, 239, + 240, 241, 242, 241, 240, 243, 244, 245, 246, 244, 246, 247, + 248, 249, 250, 249, 248, 251, 252, 253, 254, 253, 252, 255, + 256, 257, 258, 256, 258, 259, 260, 261, 262, 261, 260, 263, + 264, 265, 266, 265, 264, 267, 268, 269, 270, 269, 268, 271, + 272, 273, 274, 273, 272, 275, 276, 277, 278, 278, 277, 279, + 280, 281, 282, 281, 280, 283, 284, 285, 286, 285, 284, 287, + 288, 289, 290, 289, 288, 291, 292, 293, 294, 294, 293, 295, + 296, 297, 298, 297, 296, 299, 300, 301, 302, 301, 300, 303, + 304, 305, 306, 304, 306, 307, 308, 309, 310, 309, 308, 311, + 312, 313, 314, 313, 312, 315, 308, 314, 311, 313, 311, 314, + 310, 314, 308, 314, 310, 312, 309, 312, 310, 312, 309, 315, + 311, 313, 309, 315, 309, 313, 316, 317, 318, 318, 317, 319, + 320, 321, 322, 321, 320, 323, 324, 325, 326, 324, 326, 327, + 328, 329, 330, 330, 329, 331, 332, 333, 334, 333, 332, 335, + 336, 337, 338, 336, 338, 339, 340, 341, 342, 341, 340, 343, + 344, 345, 346, 345, 344, 347, 348, 349, 350, 350, 349, 351, + 352, 353, 354, 353, 352, 355, 356, 357, 358, 357, 356, 359, + 360, 361, 362, 361, 360, 363, 364, 365, 366, 365, 364, 367, + 368, 369, 370, 369, 368, 371, 372, 373, 374, 373, 372, 375, + 376, 377, 378, 377, 376, 379, 380, 381, 382, 381, 380, 383, + 384, 385, 386, 384, 386, 387, 388, 389, 390, 389, 391, 390, + 392, 393, 394, 393, 392, 395, 388, 394, 389, 393, 389, 394, + 394, 390, 392, 390, 394, 388, 391, 392, 390, 392, 391, 395, + 389, 393, 391, 395, 391, 393, 396, 397, 398, 397, 396, 399, + 400, 401, 402, 401, 400, 403, 404, 405, 406, 405, 404, 407, + 408, 409, 410, 410, 409, 411, 412, 413, 414, 413, 412, 415, + 416, 417, 418, 417, 416, 419, 420, 421, 422, 421, 420, 423, + 424, 425, 426, 425, 424, 427, 428, 429, 430, 430, 429, 431, + 432, 433, 434, 433, 432, 435, 436, 437, 438, 438, 437, 439, + 440, 441, 442, 441, 440, 443, 444, 445, 446, 446, 447, 444, + 448, 449, 450, 449, 448, 451, 452, 453, 454, 453, 452, 455, + 456, 457, 458, 457, 456, 459, 460, 461, 462, 461, 460, 463, + 464, 465, 466, 464, 466, 467, 468, 469, 470, 469, 468, 471, + 472, 473, 474, 473, 472, 475, 468, 474, 471, 473, 471, 474, + 470, 474, 468, 474, 470, 472, 469, 472, 470, 472, 469, 475, + 471, 473, 469, 475, 469, 473, 476, 477, 478, 478, 477, 479, + 480, 481, 482, 480, 482, 483, 484, 485, 486, 484, 486, 487, + 488, 489, 490, 489, 488, 491, 492, 493, 494, 493, 492, 495, + 496, 497, 498, 497, 496, 499, 500, 501, 502, 501, 500, 503, + 504, 505, 506, 505, 504, 507, 508, 509, 510, 510, 509, 511, + 512, 513, 514, 513, 512, 515, 516, 517, 518, 517, 516, 519, + 520, 521, 522, 521, 520, 523, 524, 525, 526, 525, 524, 527, + 528, 529, 530, 529, 528, 531, 532, 533, 534, 534, 533, 535, + 536, 537, 538, 537, 536, 539, 540, 541, 542, 541, 540, 543, + 544, 545, 546, 546, 545, 547, 548, 549, 550, 550, 549, 551, + 552, 553, 554, 553, 552, 555, 556, 557, 558, 556, 558, 559, + 560, 561, 562, 562, 563, 560, 564, 565, 566, 565, 564, 567, + 568, 569, 570, 569, 568, 571, 572, 573, 574, 573, 572, 575, + 576, 577, 578, 577, 576, 579, 580, 581, 582, 581, 580, 583, + 584, 585, 586, 585, 584, 587, 588, 589, 590, 589, 588, 591, + 592, 593, 594, 593, 592, 595, 596, 597, 598, 597, 596, 599, + 600, 601, 602, 601, 600, 603, 604, 605, 606, 606, 605, 607, + 608, 609, 610, 609, 608, 611, 612, 613, 614, 613, 612, 615, + 616, 617, 618, 617, 616, 619, 620, 621, 622, 621, 620, 623, + 624, 625, 626, 627, 626, 625, 628, 629, 630, 630, 629, 631, + 632, 633, 634, 633, 632, 635, 636, 637, 638, 637, 636, 639, + 640, 641, 642, 641, 640, 643, 644, 645, 646, 645, 644, 647, + 648, 649, 650, 650, 649, 651, 652, 653, 654, 653, 652, 655, + 656, 657, 658, 658, 657, 659, 660, 661, 662, 662, 661, 663, + 664, 665, 666, 665, 664, 667, 668, 669, 670, 669, 668, 671, + 672, 673, 674, 673, 672, 675, 676, 677, 678, 677, 676, 679, + 680, 681, 682, 681, 680, 683, 684, 685, 686, 685, 684, 687, + 688, 689, 690, 689, 688, 691, 692, 693, 694, 694, 695, 692, + 696, 697, 698, 697, 696, 699, 700, 701, 702, 702, 701, 703, + 704, 705, 706, 705, 704, 707, 708, 709, 710, 710, 709, 711, + 712, 713, 714, 713, 712, 715, 716, 717, 718, 718, 717, 719, + 720, 721, 722, 720, 722, 723, 724, 725, 726, 724, 726, 727, + 728, 729, 730, 729, 728, 731, 732, 733, 734, 734, 733, 735, + 736, 737, 738, 737, 736, 739, 740, 741, 742, 741, 740, 743, + 744, 745, 746, 745, 744, 747, 748, 749, 750, 749, 748, 751, + 752, 753, 754, 754, 753, 755, 756, 757, 758, 757, 756, 759, + 760, 761, 762, 761, 760, 763, 764, 765, 766, 765, 764, 767, + 768, 769, 770, 769, 768, 771, 772, 773, 774, 775, 774, 773, + 776, 777, 778, 778, 777, 779, 780, 781, 782, 781, 780, 783, + 784, 785, 786, 785, 784, 787, 788, 789, 790, 789, 788, 791, + 792, 793, 794, 793, 792, 795, 796, 797, 798, 797, 796, 799, + 800, 801, 802, 802, 801, 803, 804, 805, 806, 805, 804, 807, + 808, 809, 810, 810, 809, 811, 812, 813, 814, 813, 812, 815, + 816, 817, 818, 817, 816, 819, 820, 821, 822, 821, 820, 823, + 824, 825, 826, 826, 825, 827, 828, 829, 830, 829, 828, 831, + 832, 833, 834, 833, 832, 835, 836, 837, 838, 836, 838, 839, + 840, 841, 842, 841, 843, 842, 844, 845, 846, 845, 844, 847, + 840, 846, 841, 845, 841, 846, 846, 840, 844, 844, 840, 842, + 843, 844, 842, 844, 843, 847, 841, 845, 843, 847, 843, 845, + 848, 849, 850, 849, 848, 851, 852, 853, 854, 853, 852, 855, + 856, 857, 858, 856, 858, 859, 860, 861, 862, 861, 860, 863, + 864, 865, 866, 865, 864, 867, 868, 869, 870, 868, 870, 871, + 872, 873, 874, 873, 872, 875, 876, 877, 878, 877, 876, 879, + 880, 881, 882, 881, 880, 883, 884, 885, 886, 884, 886, 887, + 888, 889, 890 + ], + "aabb": [-7.590491, -2.484831, -1.911406, 0.387564, 2.082061, 1.963801] + } + ] + } + ], + "materials": [ + { + "id": "takeda", + "ambient": [ 0.000000, 0.000000, 0.000000], + "diffuse": [ 1.000000, 1.000000, 1.000000], + "emissive": [ 0.000000, 0.000000, 0.000000], + "opacity": 0.000000, + "textures": [ + { + "id": "file1", + "filename": "UV.jpg", + "type": "DIFFUSE", + "wrapModeU": "REPEAT", + "wrapModeV": "REPEAT" + } + ] + } + ], + "nodes": [ + { + "id": "Enter", + "skeleton": false, + "transform": [ 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000], + "children": [ + { + "id": "Plane269", + "skeleton": false, + "transform": [-10.000000, -0.000003, 0.000008, 0.000000, 0.000008, 0.000003, 9.999990, 0.000000, -0.000003, 9.999990, -0.000003, 0.000000, 145.719971, 26.362038, -0.000006, 1.000000], + "parts": [ + { + "meshpartid": "shape1_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ], + "children": [ + { + "id": "OBJp1668", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, 0.000001, -1.260000, -0.000000, 1.000000], + "parts": [ + { + "meshpartid": "shape2_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1669", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -1.200001, -1.260000, -0.000202, 1.000000], + "parts": [ + { + "meshpartid": "shape3_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1670", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -2.400001, -1.259999, -0.000202, 1.000000], + "parts": [ + { + "meshpartid": "shape4_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1671", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -1.200001, -1.259999, 0.000000, 1.000000], + "parts": [ + { + "meshpartid": "shape5_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1672", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -4.800001, -1.259997, 0.000000, 1.000000], + "parts": [ + { + "meshpartid": "shape6_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1673", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -6.000000, -1.259996, -0.000202, 1.000000], + "parts": [ + { + "meshpartid": "shape7_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1674", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -3.600001, -1.259998, 0.000000, 1.000000], + "parts": [ + { + "meshpartid": "shape8_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1675", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -4.800001, -1.259997, -0.000202, 1.000000], + "parts": [ + { + "meshpartid": "shape9_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1676", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -2.400001, -1.259998, 0.000000, 1.000000], + "parts": [ + { + "meshpartid": "shape10_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1677", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -3.600001, -1.259998, -0.000202, 1.000000], + "parts": [ + { + "meshpartid": "shape11_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1678", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -6.000000, -1.259996, 0.000000, 1.000000], + "parts": [ + { + "meshpartid": "shape12_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + }, + { + "id": "OBJp1679", + "skeleton": false, + "transform": [ 1.000000, -0.000000, 0.000000, 0.000000, 0.000000, 1.000000, -0.000000, 0.000000, 0.000000, -0.000000, 1.000000, 0.000000, -7.200001, -1.259995, -0.000202, 1.000000], + "parts": [ + { + "meshpartid": "shape13_part1", + "materialid": "takeda", + "uvMapping": [[ 0]] + } + ] + } + ] + } + ] + } + ], + "animations": [ + { + "id": "Take 001", + "length": 1.000000, + "bones": [ + { + "boneId": "OBJp1668", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [ 0.000001, -1.260000, -0.000000] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, -0.000000, 0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, -0.000000, 0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, -0.000000, 0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, -0.000000, 0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, -0.000000, 0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, -0.000000, 0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, -0.000000, 0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, -0.000000, 0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, -0.000000, 0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, -0.000000, 0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, -0.000000, 0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, -0.000000, 0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, -0.000000, 0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, -0.000000, 0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, -0.000000, 0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, -0.000000, 0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, -0.000000, 0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, -0.000000, 0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, -0.000000, 0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, -0.000000, 0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, -0.000000, 0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, -0.000000, 0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, -0.000000, 0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, -0.000000, 0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, -0.000000, 0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, -0.000000, 0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, -0.000000, 0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, -0.000000, 0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [ 0.000001, -1.260000, -0.000000] + } + ] + }, + { + "boneId": "OBJp1669", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-1.200001, -1.260000, -0.000202] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, 0.000000, -0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, 0.000000, -0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, 0.000000, -0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, 0.000000, -0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, 0.000000, -0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, 0.000000, -0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, 0.000000, -0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, 0.000000, -0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, 0.000000, -0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, 0.000000, -0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, 0.000000, -0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, 0.000000, -0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, 0.000000, -0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, 0.000000, -0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, 0.000000, -0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, 0.000000, -0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, 0.000000, -0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, 0.000000, -0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, 0.000000, -0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, 0.000000, -0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, 0.000000, -0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, 0.000000, -0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, 0.000000, -0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, 0.000000, -0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, 0.000000, -0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, 0.000000, -0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, 0.000000, -0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, 0.000000, -0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-1.200001, -1.260000, -0.000202] + } + ] + }, + { + "boneId": "OBJp1670", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-2.400001, -1.259999, -0.000202] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, 0.000000, -0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, 0.000000, -0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, 0.000000, -0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, 0.000000, -0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, 0.000000, -0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, 0.000000, -0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, 0.000000, -0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, 0.000000, -0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, 0.000000, -0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, 0.000000, -0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, 0.000000, -0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, 0.000000, -0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, 0.000000, -0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, 0.000000, -0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, 0.000000, -0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, 0.000000, -0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, 0.000000, -0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, 0.000000, -0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, 0.000000, -0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, 0.000000, -0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, 0.000000, -0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, 0.000000, -0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, 0.000000, -0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, 0.000000, -0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, 0.000000, -0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, 0.000000, -0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, 0.000000, -0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, 0.000000, -0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-2.400001, -1.259999, -0.000202] + } + ] + }, + { + "boneId": "OBJp1671", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-1.200001, -1.259999, 0.000000] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, -0.000000, 0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, -0.000000, 0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, -0.000000, 0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, -0.000000, 0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, -0.000000, 0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, -0.000000, 0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, -0.000000, 0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, -0.000000, 0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, -0.000000, 0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, -0.000000, 0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, -0.000000, 0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, -0.000000, 0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, -0.000000, 0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, -0.000000, 0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, -0.000000, 0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, -0.000000, 0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, -0.000000, 0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, -0.000000, 0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, -0.000000, 0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, -0.000000, 0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, -0.000000, 0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, -0.000000, 0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, -0.000000, 0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, -0.000000, 0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, -0.000000, 0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, -0.000000, 0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, -0.000000, 0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, -0.000000, 0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-1.200001, -1.259999, 0.000000] + } + ] + }, + { + "boneId": "OBJp1672", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-4.800001, -1.259997, 0.000000] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, -0.000000, 0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, -0.000000, 0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, -0.000000, 0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, -0.000000, 0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, -0.000000, 0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, -0.000000, 0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, -0.000000, 0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, -0.000000, 0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, -0.000000, 0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, -0.000000, 0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, -0.000000, 0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, -0.000000, 0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, -0.000000, 0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, -0.000000, 0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, -0.000000, 0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, -0.000000, 0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, -0.000000, 0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, -0.000000, 0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, -0.000000, 0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, -0.000000, 0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, -0.000000, 0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, -0.000000, 0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, -0.000000, 0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, -0.000000, 0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, -0.000000, 0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, -0.000000, 0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, -0.000000, 0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, -0.000000, 0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-4.800001, -1.259997, 0.000000] + } + ] + }, + { + "boneId": "OBJp1673", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-6.000000, -1.259996, -0.000202] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, 0.000000, -0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, 0.000000, -0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, 0.000000, -0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, 0.000000, -0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, 0.000000, -0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, 0.000000, -0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, 0.000000, -0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, 0.000000, -0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, 0.000000, -0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, 0.000000, -0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, 0.000000, -0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, 0.000000, -0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, 0.000000, -0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, 0.000000, -0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, 0.000000, -0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, 0.000000, -0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, 0.000000, -0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, 0.000000, -0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, 0.000000, -0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, 0.000000, -0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, 0.000000, -0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, 0.000000, -0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, 0.000000, -0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, 0.000000, -0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, 0.000000, -0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, 0.000000, -0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, 0.000000, -0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, 0.000000, -0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-6.000000, -1.259996, -0.000202] + } + ] + }, + { + "boneId": "OBJp1674", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-3.600001, -1.259998, 0.000000] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, -0.000000, 0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, -0.000000, 0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, -0.000000, 0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, -0.000000, 0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, -0.000000, 0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, -0.000000, 0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, -0.000000, 0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, -0.000000, 0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, -0.000000, 0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, -0.000000, 0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, -0.000000, 0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, -0.000000, 0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, -0.000000, 0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, -0.000000, 0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, -0.000000, 0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, -0.000000, 0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, -0.000000, 0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, -0.000000, 0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, -0.000000, 0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, -0.000000, 0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, -0.000000, 0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, -0.000000, 0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, -0.000000, 0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, -0.000000, 0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, -0.000000, 0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, -0.000000, 0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, -0.000000, 0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, -0.000000, 0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-3.600001, -1.259998, 0.000000] + } + ] + }, + { + "boneId": "OBJp1675", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-4.800001, -1.259997, -0.000202] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, 0.000000, -0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, 0.000000, -0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, 0.000000, -0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, 0.000000, -0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, 0.000000, -0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, 0.000000, -0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, 0.000000, -0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, 0.000000, -0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, 0.000000, -0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, 0.000000, -0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, 0.000000, -0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, 0.000000, -0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, 0.000000, -0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, 0.000000, -0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, 0.000000, -0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, 0.000000, -0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, 0.000000, -0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, 0.000000, -0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, 0.000000, -0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, 0.000000, -0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, 0.000000, -0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, 0.000000, -0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, 0.000000, -0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, 0.000000, -0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, 0.000000, -0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, 0.000000, -0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, 0.000000, -0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, 0.000000, -0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-4.800001, -1.259997, -0.000202] + } + ] + }, + { + "boneId": "OBJp1676", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-2.400001, -1.259998, 0.000000] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, -0.000000, 0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, -0.000000, 0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, -0.000000, 0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, -0.000000, 0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, -0.000000, 0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, -0.000000, 0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, -0.000000, 0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, -0.000000, 0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, -0.000000, 0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, -0.000000, 0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, -0.000000, 0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, -0.000000, 0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, -0.000000, 0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, -0.000000, 0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, -0.000000, 0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, -0.000000, 0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, -0.000000, 0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, -0.000000, 0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, -0.000000, 0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, -0.000000, 0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, -0.000000, 0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, -0.000000, 0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, -0.000000, 0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, -0.000000, 0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, -0.000000, 0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, -0.000000, 0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, -0.000000, 0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, -0.000000, 0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-2.400001, -1.259998, 0.000000] + } + ] + }, + { + "boneId": "OBJp1677", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-3.600001, -1.259998, -0.000202] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, 0.000000, -0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, 0.000000, -0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, 0.000000, -0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, 0.000000, -0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, 0.000000, -0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, 0.000000, -0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, 0.000000, -0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, 0.000000, -0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, 0.000000, -0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, 0.000000, -0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, 0.000000, -0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, 0.000000, -0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, 0.000000, -0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, 0.000000, -0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, 0.000000, -0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, 0.000000, -0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, 0.000000, -0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, 0.000000, -0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, 0.000000, -0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, 0.000000, -0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, 0.000000, -0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, 0.000000, -0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, 0.000000, -0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, 0.000000, -0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, 0.000000, -0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, 0.000000, -0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, 0.000000, -0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, 0.000000, -0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-3.600001, -1.259998, -0.000202] + } + ] + }, + { + "boneId": "OBJp1678", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-6.000000, -1.259996, 0.000000] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, -0.000000, 0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, -0.000000, 0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, -0.000000, 0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, -0.000000, 0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, -0.000000, 0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, -0.000000, 0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, -0.000000, 0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, -0.000000, 0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, -0.000000, 0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, -0.000000, 0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, -0.000000, 0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, -0.000000, 0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, -0.000000, 0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, -0.000000, 0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, -0.000000, 0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, -0.000000, 0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, -0.000000, 0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, -0.000000, 0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, -0.000000, 0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, -0.000000, 0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, -0.000000, 0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, -0.000000, 0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, -0.000000, 0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, -0.000000, 0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, -0.000000, 0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, -0.000000, 0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, -0.000000, 0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, -0.000000, 0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-6.000000, -1.259996, 0.000000] + } + ] + }, + { + "boneId": "OBJp1679", + "keyframes": [ + { + "keytime": 0.000000, + "rotation": [-0.000000, -0.000000, -0.000000, 1.000000], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-7.200001, -1.259995, -0.000202] + }, + { + "keytime": 0.033333, + "rotation": [-0.000000, 0.000000, -0.068988, 0.997617] + }, + { + "keytime": 0.066667, + "rotation": [-0.000000, 0.000000, -0.140141, 0.990132] + }, + { + "keytime": 0.100000, + "rotation": [-0.000000, 0.000000, -0.212711, 0.977115] + }, + { + "keytime": 0.133333, + "rotation": [-0.000000, 0.000000, -0.279649, 0.960102] + }, + { + "keytime": 0.166667, + "rotation": [-0.000000, 0.000000, -0.340590, 0.940212] + }, + { + "keytime": 0.200000, + "rotation": [-0.000000, 0.000000, -0.393921, 0.919144] + }, + { + "keytime": 0.233333, + "rotation": [-0.000000, 0.000000, -0.394439, 0.918922] + }, + { + "keytime": 0.266667, + "rotation": [-0.000000, 0.000000, -0.366638, 0.930364] + }, + { + "keytime": 0.300000, + "rotation": [-0.000000, 0.000000, -0.383033, 0.923735] + }, + { + "keytime": 0.333333, + "rotation": [-0.000000, 0.000000, -0.383630, 0.923487] + }, + { + "keytime": 0.366667, + "rotation": [-0.000000, 0.000000, -0.384106, 0.923289] + }, + { + "keytime": 0.400000, + "rotation": [-0.000000, 0.000000, -0.384481, 0.923133] + }, + { + "keytime": 0.433333, + "rotation": [-0.000000, 0.000000, -0.384742, 0.923024] + }, + { + "keytime": 0.466667, + "rotation": [-0.000000, 0.000000, -0.384912, 0.922953] + }, + { + "keytime": 0.500000, + "rotation": [-0.000000, 0.000000, -0.385001, 0.922916] + }, + { + "keytime": 0.533333, + "rotation": [-0.000000, 0.000000, -0.385013, 0.922911] + }, + { + "keytime": 0.566667, + "rotation": [-0.000000, 0.000000, -0.384962, 0.922933] + }, + { + "keytime": 0.600000, + "rotation": [-0.000000, 0.000000, -0.384851, 0.922979] + }, + { + "keytime": 0.633333, + "rotation": [-0.000000, 0.000000, -0.384699, 0.923042] + }, + { + "keytime": 0.666667, + "rotation": [-0.000000, 0.000000, -0.384510, 0.923121] + }, + { + "keytime": 0.700000, + "rotation": [-0.000000, 0.000000, -0.384295, 0.923210] + }, + { + "keytime": 0.800000, + "rotation": [-0.000000, 0.000000, -0.383575, 0.923510] + }, + { + "keytime": 0.833333, + "rotation": [-0.000000, 0.000000, -0.383340, 0.923607] + }, + { + "keytime": 0.866667, + "rotation": [-0.000000, 0.000000, -0.383131, 0.923694] + }, + { + "keytime": 0.900000, + "rotation": [-0.000000, 0.000000, -0.382952, 0.923768] + }, + { + "keytime": 0.933333, + "rotation": [-0.000000, 0.000000, -0.382808, 0.923828] + }, + { + "keytime": 0.966667, + "rotation": [-0.000000, 0.000000, -0.382717, 0.923865] + }, + { + "keytime": 1.000000, + "rotation": [-0.000000, 0.000000, -0.382684, 0.923879], + "scale": [ 1.000000, 1.000000, 1.000000], + "translation": [-7.200001, -1.259995, -0.000202] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/cpp-tests/Resources/Images/bugs/bug15594.jpg b/tests/cpp-tests/Resources/Images/bugs/bug15594.jpg new file mode 100755 index 0000000000000000000000000000000000000000..cf1a559bc29c2ebcb4e11bd4b8480eaa5fa1d0a5 GIT binary patch literal 431856 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

21!3y>7n|W^-Wpz^X`Q3{4|C7*ppcrq z>t{_b^9XK@-xhKF14}**%U}rNaVZZ1=-c@Ll?Rji3THhPT%9FflEyk_z9iPvqPOmF z&FDV$uJ8Z#LdKHvR0s7FMqNdU#fq_X;jz@?B#412M{UaLa{7hq?a$Rv zPtK&C;E<=?{4u1Z-P+SCa)0T!-kq!*;nxMUehs&PW?^CV!$EFdzrw@kB8ycQ zLwWY89`2P`(6liQngNG8Y&lDJBsT009iaVcn+BAe)Vbx)(^a4{JLqNoIO_=rXN6d% ziVKY;7-Ib5VY7JGdpV)*ELA|-E=Wm?JzCh%)UG1Zuoh(Ns%<+|5vxM;STTayP?%jR z$trPa`T}266V!OyBF@Ilj4Lv8bLBVM@>F!k&KzZW&3Er4g55k1_7iMY4)1;(cVn<* ziGig>&mB~Xm3;8^gKf<%%_^byIqknr+Mj+lap@epy2LFCm|}~iZQT`esz-Gr6Iou> zlnh>vzDc;fiT+!jlD4fVS1%3;uEd&~*P0Q77xw=a+4r#DLoFqpJsz6~p{|BNJ8hl& z>t|?rq`CTK-yB1fvXE`X>!EIPI3;?;Ap@0k_xaWRcl5R+PMfLewU16_$>|M8_Skc4`4R-(q)GFsHn@{J-3ND_U*&t>Iht)z?~VCS_s}?G|)a$z?&>rJ9oOf zu&Rn(zhIn46HLmr`)3arY;e-9G1mT*fWjDD*ncOWc}tfYzbzB!JkWK#!n!dl~qU*u|#PCaK{WPoBK8oq#d{L@`?nASnkh!q)y-7L4FJ?a+WT|5<8_`pcj>DMEu zedr}-iOjtpdo=bx*MDC(0NOx79y!T>BR0u%W3?kzX~Al$H1}#hHo4NjI%Ded-mc^= zp0yt*tvFv>>e*L|b@`lB3lnIL@$7maLgnqozAKl=2+l={rxwjouZlk((DmXSvfps` zupfWtae&Xb%jCK6-yF~nPmzI8LC8mJdUrO$i**~wOj0{H7mp^6eWyRVe07la$o?yxY*& zUGLWemGkeIwg(n;G<*V|>A22ZX|#{Oii=Spd|V~aXbs({#QG@O`B^Q#*u4E;Q4&zs z=-h^!i`~X!!p0vp8T5$w0MmeItSXc&1g^3@BbKU?7QA`@JzTj-X(6Q&RR!T!zrLOr z`Yo2u2=9Fm&is5})h1Eu2?2$q#=_7r>O21AVsed6P4%Gcgy;(lp&K1aq4#uOv2UpGZ*M@kFX`8!Egv+aYvSTj%8>;Ya$Q7`=y zqCYR&DrFN**-yK&ywEIfi*86B-2?OkVKn?3f*gZ-xo4iSg!QRV_b(Gf}_lJ2mZU1fpnYPXvJw9(XnS%8SpPS<|; zt6humC{c`&u;2!Du(6<7%(=xW|Hk_u5m68JIIxMih`xD#;JM%Iz}(0AY{CU%ca8_s znDL77ol!|iejNlBV?W9GR>;2Yr+ANq$v8U&+q@%DL8;2qTWo{JC#>ymmAGnLyCEIg z5>DLm|H}H=+iBk%PVC1u&=!Gf0INauJ(Z)zUcRZ0BSWef z=H>g3uj-uS7g@Ud@>aA+PW4YnGJ*Q1@Cl_DorKk_f5FmDG`f4=cgM?98fBYuG1k}h z*?xyR>g`2RjLHJ}w{ML?4L>TJdf101Z7~>ok(X#!0Tm7)RJ+rSl8|{WUpm}_iaXbi zr2KkkdcCr`%0xi=R~#(y1m}-^CZUpiXT|$>zfFOlL-jkj1(D^t(U<16A5lx9;6x1W zh)T@L3WcIvoo@d21kTeTW}m!%Z|=Tut2MEFd1?3cEe6q;^eLUx?QcYZB;`agBxeJg zZAUPJC(2Aa*)VpnMo04{yU>WzDl#!fvTbsiYo^xuMmEa=F(F3`$t z2Cb7c?^m%~a)o~@MiR=9Ep7F6hz>BpSBSFX6ThZbp7(gf-lTRhT568%0DF_7M*<-e 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

)Sjn0dHvOA{hIEre?jM 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%0AZ2h|k9lGmTf|uK%#H?s{hM0ikR^w{`ciP3D*V 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 Date: Wed, 25 May 2016 15:18:57 +0100 Subject: [PATCH 172/241] English grammar corrections. Make brackets consistent. --- .../Classes/AppDelegate.cpp | 17 ++++++++--------- .../runtime-src/Classes/AppDelegate.cpp | 2 +- .../runtime-src/Classes/AppDelegate.cpp | 9 ++++----- .../runtime-src/Classes/AppDelegate.cpp | 11 +++++------ .../runtime-src/proj.win32/SimulatorWin.cpp | 3 +-- tests/cpp-empty-test/Classes/AppDelegate.cpp | 10 ++++++---- tests/cpp-tests/Classes/AppDelegate.cpp | 9 ++++----- .../Classes/AppDelegate.cpp | 8 +++++--- .../project/Classes/AppDelegate.cpp | 2 +- .../js-tests/project/Classes/AppDelegate.cpp | 2 +- .../project/Classes/AppDelegate.cpp | 2 +- .../project/Classes/AppDelegate.cpp | 2 +- .../lua-tests/project/Classes/AppDelegate.cpp | 2 +- .../performance-tests/Classes/AppDelegate.cpp | 19 ++++++++++--------- .../runtime-src/Classes/AppDelegate.cpp | 9 ++++----- .../runtime-src/proj.win32/SimulatorWin.cpp | 3 +-- .../lib/platform/win32/SimulatorWin.cpp | 3 +-- 17 files changed, 55 insertions(+), 58 deletions(-) diff --git a/templates/cpp-template-default/Classes/AppDelegate.cpp b/templates/cpp-template-default/Classes/AppDelegate.cpp index f86118e788fc..eaa57d94e025 100644 --- a/templates/cpp-template-default/Classes/AppDelegate.cpp +++ b/templates/cpp-template-default/Classes/AppDelegate.cpp @@ -8,26 +8,25 @@ static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320); static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768); static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536); -AppDelegate::AppDelegate() { - +AppDelegate::AppDelegate() +{ } AppDelegate::~AppDelegate() { } -//if you want a different context,just modify the value of glContextAttrs -//it will takes effect on all platforms +// if you want a different context, modify the value of glContextAttrs +// it will affect all platforms void AppDelegate::initGLContextAttrs() { - //set OpenGL context attributions,now can only set six attributions: - //red,green,blue,alpha,depth,stencil + // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); } -// If you want to use packages manager to install more packages, +// if you want to use the package manager to install more packages, // don't modify or remove this function static int register_all_packages() { @@ -83,11 +82,11 @@ bool AppDelegate::applicationDidFinishLaunching() { return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stopAnimation(); - // if you use SimpleAudioEngine, it must be pause + // if you use SimpleAudioEngine, it must be paused // SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); } diff --git a/templates/js-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp b/templates/js-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp index 940376784ec5..caee6b69d088 100644 --- a/templates/js-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp +++ b/templates/js-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp @@ -162,7 +162,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { auto director = Director::getInstance(); diff --git a/templates/js-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp b/templates/js-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp index ee5d9e4159f0..0b5ae2230c1a 100644 --- a/templates/js-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp +++ b/templates/js-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp @@ -30,12 +30,11 @@ AppDelegate::~AppDelegate() #endif } -//if you want a different context,just modify the value of glContextAttrs -//it will takes effect on all platforms +// if you want a different context, modify the value of glContextAttrs +// it will affect all platforms void AppDelegate::initGLContextAttrs() { - //set OpenGL context attributions,now can only set six attributions: - //red,green,blue,alpha,depth,stencil + // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); @@ -83,7 +82,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { auto director = Director::getInstance(); diff --git a/templates/lua-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp b/templates/lua-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp index f4714c0558e8..dd319d45de28 100644 --- a/templates/lua-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp +++ b/templates/lua-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp @@ -33,18 +33,17 @@ AppDelegate::~AppDelegate() } -//if you want a different context,just modify the value of glContextAttrs -//it will takes effect on all platforms +// if you want a different context, modify the value of glContextAttrs +// it will affect all platforms void AppDelegate::initGLContextAttrs() { - //set OpenGL context attributions,now can only set six attributions: - //red,green,blue,alpha,depth,stencil + // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); } -// If you want to use packages manager to install more packages, +// if you want to use the package manager to install more packages, // don't modify or remove this function static int register_all_packages() { @@ -86,7 +85,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stopAnimation(); diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.win32/SimulatorWin.cpp b/templates/lua-template-default/frameworks/runtime-src/proj.win32/SimulatorWin.cpp index de51cb1c00d8..169850a6ace2 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.win32/SimulatorWin.cpp +++ b/templates/lua-template-default/frameworks/runtime-src/proj.win32/SimulatorWin.cpp @@ -100,8 +100,7 @@ std::string getCurAppPath(void) static void initGLContextAttrs() { - //set OpenGL context attributions,now can only set six attributions: - //red,green,blue,alpha,depth,stencil + // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); diff --git a/tests/cpp-empty-test/Classes/AppDelegate.cpp b/tests/cpp-empty-test/Classes/AppDelegate.cpp index fac8be7f7b45..e452501b392e 100644 --- a/tests/cpp-empty-test/Classes/AppDelegate.cpp +++ b/tests/cpp-empty-test/Classes/AppDelegate.cpp @@ -27,7 +27,8 @@ void AppDelegate::initGLContextAttrs() GLView::setGLContextAttrs(glContextAttrs); } -bool AppDelegate::applicationDidFinishLaunching() { +bool AppDelegate::applicationDidFinishLaunching() +{ // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); @@ -106,11 +107,12 @@ bool AppDelegate::applicationDidFinishLaunching() { return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too -void AppDelegate::applicationDidEnterBackground() { +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. +void AppDelegate::applicationDidEnterBackground() +{ Director::getInstance()->stopAnimation(); - // if you use SimpleAudioEngine, it must be pause + // if you use SimpleAudioEngine, it must be paused // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); } diff --git a/tests/cpp-tests/Classes/AppDelegate.cpp b/tests/cpp-tests/Classes/AppDelegate.cpp index 90d188a0ef6c..b64a66ebde40 100644 --- a/tests/cpp-tests/Classes/AppDelegate.cpp +++ b/tests/cpp-tests/Classes/AppDelegate.cpp @@ -43,12 +43,11 @@ AppDelegate::~AppDelegate() cocostudio::ArmatureDataManager::destroyInstance(); } -//if you want a different context,just modify the value of glContextAttrs -//it will takes effect on all platforms +// if you want a different context, modify the value of glContextAttrs +// it will affect all platforms void AppDelegate::initGLContextAttrs() { - //set OpenGL context attributions,now can only set six attributions: - //red,green,blue,alpha,depth,stencil + // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); @@ -109,7 +108,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { if (_testController) diff --git a/tests/game-controller-test/Classes/AppDelegate.cpp b/tests/game-controller-test/Classes/AppDelegate.cpp index 682d42b14010..3f69fb639e8b 100644 --- a/tests/game-controller-test/Classes/AppDelegate.cpp +++ b/tests/game-controller-test/Classes/AppDelegate.cpp @@ -17,7 +17,8 @@ AppDelegate::~AppDelegate() { } -bool AppDelegate::applicationDidFinishLaunching() { +bool AppDelegate::applicationDidFinishLaunching() +{ auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { @@ -64,8 +65,9 @@ bool AppDelegate::applicationDidFinishLaunching() { return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too -void AppDelegate::applicationDidEnterBackground() { +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. +void AppDelegate::applicationDidEnterBackground() +{ Director::getInstance()->stopAnimation(); } diff --git a/tests/js-memory-gc-tests/project/Classes/AppDelegate.cpp b/tests/js-memory-gc-tests/project/Classes/AppDelegate.cpp index a42034d89d29..dcae1544ab59 100644 --- a/tests/js-memory-gc-tests/project/Classes/AppDelegate.cpp +++ b/tests/js-memory-gc-tests/project/Classes/AppDelegate.cpp @@ -164,7 +164,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { auto director = Director::getInstance(); diff --git a/tests/js-tests/project/Classes/AppDelegate.cpp b/tests/js-tests/project/Classes/AppDelegate.cpp index 85d18de4322b..59ce5addc6cd 100644 --- a/tests/js-tests/project/Classes/AppDelegate.cpp +++ b/tests/js-tests/project/Classes/AppDelegate.cpp @@ -165,7 +165,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { auto director = Director::getInstance(); diff --git a/tests/lua-empty-test/project/Classes/AppDelegate.cpp b/tests/lua-empty-test/project/Classes/AppDelegate.cpp index a77f33e0444c..652b6ba4d26b 100644 --- a/tests/lua-empty-test/project/Classes/AppDelegate.cpp +++ b/tests/lua-empty-test/project/Classes/AppDelegate.cpp @@ -42,7 +42,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stopAnimation(); diff --git a/tests/lua-game-controller-test/project/Classes/AppDelegate.cpp b/tests/lua-game-controller-test/project/Classes/AppDelegate.cpp index f89bc0fa3f5a..026754311cd1 100644 --- a/tests/lua-game-controller-test/project/Classes/AppDelegate.cpp +++ b/tests/lua-game-controller-test/project/Classes/AppDelegate.cpp @@ -43,7 +43,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stopAnimation(); diff --git a/tests/lua-tests/project/Classes/AppDelegate.cpp b/tests/lua-tests/project/Classes/AppDelegate.cpp index fdbd1795df7a..600abed3494a 100644 --- a/tests/lua-tests/project/Classes/AppDelegate.cpp +++ b/tests/lua-tests/project/Classes/AppDelegate.cpp @@ -56,7 +56,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stopAnimation(); diff --git a/tests/performance-tests/Classes/AppDelegate.cpp b/tests/performance-tests/Classes/AppDelegate.cpp index 3725a360cc12..43ae410038ec 100644 --- a/tests/performance-tests/Classes/AppDelegate.cpp +++ b/tests/performance-tests/Classes/AppDelegate.cpp @@ -16,25 +16,25 @@ AppDelegate::~AppDelegate() { } -//if you want a different context,just modify the value of glContextAttrs -//it will takes effect on all platforms +// if you want a different context, modify the value of glContextAttrs +// it will affect all platforms void AppDelegate::initGLContextAttrs() { - //set OpenGL context attributions,now can only set six attributions: - //red,green,blue,alpha,depth,stencil + // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); } -// If you want to use packages manager to install more packages, +// if you want to use the package manager to install more packages, // don't modify or remove this function static int register_all_packages() { return 0; //flag for packages manager } -bool AppDelegate::applicationDidFinishLaunching() { +bool AppDelegate::applicationDidFinishLaunching() +{ // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); @@ -79,11 +79,12 @@ bool AppDelegate::applicationDidFinishLaunching() { return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too -void AppDelegate::applicationDidEnterBackground() { +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. +void AppDelegate::applicationDidEnterBackground() +{ Director::getInstance()->stopAnimation(); - // if you use SimpleAudioEngine, it must be pause + // if you use SimpleAudioEngine, it must be paused // SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); } diff --git a/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.cpp b/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.cpp index 0e61c50fd88c..30ec05c0ee96 100644 --- a/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.cpp +++ b/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.cpp @@ -30,12 +30,11 @@ AppDelegate::~AppDelegate() RuntimeEngine::getInstance()->end(); } -//if you want a different context,just modify the value of glContextAttrs -//it will takes effect on all platforms +// if you want a different context, modify the value of glContextAttrs +// it will affect all platforms void AppDelegate::initGLContextAttrs() { - //set OpenGL context attributions,now can only set six attributions: - //red,green,blue,alpha,depth,stencil + // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); @@ -65,7 +64,7 @@ bool AppDelegate::applicationDidFinishLaunching() return true; } -// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked. void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stopAnimation(); diff --git a/tools/simulator/frameworks/runtime-src/proj.win32/SimulatorWin.cpp b/tools/simulator/frameworks/runtime-src/proj.win32/SimulatorWin.cpp index adc0d77bd618..e105f658cb8f 100644 --- a/tools/simulator/frameworks/runtime-src/proj.win32/SimulatorWin.cpp +++ b/tools/simulator/frameworks/runtime-src/proj.win32/SimulatorWin.cpp @@ -116,8 +116,7 @@ static bool stringEndWith(const std::string str, const std::string needle) static void initGLContextAttrs() { - //set OpenGL context attributions,now can only set six attributions: - //red,green,blue,alpha,depth,stencil + // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); diff --git a/tools/simulator/libsimulator/lib/platform/win32/SimulatorWin.cpp b/tools/simulator/libsimulator/lib/platform/win32/SimulatorWin.cpp index 0734e58527c8..58b3914a7621 100644 --- a/tools/simulator/libsimulator/lib/platform/win32/SimulatorWin.cpp +++ b/tools/simulator/libsimulator/lib/platform/win32/SimulatorWin.cpp @@ -88,8 +88,7 @@ std::string getCurAppPath(void) static void initGLContextAttrs() { - //set OpenGL context attributions,now can only set six attributions: - //red,green,blue,alpha,depth,stencil + // set OpenGL context attributes: red,green,blue,alpha,depth,stencil GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; GLView::setGLContextAttrs(glContextAttrs); From 93ed59bfb3f27632c663e72cf2bc7c640597cab4 Mon Sep 17 00:00:00 2001 From: BQ Date: Wed, 25 May 2016 15:25:38 +0100 Subject: [PATCH 173/241] English grammar corrections. --- templates/cpp-template-default/Classes/AppDelegate.h | 6 +++--- .../frameworks/runtime-src/Classes/AppDelegate.h | 6 +++--- .../frameworks/runtime-src/Classes/AppDelegate.h | 6 +++--- .../frameworks/runtime-src/Classes/AppDelegate.h | 6 +++--- tests/cpp-empty-test/Classes/AppDelegate.h | 6 +++--- tests/cpp-tests/Classes/AppDelegate.h | 6 +++--- tests/game-controller-test/Classes/AppDelegate.h | 6 +++--- tests/js-memory-gc-tests/project/Classes/AppDelegate.h | 6 +++--- tests/js-tests/project/Classes/AppDelegate.h | 6 +++--- tests/lua-empty-test/project/Classes/AppDelegate.h | 6 +++--- .../lua-game-controller-test/project/Classes/AppDelegate.h | 6 +++--- tests/lua-tests/project/Classes/AppDelegate.h | 6 +++--- tests/performance-tests/Classes/AppDelegate.h | 6 +++--- .../simulator/frameworks/runtime-src/Classes/AppDelegate.h | 6 +++--- 14 files changed, 42 insertions(+), 42 deletions(-) diff --git a/templates/cpp-template-default/Classes/AppDelegate.h b/templates/cpp-template-default/Classes/AppDelegate.h index 625506cc0d1e..562ccbd96129 100644 --- a/templates/cpp-template-default/Classes/AppDelegate.h +++ b/templates/cpp-template-default/Classes/AppDelegate.h @@ -6,7 +6,7 @@ /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -24,13 +24,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/templates/js-template-default/frameworks/runtime-src/Classes/AppDelegate.h b/templates/js-template-default/frameworks/runtime-src/Classes/AppDelegate.h index fc614c95af71..d1c0058e44f1 100644 --- a/templates/js-template-default/frameworks/runtime-src/Classes/AppDelegate.h +++ b/templates/js-template-default/frameworks/runtime-src/Classes/AppDelegate.h @@ -13,7 +13,7 @@ /** @brief The cocos2d Application. - The reason for implement as private inheritance is to hide some interface call by Director. + Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -31,13 +31,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/templates/js-template-runtime/frameworks/runtime-src/Classes/AppDelegate.h b/templates/js-template-runtime/frameworks/runtime-src/Classes/AppDelegate.h index a17ef826444c..2240c8f9711c 100644 --- a/templates/js-template-runtime/frameworks/runtime-src/Classes/AppDelegate.h +++ b/templates/js-template-runtime/frameworks/runtime-src/Classes/AppDelegate.h @@ -13,7 +13,7 @@ /** @brief The cocos2d Application. - The reason for implement as private inheritance is to hide some interface call by Director. + Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -31,13 +31,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/templates/lua-template-default/frameworks/runtime-src/Classes/AppDelegate.h b/templates/lua-template-default/frameworks/runtime-src/Classes/AppDelegate.h index a2699dc754a1..27c4301c3777 100644 --- a/templates/lua-template-default/frameworks/runtime-src/Classes/AppDelegate.h +++ b/templates/lua-template-default/frameworks/runtime-src/Classes/AppDelegate.h @@ -6,7 +6,7 @@ /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -24,13 +24,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/tests/cpp-empty-test/Classes/AppDelegate.h b/tests/cpp-empty-test/Classes/AppDelegate.h index 4d5b8b0d31c8..3baf6511f8bc 100644 --- a/tests/cpp-empty-test/Classes/AppDelegate.h +++ b/tests/cpp-empty-test/Classes/AppDelegate.h @@ -6,7 +6,7 @@ /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -24,13 +24,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/tests/cpp-tests/Classes/AppDelegate.h b/tests/cpp-tests/Classes/AppDelegate.h index ad41b84e01ad..e218281707a4 100644 --- a/tests/cpp-tests/Classes/AppDelegate.h +++ b/tests/cpp-tests/Classes/AppDelegate.h @@ -32,7 +32,7 @@ class TestController; /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -50,13 +50,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/tests/game-controller-test/Classes/AppDelegate.h b/tests/game-controller-test/Classes/AppDelegate.h index 18ee8aeb6310..794f10a20ad3 100644 --- a/tests/game-controller-test/Classes/AppDelegate.h +++ b/tests/game-controller-test/Classes/AppDelegate.h @@ -6,7 +6,7 @@ /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -22,13 +22,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/tests/js-memory-gc-tests/project/Classes/AppDelegate.h b/tests/js-memory-gc-tests/project/Classes/AppDelegate.h index aabb7fa2f4ba..1291b190261f 100644 --- a/tests/js-memory-gc-tests/project/Classes/AppDelegate.h +++ b/tests/js-memory-gc-tests/project/Classes/AppDelegate.h @@ -5,7 +5,7 @@ /** @brief The cocos2d Application. - The reason for implement as private inheritance is to hide some interface call by Director. + Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -23,13 +23,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching() override; /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground() override; /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground() override; diff --git a/tests/js-tests/project/Classes/AppDelegate.h b/tests/js-tests/project/Classes/AppDelegate.h index aabb7fa2f4ba..1291b190261f 100644 --- a/tests/js-tests/project/Classes/AppDelegate.h +++ b/tests/js-tests/project/Classes/AppDelegate.h @@ -5,7 +5,7 @@ /** @brief The cocos2d Application. - The reason for implement as private inheritance is to hide some interface call by Director. + Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -23,13 +23,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching() override; /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground() override; /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground() override; diff --git a/tests/lua-empty-test/project/Classes/AppDelegate.h b/tests/lua-empty-test/project/Classes/AppDelegate.h index 1d6b04789846..124096f7dd31 100644 --- a/tests/lua-empty-test/project/Classes/AppDelegate.h +++ b/tests/lua-empty-test/project/Classes/AppDelegate.h @@ -6,7 +6,7 @@ /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -23,13 +23,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/tests/lua-game-controller-test/project/Classes/AppDelegate.h b/tests/lua-game-controller-test/project/Classes/AppDelegate.h index 01b5e6da2f04..767981465a7f 100644 --- a/tests/lua-game-controller-test/project/Classes/AppDelegate.h +++ b/tests/lua-game-controller-test/project/Classes/AppDelegate.h @@ -6,7 +6,7 @@ /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -22,13 +22,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/tests/lua-tests/project/Classes/AppDelegate.h b/tests/lua-tests/project/Classes/AppDelegate.h index f8fbbdbb3915..2c1a5b57202a 100644 --- a/tests/lua-tests/project/Classes/AppDelegate.h +++ b/tests/lua-tests/project/Classes/AppDelegate.h @@ -6,7 +6,7 @@ /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -23,13 +23,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/tests/performance-tests/Classes/AppDelegate.h b/tests/performance-tests/Classes/AppDelegate.h index 625506cc0d1e..562ccbd96129 100644 --- a/tests/performance-tests/Classes/AppDelegate.h +++ b/tests/performance-tests/Classes/AppDelegate.h @@ -6,7 +6,7 @@ /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -24,13 +24,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); diff --git a/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.h b/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.h index a2699dc754a1..27c4301c3777 100755 --- a/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.h +++ b/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.h @@ -6,7 +6,7 @@ /** @brief The cocos2d Application. -The reason for implement as private inheritance is to hide some interface call by Director. +Private inheritance here hides part of interface from Director. */ class AppDelegate : private cocos2d::Application { @@ -24,13 +24,13 @@ class AppDelegate : private cocos2d::Application virtual bool applicationDidFinishLaunching(); /** - @brief The function be called when the application enter background + @brief Called when the application moves to the background @param the pointer of the application */ virtual void applicationDidEnterBackground(); /** - @brief The function be called when the application enter foreground + @brief Called when the application reenters the foreground @param the pointer of the application */ virtual void applicationWillEnterForeground(); From ea6a6a8586657c56563059db0f336d778bffd187 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 25 May 2016 23:57:40 +0800 Subject: [PATCH 174/241] Reverse include path in network module and update web engine --- cocos/network/HttpClient-apple.mm | 2 +- cocos/network/HttpCookie.cpp | 4 ++-- cocos/network/SocketIO.cpp | 6 +++--- cocos/network/WebSocket.cpp | 2 +- web | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cocos/network/HttpClient-apple.mm b/cocos/network/HttpClient-apple.mm index 184316bd2fa4..2dc16e1a7d36 100644 --- a/cocos/network/HttpClient-apple.mm +++ b/cocos/network/HttpClient-apple.mm @@ -27,7 +27,7 @@ of this software and associated documentation files (the "Software"), to deal #include "platform/CCPlatformConfig.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) -#include "HttpClient.h" +#include "network/HttpClient.h" #include #include diff --git a/cocos/network/HttpCookie.cpp b/cocos/network/HttpCookie.cpp index e41ee5c71ceb..3c8b60704c05 100644 --- a/cocos/network/HttpCookie.cpp +++ b/cocos/network/HttpCookie.cpp @@ -22,8 +22,8 @@ THE SOFTWARE. ****************************************************************************/ -#include "HttpCookie.h" -#include "CCFileUtils.h" +#include "network/HttpCookie.h" +#include "platform/CCFileUtils.h" #include #include diff --git a/cocos/network/SocketIO.cpp b/cocos/network/SocketIO.cpp index 9f465b10240d..04c655d9fae3 100644 --- a/cocos/network/SocketIO.cpp +++ b/cocos/network/SocketIO.cpp @@ -27,14 +27,14 @@ ****************************************************************************/ -#include "SocketIO.h" +#include "network/SocketIO.h" #include #include #include #include "base/CCDirector.h" #include "base/CCScheduler.h" -#include "WebSocket.h" -#include "HttpClient.h" +#include "network/WebSocket.h" +#include "network/HttpClient.h" #include "json/rapidjson.h" #include "json/document.h" diff --git a/cocos/network/WebSocket.cpp b/cocos/network/WebSocket.cpp index 4871bdf871d8..257b00e0d7ff 100644 --- a/cocos/network/WebSocket.cpp +++ b/cocos/network/WebSocket.cpp @@ -27,7 +27,7 @@ ****************************************************************************/ -#include "WebSocket.h" +#include "network/WebSocket.h" #include "base/CCDirector.h" #include "base/CCScheduler.h" #include "base/CCEventDispatcher.h" diff --git a/web b/web index 29e12e52e4d8..5ab968aff4dc 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 29e12e52e4d8f47aa5a256967613b353fbbb424d +Subproject commit 5ab968aff4dc8518cb13a6c8b7f31439852a2c49 From 26781ee592784e58936ad54d36ebadfb6762b295 Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Wed, 25 May 2016 10:14:09 -0700 Subject: [PATCH 175/241] fixed array overrun in triangulate() --- cocos/2d/CCAutoPolygon.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/cocos/2d/CCAutoPolygon.cpp b/cocos/2d/CCAutoPolygon.cpp index 315bdc12ae91..28f8fa99e602 100644 --- a/cocos/2d/CCAutoPolygon.cpp +++ b/cocos/2d/CCAutoPolygon.cpp @@ -575,12 +575,14 @@ TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector& po cdt.Triangulate(); std::vector tris = cdt.GetTriangles(); - V3F_C4B_T2F* verts= new (std::nothrow) V3F_C4B_T2F[points.size()]; - unsigned short* indices = new (std::nothrow) unsigned short[tris.size()*3]; + // we won't know the size of verts and indices until we process all of the triangles! + std::vector verts; + std::vector indices; + unsigned short idx = 0; unsigned short vdx = 0; - for(std::vector::const_iterator ite = tris.begin(); ite < tris.end(); ite++) + for(std::vector::const_iterator ite = tris.begin(); ite != tris.end(); ite++) { for(int i = 0; i < 3; i++) { @@ -600,7 +602,7 @@ TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector& po if(found) { //if we found the same vertex, don't add to verts, but use the same vertex with indices - indices[idx] = j; + indices.push_back(j); idx++; } else @@ -609,8 +611,8 @@ TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector& po auto c4b = Color4B::WHITE; auto t2f = Tex2F(0,0); // don't worry about tex coords now, we calculate that later V3F_C4B_T2F vert = {v3,c4b,t2f}; - verts[vdx] = vert; - indices[idx] = vdx; + verts.push_back(vert); + indices.push_back(vdx); idx++; vdx++; } @@ -620,7 +622,17 @@ TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector& po { delete j; }; - TrianglesCommand::Triangles triangles = {verts, indices, vdx, idx}; + + // now that we know the size of verts and indices we can create the buffers + V3F_C4B_T2F* vertsBuf = new (std::nothrow) V3F_C4B_T2F[verts.size()]; + memcpy(vertsBuf, verts.data(), verts.size() * sizeof(V3F_C4B_T2F)); + + unsigned short* indicesBuf = new (std::nothrow) unsigned short[indices.size()]; + memcpy(indicesBuf, indices.data(), indices.size() * sizeof(short)); + + // Triangles should really use std::vector and not arrays for verts and indices. + // Then the above memcpy would not be necessary + TrianglesCommand::Triangles triangles = { vertsBuf, indicesBuf, verts.size(), indices.size() }; return triangles; } From f6bee1abc27b7540203abe7671d2777ff22a074a Mon Sep 17 00:00:00 2001 From: mogemimi Date: Thu, 26 May 2016 02:36:15 +0900 Subject: [PATCH 176/241] Fix minor typo: Texure -> Texture --- cocos/renderer/CCGLProgramCache.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cocos/renderer/CCGLProgramCache.cpp b/cocos/renderer/CCGLProgramCache.cpp index e8f9a98554d4..287e25180eb3 100644 --- a/cocos/renderer/CCGLProgramCache.cpp +++ b/cocos/renderer/CCGLProgramCache.cpp @@ -49,7 +49,7 @@ enum { kShaderType_PositionTexture_uColor, kShaderType_PositionTextureA8Color, kShaderType_Position_uColor, - kShaderType_PositionLengthTexureColor, + kShaderType_PositionLengthTextureColor, kShaderType_LabelDistanceFieldNormal, kShaderType_LabelDistanceFieldGlow, kShaderType_UIGrayScale, @@ -202,7 +202,7 @@ void GLProgramCache::loadDefaultGLPrograms() // Position, Length(TexCoords, Color (used by Draw Node basically ) // p = new (std::nothrow) GLProgram(); - loadDefaultGLProgram(p, kShaderType_PositionLengthTexureColor); + loadDefaultGLProgram(p, kShaderType_PositionLengthTextureColor); _programs.insert( std::make_pair(GLProgram::SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR, p) ); p = new (std::nothrow) GLProgram(); @@ -352,7 +352,7 @@ void GLProgramCache::reloadDefaultGLPrograms() // p = getGLProgram(GLProgram::SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR); p->reset(); - loadDefaultGLProgram(p, kShaderType_PositionLengthTexureColor); + loadDefaultGLProgram(p, kShaderType_PositionLengthTextureColor); p = getGLProgram(GLProgram::SHADER_NAME_LABEL_DISTANCEFIELD_NORMAL); p->reset(); @@ -487,7 +487,7 @@ void GLProgramCache::loadDefaultGLProgram(GLProgram *p, int type) p->initWithByteArrays(ccPosition_uColor_vert, ccPosition_uColor_frag); p->bindAttribLocation("aVertex", GLProgram::VERTEX_ATTRIB_POSITION); break; - case kShaderType_PositionLengthTexureColor: + case kShaderType_PositionLengthTextureColor: p->initWithByteArrays(ccPositionColorLengthTexture_vert, ccPositionColorLengthTexture_frag); break; case kShaderType_LabelDistanceFieldNormal: From 906967c53a519367b9db56da78cf366be261fa59 Mon Sep 17 00:00:00 2001 From: Ricardo Quesada Date: Wed, 25 May 2016 20:00:48 -0300 Subject: [PATCH 177/241] fix: make it compile on iOS and Mac --- cocos/2d/CCAutoPolygon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/2d/CCAutoPolygon.cpp b/cocos/2d/CCAutoPolygon.cpp index 28f8fa99e602..bea7bd57b53f 100644 --- a/cocos/2d/CCAutoPolygon.cpp +++ b/cocos/2d/CCAutoPolygon.cpp @@ -632,7 +632,7 @@ TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector& po // Triangles should really use std::vector and not arrays for verts and indices. // Then the above memcpy would not be necessary - TrianglesCommand::Triangles triangles = { vertsBuf, indicesBuf, verts.size(), indices.size() }; + TrianglesCommand::Triangles triangles = { vertsBuf, indicesBuf, static_cast(verts.size()), static_cast(indices.size()) }; return triangles; } From 785d02a81853076ac26111e2d1cb15d1cfdcf144 Mon Sep 17 00:00:00 2001 From: urokuta Date: Thu, 26 May 2016 09:34:18 +0900 Subject: [PATCH 178/241] #9367 blend mode does not work with animated sprite --- cocos/2d/CCActionInterval.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index 758981b252f4..4d54187f94b3 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -2501,7 +2501,9 @@ void Animate::stop() { if (_animation->getRestoreOriginalFrame() && _target) { + auto blend = static_cast(_target)->getBlendFunc(); static_cast(_target)->setSpriteFrame(_origFrame); + static_cast(_target)->setBlendFunc(blend); } ActionInterval::stop(); @@ -2536,10 +2538,12 @@ void Animate::update(float t) if( splitTime <= t ) { + auto blend = static_cast(_target)->getBlendFunc(); _currFrameIndex = i; AnimationFrame* frame = frames.at(_currFrameIndex); frameToDisplay = frame->getSpriteFrame(); static_cast(_target)->setSpriteFrame(frameToDisplay); + static_cast(_target)->setBlendFunc(blend); const ValueMap& dict = frame->getUserInfo(); if ( !dict.empty() ) From 072592d6e34753fbfa6301164a5c1ad6cfb85316 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 26 May 2016 10:18:45 +0800 Subject: [PATCH 179/241] update version --- cocos/cocos2d.cpp | 2 +- cocos/cocos2d.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/cocos2d.cpp b/cocos/cocos2d.cpp index 46d042001077..02c8f1b20fd5 100644 --- a/cocos/cocos2d.cpp +++ b/cocos/cocos2d.cpp @@ -31,7 +31,7 @@ NS_CC_BEGIN CC_DLL const char* cocos2dVersion() { - return "cocos2d-x-3.11"; + return "cocos2d-x-3.11.1"; } NS_CC_END diff --git a/cocos/cocos2d.h b/cocos/cocos2d.h index 86e664bd14f5..f6de97f05704 100644 --- a/cocos/cocos2d.h +++ b/cocos/cocos2d.h @@ -30,7 +30,7 @@ THE SOFTWARE. // 0x00 HI ME LO // 00 03 08 00 -#define COCOS2D_VERSION 0x00031100 +#define COCOS2D_VERSION 0x00031101 // // all cocos2d include files From 1285954cd98867b9d27ea9e43350f41cfcff5a1c Mon Sep 17 00:00:00 2001 From: James Chen Date: Thu, 26 May 2016 10:25:45 +0800 Subject: [PATCH 180/241] Try catch IllegalStateException in Cocos2dxMusic.java. --- .../src/org/cocos2dx/lib/Cocos2dxMusic.java | 77 +++++++++++-------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxMusic.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxMusic.java index 8d45f12a344b..c0df028bf8c6 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxMusic.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxMusic.java @@ -29,9 +29,6 @@ of this software and associated documentation files (the "Software"), to deal import android.content.res.AssetFileDescriptor; import android.media.MediaPlayer; import android.util.Log; -import android.content.res.AssetFileDescriptor; -import com.android.vending.expansion.zipfile.APKExpansionSupport; -import com.android.vending.expansion.zipfile.ZipResourceFile; import java.io.FileInputStream; @@ -86,7 +83,7 @@ public void preloadBackgroundMusic(final String path) { this.mBackgroundMediaPlayer.release(); } - this.mBackgroundMediaPlayer = this.createMediaplayer(path); + this.mBackgroundMediaPlayer = this.createMediaPlayer(path); // record the path this.mCurrentPath = path; @@ -96,7 +93,7 @@ public void preloadBackgroundMusic(final String path) { public void playBackgroundMusic(final String path, final boolean isLoop) { if (mCurrentPath == null) { // it is the first time to play background music or end() was called - mBackgroundMediaPlayer = createMediaplayer(path); + mBackgroundMediaPlayer = createMediaPlayer(path); mCurrentPath = path; } else { if (!mCurrentPath.equals(path)) { @@ -106,7 +103,7 @@ public void playBackgroundMusic(final String path, final boolean isLoop) { if (mBackgroundMediaPlayer != null) { mBackgroundMediaPlayer.release(); } - mBackgroundMediaPlayer = createMediaplayer(path); + mBackgroundMediaPlayer = createMediaPlayer(path); // record the path mCurrentPath = path; @@ -138,7 +135,7 @@ public void playBackgroundMusic(final String path, final boolean isLoop) { public void stopBackgroundMusic() { if (this.mBackgroundMediaPlayer != null) { mBackgroundMediaPlayer.release(); - mBackgroundMediaPlayer = createMediaplayer(mCurrentPath); + mBackgroundMediaPlayer = createMediaPlayer(mCurrentPath); /** * should set the state, if not, the following sequence will be error @@ -149,18 +146,26 @@ public void stopBackgroundMusic() { } public void pauseBackgroundMusic() { - if (this.mBackgroundMediaPlayer != null && this.mBackgroundMediaPlayer.isPlaying()) { - this.mBackgroundMediaPlayer.pause(); - this.mPaused = true; - this.mManualPaused = true; + try { + if (this.mBackgroundMediaPlayer != null && this.mBackgroundMediaPlayer.isPlaying()) { + this.mBackgroundMediaPlayer.pause(); + this.mPaused = true; + this.mManualPaused = true; + } + } catch (IllegalStateException e) { + Log.e(TAG, "pauseBackgroundMusic, IllegalStateException was triggered!"); } } public void resumeBackgroundMusic() { - if (this.mBackgroundMediaPlayer != null && this.mPaused) { - this.mBackgroundMediaPlayer.start(); - this.mPaused = false; - this.mManualPaused = false; + try { + if (this.mBackgroundMediaPlayer != null && this.mPaused) { + this.mBackgroundMediaPlayer.start(); + this.mPaused = false; + this.mManualPaused = false; + } + } catch (IllegalStateException e) { + Log.e(TAG, "resumeBackgroundMusic, IllegalStateException was triggered!"); } } @@ -172,11 +177,14 @@ public void rewindBackgroundMusic() { public boolean isBackgroundMusicPlaying() { boolean ret = false; - - if (this.mBackgroundMediaPlayer == null) { - ret = false; - } else { - ret = this.mBackgroundMediaPlayer.isPlaying(); + try { + if (this.mBackgroundMediaPlayer == null) { + ret = false; + } else { + ret = this.mBackgroundMediaPlayer.isPlaying(); + } + } catch (IllegalStateException e) { + Log.e(TAG, "isBackgroundMusicPlaying, IllegalStateException was triggered!"); } return ret; @@ -214,18 +222,26 @@ public void setBackgroundVolume(float volume) { } public void onEnterBackground(){ - if (this.mBackgroundMediaPlayer != null && this.mBackgroundMediaPlayer.isPlaying()) { - this.mBackgroundMediaPlayer.pause(); - this.mPaused = true; + try { + if (this.mBackgroundMediaPlayer != null && this.mBackgroundMediaPlayer.isPlaying()) { + this.mBackgroundMediaPlayer.pause(); + this.mPaused = true; + } + } catch (IllegalStateException e) { + Log.e(TAG, "onEnterBackground, IllegalStateException was triggered!"); } } public void onEnterForeground(){ - if(!this.mManualPaused){ - if (this.mBackgroundMediaPlayer != null && this.mPaused) { - this.mBackgroundMediaPlayer.start(); - this.mPaused = false; + try { + if (!this.mManualPaused) { + if (this.mBackgroundMediaPlayer != null && this.mPaused) { + this.mBackgroundMediaPlayer.start(); + this.mPaused = false; + } } + } catch (IllegalStateException e) { + Log.e(TAG, "onEnterForeground, IllegalStateException was triggered!"); } } @@ -238,13 +254,12 @@ private void initData() { } /** - * create mediaplayer for music + * create MediaPlayer for music * - * @param pPath - * the pPath relative to assets + * @param path The path relative to assets * @return */ - private MediaPlayer createMediaplayer(final String path) { + private MediaPlayer createMediaPlayer(final String path) { MediaPlayer mediaPlayer = new MediaPlayer(); try { From 8564dbd921271fd1cfb4510eda9b690d53beccb3 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 26 May 2016 10:34:35 +0800 Subject: [PATCH 181/241] update changelog --- CHANGELOG | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index e2b9912bf965..439f6a7708b8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +cocos2d-x-3.11.1 May 27 2016 + +[HIGHLIGHT] Supports IPv6-only network + +[FIX] Fix `cocos gen-libs` compiling issue + cocos2d-x-3.11 May 11 2016 [HIGHLIGHT] Physics: upgrade chipmunk to v7.0.1 From b69127127a35fa40b15c127e7e2e12772ed2dd43 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 26 May 2016 10:34:52 +0800 Subject: [PATCH 182/241] update release note --- docs/RELEASE_NOTES.md | 82 +++++----------------------------------- docs/RELEASE_NOTES_CN.md | 68 ++------------------------------- 2 files changed, 14 insertions(+), 136 deletions(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 8fea5876bb4a..9f55bfe0945c 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -2,7 +2,7 @@ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* -- [Cocos2d-x 3.11 Release Notes](#cocos2d-x-311-release-notes) +- [Cocos2d-x 3.11.1 Release Notes](#cocos2d-x-3111-release-notes) - [Misc Information](#misc-information) - [Requirements](#requirements) - [Runtime Requirements](#runtime-requirements) @@ -14,18 +14,15 @@ - [Windows](#windows) - [Linux](#linux) - [How to start a new game](#how-to-start-a-new-game) -- [v3.11](#v311) +- [v3.11.1](#v3111) - [Highlights features](#highlights-features) - - [The main features in detail of Cocos2d-x v3.11](#the-main-features-in-detail-of-cocos2d-x-v311) - - [New memory model in JSB](#new-memory-model-in-jsb) - - [OpenSSL](#openssl) - - [Cocos2d-x JSB program debugging](#cocos2d-x-jsb-program-debugging) - - [New WebGL renderer](#new-webgl-renderer) + - [The main features in detail of Cocos2d-x v3.11.1](#the-main-features-in-detail-of-cocos2d-x-v3111) + - [support IPv6-only network](#support-ipv6-only-network) - [Other changes](#other-changes) -# Cocos2d-x 3.11 Release Notes # +# Cocos2d-x 3.11.1 Release Notes # # Misc Information @@ -149,76 +146,17 @@ Use the __cocos__ console app to create a new game: cocos new -l cpp|js|lua MyNewGame ``` -# v3.11 +# v3.11.1 ## Highlights features -* upgrade Chipmunk to v7.0.1 -* use new memory model in JSB, don't have to invoke `retain/release` in JS, it is disabled by default -* upgrade Curl to v7.48 -* upgrade OpenSSL to 1.0.2g -* can use VSCode and new Firefox to debug cocos2d-x JSB programs -* refactor WebGL renderer +* support IPv6-only network -## The main features in detail of Cocos2d-x v3.11 -### New memory model in JSB +## The main features in detail of Cocos2d-x v3.11.1 -With new memory model, you don't have to care about object lifecycle. Which means you don't have to invoke `retain/release` in JS any more. - -Though we have finished many tests about this new memory model, we can't make sure it is too perfect to enable it by default. But you are appreciated if you can enable it to have a try. If you want to enable it, you should change the value of `CC_ENABLE_GC_FOR_NATIVE_OBJECTS` to 1 in `base/ccConfig.h` like this: - -```c++ -#ifdef CC_ENABLE_SCRIPT_BINDING - #ifndef CC_ENABLE_GC_FOR_NATIVE_OBJECTS - #define CC_ENABLE_GC_FOR_NATIVE_OBJECTS 1 // change to 1 - #endif -#endif -``` - -### OpenSSL -Cocos2d-x has upgraded __OpenSSL__ to version __1.0.2g__. - -Beginning __July 11, 2016__, Google Play will block publishing of any new apps or updates that use older versions of __OpenSSL__. It is important that you update the use of __OpenSSL__ in your projects. More detail information can refer to [this ticket](http://discuss.cocos2d-x.org/t/openssl-problem-again/28270). - -If you use v2.x or use older versions of v3.x, you can just update __CURL__ and __OpenSSL__. -To do this: - -* modify __Cocos2d-x root/external/config.json__ to update the dependency version. For v3.x the dependency version is `v3-deps-92`, and for v2.x it is `v2-deps-5` -* execute the __download-deps.py__ script in your __Cocos2d-x root__. - -```sh -(jtsm @ 15 ~) $ cd cocos2d-x - -(jtsm @ 15 ~/cocos2d-x) $ ./download-deps.py - -======================================================= -==> Prepare to download external libraries! -==> Ready to download 'v3-deps-92.zip' from 'https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/archive/v3-deps-92.zip' -==> WARNING: Couldnt grab the file size from remote, use 'zip_file_size' section in '/Users/jtsm/Chukong-Inc/cocos2d-x/external/config.json' -==> Start to download, please wait ... -==> Downloading finished! -==> Extracting files, please wait ... -==> Extraction done! ==> Copying files... -==> Cleaning... -``` -Feel free to post on our forums if you run into difficulty. - -### Cocos2d-x JSB program debugging - -In previous version, can not use Firefox 30+ to debug cocos2d-x JSB programs. This limit is fixed since v3.11. And web console feature is added too. [This documentation](http://www.cocos2d-x.org/wiki/Javascript_Remote_Debugging) shows how to use Firefox to debug cocos2d-x JSB programs(this is a little difference from current usage). - -Of course you can use [VSCode](https://code.visualstudio.com/) to debug cocos2d-x JSB programs too. You can read about how to use VSCode to debug cocos2d-x JSB programs [here](http://discuss.cocos2d-x.org/t/use-vscode-to-debug-cocos2d-x-jsb-programs/27588). - -### New WebGL renderer - -In v3.11, we have refactored the WebGL renderer in web engine, here is the detailed changes: - -1. Activate WebGL on Android by default. -2. Add sprite auto batching in WebGL. -3. Shared rendering buffer for Sprites. - -Compare with old version, the draw calls in your game should be significantly reduced if the textures is well managed. This improves also the CPU usage and memory usage. The above is just a first step of WebGL renderer upgrade, we will continue to investigate in this direction in the future versions. +### support IPv6-only network +[Apple required to support IPv6-only Networks](https://developer.apple.com/news/?id=05042016a) since June 1, 2016. And this version supports IPv6-only network. ## Other changes You can also take a look at the [full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG). diff --git a/docs/RELEASE_NOTES_CN.md b/docs/RELEASE_NOTES_CN.md index ee135b043d50..b97b8c990447 100644 --- a/docs/RELEASE_NOTES_CN.md +++ b/docs/RELEASE_NOTES_CN.md @@ -1,72 +1,12 @@ -# v3.11 +# v3.11.1 ## 新特性 -* Chipmunk升级到v7.0.1 -* JSB使用新的内存模型,在JS脚本不需要关心对象的生命周期,该特性默认关闭 -* CURL升级到v7.48 -* OpenSSL升级到v1.0.2g -* 可以使用VSCode或者新版本的Firefox调试JSB程序 -* 全面升级 WebGL 渲染器 +* 支持纯IPv6网络 -## 主要特性的详细介绍 +### 支持纯IPv6网络 -### JSB的新内存模型 - -使用新的内存模型后,开发者不需要关心对象的声明周期。这就意味着不需要在JS代码里手动调用`retain/release`函数。 - -不过该内存模型默认是关闭的。虽然我们已经做了很多的测试,目前没有发现任何问题,但是保险起见,你需要手动开启该功能,开启的方法是在`base/ccConfig.h`里把`CC_ENABLE_GC_FOR_NATIVE`的值改为1: - -```c++ -#ifdef CC_ENABLE_SCRIPT_BINDING - #ifndef CC_ENABLE_GC_FOR_NATIVE_OBJECTS - #define CC_ENABLE_GC_FOR_NATIVE_OBJECTS 1 // change to 1 - #endif -#endif -``` - -### OpenSSL -Cocos2d-x已经把__OpenSSL__升级到__1.0.2.g__。 - -从__2016年7月11__日开始,Google Play将不再接受使用低版本的__OpenSSL__的新应用程序或者应用程序更新。更新程序中使用的__OpenSSL__版本变得十分重要。更详细的信息可以参考[这个帖子](http://discuss.cocos2d-x.org/t/openssl-problem-again/28270)。 - -如果你使用的是v2.x或者低版本的v3.x引擎,那么你可以只更新__CURL__和__OpenSSL__,具体步骤如下: - -* 修改__Cocos2d-x root/external/config.json__文件中的`version`字段。如果是v3.x的话,那么`version`字段的值改为`v3-dpes-92`,如果是v2.x的话,那么值是`v2-deps-5` -* 在Cocos2d-x根目录下执行__download-deps.py__脚本 - -```sh -(jtsm @ 15 ~) $ cd cocos2d-x - -(jtsm @ 15 ~/cocos2d-x) $ ./download-deps.py - -======================================================= -==> Prepare to download external libraries! -==> Ready to download 'v3-deps-92.zip' from 'https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/archive/v3-deps-92.zip' -==> WARNING: Couldnt grab the file size from remote, use 'zip_file_size' section in '/Users/jtsm/Chukong-Inc/cocos2d-x/external/config.json' -==> Start to download, please wait ... -==> Downloading finished! -==> Extracting files, please wait ... -==> Extraction done! ==> Copying files... -==> Cleaning... -``` -有任何问题可以在引擎的[中文论坛](http://forum.cocos.com/)上发帖反馈。 - -### Cocos2d-x JSB程序调试 - -v3.11版本之前,不能使用Firefox 30+版本来调试cocos2d-x JSB程序。这个版本修复了该问题,同时支持了web console功能。如果你不了解如何使用Firefox调试cocos2d-x JSB程序,可以参考[这篇文档](This documentation](http://www.cocos2d-x.org/wiki/Javascript_Remote_Debugging)。 - -当然你也可以使用[VSCode](https://code.visualstudio.com/)来调试,具体的使用方法参考[这篇文档](http://discuss.cocos2d-x.org/t/use-vscode-to-debug-cocos2d-x-jsb-programs/27588)。 - -### 全面升级 WebGL 渲染器 - -在v3.11中,为了提升性能,我们重构了WebGL渲染器,下面是几项重要的改进: - -1. 在 Android 浏览器上默认开启 WebGL(支持的话) -2. WebGL 模式下自动批处理 Sprite -3. Sprite 共享全局的渲染数据缓存,并减少 GL 函数调用 - -在这些优化后,与旧版本相比,合并贴图后的游戏中draw call数量将得到显著的降低。不仅如此,v3.11中的CPU使用率和内存使用也都得到了降低。在我们的bunnymark测试中,v3.11相比之前的版本有4倍以上的渲染性能提升。当然,这是我们对WebGL渲染器做的第一步升级,在后续版本中,WebGL渲染器还将得到持续优化。 +从2016年6月1日开始,苹果要求新发布或者更新的应该必须支持纯IPv6网络。该版本升级了第三方库支持了该特性。 ## 其他改动 更完整的改动列表可以阅读[full changelog](https://github.com/cocos2d/cocos2d-x/blob/v3/CHANGELOG)。 From e17c4c752f66cb4f7963aac975f4c2f3587b7921 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 26 May 2016 10:36:27 +0800 Subject: [PATCH 183/241] update deps --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index 5bf17af67c8c..41f0749df93d 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version":"v3-deps-93", + "version":"v3-deps-94", "zip_file_size":"128440074", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", From 43680e7d7842700c1690c2214e39ad86547eee6a Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 26 May 2016 10:40:15 +0800 Subject: [PATCH 184/241] update web engine --- web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web b/web index 29e12e52e4d8..5ab968aff4dc 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 29e12e52e4d8f47aa5a256967613b353fbbb424d +Subproject commit 5ab968aff4dc8518cb13a6c8b7f31439852a2c49 From 14aa5f5ded85ee9ce83dbd94420acf1a1cd4165f Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 26 May 2016 10:42:26 +0800 Subject: [PATCH 185/241] update binding generator --- tools/bindings-generator | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bindings-generator b/tools/bindings-generator index b8cdfb9d3732..32404751d539 160000 --- a/tools/bindings-generator +++ b/tools/bindings-generator @@ -1 +1 @@ -Subproject commit b8cdfb9d3732ca2cc5dd9609c88ac8294e2d761b +Subproject commit 32404751d5399ccb0cd9df4b72b211506cade321 From 08706012e8733ead13a3b3c62a5b65e16583460b Mon Sep 17 00:00:00 2001 From: zhangbin Date: Thu, 26 May 2016 10:42:56 +0800 Subject: [PATCH 186/241] Update the reference of submodule cocos2d-console. 1. Change the Tracker ID of GA in console. 2. Disable the BI Data Statistic. 3. Add special prefix '2dx-' for the Data uploaded by console in -x engine. --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 4d46da39f8f5..5ccdb9c59b9c 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 4d46da39f8f59390b3f294cf285ca277bc9275f6 +Subproject commit 5ccdb9c59b9c8ce0ba9d6b15d0edb90a90c33559 From aab8ea5094f9ef8d346b21db12003e6d491f7321 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 25 May 2016 18:35:38 +0800 Subject: [PATCH 187/241] Fix android compilation issue with thumb mode --- cocos/editor-support/cocosbuilder/Android.mk | 4 ++++ cocos/editor-support/cocostudio/Android.mk | 4 ++++ cocos/editor-support/spine/Android.mk | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/cocos/editor-support/cocosbuilder/Android.mk b/cocos/editor-support/cocosbuilder/Android.mk index a93f8cf5aa19..0406e4d5781e 100644 --- a/cocos/editor-support/cocosbuilder/Android.mk +++ b/cocos/editor-support/cocosbuilder/Android.mk @@ -5,6 +5,10 @@ LOCAL_MODULE := cocosbuilder_static LOCAL_MODULE_FILENAME := libcocosbuilder +ifeq ($(USE_ARM_MODE),1) +LOCAL_ARM_MODE := arm +endif + LOCAL_SRC_FILES := CCBAnimationManager.cpp \ CCBFileLoader.cpp \ CCBKeyframe.cpp \ diff --git a/cocos/editor-support/cocostudio/Android.mk b/cocos/editor-support/cocostudio/Android.mk index 5a1ed035b6a9..720774bd7e49 100644 --- a/cocos/editor-support/cocostudio/Android.mk +++ b/cocos/editor-support/cocostudio/Android.mk @@ -5,6 +5,10 @@ LOCAL_MODULE := cocostudio_static LOCAL_MODULE_FILENAME := libcocostudio +ifeq ($(USE_ARM_MODE),1) +LOCAL_ARM_MODE := arm +endif + LOCAL_SRC_FILES := CCActionFrame.cpp \ CCActionFrameEasing.cpp \ CCActionManagerEx.cpp \ diff --git a/cocos/editor-support/spine/Android.mk b/cocos/editor-support/spine/Android.mk index cfc8769eb408..f357b68771c9 100644 --- a/cocos/editor-support/spine/Android.mk +++ b/cocos/editor-support/spine/Android.mk @@ -5,6 +5,10 @@ LOCAL_MODULE := spine_static LOCAL_MODULE_FILENAME := libspine +ifeq ($(USE_ARM_MODE),1) +LOCAL_ARM_MODE := arm +endif + LOCAL_SRC_FILES := Animation.c \ AnimationState.c \ AnimationStateData.c \ From 5321a2fc7aea260acdd309b2486527c9c8fe75b7 Mon Sep 17 00:00:00 2001 From: James Chen Date: Thu, 26 May 2016 11:15:44 +0800 Subject: [PATCH 188/241] Removes unused package import for Cocos2dxSound.java. --- .../android/java/src/org/cocos2dx/lib/Cocos2dxSound.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxSound.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxSound.java index abbf2441ccbf..29e0a5d9409d 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxSound.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxSound.java @@ -29,8 +29,6 @@ of this software and associated documentation files (the "Software"), to deal import android.media.SoundPool; import android.util.Log; import android.content.res.AssetFileDescriptor; -import com.android.vending.expansion.zipfile.APKExpansionSupport; -import com.android.vending.expansion.zipfile.ZipResourceFile; import java.util.ArrayList; import java.util.HashMap; From 967f0078c2bf3d0027f0b9034b9a7f05db0e7e82 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 26 May 2016 11:30:48 +0800 Subject: [PATCH 189/241] update console --- tools/cocos2d-console | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 5e5a8f279c5d..5ccdb9c59b9c 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 5e5a8f279c5df0c98cafd27ffb43ce7e4e6a2082 +Subproject commit 5ccdb9c59b9c8ce0ba9d6b15d0edb90a90c33559 From a472ab293101d7feeb3505fb5b430f604ff73221 Mon Sep 17 00:00:00 2001 From: James Chen Date: Thu, 26 May 2016 11:57:57 +0800 Subject: [PATCH 190/241] Make sure closeKeyboard run on UI thread --- .../cocos2dx/lib/Cocos2dxEditBoxHelper.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java index 1651aa27c58c..650ea1329b92 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java @@ -187,7 +187,7 @@ public boolean onKey(View v, int keyCode, KeyEvent event) { (keyCode == KeyEvent.KEYCODE_ENTER)) { //if editbox doesn't support multiline, just hide the keyboard if ((editBox.getInputType() & InputType.TYPE_TEXT_FLAG_MULTI_LINE) != InputType.TYPE_TEXT_FLAG_MULTI_LINE) { - Cocos2dxEditBoxHelper.closeKeyboard(index); + Cocos2dxEditBoxHelper.closeKeyboardOnUiThread(index); mCocos2dxActivity.getGLSurfaceView().requestFocus(); return true; } @@ -201,7 +201,7 @@ public boolean onKey(View v, int keyCode, KeyEvent event) { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { - Cocos2dxEditBoxHelper.closeKeyboard(index); + Cocos2dxEditBoxHelper.closeKeyboardOnUiThread(index); mCocos2dxActivity.getGLSurfaceView().requestFocus(); } return false; @@ -313,7 +313,7 @@ public void run() { Cocos2dxEditBoxHelper.openKeyboard(index); }else{ mCocos2dxActivity.getGLSurfaceView().requestFocus(); - Cocos2dxEditBoxHelper.closeKeyboard(index); + Cocos2dxEditBoxHelper.closeKeyboardOnUiThread(index); } } } @@ -393,7 +393,7 @@ public static void openKeyboard(int index) { } } - public static void closeKeyboard(int index) { + private static void closeKeyboardOnUiThread(int index) { final InputMethodManager imm = (InputMethodManager) mCocos2dxActivity.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); Cocos2dxEditBox editBox = mEditBoxArray.get(index); if (null != editBox) { @@ -401,4 +401,14 @@ public static void closeKeyboard(int index) { mCocos2dxActivity.getGLSurfaceView().setSoftKeyboardShown(false); } } + + // Note that closeKeyboard will be invoked on GL thread + public static void closeKeyboard(final int index) { + mCocos2dxActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + closeKeyboardOnUiThread(index); + } + }); + } } From cf883b5c0f8c77630f0a086daac3c08cba7e6073 Mon Sep 17 00:00:00 2001 From: James Chen Date: Thu, 26 May 2016 12:02:23 +0800 Subject: [PATCH 191/241] UI thread check. --- .../java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java index 650ea1329b92..bc61a28dfbb7 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java @@ -28,6 +28,7 @@ of this software and associated documentation files (the "Software"), to deal import android.content.res.Resources; import android.graphics.Color; import android.graphics.Typeface; +import android.os.Looper; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; @@ -394,6 +395,11 @@ public static void openKeyboard(int index) { } private static void closeKeyboardOnUiThread(int index) { + if (Looper.myLooper() != Looper.getMainLooper()) { + Log.e(TAG, "closeKeyboardOnUiThread doesn't run on UI thread!"); + return; + } + final InputMethodManager imm = (InputMethodManager) mCocos2dxActivity.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); Cocos2dxEditBox editBox = mEditBoxArray.get(index); if (null != editBox) { From d42b99b10b089368526f5d834bce0e2e32bed9c6 Mon Sep 17 00:00:00 2001 From: James Chen Date: Thu, 26 May 2016 15:49:05 +0800 Subject: [PATCH 192/241] fixed java.lang.IndexOutOfBoundsException while invoking toString on GL thread. --- .../src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java index 1651aa27c58c..e749cbedfcd1 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxEditBoxHelper.java @@ -132,14 +132,17 @@ public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override - public void onTextChanged(final CharSequence s, int start, int before, int count) { + public void onTextChanged(CharSequence s, int start, int before, int count) { //The optimization can't be turn on due to unknown keyboard hide in some custom keyboard // mFrameLayout.setEnableForceDoLayout(false); + // Note that we must to copy a string to prevent string content is modified + // on UI thread while 's.toString' is invoked at the same time. + final String text = new String(s.toString()); mCocos2dxActivity.runOnGLThread(new Runnable() { @Override public void run() { - Cocos2dxEditBoxHelper.__editBoxEditingChanged(index, s.toString()); + Cocos2dxEditBoxHelper.__editBoxEditingChanged(index, text); } }); } @@ -168,10 +171,13 @@ public void run() { Log.d(TAG, "edit box get focus"); } else { editBox.setVisibility(View.GONE); + // Note that we must to copy a string to prevent string content is modified + // on UI thread while 's.toString' is invoked at the same time. + final String text = new String(editBox.getText().toString()); mCocos2dxActivity.runOnGLThread(new Runnable() { @Override public void run() { - Cocos2dxEditBoxHelper.__editBoxEditingDidEnd(index, editBox.getText().toString()); + Cocos2dxEditBoxHelper.__editBoxEditingDidEnd(index, text); } }); mFrameLayout.setEnableForceDoLayout(false); From 031e329d643bdd411bc014bffe3c518c580da150 Mon Sep 17 00:00:00 2001 From: minggo Date: Thu, 26 May 2016 16:29:54 +0800 Subject: [PATCH 193/241] fix the bug that will lost message if only received one message --- cocos/scripting/js-bindings/manual/ScriptingCore.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp index d6079c589cd6..9935ced231af 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp @@ -1772,11 +1772,11 @@ void SimpleRunLoop::update(float dt) } g_qMutex.unlock(); - if (messageCount == 0) - break; - if (!message.empty()) ScriptingCore::getInstance()->debugProcessInput(message); + + if (messageCount == 0) + break; } } @@ -1809,11 +1809,11 @@ static bool NS_ProcessNextEvent() } g_qMutex.unlock(); - if (messageCount == 0) - break; - if (!message.empty()) ScriptingCore::getInstance()->debugProcessInput(message); + + if (messageCount == 0) + break; } // std::this_thread::yield(); std::this_thread::sleep_for(std::chrono::milliseconds(10)); From 3e941be0ce505275398b5decba973093104d9d8f Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Thu, 26 May 2016 17:20:51 +0800 Subject: [PATCH 194/241] fix actionNode studio 1.6 parser error --- .../cocostudio/CCActionManagerEx.cpp | 118 +++++++++--------- .../cocostudio/CCActionManagerEx.h | 5 +- .../cocostudio/CCActionNode.cpp | 8 +- .../cocostudio/jsb_cocos2dx_studio_manual.cpp | 9 +- .../script/studio/jsb_studio_boot.js | 6 +- .../script/studio/parsers/uiParser-1.x.js | 6 +- 6 files changed, 85 insertions(+), 67 deletions(-) diff --git a/cocos/editor-support/cocostudio/CCActionManagerEx.cpp b/cocos/editor-support/cocostudio/CCActionManagerEx.cpp index f36a9d303042..d359a12043cc 100644 --- a/cocos/editor-support/cocostudio/CCActionManagerEx.cpp +++ b/cocos/editor-support/cocostudio/CCActionManagerEx.cpp @@ -33,10 +33,10 @@ static ActionManagerEx* sharedActionManager = nullptr; ActionManagerEx* ActionManagerEx::getInstance() { - if (!sharedActionManager) { - sharedActionManager = new (std::nothrow) ActionManagerEx(); - } - return sharedActionManager; + if (!sharedActionManager) { + sharedActionManager = new (std::nothrow) ActionManagerEx(); + } + return sharedActionManager; } void ActionManagerEx::destroyInstance() @@ -55,30 +55,31 @@ ActionManagerEx::ActionManagerEx() ActionManagerEx::~ActionManagerEx() { - _actionDic.clear(); + _actionDic.clear(); } -void ActionManagerEx::initWithDictionary(const char* jsonName,const rapidjson::Value &dic, Ref* root) +void ActionManagerEx::initWithDictionary(const char* jsonName,const rapidjson::Value &dic, Ref* root, int version) { - std::string path = jsonName; - ssize_t pos = path.find_last_of("/"); - std::string fileName = path.substr(pos+1,path.length()); - cocos2d::Vector actionList; - int actionCount = DICTOOL->getArrayCount_json(dic, "actionlist"); - for (int i=0; iautorelease(); - const rapidjson::Value &actionDic = DICTOOL->getDictionaryFromArray_json(dic, "actionlist", i); - action->initWithDictionary(actionDic,root); - actionList.pushBack(action); - } - _actionDic[fileName] = actionList; + std::string path = jsonName; + this->_studioVersionNumber = version; + ssize_t pos = path.find_last_of("/"); + std::string fileName = path.substr(pos+1,path.length()); + cocos2d::Vector actionList; + int actionCount = DICTOOL->getArrayCount_json(dic, "actionlist"); + for (int i=0; iautorelease(); + const rapidjson::Value &actionDic = DICTOOL->getDictionaryFromArray_json(dic, "actionlist", i); + action->initWithDictionary(actionDic,root); + actionList.pushBack(action); + } + _actionDic[fileName] = actionList; } void ActionManagerEx::initWithBinary(const char* file, cocos2d::Ref *root, CocoLoader* cocoLoader, - stExpCocoNode* pCocoNode) + stExpCocoNode* pCocoNode) { std::string path = file; ssize_t pos = path.find_last_of("/"); @@ -113,54 +114,54 @@ void ActionManagerEx::initWithDictionary(const char* jsonName,const rapidjson::V ActionObject* ActionManagerEx::getActionByName(const char* jsonName,const char* actionName) { - std::string path = jsonName; - ssize_t pos = path.find_last_of("/"); - std::string fileName = path.substr(pos+1,path.length()); - auto iterator = _actionDic.find(fileName); - if (iterator == _actionDic.end()) - { - return nullptr; - } - auto actionList = iterator->second; - for (int i = 0; i < actionList.size(); i++) - { - ActionObject* action = actionList.at(i); - if (strcmp(actionName, action->getName()) == 0) - { - return action; - } - } - return nullptr; + std::string path = jsonName; + ssize_t pos = path.find_last_of("/"); + std::string fileName = path.substr(pos+1,path.length()); + auto iterator = _actionDic.find(fileName); + if (iterator == _actionDic.end()) + { + return nullptr; + } + auto actionList = iterator->second; + for (int i = 0; i < actionList.size(); i++) + { + ActionObject* action = actionList.at(i); + if (strcmp(actionName, action->getName()) == 0) + { + return action; + } + } + return nullptr; } ActionObject* ActionManagerEx::playActionByName(const char* jsonName,const char* actionName) { - ActionObject* action = getActionByName(jsonName,actionName); - if (action) - { - action->play(); - } - return action; + ActionObject* action = getActionByName(jsonName,actionName); + if (action) + { + action->play(); + } + return action; } ActionObject* ActionManagerEx::playActionByName(const char* jsonName,const char* actionName, CallFunc* func) { - ActionObject* action = getActionByName(jsonName,actionName); - if (action) - { - action->play(func); - } - return action; + ActionObject* action = getActionByName(jsonName,actionName); + if (action) + { + action->play(func); + } + return action; } ActionObject* ActionManagerEx::stopActionByName(const char* jsonName,const char* actionName) { - ActionObject* action = getActionByName(jsonName,actionName); - if (action) - { - action->stop(); - } - return action; + ActionObject* action = getActionByName(jsonName,actionName); + if (action) + { + action->stop(); + } + return action; } void ActionManagerEx::releaseActions() @@ -182,4 +183,9 @@ void ActionManagerEx::releaseActions() _actionDic.clear(); } +int ActionManagerEx::getStudioVersionNumber() const +{ + return this->_studioVersionNumber; +} + } diff --git a/cocos/editor-support/cocostudio/CCActionManagerEx.h b/cocos/editor-support/cocostudio/CCActionManagerEx.h index eec3ba75cd26..31a3ba6ad46d 100644 --- a/cocos/editor-support/cocostudio/CCActionManagerEx.h +++ b/cocos/editor-support/cocostudio/CCActionManagerEx.h @@ -110,7 +110,7 @@ class CC_STUDIO_DLL ActionManagerEx:public cocos2d::Ref ActionObject* stopActionByName(const char* jsonName,const char* actionName); /*init properties with json dictionary*/ - void initWithDictionary(const char* jsonName,const rapidjson::Value &dic, Ref* root); + void initWithDictionary(const char* jsonName,const rapidjson::Value &dic, Ref* root, int version = 0); void initWithBinary(const char* file, Ref* root, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); /** @@ -119,8 +119,11 @@ class CC_STUDIO_DLL ActionManagerEx:public cocos2d::Ref */ void releaseActions(); + int getStudioVersionNumber() const; + protected: std::unordered_map> _actionDic; + int _studioVersionNumber; }; } diff --git a/cocos/editor-support/cocostudio/CCActionNode.cpp b/cocos/editor-support/cocostudio/CCActionNode.cpp index 9000018a6532..8b789ee86aed 100644 --- a/cocos/editor-support/cocostudio/CCActionNode.cpp +++ b/cocos/editor-support/cocostudio/CCActionNode.cpp @@ -29,6 +29,8 @@ THE SOFTWARE. #include "ui/UILayout.h" #include "editor-support/cocostudio/CocoLoader.h" #include "base/ccUtils.h" +#include "cocostudio/CCActionManagerEx.h" + using namespace cocos2d; using namespace ui; @@ -107,7 +109,7 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) { float positionX = DICTOOL->getFloatValue_json(actionFrameDic, "positionx"); float positionY = DICTOOL->getFloatValue_json(actionFrameDic, "positiony"); - if (positionOffset && (nullptr != node->getParent())) + if (positionOffset && (nullptr != node->getParent()) && ActionManagerEx::getInstance()->getStudioVersionNumber() < 1600) { Vec2 AnchorPointIn = node->getParent()->getAnchorPointInPoints(); positionX += AnchorPointIn.x; @@ -136,7 +138,7 @@ void ActionNode::initWithDictionary(const rapidjson::Value& dic, Ref* root) actionFrame->setScaleY(scaleY); auto cActionArray = _frameArray.at((int)kKeyframeScale); cActionArray->pushBack(actionFrame); - actionFrame->release(); + actionFrame->release(); } bool existRotation = DICTOOL->checkObjectExist_json(actionFrameDic,"rotation"); @@ -637,7 +639,7 @@ void ActionNode::easingToFrame(float duration,float delayTime,ActionFrame* srcFr if (cAction == nullptr || cNode == nullptr) { return; - } + } cAction->startWithTarget(cNode); cAction->update(delayTime); } diff --git a/cocos/scripting/js-bindings/manual/cocostudio/jsb_cocos2dx_studio_manual.cpp b/cocos/scripting/js-bindings/manual/cocostudio/jsb_cocos2dx_studio_manual.cpp index 8ce870784fb3..572bfe310bc6 100644 --- a/cocos/scripting/js-bindings/manual/cocostudio/jsb_cocos2dx_studio_manual.cpp +++ b/cocos/scripting/js-bindings/manual/cocostudio/jsb_cocos2dx_studio_manual.cpp @@ -251,7 +251,12 @@ static bool js_cocos2dx_studio_ActionManagerEx_initWithDictionaryEx(JSContext *c js_proxy_t *proxy = jsb_get_js_proxy(obj); cocostudio::ActionManagerEx* cobj = (cocostudio::ActionManagerEx *)(proxy ? proxy->ptr : NULL); JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_studio_ActionManagerEx_initWithDictionaryEx : Invalid Native Object"); - if (argc == 3) { + + int version = 0; + if (argc == 4) { + ok &= jsval_to_int(cx, args.get(3), &version); + } + if (argc >= 3) { const char* arg0; const char* arg1; cocos2d::Ref* arg2; @@ -271,7 +276,7 @@ static bool js_cocos2dx_studio_ActionManagerEx_initWithDictionaryEx(JSContext *c JSB_PRECONDITION2( arg2, cx, false, "Invalid Native Object"); } while (0); JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_studio_ActionManagerEx_initWithDictionaryEx : Error processing arguments"); - cobj->initWithDictionary(arg0, arg1Jsondoc, arg2); + cobj->initWithDictionary(arg0, arg1Jsondoc, arg2, version); args.rval().setUndefined(); return true; } diff --git a/cocos/scripting/js-bindings/script/studio/jsb_studio_boot.js b/cocos/scripting/js-bindings/script/studio/jsb_studio_boot.js index e64312fc7efd..88f4b6aa415b 100644 --- a/cocos/scripting/js-bindings/script/studio/jsb_studio_boot.js +++ b/cocos/scripting/js-bindings/script/studio/jsb_studio_boot.js @@ -40,8 +40,8 @@ ccs.actionManager = ccs.ActionManager.getInstance(); ccs.ActionManager.prototype.clear = function() { this.releaseActions(); }; -ccs.ActionManager.prototype.initWithDictionary = function(file, dic, node) { - ccs.actionManager.initWithDictionaryEx(file, JSON.stringify(dic), node); +ccs.ActionManager.prototype.initWithDictionary = function(file, dic, node, version) { + ccs.actionManager.initWithDictionaryEx(file, JSON.stringify(dic), node, version); } /** @@ -70,4 +70,4 @@ ccs.Component.extend = ccs.Component.extend || cc.Component.extend; ccs.SkinNode = cc.Node; ccs.BoneNode.extend = cc.Class.extend; -ccs.SkeletonNode.extend = cc.Class.extend; \ No newline at end of file +ccs.SkeletonNode.extend = cc.Class.extend; diff --git a/cocos/scripting/js-bindings/script/studio/parsers/uiParser-1.x.js b/cocos/scripting/js-bindings/script/studio/parsers/uiParser-1.x.js index 4f88976592d1..c11d51c67c1e 100644 --- a/cocos/scripting/js-bindings/script/studio/parsers/uiParser-1.x.js +++ b/cocos/scripting/js-bindings/script/studio/parsers/uiParser-1.x.js @@ -39,7 +39,9 @@ deferred: function(json, resourcePath, node, file){ if(node){ - ccs.actionManager.initWithDictionary(file, json["animation"], node); + var version = json["Version"] || json["version"]; + var versionNum = ccs.uiReader.getVersionInteger(version); + ccs.actionManager.initWithDictionary(file, json["animation"], node, versionNum); node.setContentSize(cc.size(json["designWidth"], json["designHeight"])); } } @@ -702,4 +704,4 @@ load.registerParser("ccui", "*", parser); -})(ccs._load, ccs._parser); \ No newline at end of file +})(ccs._load, ccs._parser); From b317588e6ee058cac8d555b96be99b6318e7bb38 Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Thu, 26 May 2016 17:25:03 +0800 Subject: [PATCH 195/241] fix include path --- cocos/editor-support/cocostudio/CCActionNode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/editor-support/cocostudio/CCActionNode.cpp b/cocos/editor-support/cocostudio/CCActionNode.cpp index 8b789ee86aed..0970a9db1eaf 100644 --- a/cocos/editor-support/cocostudio/CCActionNode.cpp +++ b/cocos/editor-support/cocostudio/CCActionNode.cpp @@ -29,7 +29,7 @@ THE SOFTWARE. #include "ui/UILayout.h" #include "editor-support/cocostudio/CocoLoader.h" #include "base/ccUtils.h" -#include "cocostudio/CCActionManagerEx.h" +#include "editor-support/cocostudio/CCActionManagerEx.h" using namespace cocos2d; From 24767221373d84f5f9b753abcdad00a1abb24b85 Mon Sep 17 00:00:00 2001 From: zilongshanren Date: Thu, 26 May 2016 17:33:44 +0800 Subject: [PATCH 196/241] fix default value of studio version --- cocos/editor-support/cocostudio/CCActionManagerEx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/editor-support/cocostudio/CCActionManagerEx.h b/cocos/editor-support/cocostudio/CCActionManagerEx.h index 31a3ba6ad46d..01b9cd17b329 100644 --- a/cocos/editor-support/cocostudio/CCActionManagerEx.h +++ b/cocos/editor-support/cocostudio/CCActionManagerEx.h @@ -110,7 +110,7 @@ class CC_STUDIO_DLL ActionManagerEx:public cocos2d::Ref ActionObject* stopActionByName(const char* jsonName,const char* actionName); /*init properties with json dictionary*/ - void initWithDictionary(const char* jsonName,const rapidjson::Value &dic, Ref* root, int version = 0); + void initWithDictionary(const char* jsonName,const rapidjson::Value &dic, Ref* root, int version = 1600); void initWithBinary(const char* file, Ref* root, CocoLoader* cocoLoader, stExpCocoNode* pCocoNode); /** From 1928d24bf0ff174466a873fec8e08f46a1a8fa40 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Thu, 26 May 2016 19:24:24 +0800 Subject: [PATCH 197/241] Made templates support cc.view.setOrientation on web --- .../scripting/js-bindings/script/jsb_boot.js | 1 + templates/js-template-default/index.html | 40 ++++++++++----- templates/js-template-default/main.js | 10 ++-- templates/js-template-default/style.css | 49 +++++++++++++++++++ templates/js-template-runtime/index.html | 41 ++++++++++------ templates/js-template-runtime/main.js | 10 ++-- templates/js-template-runtime/style.css | 49 +++++++++++++++++++ 7 files changed, 167 insertions(+), 33 deletions(-) create mode 100644 templates/js-template-default/style.css create mode 100644 templates/js-template-runtime/style.css diff --git a/cocos/scripting/js-bindings/script/jsb_boot.js b/cocos/scripting/js-bindings/script/jsb_boot.js index 7d8a62745597..2895ef81bcad 100644 --- a/cocos/scripting/js-bindings/script/jsb_boot.js +++ b/cocos/scripting/js-bindings/script/jsb_boot.js @@ -810,6 +810,7 @@ cc.view.getVisibleOriginInPixel = cc.view.getVisibleOrigin; cc.view.setContentTranslateLeftTop = function(){return;}; cc.view.getContentTranslateLeftTop = function(){return null;}; cc.view.setFrameZoomFactor = function(){return;}; +cc.view.setOrientation = function () {}; cc.DENSITYDPI_DEVICE = "device-dpi"; cc.DENSITYDPI_HIGH = "high-dpi"; cc.DENSITYDPI_MEDIUM = "medium-dpi"; diff --git a/templates/js-template-default/index.html b/templates/js-template-default/index.html index a049999ace07..9598bb665e58 100644 --- a/templates/js-template-default/index.html +++ b/templates/js-template-default/index.html @@ -4,23 +4,37 @@ Cocos2d-html5 Hello World test - - + + + + + + + + + + + + + + + + - - + + + + + + + + - +