From 9a01b76fec4fbac8b3c5daddc20e63cf0cf1349f Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 11 Dec 2014 12:10:43 +0300 Subject: [PATCH 001/106] Clang static analyzer crash fix --- cocos/base/CCDirector.cpp | 2 ++ cocos/deprecated/CCDeprecated.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/cocos/base/CCDirector.cpp b/cocos/base/CCDirector.cpp index b6033d4be1..f72907aa2e 100644 --- a/cocos/base/CCDirector.cpp +++ b/cocos/base/CCDirector.cpp @@ -971,7 +971,9 @@ void Director::purgeDirector() #pragma warning (push) #pragma warning (disable: 4996) #endif +#ifndef __clang_analyzer__ DrawPrimitives::free(); +#endif #if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) #pragma GCC diagnostic warning "-Wdeprecated-declarations" #elif _MSC_VER >= 1400 //vs 2005 or higher diff --git a/cocos/deprecated/CCDeprecated.cpp b/cocos/deprecated/CCDeprecated.cpp index c4bd24010d..11d544b77f 100644 --- a/cocos/deprecated/CCDeprecated.cpp +++ b/cocos/deprecated/CCDeprecated.cpp @@ -87,7 +87,9 @@ void ccDrawInit() void ccDrawFree() { +#ifndef __clang_analyzer__ DrawPrimitives::free(); +#endif } void ccDrawPoint( const Vec2& point ) From a445148a5e872d3fc2ed0d398485166a3417c961 Mon Sep 17 00:00:00 2001 From: ton Date: Sat, 3 Jan 2015 01:13:57 +0900 Subject: [PATCH 002/106] fix problem : JumpTo position is changed each repeat. example: sprite->runAction( RepeatForever::create( Sequence::create( JumpTo::create(1, Vec2(300, 200), 100, 2), MoveTo::create(1, Vec2(100, 200)), nullptr ) ) ); --- cocos/2d/CCActionInterval.cpp | 18 +++++++++++++++++- cocos/2d/CCActionInterval.h | 6 ++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index 9104a8b90e..48d9f8b3f0 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -1450,6 +1450,22 @@ JumpTo* JumpTo::create(float duration, const Vec2& position, float height, int j return jumpTo; } +bool JumpTo::initWithDuration(float duration, const Vec2& position, float height, int jumps) +{ + CCASSERT(jumps>=0, "Number of jumps must be >= 0"); + + if (ActionInterval::initWithDuration(duration) && jumps>=0) + { + _endPosition = position; + _height = height; + _jumps = jumps; + + return true; + } + + return false; +} + JumpTo* JumpTo::clone() const { // no copy constructor @@ -1468,7 +1484,7 @@ JumpTo* JumpTo::reverse() const void JumpTo::startWithTarget(Node *target) { JumpBy::startWithTarget(target); - _delta = Vec2(_delta.x - _startPosition.x, _delta.y - _startPosition.y); + _delta = Vec2(_endPosition.x - _startPosition.x, _endPosition.y - _startPosition.y); } // Bezier cubic formula: diff --git a/cocos/2d/CCActionInterval.h b/cocos/2d/CCActionInterval.h index 7957ea9a9e..5388952983 100644 --- a/cocos/2d/CCActionInterval.h +++ b/cocos/2d/CCActionInterval.h @@ -604,6 +604,12 @@ CC_CONSTRUCTOR_ACCESS: JumpTo() {} virtual ~JumpTo() {} + /** initializes the action */ + bool initWithDuration(float duration, const Vec2& position, float height, int jumps); + +protected: + Vec2 _endPosition; + private: CC_DISALLOW_COPY_AND_ASSIGN(JumpTo); }; From 832a87f5f03c91e6757020b87697399a9537c104 Mon Sep 17 00:00:00 2001 From: samuele3hu Date: Sun, 4 Jan 2015 17:09:35 +0800 Subject: [PATCH 003/106] Fix crash on the XmlHttpRequestTest for Lua and parsing error of response headers for HttpURLConnection --- cocos/network/HttpClient-ios.mm | 10 +++++++--- .../org/cocos2dx/lib/Cocos2dxHttpURLConnection.java | 6 +++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cocos/network/HttpClient-ios.mm b/cocos/network/HttpClient-ios.mm index ea56d4af16..b187939a53 100644 --- a/cocos/network/HttpClient-ios.mm +++ b/cocos/network/HttpClient-ios.mm @@ -188,9 +188,13 @@ static int processTask(HttpRequest *request, NSString* requestType, void *stream } } - NSString* requestData = [NSString stringWithUTF8String:request->getRequestData()]; - NSData *postData = [requestData dataUsingEncoding:NSUTF8StringEncoding]; - [nsrequest setHTTPBody:postData]; + char* requestDataBuffer = request->getRequestData(); + if (nullptr != requestDataBuffer && 0 != strlen(requestDataBuffer)) + { + NSString* requestData = [NSString stringWithUTF8String:requestDataBuffer]; + NSData *postData = [requestData dataUsingEncoding:NSUTF8StringEncoding]; + [nsrequest setHTTPBody:postData]; + } } //read cookie propertities from file and set cookie diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHttpURLConnection.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHttpURLConnection.java index 40dfa8aa69..53b25e6100 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHttpURLConnection.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHttpURLConnection.java @@ -184,14 +184,14 @@ public class Cocos2dxHttpURLConnection return null; } - String header = null; + String header = ""; for (Entry> entry: headers.entrySet()) { String key = entry.getKey(); if (null == key) { - header += listToString(entry.getValue(), ","); + header += listToString(entry.getValue(), ",") + "\n"; } else { - header += key + ":" + listToString(entry.getValue(), ","); + header += key + ":" + listToString(entry.getValue(), ",") + "\n"; } } From 2a266efc1af2811c5d1059211d73d21066ab6b4f Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 5 Jan 2015 15:55:40 +0800 Subject: [PATCH 004/106] fix CurlTest error code 23 on Windows --- tests/cpp-tests/Classes/CurlTest/CurlTest.cpp | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp b/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp index 0562767a77..3d461958d7 100644 --- a/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp +++ b/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp @@ -21,6 +21,31 @@ CurlTest::CurlTest() _label->retain(); } +struct MemoryStruct { + char *memory; + size_t size; +}; + +static size_t +WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + size_t realsize = size * nmemb; + struct MemoryStruct *mem = (struct MemoryStruct *)userp; + + mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1); + if(mem->memory == NULL) { + /* out of memory! */ + printf("not enough memory (realloc returned NULL)\n"); + return 0; + } + + memcpy(&(mem->memory[mem->size]), contents, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + + return realsize; +} + // the test code is // http://curl.haxx.se/mail/lib-2009-12/0071.html @@ -30,10 +55,15 @@ void CurlTest::onTouchesEnded(const std::vector& touches, Event *event) CURLcode res; char buffer[10]; + curl = curl_easy_init(); if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, "http://webtest.cocos2d-x.org/curltest"); + curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com"); + //code from http://curl.haxx.se/libcurl/c/getinmemory.html + //If we don't provide a write function for curl, it will recieve error code 23 on windows. + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + res = curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); From 56e333dc9bb4a4473579fd7ae775dc80b53880d7 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 5 Jan 2015 16:02:46 +0800 Subject: [PATCH 005/106] fix crash on mac --- tests/cpp-tests/Classes/CurlTest/CurlTest.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp b/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp index 3d461958d7..3d214d3546 100644 --- a/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp +++ b/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp @@ -55,12 +55,18 @@ void CurlTest::onTouchesEnded(const std::vector& touches, Event *event) CURLcode res; char buffer[10]; + struct MemoryStruct chunk; + + chunk.memory = (char*)malloc(1); /* will be grown as needed by the realloc above */ + chunk.size = 0; /* no data at this point */ curl = curl_easy_init(); if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com"); + curl_easy_setopt(curl, CURLOPT_URL, "http://webtest.cocos2d-x.org/curltest"); //code from http://curl.haxx.se/libcurl/c/getinmemory.html + /* we pass our 'chunk' struct to the callback function */ + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); //If we don't provide a write function for curl, it will recieve error code 23 on windows. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); @@ -69,7 +75,7 @@ void CurlTest::onTouchesEnded(const std::vector& touches, Event *event) curl_easy_cleanup(curl); if (res == 0) { - _label->setString("Connect successfully!"); + _label->setString(StringUtils::format("Connect successfully!\n%s", chunk.memory)); } else { From a1daba88f9d177c91aefe66806e5082c2f1ca431 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 5 Jan 2015 16:04:59 +0800 Subject: [PATCH 006/106] fix indent issue --- tests/cpp-tests/Classes/CurlTest/CurlTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp b/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp index 3d214d3546..3b21ad24ff 100644 --- a/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp +++ b/tests/cpp-tests/Classes/CurlTest/CurlTest.cpp @@ -68,7 +68,7 @@ void CurlTest::onTouchesEnded(const std::vector& touches, Event *event) /* we pass our 'chunk' struct to the callback function */ curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); //If we don't provide a write function for curl, it will recieve error code 23 on windows. - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); res = curl_easy_perform(curl); /* always cleanup */ From 58d946b5785ebeaeb817aaa61fc445535349c78f Mon Sep 17 00:00:00 2001 From: samuele3hu Date: Mon, 5 Jan 2015 17:10:25 +0800 Subject: [PATCH 007/106] issue #9796: Extract related physical auto-binding codes to manual-binding to add `CC_USE_PHYSICS` limit --- .../manual/LuaBasicConversions.cpp | 4 + .../lua-bindings/manual/LuaBasicConversions.h | 4 + .../manual/cocos2d/lua_cocos2dx_manual.cpp | 267 ++++++++++++++++++ tools/tolua/cocos2dx.ini | 4 +- 4 files changed, 277 insertions(+), 2 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/LuaBasicConversions.cpp b/cocos/scripting/lua-bindings/manual/LuaBasicConversions.cpp index c500a0883f..02c443cd08 100644 --- a/cocos/scripting/lua-bindings/manual/LuaBasicConversions.cpp +++ b/cocos/scripting/lua-bindings/manual/LuaBasicConversions.cpp @@ -414,6 +414,7 @@ bool luaval_to_blendfunc(lua_State* L, int lo, cocos2d::BlendFunc* outValue, con return ok; } +#if CC_USE_PHYSICS bool luaval_to_physics_material(lua_State* L,int lo,PhysicsMaterial* outValue, const char* funcName) { if (NULL == L || NULL == outValue) @@ -450,6 +451,7 @@ bool luaval_to_physics_material(lua_State* L,int lo,PhysicsMaterial* outValue, c } return ok; } +#endif //#if CC_USE_PHYSICS bool luaval_to_ssize(lua_State* L,int lo, ssize_t* outValue, const char* funcName) { @@ -2103,6 +2105,7 @@ void vec4_to_luaval(lua_State* L,const cocos2d::Vec4& vec4) lua_rawset(L, -3); } +#if CC_USE_PHYSICS void physics_material_to_luaval(lua_State* L,const PhysicsMaterial& pm) { if (nullptr == L) @@ -2179,6 +2182,7 @@ void physics_contactdata_to_luaval(lua_State* L, const PhysicsContactData* data) lua_pushnumber(L, data->POINT_MAX); lua_rawset(L, -3); } +#endif //#if CC_USE_PHYSICS void size_to_luaval(lua_State* L,const Size& sz) { diff --git a/cocos/scripting/lua-bindings/manual/LuaBasicConversions.h b/cocos/scripting/lua-bindings/manual/LuaBasicConversions.h index 6bacaadfcf..3266148d13 100644 --- a/cocos/scripting/lua-bindings/manual/LuaBasicConversions.h +++ b/cocos/scripting/lua-bindings/manual/LuaBasicConversions.h @@ -63,7 +63,9 @@ extern bool luaval_to_rect(lua_State* L,int lo,Rect* outValue, const char* funcN extern bool luaval_to_color3b(lua_State* L,int lo,Color3B* outValue, const char* funcName = ""); extern bool luaval_to_color4b(lua_State* L,int lo,Color4B* outValue, const char* funcName = ""); extern bool luaval_to_color4f(lua_State* L,int lo,Color4F* outValue, const char* funcName = ""); +#if CC_USE_PHYSICS extern bool luaval_to_physics_material(lua_State* L,int lo, cocos2d::PhysicsMaterial* outValue, const char* funcName = ""); +#endif //#if CC_USE_PHYSICS extern bool luaval_to_affinetransform(lua_State* L,int lo, AffineTransform* outValue, const char* funcName = ""); extern bool luaval_to_fontdefinition(lua_State* L, int lo, FontDefinition* outValue , const char* funcName = ""); extern bool luaval_to_mat4(lua_State* L, int lo, cocos2d::Mat4* outValue , const char* funcName = ""); @@ -247,9 +249,11 @@ extern void rect_to_luaval(lua_State* L,const Rect& rt); extern void color3b_to_luaval(lua_State* L,const Color3B& cc); extern void color4b_to_luaval(lua_State* L,const Color4B& cc); extern void color4f_to_luaval(lua_State* L,const Color4F& cc); +#if CC_USE_PHYSICS extern void physics_material_to_luaval(lua_State* L,const PhysicsMaterial& pm); extern void physics_raycastinfo_to_luaval(lua_State* L, const PhysicsRayCastInfo& info); extern void physics_contactdata_to_luaval(lua_State* L, const PhysicsContactData* data); +#endif //#if CC_USE_PHYSICS extern void affinetransform_to_luaval(lua_State* L,const AffineTransform& inValue); extern void fontdefinition_to_luaval(lua_State* L,const FontDefinition& inValue); extern void array_to_luaval(lua_State* L, __Array* inValue); diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp index 47dab09de1..109a57bc4c 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp @@ -2371,6 +2371,155 @@ tolua_lerror: return 0; } +#if CC_USE_PHYSICS + +int lua_cocos2dx_Node_setPhysicsBody(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Node* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Node",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Node_setPhysicsBody'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::PhysicsBody* arg0; + + ok &= luaval_to_object(tolua_S, 2, "cc.PhysicsBody",&arg0); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Node_setPhysicsBody'", nullptr); + return 0; + } + cobj->setPhysicsBody(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:setPhysicsBody",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 +tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_setPhysicsBody'.",&tolua_err); +#endif + + return 0; +} + +int lua_cocos2dx_Node_removeFromPhysicsWorld(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Node* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Node",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Node_removeFromPhysicsWorld'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Node_removeFromPhysicsWorld'", nullptr); + return 0; + } + cobj->removeFromPhysicsWorld(); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:removeFromPhysicsWorld",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 +tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_removeFromPhysicsWorld'.",&tolua_err); +#endif + + return 0; +} + +int lua_cocos2dx_Node_getPhysicsBody(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Node* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Node",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Node_getPhysicsBody'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Node_getPhysicsBody'", nullptr); + return 0; + } + cocos2d::PhysicsBody* ret = cobj->getPhysicsBody(); + object_to_luaval(tolua_S, "cc.PhysicsBody",(cocos2d::PhysicsBody*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:getPhysicsBody",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 +tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_getPhysicsBody'.",&tolua_err); +#endif + + return 0; +} + +#endif //CC_USE_PHYSICS + static int tolua_cocos2d_Spawn_create(lua_State* tolua_S) { if (NULL == tolua_S) @@ -4300,6 +4449,111 @@ tolua_lerror: return 0; } +#if CC_USE_PHYSICS + +int lua_cocos2dx_Scene_getPhysicsWorld(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Scene* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Scene",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Scene*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Scene_getPhysicsWorld'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Scene_getPhysicsWorld'", nullptr); + return 0; + } + cocos2d::PhysicsWorld* ret = cobj->getPhysicsWorld(); + object_to_luaval(tolua_S, "cc.PhysicsWorld",(cocos2d::PhysicsWorld*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Scene:getPhysicsWorld",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 +tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Scene_getPhysicsWorld'.",&tolua_err); +#endif + + return 0; +} + +int lua_cocos2dx_Scene_createWithPhysics(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"cc.Scene",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Scene_createWithPhysics'", nullptr); + return 0; + } + cocos2d::Scene* ret = cocos2d::Scene::createWithPhysics(); + object_to_luaval(tolua_S, "cc.Scene",(cocos2d::Scene*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.Scene:createWithPhysics",argc, 0); + return 0; +#if COCOS2D_DEBUG >= 1 +tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Scene_createWithPhysics'.",&tolua_err); +#endif + return 0; +} + +#endif //CC_USE_PHYSICS + +static void extendScene(lua_State* tolua_S) +{ + lua_pushstring(tolua_S, "cc.Scene"); + lua_rawget(tolua_S, LUA_REGISTRYINDEX); + if (lua_istable(tolua_S,-1)) + { +#if CC_USE_PHYSICS + lua_pushstring(tolua_S, "getPhysicsWorld"); + lua_pushcfunction(tolua_S, lua_cocos2dx_Scene_getPhysicsWorld); + lua_rawset(tolua_S, -3); + lua_pushstring(tolua_S, "createWithPhysics"); + lua_pushcfunction(tolua_S, lua_cocos2dx_Scene_createWithPhysics); + lua_rawset(tolua_S, -3); +#endif + } + lua_pop(tolua_S, 1); +} + static void extendTexture2D(lua_State* tolua_S) { lua_pushstring(tolua_S, "cc.Texture2D"); @@ -4449,6 +4703,18 @@ static void extendNode(lua_State* tolua_S) lua_pushstring(tolua_S, "setRotationQuat"); lua_pushcfunction(tolua_S, lua_cocos2dx_Node_setRotationQuat); lua_rawset(tolua_S, -3); +#if CC_USE_PHYSICS + lua_pushstring(tolua_S, "setPhysicsBody"); + lua_pushcfunction(tolua_S, lua_cocos2dx_Node_setPhysicsBody); + lua_rawset(tolua_S, -3); + lua_pushstring(tolua_S, "removeFromPhysicsWorld"); + lua_pushcfunction(tolua_S, lua_cocos2dx_Node_removeFromPhysicsWorld); + lua_rawset(tolua_S, -3); + lua_pushstring(tolua_S, "getPhysicsBody"); + lua_pushcfunction(tolua_S, lua_cocos2dx_Node_getPhysicsBody); + lua_rawset(tolua_S, -3); +#endif //CC_USE_PHYSICS + } lua_pop(tolua_S, 1); } @@ -6961,6 +7227,7 @@ int register_all_cocos2dx_manual(lua_State* tolua_S) return 0; extendNode(tolua_S); + extendScene(tolua_S); extendLayer(tolua_S); extendMenuItem(tolua_S); extendMenuItemImage(tolua_S); diff --git a/tools/tolua/cocos2dx.ini b/tools/tolua/cocos2dx.ini index ea95ce748a..e568a7e1b4 100644 --- a/tools/tolua/cocos2dx.ini +++ b/tools/tolua/cocos2dx.ini @@ -35,7 +35,7 @@ classes = New.* Sprite.* Scene Node.* Director Layer.* Menu.* Touch .*Action.* M # will apply to all class names. This is a convenience wildcard to be able to skip similar named # functions from all classes. -skip = Node::[setGLServerState description getUserObject .*UserData getGLServerState .*schedule getPosition$ setContentSize setAnchorPoint enumerateChildren getonEnterTransitionDidFinishCallback getOnEnterCallback getOnExitCallback getonExitTransitionDidStartCallback setAdditionalTransform setRotationQuat getRotationQuat], +skip = Node::[setGLServerState description getUserObject .*UserData getGLServerState .*schedule getPosition$ setContentSize setAnchorPoint enumerateChildren getonEnterTransitionDidFinishCallback getOnEnterCallback getOnExitCallback getonExitTransitionDidStartCallback setAdditionalTransform setRotationQuat getRotationQuat .*(Physics).*], Sprite::[getQuad getBlendFunc ^setPosition$ setBlendFunc], SpriteBatchNode::[getBlendFunc setBlendFunc getDescendants], MotionStreak::[getBlendFunc setBlendFunc draw update], @@ -126,7 +126,7 @@ skip = Node::[setGLServerState description getUserObject .*UserData getGLServerS TurnOffTiles::[shuffle], LabelTTF::[*], LabelBMFont::[*], - Scene::[getCameras getLights], + Scene::[getCameras getLights .*(Physics).*], Animate3D::[*], Sprite3D::[*], AttachNode::[*], From a1654e5714084e0ea1a679c7f1d156b095849ade Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 5 Jan 2015 17:53:31 +0800 Subject: [PATCH 008/106] fix delete wild opengl buffers --- cocos/2d/CCParticleSystemQuad.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cocos/2d/CCParticleSystemQuad.cpp b/cocos/2d/CCParticleSystemQuad.cpp index 8a93568d82..5ae6a78fcf 100644 --- a/cocos/2d/CCParticleSystemQuad.cpp +++ b/cocos/2d/CCParticleSystemQuad.cpp @@ -513,6 +513,7 @@ void ParticleSystemQuad::setupVBO() void ParticleSystemQuad::listenRendererRecreated(EventCustom* event) { + memset(_buffersVBO, 0, sizeof(_buffersVBO)); if (Configuration::getInstance()->supportsShareableVAO()) { setupVBOandVAO(); From efada94e18f49fefdc733992b29804a716049da2 Mon Sep 17 00:00:00 2001 From: dualface Date: Mon, 5 Jan 2015 17:56:34 +0800 Subject: [PATCH 009/106] update proj.ios_mac --- .../HelloCpp.xcodeproj/project.pbxproj | 28 +++++++++++++------ .../HelloLua.xcodeproj/project.pbxproj | 28 +++++++++++++------ .../HelloLua.xcodeproj/project.pbxproj | 28 +++++++++++++------ 3 files changed, 60 insertions(+), 24 deletions(-) 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 c13eea6bf8..f85581e96b 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 @@ -545,10 +545,13 @@ ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_IOS_BEGIN)", + "$(_COCOS_LIB_IOS_END)", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = ""; + USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; }; name = Debug; @@ -575,10 +578,13 @@ ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_IOS_BEGIN)", + "$(_COCOS_LIB_IOS_END)", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = ""; + USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; }; name = Release; @@ -607,8 +613,11 @@ "$(SRCROOT)/../cocos2d/external/glfw3/include/mac", ); INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ""; - USER_HEADER_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", + ); + USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; }; name = Debug; }; @@ -634,8 +643,11 @@ "$(SRCROOT)/../cocos2d/external/glfw3/include/mac", ); INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ""; - USER_HEADER_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", + ); + USER_HEADER_SEARCH_PATHS = "$(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; }; name = Release; }; 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 9209a0cc9a..8a4e7a564a 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 @@ -611,7 +611,10 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", + ); OTHER_LDFLAGS = ( "-image_base", 100000000, @@ -619,7 +622,7 @@ 10000, ); SDKROOT = macosx; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac $(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; }; name = Debug; }; @@ -637,7 +640,10 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", + ); OTHER_LDFLAGS = ( "-image_base", 100000000, @@ -645,7 +651,7 @@ 10000, ); SDKROOT = macosx; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac $(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; }; name = Release; }; @@ -713,10 +719,13 @@ HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_IOS_BEGIN)", + "$(_COCOS_LIB_IOS_END)", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios $(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; }; name = Debug; @@ -736,10 +745,13 @@ HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_IOS_BEGIN)", + "$(_COCOS_LIB_IOS_END)", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios $(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; }; name = Release; diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj index e3145a9cb3..8927d0a6ec 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj @@ -1104,7 +1104,10 @@ "$(SRCROOT)/../Classes", ); INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", + ); MACOSX_DEPLOYMENT_TARGET = 10.8; OTHER_LDFLAGS = ( "-image_base", @@ -1113,7 +1116,7 @@ 10000, ); SDKROOT = macosx; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac $(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; }; name = Debug; }; @@ -1137,7 +1140,10 @@ "$(SRCROOT)/../Classes", ); INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", + ); MACOSX_DEPLOYMENT_TARGET = 10.8; OTHER_LDFLAGS = ( "-image_base", @@ -1146,7 +1152,7 @@ 10000, ); SDKROOT = macosx; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac $(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; }; name = Release; }; @@ -1218,10 +1224,13 @@ ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_IOS_BEGIN)", + "$(_COCOS_LIB_IOS_END)", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios $(SRCROOT)/../../cocos2d-x/external/curl/include/ios"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios $(SRCROOT)/../../cocos2d-x/external/curl/include/ios $(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; }; name = Debug; @@ -1245,10 +1254,13 @@ ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ""; + LIBRARY_SEARCH_PATHS = ( + "$(_COCOS_LIB_IOS_BEGIN)", + "$(_COCOS_LIB_IOS_END)", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios $(SRCROOT)/../../cocos2d-x/external/curl/include/ios"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios $(SRCROOT)/../../cocos2d-x/external/curl/include/ios $(_COCOS_HEADER_IOS_BEGIN) $(_COCOS_HEADER_IOS_END)"; VALID_ARCHS = "arm64 armv7"; }; name = Release; From 156e9eb4f28b6593f20a2f1d6d82a0312e635006 Mon Sep 17 00:00:00 2001 From: dualface Date: Tue, 6 Jan 2015 08:31:43 +0800 Subject: [PATCH 010/106] update templates --- .../HelloCpp.xcodeproj/project.pbxproj | 12 +++++++---- .../proj.win32/HelloCpp.vcxproj | 14 ++++++------- .../HelloLua.xcodeproj/project.pbxproj | 20 +++++++++---------- .../HelloLua.xcodeproj/project.pbxproj | 20 +++++++++---------- 4 files changed, 35 insertions(+), 31 deletions(-) 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 f85581e96b..b5bcd662cc 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 @@ -545,7 +545,8 @@ ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ( + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ( "$(_COCOS_LIB_IOS_BEGIN)", "$(_COCOS_LIB_IOS_END)", ); @@ -578,7 +579,8 @@ ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ( + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ( "$(_COCOS_LIB_IOS_BEGIN)", "$(_COCOS_LIB_IOS_END)", ); @@ -613,7 +615,8 @@ "$(SRCROOT)/../cocos2d/external/glfw3/include/mac", ); INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ( + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ( "$(_COCOS_LIB_MAC_BEGIN)", "$(_COCOS_LIB_MAC_END)", ); @@ -643,7 +646,8 @@ "$(SRCROOT)/../cocos2d/external/glfw3/include/mac", ); INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ( + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ( "$(_COCOS_LIB_MAC_BEGIN)", "$(_COCOS_LIB_MAC_END)", ); diff --git a/templates/cpp-template-default/proj.win32/HelloCpp.vcxproj b/templates/cpp-template-default/proj.win32/HelloCpp.vcxproj index 196182fe7c..603cd2b804 100644 --- a/templates/cpp-template-default/proj.win32/HelloCpp.vcxproj +++ b/templates/cpp-template-default/proj.win32/HelloCpp.vcxproj @@ -73,7 +73,7 @@ Disabled - $(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;..\Classes;..;%(AdditionalIncludeDirectories) + $(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;..\Classes;..;%(AdditionalIncludeDirectories);$(_COCOS_HEADER_WIN32_BEGIN);$(_COCOS_HEADER_WIN32_END) WIN32;_DEBUG;_WINDOWS;_USE_MATH_DEFINES;GL_GLEXT_PROTOTYPES;CC_ENABLE_CHIPMUNK_INTEGRATION=1;COCOS2D_DEBUG=1;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) false EnableFastChecks @@ -86,9 +86,9 @@ true - %(AdditionalDependencies) + %(AdditionalDependencies);$(_COCOS_LIB_WIN32_BEGIN);$(_COCOS_LIB_WIN32_END) $(OutDir)$(ProjectName).exe - $(OutDir);%(AdditionalLibraryDirectories) + $(OutDir);%(AdditionalLibraryDirectories);$(_COCOS_LIB_PATH_WIN32_BEGIN);$(_COCOS_LIB_PATH_WIN32_END) true Windows MachineX86 @@ -106,7 +106,7 @@ xcopy /Y /Q "$(EngineRoot)external\websockets\prebuilt\win32\*.*" "$(OutDir)" MaxSpeed true - $(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;..\Classes;..;%(AdditionalIncludeDirectories) + $(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;..\Classes;..;%(AdditionalIncludeDirectories);$(_COCOS_HEADER_WIN32_BEGIN);$(_COCOS_HEADER_WIN32_END) WIN32;NDEBUG;_WINDOWS;_USE_MATH_DEFINES;GL_GLEXT_PROTOTYPES;CC_ENABLE_CHIPMUNK_INTEGRATION=1;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -118,9 +118,9 @@ xcopy /Y /Q "$(EngineRoot)external\websockets\prebuilt\win32\*.*" "$(OutDir)"true - libcurl_imp.lib;websockets.lib;%(AdditionalDependencies) + libcurl_imp.lib;websockets.lib;%(AdditionalDependencies);$(_COCOS_LIB_WIN32_BEGIN);$(_COCOS_LIB_WIN32_END) $(OutDir)$(ProjectName).exe - $(OutDir);%(AdditionalLibraryDirectories) + $(OutDir);%(AdditionalLibraryDirectories);$(_COCOS_LIB_PATH_WIN32_BEGIN);$(_COCOS_LIB_PATH_WIN32_END) true Windows true @@ -164,4 +164,4 @@ xcopy /Y /Q "$(EngineRoot)external\websockets\prebuilt\win32\*.*" "$(OutDir)" - \ No newline at end of file + 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 8a4e7a564a..be291a71c5 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 @@ -611,15 +611,14 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ( - "$(_COCOS_LIB_MAC_BEGIN)", - "$(_COCOS_LIB_MAC_END)", - ); + LIBRARY_SEARCH_PATHS = ""; OTHER_LDFLAGS = ( "-image_base", 100000000, "-pagezero_size", 10000, + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", ); SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac $(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; @@ -640,15 +639,14 @@ ); HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ( - "$(_COCOS_LIB_MAC_BEGIN)", - "$(_COCOS_LIB_MAC_END)", - ); + LIBRARY_SEARCH_PATHS = ""; OTHER_LDFLAGS = ( "-image_base", 100000000, "-pagezero_size", 10000, + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", ); SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac $(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; @@ -719,7 +717,8 @@ HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ( + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ( "$(_COCOS_LIB_IOS_BEGIN)", "$(_COCOS_LIB_IOS_END)", ); @@ -745,7 +744,8 @@ HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ( + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ( "$(_COCOS_LIB_IOS_BEGIN)", "$(_COCOS_LIB_IOS_END)", ); diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj index 8927d0a6ec..c9763e9964 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj @@ -1104,16 +1104,15 @@ "$(SRCROOT)/../Classes", ); INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ( - "$(_COCOS_LIB_MAC_BEGIN)", - "$(_COCOS_LIB_MAC_END)", - ); + LIBRARY_SEARCH_PATHS = ""; MACOSX_DEPLOYMENT_TARGET = 10.8; OTHER_LDFLAGS = ( "-image_base", 100000000, "-pagezero_size", 10000, + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", ); SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac $(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; @@ -1140,16 +1139,15 @@ "$(SRCROOT)/../Classes", ); INFOPLIST_FILE = mac/Info.plist; - LIBRARY_SEARCH_PATHS = ( - "$(_COCOS_LIB_MAC_BEGIN)", - "$(_COCOS_LIB_MAC_END)", - ); + LIBRARY_SEARCH_PATHS = ""; MACOSX_DEPLOYMENT_TARGET = 10.8; OTHER_LDFLAGS = ( "-image_base", 100000000, "-pagezero_size", 10000, + "$(_COCOS_LIB_MAC_BEGIN)", + "$(_COCOS_LIB_MAC_END)", ); SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/mac $(SRCROOT)/../../cocos2d-x/external/glfw3/include/mac $(_COCOS_HEADER_MAC_BEGIN) $(_COCOS_HEADER_MAC_END)"; @@ -1224,7 +1222,8 @@ ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ( + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ( "$(_COCOS_LIB_IOS_BEGIN)", "$(_COCOS_LIB_IOS_END)", ); @@ -1254,7 +1253,8 @@ ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; - LIBRARY_SEARCH_PATHS = ( + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ( "$(_COCOS_LIB_IOS_BEGIN)", "$(_COCOS_LIB_IOS_END)", ); From 7f61a3d97b895b1ce20e480623ca630103860f5f Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Tue, 6 Jan 2015 09:44:19 +0800 Subject: [PATCH 011/106] reset _VAOname to 0 before recreating on android --- cocos/2d/CCParticleSystemQuad.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cocos/2d/CCParticleSystemQuad.cpp b/cocos/2d/CCParticleSystemQuad.cpp index 5ae6a78fcf..e2c8e3ff82 100644 --- a/cocos/2d/CCParticleSystemQuad.cpp +++ b/cocos/2d/CCParticleSystemQuad.cpp @@ -513,9 +513,12 @@ void ParticleSystemQuad::setupVBO() void ParticleSystemQuad::listenRendererRecreated(EventCustom* event) { + //when comes to foreground in android, _buffersVBO and _VAOname is a wild handle + //before recreating, we need to reset them to 0 memset(_buffersVBO, 0, sizeof(_buffersVBO)); if (Configuration::getInstance()->supportsShareableVAO()) { + _VAOname = 0; setupVBOandVAO(); } else From 1180f7a41eaa8f7ab3b78db122136d6c61428528 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Tue, 6 Jan 2015 12:44:29 +0800 Subject: [PATCH 012/106] move class cocos2dEGLConfigChooser to Cocos2dxActivity --- .../org/cocos2dx/lib/Cocos2dxActivity.java | 241 +++++++++--------- 1 file changed, 121 insertions(+), 120 deletions(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java index 32ae89876e..a0689ad3aa 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java @@ -62,6 +62,127 @@ public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelpe private static Cocos2dxActivity sContext = null; private Cocos2dxVideoHelper mVideoHelper = null; private Cocos2dxWebViewHelper mWebViewHelper = null; + + public class cocos2dEGLConfigChooser implements GLSurfaceView.EGLConfigChooser + { + protected int[] configAttribs; + public cocos2dEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize) + { + configAttribs = new int[] {redSize, greenSize, blueSize, alphaSize, depthSize, stencilSize}; + } + public cocos2dEGLConfigChooser(int[] attribs) + { + configAttribs = attribs; + } + + public EGLConfig selectConfig(EGL10 egl, EGLDisplay display, EGLConfig[] configs, int[] attribs) + { + for (EGLConfig config : configs) { + int d = findConfigAttrib(egl, display, config, + EGL10.EGL_DEPTH_SIZE, 0); + int s = findConfigAttrib(egl, display, config, + EGL10.EGL_STENCIL_SIZE, 0); + if ((d >= attribs[4]) && (s >= attribs[5])) { + int r = findConfigAttrib(egl, display, config, + EGL10.EGL_RED_SIZE, 0); + int g = findConfigAttrib(egl, display, config, + EGL10.EGL_GREEN_SIZE, 0); + int b = findConfigAttrib(egl, display, config, + EGL10.EGL_BLUE_SIZE, 0); + int a = findConfigAttrib(egl, display, config, + EGL10.EGL_ALPHA_SIZE, 0); + if ((r >= attribs[0]) && (g >= attribs[1]) + && (b >= attribs[2]) && (a >= attribs[3])) { + return config; + } + } + } + return null; + } + + private int findConfigAttrib(EGL10 egl, EGLDisplay display, + EGLConfig config, int attribute, int defaultValue) { + int[] value = new int[1]; + if (egl.eglGetConfigAttrib(display, config, attribute, value)) { + return value[0]; + } + return defaultValue; + } + + @Override + public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) + { + int[] numConfigs = new int[1]; + if(egl.eglGetConfigs(display, null, 0, numConfigs)) + { + EGLConfig[] configs = new EGLConfig[numConfigs[0]]; + int[] EGLattribs = { + EGL10.EGL_RED_SIZE, configAttribs[0], + EGL10.EGL_GREEN_SIZE, configAttribs[1], + EGL10.EGL_BLUE_SIZE, configAttribs[2], + EGL10.EGL_ALPHA_SIZE, configAttribs[3], + EGL10.EGL_DEPTH_SIZE, configAttribs[4], + EGL10.EGL_STENCIL_SIZE,configAttribs[5], + EGL10.EGL_RENDERABLE_TYPE, 4, //EGL_OPENGL_ES2_BIT + EGL10.EGL_NONE + }; + int[] choosedConfigNum = new int[1]; + + egl.eglChooseConfig(display, EGLattribs, configs, numConfigs[0], choosedConfigNum); + if(choosedConfigNum[0]>0) + { + return selectConfig(egl, display, configs, configAttribs); + } + else + { + int[] defaultEGLattribs = { + EGL10.EGL_RED_SIZE, 5, + EGL10.EGL_GREEN_SIZE, 6, + EGL10.EGL_BLUE_SIZE, 5, + EGL10.EGL_ALPHA_SIZE, 0, + EGL10.EGL_DEPTH_SIZE, 0, + EGL10.EGL_STENCIL_SIZE,0, + EGL10.EGL_RENDERABLE_TYPE, 4, //EGL_OPENGL_ES2_BIT + EGL10.EGL_NONE + }; + int[] defaultEGLattribsAlpha = { + EGL10.EGL_RED_SIZE, 4, + EGL10.EGL_GREEN_SIZE, 4, + EGL10.EGL_BLUE_SIZE, 4, + EGL10.EGL_ALPHA_SIZE, 4, + EGL10.EGL_DEPTH_SIZE, 0, + EGL10.EGL_STENCIL_SIZE,0, + EGL10.EGL_RENDERABLE_TYPE, 4, //EGL_OPENGL_ES2_BIT + EGL10.EGL_NONE + }; + int[] attribs = null; + //choose one can use + if(this.configAttribs[3] == 0) + { + egl.eglChooseConfig(display, defaultEGLattribs, configs, numConfigs[0], choosedConfigNum); + attribs = new int[]{5,6,5,0,0,0}; + } + else + { + egl.eglChooseConfig(display, defaultEGLattribsAlpha, configs, numConfigs[0], choosedConfigNum); + attribs = new int[]{4,4,4,4,0,0}; + } + if(choosedConfigNum[0] > 0) + { + return selectConfig(egl, display, configs, attribs); + } + else + { + Log.e(DEVICE_POLICY_SERVICE, "Can not select an EGLConfig for rendering."); + return null; + } + } + } + Log.e(DEVICE_POLICY_SERVICE, "Can not select an EGLConfig for rendering."); + return null; + } + + } public static Context getContext() { return sContext; @@ -223,127 +344,7 @@ public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelpe Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); //this line is need on some device if we specify an alpha bits if(this.mGLContextAttrs[3] > 0) glSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT); - - class cocos2dEGLConfigChooser implements GLSurfaceView.EGLConfigChooser - { - protected int[] configAttribs; - public cocos2dEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize) - { - configAttribs = new int[] {redSize, greenSize, blueSize, alphaSize, depthSize, stencilSize}; - } - public cocos2dEGLConfigChooser(int[] attribs) - { - configAttribs = attribs; - } - - public EGLConfig selectConfig(EGL10 egl, EGLDisplay display, EGLConfig[] configs, int[] attribs) - { - for (EGLConfig config : configs) { - int d = findConfigAttrib(egl, display, config, - EGL10.EGL_DEPTH_SIZE, 0); - int s = findConfigAttrib(egl, display, config, - EGL10.EGL_STENCIL_SIZE, 0); - if ((d >= attribs[4]) && (s >= attribs[5])) { - int r = findConfigAttrib(egl, display, config, - EGL10.EGL_RED_SIZE, 0); - int g = findConfigAttrib(egl, display, config, - EGL10.EGL_GREEN_SIZE, 0); - int b = findConfigAttrib(egl, display, config, - EGL10.EGL_BLUE_SIZE, 0); - int a = findConfigAttrib(egl, display, config, - EGL10.EGL_ALPHA_SIZE, 0); - if ((r >= attribs[0]) && (g >= attribs[1]) - && (b >= attribs[2]) && (a >= attribs[3])) { - return config; - } - } - } - return null; - } - private int findConfigAttrib(EGL10 egl, EGLDisplay display, - EGLConfig config, int attribute, int defaultValue) { - int[] value = new int[1]; - if (egl.eglGetConfigAttrib(display, config, attribute, value)) { - return value[0]; - } - return defaultValue; - } - - @Override - public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) - { - int[] numConfigs = new int[1]; - if(egl.eglGetConfigs(display, null, 0, numConfigs)) - { - EGLConfig[] configs = new EGLConfig[numConfigs[0]]; - int[] EGLattribs = { - EGL10.EGL_RED_SIZE, configAttribs[0], - EGL10.EGL_GREEN_SIZE, configAttribs[1], - EGL10.EGL_BLUE_SIZE, configAttribs[2], - EGL10.EGL_ALPHA_SIZE, configAttribs[3], - EGL10.EGL_DEPTH_SIZE, configAttribs[4], - EGL10.EGL_STENCIL_SIZE,configAttribs[5], - EGL10.EGL_RENDERABLE_TYPE, 4, //EGL_OPENGL_ES2_BIT - EGL10.EGL_NONE - }; - int[] choosedConfigNum = new int[1]; - - egl.eglChooseConfig(display, EGLattribs, configs, numConfigs[0], choosedConfigNum); - if(choosedConfigNum[0]>0) - { - return selectConfig(egl, display, configs, configAttribs); - } - else - { - int[] defaultEGLattribs = { - EGL10.EGL_RED_SIZE, 5, - EGL10.EGL_GREEN_SIZE, 6, - EGL10.EGL_BLUE_SIZE, 5, - EGL10.EGL_ALPHA_SIZE, 0, - EGL10.EGL_DEPTH_SIZE, 0, - EGL10.EGL_STENCIL_SIZE,0, - EGL10.EGL_RENDERABLE_TYPE, 4, //EGL_OPENGL_ES2_BIT - EGL10.EGL_NONE - }; - int[] defaultEGLattribsAlpha = { - EGL10.EGL_RED_SIZE, 4, - EGL10.EGL_GREEN_SIZE, 4, - EGL10.EGL_BLUE_SIZE, 4, - EGL10.EGL_ALPHA_SIZE, 4, - EGL10.EGL_DEPTH_SIZE, 0, - EGL10.EGL_STENCIL_SIZE,0, - EGL10.EGL_RENDERABLE_TYPE, 4, //EGL_OPENGL_ES2_BIT - EGL10.EGL_NONE - }; - int[] attribs = null; - //choose one can use - if(this.configAttribs[3] == 0) - { - egl.eglChooseConfig(display, defaultEGLattribs, configs, numConfigs[0], choosedConfigNum); - attribs = new int[]{5,6,5,0,0,0}; - } - else - { - egl.eglChooseConfig(display, defaultEGLattribsAlpha, configs, numConfigs[0], choosedConfigNum); - attribs = new int[]{4,4,4,4,0,0}; - } - if(choosedConfigNum[0] > 0) - { - return selectConfig(egl, display, configs, attribs); - } - else - { - Log.e(DEVICE_POLICY_SERVICE, "Can not select an EGLConfig for rendering."); - return null; - } - } - } - Log.e(DEVICE_POLICY_SERVICE, "Can not select an EGLConfig for rendering."); - return null; - } - - } cocos2dEGLConfigChooser chooser = new cocos2dEGLConfigChooser(this.mGLContextAttrs); glSurfaceView.setEGLConfigChooser(chooser); From 019cda31103443ccbc78c6d39ee8d3de73e82db1 Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 6 Jan 2015 14:12:31 +0800 Subject: [PATCH 013/106] [ci skip] Update CHANGELOG --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 63f7822945..d02ca4ba14 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ cocos2d-x-3.4rc0 Jan.9 2015 [FIX] FileUtils: getData() can't get data from file when file was using by other application on windows [FIX] FileUtils: getData() will cause memory leak if file size is 0 on windows [FIX] GLProgram: when there is a shader compile error in shader, it will crash on windows + [FIX] JumpTo: can not be applied more than once [FIX] Physics integration: physics body is not still after disabling gravitational force by PhysicsBody::setGravityEnable() [FIX] Sprite3DTest: Sprite3DUVAnimationTest, Sprite3DFakeShadowTest, Sprite3DLightMapTest, Sprite3DBasicToonShaderTest will crash on android when switch to foreground from background [FIX] HttpClient: http requests will be lost in immediately mode on iOS From fdaa0bbfc66df3e436083bb9cf4ad270bf15e0f0 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Tue, 6 Jan 2015 10:29:07 +0800 Subject: [PATCH 014/106] Remove XXXXInfo_chipmunk class in 'chipmunk' folder to simplify implementation of physics --- cocos/physics/CCPhysicsBody.cpp | 119 +++++----- cocos/physics/CCPhysicsBody.h | 7 +- cocos/physics/CCPhysicsContact.cpp | 11 +- cocos/physics/CCPhysicsContact.h | 3 - ...icsHelper_chipmunk.h => CCPhysicsHelper.h} | 0 cocos/physics/CCPhysicsJoint.cpp | 211 +++++++++--------- cocos/physics/CCPhysicsJoint.h | 11 +- cocos/physics/CCPhysicsShape.cpp | 202 ++++++++--------- cocos/physics/CCPhysicsShape.h | 16 +- cocos/physics/CCPhysicsWorld.cpp | 143 ++++++------ cocos/physics/CCPhysicsWorld.h | 5 +- .../chipmunk/CCPhysicsBodyInfo_chipmunk.cpp | 41 ---- .../chipmunk/CCPhysicsBodyInfo_chipmunk.h | 57 ----- .../CCPhysicsContactInfo_chipmunk.cpp | 40 ---- .../chipmunk/CCPhysicsContactInfo_chipmunk.h | 53 ----- .../chipmunk/CCPhysicsJointInfo_chipmunk.cpp | 85 ------- .../chipmunk/CCPhysicsJointInfo_chipmunk.h | 65 ------ .../chipmunk/CCPhysicsShapeInfo_chipmunk.cpp | 118 ---------- .../chipmunk/CCPhysicsShapeInfo_chipmunk.h | 73 ------ .../chipmunk/CCPhysicsWorldInfo_chipmunk.cpp | 112 ---------- .../chipmunk/CCPhysicsWorldInfo_chipmunk.h | 71 ------ 21 files changed, 348 insertions(+), 1095 deletions(-) rename cocos/physics/{chipmunk/CCPhysicsHelper_chipmunk.h => CCPhysicsHelper.h} (100%) delete mode 100644 cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.cpp delete mode 100644 cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.h delete mode 100644 cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.cpp delete mode 100644 cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.h delete mode 100644 cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.cpp delete mode 100644 cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.h delete mode 100644 cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.cpp delete mode 100644 cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.h delete mode 100644 cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.cpp delete mode 100644 cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.h diff --git a/cocos/physics/CCPhysicsBody.cpp b/cocos/physics/CCPhysicsBody.cpp index 46b80c3273..75183606eb 100644 --- a/cocos/physics/CCPhysicsBody.cpp +++ b/cocos/physics/CCPhysicsBody.cpp @@ -31,16 +31,10 @@ #include "chipmunk.h" #include "2d/CCScene.h" - -#include "physics/CCPhysicsShape.h" -#include "physics/CCPhysicsJoint.h" -#include "physics/CCPhysicsWorld.h" - -#include "chipmunk/CCPhysicsBodyInfo_chipmunk.h" -#include "chipmunk/CCPhysicsJointInfo_chipmunk.h" -#include "chipmunk/CCPhysicsWorldInfo_chipmunk.h" -#include "chipmunk/CCPhysicsShapeInfo_chipmunk.h" -#include "chipmunk/CCPhysicsHelper_chipmunk.h" +#include "CCPhysicsShape.h" +#include "CCPhysicsJoint.h" +#include "CCPhysicsWorld.h" +#include "CCPhysicsHelper.h" static inline void cpBodyUpdateVelocityWithoutGravity(cpBody *body, cpVect gravity, cpFloat damping, cpFloat dt) { @@ -59,7 +53,7 @@ namespace PhysicsBody::PhysicsBody() : _node(nullptr) , _world(nullptr) -, _info(nullptr) +, _cpBody(nullptr) , _dynamic(true) , _enabled(true) , _rotationEnabled(true) @@ -91,7 +85,10 @@ PhysicsBody::~PhysicsBody() delete joint; } - CC_SAFE_DELETE(_info); + if (_cpBody) + { + cpBodyFree(_cpBody); + } } PhysicsBody* PhysicsBody::create() @@ -255,12 +252,9 @@ bool PhysicsBody::init() { do { - _info = new (std::nothrow) PhysicsBodyInfo(); - CC_BREAK_IF(_info == nullptr); + _cpBody = cpBodyNew(PhysicsHelper::float2cpfloat(_mass), PhysicsHelper::float2cpfloat(_moment)); - _info->setBody(cpBodyNew(PhysicsHelper::float2cpfloat(_mass), PhysicsHelper::float2cpfloat(_moment))); - - CC_BREAK_IF(_info->getBody() == nullptr); + CC_BREAK_IF(_cpBody == nullptr); return true; } while (false); @@ -283,33 +277,32 @@ void PhysicsBody::setDynamic(bool dynamic) if (dynamic != _dynamic) { _dynamic = dynamic; - auto body = _info->getBody(); if (dynamic) { - if (_world && body->CP_PRIVATE(space)) + if (_world && _cpBody->CP_PRIVATE(space)) { - cpSpaceConvertBodyToDynamic(_world->_info->getSpace(), body, _mass, _moment); - cpSpaceAddBody(_world->_info->getSpace(), body); + cpSpaceConvertBodyToDynamic(_world->_cpSpace, _cpBody, _mass, _moment); + cpSpaceAddBody(_world->_cpSpace, _cpBody); } else { - cpBodySetMass(body, _mass); - cpBodySetMoment(body, _moment); - body->CP_PRIVATE(node).idleTime = 0.0f; + cpBodySetMass(_cpBody, _mass); + cpBodySetMoment(_cpBody, _moment); + _cpBody->CP_PRIVATE(node).idleTime = 0.0f; } } else { - if (_world && body->CP_PRIVATE(space)) + if (_world && _cpBody->CP_PRIVATE(space)) { - cpSpaceRemoveBody(_world->_info->getSpace(), body); - cpSpaceConvertBodyToStatic(_world->_info->getSpace(), body); + cpSpaceRemoveBody(_world->_cpSpace, _cpBody); + cpSpaceConvertBodyToStatic(_world->_cpSpace, _cpBody); } else { - cpBodySetMass(body, PHYSICS_INFINITY); - cpBodySetMoment(body, PHYSICS_INFINITY); - body->CP_PRIVATE(node).idleTime = (cpFloat)INFINITY; + cpBodySetMass(_cpBody, PHYSICS_INFINITY); + cpBodySetMoment(_cpBody, PHYSICS_INFINITY); + _cpBody->CP_PRIVATE(node).idleTime = (cpFloat)INFINITY; } } } @@ -319,7 +312,7 @@ void PhysicsBody::setRotationEnable(bool enable) { if (_rotationEnabled != enable) { - cpBodySetMoment(_info->getBody(), enable ? _moment : PHYSICS_INFINITY); + cpBodySetMoment(_cpBody, enable ? _moment : PHYSICS_INFINITY); _rotationEnabled = enable; } } @@ -330,22 +323,22 @@ void PhysicsBody::setGravityEnable(bool enable) if (enable) { - _info->getBody()->velocity_func = cpBodyUpdateVelocity; + _cpBody->velocity_func = cpBodyUpdateVelocity; } else { - _info->getBody()->velocity_func = cpBodyUpdateVelocityWithoutGravity; + _cpBody->velocity_func = cpBodyUpdateVelocityWithoutGravity; } } void PhysicsBody::setPosition(const Vec2& position) { - cpBodySetPos(_info->getBody(), PhysicsHelper::point2cpv(position + _positionOffset)); + cpBodySetPos(_cpBody, PhysicsHelper::point2cpv(position + _positionOffset)); } void PhysicsBody::setRotation(float rotation) { - cpBodySetAngle(_info->getBody(), -PhysicsHelper::float2cpfloat((rotation + _rotationOffset) * (M_PI / 180.0f))); + cpBodySetAngle(_cpBody, -PhysicsHelper::float2cpfloat((rotation + _rotationOffset) * (M_PI / 180.0f))); } void PhysicsBody::setScale(float scale) @@ -382,13 +375,13 @@ void PhysicsBody::setScaleY(float scaleY) Vec2 PhysicsBody::getPosition() const { - cpVect vec = cpBodyGetPos(_info->getBody()); + cpVect vec = cpBodyGetPos(_cpBody); return PhysicsHelper::cpv2point(vec) - _positionOffset; } float PhysicsBody::getRotation() const { - return -PhysicsHelper::cpfloat2float(cpBodyGetAngle(_info->getBody()) * (180.0f / M_PI)) - _rotationOffset; + return -PhysicsHelper::cpfloat2float(cpBodyGetAngle(_cpBody) * (180.0f / M_PI)) - _rotationOffset; } PhysicsShape* PhysicsBody::addShape(PhysicsShape* shape, bool addMassAndMoment/* = true*/) @@ -429,13 +422,13 @@ void PhysicsBody::applyForce(const Vect& force, const Vec2& offset) { if (_dynamic && _mass != PHYSICS_INFINITY) { - cpBodyApplyForce(_info->getBody(), PhysicsHelper::point2cpv(force), PhysicsHelper::point2cpv(offset)); + cpBodyApplyForce(_cpBody, PhysicsHelper::point2cpv(force), PhysicsHelper::point2cpv(offset)); } } void PhysicsBody::resetForces() { - cpBodyResetForces(_info->getBody()); + cpBodyResetForces(_cpBody); } void PhysicsBody::applyImpulse(const Vect& impulse) @@ -445,12 +438,12 @@ void PhysicsBody::applyImpulse(const Vect& impulse) void PhysicsBody::applyImpulse(const Vect& impulse, const Vec2& offset) { - cpBodyApplyImpulse(_info->getBody(), PhysicsHelper::point2cpv(impulse), PhysicsHelper::point2cpv(offset)); + cpBodyApplyImpulse(_cpBody, PhysicsHelper::point2cpv(impulse), PhysicsHelper::point2cpv(offset)); } void PhysicsBody::applyTorque(float torque) { - cpBodySetTorque(_info->getBody(), PhysicsHelper::float2cpfloat(torque)); + cpBodySetTorque(_cpBody, PhysicsHelper::float2cpfloat(torque)); } void PhysicsBody::setMass(float mass) @@ -481,7 +474,7 @@ void PhysicsBody::setMass(float mass) // the static body's mass and moment is always infinity if (_dynamic) { - cpBodySetMass(_info->getBody(), _mass); + cpBodySetMass(_cpBody, _mass); } } @@ -527,7 +520,7 @@ void PhysicsBody::addMass(float mass) // the static body's mass and moment is always infinity if (_dynamic) { - cpBodySetMass(_info->getBody(), _mass); + cpBodySetMass(_cpBody, _mass); } } @@ -569,7 +562,7 @@ void PhysicsBody::addMoment(float moment) // the static body's mass and moment is always infinity if (_rotationEnabled && _dynamic) { - cpBodySetMoment(_info->getBody(), PhysicsHelper::float2cpfloat(_moment)); + cpBodySetMoment(_cpBody, PhysicsHelper::float2cpfloat(_moment)); } } @@ -581,22 +574,22 @@ void PhysicsBody::setVelocity(const Vec2& velocity) return; } - cpBodySetVel(_info->getBody(), PhysicsHelper::point2cpv(velocity)); + cpBodySetVel(_cpBody, PhysicsHelper::point2cpv(velocity)); } Vec2 PhysicsBody::getVelocity() { - return PhysicsHelper::cpv2point(cpBodyGetVel(_info->getBody())); + return PhysicsHelper::cpv2point(cpBodyGetVel(_cpBody)); } Vec2 PhysicsBody::getVelocityAtLocalPoint(const Vec2& point) { - return PhysicsHelper::cpv2point(cpBodyGetVelAtLocalPoint(_info->getBody(), PhysicsHelper::point2cpv(point))); + return PhysicsHelper::cpv2point(cpBodyGetVelAtLocalPoint(_cpBody, PhysicsHelper::point2cpv(point))); } Vec2 PhysicsBody::getVelocityAtWorldPoint(const Vec2& point) { - return PhysicsHelper::cpv2point(cpBodyGetVelAtWorldPoint(_info->getBody(), PhysicsHelper::point2cpv(point))); + return PhysicsHelper::cpv2point(cpBodyGetVelAtWorldPoint(_cpBody, PhysicsHelper::point2cpv(point))); } void PhysicsBody::setAngularVelocity(float velocity) @@ -607,32 +600,32 @@ void PhysicsBody::setAngularVelocity(float velocity) return; } - cpBodySetAngVel(_info->getBody(), PhysicsHelper::float2cpfloat(velocity)); + cpBodySetAngVel(_cpBody, PhysicsHelper::float2cpfloat(velocity)); } float PhysicsBody::getAngularVelocity() { - return PhysicsHelper::cpfloat2float(cpBodyGetAngVel(_info->getBody())); + return PhysicsHelper::cpfloat2float(cpBodyGetAngVel(_cpBody)); } void PhysicsBody::setVelocityLimit(float limit) { - cpBodySetVelLimit(_info->getBody(), PhysicsHelper::float2cpfloat(limit)); + cpBodySetVelLimit(_cpBody, PhysicsHelper::float2cpfloat(limit)); } float PhysicsBody::getVelocityLimit() { - return PhysicsHelper::cpfloat2float(cpBodyGetVelLimit(_info->getBody())); + return PhysicsHelper::cpfloat2float(cpBodyGetVelLimit(_cpBody)); } void PhysicsBody::setAngularVelocityLimit(float limit) { - cpBodySetAngVelLimit(_info->getBody(), PhysicsHelper::float2cpfloat(limit)); + cpBodySetAngVelLimit(_cpBody, PhysicsHelper::float2cpfloat(limit)); } float PhysicsBody::getAngularVelocityLimit() { - return PhysicsHelper::cpfloat2float(cpBodyGetAngVelLimit(_info->getBody())); + return PhysicsHelper::cpfloat2float(cpBodyGetAngVelLimit(_cpBody)); } void PhysicsBody::setMoment(float moment) @@ -643,7 +636,7 @@ void PhysicsBody::setMoment(float moment) // the static body's mass and moment is always infinity if (_rotationEnabled && _dynamic) { - cpBodySetMoment(_info->getBody(), PhysicsHelper::float2cpfloat(_moment)); + cpBodySetMoment(_cpBody, PhysicsHelper::float2cpfloat(_moment)); } } @@ -755,17 +748,17 @@ void PhysicsBody::setEnable(bool enable) bool PhysicsBody::isResting() const { - return CP_PRIVATE(_info->getBody()->node).root != ((cpBody*)0); + return CP_PRIVATE(_cpBody->node).root != ((cpBody*)0); } void PhysicsBody::setResting(bool rest) const { if (rest && !isResting()) { - cpBodySleep(_info->getBody()); + cpBodySleep(_cpBody); }else if(!rest && isResting()) { - cpBodyActivate(_info->getBody()); + cpBodyActivate(_cpBody); } } @@ -798,9 +791,9 @@ void PhysicsBody::update(float delta) // damping compute if (_isDamping && _dynamic && !isResting()) { - _info->getBody()->v.x *= cpfclamp(1.0f - delta * _linearDamping, 0.0f, 1.0f); - _info->getBody()->v.y *= cpfclamp(1.0f - delta * _linearDamping, 0.0f, 1.0f); - _info->getBody()->w *= cpfclamp(1.0f - delta * _angularDamping, 0.0f, 1.0f); + _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); } } } @@ -917,12 +910,12 @@ float PhysicsBody::getRotationOffset() const Vec2 PhysicsBody::world2Local(const Vec2& point) { - return PhysicsHelper::cpv2point(cpBodyWorld2Local(_info->getBody(), PhysicsHelper::point2cpv(point))); + return PhysicsHelper::cpv2point(cpBodyWorld2Local(_cpBody, PhysicsHelper::point2cpv(point))); } Vec2 PhysicsBody::local2World(const Vec2& point) { - return PhysicsHelper::cpv2point(cpBodyLocal2World(_info->getBody(), PhysicsHelper::point2cpv(point))); + return PhysicsHelper::cpv2point(cpBodyLocal2World(_cpBody, PhysicsHelper::point2cpv(point))); } NS_CC_END diff --git a/cocos/physics/CCPhysicsBody.h b/cocos/physics/CCPhysicsBody.h index 26562fef98..8b4babe4cf 100644 --- a/cocos/physics/CCPhysicsBody.h +++ b/cocos/physics/CCPhysicsBody.h @@ -33,13 +33,14 @@ #include "physics/CCPhysicsShape.h" #include "base/CCVector.h" +struct cpBody; + NS_CC_BEGIN class Node; class Sprite; class PhysicsWorld; class PhysicsJoint; -class PhysicsBodyInfo; typedef Vec2 Vect; @@ -296,6 +297,8 @@ public: Vec2 world2Local(const Vec2& point); /** convert the local point to world */ Vec2 local2World(const Vec2& point); + + cpBody* getCPBody() { return _cpBody; } protected: @@ -322,7 +325,7 @@ protected: std::vector _joints; Vector _shapes; PhysicsWorld* _world; - PhysicsBodyInfo* _info; + cpBody* _cpBody; bool _dynamic; bool _enabled; bool _rotationEnabled; diff --git a/cocos/physics/CCPhysicsContact.cpp b/cocos/physics/CCPhysicsContact.cpp index 3608afd69f..35c57316b8 100644 --- a/cocos/physics/CCPhysicsContact.cpp +++ b/cocos/physics/CCPhysicsContact.cpp @@ -25,11 +25,8 @@ #if CC_USE_PHYSICS #include "chipmunk.h" -#include "physics/CCPhysicsBody.h" - -#include "chipmunk/CCPhysicsContactInfo_chipmunk.h" -#include "chipmunk/CCPhysicsHelper_chipmunk.h" - +#include "CCPhysicsBody.h" +#include "CCPhysicsHelper.h" #include "base/CCEventCustom.h" NS_CC_BEGIN @@ -42,7 +39,6 @@ PhysicsContact::PhysicsContact() , _shapeA(nullptr) , _shapeB(nullptr) , _eventCode(EventCode::NONE) -, _info(nullptr) , _notificationEnable(true) , _result(true) , _data(nullptr) @@ -55,7 +51,6 @@ PhysicsContact::PhysicsContact() PhysicsContact::~PhysicsContact() { - CC_SAFE_DELETE(_info); CC_SAFE_DELETE(_contactData); CC_SAFE_DELETE(_preContactData); } @@ -78,8 +73,6 @@ bool PhysicsContact::init(PhysicsShape* a, PhysicsShape* b) { CC_BREAK_IF(a == nullptr || b == nullptr); - CC_BREAK_IF(!(_info = new (std::nothrow) PhysicsContactInfo(this))); - _shapeA = a; _shapeB = b; diff --git a/cocos/physics/CCPhysicsContact.h b/cocos/physics/CCPhysicsContact.h index eee9727560..c074cd8325 100644 --- a/cocos/physics/CCPhysicsContact.h +++ b/cocos/physics/CCPhysicsContact.h @@ -40,8 +40,6 @@ class PhysicsShape; class PhysicsBody; class PhysicsWorld; -class PhysicsContactInfo; - typedef Vec2 Vect; typedef struct CC_DLL PhysicsContactData @@ -112,7 +110,6 @@ private: PhysicsShape* _shapeA; PhysicsShape* _shapeB; EventCode _eventCode; - PhysicsContactInfo* _info; bool _notificationEnable; bool _result; diff --git a/cocos/physics/chipmunk/CCPhysicsHelper_chipmunk.h b/cocos/physics/CCPhysicsHelper.h similarity index 100% rename from cocos/physics/chipmunk/CCPhysicsHelper_chipmunk.h rename to cocos/physics/CCPhysicsHelper.h diff --git a/cocos/physics/CCPhysicsJoint.cpp b/cocos/physics/CCPhysicsJoint.cpp index 86ebf86ecc..b9628ca88c 100644 --- a/cocos/physics/CCPhysicsJoint.cpp +++ b/cocos/physics/CCPhysicsJoint.cpp @@ -26,13 +26,9 @@ #if CC_USE_PHYSICS #include "chipmunk.h" -#include "physics/CCPhysicsBody.h" -#include "physics/CCPhysicsWorld.h" - -#include "chipmunk/CCPhysicsJointInfo_chipmunk.h" -#include "chipmunk/CCPhysicsBodyInfo_chipmunk.h" -#include "chipmunk/CCPhysicsShapeInfo_chipmunk.h" -#include "chipmunk/CCPhysicsHelper_chipmunk.h" +#include "CCPhysicsBody.h" +#include "CCPhysicsWorld.h" +#include "CCPhysicsHelper.h" #include "2d/CCNode.h" NS_CC_BEGIN @@ -41,7 +37,6 @@ PhysicsJoint::PhysicsJoint() : _bodyA(nullptr) , _bodyB(nullptr) , _world(nullptr) -, _info(nullptr) , _enable(false) , _collisionEnable(true) , _destoryMark(false) @@ -55,7 +50,10 @@ PhysicsJoint::~PhysicsJoint() // reset the shapes collision group setCollisionEnable(true); - CC_SAFE_DELETE(_info); + for (auto constraint : _cpConstraints) + { + cpConstraintFree(constraint); + } } bool PhysicsJoint::init(cocos2d::PhysicsBody *a, cocos2d::PhysicsBody *b) @@ -65,8 +63,6 @@ bool PhysicsJoint::init(cocos2d::PhysicsBody *a, cocos2d::PhysicsBody *b) CCASSERT(a != nullptr && b != nullptr, "the body passed in is nil"); CCASSERT(a != b, "the two bodies are equal"); - CC_BREAK_IF(!(_info = new (std::nothrow) PhysicsJointInfo(this))); - _bodyA = a; _bodyA->_joints.push_back(this); _bodyB = b; @@ -97,11 +93,6 @@ void PhysicsJoint::setEnable(bool enable) } } -PhysicsBodyInfo* PhysicsJoint::getBodyInfo(PhysicsBody* body) const -{ - return body->_info; -} - Node* PhysicsJoint::getBodyNode(PhysicsBody* body) const { return body->_node; @@ -151,7 +142,7 @@ void PhysicsJoint::destroy(PhysicsJoint* joint) void PhysicsJoint::setMaxForce(float force) { - for (cpConstraint* joint : _info->getJoints()) + for (auto joint : _cpConstraints) { joint->maxForce = PhysicsHelper::float2cpfloat(force); } @@ -159,7 +150,7 @@ void PhysicsJoint::setMaxForce(float force) float PhysicsJoint::getMaxForce() const { - return PhysicsHelper::cpfloat2float(_info->getJoints().front()->maxForce); + return PhysicsHelper::cpfloat2float(_cpConstraints.front()->maxForce); } PhysicsJointFixed* PhysicsJointFixed::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr) @@ -185,15 +176,15 @@ bool PhysicsJointFixed::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr) getBodyNode(b)->setPosition(anchr); // add a pivot joint to fixed two body together - cpConstraint* joint = cpPivotJointNew(getBodyInfo(a)->getBody(), getBodyInfo(b)->getBody(), + auto constraint = cpPivotJointNew(a->getCPBody(), b->getCPBody(), PhysicsHelper::point2cpv(anchr)); - CC_BREAK_IF(joint == nullptr); - _info->add(joint); + CC_BREAK_IF(constraint == nullptr); + _cpConstraints.push_back(constraint); // add a gear joint to make two body have the same rotation. - joint = cpGearJointNew(getBodyInfo(a)->getBody(), getBodyInfo(b)->getBody(), 0, 1); - CC_BREAK_IF(joint == nullptr); - _info->add(joint); + constraint = cpGearJointNew(a->getCPBody(), b->getCPBody(), 0, 1); + CC_BREAK_IF(constraint == nullptr); + _cpConstraints.push_back(constraint); setCollisionEnable(false); @@ -221,12 +212,12 @@ bool PhysicsJointPin::init(PhysicsBody *a, PhysicsBody *b, const Vec2& anchr) do { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpPivotJointNew(getBodyInfo(a)->getBody(), getBodyInfo(b)->getBody(), + auto constraint = cpPivotJointNew(a->getCPBody(), b->getCPBody(), PhysicsHelper::point2cpv(anchr)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -258,15 +249,15 @@ bool PhysicsJointLimit::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpSlideJointNew(getBodyInfo(a)->getBody(), getBodyInfo(b)->getBody(), + auto constraint = cpSlideJointNew(a->getCPBody(), b->getCPBody(), PhysicsHelper::point2cpv(anchr1), PhysicsHelper::point2cpv(anchr2), PhysicsHelper::float2cpfloat(min), PhysicsHelper::float2cpfloat(max)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -276,42 +267,42 @@ bool PhysicsJointLimit::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, float PhysicsJointLimit::getMin() const { - return PhysicsHelper::cpfloat2float(cpSlideJointGetMin(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpSlideJointGetMin(_cpConstraints.front())); } void PhysicsJointLimit::setMin(float min) { - cpSlideJointSetMin(_info->getJoints().front(), PhysicsHelper::float2cpfloat(min)); + cpSlideJointSetMin(_cpConstraints.front(), PhysicsHelper::float2cpfloat(min)); } float PhysicsJointLimit::getMax() const { - return PhysicsHelper::cpfloat2float(cpSlideJointGetMax(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpSlideJointGetMax(_cpConstraints.front())); } void PhysicsJointLimit::setMax(float max) { - cpSlideJointSetMax(_info->getJoints().front(), PhysicsHelper::float2cpfloat(max)); + cpSlideJointSetMax(_cpConstraints.front(), PhysicsHelper::float2cpfloat(max)); } Vec2 PhysicsJointLimit::getAnchr1() const { - return PhysicsHelper::cpv2point(cpSlideJointGetAnchr1(_info->getJoints().front())); + return PhysicsHelper::cpv2point(cpSlideJointGetAnchr1(_cpConstraints.front())); } void PhysicsJointLimit::setAnchr1(const Vec2& anchr) { - cpSlideJointSetAnchr1(_info->getJoints().front(), PhysicsHelper::point2cpv(anchr)); + cpSlideJointSetAnchr1(_cpConstraints.front(), PhysicsHelper::point2cpv(anchr)); } Vec2 PhysicsJointLimit::getAnchr2() const { - return PhysicsHelper::cpv2point(cpSlideJointGetAnchr2(_info->getJoints().front())); + return PhysicsHelper::cpv2point(cpSlideJointGetAnchr2(_cpConstraints.front())); } void PhysicsJointLimit::setAnchr2(const Vec2& anchr) { - cpSlideJointSetAnchr1(_info->getJoints().front(), PhysicsHelper::point2cpv(anchr)); + cpSlideJointSetAnchr1(_cpConstraints.front(), PhysicsHelper::point2cpv(anchr)); } PhysicsJointDistance* PhysicsJointDistance::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2) @@ -333,14 +324,14 @@ bool PhysicsJointDistance::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anch { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpPinJointNew(getBodyInfo(a)->getBody(), - getBodyInfo(b)->getBody(), + auto constraint = cpPinJointNew(a->getCPBody(), + b->getCPBody(), PhysicsHelper::point2cpv(anchr1), PhysicsHelper::point2cpv(anchr2)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -350,12 +341,12 @@ bool PhysicsJointDistance::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anch float PhysicsJointDistance::getDistance() const { - return PhysicsHelper::cpfloat2float(cpPinJointGetDist(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpPinJointGetDist(_cpConstraints.front())); } void PhysicsJointDistance::setDistance(float distance) { - cpPinJointSetDist(_info->getJoints().front(), PhysicsHelper::float2cpfloat(distance)); + cpPinJointSetDist(_cpConstraints.front(), PhysicsHelper::float2cpfloat(distance)); } PhysicsJointSpring* PhysicsJointSpring::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2, float stiffness, float damping) @@ -376,17 +367,17 @@ bool PhysicsJointSpring::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1 do { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpDampedSpringNew(getBodyInfo(a)->getBody(), - getBodyInfo(b)->getBody(), + auto constraint = cpDampedSpringNew(a->getCPBody(), + b->getCPBody(), PhysicsHelper::point2cpv(anchr1), PhysicsHelper::point2cpv(anchr2), PhysicsHelper::float2cpfloat(_bodyB->local2World(anchr1).getDistance(_bodyA->local2World(anchr2))), PhysicsHelper::float2cpfloat(stiffness), PhysicsHelper::float2cpfloat(damping)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -396,52 +387,52 @@ bool PhysicsJointSpring::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1 Vec2 PhysicsJointSpring::getAnchr1() const { - return PhysicsHelper::cpv2point(cpDampedSpringGetAnchr1(_info->getJoints().front())); + return PhysicsHelper::cpv2point(cpDampedSpringGetAnchr1(_cpConstraints.front())); } void PhysicsJointSpring::setAnchr1(const Vec2& anchr) { - cpDampedSpringSetAnchr1(_info->getJoints().front(), PhysicsHelper::point2cpv(anchr)); + cpDampedSpringSetAnchr1(_cpConstraints.front(), PhysicsHelper::point2cpv(anchr)); } Vec2 PhysicsJointSpring::getAnchr2() const { - return PhysicsHelper::cpv2point(cpDampedSpringGetAnchr2(_info->getJoints().front())); + return PhysicsHelper::cpv2point(cpDampedSpringGetAnchr2(_cpConstraints.front())); } void PhysicsJointSpring::setAnchr2(const Vec2& anchr) { - cpDampedSpringSetAnchr1(_info->getJoints().front(), PhysicsHelper::point2cpv(anchr)); + cpDampedSpringSetAnchr1(_cpConstraints.front(), PhysicsHelper::point2cpv(anchr)); } float PhysicsJointSpring::getRestLength() const { - return PhysicsHelper::cpfloat2float(cpDampedSpringGetRestLength(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpDampedSpringGetRestLength(_cpConstraints.front())); } void PhysicsJointSpring::setRestLength(float restLength) { - cpDampedSpringSetRestLength(_info->getJoints().front(), PhysicsHelper::float2cpfloat(restLength)); + cpDampedSpringSetRestLength(_cpConstraints.front(), PhysicsHelper::float2cpfloat(restLength)); } float PhysicsJointSpring::getStiffness() const { - return PhysicsHelper::cpfloat2float(cpDampedSpringGetStiffness(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpDampedSpringGetStiffness(_cpConstraints.front())); } void PhysicsJointSpring::setStiffness(float stiffness) { - cpDampedSpringSetStiffness(_info->getJoints().front(), PhysicsHelper::float2cpfloat(stiffness)); + cpDampedSpringSetStiffness(_cpConstraints.front(), PhysicsHelper::float2cpfloat(stiffness)); } float PhysicsJointSpring::getDamping() const { - return PhysicsHelper::cpfloat2float(cpDampedSpringGetDamping(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpDampedSpringGetDamping(_cpConstraints.front())); } void PhysicsJointSpring::setDamping(float damping) { - cpDampedSpringSetDamping(_info->getJoints().front(), PhysicsHelper::float2cpfloat(damping)); + cpDampedSpringSetDamping(_cpConstraints.front(), PhysicsHelper::float2cpfloat(damping)); } PhysicsJointGroove* PhysicsJointGroove::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& grooveA, const Vec2& grooveB, const Vec2& anchr2) @@ -462,15 +453,15 @@ bool PhysicsJointGroove::init(PhysicsBody* a, PhysicsBody* b, const Vec2& groove do { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpGrooveJointNew(getBodyInfo(a)->getBody(), - getBodyInfo(b)->getBody(), + auto constraint = cpGrooveJointNew(a->getCPBody(), + b->getCPBody(), PhysicsHelper::point2cpv(grooveA), PhysicsHelper::point2cpv(grooveB), PhysicsHelper::point2cpv(anchr2)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -480,32 +471,32 @@ bool PhysicsJointGroove::init(PhysicsBody* a, PhysicsBody* b, const Vec2& groove Vec2 PhysicsJointGroove::getGrooveA() const { - return PhysicsHelper::cpv2point(cpGrooveJointGetGrooveA(_info->getJoints().front())); + return PhysicsHelper::cpv2point(cpGrooveJointGetGrooveA(_cpConstraints.front())); } void PhysicsJointGroove::setGrooveA(const Vec2& grooveA) { - cpGrooveJointSetGrooveA(_info->getJoints().front(), PhysicsHelper::point2cpv(grooveA)); + cpGrooveJointSetGrooveA(_cpConstraints.front(), PhysicsHelper::point2cpv(grooveA)); } Vec2 PhysicsJointGroove::getGrooveB() const { - return PhysicsHelper::cpv2point(cpGrooveJointGetGrooveB(_info->getJoints().front())); + return PhysicsHelper::cpv2point(cpGrooveJointGetGrooveB(_cpConstraints.front())); } void PhysicsJointGroove::setGrooveB(const Vec2& grooveB) { - cpGrooveJointSetGrooveB(_info->getJoints().front(), PhysicsHelper::point2cpv(grooveB)); + cpGrooveJointSetGrooveB(_cpConstraints.front(), PhysicsHelper::point2cpv(grooveB)); } Vec2 PhysicsJointGroove::getAnchr2() const { - return PhysicsHelper::cpv2point(cpGrooveJointGetAnchr2(_info->getJoints().front())); + return PhysicsHelper::cpv2point(cpGrooveJointGetAnchr2(_cpConstraints.front())); } void PhysicsJointGroove::setAnchr2(const Vec2& anchr2) { - cpGrooveJointSetAnchr2(_info->getJoints().front(), PhysicsHelper::point2cpv(anchr2)); + cpGrooveJointSetAnchr2(_cpConstraints.front(), PhysicsHelper::point2cpv(anchr2)); } PhysicsJointRotarySpring* PhysicsJointRotarySpring::construct(PhysicsBody* a, PhysicsBody* b, float stiffness, float damping) @@ -526,15 +517,15 @@ bool PhysicsJointRotarySpring::init(PhysicsBody* a, PhysicsBody* b, float stiffn do { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpDampedRotarySpringNew(getBodyInfo(a)->getBody(), - getBodyInfo(b)->getBody(), + auto constraint = cpDampedRotarySpringNew(a->getCPBody(), + b->getCPBody(), PhysicsHelper::float2cpfloat(_bodyB->getRotation() - _bodyA->getRotation()), PhysicsHelper::float2cpfloat(stiffness), PhysicsHelper::float2cpfloat(damping)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -544,32 +535,32 @@ bool PhysicsJointRotarySpring::init(PhysicsBody* a, PhysicsBody* b, float stiffn float PhysicsJointRotarySpring::getRestAngle() const { - return PhysicsHelper::cpfloat2float(cpDampedRotarySpringGetRestAngle(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpDampedRotarySpringGetRestAngle(_cpConstraints.front())); } void PhysicsJointRotarySpring::setRestAngle(float restAngle) { - cpDampedRotarySpringSetRestAngle(_info->getJoints().front(), PhysicsHelper::float2cpfloat(restAngle)); + cpDampedRotarySpringSetRestAngle(_cpConstraints.front(), PhysicsHelper::float2cpfloat(restAngle)); } float PhysicsJointRotarySpring::getStiffness() const { - return PhysicsHelper::cpfloat2float(cpDampedRotarySpringGetStiffness(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpDampedRotarySpringGetStiffness(_cpConstraints.front())); } void PhysicsJointRotarySpring::setStiffness(float stiffness) { - cpDampedRotarySpringSetStiffness(_info->getJoints().front(), PhysicsHelper::float2cpfloat(stiffness)); + cpDampedRotarySpringSetStiffness(_cpConstraints.front(), PhysicsHelper::float2cpfloat(stiffness)); } float PhysicsJointRotarySpring::getDamping() const { - return PhysicsHelper::cpfloat2float(cpDampedRotarySpringGetDamping(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpDampedRotarySpringGetDamping(_cpConstraints.front())); } void PhysicsJointRotarySpring::setDamping(float damping) { - cpDampedRotarySpringSetDamping(_info->getJoints().front(), PhysicsHelper::float2cpfloat(damping)); + cpDampedRotarySpringSetDamping(_cpConstraints.front(), PhysicsHelper::float2cpfloat(damping)); } PhysicsJointRotaryLimit* PhysicsJointRotaryLimit::construct(PhysicsBody* a, PhysicsBody* b, float min, float max) @@ -596,14 +587,14 @@ bool PhysicsJointRotaryLimit::init(PhysicsBody* a, PhysicsBody* b, float min, fl { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpRotaryLimitJointNew(getBodyInfo(a)->getBody(), - getBodyInfo(b)->getBody(), + auto constraint = cpRotaryLimitJointNew(a->getCPBody(), + b->getCPBody(), PhysicsHelper::float2cpfloat(min), PhysicsHelper::float2cpfloat(max)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -613,22 +604,22 @@ bool PhysicsJointRotaryLimit::init(PhysicsBody* a, PhysicsBody* b, float min, fl float PhysicsJointRotaryLimit::getMin() const { - return PhysicsHelper::cpfloat2float(cpRotaryLimitJointGetMin(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpRotaryLimitJointGetMin(_cpConstraints.front())); } void PhysicsJointRotaryLimit::setMin(float min) { - cpRotaryLimitJointSetMin(_info->getJoints().front(), PhysicsHelper::float2cpfloat(min)); + cpRotaryLimitJointSetMin(_cpConstraints.front(), PhysicsHelper::float2cpfloat(min)); } float PhysicsJointRotaryLimit::getMax() const { - return PhysicsHelper::cpfloat2float(cpRotaryLimitJointGetMax(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpRotaryLimitJointGetMax(_cpConstraints.front())); } void PhysicsJointRotaryLimit::setMax(float max) { - cpRotaryLimitJointSetMax(_info->getJoints().front(), PhysicsHelper::float2cpfloat(max)); + cpRotaryLimitJointSetMax(_cpConstraints.front(), PhysicsHelper::float2cpfloat(max)); } PhysicsJointRatchet* PhysicsJointRatchet::construct(PhysicsBody* a, PhysicsBody* b, float phase, float ratchet) @@ -650,14 +641,14 @@ bool PhysicsJointRatchet::init(PhysicsBody* a, PhysicsBody* b, float phase, floa { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpRatchetJointNew(getBodyInfo(a)->getBody(), - getBodyInfo(b)->getBody(), + auto constraint = cpRatchetJointNew(a->getCPBody(), + b->getCPBody(), PhysicsHelper::float2cpfloat(phase), PhysicsHelper::cpfloat2float(ratchet)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -667,32 +658,32 @@ bool PhysicsJointRatchet::init(PhysicsBody* a, PhysicsBody* b, float phase, floa float PhysicsJointRatchet::getAngle() const { - return PhysicsHelper::cpfloat2float(cpRatchetJointGetAngle(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpRatchetJointGetAngle(_cpConstraints.front())); } void PhysicsJointRatchet::setAngle(float angle) { - cpRatchetJointSetAngle(_info->getJoints().front(), PhysicsHelper::float2cpfloat(angle)); + cpRatchetJointSetAngle(_cpConstraints.front(), PhysicsHelper::float2cpfloat(angle)); } float PhysicsJointRatchet::getPhase() const { - return PhysicsHelper::cpfloat2float(cpRatchetJointGetPhase(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpRatchetJointGetPhase(_cpConstraints.front())); } void PhysicsJointRatchet::setPhase(float phase) { - cpRatchetJointSetPhase(_info->getJoints().front(), PhysicsHelper::float2cpfloat(phase)); + cpRatchetJointSetPhase(_cpConstraints.front(), PhysicsHelper::float2cpfloat(phase)); } float PhysicsJointRatchet::getRatchet() const { - return PhysicsHelper::cpfloat2float(cpRatchetJointGetRatchet(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpRatchetJointGetRatchet(_cpConstraints.front())); } void PhysicsJointRatchet::setRatchet(float ratchet) { - cpRatchetJointSetRatchet(_info->getJoints().front(), PhysicsHelper::float2cpfloat(ratchet)); + cpRatchetJointSetRatchet(_cpConstraints.front(), PhysicsHelper::float2cpfloat(ratchet)); } PhysicsJointGear* PhysicsJointGear::construct(PhysicsBody* a, PhysicsBody* b, float phase, float ratchet) @@ -714,14 +705,14 @@ bool PhysicsJointGear::init(PhysicsBody* a, PhysicsBody* b, float phase, float r { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpGearJointNew(getBodyInfo(a)->getBody(), - getBodyInfo(b)->getBody(), + auto constraint = cpGearJointNew(a->getCPBody(), + b->getCPBody(), PhysicsHelper::float2cpfloat(phase), PhysicsHelper::float2cpfloat(ratio)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -731,22 +722,22 @@ bool PhysicsJointGear::init(PhysicsBody* a, PhysicsBody* b, float phase, float r float PhysicsJointGear::getPhase() const { - return PhysicsHelper::cpfloat2float(cpGearJointGetPhase(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpGearJointGetPhase(_cpConstraints.front())); } void PhysicsJointGear::setPhase(float phase) { - cpGearJointSetPhase(_info->getJoints().front(), PhysicsHelper::float2cpfloat(phase)); + cpGearJointSetPhase(_cpConstraints.front(), PhysicsHelper::float2cpfloat(phase)); } float PhysicsJointGear::getRatio() const { - return PhysicsHelper::cpfloat2float(cpGearJointGetRatio(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpGearJointGetRatio(_cpConstraints.front())); } void PhysicsJointGear::setRatio(float ratio) { - cpGearJointSetRatio(_info->getJoints().front(), PhysicsHelper::float2cpfloat(ratio)); + cpGearJointSetRatio(_cpConstraints.front(), PhysicsHelper::float2cpfloat(ratio)); } PhysicsJointMotor* PhysicsJointMotor::construct(PhysicsBody* a, PhysicsBody* b, float rate) @@ -768,13 +759,13 @@ bool PhysicsJointMotor::init(PhysicsBody* a, PhysicsBody* b, float rate) { CC_BREAK_IF(!PhysicsJoint::init(a, b)); - cpConstraint* joint = cpSimpleMotorNew(getBodyInfo(a)->getBody(), - getBodyInfo(b)->getBody(), + auto constraint = cpSimpleMotorNew(a->getCPBody(), + b->getCPBody(), PhysicsHelper::float2cpfloat(rate)); - CC_BREAK_IF(joint == nullptr); + CC_BREAK_IF(constraint == nullptr); - _info->add(joint); + _cpConstraints.push_back(constraint); return true; } while (false); @@ -784,12 +775,12 @@ bool PhysicsJointMotor::init(PhysicsBody* a, PhysicsBody* b, float rate) float PhysicsJointMotor::getRate() const { - return PhysicsHelper::cpfloat2float(cpSimpleMotorGetRate(_info->getJoints().front())); + return PhysicsHelper::cpfloat2float(cpSimpleMotorGetRate(_cpConstraints.front())); } void PhysicsJointMotor::setRate(float rate) { - cpSimpleMotorSetRate(_info->getJoints().front(), PhysicsHelper::float2cpfloat(rate)); + cpSimpleMotorSetRate(_cpConstraints.front(), PhysicsHelper::float2cpfloat(rate)); } NS_CC_END diff --git a/cocos/physics/CCPhysicsJoint.h b/cocos/physics/CCPhysicsJoint.h index 9861bc9a63..6fcb53f96c 100644 --- a/cocos/physics/CCPhysicsJoint.h +++ b/cocos/physics/CCPhysicsJoint.h @@ -31,13 +31,13 @@ #include "base/CCRef.h" #include "math/CCGeometry.h" +struct cpConstraint; + NS_CC_BEGIN class Node; class PhysicsBody; class PhysicsWorld; -class PhysicsJointInfo; -class PhysicsBodyInfo; /* * @brief An PhysicsJoint object connects two physics bodies together. @@ -72,18 +72,13 @@ public: protected: bool init(PhysicsBody* a, PhysicsBody* b); - - /** - * PhysicsShape is PhysicsBody's friend class, but all the subclasses isn't. so this method is use for subclasses to catch the bodyInfo from PhysicsBody. - */ - PhysicsBodyInfo* getBodyInfo(PhysicsBody* body) const; Node* getBodyNode(PhysicsBody* body) const; protected: PhysicsBody* _bodyA; PhysicsBody* _bodyB; PhysicsWorld* _world; - PhysicsJointInfo* _info; + std::vector _cpConstraints; bool _enable; bool _collisionEnable; bool _destoryMark; diff --git a/cocos/physics/CCPhysicsShape.cpp b/cocos/physics/CCPhysicsShape.cpp index 67a0df35a2..db851cd299 100644 --- a/cocos/physics/CCPhysicsShape.cpp +++ b/cocos/physics/CCPhysicsShape.cpp @@ -26,23 +26,22 @@ #if CC_USE_PHYSICS #include +#include #include "chipmunk.h" #include "chipmunk_unsafe.h" -#include "physics/CCPhysicsBody.h" -#include "physics/CCPhysicsWorld.h" - -#include "chipmunk/CCPhysicsBodyInfo_chipmunk.h" -#include "chipmunk/CCPhysicsShapeInfo_chipmunk.h" -#include "chipmunk/CCPhysicsHelper_chipmunk.h" +#include "CCPhysicsBody.h" +#include "CCPhysicsWorld.h" +#include "CCPhysicsHelper.h" NS_CC_BEGIN extern const float PHYSICS_INFINITY; +std::unordered_map s_physicsShapeMap; +static cpBody* s_sharedBody = nullptr; PhysicsShape::PhysicsShape() : _body(nullptr) -, _info(nullptr) , _type(Type::UNKNOWN) , _area(0.0f) , _mass(0.0f) @@ -58,22 +57,20 @@ PhysicsShape::PhysicsShape() , _contactTestBitmask(0) , _group(0) { - + if (s_sharedBody == nullptr) + { + s_sharedBody = cpBodyNewStatic(); + } } PhysicsShape::~PhysicsShape() { - CC_SAFE_DELETE(_info); -} + for (auto shape : _cpShapes) + { + s_physicsShapeMap.erase(shape); -bool PhysicsShape::init(Type type) -{ - _info = new (std::nothrow) PhysicsShapeInfo(this); - if (_info == nullptr) return false; - - _type = type; - - return true; + cpShapeFree(shape); + } } void PhysicsShape::setMass(float mass) @@ -115,17 +112,6 @@ void PhysicsShape::setMaterial(const PhysicsMaterial& material) setFriction(material.friction); } -PhysicsBodyInfo* PhysicsShape::bodyInfo() const -{ - if (_body != nullptr) - { - return _body->_info; - }else - { - return nullptr; - } -} - void PhysicsShape::setScale(float scale) { setScaleX(scale); @@ -172,6 +158,16 @@ void PhysicsShape::update(float delta) } } +void PhysicsShape::addShape(cpShape* shape) +{ + if (shape) + { + cpShapeSetGroup(shape, _group); + _cpShapes.push_back(shape); + s_physicsShapeMap.insert(std::pair(shape, this)); + } +} + PhysicsShapeCircle::PhysicsShapeCircle() { @@ -264,7 +260,7 @@ void PhysicsShape::setRestitution(float restitution) { _material.restitution = restitution; - for (cpShape* shape : _info->getShapes()) + for (cpShape* shape : _cpShapes) { cpShapeSetElasticity(shape, PhysicsHelper::float2cpfloat(restitution)); } @@ -274,7 +270,7 @@ void PhysicsShape::setFriction(float friction) { _material.friction = friction; - for (cpShape* shape : _info->getShapes()) + for (cpShape* shape : _cpShapes) { cpShapeSetFriction(shape, PhysicsHelper::float2cpfloat(friction)); } @@ -309,25 +305,21 @@ Vec2 PhysicsShape::getPolyonCenter(const Vec2* points, int count) void PhysicsShape::setBody(PhysicsBody *body) { // already added - if (body != nullptr && _body == body) + if (body && _body == body) { return; } - if (_body != nullptr) + if (_body) { _body->removeShape(this); } - if (body == nullptr) + for (auto shape : _cpShapes) { - _info->setBody(nullptr); - _body = nullptr; - }else - { - _info->setBody(body->_info->getBody()); - _body = body; + cpShapeSetBody(shape, body == nullptr ? s_sharedBody : body->_cpBody); } + _body = body; } // PhysicsShapeCircle @@ -348,13 +340,13 @@ bool PhysicsShapeCircle::init(float radius, const PhysicsMaterial& material/* = { do { - CC_BREAK_IF(!PhysicsShape::init(Type::CIRCLE)); + _type = Type::CIRCLE; - cpShape* shape = cpCircleShapeNew(_info->getSharedBody(), radius, PhysicsHelper::point2cpv(offset)); + auto shape = cpCircleShapeNew(s_sharedBody, radius, PhysicsHelper::point2cpv(offset)); CC_BREAK_IF(shape == nullptr); - _info->add(shape); + addShape(shape); _area = calculateArea(); _mass = material.density == PHYSICS_INFINITY ? PHYSICS_INFINITY : material.density * _area; @@ -383,12 +375,12 @@ float PhysicsShapeCircle::calculateMoment(float mass, float radius, const Vec2& float PhysicsShapeCircle::calculateArea() { - return PhysicsHelper::cpfloat2float(cpAreaForCircle(0, cpCircleShapeGetRadius(_info->getShapes().front()))); + return PhysicsHelper::cpfloat2float(cpAreaForCircle(0, cpCircleShapeGetRadius(_cpShapes.front()))); } float PhysicsShapeCircle::calculateDefaultMoment() { - cpShape* shape = _info->getShapes().front(); + auto shape = _cpShapes.front(); return _mass == PHYSICS_INFINITY ? PHYSICS_INFINITY : PhysicsHelper::cpfloat2float(cpMomentForCircle(PhysicsHelper::float2cpfloat(_mass), @@ -399,12 +391,12 @@ float PhysicsShapeCircle::calculateDefaultMoment() float PhysicsShapeCircle::getRadius() const { - return PhysicsHelper::cpfloat2float(cpCircleShapeGetRadius(_info->getShapes().front())); + return PhysicsHelper::cpfloat2float(cpCircleShapeGetRadius(_cpShapes.front())); } Vec2 PhysicsShapeCircle::getOffset() { - return PhysicsHelper::cpv2point(cpCircleShapeGetOffset(_info->getShapes().front())); + return PhysicsHelper::cpv2point(cpCircleShapeGetOffset(_cpShapes.front())); } void PhysicsShapeCircle::setScale(float scale) @@ -450,13 +442,12 @@ void PhysicsShapeCircle::setScaleY(float scale) void PhysicsShapeCircle::update(float delta) { - if (_dirty) { cpFloat factor = std::abs(PhysicsHelper::float2cpfloat( _newScaleX / _scaleX )); - cpShape* shape = _info->getShapes().front(); - cpVect v = cpCircleShapeGetOffset(shape); + auto shape = _cpShapes.front(); + auto v = cpCircleShapeGetOffset(shape); v = cpvmult(v, PhysicsHelper::float2cpfloat(factor)); ((cpCircleShape*)shape)->c = v; @@ -485,21 +476,20 @@ bool PhysicsShapeEdgeSegment::init(const Vec2& a, const Vec2& b, const PhysicsMa { do { - CC_BREAK_IF(!PhysicsShape::init(Type::EDGESEGMENT)); + _type = Type::EDGESEGMENT; - cpShape* shape = cpSegmentShapeNew(_info->getSharedBody(), + auto shape = cpSegmentShapeNew(s_sharedBody, PhysicsHelper::point2cpv(a), PhysicsHelper::point2cpv(b), PhysicsHelper::float2cpfloat(border)); CC_BREAK_IF(shape == nullptr); - _info->add(shape); + addShape(shape); _mass = PHYSICS_INFINITY; _moment = PHYSICS_INFINITY; - setMaterial(material); return true; @@ -510,18 +500,18 @@ bool PhysicsShapeEdgeSegment::init(const Vec2& a, const Vec2& b, const PhysicsMa Vec2 PhysicsShapeEdgeSegment::getPointA() const { - return PhysicsHelper::cpv2point(((cpSegmentShape*)(_info->getShapes().front()))->ta); + return PhysicsHelper::cpv2point(((cpSegmentShape*)(_cpShapes.front()))->ta); } Vec2 PhysicsShapeEdgeSegment::getPointB() const { - return PhysicsHelper::cpv2point(((cpSegmentShape*)(_info->getShapes().front()))->tb); + return PhysicsHelper::cpv2point(((cpSegmentShape*)(_cpShapes.front()))->tb); } Vec2 PhysicsShapeEdgeSegment::getCenter() { - Vec2 a = PhysicsHelper::cpv2point(cpSegmentShapeGetA(_info->getShapes().front())); - Vec2 b = PhysicsHelper::cpv2point(cpSegmentShapeGetB(_info->getShapes().front())); + auto a = PhysicsHelper::cpv2point(cpSegmentShapeGetA(_cpShapes.front())); + auto b = PhysicsHelper::cpv2point(cpSegmentShapeGetB(_cpShapes.front())); return ( a + b ) / 2; } @@ -529,14 +519,14 @@ void PhysicsShapeEdgeSegment::update(float delta) { if (_dirty) { - cpFloat factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); - cpFloat factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); + auto factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); + auto factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); - cpShape* shape = _info->getShapes().front(); - cpVect a = cpSegmentShapeGetA(shape); + auto shape = _cpShapes.front(); + auto a = cpSegmentShapeGetA(shape); a.x *= factorX; a.y *= factorY; - cpVect b = cpSegmentShapeGetB(shape); + auto b = cpSegmentShapeGetB(shape); b.x *= factorX; b.y *= factorY; cpSegmentShapeSetEndpoints(shape, a, b); @@ -563,19 +553,19 @@ bool PhysicsShapeBox::init(const Size& size, const PhysicsMaterial& material/* = { do { - CC_BREAK_IF(!PhysicsShape::init(Type::BOX)); + _type = Type::BOX; - cpVect wh = PhysicsHelper::size2cpv(size); + auto wh = PhysicsHelper::size2cpv(size); cpVect vec[4] = { {-wh.x/2.0f, -wh.y/2.0f}, {-wh.x/2.0f, wh.y/2.0f}, {wh.x/2.0f, wh.y/2.0f}, {wh.x/2.0f, -wh.y/2.0f} }; - cpShape* shape = cpPolyShapeNew(_info->getSharedBody(), 4, vec, PhysicsHelper::point2cpv(offset)); + auto shape = cpPolyShapeNew(s_sharedBody, 4, vec, PhysicsHelper::point2cpv(offset)); CC_BREAK_IF(shape == nullptr); - _info->add(shape); + addShape(shape); _area = calculateArea(); _mass = material.density == PHYSICS_INFINITY ? PHYSICS_INFINITY : material.density * _area; @@ -591,7 +581,7 @@ bool PhysicsShapeBox::init(const Size& size, const PhysicsMaterial& material/* = Size PhysicsShapeBox::getSize() const { - cpShape* shape = _info->getShapes().front(); + cpShape* shape = _cpShapes.front(); return PhysicsHelper::cpv2size(cpv(cpvdist(cpPolyShapeGetVert(shape, 1), cpPolyShapeGetVert(shape, 2)), cpvdist(cpPolyShapeGetVert(shape, 0), cpPolyShapeGetVert(shape, 1)))); } @@ -614,16 +604,16 @@ bool PhysicsShapePolygon::init(const Vec2* points, int count, const PhysicsMater { do { - CC_BREAK_IF(!PhysicsShape::init(Type::POLYGEN)); + _type = Type::POLYGEN; - cpVect* vecs = new cpVect[count]; + auto vecs = new cpVect[count]; PhysicsHelper::points2cpvs(points, vecs, count); - cpShape* shape = cpPolyShapeNew(_info->getSharedBody(), count, vecs, PhysicsHelper::point2cpv(offset)); + auto shape = cpPolyShapeNew(s_sharedBody, count, vecs, PhysicsHelper::point2cpv(offset)); CC_SAFE_DELETE_ARRAY(vecs); CC_BREAK_IF(shape == nullptr); - _info->add(shape); + addShape(shape); _area = calculateArea(); _mass = material.density == PHYSICS_INFINITY ? PHYSICS_INFINITY : material.density * _area; @@ -660,36 +650,36 @@ float PhysicsShapePolygon::calculateMoment(float mass, const Vec2* points, int c float PhysicsShapePolygon::calculateArea() { - cpShape* shape = _info->getShapes().front(); + auto shape = _cpShapes.front(); return PhysicsHelper::cpfloat2float(cpAreaForPoly(((cpPolyShape*)shape)->numVerts, ((cpPolyShape*)shape)->verts)); } float PhysicsShapePolygon::calculateDefaultMoment() { - cpShape* shape = _info->getShapes().front(); + auto shape = _cpShapes.front(); return _mass == PHYSICS_INFINITY ? PHYSICS_INFINITY : PhysicsHelper::cpfloat2float(cpMomentForPoly(_mass, ((cpPolyShape*)shape)->numVerts, ((cpPolyShape*)shape)->verts, cpvzero)); } Vec2 PhysicsShapePolygon::getPoint(int i) const { - return PhysicsHelper::cpv2point(cpPolyShapeGetVert(_info->getShapes().front(), i)); + return PhysicsHelper::cpv2point(cpPolyShapeGetVert(_cpShapes.front(), i)); } void PhysicsShapePolygon::getPoints(Vec2* outPoints) const { - cpShape* shape = _info->getShapes().front(); + auto shape = _cpShapes.front(); PhysicsHelper::cpvs2points(((cpPolyShape*)shape)->verts, outPoints, ((cpPolyShape*)shape)->numVerts); } int PhysicsShapePolygon::getPointsCount() const { - return ((cpPolyShape*)_info->getShapes().front())->numVerts; + return ((cpPolyShape*)_cpShapes.front())->numVerts; } Vec2 PhysicsShapePolygon::getCenter() { - return PhysicsHelper::cpv2point(cpCentroidForPoly(((cpPolyShape*)_info->getShapes().front())->numVerts, ((cpPolyShape*)_info->getShapes().front())->verts)); + return PhysicsHelper::cpv2point(cpCentroidForPoly(((cpPolyShape*)_cpShapes.front())->numVerts, ((cpPolyShape*)_cpShapes.front())->verts)); } void PhysicsShapePolygon::update(float delta) @@ -699,7 +689,7 @@ void PhysicsShapePolygon::update(float delta) cpFloat factorX = PhysicsHelper::float2cpfloat( _newScaleX / _scaleX ); cpFloat factorY = PhysicsHelper::float2cpfloat( _newScaleY / _scaleY ); - cpShape* shape = _info->getShapes().front(); + auto shape = _cpShapes.front(); int count = cpPolyShapeGetNumVerts(shape); cpVect* vects = ((cpPolyShape*)shape)->verts; cpSplittingPlane* planes = ((cpPolyShape*)shape)->planes; @@ -751,7 +741,7 @@ bool PhysicsShapeEdgeBox::init(const Size& size, const PhysicsMaterial& material { do { - CC_BREAK_IF(!PhysicsShape::init(Type::EDGEBOX)); + _type = Type::EDGEBOX; cpVect vec[4] = {}; vec[0] = PhysicsHelper::point2cpv(Vec2(-size.width/2+offset.x, -size.height/2+offset.y)); @@ -762,10 +752,10 @@ bool PhysicsShapeEdgeBox::init(const Size& size, const PhysicsMaterial& material int i = 0; for (; i < 4; ++i) { - cpShape* shape = cpSegmentShapeNew(_info->getSharedBody(), vec[i], vec[(i+1)%4], + auto shape = cpSegmentShapeNew(s_sharedBody, vec[i], vec[(i + 1) % 4], PhysicsHelper::float2cpfloat(border)); CC_BREAK_IF(shape == nullptr); - _info->add(shape); + addShape(shape); } CC_BREAK_IF(i < 4); @@ -799,7 +789,7 @@ bool PhysicsShapeEdgePolygon::init(const Vec2* points, int count, const PhysicsM cpVect* vec = nullptr; do { - CC_BREAK_IF(!PhysicsShape::init(Type::EDGEPOLYGEN)); + _type = Type::EDGEPOLYGEN; vec = new cpVect[count]; PhysicsHelper::points2cpvs(points, vec, count); @@ -807,12 +797,12 @@ bool PhysicsShapeEdgePolygon::init(const Vec2* points, int count, const PhysicsM int i = 0; for (; i < count; ++i) { - cpShape* shape = cpSegmentShapeNew(_info->getSharedBody(), vec[i], vec[(i+1)%count], + auto shape = cpSegmentShapeNew(s_sharedBody, vec[i], vec[(i + 1) % count], PhysicsHelper::float2cpfloat(border)); CC_BREAK_IF(shape == nullptr); - cpShapeSetElasticity(shape, 1.0f); - cpShapeSetFriction(shape, 1.0f); - _info->add(shape); + cpShapeSetElasticity(shape, 1.0f); + cpShapeSetFriction(shape, 1.0f); + addShape(shape); } CC_SAFE_DELETE_ARRAY(vec); @@ -833,10 +823,10 @@ bool PhysicsShapeEdgePolygon::init(const Vec2* points, int count, const PhysicsM Vec2 PhysicsShapeEdgePolygon::getCenter() { - int count = (int)_info->getShapes().size(); + int count = (int)_cpShapes.size(); cpVect* points = new cpVect[count]; int i = 0; - for(auto shape : _info->getShapes()) + for(auto shape : _cpShapes) { points[i++] = ((cpSegmentShape*)shape)->a; } @@ -850,7 +840,7 @@ Vec2 PhysicsShapeEdgePolygon::getCenter() void PhysicsShapeEdgePolygon::getPoints(cocos2d::Vec2 *outPoints) const { int i = 0; - for(auto shape : _info->getShapes()) + for(auto shape : _cpShapes) { outPoints[i++] = PhysicsHelper::cpv2point(((cpSegmentShape*)shape)->a); } @@ -858,7 +848,7 @@ void PhysicsShapeEdgePolygon::getPoints(cocos2d::Vec2 *outPoints) const int PhysicsShapeEdgePolygon::getPointsCount() const { - return static_cast(_info->getShapes().size()); + return static_cast(_cpShapes.size()); } // PhysicsShapeEdgeChain @@ -882,7 +872,7 @@ void PhysicsShapeEdgePolygon::update(float delta) cpFloat factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); cpFloat factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); - for(auto shape : _info->getShapes()) + for(auto shape : _cpShapes) { cpVect a = cpSegmentShapeGetA(shape); a.x *= factorX; @@ -902,7 +892,7 @@ bool PhysicsShapeEdgeChain::init(const Vec2* points, int count, const PhysicsMat cpVect* vec = nullptr; do { - CC_BREAK_IF(!PhysicsShape::init(Type::EDGECHAIN)); + _type = Type::EDGECHAIN; vec = new cpVect[count]; PhysicsHelper::points2cpvs(points, vec, count); @@ -910,12 +900,12 @@ bool PhysicsShapeEdgeChain::init(const Vec2* points, int count, const PhysicsMat int i = 0; for (; i < count - 1; ++i) { - cpShape* shape = cpSegmentShapeNew(_info->getSharedBody(), vec[i], vec[i+1], + auto shape = cpSegmentShapeNew(s_sharedBody, vec[i], vec[i + 1], PhysicsHelper::float2cpfloat(border)); CC_BREAK_IF(shape == nullptr); - cpShapeSetElasticity(shape, 1.0f); - cpShapeSetFriction(shape, 1.0f); - _info->add(shape); + cpShapeSetElasticity(shape, 1.0f); + cpShapeSetFriction(shape, 1.0f); + addShape(shape); } CC_SAFE_DELETE_ARRAY(vec); CC_BREAK_IF(i < count - 1); @@ -935,15 +925,15 @@ bool PhysicsShapeEdgeChain::init(const Vec2* points, int count, const PhysicsMat Vec2 PhysicsShapeEdgeChain::getCenter() { - int count = (int)_info->getShapes().size() + 1; + int count = (int)_cpShapes.size() + 1; cpVect* points = new cpVect[count]; int i = 0; - for(auto shape : _info->getShapes()) + for(auto shape : _cpShapes) { points[i++] = ((cpSegmentShape*)shape)->a; } - points[i++] = ((cpSegmentShape*)_info->getShapes().back())->b; + points[i++] = ((cpSegmentShape*)_cpShapes.back())->b; Vec2 center = PhysicsHelper::cpv2point(cpCentroidForPoly(count, points)); delete[] points; @@ -954,17 +944,17 @@ Vec2 PhysicsShapeEdgeChain::getCenter() void PhysicsShapeEdgeChain::getPoints(Vec2* outPoints) const { int i = 0; - for(auto shape : _info->getShapes()) + for(auto shape : _cpShapes) { outPoints[i++] = PhysicsHelper::cpv2point(((cpSegmentShape*)shape)->a); } - outPoints[i++] = PhysicsHelper::cpv2point(((cpSegmentShape*)_info->getShapes().back())->b); + outPoints[i++] = PhysicsHelper::cpv2point(((cpSegmentShape*)_cpShapes.back())->b); } int PhysicsShapeEdgeChain::getPointsCount() const { - return static_cast(_info->getShapes().size() + 1); + return static_cast(_cpShapes.size() + 1); } void PhysicsShapeEdgeChain::update(float delta) @@ -974,7 +964,7 @@ void PhysicsShapeEdgeChain::update(float delta) cpFloat factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); cpFloat factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); - for(auto shape : _info->getShapes()) + for(auto shape : _cpShapes) { cpVect a = cpSegmentShapeGetA(shape); a.x *= factorX; @@ -993,7 +983,7 @@ void PhysicsShape::setGroup(int group) { if (group < 0) { - for (auto shape : _info->getShapes()) + for (auto shape : _cpShapes) { cpShapeSetGroup(shape, (cpGroup)group); } @@ -1004,7 +994,7 @@ void PhysicsShape::setGroup(int group) bool PhysicsShape::containsPoint(const Vec2& point) const { - for (auto shape : _info->getShapes()) + for (auto shape : _cpShapes) { if (cpShapePointQuery(shape, PhysicsHelper::point2cpv(point))) { diff --git a/cocos/physics/CCPhysicsShape.h b/cocos/physics/CCPhysicsShape.h index cc72a828ef..79fabf6f1f 100644 --- a/cocos/physics/CCPhysicsShape.h +++ b/cocos/physics/CCPhysicsShape.h @@ -31,12 +31,11 @@ #include "base/CCRef.h" #include "math/CCGeometry.h" +struct cpShape; + NS_CC_BEGIN -class PhysicsShapeInfo; class PhysicsBody; -class PhysicsBodyInfo; - typedef struct CC_DLL PhysicsMaterial { @@ -149,13 +148,6 @@ public: inline int getGroup() { return _group; } protected: - bool init(Type type); - - /** - * @brief PhysicsShape is PhysicsBody's friend class, but all the subclasses isn't. so this method is use for subclasses to catch the bodyInfo from PhysicsBody. - */ - PhysicsBodyInfo* bodyInfo() const; - void setBody(PhysicsBody* body); /** calculate the area of this shape */ @@ -166,6 +158,7 @@ protected: virtual void setScaleX(float scaleX); virtual void setScaleY(float scaleY); virtual void update(float delta); + void addShape(cpShape* shape); protected: PhysicsShape(); @@ -173,7 +166,8 @@ protected: protected: PhysicsBody* _body; - PhysicsShapeInfo* _info; + std::vector _cpShapes; + Type _type; float _area; float _mass; diff --git a/cocos/physics/CCPhysicsWorld.cpp b/cocos/physics/CCPhysicsWorld.cpp index 59eaf95855..84b38e42db 100644 --- a/cocos/physics/CCPhysicsWorld.cpp +++ b/cocos/physics/CCPhysicsWorld.cpp @@ -24,23 +24,16 @@ #include "physics/CCPhysicsWorld.h" #if CC_USE_PHYSICS - +#include #include #include "chipmunk.h" - -#include "physics/CCPhysicsBody.h" -#include "physics/CCPhysicsShape.h" +#include "CCPhysicsBody.h" +#include "CCPhysicsShape.h" #include "CCPhysicsContact.h" -#include "physics/CCPhysicsJoint.h" +#include "CCPhysicsJoint.h" #include "CCPhysicsContact.h" - -#include "chipmunk/CCPhysicsWorldInfo_chipmunk.h" -#include "chipmunk/CCPhysicsBodyInfo_chipmunk.h" -#include "chipmunk/CCPhysicsShapeInfo_chipmunk.h" -#include "chipmunk/CCPhysicsContactInfo_chipmunk.h" -#include "chipmunk/CCPhysicsJointInfo_chipmunk.h" -#include "chipmunk/CCPhysicsHelper_chipmunk.h" +#include "CCPhysicsHelper.h" #include "2d/CCDrawNode.h" #include "2d/CCScene.h" @@ -48,11 +41,10 @@ #include "base/CCEventDispatcher.h" #include "base/CCEventCustom.h" -#include - NS_CC_BEGIN const float PHYSICS_INFINITY = INFINITY; extern const char* PHYSICSCONTACT_EVENT_NAME; +extern std::unordered_map s_physicsShapeMap; const int PhysicsWorld::DEBUGDRAW_NONE = 0x00; const int PhysicsWorld::DEBUGDRAW_SHAPE = 0x01; @@ -108,11 +100,11 @@ int PhysicsWorldCallback::collisionBeginCallbackFunc(cpArbiter *arb, struct cpSp { CP_ARBITER_GET_SHAPES(arb, a, b); - auto ita = PhysicsShapeInfo::getMap().find(a); - auto itb = PhysicsShapeInfo::getMap().find(b); - CC_ASSERT(ita != PhysicsShapeInfo::getMap().end() && itb != PhysicsShapeInfo::getMap().end()); + auto ita = s_physicsShapeMap.find(a); + auto itb = s_physicsShapeMap.find(b); + CC_ASSERT(ita != s_physicsShapeMap.end() && itb != s_physicsShapeMap.end()); - PhysicsContact* contact = PhysicsContact::construct(ita->second->getShape(), itb->second->getShape()); + auto contact = PhysicsContact::construct(ita->second, itb->second); arb->data = contact; contact->_contactInfo = arb; @@ -145,12 +137,12 @@ void PhysicsWorldCallback::rayCastCallbackFunc(cpShape *shape, cpFloat t, cpVect return; } - auto it = PhysicsShapeInfo::getMap().find(shape); - CC_ASSERT(it != PhysicsShapeInfo::getMap().end()); + auto it = s_physicsShapeMap.find(shape); + CC_ASSERT(it != s_physicsShapeMap.end()); PhysicsRayCastInfo callbackInfo = { - it->second->getShape(), + it->second, info->p1, info->p2, Vec2(info->p1.x+(info->p2.x-info->p1.x)*t, info->p1.y+(info->p2.y-info->p1.y)*t), @@ -163,34 +155,34 @@ void PhysicsWorldCallback::rayCastCallbackFunc(cpShape *shape, cpFloat t, cpVect void PhysicsWorldCallback::queryRectCallbackFunc(cpShape *shape, RectQueryCallbackInfo *info) { - auto it = PhysicsShapeInfo::getMap().find(shape); + auto it = s_physicsShapeMap.find(shape); - CC_ASSERT(it != PhysicsShapeInfo::getMap().end()); + CC_ASSERT(it != s_physicsShapeMap.end()); if (!PhysicsWorldCallback::continues) { return; } - PhysicsWorldCallback::continues = info->func(*info->world, *it->second->getShape(), info->data); + PhysicsWorldCallback::continues = info->func(*info->world, *it->second, info->data); } void PhysicsWorldCallback::getShapesAtPointFunc(cpShape *shape, cpFloat distance, cpVect point, Vector* arr) { - auto it = PhysicsShapeInfo::getMap().find(shape); + auto it = s_physicsShapeMap.find(shape); - CC_ASSERT(it != PhysicsShapeInfo::getMap().end()); + CC_ASSERT(it != s_physicsShapeMap.end()); - arr->pushBack(it->second->getShape()); + arr->pushBack(it->second); } void PhysicsWorldCallback::queryPointFunc(cpShape *shape, cpFloat distance, cpVect point, PointQueryCallbackInfo *info) { - auto it = PhysicsShapeInfo::getMap().find(shape); + auto it = s_physicsShapeMap.find(shape); - CC_ASSERT(it != PhysicsShapeInfo::getMap().end()); + CC_ASSERT(it != s_physicsShapeMap.end()); - PhysicsWorldCallback::continues = info->func(*info->world, *it->second->getShape(), info->data); + PhysicsWorldCallback::continues = info->func(*info->world, *it->second, info->data); } void PhysicsWorld::debugDraw() @@ -343,7 +335,7 @@ void PhysicsWorld::rayCast(PhysicsRayCastCallbackFunc func, const Vec2& point1, RayCastCallbackInfo info = { this, func, point1, point2, data }; PhysicsWorldCallback::continues = true; - cpSpaceSegmentQuery(this->_info->getSpace(), + cpSpaceSegmentQuery(_cpSpace, PhysicsHelper::point2cpv(point1), PhysicsHelper::point2cpv(point2), CP_ALL_LAYERS, @@ -362,7 +354,7 @@ void PhysicsWorld::queryRect(PhysicsQueryRectCallbackFunc func, const Rect& rect RectQueryCallbackInfo info = {this, func, data}; PhysicsWorldCallback::continues = true; - cpSpaceBBQuery(this->_info->getSpace(), + cpSpaceBBQuery(_cpSpace, PhysicsHelper::rect2cpbb(rect), CP_ALL_LAYERS, CP_NO_GROUP, @@ -380,7 +372,7 @@ void PhysicsWorld::queryPoint(PhysicsQueryPointCallbackFunc func, const Vec2& po PointQueryCallbackInfo info = {this, func, data}; PhysicsWorldCallback::continues = true; - cpSpaceNearestPointQuery(this->_info->getSpace(), + cpSpaceNearestPointQuery(_cpSpace, PhysicsHelper::point2cpv(point), 0, CP_ALL_LAYERS, @@ -393,7 +385,7 @@ void PhysicsWorld::queryPoint(PhysicsQueryPointCallbackFunc func, const Vec2& po Vector PhysicsWorld::getShapes(const Vec2& point) const { Vector arr; - cpSpaceNearestPointQuery(this->_info->getSpace(), + cpSpaceNearestPointQuery(_cpSpace, PhysicsHelper::point2cpv(point), 0, CP_ALL_LAYERS, @@ -406,14 +398,14 @@ Vector PhysicsWorld::getShapes(const Vec2& point) const PhysicsShape* PhysicsWorld::getShape(const Vec2& point) const { - cpShape* shape = cpSpaceNearestPointQueryNearest(this->_info->getSpace(), + cpShape* shape = cpSpaceNearestPointQueryNearest(_cpSpace, PhysicsHelper::point2cpv(point), 0, CP_ALL_LAYERS, CP_NO_GROUP, nullptr); - return shape == nullptr ? nullptr : PhysicsShapeInfo::getMap().find(shape)->second->getShape(); + return shape == nullptr ? nullptr : s_physicsShapeMap.find(shape)->second; } PhysicsWorld* PhysicsWorld::construct(Scene& scene) @@ -432,14 +424,14 @@ bool PhysicsWorld::init(Scene& scene) { do { - _info = new (std::nothrow) PhysicsWorldInfo(); - CC_BREAK_IF(_info == nullptr); + _cpSpace = cpSpaceNew(); + CC_BREAK_IF(_cpSpace == nullptr); _scene = &scene; - _info->setGravity(_gravity); + cpSpaceSetGravity(_cpSpace, PhysicsHelper::point2cpv(_gravity)); - cpSpaceSetDefaultCollisionHandler(_info->getSpace(), + cpSpaceSetDefaultCollisionHandler(_cpSpace, (cpCollisionBeginFunc)PhysicsWorldCallback::collisionBeginCallbackFunc, (cpCollisionPreSolveFunc)PhysicsWorldCallback::collisionPreSolveCallbackFunc, (cpCollisionPostSolveFunc)PhysicsWorldCallback::collisionPostSolveCallbackFunc, @@ -476,9 +468,9 @@ void PhysicsWorld::doAddBody(PhysicsBody* body) if (body->isEnabled()) { // add body to space - if (body->isDynamic()) + if (body->isDynamic() && !cpSpaceContainsBody(_cpSpace, body->_cpBody)) { - _info->addBody(*body->_info); + cpSpaceAddBody(_cpSpace, body->_cpBody); } // add shapes to space @@ -499,7 +491,7 @@ void PhysicsWorld::addBodyOrDelay(PhysicsBody* body) return; } - if (_info->isLocked()) + if (cpSpaceIsLocked(_cpSpace)) { if (_delayAddBodies.find(body) == _delayAddBodies.end()) { @@ -515,7 +507,7 @@ void PhysicsWorld::addBodyOrDelay(PhysicsBody* body) void PhysicsWorld::updateBodies() { - if (_info->isLocked()) + if (cpSpaceIsLocked(_cpSpace)) { return; } @@ -593,7 +585,7 @@ void PhysicsWorld::removeBodyOrDelay(PhysicsBody* body) return; } - if (_info->isLocked()) + if (cpSpaceIsLocked(_cpSpace)) { if (_delayRemoveBodies.getIndex(body) == CC_INVALID_INDEX) { @@ -608,12 +600,13 @@ void PhysicsWorld::removeBodyOrDelay(PhysicsBody* body) void PhysicsWorld::doAddJoint(PhysicsJoint *joint) { - if (joint == nullptr || joint->_info == nullptr) + if (joint) { - return; + for (auto constraint : joint->_cpConstraints) + { + cpSpaceAddConstraint(_cpSpace, constraint); + } } - - _info->addJoint(*joint->_info); } void PhysicsWorld::removeJoint(PhysicsJoint* joint, bool destroy) @@ -659,7 +652,7 @@ void PhysicsWorld::removeJoint(PhysicsJoint* joint, bool destroy) void PhysicsWorld::updateJoints() { - if (_info->isLocked()) + if (cpSpaceIsLocked(_cpSpace)) { return; } @@ -686,9 +679,15 @@ void PhysicsWorld::updateJoints() void PhysicsWorld::removeShape(PhysicsShape* shape) { - if (shape != nullptr) + if (shape) { - _info->removeShape(*shape->_info); + for (auto cps : shape->_cpShapes) + { + if (cpSpaceContainsShape(_cpSpace, cps)) + { + cpSpaceRemoveShape(_cpSpace, cps); + } + } } } @@ -701,7 +700,7 @@ void PhysicsWorld::addJointOrDelay(PhysicsJoint* joint) return; } - if (_info->isLocked()) + if (cpSpaceIsLocked(_cpSpace)) { if (std::find(_delayAddJoints.begin(), _delayAddJoints.end(), joint) == _delayAddJoints.end()) { @@ -723,7 +722,7 @@ void PhysicsWorld::removeJointOrDelay(PhysicsJoint* joint) return; } - if (_info->isLocked()) + if (cpSpaceIsLocked(_cpSpace)) { if (std::find(_delayRemoveJoints.rbegin(), _delayRemoveJoints.rend(), joint) == _delayRemoveJoints.rend()) { @@ -783,11 +782,14 @@ void PhysicsWorld::removeAllJoints(bool destroy) _joints.clear(); } -void PhysicsWorld::addShape(PhysicsShape* shape) +void PhysicsWorld::addShape(PhysicsShape* physicsShape) { - if (shape != nullptr) + if (physicsShape) { - _info->addShape(*shape->_info); + for (auto shape : physicsShape->_cpShapes) + { + cpSpaceAddShape(_cpSpace, shape); + } } } @@ -802,12 +804,18 @@ void PhysicsWorld::doRemoveBody(PhysicsBody* body) } // remove body - _info->removeBody(*body->_info); + if (cpSpaceContainsBody(_cpSpace, body->_cpBody)) + { + cpSpaceRemoveBody(_cpSpace, body->_cpBody); + } } void PhysicsWorld::doRemoveJoint(PhysicsJoint* joint) { - _info->removeJoint(*joint->_info); + for (auto constraint : joint->_cpConstraints) + { + cpSpaceRemoveConstraint(_cpSpace, constraint); + } } void PhysicsWorld::removeAllBodies() @@ -852,7 +860,7 @@ PhysicsBody* PhysicsWorld::getBody(int tag) const void PhysicsWorld::setGravity(const Vect& gravity) { _gravity = gravity; - _info->setGravity(gravity); + cpSpaceSetGravity(_cpSpace, PhysicsHelper::point2cpv(gravity)); } void PhysicsWorld::setSubsteps(int steps) @@ -891,7 +899,7 @@ void PhysicsWorld::update(float delta, bool userCall/* = false*/) if (userCall) { - _info->step(delta); + cpSpaceStep(_cpSpace, delta); for (auto& body : _bodies) { body->update(delta); @@ -905,7 +913,7 @@ void PhysicsWorld::update(float delta, bool userCall/* = false*/) const float dt = _updateTime * _speed / _substeps; for (int i = 0; i < _substeps; ++i) { - _info->step(dt); + cpSpaceStep(_cpSpace, dt); for (auto& body : _bodies) { body->update(dt); @@ -929,7 +937,7 @@ PhysicsWorld::PhysicsWorld() , _updateRateCount(0) , _updateTime(0.0f) , _substeps(1) -, _info(nullptr) +, _cpSpace(nullptr) , _scene(nullptr) , _delayDirty(false) , _autoStep(true) @@ -943,7 +951,10 @@ PhysicsWorld::~PhysicsWorld() { removeAllJoints(true); removeAllBodies(); - CC_SAFE_DELETE(_info); + if (_cpSpace) + { + cpSpaceFree(_cpSpace); + } CC_SAFE_DELETE(_debugDraw); } @@ -976,7 +987,7 @@ void PhysicsDebugDraw::drawShape(PhysicsShape& shape) const Color4F fillColor(1.0f, 0.0f, 0.0f, 0.3f); const Color4F outlineColor(1.0f, 0.0f, 0.0f, 1.0f); - for (auto it = shape._info->getShapes().begin(); it != shape._info->getShapes().end(); ++it) + for (auto it = shape._cpShapes.begin(); it != shape._cpShapes.end(); ++it) { cpShape *subShape = *it; @@ -1032,7 +1043,7 @@ void PhysicsDebugDraw::drawJoint(PhysicsJoint& joint) const Color4F lineColor(0.0f, 0.0f, 1.0f, 1.0f); const Color4F jointPointColor(0.0f, 1.0f, 0.0f, 1.0f); - for (auto it = joint._info->getJoints().begin(); it != joint._info->getJoints().end(); ++it) + for (auto it = joint._cpConstraints.begin(); it != joint._cpConstraints.end(); ++it) { cpConstraint *constraint = *it; diff --git a/cocos/physics/CCPhysicsWorld.h b/cocos/physics/CCPhysicsWorld.h index 28ba54d944..9612ba688c 100644 --- a/cocos/physics/CCPhysicsWorld.h +++ b/cocos/physics/CCPhysicsWorld.h @@ -34,11 +34,12 @@ #include "physics/CCPhysicsBody.h" #include +struct cpSpace; + NS_CC_BEGIN class PhysicsBody; class PhysicsJoint; -class PhysicsWorldInfo; class PhysicsShape; class PhysicsContact; @@ -203,7 +204,7 @@ protected: int _updateRateCount; float _updateTime; int _substeps; - PhysicsWorldInfo* _info; + cpSpace* _cpSpace; Vector _bodies; std::list _joints; diff --git a/cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.cpp b/cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.cpp deleted file mode 100644 index a641086bb7..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 "CCPhysicsBodyInfo_chipmunk.h" -#if CC_USE_PHYSICS -#include "chipmunk.h" -NS_CC_BEGIN - -PhysicsBodyInfo::PhysicsBodyInfo() -: _body(nullptr) -{ -} - -PhysicsBodyInfo::~PhysicsBodyInfo() -{ - if (_body) cpBodyFree(_body); -} - -NS_CC_END -#endif // CC_USE_PHYSICS diff --git a/cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.h b/cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.h deleted file mode 100644 index 389e342077..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.h +++ /dev/null @@ -1,57 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 __CCPHYSICS_BODY_INFO_CHIPMUNK_H__ -#define __CCPHYSICS_BODY_INFO_CHIPMUNK_H__ - -#include "base/ccConfig.h" -#if CC_USE_PHYSICS - -#include "platform/CCPlatformMacros.h" -#include "base/CCRef.h" - -struct cpBody; - -NS_CC_BEGIN - -class PhysicsBodyInfo -{ -public: - inline cpBody* getBody() const { return _body; } - inline void setBody(cpBody* body) { _body = body; } - -private: - PhysicsBodyInfo(); - ~PhysicsBodyInfo(); - -private: - cpBody* _body; - - friend class PhysicsBody; -}; - -NS_CC_END - -#endif // CC_USE_PHYSICS -#endif // __CCPHYSICS_BODY_INFO_CHIPMUNK_H__ diff --git a/cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.cpp b/cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.cpp deleted file mode 100644 index 238d6d5387..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 "CCPhysicsContactInfo_chipmunk.h" -#if CC_USE_PHYSICS -#include "chipmunk.h" -NS_CC_BEGIN - -PhysicsContactInfo::PhysicsContactInfo(PhysicsContact* contact) -: _contact(contact) -{ -} - -PhysicsContactInfo::~PhysicsContactInfo() -{ -} - -NS_CC_END -#endif // CC_USE_PHYSICS diff --git a/cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.h b/cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.h deleted file mode 100644 index 20cdb952f6..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.h +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 __CCPHYSICS_CONTACT_INFO_CHIPMUNK_H__ -#define __CCPHYSICS_CONTACT_INFO_CHIPMUNK_H__ - -#include "base/ccConfig.h" -#if CC_USE_PHYSICS - -#include "platform/CCPlatformMacros.h" -NS_CC_BEGIN - -class PhysicsContact; -class PhysicsContactInfo -{ -public: - inline PhysicsContact* getContact() const { return _contact; } - -private: - PhysicsContactInfo(PhysicsContact* contact); - ~PhysicsContactInfo(); - -private: - PhysicsContact* _contact; - - friend class PhysicsContact; -}; - -NS_CC_END - -#endif // CC_USE_PHYSICS -#endif // __CCPHYSICS_CONTACT_INFO_CHIPMUNK_H__ diff --git a/cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.cpp b/cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.cpp deleted file mode 100644 index 00d174fecf..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 "CCPhysicsJointInfo_chipmunk.h" -#if CC_USE_PHYSICS -#include -#include -#include "chipmunk.h" - -NS_CC_BEGIN - -std::unordered_map PhysicsJointInfo::_map; - -PhysicsJointInfo::PhysicsJointInfo(PhysicsJoint* joint) -: _joint(joint) -{ -} - -PhysicsJointInfo::~PhysicsJointInfo() -{ - for (cpConstraint* joint : _joints) - { - cpConstraintFree(joint); - } -} - -void PhysicsJointInfo::add(cpConstraint* joint) -{ - if (joint == nullptr) return; - - _joints.push_back(joint); - _map.insert(std::pair(joint, this)); -} - -void PhysicsJointInfo::remove(cpConstraint* joint) -{ - if (joint == nullptr) return; - - auto it = std::find(_joints.begin(), _joints.end(), joint); - if (it != _joints.end()) - { - _joints.erase(it); - - auto mit = _map.find(joint); - if (mit != _map.end()) _map.erase(mit); - - cpConstraintFree(joint); - } -} - -void PhysicsJointInfo::removeAll() -{ - for (cpConstraint* joint : _joints) - { - auto mit = _map.find(joint); - if (mit != _map.end()) _map.erase(mit); - cpConstraintFree(joint); - } - - _joints.clear(); -} - -NS_CC_END -#endif // CC_USE_PHYSICS diff --git a/cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.h b/cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.h deleted file mode 100644 index 9e5eccf2bf..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.h +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 __CCPHYSICS_JOINT_INFO_CHIPMUNK_H__ -#define __CCPHYSICS_JOINT_INFO_CHIPMUNK_H__ - -#include "base/ccConfig.h" -#if CC_USE_PHYSICS - -#include "platform/CCPlatformMacros.h" -#include -#include - -struct cpConstraint; -NS_CC_BEGIN - -class PhysicsJoint; - -class PhysicsJointInfo -{ -public: - void add(cpConstraint* shape); - void remove(cpConstraint* shape); - void removeAll(); - - PhysicsJoint* getJoint() const { return _joint; } - std::vector& getJoints() { return _joints; } - static std::unordered_map& getMap() { return _map; } - -protected: - PhysicsJointInfo(PhysicsJoint* joint); - ~PhysicsJointInfo(); - - std::vector _joints; - PhysicsJoint* _joint; - static std::unordered_map _map; - - friend class PhysicsJoint; -}; - -NS_CC_END - -#endif // CC_USE_PHYSICS -#endif // __CCPHYSICS_JOINT_INFO_CHIPMUNK_H__ diff --git a/cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.cpp b/cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.cpp deleted file mode 100644 index c1b8693259..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 "CCPhysicsShapeInfo_chipmunk.h" -#if CC_USE_PHYSICS -#include -#include - -NS_CC_BEGIN - -std::unordered_map PhysicsShapeInfo::_map; -cpBody* PhysicsShapeInfo::_sharedBody = nullptr; - -PhysicsShapeInfo::PhysicsShapeInfo(PhysicsShape* shape) -: _shape(shape) -, _group(CP_NO_GROUP) -{ - if (_sharedBody == nullptr) - { - _sharedBody = cpBodyNewStatic(); - } - - _body = _sharedBody; -} - -PhysicsShapeInfo::~PhysicsShapeInfo() -{ - for (auto shape : _shapes) - { - auto it = _map.find(shape); - if (it != _map.end()) _map.erase(shape); - - cpShapeFree(shape); - } -} - -void PhysicsShapeInfo::setGroup(cpGroup group) -{ - this->_group = group; - - for (cpShape* shape : _shapes) - { - cpShapeSetGroup(shape, group); - } -} - -void PhysicsShapeInfo::setBody(cpBody* body) -{ - if (this->_body != body) - { - this->_body = body; - for (cpShape* shape : _shapes) - { - cpShapeSetBody(shape, body == nullptr ? _sharedBody : body); - } - } -} - -void PhysicsShapeInfo::add(cpShape* shape) -{ - if (shape == nullptr) return; - - cpShapeSetGroup(shape, _group); - _shapes.push_back(shape); - _map.insert(std::pair(shape, this)); -} - -void PhysicsShapeInfo::remove(cpShape* shape) -{ - if (shape == nullptr) return; - - auto it = std::find(_shapes.begin(), _shapes.end(), shape); - if (it != _shapes.end()) - { - _shapes.erase(it); - - auto mit = _map.find(shape); - if (mit != _map.end()) _map.erase(mit); - - cpShapeFree(shape); - } -} - -void PhysicsShapeInfo::removeAll() -{ - for (cpShape* shape : _shapes) - { - auto mit = _map.find(shape); - if (mit != _map.end()) _map.erase(mit); - cpShapeFree(shape); - } - - _shapes.clear(); -} - -NS_CC_END -#endif // CC_USE_PHYSICS diff --git a/cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.h b/cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.h deleted file mode 100644 index ecde537a0a..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 __CCPHYSICS_SHAPE_INFO_CHIPMUNK_H__ -#define __CCPHYSICS_SHAPE_INFO_CHIPMUNK_H__ - -#include "base/ccConfig.h" -#if CC_USE_PHYSICS - -#include -#include -#include "platform/CCPlatformMacros.h" -#include "chipmunk.h" - -NS_CC_BEGIN - -class PhysicsShape; - -class PhysicsShapeInfo -{ -public: - void add(cpShape* shape); - void remove(cpShape* shape); - void removeAll(); - void setGroup(cpGroup group); - void setBody(cpBody* body); - - PhysicsShape* getShape() const { return _shape; } - std::vector& getShapes() { return _shapes; } - cpBody* getBody() const { return _body; } - cpGroup getGourp() const { return _group; } - static std::unordered_map& getMap() { return _map; } - static cpBody* getSharedBody() { return _sharedBody; } - -protected: - PhysicsShapeInfo(PhysicsShape* shape); - ~PhysicsShapeInfo(); - - std::vector _shapes; - PhysicsShape* _shape; - cpBody* _body; - cpGroup _group; - static std::unordered_map _map; - static cpBody* _sharedBody; - - friend class PhysicsShape; -}; - -NS_CC_END - -#endif // CC_USE_PHYSICS -#endif // __CCPHYSICS_SHAPE_INFO_CHIPMUNK_H__ diff --git a/cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.cpp b/cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.cpp deleted file mode 100644 index 8290b28490..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 "CCPhysicsWorldInfo_chipmunk.h" -#if CC_USE_PHYSICS -#include "CCPhysicsHelper_chipmunk.h" -#include "CCPhysicsBodyInfo_chipmunk.h" -#include "CCPhysicsShapeInfo_chipmunk.h" -#include "CCPhysicsJointInfo_chipmunk.h" -#include "chipmunk.h" - -NS_CC_BEGIN - -PhysicsWorldInfo::PhysicsWorldInfo() -{ - _space = cpSpaceNew(); -} - -PhysicsWorldInfo::~PhysicsWorldInfo() -{ - cpSpaceFree(_space); -} - -void PhysicsWorldInfo::setGravity(const Vect& gravity) -{ - cpSpaceSetGravity(_space, PhysicsHelper::point2cpv(gravity)); -} - -void PhysicsWorldInfo::addBody(PhysicsBodyInfo& body) -{ - if (!cpSpaceContainsBody(_space, body.getBody())) - { - cpSpaceAddBody(_space, body.getBody()); - } -} - -void PhysicsWorldInfo::removeBody(PhysicsBodyInfo& body) -{ - if (cpSpaceContainsBody(_space, body.getBody())) - { - cpSpaceRemoveBody(_space, body.getBody()); - } -} - -void PhysicsWorldInfo::addShape(PhysicsShapeInfo& shape) -{ - for (auto cps : shape.getShapes()) - { - cpSpaceAddShape(_space, cps); - } -} - -void PhysicsWorldInfo::removeShape(PhysicsShapeInfo& shape) -{ - for (auto cps : shape.getShapes()) - { - if (cpSpaceContainsShape(_space, cps)) - { - cpSpaceRemoveShape(_space, cps); - } - } -} - -void PhysicsWorldInfo::addJoint(PhysicsJointInfo& joint) -{ - for (auto subjoint : joint.getJoints()) - { - cpSpaceAddConstraint(_space, subjoint); - } -} - -void PhysicsWorldInfo::removeJoint(PhysicsJointInfo& joint) -{ - for (auto subjoint : joint.getJoints()) - { - cpSpaceRemoveConstraint(_space, subjoint); - } -} - -bool PhysicsWorldInfo::isLocked() -{ - return 0 == _space->locked_private ? false : true; -} - -void PhysicsWorldInfo::step(float delta) -{ - cpSpaceStep(_space, delta); -} - -NS_CC_END -#endif // CC_USE_PHYSICS diff --git a/cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.h b/cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.h deleted file mode 100644 index 15b8e08e33..0000000000 --- a/cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.h +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 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 - 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 __CCPHYSICS_WORLD_INFO_CHIPMUNK_H__ -#define __CCPHYSICS_WORLD_INFO_CHIPMUNK_H__ - -#include "base/ccConfig.h" -#if CC_USE_PHYSICS - -#include -#include "platform/CCPlatformMacros.h" -#include "math/CCGeometry.h" - -struct cpSpace; - - -NS_CC_BEGIN -typedef Vec2 Vect; -class PhysicsBodyInfo; -class PhysicsJointInfo; -class PhysicsShapeInfo; - -class PhysicsWorldInfo -{ -public: - cpSpace* getSpace() const { return _space; } - void addShape(PhysicsShapeInfo& shape); - void removeShape(PhysicsShapeInfo& shape); - void addBody(PhysicsBodyInfo& body); - void removeBody(PhysicsBodyInfo& body); - void addJoint(PhysicsJointInfo& joint); - void removeJoint(PhysicsJointInfo& joint); - void setGravity(const Vect& gravity); - bool isLocked(); - void step(float delta); - -private: - PhysicsWorldInfo(); - ~PhysicsWorldInfo(); - -private: - cpSpace* _space; - - friend class PhysicsWorld; -}; - -NS_CC_END - -#endif // CC_USE_PHYSICS -#endif // __CCPHYSICS_WORLD_INFO_CHIPMUNK_H__ From 2847a940ed1998bc1ef5f060d9e35528e078bc5f Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Tue, 6 Jan 2015 11:24:24 +0800 Subject: [PATCH 015/106] Update project --- build/cocos2d_libs.xcodeproj/project.pbxproj | 80 ++----------------- cocos/2d/libcocos2d.vcxproj | 12 +-- cocos/2d/libcocos2d.vcxproj.filters | 39 +-------- .../libcocos2d_8_1.Shared.vcxitems | 12 +-- .../libcocos2d_8_1.Shared.vcxitems.filters | 39 +-------- cocos/2d/libcocos2d_wp8.vcxproj | 12 +-- cocos/2d/libcocos2d_wp8.vcxproj.filters | 39 +-------- cocos/Android.mk | 5 -- cocos/physics/CCPhysicsHelper.h | 6 +- cocos/physics/CMakeLists.txt | 5 -- 10 files changed, 21 insertions(+), 228 deletions(-) diff --git a/build/cocos2d_libs.xcodeproj/project.pbxproj b/build/cocos2d_libs.xcodeproj/project.pbxproj index ad2b0ee825..839e665b1b 100644 --- a/build/cocos2d_libs.xcodeproj/project.pbxproj +++ b/build/cocos2d_libs.xcodeproj/project.pbxproj @@ -1928,28 +1928,6 @@ B29A7E3F19EE1B7700872B35 /* AnimationState.h in Headers */ = {isa = PBXBuildFile; fileRef = B29A7DC619EE1B7700872B35 /* AnimationState.h */; }; B29A7E4019EE1B7700872B35 /* AnimationState.h in Headers */ = {isa = PBXBuildFile; fileRef = B29A7DC619EE1B7700872B35 /* AnimationState.h */; }; B2CC507C19776DD10041958E /* CCPhysicsJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46A170721807CE7A005B8026 /* CCPhysicsJoint.cpp */; }; - B37510711823AC9F00B3BA6A /* CCPhysicsBodyInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B37510451823AC7B00B3BA6A /* CCPhysicsBodyInfo_chipmunk.cpp */; }; - B37510721823AC9F00B3BA6A /* CCPhysicsBodyInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B37510461823AC7B00B3BA6A /* CCPhysicsBodyInfo_chipmunk.h */; }; - B37510731823AC9F00B3BA6A /* CCPhysicsContactInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B37510471823AC7B00B3BA6A /* CCPhysicsContactInfo_chipmunk.cpp */; }; - B37510741823AC9F00B3BA6A /* CCPhysicsContactInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B37510481823AC7B00B3BA6A /* CCPhysicsContactInfo_chipmunk.h */; }; - B37510751823AC9F00B3BA6A /* CCPhysicsHelper_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B37510491823AC7B00B3BA6A /* CCPhysicsHelper_chipmunk.h */; }; - B37510761823AC9F00B3BA6A /* CCPhysicsJointInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B375104A1823AC7B00B3BA6A /* CCPhysicsJointInfo_chipmunk.cpp */; }; - B37510771823AC9F00B3BA6A /* CCPhysicsJointInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B375104B1823AC7B00B3BA6A /* CCPhysicsJointInfo_chipmunk.h */; }; - B37510781823AC9F00B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B375104C1823AC7B00B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp */; }; - B37510791823AC9F00B3BA6A /* CCPhysicsShapeInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B375104D1823AC7B00B3BA6A /* CCPhysicsShapeInfo_chipmunk.h */; }; - B375107A1823AC9F00B3BA6A /* CCPhysicsWorldInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B375104E1823AC7B00B3BA6A /* CCPhysicsWorldInfo_chipmunk.cpp */; }; - B375107B1823AC9F00B3BA6A /* CCPhysicsWorldInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B375104F1823AC7B00B3BA6A /* CCPhysicsWorldInfo_chipmunk.h */; }; - B375107C1823ACA100B3BA6A /* CCPhysicsBodyInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B37510451823AC7B00B3BA6A /* CCPhysicsBodyInfo_chipmunk.cpp */; }; - B375107D1823ACA100B3BA6A /* CCPhysicsBodyInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B37510461823AC7B00B3BA6A /* CCPhysicsBodyInfo_chipmunk.h */; }; - B375107E1823ACA100B3BA6A /* CCPhysicsContactInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B37510471823AC7B00B3BA6A /* CCPhysicsContactInfo_chipmunk.cpp */; }; - B375107F1823ACA100B3BA6A /* CCPhysicsContactInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B37510481823AC7B00B3BA6A /* CCPhysicsContactInfo_chipmunk.h */; }; - B37510801823ACA100B3BA6A /* CCPhysicsHelper_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B37510491823AC7B00B3BA6A /* CCPhysicsHelper_chipmunk.h */; }; - B37510811823ACA100B3BA6A /* CCPhysicsJointInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B375104A1823AC7B00B3BA6A /* CCPhysicsJointInfo_chipmunk.cpp */; }; - B37510821823ACA100B3BA6A /* CCPhysicsJointInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B375104B1823AC7B00B3BA6A /* CCPhysicsJointInfo_chipmunk.h */; }; - B37510831823ACA100B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B375104C1823AC7B00B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp */; }; - B37510841823ACA100B3BA6A /* CCPhysicsShapeInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B375104D1823AC7B00B3BA6A /* CCPhysicsShapeInfo_chipmunk.h */; }; - B37510851823ACA100B3BA6A /* CCPhysicsWorldInfo_chipmunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B375104E1823AC7B00B3BA6A /* CCPhysicsWorldInfo_chipmunk.cpp */; }; - B37510861823ACA100B3BA6A /* CCPhysicsWorldInfo_chipmunk.h in Headers */ = {isa = PBXBuildFile; fileRef = B375104F1823AC7B00B3BA6A /* CCPhysicsWorldInfo_chipmunk.h */; }; B60C5BD419AC68B10056FBDE /* CCBillBoard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B60C5BD219AC68B10056FBDE /* CCBillBoard.cpp */; }; B60C5BD519AC68B10056FBDE /* CCBillBoard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B60C5BD219AC68B10056FBDE /* CCBillBoard.cpp */; }; B60C5BD619AC68B10056FBDE /* CCBillBoard.h in Headers */ = {isa = PBXBuildFile; fileRef = B60C5BD319AC68B10056FBDE /* CCBillBoard.h */; }; @@ -1990,6 +1968,8 @@ DABC9FAA19E7DFA900FA252C /* CCClippingRectangleNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DABC9FA719E7DFA900FA252C /* CCClippingRectangleNode.cpp */; }; DABC9FAB19E7DFA900FA252C /* CCClippingRectangleNode.h in Headers */ = {isa = PBXBuildFile; fileRef = DABC9FA819E7DFA900FA252C /* CCClippingRectangleNode.h */; }; DABC9FAC19E7DFA900FA252C /* CCClippingRectangleNode.h in Headers */ = {isa = PBXBuildFile; fileRef = DABC9FA819E7DFA900FA252C /* CCClippingRectangleNode.h */; }; + ED74D7691A5B8A2600157FD4 /* CCPhysicsHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = ED74D7681A5B8A2600157FD4 /* CCPhysicsHelper.h */; }; + ED74D76A1A5B8A2600157FD4 /* CCPhysicsHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = ED74D7681A5B8A2600157FD4 /* CCPhysicsHelper.h */; }; ED9C6A9418599AD8000A5232 /* CCNodeGrid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9C6A9218599AD8000A5232 /* CCNodeGrid.cpp */; }; ED9C6A9518599AD8000A5232 /* CCNodeGrid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9C6A9218599AD8000A5232 /* CCNodeGrid.cpp */; }; ED9C6A9618599AD8000A5232 /* CCNodeGrid.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9C6A9318599AD8000A5232 /* CCNodeGrid.h */; }; @@ -3043,17 +3023,6 @@ B29A7DC419EE1B7700872B35 /* Animation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Animation.c; sourceTree = ""; }; B29A7DC519EE1B7700872B35 /* AnimationState.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = AnimationState.c; sourceTree = ""; }; B29A7DC619EE1B7700872B35 /* AnimationState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimationState.h; sourceTree = ""; }; - B37510451823AC7B00B3BA6A /* CCPhysicsBodyInfo_chipmunk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCPhysicsBodyInfo_chipmunk.cpp; sourceTree = ""; }; - B37510461823AC7B00B3BA6A /* CCPhysicsBodyInfo_chipmunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPhysicsBodyInfo_chipmunk.h; sourceTree = ""; }; - B37510471823AC7B00B3BA6A /* CCPhysicsContactInfo_chipmunk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCPhysicsContactInfo_chipmunk.cpp; sourceTree = ""; }; - B37510481823AC7B00B3BA6A /* CCPhysicsContactInfo_chipmunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPhysicsContactInfo_chipmunk.h; sourceTree = ""; }; - B37510491823AC7B00B3BA6A /* CCPhysicsHelper_chipmunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPhysicsHelper_chipmunk.h; sourceTree = ""; }; - B375104A1823AC7B00B3BA6A /* CCPhysicsJointInfo_chipmunk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCPhysicsJointInfo_chipmunk.cpp; sourceTree = ""; }; - B375104B1823AC7B00B3BA6A /* CCPhysicsJointInfo_chipmunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPhysicsJointInfo_chipmunk.h; sourceTree = ""; }; - B375104C1823AC7B00B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCPhysicsShapeInfo_chipmunk.cpp; sourceTree = ""; }; - B375104D1823AC7B00B3BA6A /* CCPhysicsShapeInfo_chipmunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPhysicsShapeInfo_chipmunk.h; sourceTree = ""; }; - B375104E1823AC7B00B3BA6A /* CCPhysicsWorldInfo_chipmunk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCPhysicsWorldInfo_chipmunk.cpp; sourceTree = ""; }; - B375104F1823AC7B00B3BA6A /* CCPhysicsWorldInfo_chipmunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPhysicsWorldInfo_chipmunk.h; sourceTree = ""; }; B3AF019E1842FBA400A98B85 /* b2MotorJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MotorJoint.cpp; sourceTree = ""; }; B3AF019F1842FBA400A98B85 /* b2MotorJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MotorJoint.h; sourceTree = ""; }; B60C5BD219AC68B10056FBDE /* CCBillBoard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCBillBoard.cpp; sourceTree = ""; }; @@ -3079,6 +3048,7 @@ DA8C62A119E52C6400000516 /* ioapi_mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi_mem.h; sourceTree = ""; }; DABC9FA719E7DFA900FA252C /* CCClippingRectangleNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCClippingRectangleNode.cpp; sourceTree = ""; }; DABC9FA819E7DFA900FA252C /* CCClippingRectangleNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCClippingRectangleNode.h; sourceTree = ""; }; + ED74D7681A5B8A2600157FD4 /* CCPhysicsHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPhysicsHelper.h; sourceTree = ""; }; ED9C6A9218599AD8000A5232 /* CCNodeGrid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = CCNodeGrid.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; ED9C6A9318599AD8000A5232 /* CCNodeGrid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCNodeGrid.h; sourceTree = ""; }; /* End PBXFileReference section */ @@ -4787,7 +4757,7 @@ 46A170611807CE7A005B8026 /* physics */ = { isa = PBXGroup; children = ( - 46A170791807CE7A005B8026 /* chipmunk */, + ED74D7681A5B8A2600157FD4 /* CCPhysicsHelper.h */, 46A1706E1807CE7A005B8026 /* CCPhysicsBody.cpp */, 46A1706F1807CE7A005B8026 /* CCPhysicsBody.h */, 46A170701807CE7A005B8026 /* CCPhysicsContact.cpp */, @@ -4803,24 +4773,6 @@ path = ../cocos/physics; sourceTree = ""; }; - 46A170791807CE7A005B8026 /* chipmunk */ = { - isa = PBXGroup; - children = ( - B37510451823AC7B00B3BA6A /* CCPhysicsBodyInfo_chipmunk.cpp */, - B37510461823AC7B00B3BA6A /* CCPhysicsBodyInfo_chipmunk.h */, - B37510471823AC7B00B3BA6A /* CCPhysicsContactInfo_chipmunk.cpp */, - B37510481823AC7B00B3BA6A /* CCPhysicsContactInfo_chipmunk.h */, - B37510491823AC7B00B3BA6A /* CCPhysicsHelper_chipmunk.h */, - B375104A1823AC7B00B3BA6A /* CCPhysicsJointInfo_chipmunk.cpp */, - B375104B1823AC7B00B3BA6A /* CCPhysicsJointInfo_chipmunk.h */, - B375104C1823AC7B00B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp */, - B375104D1823AC7B00B3BA6A /* CCPhysicsShapeInfo_chipmunk.h */, - B375104E1823AC7B00B3BA6A /* CCPhysicsWorldInfo_chipmunk.cpp */, - B375104F1823AC7B00B3BA6A /* CCPhysicsWorldInfo_chipmunk.h */, - ); - path = chipmunk; - sourceTree = ""; - }; 46A170851807CE87005B8026 /* math */ = { isa = PBXGroup; children = ( @@ -5329,7 +5281,6 @@ 15AE18F719AAD35000C27E9E /* CCBatchNode.h in Headers */, 15AE181419AAD2F700C27E9E /* CCAnimationCurve.h in Headers */, 50ABBE631925AB6F00A911A9 /* CCEventListenerAcceleration.h in Headers */, - B37510771823AC9F00B3BA6A /* CCPhysicsJointInfo_chipmunk.h in Headers */, 15AE1C1419AAE2C600C27E9E /* CCPhysicsSprite.h in Headers */, 46A170EE1807CECA005B8026 /* CCPhysicsShape.h in Headers */, 15AE1A5C19AAD40300C27E9E /* b2Timer.h in Headers */, @@ -5342,7 +5293,6 @@ 15AE1A6D19AAD40300C27E9E /* b2ChainAndPolygonContact.h in Headers */, 3E2F27A719CFBFE400E7C490 /* AudioEngine.h in Headers */, 15AE183A19AAD2F700C27E9E /* CCRay.h in Headers */, - B375107B1823AC9F00B3BA6A /* CCPhysicsWorldInfo_chipmunk.h in Headers */, 15AE18A319AAD33D00C27E9E /* CCParticleSystemQuadLoader.h in Headers */, 46A170F01807CECA005B8026 /* CCPhysicsWorld.h in Headers */, 15AE199D19AAD39600C27E9E /* ScrollViewReader.h in Headers */, @@ -5416,7 +5366,6 @@ 15AE1A6B19AAD40300C27E9E /* b2ChainAndCircleContact.h in Headers */, 1A570110180BC8EE0088DEC7 /* CCDrawingPrimitives.h in Headers */, 50CB247D19D9C5A100687767 /* AudioPlayer.h in Headers */, - B37510791823AC9F00B3BA6A /* CCPhysicsShapeInfo_chipmunk.h in Headers */, 1A570114180BC8EE0088DEC7 /* CCDrawNode.h in Headers */, 15AE1A6019AAD40300C27E9E /* b2ContactManager.h in Headers */, 15B3707A19EE414C00ABE682 /* AssetsManagerEx.h in Headers */, @@ -5501,6 +5450,7 @@ 50ABBD401925AB0000A911A9 /* CCMath.h in Headers */, B29A7E1F19EE1B7700872B35 /* BoneData.h in Headers */, 15AE1A9319AAD40300C27E9E /* b2WheelJoint.h in Headers */, + ED74D7691A5B8A2600157FD4 /* CCPhysicsHelper.h in Headers */, 15AE1A3119AAD3D500C27E9E /* b2ChainShape.h in Headers */, 1A5701FD180BCBAD0088DEC7 /* CCMenuItem.h in Headers */, 1A570204180BCBD40088DEC7 /* CCClippingNode.h in Headers */, @@ -5641,7 +5591,6 @@ 50ABC0651926664800A911A9 /* CCGL-mac.h in Headers */, 50643BD419BFAECF00EF68ED /* CCGL.h in Headers */, 15AE190C19AAD35000C27E9E /* CCDisplayFactory.h in Headers */, - B37510751823AC9F00B3BA6A /* CCPhysicsHelper_chipmunk.h in Headers */, 15AE1A8B19AAD40300C27E9E /* b2PulleyJoint.h in Headers */, 15AE1A5119AAD40300C27E9E /* b2BlockAllocator.h in Headers */, 15AE199119AAD37200C27E9E /* ImageViewReader.h in Headers */, @@ -5672,7 +5621,6 @@ 15AE186719AAD31D00C27E9E /* CDXMacOSXSupport.h in Headers */, B29A7DCD19EE1B7700872B35 /* Slot.h in Headers */, 382384311A259112002C4610 /* ParticleReader.h in Headers */, - B37510741823AC9F00B3BA6A /* CCPhysicsContactInfo_chipmunk.h in Headers */, 5034CA35191D591100CE6051 /* ccShader_PositionTexture.frag in Headers */, 15AE1BB219AADFEF00C27E9E /* HttpClient.h in Headers */, 15AE197619AAD35700C27E9E /* CCTimelineMacro.h in Headers */, @@ -5761,7 +5709,6 @@ 1A01C69018F57BE800EFE3A6 /* CCDictionary.h in Headers */, 1A9DCA29180E6955007A3AD4 /* CCGLBufferedNode.h in Headers */, 50ABC0031926664800A911A9 /* CCLock-apple.h in Headers */, - B37510721823AC9F00B3BA6A /* CCPhysicsBodyInfo_chipmunk.h in Headers */, 50ABBE2D1925AB6F00A911A9 /* ccCArray.h in Headers */, 50ABBD5E1925AB0000A911A9 /* Vec3.h in Headers */, 15AE188919AAD33D00C27E9E /* CCControlButtonLoader.h in Headers */, @@ -5860,6 +5807,7 @@ B29A7DFE19EE1B7700872B35 /* IkConstraintData.h in Headers */, 382384401A259140002C4610 /* SingleNodeReader.h in Headers */, 15AE1A4019AAD3D500C27E9E /* b2Collision.h in Headers */, + ED74D76A1A5B8A2600157FD4 /* CCPhysicsHelper.h in Headers */, 5034CA40191D591100CE6051 /* ccShader_Position_uColor.vert in Headers */, 15AE184719AAD2F700C27E9E /* CCSprite3DMaterial.h in Headers */, 15AE1BFC19AAE01E00C27E9E /* CCControlUtils.h in Headers */, @@ -5901,7 +5849,6 @@ 1A570074180BC5A10088DEC7 /* CCActionGrid.h in Headers */, 15AE194A19AAD35100C27E9E /* CCComController.h in Headers */, 382384161A259092002C4610 /* NodeReaderProtocol.h in Headers */, - B37510841823ACA100B3BA6A /* CCPhysicsShapeInfo_chipmunk.h in Headers */, 5034CA46191D591100CE6051 /* ccShader_Label_outline.frag in Headers */, 1A570078180BC5A10088DEC7 /* CCActionGrid3D.h in Headers */, 50ABBD631925AB0000A911A9 /* Vec4.h in Headers */, @@ -5916,7 +5863,6 @@ 15AE18CD19AAD33D00C27E9E /* CCNode+CCBRelativePositioning.h in Headers */, 382384121A259092002C4610 /* NodeReaderDefine.h in Headers */, 50ABBE781925AB6F00A911A9 /* CCEventListenerTouch.h in Headers */, - B37510861823ACA100B3BA6A /* CCPhysicsWorldInfo_chipmunk.h in Headers */, 15AE1BC019AADFF000C27E9E /* WebSocket.h in Headers */, 3823840A1A25900F002C4610 /* FlatBuffersSerialize.h in Headers */, 1A570080180BC5A10088DEC7 /* CCActionInterval.h in Headers */, @@ -6077,7 +6023,6 @@ 15B3708B19EE414C00ABE682 /* Manifest.h in Headers */, 1A570213180BCBF40088DEC7 /* CCProgressTimer.h in Headers */, 38F526431A48363B000DB7F7 /* CSArmatureNode_generated.h in Headers */, - B37510821823ACA100B3BA6A /* CCPhysicsJointInfo_chipmunk.h in Headers */, 1A570217180BCBF40088DEC7 /* CCRenderTexture.h in Headers */, 15AE1ABB19AAD40300C27E9E /* b2EdgeAndPolygonContact.h in Headers */, 15AE198719AAD36400C27E9E /* WidgetReaderProtocol.h in Headers */, @@ -6166,7 +6111,6 @@ 15AE18C419AAD33D00C27E9E /* CCLayerGradientLoader.h in Headers */, 1A570313180BCF190088DEC7 /* CCComponentContainer.h in Headers */, 1A087AEB1860400400196EF5 /* edtaa3func.h in Headers */, - B375107F1823ACA100B3BA6A /* CCPhysicsContactInfo_chipmunk.h in Headers */, 15AE185D19AAD31200C27E9E /* CocosDenshion.h in Headers */, 15AE194319AAD35100C27E9E /* CCColliderDetector.h in Headers */, D0FD035C1A3B51AA00825BB5 /* CCAllocatorStrategyFixedBlock.h in Headers */, @@ -6322,12 +6266,10 @@ 50ABC00A1926664800A911A9 /* CCCommon.h in Headers */, 15AE19AD19AAD39700C27E9E /* LoadingBarReader.h in Headers */, 50ABBE5C1925AB6F00A911A9 /* CCEventKeyboard.h in Headers */, - B375107D1823ACA100B3BA6A /* CCPhysicsBodyInfo_chipmunk.h in Headers */, 5E9F612D1A3FFE3D0038DE01 /* CCPlane.h in Headers */, 50ABC01C1926664800A911A9 /* CCSAXParser.h in Headers */, 503DD8F11926736A00CD74DD /* OpenGL_Internal-ios.h in Headers */, 38ACD1FF1A27111900C3093D /* WidgetCallBackHandlerProtocol.h in Headers */, - B37510801823ACA100B3BA6A /* CCPhysicsHelper_chipmunk.h in Headers */, B29A7DF619EE1B7700872B35 /* Skeleton.h in Headers */, 50ABBDAA1925AB4100A911A9 /* CCRenderCommand.h in Headers */, B29A7DF019EE1B7700872B35 /* SkeletonBounds.h in Headers */, @@ -6492,12 +6434,10 @@ 15AE1A8219AAD40300C27E9E /* b2GearJoint.cpp in Sources */, 1A570071180BC5A10088DEC7 /* CCActionGrid.cpp in Sources */, 50CB247F19D9C5A100687767 /* AudioPlayer.mm in Sources */, - B37510761823AC9F00B3BA6A /* CCPhysicsJointInfo_chipmunk.cpp in Sources */, 50ABBFFF1926664800A911A9 /* CCFileUtils-apple.mm in Sources */, 1A570075180BC5A10088DEC7 /* CCActionGrid3D.cpp in Sources */, 382383F81A258FA7002C4610 /* idl_gen_general.cpp in Sources */, 15AE1C1319AAE2C600C27E9E /* CCPhysicsSprite.cpp in Sources */, - B375107A1823AC9F00B3BA6A /* CCPhysicsWorldInfo_chipmunk.cpp in Sources */, 382384131A259092002C4610 /* NodeReaderProtocol.cpp in Sources */, 15AE1A5F19AAD40300C27E9E /* b2ContactManager.cpp in Sources */, 15AE1B9D19AADFDF00C27E9E /* UIVBox.cpp in Sources */, @@ -6531,7 +6471,6 @@ D0FD034B1A3B51AA00825BB5 /* CCAllocatorDiagnostics.cpp in Sources */, 15AE189B19AAD33D00C27E9E /* CCNode+CCBRelativePositioning.cpp in Sources */, 15AE183819AAD2F700C27E9E /* CCRay.cpp in Sources */, - B37510781823AC9F00B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp in Sources */, 50ABBE391925AB6F00A911A9 /* CCData.cpp in Sources */, 1A57010E180BC8EE0088DEC7 /* CCDrawingPrimitives.cpp in Sources */, 50ABBED71925AB6F00A911A9 /* ZipUtils.cpp in Sources */, @@ -6583,7 +6522,6 @@ 50ABBD4C1925AB0000A911A9 /* MathUtil.cpp in Sources */, 15AE191719AAD35000C27E9E /* CCSpriteFrameCacheHelper.cpp in Sources */, 1A087AE81860400400196EF5 /* edtaa3func.cpp in Sources */, - B37510731823AC9F00B3BA6A /* CCPhysicsContactInfo_chipmunk.cpp in Sources */, 50ABBD831925AB4100A911A9 /* CCBatchCommand.cpp in Sources */, 15AE18FF19AAD35000C27E9E /* CCComAudio.cpp in Sources */, 1A5701C7180BCB5A0088DEC7 /* CCLabelTextFormatter.cpp in Sources */, @@ -6716,7 +6654,6 @@ B29A7E0719EE1B7700872B35 /* SkinnedMeshAttachment.c in Sources */, 1A570310180BCF190088DEC7 /* CCComponentContainer.cpp in Sources */, 15AE190719AAD35000C27E9E /* CCDatas.cpp in Sources */, - B37510711823AC9F00B3BA6A /* CCPhysicsBodyInfo_chipmunk.cpp in Sources */, 1A01C69C18F57BE800EFE3A6 /* CCString.cpp in Sources */, 50ABBD3C1925AB0000A911A9 /* CCGeometry.cpp in Sources */, B29A7DDD19EE1B7700872B35 /* BoneData.c in Sources */, @@ -6909,7 +6846,6 @@ 15AE186119AAD31200C27E9E /* SimpleAudioEngine_objc.m in Sources */, 15AE182519AAD2F700C27E9E /* CCMesh.cpp in Sources */, 503DD8EE1926736A00CD74DD /* CCImage-ios.mm in Sources */, - B37510811823ACA100B3BA6A /* CCPhysicsJointInfo_chipmunk.cpp in Sources */, 46A170FC1807CECB005B8026 /* CCPhysicsBody.cpp in Sources */, 15AE1BEA19AAE01E00C27E9E /* CCControlButton.cpp in Sources */, 50ABBD941925AB4100A911A9 /* CCGLProgramState.cpp in Sources */, @@ -6993,7 +6929,6 @@ 15AE1AB219AAD40300C27E9E /* b2CircleContact.cpp in Sources */, B29A7E2619EE1B7700872B35 /* Attachment.c in Sources */, 15AE18C119AAD33D00C27E9E /* CCLayerColorLoader.cpp in Sources */, - B37510851823ACA100B3BA6A /* CCPhysicsWorldInfo_chipmunk.cpp in Sources */, 50ABBD551925AB0000A911A9 /* TransformUtils.cpp in Sources */, 292DB14419B4574100A80320 /* UIEditBoxImpl-android.cpp in Sources */, 15AE193619AAD35100C27E9E /* CCArmature.cpp in Sources */, @@ -7028,7 +6963,6 @@ 50ABBD4D1925AB0000A911A9 /* MathUtil.cpp in Sources */, 50ABBE3E1925AB6F00A911A9 /* CCDataVisitor.cpp in Sources */, 1A57009F180BC5D20088DEC7 /* CCNode.cpp in Sources */, - B37510831823ACA100B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp in Sources */, 1A57010F180BC8EE0088DEC7 /* CCDrawingPrimitives.cpp in Sources */, 1A570113180BC8EE0088DEC7 /* CCDrawNode.cpp in Sources */, 1A57011C180BC90D0088DEC7 /* CCGrabber.cpp in Sources */, @@ -7084,7 +7018,6 @@ 15AE1BAD19AADFDF00C27E9E /* UILayoutParameter.cpp in Sources */, 3823843E1A259140002C4610 /* SingleNodeReader.cpp in Sources */, B29A7DDE19EE1B7700872B35 /* BoneData.c in Sources */, - B375107E1823ACA100B3BA6A /* CCPhysicsContactInfo_chipmunk.cpp in Sources */, 15AE19AA19AAD39700C27E9E /* ListViewReader.cpp in Sources */, 1A5701C8180BCB5A0088DEC7 /* CCLabelTextFormatter.cpp in Sources */, 1A5701CC180BCB5A0088DEC7 /* CCLabelTTF.cpp in Sources */, @@ -7214,7 +7147,6 @@ 15AE193219AAD35100C27E9E /* CCActionNode.cpp in Sources */, 15AE195319AAD35100C27E9E /* CCDisplayFactory.cpp in Sources */, 50ABC0061926664800A911A9 /* CCThread-apple.mm in Sources */, - B375107C1823ACA100B3BA6A /* CCPhysicsBodyInfo_chipmunk.cpp in Sources */, 50ABBEB61925AB6F00A911A9 /* CCUserDefault-android.cpp in Sources */, 296BF6191A4405CB0038EC44 /* UIShaders.cpp in Sources */, 1A57034C180BD09B0088DEC7 /* tinyxml2.cpp in Sources */, diff --git a/cocos/2d/libcocos2d.vcxproj b/cocos/2d/libcocos2d.vcxproj index 5898629f82..fb0b1f4062 100644 --- a/cocos/2d/libcocos2d.vcxproj +++ b/cocos/2d/libcocos2d.vcxproj @@ -408,11 +408,6 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* - - - - - @@ -820,15 +815,10 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* + - - - - - - diff --git a/cocos/2d/libcocos2d.vcxproj.filters b/cocos/2d/libcocos2d.vcxproj.filters index 6e44cd0a38..7862cbe2c6 100644 --- a/cocos/2d/libcocos2d.vcxproj.filters +++ b/cocos/2d/libcocos2d.vcxproj.filters @@ -4,9 +4,6 @@ {08593631-5bf5-46aa-9436-62595c4f7bf6} - - {aeadfa95-9c89-4212-98ae-89ad57db596a} - {0b1152b1-c732-4560-8629-87843b0fbd7c} @@ -264,21 +261,6 @@ physics - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - external\xxhash @@ -1338,24 +1320,6 @@ physics - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - external\xxhash @@ -2581,6 +2545,9 @@ + + physics + diff --git a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems index 075370d83f..37ebf55506 100644 --- a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems +++ b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems @@ -287,15 +287,10 @@ + - - - - - - @@ -697,11 +692,6 @@ - - - - - diff --git a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters index 3f8b5fb619..41cc21558d 100644 --- a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters +++ b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters @@ -195,24 +195,6 @@ external\tinyxml2 - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - physics @@ -1306,6 +1288,9 @@ base\allocator + + physics + @@ -1474,21 +1459,6 @@ external\tinyxml2 - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - physics @@ -2479,9 +2449,6 @@ {9a5d5bc4-80f9-42aa-8865-c79711dfa7d6} - - {97dd34cb-0d69-4ecd-bbf6-976cdf236d60} - {7345e280-b8a5-4d89-a27c-60cf351952d2} diff --git a/cocos/2d/libcocos2d_wp8.vcxproj b/cocos/2d/libcocos2d_wp8.vcxproj index 3c855b5308..c767196d41 100644 --- a/cocos/2d/libcocos2d_wp8.vcxproj +++ b/cocos/2d/libcocos2d_wp8.vcxproj @@ -435,15 +435,10 @@ + - - - - - - @@ -918,11 +913,6 @@ - - - - - diff --git a/cocos/2d/libcocos2d_wp8.vcxproj.filters b/cocos/2d/libcocos2d_wp8.vcxproj.filters index f935612a04..4feae4a4b9 100644 --- a/cocos/2d/libcocos2d_wp8.vcxproj.filters +++ b/cocos/2d/libcocos2d_wp8.vcxproj.filters @@ -41,9 +41,6 @@ {a7501f5e-4fef-4f37-a646-ffe633008d9b} - - {12ce37e2-709d-416e-a592-1c60b33fd6ce} - {1850cae0-9e70-47af-87d5-c90f8343c06a} @@ -721,21 +718,6 @@ physics - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - platform @@ -1871,24 +1853,6 @@ physics - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - - - physics\chipmunk - platform @@ -2631,6 +2595,9 @@ base\allocator + + physics + diff --git a/cocos/Android.mk b/cocos/Android.mk index 2cd641e5d6..2b2ff3e00a 100644 --- a/cocos/Android.mk +++ b/cocos/Android.mk @@ -179,11 +179,6 @@ physics/CCPhysicsContact.cpp \ physics/CCPhysicsJoint.cpp \ physics/CCPhysicsShape.cpp \ physics/CCPhysicsWorld.cpp \ -physics/chipmunk/CCPhysicsBodyInfo_chipmunk.cpp \ -physics/chipmunk/CCPhysicsContactInfo_chipmunk.cpp \ -physics/chipmunk/CCPhysicsJointInfo_chipmunk.cpp \ -physics/chipmunk/CCPhysicsShapeInfo_chipmunk.cpp \ -physics/chipmunk/CCPhysicsWorldInfo_chipmunk.cpp \ ../external/ConvertUTF/ConvertUTFWrapper.cpp \ ../external/ConvertUTF/ConvertUTF.c \ ../external/tinyxml2/tinyxml2.cpp \ diff --git a/cocos/physics/CCPhysicsHelper.h b/cocos/physics/CCPhysicsHelper.h index e6deb135a4..a53d1cf337 100644 --- a/cocos/physics/CCPhysicsHelper.h +++ b/cocos/physics/CCPhysicsHelper.h @@ -22,8 +22,8 @@ THE SOFTWARE. ****************************************************************************/ -#ifndef __CCPHYSICS_HELPER_CHIPMUNK_H__ -#define __CCPHYSICS_HELPER_CHIPMUNK_H__ +#ifndef __CCPHYSICS_HELPER_H__ +#define __CCPHYSICS_HELPER_H__ #include "base/ccConfig.h" #if CC_USE_PHYSICS @@ -70,4 +70,4 @@ public: NS_CC_END #endif // CC_USE_PHYSICS -#endif // __CCPHYSICS_HELPER_CHIPMUNK_H__ +#endif // __CCPHYSICS_HELPER_H__ diff --git a/cocos/physics/CMakeLists.txt b/cocos/physics/CMakeLists.txt index e3abd05af4..22d5349bdf 100644 --- a/cocos/physics/CMakeLists.txt +++ b/cocos/physics/CMakeLists.txt @@ -6,10 +6,5 @@ set(COCOS_PHYSICS_SRC physics/CCPhysicsJoint.cpp physics/CCPhysicsShape.cpp physics/CCPhysicsWorld.cpp - physics/chipmunk/CCPhysicsBodyInfo_chipmunk.cpp - physics/chipmunk/CCPhysicsContactInfo_chipmunk.cpp - physics/chipmunk/CCPhysicsJointInfo_chipmunk.cpp - physics/chipmunk/CCPhysicsShapeInfo_chipmunk.cpp - physics/chipmunk/CCPhysicsWorldInfo_chipmunk.cpp ) From 961487d3fa180ec9e4e656137d17b7c8d0839e8f Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 6 Jan 2015 16:12:40 +0800 Subject: [PATCH 016/106] [ci skip]Update Authors --- AUTHORS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS b/AUTHORS index eeaf5c123e..5bcb776903 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1061,6 +1061,9 @@ Developers: shrimpz Fix two typos in luaval_to_quaternion Fix label crashed on android + + ton1517 + Fix the issue that JumpTo can not be applied more than once Retired Core Developers: WenSheng Yang From 339a8b1abcc6abab0f6869367cac7964bf63c587 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Tue, 6 Jan 2015 16:18:01 +0800 Subject: [PATCH 017/106] class rename for EGLConfigChooser --- .../java/src/org/cocos2dx/lib/Cocos2dxActivity.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java index a0689ad3aa..98f99b6f2c 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java @@ -63,14 +63,14 @@ public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelpe private Cocos2dxVideoHelper mVideoHelper = null; private Cocos2dxWebViewHelper mWebViewHelper = null; - public class cocos2dEGLConfigChooser implements GLSurfaceView.EGLConfigChooser + public class Cocos2dxEGLConfigChooser implements GLSurfaceView.EGLConfigChooser { protected int[] configAttribs; - public cocos2dEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize) + public Cocos2dxEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize) { configAttribs = new int[] {redSize, greenSize, blueSize, alphaSize, depthSize, stencilSize}; } - public cocos2dEGLConfigChooser(int[] attribs) + public Cocos2dxEGLConfigChooser(int[] attribs) { configAttribs = attribs; } @@ -345,7 +345,7 @@ public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelpe //this line is need on some device if we specify an alpha bits if(this.mGLContextAttrs[3] > 0) glSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT); - cocos2dEGLConfigChooser chooser = new cocos2dEGLConfigChooser(this.mGLContextAttrs); + Cocos2dxEGLConfigChooser chooser = new Cocos2dxEGLConfigChooser(this.mGLContextAttrs); glSurfaceView.setEGLConfigChooser(chooser); return glSurfaceView; From 1837b083f73d8e4011c64378b88d7b80ee7af661 Mon Sep 17 00:00:00 2001 From: zhangbin Date: Tue, 6 Jan 2015 18:13:48 +0800 Subject: [PATCH 018/106] 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 0da825a025..77aca3d1b5 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 0da825a0256ff8f7edc33b4930ecdc703eaebe41 +Subproject commit 77aca3d1b5d8baf8b0a24078707522d464e81e01 From babbac4e38a67ae06266b351a12a82434734ff43 Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 6 Jan 2015 14:45:10 +0300 Subject: [PATCH 019/106] comments --- cocos/base/CCDirector.cpp | 1 + cocos/deprecated/CCDeprecated.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/cocos/base/CCDirector.cpp b/cocos/base/CCDirector.cpp index f72907aa2e..54016e6009 100644 --- a/cocos/base/CCDirector.cpp +++ b/cocos/base/CCDirector.cpp @@ -971,6 +971,7 @@ void Director::purgeDirector() #pragma warning (push) #pragma warning (disable: 4996) #endif +//it will crash clang static analyzer so hide it if __clang_analyzer__ defined #ifndef __clang_analyzer__ DrawPrimitives::free(); #endif diff --git a/cocos/deprecated/CCDeprecated.cpp b/cocos/deprecated/CCDeprecated.cpp index 11d544b77f..5a3c2acee0 100644 --- a/cocos/deprecated/CCDeprecated.cpp +++ b/cocos/deprecated/CCDeprecated.cpp @@ -87,6 +87,7 @@ void ccDrawInit() void ccDrawFree() { +//it will crash clang static analyzer so hide it if __clang_analyzer__ defined #ifndef __clang_analyzer__ DrawPrimitives::free(); #endif From 6a88a51e24a6e358c8a80cdb8ec0ab060e72dc26 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 7 Jan 2015 02:23:16 +0000 Subject: [PATCH 020/106] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index a381e3be8f..0432aabdf3 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -816,6 +816,7 @@ "cocos/physics/CCPhysicsBody.h", "cocos/physics/CCPhysicsContact.cpp", "cocos/physics/CCPhysicsContact.h", + "cocos/physics/CCPhysicsHelper.h", "cocos/physics/CCPhysicsJoint.cpp", "cocos/physics/CCPhysicsJoint.h", "cocos/physics/CCPhysicsShape.cpp", @@ -823,17 +824,6 @@ "cocos/physics/CCPhysicsWorld.cpp", "cocos/physics/CCPhysicsWorld.h", "cocos/physics/CMakeLists.txt", - "cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.cpp", - "cocos/physics/chipmunk/CCPhysicsBodyInfo_chipmunk.h", - "cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.cpp", - "cocos/physics/chipmunk/CCPhysicsContactInfo_chipmunk.h", - "cocos/physics/chipmunk/CCPhysicsHelper_chipmunk.h", - "cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.cpp", - "cocos/physics/chipmunk/CCPhysicsJointInfo_chipmunk.h", - "cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.cpp", - "cocos/physics/chipmunk/CCPhysicsShapeInfo_chipmunk.h", - "cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.cpp", - "cocos/physics/chipmunk/CCPhysicsWorldInfo_chipmunk.h", "cocos/platform/CCApplication.h", "cocos/platform/CCApplicationProtocol.h", "cocos/platform/CCCommon.h", From f83daed2cf317daeff03ba526192adfa712910ec Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 7 Jan 2015 02:27:01 +0000 Subject: [PATCH 021/106] [AUTO]: updating luabinding automatically --- .../lua-bindings/auto/api/PhysicsBody.lua | 6 +++ .../auto/lua_cocos2dx_physics_auto.cpp | 48 +++++++++++++++++++ .../auto/lua_cocos2dx_physics_auto.hpp | 1 + 3 files changed, 55 insertions(+) diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsBody.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsBody.lua index 3202c50f16..fd6dc2b13e 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsBody.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsBody.lua @@ -332,6 +332,12 @@ -- @param self -- @return bool#bool ret (return value: bool) +-------------------------------- +-- +-- @function [parent=#PhysicsBody] getCPBody +-- @param self +-- @return cpBody#cpBody ret (return value: cpBody) + -------------------------------- -- get angular damping. -- @function [parent=#PhysicsBody] getAngularDamping diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp index e175c3e96e..5452245563 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp @@ -4839,6 +4839,53 @@ int lua_cocos2dx_physics_PhysicsBody_isRotationEnabled(lua_State* tolua_S) return 0; } +int lua_cocos2dx_physics_PhysicsBody_getCPBody(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsBody* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsBody",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsBody*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsBody_getCPBody'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsBody_getCPBody'", nullptr); + return 0; + } + cpBody* ret = cobj->getCPBody(); + #pragma warning NO CONVERSION FROM NATIVE FOR cpBody*; + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsBody:getCPBody",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsBody_getCPBody'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsBody_getAngularDamping(lua_State* tolua_S) { int argc = 0; @@ -5790,6 +5837,7 @@ int lua_register_cocos2dx_physics_PhysicsBody(lua_State* tolua_S) tolua_function(tolua_S,"setPositionOffset",lua_cocos2dx_physics_PhysicsBody_setPositionOffset); tolua_function(tolua_S,"setRotationEnable",lua_cocos2dx_physics_PhysicsBody_setRotationEnable); tolua_function(tolua_S,"isRotationEnabled",lua_cocos2dx_physics_PhysicsBody_isRotationEnabled); + tolua_function(tolua_S,"getCPBody",lua_cocos2dx_physics_PhysicsBody_getCPBody); tolua_function(tolua_S,"getAngularDamping",lua_cocos2dx_physics_PhysicsBody_getAngularDamping); tolua_function(tolua_S,"getVelocityAtLocalPoint",lua_cocos2dx_physics_PhysicsBody_getVelocityAtLocalPoint); tolua_function(tolua_S,"isResting",lua_cocos2dx_physics_PhysicsBody_isResting); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.hpp index 4a61023ad2..244b66a31e 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.hpp @@ -266,6 +266,7 @@ int register_all_cocos2dx_physics(lua_State* tolua_S); + #endif // __cocos2dx_physics_h__ From ac7ddad4acfb36432304229012ae1fcdc6845aec Mon Sep 17 00:00:00 2001 From: huangshiwu Date: Wed, 7 Jan 2015 11:02:31 +0800 Subject: [PATCH 022/106] DrawNode override drawPoints function to set pointsize, fix draw points use last color bug and drawRect behavior bug --- cocos/2d/CCDrawNode.cpp | 29 ++++++++--------------------- cocos/2d/CCDrawNode.h | 1 + 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/cocos/2d/CCDrawNode.cpp b/cocos/2d/CCDrawNode.cpp index 229c049561..9073bfdc81 100644 --- a/cocos/2d/CCDrawNode.cpp +++ b/cocos/2d/CCDrawNode.cpp @@ -391,13 +391,10 @@ void DrawNode::onDrawGLLine(const Mat4 &transform, uint32_t flags) void DrawNode::onDrawGLPoint(const Mat4 &transform, uint32_t flags) { - auto glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_U_COLOR); + auto glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_COLOR); glProgram->use(); glProgram->setUniformsForBuiltins(transform); - glProgram->setUniformLocationWith4fv(glProgram->getUniformLocation("u_color"), (GLfloat*) &_pointColor.r, 1); - glProgram->setUniformLocationWith1f(glProgram->getUniformLocation("u_pointSize"), _pointSize); - if (_dirtyGLPoint) { glBindBuffer(GL_ARRAY_BUFFER, _vboGLPoint); @@ -459,6 +456,12 @@ void DrawNode::drawPoints(const Vec2 *position, unsigned int numberOfPoints, con _dirtyGLPoint = true; } +void DrawNode::drawPoints(const Vec2 *position, unsigned int numberOfPoints, const float pointSize, const Color4F &color) +{ + _pointSize = pointSize; + drawPoints(position, numberOfPoints, color); +} + void DrawNode::drawLine(const Vec2 &origin, const Vec2 &destination, const Color4F &color) { ensureCapacityGLLine(2); @@ -662,23 +665,7 @@ void DrawNode::drawDot(const Vec2 &pos, float radius, const Color4F &color) void DrawNode::drawRect(const Vec2 &lb, const Vec2 <, const Vec2 &rt, const Vec2& rb, const Color4F &color) { - unsigned int vertex_count = 2*3; - ensureCapacity(vertex_count); - - V2F_C4B_T2F a = {lb, Color4B(color), Tex2F(-1.0, -1.0) }; - V2F_C4B_T2F b = {lt, Color4B(color), Tex2F(-1.0, 1.0) }; - V2F_C4B_T2F c = {rt, Color4B(color), Tex2F( 1.0, 1.0) }; - V2F_C4B_T2F d = {rb, Color4B(color), Tex2F( 1.0, -1.0) }; - - V2F_C4B_T2F_Triangle *triangles = (V2F_C4B_T2F_Triangle *)(_buffer + _bufferCount); - V2F_C4B_T2F_Triangle triangle0 = {a, b, c}; - V2F_C4B_T2F_Triangle triangle1 = {a, c, d}; - triangles[0] = triangle0; - triangles[1] = triangle1; - - _bufferCount += vertex_count; - - _dirty = true; + drawRect(lb, rt, color); } void DrawNode::drawSegment(const Vec2 &from, const Vec2 &to, float radius, const Color4F &color) diff --git a/cocos/2d/CCDrawNode.h b/cocos/2d/CCDrawNode.h index 38f0b9d11f..aafc1131e7 100644 --- a/cocos/2d/CCDrawNode.h +++ b/cocos/2d/CCDrawNode.h @@ -56,6 +56,7 @@ public: void drawPoint(const Vec2& point, const float pointSize, const Color4F &color); void drawPoints(const Vec2 *position, unsigned int numberOfPoints, const Color4F &color); + void drawPoints(const Vec2 *position, unsigned int numberOfPoints, const float pointSize, const Color4F &color); void drawLine(const Vec2 &origin, const Vec2 &destination, const Color4F &color); From f9b0c9bc92c4acd0cb44007e07427ed9f89568ee Mon Sep 17 00:00:00 2001 From: lvlong Date: Wed, 7 Jan 2015 11:09:09 +0800 Subject: [PATCH 023/106] fix bug. --- cocos/3d/CCBundle3D.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 0ed5dc1754..b318fe8ebb 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -1227,6 +1227,10 @@ bool Bundle3D::loadSkinDataBinary(SkinData* skindata) return false; } + // Fix bug: check if the bone number is 0. + if (boneNum == 0) + return false; + // bone names and bind pos float bindpos[16]; for (unsigned int i = 0; i < boneNum; i++) From 54c75337c55a2127a9bf0e63d4da42e907f23256 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 7 Jan 2015 03:19:27 +0000 Subject: [PATCH 024/106] [AUTO]: updating luabinding automatically --- .../scripting/lua-bindings/auto/api/Node.lua | 18 -- .../scripting/lua-bindings/auto/api/Scene.lua | 12 - .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 228 ------------------ .../lua-bindings/auto/lua_cocos2dx_auto.hpp | 5 - 4 files changed, 263 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/api/Node.lua b/cocos/scripting/lua-bindings/auto/api/Node.lua index 319d9db4f1..af22635a7a 100644 --- a/cocos/scripting/lua-bindings/auto/api/Node.lua +++ b/cocos/scripting/lua-bindings/auto/api/Node.lua @@ -23,13 +23,6 @@ -- @param #string name -- @return bool#bool ret (return value: bool) --------------------------------- --- set the PhysicsBody that let the sprite effect with physics
--- note This method will set anchor point to Vec2::ANCHOR_MIDDLE if body not null, and you cann't change anchor point if node has a physics body. --- @function [parent=#Node] setPhysicsBody --- @param self --- @param #cc.PhysicsBody body - -------------------------------- -- Gets the description string. It makes debugging easier.
-- return A string
@@ -174,11 +167,6 @@ -- @param self -- @param #function callback --------------------------------- --- remove this node from physics world. it will remove all the physics bodies in it's children too. --- @function [parent=#Node] removeFromPhysicsWorld --- @param self - -------------------------------- -- removes all components -- @function [parent=#Node] removeAllComponents @@ -373,12 +361,6 @@ -- @param #vec2_table worldPoint -- @return vec2_table#vec2_table ret (return value: vec2_table) --------------------------------- --- get the PhysicsBody the sprite have --- @function [parent=#Node] getPhysicsBody --- @param self --- @return PhysicsBody#PhysicsBody ret (return value: cc.PhysicsBody) - -------------------------------- -- @overload self, float, float -- @overload self, vec2_table diff --git a/cocos/scripting/lua-bindings/auto/api/Scene.lua b/cocos/scripting/lua-bindings/auto/api/Scene.lua index cf8fced80d..80883588a2 100644 --- a/cocos/scripting/lua-bindings/auto/api/Scene.lua +++ b/cocos/scripting/lua-bindings/auto/api/Scene.lua @@ -4,12 +4,6 @@ -- @extend Node -- @parent_module cc --------------------------------- --- --- @function [parent=#Scene] getPhysicsWorld --- @param self --- @return PhysicsWorld#PhysicsWorld ret (return value: cc.PhysicsWorld) - -------------------------------- -- render the scene -- @function [parent=#Scene] render @@ -29,12 +23,6 @@ -- @param self -- @return Scene#Scene ret (return value: cc.Scene) --------------------------------- --- --- @function [parent=#Scene] createWithPhysics --- @param self --- @return Scene#Scene ret (return value: cc.Scene) - -------------------------------- -- @overload self, cc.Node, int, string -- @overload self, cc.Node, int, int diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index 9059f27a3d..e5022c282e 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -2964,55 +2964,6 @@ int lua_cocos2dx_Node_removeComponent(lua_State* tolua_S) return 0; } -int lua_cocos2dx_Node_setPhysicsBody(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::Node* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.Node",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Node_setPhysicsBody'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::PhysicsBody* arg0; - - ok &= luaval_to_object(tolua_S, 2, "cc.PhysicsBody",&arg0); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Node_setPhysicsBody'", nullptr); - return 0; - } - cobj->setPhysicsBody(arg0); - return 0; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:setPhysicsBody",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_setPhysicsBody'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_Node_getDescription(lua_State* tolua_S) { int argc = 0; @@ -3894,52 +3845,6 @@ int lua_cocos2dx_Node_setonEnterTransitionDidFinishCallback(lua_State* tolua_S) return 0; } -int lua_cocos2dx_Node_removeFromPhysicsWorld(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::Node* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.Node",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Node_removeFromPhysicsWorld'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Node_removeFromPhysicsWorld'", nullptr); - return 0; - } - cobj->removeFromPhysicsWorld(); - return 0; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:removeFromPhysicsWorld",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_removeFromPhysicsWorld'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_Node_removeAllComponents(lua_State* tolua_S) { int argc = 0; @@ -5277,53 +5182,6 @@ int lua_cocos2dx_Node_convertToNodeSpace(lua_State* tolua_S) return 0; } -int lua_cocos2dx_Node_getPhysicsBody(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::Node* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.Node",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Node_getPhysicsBody'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Node_getPhysicsBody'", nullptr); - return 0; - } - cocos2d::PhysicsBody* ret = cobj->getPhysicsBody(); - object_to_luaval(tolua_S, "cc.PhysicsBody",(cocos2d::PhysicsBody*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:getPhysicsBody",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_getPhysicsBody'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_Node_setPosition(lua_State* tolua_S) { int argc = 0; @@ -9474,7 +9332,6 @@ int lua_register_cocos2dx_Node(lua_State* tolua_S) tolua_beginmodule(tolua_S,"Node"); tolua_function(tolua_S,"addChild",lua_cocos2dx_Node_addChild); tolua_function(tolua_S,"removeComponent",lua_cocos2dx_Node_removeComponent); - tolua_function(tolua_S,"setPhysicsBody",lua_cocos2dx_Node_setPhysicsBody); tolua_function(tolua_S,"getDescription",lua_cocos2dx_Node_getDescription); tolua_function(tolua_S,"setRotationSkewY",lua_cocos2dx_Node_setRotationSkewY); tolua_function(tolua_S,"setOpacityModifyRGB",lua_cocos2dx_Node_setOpacityModifyRGB); @@ -9493,7 +9350,6 @@ int lua_register_cocos2dx_Node(lua_State* tolua_S) tolua_function(tolua_S,"setScaleX",lua_cocos2dx_Node_setScaleX); tolua_function(tolua_S,"setRotationSkewX",lua_cocos2dx_Node_setRotationSkewX); tolua_function(tolua_S,"setonEnterTransitionDidFinishCallback",lua_cocos2dx_Node_setonEnterTransitionDidFinishCallback); - tolua_function(tolua_S,"removeFromPhysicsWorld",lua_cocos2dx_Node_removeFromPhysicsWorld); tolua_function(tolua_S,"removeAllComponents",lua_cocos2dx_Node_removeAllComponents); tolua_function(tolua_S,"getOpacity",lua_cocos2dx_Node_getOpacity); tolua_function(tolua_S,"setCameraMask",lua_cocos2dx_Node_setCameraMask); @@ -9521,7 +9377,6 @@ int lua_register_cocos2dx_Node(lua_State* tolua_S) tolua_function(tolua_S,"getNodeToParentTransform",lua_cocos2dx_Node_getNodeToParentTransform); tolua_function(tolua_S,"convertTouchToNodeSpaceAR",lua_cocos2dx_Node_convertTouchToNodeSpaceAR); tolua_function(tolua_S,"convertToNodeSpace",lua_cocos2dx_Node_convertToNodeSpace); - tolua_function(tolua_S,"getPhysicsBody",lua_cocos2dx_Node_getPhysicsBody); tolua_function(tolua_S,"setPosition",lua_cocos2dx_Node_setPosition); tolua_function(tolua_S,"stopActionByTag",lua_cocos2dx_Node_stopActionByTag); tolua_function(tolua_S,"reorderChild",lua_cocos2dx_Node_reorderChild); @@ -9614,53 +9469,6 @@ int lua_register_cocos2dx_Node(lua_State* tolua_S) return 1; } -int lua_cocos2dx_Scene_getPhysicsWorld(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::Scene* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.Scene",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::Scene*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Scene_getPhysicsWorld'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Scene_getPhysicsWorld'", nullptr); - return 0; - } - cocos2d::PhysicsWorld* ret = cobj->getPhysicsWorld(); - object_to_luaval(tolua_S, "cc.PhysicsWorld",(cocos2d::PhysicsWorld*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Scene:getPhysicsWorld",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Scene_getPhysicsWorld'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_Scene_render(lua_State* tolua_S) { int argc = 0; @@ -9780,40 +9588,6 @@ int lua_cocos2dx_Scene_create(lua_State* tolua_S) #endif return 0; } -int lua_cocos2dx_Scene_createWithPhysics(lua_State* tolua_S) -{ - int argc = 0; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"cc.Scene",0,&tolua_err)) goto tolua_lerror; -#endif - - argc = lua_gettop(tolua_S) - 1; - - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Scene_createWithPhysics'", nullptr); - return 0; - } - cocos2d::Scene* ret = cocos2d::Scene::createWithPhysics(); - object_to_luaval(tolua_S, "cc.Scene",(cocos2d::Scene*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.Scene:createWithPhysics",argc, 0); - return 0; -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Scene_createWithPhysics'.",&tolua_err); -#endif - return 0; -} static int lua_cocos2dx_Scene_finalize(lua_State* tolua_S) { printf("luabindings: finalizing LUA object (Scene)"); @@ -9826,11 +9600,9 @@ int lua_register_cocos2dx_Scene(lua_State* tolua_S) tolua_cclass(tolua_S,"Scene","cc.Scene","cc.Node",nullptr); tolua_beginmodule(tolua_S,"Scene"); - tolua_function(tolua_S,"getPhysicsWorld",lua_cocos2dx_Scene_getPhysicsWorld); tolua_function(tolua_S,"render",lua_cocos2dx_Scene_render); tolua_function(tolua_S,"createWithSize", lua_cocos2dx_Scene_createWithSize); tolua_function(tolua_S,"create", lua_cocos2dx_Scene_create); - tolua_function(tolua_S,"createWithPhysics", lua_cocos2dx_Scene_createWithPhysics); tolua_endmodule(tolua_S); std::string typeName = typeid(cocos2d::Scene).name(); g_luaType[typeName] = "cc.Scene"; diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp index e78335357a..f98b508d05 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -1618,11 +1618,6 @@ int register_all_cocos2dx(lua_State* tolua_S); - - - - - From f41f00fcb255986cf17fadb9f59d682126508907 Mon Sep 17 00:00:00 2001 From: huangshiwu Date: Wed, 7 Jan 2015 11:44:16 +0800 Subject: [PATCH 025/106] make rotated rect draw correctly --- cocos/2d/CCDrawNode.cpp | 7 +++++-- cocos/2d/CCDrawNode.h | 2 +- .../Classes/DrawPrimitivesTest/DrawPrimitivesTest.cpp | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cocos/2d/CCDrawNode.cpp b/cocos/2d/CCDrawNode.cpp index 9073bfdc81..e9d04b546d 100644 --- a/cocos/2d/CCDrawNode.cpp +++ b/cocos/2d/CCDrawNode.cpp @@ -663,9 +663,12 @@ void DrawNode::drawDot(const Vec2 &pos, float radius, const Color4F &color) _dirty = true; } -void DrawNode::drawRect(const Vec2 &lb, const Vec2 <, const Vec2 &rt, const Vec2& rb, const Color4F &color) +void DrawNode::drawRect(const Vec2 &p1, const Vec2 &p2, const Vec2 &p3, const Vec2& p4, const Color4F &color) { - drawRect(lb, rt, color); + drawLine(Vec2(p1.x, p1.y), Vec2(p2.x, p2.y), color); + drawLine(Vec2(p2.x, p2.y), Vec2(p3.x, p3.y), color); + drawLine(Vec2(p3.x, p3.y), Vec2(p4.x, p4.y), color); + drawLine(Vec2(p4.x, p4.y), Vec2(p1.x, p1.y), color); } void DrawNode::drawSegment(const Vec2 &from, const Vec2 &to, float radius, const Color4F &color) diff --git a/cocos/2d/CCDrawNode.h b/cocos/2d/CCDrawNode.h index aafc1131e7..c9257973e3 100644 --- a/cocos/2d/CCDrawNode.h +++ b/cocos/2d/CCDrawNode.h @@ -80,7 +80,7 @@ public: /** draw a dot at a position, with a given radius and color */ void drawDot(const Vec2 &pos, float radius, const Color4F &color); - void drawRect(const Vec2 &lb, const Vec2 <, const Vec2 &rt, const Vec2& rb, const Color4F &color); + void drawRect(const Vec2 &p1, const Vec2 &p2, const Vec2 &p3, const Vec2& p4, const Color4F &color); void drawSolidRect(const Vec2 &origin, const Vec2 &destination, const Color4F &color); diff --git a/tests/cpp-tests/Classes/DrawPrimitivesTest/DrawPrimitivesTest.cpp b/tests/cpp-tests/Classes/DrawPrimitivesTest/DrawPrimitivesTest.cpp index b213915745..ac4b574157 100644 --- a/tests/cpp-tests/Classes/DrawPrimitivesTest/DrawPrimitivesTest.cpp +++ b/tests/cpp-tests/Classes/DrawPrimitivesTest/DrawPrimitivesTest.cpp @@ -278,6 +278,8 @@ DrawNodeTest::DrawNodeTest() // draw a rectangle draw->drawRect(Vec2(23,23), Vec2(7,7), Color4F(1,1,0,1)); + draw->drawRect(Vec2(15,30), Vec2(30,15), Vec2(15,0), Vec2(0,15), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1)); + // draw a circle draw->drawCircle(VisibleRect::center() + Vec2(140,0), 100, CC_DEGREES_TO_RADIANS(90), 50, true, 1.0f, 2.0f, Color4F(1.0, 0.0, 0.0, 0.5)); From d1845f89fee58b29cbe7954569bba08d5b586710 Mon Sep 17 00:00:00 2001 From: songmiao Date: Wed, 7 Jan 2015 11:47:34 +0800 Subject: [PATCH 026/106] add fog test and arcball camera test --- .../Classes/Camera3DTest/Camera3DTest.cpp | 493 +++++++++++++++++- .../Classes/Camera3DTest/Camera3DTest.h | 84 +++ .../cpp-tests/Resources/Sprite3DTest/fog.frag | 14 + .../cpp-tests/Resources/Sprite3DTest/fog.vert | 29 ++ 4 files changed, 615 insertions(+), 5 deletions(-) create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/fog.frag create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/fog.vert diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index 444a4d0f13..f5b4ef4e31 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -39,7 +39,9 @@ static int sceneIdx = -1; static std::function createFunctions[] = { CL(Camera3DTestDemo), - CL(CameraClippingDemo) + CL(CameraClippingDemo), + CL(CameraArcBallDemo), + CL(FogTestDemo) }; #define MAX_LAYER (sizeof(createFunctions) / sizeof(createFunctions[0])) @@ -269,6 +271,7 @@ void Camera3DTestDemo::onEnter() line->drawLine(Vec3(0, -50, 0),Vec3(0,0,0),Color4F(0,0.5,0,1)); line->drawLine(Vec3(0, 0, 0),Vec3(0,50,0),Color4F(0,1,0,1)); _layer3D->addChild(line); + _layer3D->setCameraMask(2); } void Camera3DTestDemo::onExit() @@ -303,9 +306,9 @@ void Camera3DTestDemo::backCallback(Ref* sender) Director::getInstance()->replaceScene(s); s->release(); } + void Camera3DTestDemo::addNewSpriteWithCoords(Vec3 p,std::string fileName,bool playAnimation,float scale,bool bindCamera) { - auto sprite = Sprite3D::create(fileName); _layer3D->addChild(sprite); float globalZOrder=sprite->getGlobalZOrder(); @@ -324,8 +327,7 @@ void Camera3DTestDemo::addNewSpriteWithCoords(Vec3 p,std::string fileName,bool p { _sprite3D=sprite; } - sprite->setScale(scale); - + sprite->setScale(scale); } void Camera3DTestDemo::onTouchesBegan(const std::vector& touches, cocos2d::Event *event) { @@ -708,7 +710,6 @@ void CameraClippingDemo::onEnter() { BaseTest::onEnter(); schedule(schedule_selector(CameraClippingDemo::update), 0.0f); - auto s = Director::getInstance()->getWinSize(); auto listener = EventListenerTouchAllAtOnce::create(); listener->onTouchesBegan = CC_CALLBACK_2(CameraClippingDemo::onTouchesBegan, this); @@ -963,6 +964,488 @@ void CameraClippingDemo::drawCameraFrustum() _drawFrustum->drawLine(bl_1, tl_1, color); } +//////////////////////////////////////////////////////////// +// CameraArcBallDemo +CameraArcBallDemo::CameraArcBallDemo(void) +: BaseTest() +, _layer3D(nullptr) +, _cameraType(CameraType::FreeCamera) +, _camera(nullptr) +,_drawGrid(nullptr) +,_sprite3D1(nullptr) +,_sprite3D2(nullptr) +,_fRadius(1.0f) +,_distanceX(0.0f) +,_distanceZ(50.0f) +,_operate(OperateCamType::RotateCamera) +,_center(Vec3(0,0,0)) +,_target(0) +{ +} +CameraArcBallDemo::~CameraArcBallDemo(void) +{ +} + +std::string CameraArcBallDemo::title() const +{ + return "Camera ArcBall Moving"; +} + +void CameraArcBallDemo::restartCallback(Ref* sender) +{ + auto s = new (std::nothrow) Camera3DTestScene(); + s->addChild(restartSpriteTestAction()); + + Director::getInstance()->replaceScene(s); + s->release(); +} + +void CameraArcBallDemo::nextCallback(Ref* sender) +{ + auto s = new (std::nothrow) Camera3DTestScene(); + s->addChild( nextSpriteTestAction() ); + Director::getInstance()->replaceScene(s); + s->release(); +} + +void CameraArcBallDemo::backCallback(Ref* sender) +{ + auto s = new (std::nothrow) Camera3DTestScene(); + s->addChild( backSpriteTestAction() ); + Director::getInstance()->replaceScene(s); + s->release(); +} + +void CameraArcBallDemo::onEnter() +{ + BaseTest::onEnter(); + _rotationQuat.set(0.0f, 0.0f, 0.0f, 1.0f); + schedule(schedule_selector(CameraArcBallDemo::update), 0.0f); + auto s = Director::getInstance()->getWinSize(); + auto listener = EventListenerTouchAllAtOnce::create(); + listener->onTouchesMoved = CC_CALLBACK_2(CameraArcBallDemo::onTouchsMoved, this); + _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); + + // swich camera + MenuItemFont::setFontName("fonts/arial.ttf"); + MenuItemFont::setFontSize(20); + + auto menuItem1 = MenuItemFont::create("Switch Operation", CC_CALLBACK_1(CameraArcBallDemo::switchOperateCallback,this)); + menuItem1->setColor(Color3B(0,200,20)); + auto menuItem2 = MenuItemFont::create("Switch Target", CC_CALLBACK_1(CameraArcBallDemo::switchTargetCallback,this)); + menuItem2->setColor(Color3B(0,200,20)); + auto menu = Menu::create(menuItem1,menuItem2,NULL); + menu->setPosition(Vec2::ZERO); + menuItem1->setPosition(VisibleRect::left().x + 80, VisibleRect::top().y -70); + menuItem2->setPosition(VisibleRect::left().x + 80, VisibleRect::top().y -100); + addChild(menu, 1); + + auto layer3D=Layer::create(); + addChild(layer3D,0); + _layer3D=layer3D; + + if (_camera == nullptr) + { + _camera=Camera::createPerspective(60, (GLfloat)s.width/s.height, 1, 1000); + _camera->setCameraFlag(CameraFlag::USER1); + _camera->setPosition3D(Vec3(0, 100, 50)); + _camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0)); + _camera->retain(); + _layer3D->addChild(_camera); + } + + _sprite3D1 = Sprite3D::create("Sprite3DTest/orc.c3b"); + _sprite3D1->setScale(0.5); + _sprite3D1->setRotation3D(Vec3(0,180,0)); + _sprite3D1->setPosition3D(Vec3(0,0,0)); + _layer3D->addChild(_sprite3D1); + + _sprite3D2 = Sprite3D::create("Sprite3DTest/boss.c3b"); + _sprite3D2->setScale(0.6); + _sprite3D2->setRotation3D(Vec3(-90,0,0)); + _sprite3D2->setPosition3D(Vec3(20,0,0)); + _layer3D->addChild(_sprite3D2); + + _drawGrid =DrawNode3D::create(); + + //draw x + for( int j =-20; j<=20 ;j++) + { + _drawGrid->drawLine(Vec3(-100, 0, 5*j),Vec3(100,0,5*j),Color4F(1,0,0,1)); + } + //draw z + for( int j =-20; j<=20 ;j++) + { + _drawGrid->drawLine(Vec3(5*j, 0, -100),Vec3(5*j,0,100),Color4F(0,0,1,1)); + } + //draw y + _drawGrid->drawLine(Vec3(0, 0, 0),Vec3(0,50,0),Color4F(0,1,0,1)); + _layer3D->addChild(_drawGrid); + + _layer3D->setCameraMask(2); + + updateCameraTransform(); + +} + +void CameraArcBallDemo::onExit() +{ + BaseTest::onExit(); + if (_camera) + { + _camera = nullptr; + } +} + +void CameraArcBallDemo::onTouchsMoved( const std::vector &touchs, Event *event ) +{ + if (!touchs.empty()) + { + if(_operate == OperateCamType::RotateCamera) + { + Size visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 prelocation = touchs[0]->getPreviousLocationInView(); + Vec2 location = touchs[0]->getLocationInView(); + location.x = 2.0 * (location.x) / (visibleSize.width) - 1.0f; + location.y = 2.0 * (visibleSize.height - location.y) / (visibleSize.height) - 1.0f; + prelocation.x = 2.0 * (prelocation.x) / (visibleSize.width) - 1.0f; + prelocation.y = 2.0 * (visibleSize.height - prelocation.y) / (visibleSize.height) - 1.0f; + + Vec3 axes; + float angle; + calculateArcBall(axes, angle, prelocation.x, prelocation.y, location.x, location.y); + Quaternion quat(axes, angle); + _rotationQuat = quat * _rotationQuat; + + updateCameraTransform(); + } + else if(_operate == OperateCamType::MoveCamera) + { + Point newPos = touchs[0]->getPreviousLocation() - touchs[0]->getLocation(); + _distanceZ -= newPos.y*0.1f; + _distanceZ += newPos.x*0.1f; + + updateCameraTransform(); + } + } +} + +void CameraArcBallDemo::calculateArcBall( cocos2d::Vec3 & axis, float & angle, float p1x, float p1y, float p2x, float p2y ) +{ + Mat4 rotation_matrix; + Mat4::createRotation(_rotationQuat, &rotation_matrix); + + Vec3 uv = rotation_matrix * Vec3(0.0f,1.0f,0.0f); + Vec3 sv = rotation_matrix * Vec3(1.0f,0.0f,0.0f); + Vec3 lv = rotation_matrix * Vec3(0.0f,0.0f,-1.0f); + + Vec3 p1 = sv * p1x + uv * p1y - lv * projectToSphere(_fRadius, p1x, p1y); + Vec3 p2 = sv * p2x + uv * p2y - lv * projectToSphere(_fRadius, p2x, p2y); + + Vec3::cross(p2, p1, &axis); + axis.normalize(); + + float t = (p2 - p1).length() / (2.0 * _fRadius); + + if (t > 1.0) t = 1.0; + if (t < -1.0) t = -1.0; + angle = asin(t); +} + +float CameraArcBallDemo::projectToSphere( float r, float x, float y ) +{ + float d, t, z; + d = sqrt(x*x + y*y); + if (d < r * 0.70710678118654752440) + { + z = sqrt(r*r - d*d); + } + else + { + t = r / 1.41421356237309504880; + z = t*t / d; + } + return z; +} + +void CameraArcBallDemo::updateCameraTransform() +{ + Mat4 trans, rot, center; + Mat4::createTranslation(Vec3(_distanceX, 0.0f, _distanceZ), &trans); + Mat4::createRotation(_rotationQuat, &rot); + Mat4::createTranslation(_center, ¢er); + Mat4 result = center * rot * trans; + _camera->setNodeToParentTransform(result); + +} + +void CameraArcBallDemo::switchOperateCallback(Ref* sender) +{ + if(_operate == OperateCamType::MoveCamera) + { + _operate = OperateCamType::RotateCamera; + } + else if(_operate == OperateCamType::RotateCamera) + { + _operate = OperateCamType::MoveCamera; + } +} + +void CameraArcBallDemo::switchTargetCallback(Ref* sender) +{ + if(_target == 0) + { + _target = 1; + _center = _sprite3D2->getPosition3D(); + updateCameraTransform(); + } + else if(_target == 1) + { + _target = 0; + _center = _sprite3D1->getPosition3D(); + updateCameraTransform(); + } +} + +void CameraArcBallDemo::update(float dt) +{ + //updateCameraTransform(); +} + +//////////////////////////////////////////////////////////// +// FogTestDemo +FogTestDemo::FogTestDemo(void) +: BaseTest() +, _layer3D(nullptr) +, _cameraType(CameraType::FreeCamera) +, _camera(nullptr) +, _shader(nullptr) +, _state(nullptr) +{ +} +FogTestDemo::~FogTestDemo(void) +{ +} + +std::string FogTestDemo::title() const +{ + return "Fog Test Demo"; +} + +void FogTestDemo::restartCallback(Ref* sender) +{ + auto s = new (std::nothrow) Camera3DTestScene(); + s->addChild(restartSpriteTestAction()); + + Director::getInstance()->replaceScene(s); + s->release(); +} + +void FogTestDemo::nextCallback(Ref* sender) +{ + auto s = new (std::nothrow) Camera3DTestScene(); + s->addChild( nextSpriteTestAction() ); + Director::getInstance()->replaceScene(s); + s->release(); +} + +void FogTestDemo::backCallback(Ref* sender) +{ + auto s = new (std::nothrow) Camera3DTestScene(); + s->addChild( backSpriteTestAction() ); + Director::getInstance()->replaceScene(s); + s->release(); +} + +void FogTestDemo::onEnter() +{ + BaseTest::onEnter(); + schedule(schedule_selector(FogTestDemo::update), 0.0f); + + auto s = Director::getInstance()->getWinSize(); + auto listener = EventListenerTouchAllAtOnce::create(); + listener->onTouchesBegan = CC_CALLBACK_2(FogTestDemo::onTouchesBegan, this); + listener->onTouchesMoved = CC_CALLBACK_2(FogTestDemo::onTouchesMoved, this); + listener->onTouchesEnded = CC_CALLBACK_2(FogTestDemo::onTouchesEnded, this); + _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); + + // swich fog type + TTFConfig ttfConfig("fonts/arial.ttf", 20); + + auto label1 = Label::createWithTTF(ttfConfig,"Linear "); + auto menuItem1 = MenuItemLabel::create(label1, CC_CALLBACK_1(FogTestDemo::switchTypeCallback,this,0)); + auto label2 = Label::createWithTTF(ttfConfig,"Exp"); + auto menuItem2 = MenuItemLabel::create(label2, CC_CALLBACK_1(FogTestDemo::switchTypeCallback,this,1)); + auto label3 = Label::createWithTTF(ttfConfig,"Exp2"); + auto menuItem3 = MenuItemLabel::create(label3, CC_CALLBACK_1(FogTestDemo::switchTypeCallback,this,2)); + auto menu = Menu::create(menuItem1, menuItem2, menuItem3, nullptr); + + menu->setPosition(Vec2::ZERO); + + menuItem1->setPosition(VisibleRect::left().x+60, VisibleRect::top().y-50); + menuItem2->setPosition(VisibleRect::left().x+60, VisibleRect::top().y -100); + menuItem3->setPosition(VisibleRect::left().x+60, VisibleRect::top().y -150); + addChild(menu, 0); + + + auto layer3D=Layer::create(); + addChild(layer3D,0); + _layer3D=layer3D; + + + glClearColor(0.5,0.5,0.5,1.0); + _shader =GLProgram::createWithFilenames("Sprite3DTest/fog.vert","Sprite3DTest/fog.frag"); + _state = GLProgramState::create(_shader); + + _sprite3D1 = Sprite3D::create("Sprite3DTest/teapot.c3b"); + _sprite3D2 = Sprite3D::create("Sprite3DTest/teapot.c3b"); + + _sprite3D1->setGLProgramState(_state); + _sprite3D2->setGLProgramState(_state); + //pass mesh's attribute to shader + long offset = 0; + auto attributeCount = _sprite3D1->getMesh()->getMeshVertexAttribCount(); + for (auto i = 0; i < attributeCount; i++) { + auto meshattribute = _sprite3D1->getMesh()->getMeshVertexAttribute(i); + _state->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], + meshattribute.size, + meshattribute.type, + GL_FALSE, + _sprite3D1->getMesh()->getVertexSizeInBytes(), + (GLvoid*)offset); + offset += meshattribute.attribSizeBytes; + } + + long offset1 = 0; + auto attributeCount1 = _sprite3D2->getMesh()->getMeshVertexAttribCount(); + for (auto i = 0; i < attributeCount1; i++) { + auto meshattribute = _sprite3D2->getMesh()->getMeshVertexAttribute(i); + _state->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], + meshattribute.size, + meshattribute.type, + GL_FALSE, + _sprite3D2->getMesh()->getVertexSizeInBytes(), + (GLvoid*)offset1); + offset1 += meshattribute.attribSizeBytes; + } + + _state->setUniformVec4("fogColor", Vec4(0.5,0.5,0.5,1.0)); + _state->setUniformFloat("fStart",10); + _state->setUniformFloat("fEnd",60); + _state->setUniformInt("iEquation" ,0); + + _layer3D->addChild(_sprite3D1); + _sprite3D1->setPosition3D( Vec3( 0, 0,0 ) ); + _sprite3D1->setScale(2.0f); + _sprite3D1->setRotation3D(Vec3(-90,180,0)); + + _layer3D->addChild(_sprite3D2); + _sprite3D2->setPosition3D( Vec3( 0, 0,-20 ) ); + _sprite3D2->setScale(2.0f); + _sprite3D2->setRotation3D(Vec3(-90,180,0)); + + if (_camera == nullptr) + { + _camera=Camera::createPerspective(60, (GLfloat)s.width/s.height, 1, 1000); + _camera->setCameraFlag(CameraFlag::USER1); + _camera->setPosition3D(Vec3(0, 30, 40)); + _camera->lookAt(Vec3(0,0,0), Vec3(0, 1, 0)); + + _layer3D->addChild(_camera); + } + _layer3D->setCameraMask(2); + +} + +void FogTestDemo::switchTypeCallback(Ref* sender,int type) +{ + if(type == 0) + { + _state->setUniformVec4("fogColor", Vec4(0.5,0.5,0.5,1.0)); + _state->setUniformFloat("fStart",10); + _state->setUniformFloat("fEnd",60); + _state->setUniformInt("iEquation" ,0); + + _sprite3D1->setGLProgramState(_state); + _sprite3D2->setGLProgramState(_state); + } + else if(type == 1) + { + _state->setUniformVec4("fogColor", Vec4(0.5,0.5,0.5,1.0)); + _state->setUniformFloat("fogDensity",0.03); + _state->setUniformInt("iEquation" ,1); + + _sprite3D1->setGLProgramState(_state); + _sprite3D2->setGLProgramState(_state); + } + else if(type == 2) + { + _state->setUniformVec4("fogColor", Vec4(0.5,0.5,0.5,1.0)); + _state->setUniformFloat("fogDensity",0.03); + _state->setUniformInt("iEquation" ,2); + + _sprite3D1->setGLProgramState(_state); + _sprite3D2->setGLProgramState(_state); + } +} + +void FogTestDemo::onExit() +{ + BaseTest::onExit(); + glClearColor(0.0,0.0,0.0,1.0); + if (_camera) + { + _camera = nullptr; + } +} + +void FogTestDemo::update(float dt) +{ +} + +void FogTestDemo::onTouchesBegan(const std::vector& touches, cocos2d::Event *event) +{ + for ( auto &item: touches ) + { + auto touch = item; + auto location = touch->getLocation(); + } +} + +void FogTestDemo::onTouchesMoved(const std::vector& touches, cocos2d::Event *event) +{ + if(touches.size()==1) + { + auto touch = touches[0]; + auto location = touch->getLocation(); + Point newPos = touch->getPreviousLocation()-location; + if(_cameraType==CameraType::FreeCamera) + { + Vec3 cameraDir; + Vec3 cameraRightDir; + _camera->getNodeToWorldTransform().getForwardVector(&cameraDir); + cameraDir.normalize(); + cameraDir.y=0; + _camera->getNodeToWorldTransform().getRightVector(&cameraRightDir); + cameraRightDir.normalize(); + cameraRightDir.y=0; + Vec3 cameraPos= _camera->getPosition3D(); + cameraPos+=cameraDir*newPos.y*0.1f; + cameraPos+=cameraRightDir*newPos.x*0.1f; + _camera->setPosition3D(cameraPos); + } + } +} + +void FogTestDemo::onTouchesEnded(const std::vector& touches, cocos2d::Event *event) +{ + for ( auto &item: touches ) + { + auto touch = item; + auto location = touch->getLocationInView(); + } +} + void Camera3DTestScene::runThisTest() { auto layer = nextSpriteTestAction(); diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h index 21eb61a872..992336718c 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h @@ -52,6 +52,13 @@ enum class CameraType FirstCamera=1, ThirdCamera=2, }; + +enum class OperateCamType +{ + MoveCamera=0, + RotateCamera=1, +}; + class Camera3DTestDemo : public BaseTest { public: @@ -148,6 +155,83 @@ protected: int _row; }; +class CameraArcBallDemo : public BaseTest +{ +public: + CREATE_FUNC(CameraArcBallDemo); + CameraArcBallDemo(void); + virtual ~CameraArcBallDemo(void); + + void restartCallback(Ref* sender); + void nextCallback(Ref* sender); + void backCallback(Ref* sender); + + virtual void onEnter() override; + virtual void onExit() override; + + virtual void update(float dt) override; + + // overrides + virtual std::string title() const override; + + void switchOperateCallback(Ref* sender); + void switchTargetCallback(Ref* sender); + void onTouchsMoved(const std::vector &touchs, cocos2d::Event *event); + void updateCameraTransform(); + void calculateArcBall( cocos2d::Vec3 & axis, float & angle, float p1x, float p1y, float p2x, float p2y ); + float projectToSphere( float r, float x, float y ); + +protected: + Layer* _layer3D; + CameraType _cameraType; + Camera* _camera; + DrawNode3D* _drawGrid; + Quaternion _rotationQuat; + float _fRadius; + float _distanceX; + float _distanceZ; + OperateCamType _operate; + Vec3 _center; + int _target; + Sprite3D* _sprite3D1; + Sprite3D* _sprite3D2; +}; + +class FogTestDemo : public BaseTest +{ +public: + CREATE_FUNC(FogTestDemo); + FogTestDemo(void); + virtual ~FogTestDemo(void); + + void restartCallback(Ref* sender); + void nextCallback(Ref* sender); + void backCallback(Ref* sender); + + virtual void onEnter() override; + virtual void onExit() override; + + virtual void update(float dt) override; + + // overrides + virtual std::string title() const override; + + void onTouchesBegan(const std::vector& touches, cocos2d::Event *event); + void onTouchesMoved(const std::vector& touches, cocos2d::Event *event); + void onTouchesEnded(const std::vector& touches, cocos2d::Event *event); + + void switchTypeCallback(Ref* sender,int type); + +protected: + Layer* _layer3D; + CameraType _cameraType; + Camera* _camera; + Sprite3D* _sprite3D1; + Sprite3D* _sprite3D2; + GLProgram* _shader; + GLProgramState* _state; +}; + class Camera3DTestScene : public TestScene { public: diff --git a/tests/cpp-tests/Resources/Sprite3DTest/fog.frag b/tests/cpp-tests/Resources/Sprite3DTest/fog.frag new file mode 100644 index 0000000000..74f3951e62 --- /dev/null +++ b/tests/cpp-tests/Resources/Sprite3DTest/fog.frag @@ -0,0 +1,14 @@ +#ifdef GL_ES +varying mediump vec2 v_texture_coord; +#else +varying vec2 v_texture_coord; +#endif +varying float fogFactor; + +uniform vec4 fogColor; + +void main (void) +{ + vec4 finalColor = texture2D(CC_Texture0, v_texture_coord); + gl_FragColor = mix(fogColor, finalColor, fogFactor ); //¸ù¾ÝÎíµÄȨÖØÓëfinalColor ×ö»ìºÏ²Ù×÷ +} \ No newline at end of file diff --git a/tests/cpp-tests/Resources/Sprite3DTest/fog.vert b/tests/cpp-tests/Resources/Sprite3DTest/fog.vert new file mode 100644 index 0000000000..02c0731761 --- /dev/null +++ b/tests/cpp-tests/Resources/Sprite3DTest/fog.vert @@ -0,0 +1,29 @@ +attribute vec4 a_position; +attribute vec2 a_texCoord; +varying float fogFactor; //ÎíµÄȨÖØ +varying vec2 v_texture_coord; + +uniform float fogDensity;// For exp and exp2 equation +uniform float fStart; // This is only for linear fog +uniform float fEnd; // This is only for linear fog +uniform int iEquation; // 0 = linear, 1 = exp, 2 = exp2 + +void main(void) +{ + gl_Position = CC_MVPMatrix * a_position; + v_texture_coord = a_texCoord; + + gl_FogFragCoord = abs(gl_Position.z); //ÕâÑù»ñµÃ¾àÀëЧÂÊ½Ï¸ß + + + if(iEquation == 0) + fogFactor = (fEnd-gl_FogFragCoord )/(fEnd-fStart); + else if(iEquation == 1) + fogFactor = exp(-fogDensity*gl_FogFragCoord ); + else if(iEquation == 2) + fogFactor = exp(-pow(fogDensity*gl_FogFragCoord , 2.0)); + + + fogFactor = clamp(fogFactor, 0.0, 1.0); //Ô½½ç´¦Àí + +} From e1fd472df1035847e5a995085159164bb068a45f Mon Sep 17 00:00:00 2001 From: htl Date: Wed, 7 Jan 2015 14:11:48 +0800 Subject: [PATCH 027/106] modify texture format name --- cocos/scripting/lua-bindings/script/framework/display.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/scripting/lua-bindings/script/framework/display.lua b/cocos/scripting/lua-bindings/script/framework/display.lua index c32ed4a948..f7cf017b7f 100644 --- a/cocos/scripting/lua-bindings/script/framework/display.lua +++ b/cocos/scripting/lua-bindings/script/framework/display.lua @@ -370,7 +370,7 @@ function display.newSprite(source, x, y, params) sprite = spriteClass:create(source, params.rect, params.capInsets) end if display.TEXTURES_PIXEL_FORMAT[source] then - cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2D_PIXEL_FORMAT_RGBA8888) + cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2_D_PIXEL_FORMAT_BGR_A8888) end break elseif sourceType ~= "userdata" then @@ -495,7 +495,7 @@ function display.loadSpriteFrames(dataFilename, imageFilename, callback) spriteFrameCache:addSpriteFramesAsync(dataFilename, imageFilename, callback) end if display.TEXTURES_PIXEL_FORMAT[imageFilename] then - cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2D_PIXEL_FORMAT_RGBA8888) + cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2_D_PIXEL_FORMAT_BGR_A8888) end end From c522a72f66dd9456600d584dd4eac61c5c7b6834 Mon Sep 17 00:00:00 2001 From: songmiao Date: Wed, 7 Jan 2015 14:56:34 +0800 Subject: [PATCH 028/106] modify fog shader for ios device --- tests/cpp-tests/Resources/Sprite3DTest/fog.vert | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/cpp-tests/Resources/Sprite3DTest/fog.vert b/tests/cpp-tests/Resources/Sprite3DTest/fog.vert index 02c0731761..30606e4a69 100644 --- a/tests/cpp-tests/Resources/Sprite3DTest/fog.vert +++ b/tests/cpp-tests/Resources/Sprite3DTest/fog.vert @@ -13,15 +13,15 @@ void main(void) gl_Position = CC_MVPMatrix * a_position; v_texture_coord = a_texCoord; - gl_FogFragCoord = abs(gl_Position.z); //ÕâÑù»ñµÃ¾àÀëЧÂÊ½Ï¸ß + float FogFragCoord = abs(gl_Position.z); //ÕâÑù»ñµÃ¾àÀëЧÂÊ½Ï¸ß if(iEquation == 0) - fogFactor = (fEnd-gl_FogFragCoord )/(fEnd-fStart); + fogFactor = (fEnd-FogFragCoord )/(fEnd-fStart); else if(iEquation == 1) - fogFactor = exp(-fogDensity*gl_FogFragCoord ); + fogFactor = exp(-fogDensity*FogFragCoord ); else if(iEquation == 2) - fogFactor = exp(-pow(fogDensity*gl_FogFragCoord , 2.0)); + fogFactor = exp(-pow(fogDensity*FogFragCoord , 2.0)); fogFactor = clamp(fogFactor, 0.0, 1.0); //Ô½½ç´¦Àí From 1dcdd81fc45650dccbff5848fd9a39b0b50b5e50 Mon Sep 17 00:00:00 2001 From: minggo Date: Wed, 7 Jan 2015 15:02:27 +0800 Subject: [PATCH 029/106] fix memory leak --- cocos/platform/win32/CCFileUtils-win32.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cocos/platform/win32/CCFileUtils-win32.cpp b/cocos/platform/win32/CCFileUtils-win32.cpp index 06e8eddb19..b33fa8bc0b 100644 --- a/cocos/platform/win32/CCFileUtils-win32.cpp +++ b/cocos/platform/win32/CCFileUtils-win32.cpp @@ -189,6 +189,9 @@ static Data getData(const std::string& filename, bool forString) msg = msg + filename + ") failed, error code is " + errorCodeBuffer; CCLOG("%s", msg.c_str()); + + if (buffer) + free(buffer); } else { From cbf9741dfd4e0f5dfa5d872afe31c908e2a70bb7 Mon Sep 17 00:00:00 2001 From: yinjimmy Date: Wed, 7 Jan 2015 15:23:58 +0800 Subject: [PATCH 030/106] Compatibility code for executeScriptFile --- .../lua-bindings/manual/CCLuaStack.cpp | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp index 8a33aa1434..c18a3e7e90 100644 --- a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp +++ b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp @@ -276,8 +276,30 @@ int LuaStack::executeScriptFile(const char* filename) { CCAssert(filename, "CCLuaStack::executeScriptFile() - invalid filename"); - FileUtils *utils = FileUtils::getInstance(); - std::string fullPath = utils->fullPathForFilename(filename); + static const std::string BYTECODE_FILE_EXT = ".luac"; + static const std::string NOT_BYTECODE_FILE_EXT = ".lua"; + + FileUtils *utils = FileUtils::getInstance(); + // + // 1. check .lua suffix + // 2. check .luac suffix + // + std::string buf(filename); + std::string tmpfilename = buf + NOT_BYTECODE_FILE_EXT; + if (utils->isFileExist(tmpfilename)) + { + buf = tmpfilename; + } + else + { + tmpfilename = buf + BYTECODE_FILE_EXT; + if (utils->isFileExist(tmpfilename)) + { + buf = tmpfilename; + } + } + + std::string fullPath = utils->fullPathForFilename(buf); Data data = utils->getDataFromFile(fullPath); int rn = 0; if (!data.isNull()) From 41cd946e277a25670f1ee888f8c15c16cae3b7b2 Mon Sep 17 00:00:00 2001 From: songmiao Date: Wed, 7 Jan 2015 15:47:27 +0800 Subject: [PATCH 031/106] modify fog shader format and notes --- tests/cpp-tests/Resources/Sprite3DTest/fog.frag | 4 ++-- tests/cpp-tests/Resources/Sprite3DTest/fog.vert | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/cpp-tests/Resources/Sprite3DTest/fog.frag b/tests/cpp-tests/Resources/Sprite3DTest/fog.frag index 74f3951e62..1161338b9a 100644 --- a/tests/cpp-tests/Resources/Sprite3DTest/fog.frag +++ b/tests/cpp-tests/Resources/Sprite3DTest/fog.frag @@ -10,5 +10,5 @@ uniform vec4 fogColor; void main (void) { vec4 finalColor = texture2D(CC_Texture0, v_texture_coord); - gl_FragColor = mix(fogColor, finalColor, fogFactor ); //¸ù¾ÝÎíµÄȨÖØÓëfinalColor ×ö»ìºÏ²Ù×÷ -} \ No newline at end of file + gl_FragColor = mix(fogColor, finalColor, fogFactor ); //out put finalColor +} diff --git a/tests/cpp-tests/Resources/Sprite3DTest/fog.vert b/tests/cpp-tests/Resources/Sprite3DTest/fog.vert index 30606e4a69..a60a597049 100644 --- a/tests/cpp-tests/Resources/Sprite3DTest/fog.vert +++ b/tests/cpp-tests/Resources/Sprite3DTest/fog.vert @@ -1,6 +1,6 @@ attribute vec4 a_position; attribute vec2 a_texCoord; -varying float fogFactor; //ÎíµÄȨÖØ +varying float fogFactor; //weight for fog varying vec2 v_texture_coord; uniform float fogDensity;// For exp and exp2 equation @@ -13,17 +13,17 @@ void main(void) gl_Position = CC_MVPMatrix * a_position; v_texture_coord = a_texCoord; - float FogFragCoord = abs(gl_Position.z); //ÕâÑù»ñµÃ¾àÀëЧÂÊ½Ï¸ß + float FogFragCoord = abs(gl_Position.z); //get fog distance if(iEquation == 0) - fogFactor = (fEnd-FogFragCoord )/(fEnd-fStart); + fogFactor = (fEnd-FogFragCoord )/(fEnd-fStart); //linear fog else if(iEquation == 1) - fogFactor = exp(-fogDensity*FogFragCoord ); + fogFactor = exp(-fogDensity*FogFragCoord ); //exp fog else if(iEquation == 2) - fogFactor = exp(-pow(fogDensity*FogFragCoord , 2.0)); + fogFactor = exp(-pow(fogDensity*FogFragCoord , 2.0)); //exp2 fog - fogFactor = clamp(fogFactor, 0.0, 1.0); //Ô½½ç´¦Àí + fogFactor = clamp(fogFactor, 0.0, 1.0); //clamp 0 to 1 } From 8524a5fb97c17a46722b23b12ef86a52ae4e11ca Mon Sep 17 00:00:00 2001 From: Wenhai Lin Date: Wed, 7 Jan 2015 17:08:04 +0800 Subject: [PATCH 032/106] Improve performance of physics --- cocos/2d/CCActionInterval.cpp | 12 - cocos/2d/CCNode.cpp | 249 +++------ cocos/2d/CCNode.h | 15 +- cocos/2d/CCScene.cpp | 17 - cocos/2d/CCScene.h | 1 - cocos/2d/CCSpriteBatchNode.cpp | 11 +- cocos/base/CCDirector.cpp | 17 +- cocos/physics/CCPhysicsBody.cpp | 54 +- cocos/physics/CCPhysicsBody.h | 6 +- cocos/physics/CCPhysicsJoint.cpp | 508 +++++++++--------- cocos/physics/CCPhysicsJoint.h | 161 +++--- cocos/physics/CCPhysicsShape.cpp | 267 ++++----- cocos/physics/CCPhysicsShape.h | 22 +- cocos/physics/CCPhysicsWorld.cpp | 239 +++----- cocos/physics/CCPhysicsWorld.h | 5 +- .../Classes/PhysicsTest/PhysicsTest.cpp | 63 ++- 16 files changed, 670 insertions(+), 977 deletions(-) diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index 48d9f8b3f0..4a03d8064c 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -859,12 +859,6 @@ void RotateTo::update(float time) } else { - // _startAngle.x != _startAngle.y || _diffAngle.x != _diffAngle.y - if (_target->getPhysicsBody() != nullptr) - { - CCLOG("RotateTo WARNING: PhysicsBody doesn't support skew rotation"); - } - _target->setRotationSkewX(_startAngle.x + _diffAngle.x * time); _target->setRotationSkewY(_startAngle.y + _diffAngle.y * time); } @@ -1002,12 +996,6 @@ void RotateBy::update(float time) } else { - // _startAngle.x != _startAngle.y || _deltaAngle.x != _deltaAngle.y - if (_target->getPhysicsBody() != nullptr) - { - CCLOG("RotateBy WARNING: PhysicsBody doesn't support skew rotation"); - } - _target->setRotationSkewX(_startAngle.x + _deltaAngle.x * time); _target->setRotationSkewY(_startAngle.y + _deltaAngle.y * time); } diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index f52a1b5a98..3b64b40af5 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -60,7 +60,6 @@ THE SOFTWARE. #define RENDER_IN_SUBPIXEL(__ARGS__) (ceil(__ARGS__)) #endif -extern int g_physicsSceneCount; NS_CC_BEGIN @@ -125,6 +124,8 @@ Node::Node(void) , _physicsBody(nullptr) , _physicsScaleStartX(1.0f) , _physicsScaleStartY(1.0f) +, _physicsRotation(0.0f) +, _physicsTransformDirty(true) #endif , _displayedOpacity(255) , _realOpacity(255) @@ -329,13 +330,6 @@ void Node::setRotation(float rotation) _rotationZ_X = _rotationZ_Y = rotation; _transformUpdated = _transformDirty = _inverseDirty = true; - -#if CC_USE_PHYSICS - if (!_physicsBody || !_physicsBody->_rotationResetTag) - { - updatePhysicsBodyRotation(getScene()); - } -#endif updateRotationQuat(); } @@ -472,16 +466,6 @@ void Node::setScale(float scale) _scaleX = _scaleY = _scaleZ = scale; _transformUpdated = _transformDirty = _inverseDirty = true; - -#if CC_USE_PHYSICS - if(g_physicsSceneCount == 0) - return; - auto scene = getScene(); - if (!scene || scene->getPhysicsWorld()) - { - updatePhysicsBodyTransform(scene); - } -#endif } /// scaleX getter @@ -499,17 +483,6 @@ void Node::setScale(float scaleX,float scaleY) _scaleX = scaleX; _scaleY = scaleY; _transformUpdated = _transformDirty = _inverseDirty = true; - -#if CC_USE_PHYSICS - if(g_physicsSceneCount == 0) - return; - - auto scene = getScene(); - if (!scene || scene->getPhysicsWorld()) - { - updatePhysicsBodyTransform(scene); - } -#endif } /// scaleX setter @@ -520,17 +493,6 @@ void Node::setScaleX(float scaleX) _scaleX = scaleX; _transformUpdated = _transformDirty = _inverseDirty = true; - -#if CC_USE_PHYSICS - if(g_physicsSceneCount == 0) - return; - - auto scene = getScene(); - if (!scene || scene->getPhysicsWorld()) - { - updatePhysicsBodyTransform(scene); - } -#endif } /// scaleY getter @@ -570,17 +532,6 @@ void Node::setScaleY(float scaleY) _scaleY = scaleY; _transformUpdated = _transformDirty = _inverseDirty = true; - -#if CC_USE_PHYSICS - if (g_physicsSceneCount == 0) - return; - - auto scene = getScene(); - if (!scene || scene->getPhysicsWorld()) - { - updatePhysicsBodyTransform(scene); - } -#endif } @@ -612,13 +563,6 @@ void Node::setPosition(float x, float y) _transformUpdated = _transformDirty = _inverseDirty = true; _usingNormalizedPosition = false; - -#if CC_USE_PHYSICS - if (!_physicsBody || !_physicsBody->_positionResetTag) - { - updatePhysicsBodyPosition(getScene()); - } -#endif } void Node::setPosition3D(const Vec3& position) @@ -1076,7 +1020,6 @@ void Node::addChildHelper(Node* child, int localZOrder, int tag, const std::stri auto scene = this->getScene(); if (scene && scene->getPhysicsWorld()) { - child->updatePhysicsBodyTransform(scene); scene->addChildToPhysicsWorld(child); } #endif @@ -1301,6 +1244,12 @@ void Node::visit() uint32_t Node::processParentFlags(const Mat4& parentTransform, uint32_t parentFlags) { +#if CC_USE_PHYSICS + if (_physicsBody && _updateTransformFromPhysics) + { + updateTransformFromPhysics(parentTransform, parentFlags); + } +#endif if(_usingNormalizedPosition) { CCASSERT(_parent, "setNormalizedPosition() doesn't work with orphan nodes"); @@ -2023,87 +1972,6 @@ void Node::removeAllComponents() // MARK: Physics -void Node::updatePhysicsBodyTransform(Scene* scene) -{ - updatePhysicsBodyScale(scene); - updatePhysicsBodyPosition(scene); - updatePhysicsBodyRotation(scene); -} - -void Node::updatePhysicsBodyPosition(Scene* scene) -{ - if (_physicsBody != nullptr) - { - if (scene && scene->getPhysicsWorld()) - { - Vec2 pos = _parent == scene ? _position : scene->convertToNodeSpace(_parent->convertToWorldSpace(_position)); - _physicsBody->setPosition(pos); - } - else - { - _physicsBody->setPosition(_position); - } - } - - for (Node* child : _children) - { - child->updatePhysicsBodyPosition(scene); - } -} - -void Node::updatePhysicsBodyRotation(Scene* scene) -{ - if (_physicsBody != nullptr) - { - if (scene != nullptr && scene->getPhysicsWorld() != nullptr) - { - float rotation = _rotationZ_X; - for (Node* parent = _parent; parent != scene; parent = parent->_parent) - { - rotation += parent->getRotation(); - } - _physicsBody->setRotation(rotation); - } - else - { - _physicsBody->setRotation(_rotationZ_X); - } - } - - for (auto child : _children) - { - child->updatePhysicsBodyRotation(scene); - child->updatePhysicsBodyPosition(scene); - } -} - -void Node::updatePhysicsBodyScale(Scene* scene) -{ - if (_physicsBody != nullptr) - { - if (scene != nullptr && scene->getPhysicsWorld() != nullptr) - { - float scaleX = _scaleX / _physicsScaleStartX; - float scaleY = _scaleY / _physicsScaleStartY; - for (Node* parent = _parent; parent != scene; parent = parent->_parent) - { - scaleX *= parent->_scaleX; - scaleY *= parent->_scaleY; - } - _physicsBody->setScale(scaleX, scaleY); - } - else - { - _physicsBody->setScale(_scaleX / _physicsScaleStartX, _scaleY / _physicsScaleStartY); - } - } - - for (const auto& child : _children) - { - child->updatePhysicsBodyScale(scene); - } -} - void Node::setPhysicsBody(PhysicsBody* body) { if (_physicsBody == body) @@ -2111,9 +1979,17 @@ void Node::setPhysicsBody(PhysicsBody* body) return; } - if (body != nullptr) + if (_physicsBody) { - if (body->getNode() != nullptr) + _physicsBody->removeFromWorld(); + _physicsBody->_node = nullptr; + _physicsBody->release(); + _physicsBody = nullptr; + } + + if (body) + { + if (body->getNode()) { body->getNode()->setPhysicsBody(nullptr); } @@ -2128,52 +2004,65 @@ void Node::setPhysicsBody(PhysicsBody* body) CCLOG("Node warning: setPhysicsBody sets anchor point to Vec2::ANCHOR_MIDDLE."); setAnchorPoint(Vec2::ANCHOR_MIDDLE); } - } - - if (_physicsBody != nullptr) - { - PhysicsWorld* world = _physicsBody->getWorld(); - _physicsBody->removeFromWorld(); - _physicsBody->_node = nullptr; - _physicsBody->release(); - - if (world != nullptr && body != nullptr) - { - world->addBody(body); - } - } - - _physicsBody = body; - _physicsScaleStartX = _scaleX; - _physicsScaleStartY = _scaleY; - - if (body != nullptr) - { - Node* node; - Scene* scene = nullptr; - for (node = this->getParent(); node != nullptr; node = node->getParent()) - { - Scene* tmpScene = dynamic_cast(node); - if (tmpScene != nullptr && tmpScene->getPhysicsWorld() != nullptr) - { - scene = tmpScene; - break; - } - } - - if (scene != nullptr) + + _physicsBody = body; + _physicsScaleStartX = _scaleX; + _physicsScaleStartY = _scaleY; + + auto scene = getScene(); + if (scene && scene->getPhysicsWorld()) { + _physicsTransformDirty = true; scene->getPhysicsWorld()->addBody(body); } - - updatePhysicsBodyTransform(scene); } } -PhysicsBody* Node::getPhysicsBody() const +void Node::updatePhysicsBodyTransform(Scene* scene, const Mat4& parentTransform, uint32_t parentFlags, float parentScaleX, float parentScaleY) { - return _physicsBody; + _updateTransformFromPhysics = false; + auto flags = processParentFlags(parentTransform, parentFlags); + _updateTransformFromPhysics = true; + auto scaleX = parentScaleX * _scaleX; + auto scaleY = parentScaleY * _scaleY; + + if (_parent) + { + _physicsRotation = _parent->_physicsRotation + _rotationZ_X; + } + if (_physicsBody && ((flags & FLAGS_DIRTY_MASK) || _physicsTransformDirty)) + { + _physicsTransformDirty = false; + Vec3 vec3(_position.x, _position.y, 0); + Vec3 ret; + parentTransform.transformPoint(vec3, &ret); + _physicsBody->setPosition(Vec2(ret.x, ret.y)); + _physicsBody->setScale(scaleX / _physicsScaleStartX, scaleY / _physicsScaleStartY); + _physicsBody->setRotation(_physicsRotation); + } + + for (auto node : _children) + { + node->updatePhysicsBodyTransform(scene, _modelViewTransform, flags, scaleX, scaleY); + } } + +void Node::updateTransformFromPhysics(const Mat4& parentTransform, uint32_t parentFlags) +{ + auto newPos = _physicsBody->getPosition(); + auto& recordPos = _physicsBody->_recordPosition; + if (parentFlags || recordPos.x != newPos.x || recordPos.y != newPos.y) + { + recordPos = newPos; + Vec3 vec3(newPos.x, newPos.y, 0); + Vec3 ret; + parentTransform.getInversed().transformPoint(vec3, &ret); + setPosition(ret.x, ret.y); + } + _physicsRotation = _physicsBody->getRotation(); + setRotation(_physicsRotation - _parent->_physicsRotation); +} + #endif //CC_USE_PHYSICS // MARK: Opacity and Color diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index 84d26dba42..935e6d6bc8 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -1532,13 +1532,16 @@ public: /** * get the PhysicsBody the sprite have */ - PhysicsBody* getPhysicsBody() const; + PhysicsBody* getPhysicsBody() const { return _physicsBody; } /** * remove this node from physics world. it will remove all the physics bodies in it's children too. */ void removeFromPhysicsWorld(); + + void updateTransformFromPhysics(const Mat4& parentTransform, uint32_t parentFlags); + virtual void updatePhysicsBodyTransform(Scene* scene, const Mat4& parentTransform, uint32_t parentFlags, float parentScaleX, float parentScaleY); #endif // overrides @@ -1612,13 +1615,6 @@ protected: // update Rotation3D from quaternion void updateRotation3D(); -#if CC_USE_PHYSICS - void updatePhysicsBodyTransform(Scene* layer); - virtual void updatePhysicsBodyPosition(Scene* layer); - virtual void updatePhysicsBodyRotation(Scene* layer); - virtual void updatePhysicsBodyScale(Scene* scene); -#endif // CC_USE_PHYSICS - private: void addChildHelper(Node* child, int localZOrder, int tag, const std::string &name, bool setTag); @@ -1709,6 +1705,9 @@ protected: PhysicsBody* _physicsBody; ///< the physicsBody the node have float _physicsScaleStartX; ///< the scale x value when setPhysicsBody float _physicsScaleStartY; ///< the scale y value when setPhysicsBody + float _physicsRotation; + bool _physicsTransformDirty; + bool _updateTransformFromPhysics; #endif // opacity controls diff --git a/cocos/2d/CCScene.cpp b/cocos/2d/CCScene.cpp index 0d1cf2c182..c3adab81b9 100644 --- a/cocos/2d/CCScene.cpp +++ b/cocos/2d/CCScene.cpp @@ -37,8 +37,6 @@ THE SOFTWARE. #include "physics/CCPhysicsWorld.h" #endif -int g_physicsSceneCount = 0; - NS_CC_BEGIN Scene::Scene() @@ -60,10 +58,6 @@ Scene::Scene() Scene::~Scene() { #if CC_USE_PHYSICS - if (_physicsWorld) - { - g_physicsSceneCount--; - } CC_SAFE_DELETE(_physicsWorld); #endif Director::getInstance()->getEventDispatcher()->removeEventListener(_event); @@ -177,15 +171,6 @@ void Scene::addChild(Node* child, int zOrder, const std::string &name) addChildToPhysicsWorld(child); } -void Scene::update(float delta) -{ - Node::update(delta); - if (nullptr != _physicsWorld && _physicsWorld->isAutoStep()) - { - _physicsWorld->update(delta); - } -} - Scene* Scene::createWithPhysics() { Scene *ret = new (std::nothrow) Scene(); @@ -212,9 +197,7 @@ bool Scene::initWithPhysics() this->setContentSize(director->getWinSize()); CC_BREAK_IF(! (_physicsWorld = PhysicsWorld::construct(*this))); - this->scheduleUpdate(); // success - g_physicsSceneCount += 1; ret = true; } while (0); return ret; diff --git a/cocos/2d/CCScene.h b/cocos/2d/CCScene.h index 058dd051b0..9f0d6d9478 100644 --- a/cocos/2d/CCScene.h +++ b/cocos/2d/CCScene.h @@ -108,7 +108,6 @@ private: public: virtual void addChild(Node* child, int zOrder, int tag) override; virtual void addChild(Node* child, int zOrder, const std::string &name) override; - virtual void update(float delta) override; inline PhysicsWorld* getPhysicsWorld() { return _physicsWorld; } static Scene *createWithPhysics(); diff --git a/cocos/2d/CCSpriteBatchNode.cpp b/cocos/2d/CCSpriteBatchNode.cpp index f74948d72d..ec1a6d1cf7 100644 --- a/cocos/2d/CCSpriteBatchNode.cpp +++ b/cocos/2d/CCSpriteBatchNode.cpp @@ -366,8 +366,17 @@ void SpriteBatchNode::draw(Renderer *renderer, const Mat4 &transform, uint32_t f return; } - for(const auto &child: _children) + for (const auto &child : _children) + { +#if CC_USE_PHYSICS + auto physicsBody = child->getPhysicsBody(); + if (physicsBody) + { + child->updateTransformFromPhysics(transform, flags); + } +#endif child->updateTransform(); + } _batchCommand.init( _globalZOrder, diff --git a/cocos/base/CCDirector.cpp b/cocos/base/CCDirector.cpp index ab4db8fd3c..fc3fa2d9ce 100644 --- a/cocos/base/CCDirector.cpp +++ b/cocos/base/CCDirector.cpp @@ -65,6 +65,10 @@ THE SOFTWARE. #include "CCScriptSupport.h" #endif +#if CC_USE_PHYSICS +#include "physics/CCPhysicsWorld.h" +#endif + /** Position of the FPS @@ -265,12 +269,6 @@ void Director::drawScene() // calculate "global" dt calculateDeltaTime(); - // skip one flame when _deltaTime equal to zero. - if(_deltaTime < FLT_EPSILON) - { - return; - } - if (_openGLView) { _openGLView->pollEvents(); @@ -297,6 +295,13 @@ void Director::drawScene() if (_runningScene) { +#if CC_USE_PHYSICS + auto physicsWorld = _runningScene->getPhysicsWorld(); + if (physicsWorld && physicsWorld->isAutoStep()) + { + physicsWorld->update(_deltaTime, false); + } +#endif //clear draw stats _renderer->clearDrawStats(); diff --git a/cocos/physics/CCPhysicsBody.cpp b/cocos/physics/CCPhysicsBody.cpp index 75183606eb..04ea19575e 100644 --- a/cocos/physics/CCPhysicsBody.cpp +++ b/cocos/physics/CCPhysicsBody.cpp @@ -68,9 +68,8 @@ PhysicsBody::PhysicsBody() , _linearDamping(0.0f) , _angularDamping(0.0f) , _tag(0) -, _positionResetTag(false) -, _rotationResetTag(false) , _rotationOffset(0) +, _recordPosition(Vec2::ZERO) { } @@ -333,6 +332,7 @@ void PhysicsBody::setGravityEnable(bool enable) void PhysicsBody::setPosition(const Vec2& position) { + _recordPosition = position; cpBodySetPos(_cpBody, PhysicsHelper::point2cpv(position + _positionOffset)); } @@ -341,14 +341,6 @@ void PhysicsBody::setRotation(float rotation) cpBodySetAngle(_cpBody, -PhysicsHelper::float2cpfloat((rotation + _rotationOffset) * (M_PI / 180.0f))); } -void PhysicsBody::setScale(float scale) -{ - for (auto shape : _shapes) - { - shape->setScale(scale); - } -} - void PhysicsBody::setScale(float scaleX, float scaleY) { for (auto shape : _shapes) @@ -357,22 +349,6 @@ void PhysicsBody::setScale(float scaleX, float scaleY) } } -void PhysicsBody::setScaleX(float scaleX) -{ - for (auto shape : _shapes) - { - shape->setScaleX(scaleX); - } -} - -void PhysicsBody::setScaleY(float scaleY) -{ - for (auto shape : _shapes) - { - shape->setScaleY(scaleY); - } -} - Vec2 PhysicsBody::getPosition() const { cpVect vec = cpBodyGetPos(_cpBody); @@ -402,7 +378,7 @@ PhysicsShape* PhysicsBody::addShape(PhysicsShape* shape, bool addMassAndMoment/* addMoment(shape->getMoment()); } - if (_world != nullptr) + if (_world && _cpBody->CP_PRIVATE(space)) { _world->addShape(shape); } @@ -764,30 +740,8 @@ void PhysicsBody::setResting(bool rest) const void PhysicsBody::update(float delta) { - if (_node != nullptr) + if (_node) { - for (auto shape : _shapes) - { - shape->update(delta); - } - - Node* parent = _node->getParent(); - Node* scene = &_world->getScene(); - - Vec2 position = parent != scene ? parent->convertToNodeSpace(scene->convertToWorldSpace(getPosition())) : getPosition(); - float rotation = getRotation(); - for (; parent != scene; parent = parent->getParent()) - { - rotation -= parent->getRotation(); - } - - _positionResetTag = true; - _rotationResetTag = true; - _node->setPosition(position); - _node->setRotation(rotation); - _positionResetTag = false; - _rotationResetTag = false; - // damping compute if (_isDamping && _dynamic && !isResting()) { diff --git a/cocos/physics/CCPhysicsBody.h b/cocos/physics/CCPhysicsBody.h index 8b4babe4cf..20a53befc8 100644 --- a/cocos/physics/CCPhysicsBody.h +++ b/cocos/physics/CCPhysicsBody.h @@ -306,10 +306,7 @@ protected: virtual void setPosition(const Vec2& position); virtual void setRotation(float rotation); - virtual void setScale(float scale); virtual void setScale(float scaleX, float scaleY); - virtual void setScaleX(float scaleX); - virtual void setScaleY(float scaleY); void update(float delta); @@ -341,8 +338,7 @@ protected: float _angularDamping; int _tag; - bool _positionResetTag; /// To avoid reset the body position when body invoke Node::setPosition(). - bool _rotationResetTag; /// To avoid reset the body rotation when body invoke Node::setRotation(). + Vec2 _recordPosition; Vec2 _positionOffset; float _rotationOffset; diff --git a/cocos/physics/CCPhysicsJoint.cpp b/cocos/physics/CCPhysicsJoint.cpp index b9628ca88c..5caa38c68a 100644 --- a/cocos/physics/CCPhysicsJoint.cpp +++ b/cocos/physics/CCPhysicsJoint.cpp @@ -40,20 +40,23 @@ PhysicsJoint::PhysicsJoint() , _enable(false) , _collisionEnable(true) , _destoryMark(false) +, _initDirty(true) , _tag(0) +, _maxForce(PHYSICS_INFINITY) { - + } PhysicsJoint::~PhysicsJoint() { // reset the shapes collision group setCollisionEnable(true); - - for (auto constraint : _cpConstraints) + + for (cpConstraint* joint : _cpConstraints) { - cpConstraintFree(constraint); + cpConstraintFree(joint); } + _cpConstraints.clear(); } bool PhysicsJoint::init(cocos2d::PhysicsBody *a, cocos2d::PhysicsBody *b) @@ -62,42 +65,59 @@ bool PhysicsJoint::init(cocos2d::PhysicsBody *a, cocos2d::PhysicsBody *b) { CCASSERT(a != nullptr && b != nullptr, "the body passed in is nil"); CCASSERT(a != b, "the two bodies are equal"); - + _bodyA = a; - _bodyA->_joints.push_back(this); _bodyB = b; + _bodyA->_joints.push_back(this); _bodyB->_joints.push_back(this); - + return true; } while (false); - + return false; } +bool PhysicsJoint::initJoint() +{ + bool ret = !_initDirty; + while (_initDirty) + { + ret = createConstraints(); + CC_BREAK_IF(!ret); + + for (auto subjoint : _cpConstraints) + { + subjoint->maxForce = _maxForce; + subjoint->errorBias = cpfpow(1.0f - 0.15f, 60.0f); + cpSpaceAddConstraint(_world->_cpSpace, subjoint); + } + _initDirty = false; + ret = true; + } + + return ret; +} + void PhysicsJoint::setEnable(bool enable) { if (_enable != enable) { _enable = enable; - - if (_world != nullptr) + + if (_world) { if (enable) { - _world->addJointOrDelay(this); - }else + _world->addJoint(this); + } + else { - _world->removeJointOrDelay(this); + _world->removeJoint(this, false); } } } } -Node* PhysicsJoint::getBodyNode(PhysicsBody* body) const -{ - return body->_node; -} - void PhysicsJoint::setCollisionEnable(bool enable) { if (_collisionEnable != enable) @@ -114,126 +134,126 @@ void PhysicsJoint::removeFormWorld() } } -void PhysicsJoint::destroy(PhysicsJoint* joint) -{ - if (joint!= nullptr) - { - // remove the joint and delete it. - if (joint->_world != nullptr) - { - joint->_world->removeJoint(joint, true); - } - else - { - if (joint->_bodyA != nullptr) - { - joint->_bodyA->removeJoint(joint); - } - - if (joint->_bodyB != nullptr) - { - joint->_bodyB->removeJoint(joint); - } - - delete joint; - } - } -} - void PhysicsJoint::setMaxForce(float force) { + _maxForce = force; for (auto joint : _cpConstraints) { joint->maxForce = PhysicsHelper::float2cpfloat(force); } } -float PhysicsJoint::getMaxForce() const -{ - return PhysicsHelper::cpfloat2float(_cpConstraints.front()->maxForce); -} - PhysicsJointFixed* PhysicsJointFixed::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr) { - PhysicsJointFixed* joint = new (std::nothrow) PhysicsJointFixed(); - - if (joint && joint->init(a, b, anchr)) + auto joint = new (std::nothrow) PhysicsJointFixed(); + + if (joint && joint->init(a, b)) { + joint->_anchr = anchr; return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } -bool PhysicsJointFixed::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr) +bool PhysicsJointFixed::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - getBodyNode(a)->setPosition(anchr); - getBodyNode(b)->setPosition(anchr); - + _bodyA->getNode()->setPosition(_anchr); + _bodyB->getNode()->setPosition(_anchr); + // add a pivot joint to fixed two body together - auto constraint = cpPivotJointNew(a->getCPBody(), b->getCPBody(), - PhysicsHelper::point2cpv(anchr)); - CC_BREAK_IF(constraint == nullptr); - _cpConstraints.push_back(constraint); - + auto joint = cpPivotJointNew(_bodyA->getCPBody(), _bodyB->getCPBody(), + PhysicsHelper::point2cpv(_anchr)); + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + // add a gear joint to make two body have the same rotation. - constraint = cpGearJointNew(a->getCPBody(), b->getCPBody(), 0, 1); - CC_BREAK_IF(constraint == nullptr); - _cpConstraints.push_back(constraint); - - setCollisionEnable(false); - + joint = cpGearJointNew(_bodyA->getCPBody(), _bodyB->getCPBody(), 0, 1); + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + + _collisionEnable = false; + return true; } while (false); - + return false; } -PhysicsJointPin* PhysicsJointPin::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr) +PhysicsJointPin* PhysicsJointPin::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& pivot) { - PhysicsJointPin* joint = new (std::nothrow) PhysicsJointPin(); - - if (joint && joint->init(a, b, anchr)) + auto joint = new (std::nothrow) PhysicsJointPin(); + + if (joint && joint->init(a, b)) { + joint->_anchr1 = pivot; + joint->_useSpecificAnchr = false; return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } -bool PhysicsJointPin::init(PhysicsBody *a, PhysicsBody *b, const Vec2& anchr) +PhysicsJointPin* PhysicsJointPin::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2) +{ + auto joint = new (std::nothrow) PhysicsJointPin(); + + if (joint && joint->init(a, b)) + { + joint->_anchr1 = anchr1; + joint->_anchr2 = anchr2; + joint->_useSpecificAnchr = true; + + return joint; + } + + CC_SAFE_DELETE(joint); + return nullptr; +} + +bool PhysicsJointPin::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - auto constraint = cpPivotJointNew(a->getCPBody(), b->getCPBody(), - PhysicsHelper::point2cpv(anchr)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + cpConstraint* joint = nullptr; + if (_useSpecificAnchr) + { + joint = cpPivotJointNew2(_bodyA->getCPBody(), _bodyB->getCPBody(), + PhysicsHelper::point2cpv(_anchr1), PhysicsHelper::point2cpv(_anchr2)); + } + else + { + joint = cpPivotJointNew(_bodyA->getCPBody(), _bodyB->getCPBody(), + PhysicsHelper::point2cpv(_anchr1)); + } + + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } PhysicsJointLimit* PhysicsJointLimit::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2, float min, float max) { - PhysicsJointLimit* joint = new (std::nothrow) PhysicsJointLimit(); - - if (joint && joint->init(a, b, anchr1, anchr2, min, max)) + auto joint = new (std::nothrow) PhysicsJointLimit(); + + if (joint && joint->init(a, b)) { + joint->_anchr1 = anchr1; + joint->_anchr2 = anchr2; + joint->_min = min; + joint->_max = max; + return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } @@ -243,25 +263,22 @@ PhysicsJointLimit* PhysicsJointLimit::construct(PhysicsBody* a, PhysicsBody* b, return construct(a, b, anchr1, anchr2, 0, b->local2World(anchr1).getDistance(a->local2World(anchr2))); } -bool PhysicsJointLimit::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2, float min, float max) +bool PhysicsJointLimit::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - auto constraint = cpSlideJointNew(a->getCPBody(), b->getCPBody(), - PhysicsHelper::point2cpv(anchr1), - PhysicsHelper::point2cpv(anchr2), - PhysicsHelper::float2cpfloat(min), - PhysicsHelper::float2cpfloat(max)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + auto joint = cpSlideJointNew(_bodyA->getCPBody(), _bodyB->getCPBody(), + PhysicsHelper::point2cpv(_anchr1), + PhysicsHelper::point2cpv(_anchr2), + PhysicsHelper::float2cpfloat(_min), + PhysicsHelper::float2cpfloat(_max)); + + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } @@ -307,35 +324,34 @@ void PhysicsJointLimit::setAnchr2(const Vec2& anchr) PhysicsJointDistance* PhysicsJointDistance::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2) { - PhysicsJointDistance* joint = new (std::nothrow) PhysicsJointDistance(); - - if (joint && joint->init(a, b, anchr1, anchr2)) + auto joint = new (std::nothrow) PhysicsJointDistance(); + + if (joint && joint->init(a, b)) { + joint->_anchr1 = anchr1; + joint->_anchr2 = anchr2; + return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } -bool PhysicsJointDistance::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2) +bool PhysicsJointDistance::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - auto constraint = cpPinJointNew(a->getCPBody(), - b->getCPBody(), - PhysicsHelper::point2cpv(anchr1), - PhysicsHelper::point2cpv(anchr2)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + auto joint = cpPinJointNew(_bodyA->getCPBody(), + _bodyB->getCPBody(), + PhysicsHelper::point2cpv(_anchr1), + PhysicsHelper::point2cpv(_anchr2)); + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } @@ -351,37 +367,39 @@ void PhysicsJointDistance::setDistance(float distance) PhysicsJointSpring* PhysicsJointSpring::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2, float stiffness, float damping) { - PhysicsJointSpring* joint = new (std::nothrow) PhysicsJointSpring(); - - if (joint && joint->init(a, b, anchr1, anchr2, stiffness, damping)) + auto joint = new (std::nothrow) PhysicsJointSpring(); + + if (joint && joint->init(a, b)) { + joint->_anchr1 = anchr1; + joint->_anchr2 = anchr2; + joint->_stiffness = stiffness; + joint->_damping = damping; + return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } -bool PhysicsJointSpring::init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2, float stiffness, float damping) +bool PhysicsJointSpring::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - auto constraint = cpDampedSpringNew(a->getCPBody(), - b->getCPBody(), - PhysicsHelper::point2cpv(anchr1), - PhysicsHelper::point2cpv(anchr2), - PhysicsHelper::float2cpfloat(_bodyB->local2World(anchr1).getDistance(_bodyA->local2World(anchr2))), - PhysicsHelper::float2cpfloat(stiffness), - PhysicsHelper::float2cpfloat(damping)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + auto joint = cpDampedSpringNew(_bodyA->getCPBody(), + _bodyB->getCPBody(), + PhysicsHelper::point2cpv(_anchr1), + PhysicsHelper::point2cpv(_anchr2), + PhysicsHelper::float2cpfloat(_bodyB->local2World(_anchr1).getDistance(_bodyA->local2World(_anchr2))), + PhysicsHelper::float2cpfloat(_stiffness), + PhysicsHelper::float2cpfloat(_damping)); + + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } @@ -437,35 +455,36 @@ void PhysicsJointSpring::setDamping(float damping) PhysicsJointGroove* PhysicsJointGroove::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& grooveA, const Vec2& grooveB, const Vec2& anchr2) { - PhysicsJointGroove* joint = new (std::nothrow) PhysicsJointGroove(); - - if (joint && joint->init(a, b, grooveA, grooveB, anchr2)) + auto joint = new (std::nothrow) PhysicsJointGroove(); + + if (joint && joint->init(a, b)) { + joint->_grooveA = grooveA; + joint->_grooveB = grooveB; + joint->_anchr2 = anchr2; + return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } -bool PhysicsJointGroove::init(PhysicsBody* a, PhysicsBody* b, const Vec2& grooveA, const Vec2& grooveB, const Vec2& anchr2) +bool PhysicsJointGroove::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - auto constraint = cpGrooveJointNew(a->getCPBody(), - b->getCPBody(), - PhysicsHelper::point2cpv(grooveA), - PhysicsHelper::point2cpv(grooveB), - PhysicsHelper::point2cpv(anchr2)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + auto joint = cpGrooveJointNew(_bodyA->getCPBody(), + _bodyB->getCPBody(), + PhysicsHelper::point2cpv(_grooveA), + PhysicsHelper::point2cpv(_grooveB), + PhysicsHelper::point2cpv(_anchr2)); + + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } @@ -501,35 +520,35 @@ void PhysicsJointGroove::setAnchr2(const Vec2& anchr2) PhysicsJointRotarySpring* PhysicsJointRotarySpring::construct(PhysicsBody* a, PhysicsBody* b, float stiffness, float damping) { - PhysicsJointRotarySpring* joint = new (std::nothrow) PhysicsJointRotarySpring(); - - if (joint && joint->init(a, b, stiffness, damping)) + auto joint = new (std::nothrow) PhysicsJointRotarySpring(); + + if (joint && joint->init(a, b)) { + joint->_stiffness = stiffness; + joint->_damping = damping; + return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } -bool PhysicsJointRotarySpring::init(PhysicsBody* a, PhysicsBody* b, float stiffness, float damping) +bool PhysicsJointRotarySpring::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - auto constraint = cpDampedRotarySpringNew(a->getCPBody(), - b->getCPBody(), - PhysicsHelper::float2cpfloat(_bodyB->getRotation() - _bodyA->getRotation()), - PhysicsHelper::float2cpfloat(stiffness), - PhysicsHelper::float2cpfloat(damping)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + auto joint = cpDampedRotarySpringNew(_bodyA->getCPBody(), + _bodyB->getCPBody(), + PhysicsHelper::float2cpfloat(_bodyB->getRotation() - _bodyA->getRotation()), + PhysicsHelper::float2cpfloat(_stiffness), + PhysicsHelper::float2cpfloat(_damping)); + + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } @@ -565,13 +584,16 @@ void PhysicsJointRotarySpring::setDamping(float damping) PhysicsJointRotaryLimit* PhysicsJointRotaryLimit::construct(PhysicsBody* a, PhysicsBody* b, float min, float max) { - PhysicsJointRotaryLimit* joint = new (std::nothrow) PhysicsJointRotaryLimit(); - - if (joint && joint->init(a, b, min, max)) + auto joint = new (std::nothrow) PhysicsJointRotaryLimit(); + + if (joint && joint->init(a, b)) { + joint->_min = min; + joint->_max = max; + return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } @@ -581,24 +603,21 @@ PhysicsJointRotaryLimit* PhysicsJointRotaryLimit::construct(PhysicsBody* a, Phys return construct(a, b, 0.0f, 0.0f); } -bool PhysicsJointRotaryLimit::init(PhysicsBody* a, PhysicsBody* b, float min, float max) +bool PhysicsJointRotaryLimit::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - auto constraint = cpRotaryLimitJointNew(a->getCPBody(), - b->getCPBody(), - PhysicsHelper::float2cpfloat(min), - PhysicsHelper::float2cpfloat(max)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + auto joint = cpRotaryLimitJointNew(_bodyA->getCPBody(), + _bodyB->getCPBody(), + PhysicsHelper::float2cpfloat(_min), + PhysicsHelper::float2cpfloat(_max)); + + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } @@ -624,35 +643,35 @@ void PhysicsJointRotaryLimit::setMax(float max) PhysicsJointRatchet* PhysicsJointRatchet::construct(PhysicsBody* a, PhysicsBody* b, float phase, float ratchet) { - PhysicsJointRatchet* joint = new (std::nothrow) PhysicsJointRatchet(); - - if (joint && joint->init(a, b, phase, ratchet)) + auto joint = new (std::nothrow) PhysicsJointRatchet(); + + if (joint && joint->init(a, b)) { + joint->_phase = phase; + joint->_ratchet = ratchet; + return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } -bool PhysicsJointRatchet::init(PhysicsBody* a, PhysicsBody* b, float phase, float ratchet) +bool PhysicsJointRatchet::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - auto constraint = cpRatchetJointNew(a->getCPBody(), - b->getCPBody(), - PhysicsHelper::float2cpfloat(phase), - PhysicsHelper::cpfloat2float(ratchet)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + auto joint = cpRatchetJointNew(_bodyA->getCPBody(), + _bodyB->getCPBody(), + PhysicsHelper::float2cpfloat(_phase), + PhysicsHelper::cpfloat2float(_ratchet)); + + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } @@ -686,37 +705,37 @@ void PhysicsJointRatchet::setRatchet(float ratchet) cpRatchetJointSetRatchet(_cpConstraints.front(), PhysicsHelper::float2cpfloat(ratchet)); } -PhysicsJointGear* PhysicsJointGear::construct(PhysicsBody* a, PhysicsBody* b, float phase, float ratchet) +PhysicsJointGear* PhysicsJointGear::construct(PhysicsBody* a, PhysicsBody* b, float phase, float ratio) { - PhysicsJointGear* joint = new (std::nothrow) PhysicsJointGear(); - - if (joint && joint->init(a, b, phase, ratchet)) + auto joint = new (std::nothrow) PhysicsJointGear(); + + if (joint && joint->init(a, b)) { + joint->_phase = phase; + joint->_ratio = ratio; + return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } -bool PhysicsJointGear::init(PhysicsBody* a, PhysicsBody* b, float phase, float ratio) +bool PhysicsJointGear::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - auto constraint = cpGearJointNew(a->getCPBody(), - b->getCPBody(), - PhysicsHelper::float2cpfloat(phase), - PhysicsHelper::float2cpfloat(ratio)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + auto joint = cpGearJointNew(_bodyA->getCPBody(), + _bodyB->getCPBody(), + PhysicsHelper::float2cpfloat(_phase), + PhysicsHelper::float2cpfloat(_ratio)); + + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } @@ -742,34 +761,33 @@ void PhysicsJointGear::setRatio(float ratio) PhysicsJointMotor* PhysicsJointMotor::construct(PhysicsBody* a, PhysicsBody* b, float rate) { - PhysicsJointMotor* joint = new (std::nothrow) PhysicsJointMotor(); - - if (joint && joint->init(a, b, rate)) + auto joint = new (std::nothrow) PhysicsJointMotor(); + + if (joint && joint->init(a, b)) { + joint->_rate = rate; + return joint; } - + CC_SAFE_DELETE(joint); return nullptr; } -bool PhysicsJointMotor::init(PhysicsBody* a, PhysicsBody* b, float rate) +bool PhysicsJointMotor::createConstraints() { do { - CC_BREAK_IF(!PhysicsJoint::init(a, b)); - - auto constraint = cpSimpleMotorNew(a->getCPBody(), - b->getCPBody(), - PhysicsHelper::float2cpfloat(rate)); - - CC_BREAK_IF(constraint == nullptr); - - _cpConstraints.push_back(constraint); - + auto joint = cpSimpleMotorNew(_bodyA->getCPBody(), + _bodyB->getCPBody(), + PhysicsHelper::float2cpfloat(_rate)); + + CC_BREAK_IF(joint == nullptr); + _cpConstraints.push_back(joint); + return true; } while (false); - + return false; } diff --git a/cocos/physics/CCPhysicsJoint.h b/cocos/physics/CCPhysicsJoint.h index 6fcb53f96c..523b4b5662 100644 --- a/cocos/physics/CCPhysicsJoint.h +++ b/cocos/physics/CCPhysicsJoint.h @@ -62,58 +62,62 @@ public: void setCollisionEnable(bool enable); /** Remove the joint from the world */ void removeFormWorld(); - /** Distory the joint*/ - static void destroy(PhysicsJoint* joint); - + /** Set the max force between two bodies */ void setMaxForce(float force); /** Get the max force setting */ - float getMaxForce() const; - + float getMaxForce() const { return _maxForce; } + protected: bool init(PhysicsBody* a, PhysicsBody* b); - Node* getBodyNode(PhysicsBody* body) const; - -protected: + + bool initJoint(); + virtual bool createConstraints() { return false; } + + std::vector _cpConstraints; PhysicsBody* _bodyA; PhysicsBody* _bodyB; PhysicsWorld* _world; - std::vector _cpConstraints; + bool _enable; bool _collisionEnable; bool _destoryMark; int _tag; - + float _maxForce; + + bool _initDirty; + friend class PhysicsBody; friend class PhysicsWorld; friend class PhysicsDebugDraw; }; /* - * @brief A fixed joint fuses the two bodies together at a reference point. Fixed joints are useful for creating complex shapes that can be broken apart later. - */ +* @brief A fixed joint fuses the two bodies together at a reference point. Fixed joints are useful for creating complex shapes that can be broken apart later. +*/ class CC_DLL PhysicsJointFixed : public PhysicsJoint { public: static PhysicsJointFixed* construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr); - + + virtual bool createConstraints() override; + protected: PhysicsJointFixed() {} virtual ~PhysicsJointFixed() {} + + Vec2 _anchr; }; /* - * @brief A limit joint imposes a maximum distance between the two bodies, as if they were connected by a rope. - */ +* @brief A limit joint imposes a maximum distance between the two bodies, as if they were connected by a rope. +*/ class CC_DLL PhysicsJointLimit : public PhysicsJoint { public: static PhysicsJointLimit* construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2); static PhysicsJointLimit* construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2, float min, float max); - + Vec2 getAnchr1() const; void setAnchr1(const Vec2& anchr1); Vec2 getAnchr2() const; @@ -122,29 +126,37 @@ public: void setMin(float min); float getMax() const; void setMax(float max); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2, float min, float max); - + + virtual bool createConstraints() override; + protected: PhysicsJointLimit() {} virtual ~PhysicsJointLimit() {} + + Vec2 _anchr1; + Vec2 _anchr2; + float _min; + float _max; }; /* - * @brief A pin joint allows the two bodies to independently rotate around the anchor point as if pinned together. - */ +* @brief A pin joint allows the two bodies to independently rotate around the anchor point as if pinned together. +*/ class CC_DLL PhysicsJointPin : public PhysicsJoint { public: - static PhysicsJointPin* construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr); - + static PhysicsJointPin* construct(PhysicsBody* a, PhysicsBody* b, const Vec2& pivot); + static PhysicsJointPin* construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2); + + virtual bool createConstraints() override; + protected: PhysicsJointPin() {} virtual ~PhysicsJointPin() {} + + bool _useSpecificAnchr; + Vec2 _anchr1; + Vec2 _anchr2; }; /** Set the fixed distance with two bodies */ @@ -152,16 +164,17 @@ class CC_DLL PhysicsJointDistance : public PhysicsJoint { public: static PhysicsJointDistance* construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2); - + float getDistance() const; void setDistance(float distance); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2); - + virtual bool createConstraints() override; + protected: PhysicsJointDistance() {} virtual ~PhysicsJointDistance() {} + + Vec2 _anchr1; + Vec2 _anchr2; }; /** Connecting two physics bodies together with a spring. */ @@ -179,13 +192,16 @@ public: void setStiffness(float stiffness); float getDamping() const; void setDamping(float damping); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr1, const Vec2& anchr2, float stiffness, float damping); - + virtual bool createConstraints() override; + protected: PhysicsJointSpring() {} virtual ~PhysicsJointSpring() {} + + Vec2 _anchr1; + Vec2 _anchr2; + float _stiffness; + float _damping; }; /** Attach body a to a line, and attach body b to a dot */ @@ -193,20 +209,22 @@ class CC_DLL PhysicsJointGroove : public PhysicsJoint { public: static PhysicsJointGroove* construct(PhysicsBody* a, PhysicsBody* b, const Vec2& grooveA, const Vec2& grooveB, const Vec2& anchr2); - + Vec2 getGrooveA() const; void setGrooveA(const Vec2& grooveA); Vec2 getGrooveB() const; void setGrooveB(const Vec2& grooveB); Vec2 getAnchr2() const; void setAnchr2(const Vec2& anchr2); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, const Vec2& grooveA, const Vec2& grooveB, const Vec2& anchr); - + virtual bool createConstraints() override; + protected: PhysicsJointGroove() {} virtual ~PhysicsJointGroove() {} + + Vec2 _grooveA; + Vec2 _grooveB; + Vec2 _anchr2; }; /** Likes a spring joint, but works with rotary */ @@ -214,20 +232,21 @@ class CC_DLL PhysicsJointRotarySpring : public PhysicsJoint { public: static PhysicsJointRotarySpring* construct(PhysicsBody* a, PhysicsBody* b, float stiffness, float damping); - + float getRestAngle() const; void setRestAngle(float restAngle); float getStiffness() const; void setStiffness(float stiffness); float getDamping() const; void setDamping(float damping); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, float stiffness, float damping); - + virtual bool createConstraints() override; + protected: PhysicsJointRotarySpring() {} virtual ~PhysicsJointRotarySpring() {} + + float _stiffness; + float _damping; }; /** Likes a limit joint, but works with rotary */ @@ -236,18 +255,19 @@ class CC_DLL PhysicsJointRotaryLimit : public PhysicsJoint public: static PhysicsJointRotaryLimit* construct(PhysicsBody* a, PhysicsBody* b, float min, float max); static PhysicsJointRotaryLimit* construct(PhysicsBody* a, PhysicsBody* b); - + float getMin() const; void setMin(float min); float getMax() const; void setMax(float max); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, float min, float max); - + virtual bool createConstraints() override; + protected: PhysicsJointRotaryLimit() {} virtual ~PhysicsJointRotaryLimit() {} + + float _min; + float _max; }; /** Works like a socket wrench. */ @@ -255,20 +275,21 @@ class CC_DLL PhysicsJointRatchet : public PhysicsJoint { public: static PhysicsJointRatchet* construct(PhysicsBody* a, PhysicsBody* b, float phase, float ratchet); - + float getAngle() const; void setAngle(float angle); float getPhase() const; void setPhase(float phase); float getRatchet() const; void setRatchet(float ratchet); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, float phase, float ratchet); - + virtual bool createConstraints() override; + protected: PhysicsJointRatchet() {} virtual ~PhysicsJointRatchet() {} + + float _phase; + float _ratchet; }; /** Keeps the angular velocity ratio of a pair of bodies constant. */ @@ -276,18 +297,20 @@ class CC_DLL PhysicsJointGear : public PhysicsJoint { public: static PhysicsJointGear* construct(PhysicsBody* a, PhysicsBody* b, float phase, float ratio); - + float getPhase() const; void setPhase(float phase); float getRatio() const; void setRatio(float ratchet); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, float phase, float ratio); - + + virtual bool createConstraints() override; + protected: PhysicsJointGear() {} virtual ~PhysicsJointGear() {} + + float _phase; + float _ratio; }; /** Keeps the relative angular velocity of a pair of bodies constant */ @@ -295,16 +318,16 @@ class CC_DLL PhysicsJointMotor : public PhysicsJoint { public: static PhysicsJointMotor* construct(PhysicsBody* a, PhysicsBody* b, float rate); - + float getRate() const; void setRate(float rate); - -protected: - bool init(PhysicsBody* a, PhysicsBody* b, float rate); - + virtual bool createConstraints() override; + protected: PhysicsJointMotor() {} virtual ~PhysicsJointMotor() {} + + float _rate; }; NS_CC_END diff --git a/cocos/physics/CCPhysicsShape.cpp b/cocos/physics/CCPhysicsShape.cpp index db851cd299..c768a8d6b6 100644 --- a/cocos/physics/CCPhysicsShape.cpp +++ b/cocos/physics/CCPhysicsShape.cpp @@ -50,7 +50,6 @@ PhysicsShape::PhysicsShape() , _scaleY(1.0f) , _newScaleX(1.0f) , _newScaleY(1.0f) -, _dirty(false) , _tag(0) , _categoryBitmask(UINT_MAX) , _collisionBitmask(UINT_MAX) @@ -112,50 +111,25 @@ void PhysicsShape::setMaterial(const PhysicsMaterial& material) setFriction(material.friction); } -void PhysicsShape::setScale(float scale) -{ - setScaleX(scale); - setScaleY(scale); -} - void PhysicsShape::setScale(float scaleX, float scaleY) { - setScaleX(scaleX); - setScaleY(scaleY); + if (_scaleX != scaleX || _scaleY != scaleY) + { + if (_type == Type::CIRCLE && scaleX != scaleY) + { + CCLOG("PhysicsShapeCircle WARNING: CANNOT support setScale with different x and y"); + return; + } + _newScaleX = scaleX; + _newScaleY = scaleY; + updateScale(); + } } -void PhysicsShape::setScaleX(float scaleX) +void PhysicsShape::updateScale() { - if (_scaleX == scaleX) - { - return; - } - - _newScaleX = scaleX; - _dirty = true; -} - -void PhysicsShape::setScaleY(float scaleY) -{ - if (_scaleY == scaleY) - { - return; - } - - _newScaleY = scaleY; - _dirty = true; -} - -void PhysicsShape::update(float delta) -{ - CC_UNUSED_PARAM(delta); - - if (_dirty) - { - _scaleX = _newScaleX; - _scaleY = _newScaleY; - _dirty = false; - } + _scaleX = _newScaleX; + _scaleY = _newScaleY; } void PhysicsShape::addShape(cpShape* shape) @@ -399,63 +373,18 @@ Vec2 PhysicsShapeCircle::getOffset() return PhysicsHelper::cpv2point(cpCircleShapeGetOffset(_cpShapes.front())); } -void PhysicsShapeCircle::setScale(float scale) +void PhysicsShapeCircle::updateScale() { - if (_scaleX == scale) - { - return; - } - - _newScaleX = _newScaleY = scale; - _dirty = true; -} + cpFloat factor = std::abs(PhysicsHelper::float2cpfloat(_newScaleX / _scaleX)); -void PhysicsShapeCircle::setScale(float scaleX, float scaleY) -{ - if (scaleX != scaleY) - { - CCLOG("PhysicsShapeCircle WARNING: CANNOT support setScale with different x and y"); - } - - if (_scaleX == scaleX) - { - return; - } - - _newScaleX = _newScaleY = scaleX; - _dirty = true; -} + cpShape* shape = _cpShapes.front(); + cpVect v = cpCircleShapeGetOffset(shape); + v = cpvmult(v, PhysicsHelper::float2cpfloat(factor)); + ((cpCircleShape*)shape)->c = v; -void PhysicsShapeCircle::setScaleX(float scale) -{ - CCLOG("PhysicsShapeCircle WARNING: CANNOT support setScaleX"); - - setScale(scale); -} + cpCircleShapeSetRadius(shape, cpCircleShapeGetRadius(shape) * factor); -void PhysicsShapeCircle::setScaleY(float scale) -{ - CCLOG("PhysicsShapeCircle WARNING: CANNOT support setScaleY"); - - setScale(scale); -} - -void PhysicsShapeCircle::update(float delta) -{ - if (_dirty) - { - cpFloat factor = std::abs(PhysicsHelper::float2cpfloat( _newScaleX / _scaleX )); - - auto shape = _cpShapes.front(); - auto v = cpCircleShapeGetOffset(shape); - v = cpvmult(v, PhysicsHelper::float2cpfloat(factor)); - ((cpCircleShape*)shape)->c = v; - - cpCircleShapeSetRadius(shape, cpCircleShapeGetRadius(shape) * factor); - } - - PhysicsShape::update(delta); - + PhysicsShape::updateScale(); } // PhysicsShapeEdgeSegment @@ -515,24 +444,21 @@ Vec2 PhysicsShapeEdgeSegment::getCenter() return ( a + b ) / 2; } -void PhysicsShapeEdgeSegment::update(float delta) +void PhysicsShapeEdgeSegment::updateScale() { - if (_dirty) - { - auto factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); - auto factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); - - auto shape = _cpShapes.front(); - auto a = cpSegmentShapeGetA(shape); - a.x *= factorX; - a.y *= factorY; - auto b = cpSegmentShapeGetB(shape); - b.x *= factorX; - b.y *= factorY; - cpSegmentShapeSetEndpoints(shape, a, b); - } - - PhysicsShape::update(delta); + cpFloat factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); + cpFloat factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); + + cpShape* shape = _cpShapes.front(); + cpVect a = cpSegmentShapeGetA(shape); + a.x *= factorX; + a.y *= factorY; + cpVect b = cpSegmentShapeGetB(shape); + b.x *= factorX; + b.y *= factorY; + cpSegmentShapeSetEndpoints(shape, a, b); + + PhysicsShape::updateScale(); } // PhysicsShapeBox @@ -682,45 +608,42 @@ Vec2 PhysicsShapePolygon::getCenter() return PhysicsHelper::cpv2point(cpCentroidForPoly(((cpPolyShape*)_cpShapes.front())->numVerts, ((cpPolyShape*)_cpShapes.front())->verts)); } -void PhysicsShapePolygon::update(float delta) +void PhysicsShapePolygon::updateScale() { - if (_dirty) - { - cpFloat factorX = PhysicsHelper::float2cpfloat( _newScaleX / _scaleX ); - cpFloat factorY = PhysicsHelper::float2cpfloat( _newScaleY / _scaleY ); - - auto shape = _cpShapes.front(); - int count = cpPolyShapeGetNumVerts(shape); - cpVect* vects = ((cpPolyShape*)shape)->verts; - cpSplittingPlane* planes = ((cpPolyShape*)shape)->planes; + cpFloat factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); + cpFloat factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); - for (int i = 0; i < count ; ++i) + auto shape = _cpShapes.front(); + int count = cpPolyShapeGetNumVerts(shape); + cpVect* vects = ((cpPolyShape*)shape)->verts; + cpSplittingPlane* planes = ((cpPolyShape*)shape)->planes; + + for (int i = 0; i < count; ++i) + { + vects[i].x *= factorX; + vects[i].y *= factorY; + } + + // convert hole to clockwise + if (factorX * factorY < 0) + { + for (int i = 0; i < count / 2; ++i) { - vects[i].x *= factorX; - vects[i].y *= factorY; - } - - // convert hole to clockwise - if ( factorX * factorY < 0 ) - { - for (int i = 0; i < count / 2; ++i) - { - cpVect v = vects[i]; - vects[i] = vects[count - i - 1]; - vects[count - i - 1] = v; - } - } - - for (int i = 0; i < count; ++i) - { - cpVect n = cpvnormalize(cpvperp(cpvsub(vects[i], vects[(i + 1) % count]))); - - planes[i].n = n; - planes[i].d = cpvdot(n, vects[i]); + cpVect v = vects[i]; + vects[i] = vects[count - i - 1]; + vects[count - i - 1] = v; } } + + for (int i = 0; i < count; ++i) + { + cpVect n = cpvnormalize(cpvperp(cpvsub(vects[i], vects[(i + 1) % count]))); + + planes[i].n = n; + planes[i].d = cpvdot(n, vects[i]); + } - PhysicsShape::update(delta); + PhysicsShape::updateScale(); } // PhysicsShapeEdgeBox @@ -865,26 +788,23 @@ PhysicsShapeEdgeChain* PhysicsShapeEdgeChain::create(const Vec2* points, int cou return nullptr; } -void PhysicsShapeEdgePolygon::update(float delta) +void PhysicsShapeEdgePolygon::updateScale() { - if (_dirty) + cpFloat factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); + cpFloat factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); + + for (auto shape : _cpShapes) { - cpFloat factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); - cpFloat factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); - - for(auto shape : _cpShapes) - { - cpVect a = cpSegmentShapeGetA(shape); - a.x *= factorX; - a.y *= factorY; - cpVect b = cpSegmentShapeGetB(shape); - b.x *= factorX; - b.y *= factorY; - cpSegmentShapeSetEndpoints(shape, a, b); - } + cpVect a = cpSegmentShapeGetA(shape); + a.x *= factorX; + a.y *= factorY; + cpVect b = cpSegmentShapeGetB(shape); + b.x *= factorX; + b.y *= factorY; + cpSegmentShapeSetEndpoints(shape, a, b); } - PhysicsShape::update(delta); + PhysicsShape::updateScale(); } bool PhysicsShapeEdgeChain::init(const Vec2* points, int count, const PhysicsMaterial& material/* = MaterialDefault*/, float border/* = 1*/) @@ -957,26 +877,23 @@ int PhysicsShapeEdgeChain::getPointsCount() const return static_cast(_cpShapes.size() + 1); } -void PhysicsShapeEdgeChain::update(float delta) +void PhysicsShapeEdgeChain::updateScale() { - if (_dirty) + cpFloat factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); + cpFloat factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); + + for (auto shape : _cpShapes) { - cpFloat factorX = PhysicsHelper::float2cpfloat(_newScaleX / _scaleX); - cpFloat factorY = PhysicsHelper::float2cpfloat(_newScaleY / _scaleY); - - for(auto shape : _cpShapes) - { - cpVect a = cpSegmentShapeGetA(shape); - a.x *= factorX; - a.y *= factorY; - cpVect b = cpSegmentShapeGetB(shape); - b.x *= factorX; - b.y *= factorY; - cpSegmentShapeSetEndpoints(shape, a, b); - } + cpVect a = cpSegmentShapeGetA(shape); + a.x *= factorX; + a.y *= factorY; + cpVect b = cpSegmentShapeGetB(shape); + b.x *= factorX; + b.y *= factorY; + cpSegmentShapeSetEndpoints(shape, a, b); } - PhysicsShape::update(delta); + PhysicsShape::updateScale(); } void PhysicsShape::setGroup(int group) diff --git a/cocos/physics/CCPhysicsShape.h b/cocos/physics/CCPhysicsShape.h index 79fabf6f1f..9c456624ea 100644 --- a/cocos/physics/CCPhysicsShape.h +++ b/cocos/physics/CCPhysicsShape.h @@ -56,7 +56,7 @@ typedef struct CC_DLL PhysicsMaterial {} }PhysicsMaterial; -const PhysicsMaterial PHYSICSSHAPE_MATERIAL_DEFAULT(0.0f, 0.5f, 0.5f); +const PhysicsMaterial PHYSICSSHAPE_MATERIAL_DEFAULT; /** * @brief A shape for body. You do not create PhysicsWorld objects directly, instead, you can view PhysicsBody to see how to create it. @@ -153,11 +153,8 @@ protected: /** calculate the area of this shape */ virtual float calculateArea() { return 0.0f; } - virtual void setScale(float scale); virtual void setScale(float scaleX, float scaleY); - virtual void setScaleX(float scaleX); - virtual void setScaleY(float scaleY); - virtual void update(float delta); + virtual void updateScale(); void addShape(cpShape* shape); protected: @@ -176,7 +173,6 @@ protected: float _scaleY; float _newScaleX; float _newScaleY; - bool _dirty; PhysicsMaterial _material; int _tag; int _categoryBitmask; @@ -206,11 +202,7 @@ public: protected: bool init(float radius, const PhysicsMaterial& material = PHYSICSSHAPE_MATERIAL_DEFAULT, const Vec2& offset = Vec2::ZERO); virtual float calculateArea() override; - virtual void setScale(float scale) override; - virtual void setScale(float scaleX, float scaleY) override; - virtual void setScaleX(float scale) override; - virtual void setScaleY(float scale) override; - virtual void update(float delta) override; + virtual void updateScale() override; protected: PhysicsShapeCircle(); @@ -234,7 +226,7 @@ public: protected: bool init(const Vec2* points, int count, const PhysicsMaterial& material = PHYSICSSHAPE_MATERIAL_DEFAULT, const Vec2& offset = Vec2::ZERO); float calculateArea() override; - virtual void update(float delta) override; + virtual void updateScale() override; protected: PhysicsShapePolygon(); @@ -270,7 +262,7 @@ public: protected: bool init(const Vec2& a, const Vec2& b, const PhysicsMaterial& material = PHYSICSSHAPE_MATERIAL_DEFAULT, float border = 1); - virtual void update(float delta) override; + virtual void updateScale() override; protected: PhysicsShapeEdgeSegment(); @@ -290,7 +282,7 @@ public: protected: bool init(const Vec2* points, int count, const PhysicsMaterial& material = PHYSICSSHAPE_MATERIAL_DEFAULT, float border = 1); - virtual void update(float delta) override; + virtual void updateScale() override; protected: PhysicsShapeEdgePolygon(); @@ -327,7 +319,7 @@ public: protected: bool init(const Vec2* points, int count, const PhysicsMaterial& material = PHYSICSSHAPE_MATERIAL_DEFAULT, float border = 1); - virtual void update(float delta) override; + virtual void updateScale() override; protected: PhysicsShapeEdgeChain(); diff --git a/cocos/physics/CCPhysicsWorld.cpp b/cocos/physics/CCPhysicsWorld.cpp index 84b38e42db..4afeed85b8 100644 --- a/cocos/physics/CCPhysicsWorld.cpp +++ b/cocos/physics/CCPhysicsWorld.cpp @@ -481,7 +481,6 @@ void PhysicsWorld::doAddBody(PhysicsBody* body) } } - void PhysicsWorld::addBodyOrDelay(PhysicsBody* body) { auto removeBodyIter = _delayRemoveBodies.find(body); @@ -491,17 +490,10 @@ void PhysicsWorld::addBodyOrDelay(PhysicsBody* body) return; } - if (cpSpaceIsLocked(_cpSpace)) + if (_delayAddBodies.find(body) == _delayAddBodies.end()) { - if (_delayAddBodies.find(body) == _delayAddBodies.end()) - { - _delayAddBodies.pushBack(body); - _delayDirty = true; - } - } - else - { - doAddBody(body); + _delayAddBodies.pushBack(body); + _delayDirty = true; } } @@ -542,7 +534,6 @@ void PhysicsWorld::removeBody(int tag) void PhysicsWorld::removeBody(PhysicsBody* body) { - if (body->getWorld() != this) { CCLOG("Physics Warnning: this body doesn't belong to this world"); @@ -550,25 +541,11 @@ void PhysicsWorld::removeBody(PhysicsBody* body) } // destory the body's joints - for (auto joint : body->_joints) + auto removeCopy = body->_joints; + for (auto joint : removeCopy) { - // set destroy param to false to keep the iterator available - removeJoint(joint, false); - - PhysicsBody* other = (joint->getBodyA() == body ? joint->getBodyB() : joint->getBodyA()); - other->removeJoint(joint); - - // test the distraction is delaied or not - if (std::find(_delayRemoveJoints.rbegin(), _delayRemoveJoints.rend(), joint) != _delayRemoveJoints.rend()) - { - joint->_destoryMark = true; - } - else - { - delete joint; - } + removeJoint(joint, true); } - body->_joints.clear(); removeBodyOrDelay(body); @@ -598,54 +575,35 @@ void PhysicsWorld::removeBodyOrDelay(PhysicsBody* body) } } -void PhysicsWorld::doAddJoint(PhysicsJoint *joint) +void PhysicsWorld::removeJoint(PhysicsJoint* joint, bool destroy) { if (joint) { - for (auto constraint : joint->_cpConstraints) - { - cpSpaceAddConstraint(_cpSpace, constraint); - } - } -} - -void PhysicsWorld::removeJoint(PhysicsJoint* joint, bool destroy) -{ - if (joint->getWorld() != this) - { - if (destroy) + if (joint->getWorld() != this && destroy) { CCLOG("physics warnning: the joint is not in this world, it won't be destoried utill the body it conntect is destoried"); + return; } - return; - } - - removeJointOrDelay(joint); - - _joints.remove(joint); - joint->_world = nullptr; - - // clean the connection to this joint - if (destroy) - { - if (joint->getBodyA() != nullptr) + + joint->_destoryMark = destroy; + if (cpSpaceIsLocked(_cpSpace)) { - joint->getBodyA()->removeJoint(joint); - } - - if (joint->getBodyB() != nullptr) - { - joint->getBodyB()->removeJoint(joint); - } - - // test the distraction is delaied or not - if (std::find(_delayRemoveJoints.rbegin(), _delayRemoveJoints.rend(), joint) != _delayRemoveJoints.rend()) - { - joint->_destoryMark = true; + auto it = std::find(_delayAddJoints.begin(), _delayAddJoints.end(), joint); + if (it != _delayAddJoints.end()) + { + _delayAddJoints.erase(it); + return; + } + + if (std::find(_delayRemoveJoints.rbegin(), _delayRemoveJoints.rend(), joint) == _delayRemoveJoints.rend()) + { + _delayRemoveJoints.push_back(joint); + _delayDirty = true; + } } else { - delete joint; + doRemoveJoint(joint); } } } @@ -657,24 +615,25 @@ void PhysicsWorld::updateJoints() return; } - auto addCopy = _delayAddJoints; - _delayAddJoints.clear(); - for (auto joint : addCopy) + for (auto joint : _delayAddJoints) { - doAddJoint(joint); - } - - auto removeCopy = _delayRemoveJoints; - _delayRemoveJoints.clear(); - for (auto joint : removeCopy) - { - doRemoveJoint(joint); - - if (joint->_destoryMark) + joint->_world = this; + if (joint->initJoint()) + { + _joints.push_back(joint); + } + else { delete joint; } } + _delayAddJoints.clear(); + + for (auto joint : _delayRemoveJoints) + { + doRemoveJoint(joint); + } + _delayRemoveJoints.clear(); } void PhysicsWorld::removeShape(PhysicsShape* shape) @@ -691,95 +650,37 @@ void PhysicsWorld::removeShape(PhysicsShape* shape) } } -void PhysicsWorld::addJointOrDelay(PhysicsJoint* joint) +void PhysicsWorld::addJoint(PhysicsJoint* joint) { - auto it = std::find(_delayRemoveJoints.begin(), _delayRemoveJoints.end(), joint); - if (it != _delayRemoveJoints.end()) - { - _delayRemoveJoints.erase(it); - return; - } - - if (cpSpaceIsLocked(_cpSpace)) + if (joint) { + if (joint->getWorld() && joint->getWorld() != this) + { + joint->removeFormWorld(); + } + + auto it = std::find(_delayRemoveJoints.begin(), _delayRemoveJoints.end(), joint); + if (it != _delayRemoveJoints.end()) + { + _delayRemoveJoints.erase(it); + return; + } + if (std::find(_delayAddJoints.begin(), _delayAddJoints.end(), joint) == _delayAddJoints.end()) { _delayAddJoints.push_back(joint); _delayDirty = true; } - }else - { - doAddJoint(joint); } } -void PhysicsWorld::removeJointOrDelay(PhysicsJoint* joint) -{ - auto it = std::find(_delayAddJoints.begin(), _delayAddJoints.end(), joint); - if (it != _delayAddJoints.end()) - { - _delayAddJoints.erase(it); - return; - } - - if (cpSpaceIsLocked(_cpSpace)) - { - if (std::find(_delayRemoveJoints.rbegin(), _delayRemoveJoints.rend(), joint) == _delayRemoveJoints.rend()) - { - _delayRemoveJoints.push_back(joint); - _delayDirty = true; - } - }else - { - doRemoveJoint(joint); - } -} - -void PhysicsWorld::addJoint(PhysicsJoint* joint) -{ - if (joint->getWorld() != nullptr && joint->getWorld() != this) - { - joint->removeFormWorld(); - } - - addJointOrDelay(joint); - _joints.push_back(joint); - joint->_world = this; -} - void PhysicsWorld::removeAllJoints(bool destroy) { - for (auto joint : _joints) + auto removeCopy = _joints; + for (auto joint : removeCopy) { - removeJointOrDelay(joint); - joint->_world = nullptr; - - // clean the connection to this joint - if (destroy) - { - if (joint->getBodyA() != nullptr) - { - joint->getBodyA()->removeJoint(joint); - } - - if (joint->getBodyB() != nullptr) - { - joint->getBodyB()->removeJoint(joint); - } - - // test the distraction is delaied or not - if (std::find(_delayRemoveJoints.rbegin(), _delayRemoveJoints.rend(), joint) != _delayRemoveJoints.rend()) - { - joint->_destoryMark = true; - } - else - { - delete joint; - } - } + removeJoint(joint, destroy); } - - _joints.clear(); } void PhysicsWorld::addShape(PhysicsShape* physicsShape) @@ -816,6 +717,23 @@ void PhysicsWorld::doRemoveJoint(PhysicsJoint* joint) { cpSpaceRemoveConstraint(_cpSpace, constraint); } + _joints.remove(joint); + joint->_world = nullptr; + + if (joint->getBodyA()) + { + joint->getBodyA()->removeJoint(joint); + } + + if (joint->getBodyB()) + { + joint->getBodyB()->removeJoint(joint); + } + + if (joint->_destoryMark) + { + delete joint; + } } void PhysicsWorld::removeAllBodies() @@ -889,11 +807,18 @@ void PhysicsWorld::step(float delta) void PhysicsWorld::update(float delta, bool userCall/* = false*/) { + if (delta < FLT_EPSILON) + { + return; + } + + _scene->updatePhysicsBodyTransform(_scene, _scene->getNodeToParentTransform(), 0, 1.0f, 1.0f); + while (_delayDirty) { - // the updateJoints must run before the updateBodies. - updateJoints(); updateBodies(); + updateJoints(); + _delayDirty = !(_delayAddBodies.size() == 0 && _delayRemoveBodies.size() == 0 && _delayAddJoints.size() == 0 && _delayRemoveJoints.size() == 0); } diff --git a/cocos/physics/CCPhysicsWorld.h b/cocos/physics/CCPhysicsWorld.h index 9612ba688c..f64852bf45 100644 --- a/cocos/physics/CCPhysicsWorld.h +++ b/cocos/physics/CCPhysicsWorld.h @@ -45,6 +45,7 @@ class PhysicsContact; typedef Vec2 Vect; +class Director; class Node; class Sprite; class Scene; @@ -188,12 +189,9 @@ protected: virtual void doAddBody(PhysicsBody* body); virtual void doRemoveBody(PhysicsBody* body); - virtual void doAddJoint(PhysicsJoint* joint); virtual void doRemoveJoint(PhysicsJoint* joint); virtual void addBodyOrDelay(PhysicsBody* body); virtual void removeBodyOrDelay(PhysicsBody* body); - virtual void addJointOrDelay(PhysicsJoint* joint); - virtual void removeJointOrDelay(PhysicsJoint* joint); virtual void updateBodies(); virtual void updateJoints(); @@ -228,6 +226,7 @@ protected: friend class Node; friend class Sprite; friend class Scene; + friend class Director; friend class PhysicsBody; friend class PhysicsShape; friend class PhysicsJoint; diff --git a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp index 9913e50e2b..93bcecb722 100644 --- a/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp +++ b/tests/cpp-tests/Classes/PhysicsTest/PhysicsTest.cpp @@ -434,7 +434,6 @@ void PhysicsDemo::onTouchEnded(Touch* touch, Event* event) this->removeChild(it->second); _mouses.erase(it); } - } void PhysicsDemoLogoSmash::onEnter() @@ -716,8 +715,6 @@ void PhysicsDemoJoints::onEnter() listener->onTouchEnded = CC_CALLBACK_2(PhysicsDemoJoints::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); - //_scene->getPhysicsWorld()->setGravity(Point::ZERO); - float width = (VisibleRect::getVisibleRect().size.width - 10) / 4; float height = (VisibleRect::getVisibleRect().size.height - 50) / 4; @@ -734,7 +731,7 @@ void PhysicsDemoJoints::onEnter() { Vec2 offset(VisibleRect::leftBottom().x + 5 + j * width + width/2, VisibleRect::leftBottom().y + 50 + i * height + height/2); box->addShape(PhysicsShapeEdgeBox::create(Size(width, height), PHYSICSSHAPE_MATERIAL_DEFAULT, 1, offset)); - + switch (i*4 + j) { case 0: @@ -768,7 +765,6 @@ void PhysicsDemoJoints::onEnter() } case 2: { - auto sp1 = makeBall(offset - Vec2(30, 0), 10); sp1->getPhysicsBody()->setTag(DRAG_BODYS_TAG); auto sp2 = makeBox(offset + Vec2(30, 0), Size(30, 10)); @@ -988,6 +984,9 @@ void PhysicsDemoPump::onEnter() body->addShape(PhysicsShapeEdgeSegment::create(VisibleRect::leftTop() + Vec2(150, -80), VisibleRect::rightTop() + Vec2(-100, -150), staticMaterial, 2.0f)); body->setCategoryBitmask(0x01); + node->setPhysicsBody(body); + node->setPosition(Vec2::ZERO); + this->addChild(node); // balls for (int i = 0; i < 6; ++i) @@ -997,9 +996,8 @@ void PhysicsDemoPump::onEnter() addChild(ball); } - node->setPhysicsBody(body); - this->addChild(node); - + auto _world = _scene->getPhysicsWorld(); + Vec2 vec[4] = { VisibleRect::leftTop() + Vec2(102, -148), @@ -1008,30 +1006,6 @@ void PhysicsDemoPump::onEnter() VisibleRect::leftBottom() + Vec2(102, 20) }; - auto _world = _scene->getPhysicsWorld(); - - // small gear - auto sgear = Node::create(); - auto sgearB = PhysicsBody::createCircle(44); - sgear->setPhysicsBody(sgearB); - sgear->setPosition(VisibleRect::leftBottom() + Vec2(125, 0)); - this->addChild(sgear); - sgearB->setCategoryBitmask(0x04); - sgearB->setCollisionBitmask(0x04); - sgearB->setTag(1); - _world->addJoint(PhysicsJointPin::construct(body, sgearB, sgearB->getPosition())); - - - // big gear - auto bgear = Node::create(); - auto bgearB = PhysicsBody::createCircle(100); - bgear->setPhysicsBody(bgearB); - bgear->setPosition(VisibleRect::leftBottom() + Vec2(275, 0)); - this->addChild(bgear); - bgearB->setCategoryBitmask(0x04); - _world->addJoint(PhysicsJointPin::construct(body, bgearB, bgearB->getPosition())); - - // pump auto pump = Node::create(); auto center = PhysicsShape::getPolyonCenter(vec, 4); @@ -1041,8 +1015,31 @@ void PhysicsDemoPump::onEnter() this->addChild(pump); pumpB->setCategoryBitmask(0x02); pumpB->setGravityEnable(false); + + // small gear + auto sgear = Node::create(); + auto sgearB = PhysicsBody::createCircle(44); + sgear->setPhysicsBody(sgearB); + sgear->setPosition(VisibleRect::leftBottom() + Vec2(125, 0)); + this->addChild(sgear); + sgearB->setCategoryBitmask(0x04); + sgearB->setCollisionBitmask(0x04); + sgearB->setTag(1); + + _world->addJoint(PhysicsJointPin::construct(body, sgearB, sgear->getPosition())); _world->addJoint(PhysicsJointDistance::construct(pumpB, sgearB, Vec2(0, 0), Vec2(0, -44))); + // big gear + auto bgear = Node::create(); + auto bgearB = PhysicsBody::createCircle(100); + bgear->setPhysicsBody(bgearB); + bgear->setPosition(VisibleRect::leftBottom() + Vec2(275, 0)); + this->addChild(bgear); + bgearB->setCategoryBitmask(0x04); + + _world->addJoint(PhysicsJointPin::construct(bgearB, body, bgear->getPosition())); + _world->addJoint(PhysicsJointGear::construct(sgearB, bgearB, -M_PI_2, -2.0f)); + // plugger Vec2 seg[] = {VisibleRect::leftTop() + Vec2(75, -120), VisibleRect::leftBottom() + Vec2(75, -100)}; Vec2 segCenter = (seg[1] + seg[0])/2; @@ -1059,7 +1056,7 @@ void PhysicsDemoPump::onEnter() pluggerB->setCategoryBitmask(0x02); sgearB->setCollisionBitmask(0x04 | 0x01); _world->addJoint(PhysicsJointPin::construct(body, pluggerB, VisibleRect::leftBottom() + Vec2(75, -90))); - _world->addJoint(PhysicsJointDistance::construct(pluggerB, sgearB, pluggerB->world2Local(VisibleRect::leftBottom() + Vec2(75, 0)), Vec2(44, 0))); + _world->addJoint(PhysicsJointDistance::construct(pluggerB, sgearB, Vec2::ZERO, Vec2(44, 0))); } void PhysicsDemoPump::update(float delta) From 0f49bb977d0c6d0238f5baec099929a3cb257dd9 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 7 Jan 2015 17:21:41 +0800 Subject: [PATCH 033/106] improve ui::Text and ui::TextField creation performance --- cocos/ui/UIText.cpp | 2 +- cocos/ui/UITextField.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/ui/UIText.cpp b/cocos/ui/UIText.cpp index 86434cbbdd..780da20a52 100644 --- a/cocos/ui/UIText.cpp +++ b/cocos/ui/UIText.cpp @@ -95,9 +95,9 @@ bool Text::init(const std::string &textContent, const std::string &fontName, int ret = false; break; } - this->setString(textContent); this->setFontName(fontName); this->setFontSize(fontSize); + this->setString(textContent); } while (0); return ret; } diff --git a/cocos/ui/UITextField.cpp b/cocos/ui/UITextField.cpp index a4bb810d07..04a893de6e 100644 --- a/cocos/ui/UITextField.cpp +++ b/cocos/ui/UITextField.cpp @@ -329,9 +329,9 @@ TextField* TextField::create(const std::string &placeholder, const std::string & TextField* widget = new (std::nothrow) TextField(); if (widget && widget->init()) { - widget->setPlaceHolder(placeholder); widget->setFontName(fontName); widget->setFontSize(fontSize); + widget->setPlaceHolder(placeholder); widget->autorelease(); return widget; } From d80830c2649bf110ebf9f5251afd75af83537e2b Mon Sep 17 00:00:00 2001 From: zhangbin Date: Wed, 7 Jan 2015 17:48:10 +0800 Subject: [PATCH 034/106] 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 77aca3d1b5..9663fc53f3 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 77aca3d1b5d8baf8b0a24078707522d464e81e01 +Subproject commit 9663fc53f3f93311ecef798dca5ea38a52137bb6 From 9253ae99bc986c30aaad09bd6d72a056c1837b39 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 7 Jan 2015 09:50:54 +0000 Subject: [PATCH 035/106] [AUTO]: updating luabinding automatically --- cocos/scripting/lua-bindings/auto/api/DrawNode.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/api/DrawNode.lua b/cocos/scripting/lua-bindings/auto/api/DrawNode.lua index bca7dec59d..82fdb8a8a2 100644 --- a/cocos/scripting/lua-bindings/auto/api/DrawNode.lua +++ b/cocos/scripting/lua-bindings/auto/api/DrawNode.lua @@ -17,10 +17,10 @@ -- @overload self, vec2_table, vec2_table, color4f_table -- @function [parent=#DrawNode] drawRect -- @param self --- @param #vec2_table lb --- @param #vec2_table lt --- @param #vec2_table rt --- @param #vec2_table rb +-- @param #vec2_table p1 +-- @param #vec2_table p2 +-- @param #vec2_table p3 +-- @param #vec2_table p4 -- @param #color4f_table color -------------------------------- From dfa6137ce9ae7f20067635f5dde661a2ee1e11ac Mon Sep 17 00:00:00 2001 From: songmiao Date: Wed, 7 Jan 2015 17:58:10 +0800 Subject: [PATCH 036/106] modify arcball and fog shader --- .../Classes/Camera3DTest/Camera3DTest.cpp | 32 +++++++++---------- .../Classes/Camera3DTest/Camera3DTest.h | 1 - .../cpp-tests/Resources/Sprite3DTest/fog.frag | 6 ++-- .../cpp-tests/Resources/Sprite3DTest/fog.vert | 26 +++++++-------- 4 files changed, 31 insertions(+), 34 deletions(-) diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index f5b4ef4e31..800fb891c1 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -975,7 +975,6 @@ CameraArcBallDemo::CameraArcBallDemo(void) ,_sprite3D1(nullptr) ,_sprite3D2(nullptr) ,_fRadius(1.0f) -,_distanceX(0.0f) ,_distanceZ(50.0f) ,_operate(OperateCamType::RotateCamera) ,_center(Vec3(0,0,0)) @@ -1123,7 +1122,6 @@ void CameraArcBallDemo::onTouchsMoved( const std::vector &touchs, Event { Point newPos = touchs[0]->getPreviousLocation() - touchs[0]->getLocation(); _distanceZ -= newPos.y*0.1f; - _distanceZ += newPos.x*0.1f; updateCameraTransform(); } @@ -1171,7 +1169,7 @@ float CameraArcBallDemo::projectToSphere( float r, float x, float y ) void CameraArcBallDemo::updateCameraTransform() { Mat4 trans, rot, center; - Mat4::createTranslation(Vec3(_distanceX, 0.0f, _distanceZ), &trans); + Mat4::createTranslation(Vec3(0.0f, 0.0f, _distanceZ), &trans); Mat4::createRotation(_rotationQuat, &rot); Mat4::createTranslation(_center, ¢er); Mat4 result = center * rot * trans; @@ -1329,10 +1327,10 @@ void FogTestDemo::onEnter() offset1 += meshattribute.attribSizeBytes; } - _state->setUniformVec4("fogColor", Vec4(0.5,0.5,0.5,1.0)); - _state->setUniformFloat("fStart",10); - _state->setUniformFloat("fEnd",60); - _state->setUniformInt("iEquation" ,0); + _state->setUniformVec4("u_fogColor", Vec4(0.5,0.5,0.5,1.0)); + _state->setUniformFloat("u_fogStart",10); + _state->setUniformFloat("u_fogEnd",60); + _state->setUniformInt("u_fogEquation" ,0); _layer3D->addChild(_sprite3D1); _sprite3D1->setPosition3D( Vec3( 0, 0,0 ) ); @@ -1361,28 +1359,28 @@ void FogTestDemo::switchTypeCallback(Ref* sender,int type) { if(type == 0) { - _state->setUniformVec4("fogColor", Vec4(0.5,0.5,0.5,1.0)); - _state->setUniformFloat("fStart",10); - _state->setUniformFloat("fEnd",60); - _state->setUniformInt("iEquation" ,0); + _state->setUniformVec4("u_fogColor", Vec4(0.5,0.5,0.5,1.0)); + _state->setUniformFloat("u_fogStart",10); + _state->setUniformFloat("u_fogEnd",60); + _state->setUniformInt("u_fogEquation" ,0); _sprite3D1->setGLProgramState(_state); _sprite3D2->setGLProgramState(_state); } else if(type == 1) { - _state->setUniformVec4("fogColor", Vec4(0.5,0.5,0.5,1.0)); - _state->setUniformFloat("fogDensity",0.03); - _state->setUniformInt("iEquation" ,1); + _state->setUniformVec4("u_fogColor", Vec4(0.5,0.5,0.5,1.0)); + _state->setUniformFloat("u_fogDensity",0.03); + _state->setUniformInt("u_fogEquation" ,1); _sprite3D1->setGLProgramState(_state); _sprite3D2->setGLProgramState(_state); } else if(type == 2) { - _state->setUniformVec4("fogColor", Vec4(0.5,0.5,0.5,1.0)); - _state->setUniformFloat("fogDensity",0.03); - _state->setUniformInt("iEquation" ,2); + _state->setUniformVec4("u_fogColor", Vec4(0.5,0.5,0.5,1.0)); + _state->setUniformFloat("u_fogDensity",0.03); + _state->setUniformInt("u_fogEquation" ,2); _sprite3D1->setGLProgramState(_state); _sprite3D2->setGLProgramState(_state); diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h index 992336718c..09d29633e2 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h @@ -188,7 +188,6 @@ protected: DrawNode3D* _drawGrid; Quaternion _rotationQuat; float _fRadius; - float _distanceX; float _distanceZ; OperateCamType _operate; Vec3 _center; diff --git a/tests/cpp-tests/Resources/Sprite3DTest/fog.frag b/tests/cpp-tests/Resources/Sprite3DTest/fog.frag index 1161338b9a..bdf3e369a6 100644 --- a/tests/cpp-tests/Resources/Sprite3DTest/fog.frag +++ b/tests/cpp-tests/Resources/Sprite3DTest/fog.frag @@ -3,12 +3,12 @@ varying mediump vec2 v_texture_coord; #else varying vec2 v_texture_coord; #endif -varying float fogFactor; +varying float v_fogFactor; -uniform vec4 fogColor; +uniform vec4 u_fogColor; void main (void) { vec4 finalColor = texture2D(CC_Texture0, v_texture_coord); - gl_FragColor = mix(fogColor, finalColor, fogFactor ); //out put finalColor + gl_FragColor = mix(u_fogColor, finalColor, v_fogFactor ); //out put finalColor } diff --git a/tests/cpp-tests/Resources/Sprite3DTest/fog.vert b/tests/cpp-tests/Resources/Sprite3DTest/fog.vert index a60a597049..4dd4f578e6 100644 --- a/tests/cpp-tests/Resources/Sprite3DTest/fog.vert +++ b/tests/cpp-tests/Resources/Sprite3DTest/fog.vert @@ -1,29 +1,29 @@ attribute vec4 a_position; attribute vec2 a_texCoord; -varying float fogFactor; //weight for fog +varying float v_fogFactor; //weight for fog varying vec2 v_texture_coord; -uniform float fogDensity;// For exp and exp2 equation -uniform float fStart; // This is only for linear fog -uniform float fEnd; // This is only for linear fog -uniform int iEquation; // 0 = linear, 1 = exp, 2 = exp2 +uniform float u_fogDensity;// For exp and exp2 equation +uniform float u_fogStart; // This is only for linear fog +uniform float u_fogEnd; // This is only for linear fog +uniform int u_fogEquation; // 0 = linear, 1 = exp, 2 = exp2 void main(void) { gl_Position = CC_MVPMatrix * a_position; v_texture_coord = a_texCoord; - float FogFragCoord = abs(gl_Position.z); //get fog distance + float fogFragCoord = abs(gl_Position.z); //get fog distance - if(iEquation == 0) - fogFactor = (fEnd-FogFragCoord )/(fEnd-fStart); //linear fog - else if(iEquation == 1) - fogFactor = exp(-fogDensity*FogFragCoord ); //exp fog - else if(iEquation == 2) - fogFactor = exp(-pow(fogDensity*FogFragCoord , 2.0)); //exp2 fog + if(u_fogEquation == 0) + v_fogFactor = (u_fogEnd-fogFragCoord )/(u_fogEnd-u_fogStart); //linear fog + else if(u_fogEquation == 1) + v_fogFactor = exp(-u_fogDensity*fogFragCoord ); //exp fog + else if(u_fogEquation == 2) + v_fogFactor = exp(-pow(u_fogDensity*fogFragCoord , 2.0)); //exp2 fog - fogFactor = clamp(fogFactor, 0.0, 1.0); //clamp 0 to 1 + v_fogFactor = clamp(v_fogFactor, 0.0, 1.0); //clamp 0 to 1 } From 06d583c5ead802802d1de74ffeeb67bea4380356 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Wed, 7 Jan 2015 18:36:59 +0800 Subject: [PATCH 037/106] update deps to 31 --- external/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/config.json b/external/config.json index 56de86aab0..8b2030da89 100644 --- a/external/config.json +++ b/external/config.json @@ -1,5 +1,5 @@ { - "version":"v3-deps-30", + "version":"v3-deps-31", "zip_file_size":"87419231", "repo_name":"cocos2d-x-3rd-party-libs-bin", "repo_parent":"https://github.com/cocos2d/", From ca86bce60d4e559b3f73c097ab3106dbdc1df542 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Wed, 7 Jan 2015 23:46:28 +0900 Subject: [PATCH 038/106] Replace tab with spaces --- cocos/2d/CCAction.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/cocos/2d/CCAction.cpp b/cocos/2d/CCAction.cpp index 7d441f106e..488fa790a2 100644 --- a/cocos/2d/CCAction.cpp +++ b/cocos/2d/CCAction.cpp @@ -117,11 +117,11 @@ bool Speed::initWithAction(ActionInterval *action, float speed) Speed *Speed::clone() const { - // no copy constructor - auto a = new (std::nothrow) Speed(); - a->initWithAction(_innerAction->clone(), _speed); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Speed(); + a->initWithAction(_innerAction->clone(), _speed); + a->autorelease(); + return a; } void Speed::startWithTarget(Node* target) @@ -148,8 +148,7 @@ bool Speed::isDone() const Speed *Speed::reverse() const { - - return Speed::create(_innerAction->reverse(), _speed); + return Speed::create(_innerAction->reverse(), _speed); } void Speed::setInnerAction(ActionInterval *action) @@ -184,11 +183,11 @@ Follow* Follow::create(Node *followedNode, const Rect& rect/* = Rect::ZERO*/) Follow* Follow::clone() const { - // no copy constructor - auto a = new (std::nothrow) Follow(); - a->initWithTarget(_followedNode, _worldRect); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Follow(); + a->initWithTarget(_followedNode, _worldRect); + a->autorelease(); + return a; } Follow* Follow::reverse() const From be022338158e4889c5dd6c67ab7c2a5ce2224034 Mon Sep 17 00:00:00 2001 From: huangshiwu Date: Thu, 8 Jan 2015 00:23:27 +0800 Subject: [PATCH 039/106] Fix XmlHttpRequestTest parsing error of response header on iOS platform --- cocos/network/HttpAsynConnection.h | 1 + cocos/network/HttpAsynConnection.m | 6 +++++- cocos/network/HttpClient-ios.mm | 1 + .../lua-bindings/manual/network/lua_xml_http_request.cpp | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cocos/network/HttpAsynConnection.h b/cocos/network/HttpAsynConnection.h index e4f8a7b94e..cd3b2cc78e 100644 --- a/cocos/network/HttpAsynConnection.h +++ b/cocos/network/HttpAsynConnection.h @@ -43,6 +43,7 @@ @property (readonly) NSInteger getDataTime; @property (readonly) NSInteger responseCode; +@property (readonly) NSString *statusString; @property (strong) NSError *responseError; diff --git a/cocos/network/HttpAsynConnection.m b/cocos/network/HttpAsynConnection.m index a365924437..5ddb717252 100755 --- a/cocos/network/HttpAsynConnection.m +++ b/cocos/network/HttpAsynConnection.m @@ -32,6 +32,7 @@ @synthesize responseData; @synthesize getDataTime; @synthesize responseCode; +@synthesize statusString; @synthesize responseError; @synthesize conn; @synthesize finish; @@ -73,7 +74,10 @@ responseHeader = [[httpResponse allHeaderFields] copy]; responseCode = httpResponse.statusCode; - if (responseCode != 200) + statusString = [[NSHTTPURLResponse localizedStringForStatusCode:responseCode] copy]; + if(responseCode == 200) + statusString = @"OK"; + if (responseCode/100 != 2) {// something went wrong, abort the whole thing [connection cancel]; diff --git a/cocos/network/HttpClient-ios.mm b/cocos/network/HttpClient-ios.mm index aacb6d821f..5be5271ffc 100644 --- a/cocos/network/HttpClient-ios.mm +++ b/cocos/network/HttpClient-ios.mm @@ -279,6 +279,7 @@ static int processTask(HttpRequest *request, NSString* requestType, void *stream //handle response header NSMutableString *header = [NSMutableString new]; + [header appendFormat:@"HTTP/1.1 %ld %@\n", httpAsynConn.responseCode, httpAsynConn.statusString]; for (id key in httpAsynConn.responseHeader) { [header appendFormat:@"%@: %@\n", key, [httpAsynConn.responseHeader objectForKey:key]]; diff --git a/cocos/scripting/lua-bindings/manual/network/lua_xml_http_request.cpp b/cocos/scripting/lua-bindings/manual/network/lua_xml_http_request.cpp index 6a28bfec47..5d64c0390d 100644 --- a/cocos/scripting/lua-bindings/manual/network/lua_xml_http_request.cpp +++ b/cocos/scripting/lua-bindings/manual/network/lua_xml_http_request.cpp @@ -116,7 +116,7 @@ void LuaMinXmlHttpRequest::_gotHeader(string header) pch = strtok (NULL, " "); mystream << pch; - pch = strtok (NULL, " "); + pch = strtok (NULL, "\n"); mystream << " " << pch; _statusText = mystream.str(); From 70e0874adde4ab7a00a654eb53fb30f141458ef4 Mon Sep 17 00:00:00 2001 From: yinjimmy Date: Thu, 8 Jan 2015 09:01:39 +0800 Subject: [PATCH 040/106] Compatibility code for executeScriptFile --- .../lua-bindings/manual/CCLuaStack.cpp | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp index c18a3e7e90..c77e14f530 100644 --- a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp +++ b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp @@ -279,23 +279,26 @@ int LuaStack::executeScriptFile(const char* filename) static const std::string BYTECODE_FILE_EXT = ".luac"; static const std::string NOT_BYTECODE_FILE_EXT = ".lua"; - FileUtils *utils = FileUtils::getInstance(); - // + FileUtils *utils = FileUtils::getInstance(); + // // 1. check .lua suffix // 2. check .luac suffix // std::string buf(filename); - std::string tmpfilename = buf + NOT_BYTECODE_FILE_EXT; - if (utils->isFileExist(tmpfilename)) + if (!utils->isFileExist(buf)) { - buf = tmpfilename; - } - else - { - tmpfilename = buf + BYTECODE_FILE_EXT; - if (utils->isFileExist(tmpfilename)) + std::string notBytecodeFilename = buf + NOT_BYTECODE_FILE_EXT; + if (utils->isFileExist(notBytecodeFilename)) { - buf = tmpfilename; + buf = notBytecodeFilename; + } + else + { + std::string bytecodeFilename = buf + BYTECODE_FILE_EXT; + if (utils->isFileExist(bytecodeFilename)) + { + buf = bytecodeFilename; + } } } From 108e4d2b411996f3b20cd4c53d08460c37a58a98 Mon Sep 17 00:00:00 2001 From: huangshiwu Date: Thu, 8 Jan 2015 10:12:45 +0800 Subject: [PATCH 041/106] Add comments and improve code readability for HttpAsynConnection.m --- cocos/network/HttpAsynConnection.m | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cocos/network/HttpAsynConnection.m b/cocos/network/HttpAsynConnection.m index 5ddb717252..cca536ea14 100755 --- a/cocos/network/HttpAsynConnection.m +++ b/cocos/network/HttpAsynConnection.m @@ -77,7 +77,17 @@ statusString = [[NSHTTPURLResponse localizedStringForStatusCode:responseCode] copy]; if(responseCode == 200) statusString = @"OK"; - if (responseCode/100 != 2) + + /*The individual values of the numeric status codes defined for HTTP/1.1 + | “200†; OK + | “201†; Created + | “202†; Accepted + | “203†; Non-Authoritative Information + | “204†; No Content + | “205†; Reset Content + | “206†; Partial Content + */ + if (responseCode >= 200 && responseCode < 300) {// something went wrong, abort the whole thing [connection cancel]; From 822c38b1295b335f804ad7dba6f75b77d4a6db00 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 8 Jan 2015 02:40:40 +0000 Subject: [PATCH 042/106] [AUTO]: updating luabinding automatically --- .../lua-bindings/auto/api/PhysicsJoint.lua | 6 - .../auto/api/PhysicsJointDistance.lua | 6 + .../auto/api/PhysicsJointFixed.lua | 6 + .../auto/api/PhysicsJointGear.lua | 6 + .../auto/api/PhysicsJointGroove.lua | 6 + .../auto/api/PhysicsJointLimit.lua | 6 + .../auto/api/PhysicsJointMotor.lua | 6 + .../lua-bindings/auto/api/PhysicsJointPin.lua | 14 +- .../auto/api/PhysicsJointRatchet.lua | 6 + .../auto/api/PhysicsJointRotaryLimit.lua | 6 + .../auto/api/PhysicsJointRotarySpring.lua | 6 + .../auto/api/PhysicsJointSpring.lua | 6 + .../scripting/lua-bindings/auto/api/Scene.lua | 6 - .../auto/lua_cocos2dx_physics_auto.cpp | 621 ++++++++++++++++-- .../auto/lua_cocos2dx_physics_auto.hpp | 10 + 15 files changed, 649 insertions(+), 68 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJoint.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJoint.lua index bd755d2459..4a7858bf49 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJoint.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJoint.lua @@ -74,10 +74,4 @@ -- @param self -- @return int#int ret (return value: int) --------------------------------- --- Distory the joint --- @function [parent=#PhysicsJoint] destroy --- @param self --- @param #cc.PhysicsJoint joint - return nil diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointDistance.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointDistance.lua index 2bfabc2470..0ccbf33ac9 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointDistance.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointDistance.lua @@ -4,6 +4,12 @@ -- @extend PhysicsJoint -- @parent_module cc +-------------------------------- +-- +-- @function [parent=#PhysicsJointDistance] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointDistance] setDistance diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointFixed.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointFixed.lua index a4f86b1dc5..92c16efe2f 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointFixed.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointFixed.lua @@ -4,6 +4,12 @@ -- @extend PhysicsJoint -- @parent_module cc +-------------------------------- +-- +-- @function [parent=#PhysicsJointFixed] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointFixed] construct diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointGear.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointGear.lua index 80c94bce3b..e4b643eb9b 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointGear.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointGear.lua @@ -22,6 +22,12 @@ -- @param self -- @param #float phase +-------------------------------- +-- +-- @function [parent=#PhysicsJointGear] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointGear] getRatio diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointGroove.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointGroove.lua index 1e0c0f8b9e..7cd05af052 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointGroove.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointGroove.lua @@ -40,6 +40,12 @@ -- @param self -- @return vec2_table#vec2_table ret (return value: vec2_table) +-------------------------------- +-- +-- @function [parent=#PhysicsJointGroove] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointGroove] construct diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointLimit.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointLimit.lua index 80b7d4df7d..f74260638d 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointLimit.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointLimit.lua @@ -34,6 +34,12 @@ -- @param self -- @return vec2_table#vec2_table ret (return value: vec2_table) +-------------------------------- +-- +-- @function [parent=#PhysicsJointLimit] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointLimit] getMin diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointMotor.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointMotor.lua index 27f44d36aa..b290ce42d3 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointMotor.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointMotor.lua @@ -16,6 +16,12 @@ -- @param self -- @return float#float ret (return value: float) +-------------------------------- +-- +-- @function [parent=#PhysicsJointMotor] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointMotor] construct diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointPin.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointPin.lua index c45189c216..b3d9884941 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointPin.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointPin.lua @@ -6,11 +6,19 @@ -------------------------------- -- --- @function [parent=#PhysicsJointPin] construct +-- @function [parent=#PhysicsJointPin] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + +-------------------------------- +-- @overload self, cc.PhysicsBody, cc.PhysicsBody, vec2_table, vec2_table +-- @overload self, cc.PhysicsBody, cc.PhysicsBody, vec2_table +-- @function [parent=#PhysicsJointPin] construct -- @param self -- @param #cc.PhysicsBody a -- @param #cc.PhysicsBody b --- @param #vec2_table anchr +-- @param #vec2_table anchr1 +-- @param #vec2_table anchr2 -- @return PhysicsJointPin#PhysicsJointPin ret (return value: cc.PhysicsJointPin) - + return nil diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointRatchet.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointRatchet.lua index f61f444ffd..7d1b9284d9 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointRatchet.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointRatchet.lua @@ -16,6 +16,12 @@ -- @param self -- @param #float angle +-------------------------------- +-- +-- @function [parent=#PhysicsJointRatchet] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointRatchet] setPhase diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointRotaryLimit.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointRotaryLimit.lua index 9600c188e7..aa7246706b 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointRotaryLimit.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointRotaryLimit.lua @@ -10,6 +10,12 @@ -- @param self -- @return float#float ret (return value: float) +-------------------------------- +-- +-- @function [parent=#PhysicsJointRotaryLimit] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointRotaryLimit] setMin diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointRotarySpring.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointRotarySpring.lua index e8df535554..20ff12edf9 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointRotarySpring.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointRotarySpring.lua @@ -22,6 +22,12 @@ -- @param self -- @return float#float ret (return value: float) +-------------------------------- +-- +-- @function [parent=#PhysicsJointRotarySpring] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointRotarySpring] setStiffness diff --git a/cocos/scripting/lua-bindings/auto/api/PhysicsJointSpring.lua b/cocos/scripting/lua-bindings/auto/api/PhysicsJointSpring.lua index 0b177ac1f4..37452a3060 100644 --- a/cocos/scripting/lua-bindings/auto/api/PhysicsJointSpring.lua +++ b/cocos/scripting/lua-bindings/auto/api/PhysicsJointSpring.lua @@ -52,6 +52,12 @@ -- @param self -- @return float#float ret (return value: float) +-------------------------------- +-- +-- @function [parent=#PhysicsJointSpring] createConstraints +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#PhysicsJointSpring] setRestLength diff --git a/cocos/scripting/lua-bindings/auto/api/Scene.lua b/cocos/scripting/lua-bindings/auto/api/Scene.lua index 80883588a2..6fe5eff5dd 100644 --- a/cocos/scripting/lua-bindings/auto/api/Scene.lua +++ b/cocos/scripting/lua-bindings/auto/api/Scene.lua @@ -38,10 +38,4 @@ -- @param self -- @return string#string ret (return value: string) --------------------------------- --- --- @function [parent=#Scene] update --- @param self --- @param #float delta - return nil diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp index 5452245563..82ecb8bc68 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp @@ -7602,41 +7602,6 @@ int lua_cocos2dx_physics_PhysicsJoint_getTag(lua_State* tolua_S) return 0; } -int lua_cocos2dx_physics_PhysicsJoint_destroy(lua_State* tolua_S) -{ - int argc = 0; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S,1,"cc.PhysicsJoint",0,&tolua_err)) goto tolua_lerror; -#endif - - argc = lua_gettop(tolua_S) - 1; - - if (argc == 1) - { - cocos2d::PhysicsJoint* arg0; - ok &= luaval_to_object(tolua_S, 2, "cc.PhysicsJoint",&arg0); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJoint_destroy'", nullptr); - return 0; - } - cocos2d::PhysicsJoint::destroy(arg0); - return 0; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.PhysicsJoint:destroy",argc, 1); - return 0; -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJoint_destroy'.",&tolua_err); -#endif - return 0; -} static int lua_cocos2dx_physics_PhysicsJoint_finalize(lua_State* tolua_S) { printf("luabindings: finalizing LUA object (PhysicsJoint)"); @@ -7661,7 +7626,6 @@ int lua_register_cocos2dx_physics_PhysicsJoint(lua_State* tolua_S) tolua_function(tolua_S,"removeFormWorld",lua_cocos2dx_physics_PhysicsJoint_removeFormWorld); tolua_function(tolua_S,"isCollisionEnabled",lua_cocos2dx_physics_PhysicsJoint_isCollisionEnabled); tolua_function(tolua_S,"getTag",lua_cocos2dx_physics_PhysicsJoint_getTag); - tolua_function(tolua_S,"destroy", lua_cocos2dx_physics_PhysicsJoint_destroy); tolua_endmodule(tolua_S); std::string typeName = typeid(cocos2d::PhysicsJoint).name(); g_luaType[typeName] = "cc.PhysicsJoint"; @@ -7669,6 +7633,53 @@ int lua_register_cocos2dx_physics_PhysicsJoint(lua_State* tolua_S) return 1; } +int lua_cocos2dx_physics_PhysicsJointFixed_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointFixed* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointFixed",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointFixed*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointFixed_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointFixed_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointFixed:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointFixed_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointFixed_construct(lua_State* tolua_S) { int argc = 0; @@ -7721,6 +7732,7 @@ int lua_register_cocos2dx_physics_PhysicsJointFixed(lua_State* tolua_S) tolua_cclass(tolua_S,"PhysicsJointFixed","cc.PhysicsJointFixed","cc.PhysicsJoint",nullptr); tolua_beginmodule(tolua_S,"PhysicsJointFixed"); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointFixed_createConstraints); tolua_function(tolua_S,"construct", lua_cocos2dx_physics_PhysicsJointFixed_construct); tolua_endmodule(tolua_S); std::string typeName = typeid(cocos2d::PhysicsJointFixed).name(); @@ -7970,6 +7982,53 @@ int lua_cocos2dx_physics_PhysicsJointLimit_getAnchr1(lua_State* tolua_S) return 0; } +int lua_cocos2dx_physics_PhysicsJointLimit_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointLimit* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointLimit",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointLimit*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointLimit_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointLimit_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointLimit:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointLimit_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointLimit_getMin(lua_State* tolua_S) { int argc = 0; @@ -8202,6 +8261,7 @@ int lua_register_cocos2dx_physics_PhysicsJointLimit(lua_State* tolua_S) tolua_function(tolua_S,"setMax",lua_cocos2dx_physics_PhysicsJointLimit_setMax); tolua_function(tolua_S,"getAnchr2",lua_cocos2dx_physics_PhysicsJointLimit_getAnchr2); tolua_function(tolua_S,"getAnchr1",lua_cocos2dx_physics_PhysicsJointLimit_getAnchr1); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointLimit_createConstraints); tolua_function(tolua_S,"getMin",lua_cocos2dx_physics_PhysicsJointLimit_getMin); tolua_function(tolua_S,"getMax",lua_cocos2dx_physics_PhysicsJointLimit_getMax); tolua_function(tolua_S,"setMin",lua_cocos2dx_physics_PhysicsJointLimit_setMin); @@ -8213,11 +8273,57 @@ int lua_register_cocos2dx_physics_PhysicsJointLimit(lua_State* tolua_S) return 1; } +int lua_cocos2dx_physics_PhysicsJointPin_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointPin* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointPin",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointPin*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointPin_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointPin_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointPin:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointPin_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointPin_construct(lua_State* tolua_S) { int argc = 0; bool ok = true; - #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif @@ -8226,26 +8332,50 @@ int lua_cocos2dx_physics_PhysicsJointPin_construct(lua_State* tolua_S) if (!tolua_isusertable(tolua_S,1,"cc.PhysicsJointPin",0,&tolua_err)) goto tolua_lerror; #endif - argc = lua_gettop(tolua_S) - 1; + argc = lua_gettop(tolua_S)-1; - if (argc == 3) + do { - cocos2d::PhysicsBody* arg0; - cocos2d::PhysicsBody* arg1; - cocos2d::Vec2 arg2; - ok &= luaval_to_object(tolua_S, 2, "cc.PhysicsBody",&arg0); - ok &= luaval_to_object(tolua_S, 3, "cc.PhysicsBody",&arg1); - ok &= luaval_to_vec2(tolua_S, 4, &arg2, "cc.PhysicsJointPin:construct"); - if(!ok) + if (argc == 4) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointPin_construct'", nullptr); - return 0; + cocos2d::PhysicsBody* arg0; + ok &= luaval_to_object(tolua_S, 2, "cc.PhysicsBody",&arg0); + if (!ok) { break; } + cocos2d::PhysicsBody* arg1; + ok &= luaval_to_object(tolua_S, 3, "cc.PhysicsBody",&arg1); + if (!ok) { break; } + cocos2d::Vec2 arg2; + ok &= luaval_to_vec2(tolua_S, 4, &arg2, "cc.PhysicsJointPin:construct"); + if (!ok) { break; } + cocos2d::Vec2 arg3; + ok &= luaval_to_vec2(tolua_S, 5, &arg3, "cc.PhysicsJointPin:construct"); + if (!ok) { break; } + cocos2d::PhysicsJointPin* ret = cocos2d::PhysicsJointPin::construct(arg0, arg1, arg2, arg3); + object_to_luaval(tolua_S, "cc.PhysicsJointPin",(cocos2d::PhysicsJointPin*)ret); + return 1; } - cocos2d::PhysicsJointPin* ret = cocos2d::PhysicsJointPin::construct(arg0, arg1, arg2); - object_to_luaval(tolua_S, "cc.PhysicsJointPin",(cocos2d::PhysicsJointPin*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.PhysicsJointPin:construct",argc, 3); + } while (0); + ok = true; + do + { + if (argc == 3) + { + cocos2d::PhysicsBody* arg0; + ok &= luaval_to_object(tolua_S, 2, "cc.PhysicsBody",&arg0); + if (!ok) { break; } + cocos2d::PhysicsBody* arg1; + ok &= luaval_to_object(tolua_S, 3, "cc.PhysicsBody",&arg1); + if (!ok) { break; } + cocos2d::Vec2 arg2; + ok &= luaval_to_vec2(tolua_S, 4, &arg2, "cc.PhysicsJointPin:construct"); + if (!ok) { break; } + cocos2d::PhysicsJointPin* ret = cocos2d::PhysicsJointPin::construct(arg0, arg1, arg2); + object_to_luaval(tolua_S, "cc.PhysicsJointPin",(cocos2d::PhysicsJointPin*)ret); + return 1; + } + } while (0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "cc.PhysicsJointPin:construct",argc, 3); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -8265,6 +8395,7 @@ int lua_register_cocos2dx_physics_PhysicsJointPin(lua_State* tolua_S) tolua_cclass(tolua_S,"PhysicsJointPin","cc.PhysicsJointPin","cc.PhysicsJoint",nullptr); tolua_beginmodule(tolua_S,"PhysicsJointPin"); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointPin_createConstraints); tolua_function(tolua_S,"construct", lua_cocos2dx_physics_PhysicsJointPin_construct); tolua_endmodule(tolua_S); std::string typeName = typeid(cocos2d::PhysicsJointPin).name(); @@ -8273,6 +8404,53 @@ int lua_register_cocos2dx_physics_PhysicsJointPin(lua_State* tolua_S) return 1; } +int lua_cocos2dx_physics_PhysicsJointDistance_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointDistance* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointDistance",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointDistance*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointDistance_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointDistance_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointDistance:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointDistance_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointDistance_setDistance(lua_State* tolua_S) { int argc = 0; @@ -8423,6 +8601,7 @@ int lua_register_cocos2dx_physics_PhysicsJointDistance(lua_State* tolua_S) tolua_cclass(tolua_S,"PhysicsJointDistance","cc.PhysicsJointDistance","cc.PhysicsJoint",nullptr); tolua_beginmodule(tolua_S,"PhysicsJointDistance"); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointDistance_createConstraints); tolua_function(tolua_S,"setDistance",lua_cocos2dx_physics_PhysicsJointDistance_setDistance); tolua_function(tolua_S,"getDistance",lua_cocos2dx_physics_PhysicsJointDistance_getDistance); tolua_function(tolua_S,"construct", lua_cocos2dx_physics_PhysicsJointDistance_construct); @@ -8815,6 +8994,53 @@ int lua_cocos2dx_physics_PhysicsJointSpring_getStiffness(lua_State* tolua_S) return 0; } +int lua_cocos2dx_physics_PhysicsJointSpring_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointSpring* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointSpring",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointSpring*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointSpring_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointSpring_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointSpring:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointSpring_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointSpring_setRestLength(lua_State* tolua_S) { int argc = 0; @@ -8979,6 +9205,7 @@ int lua_register_cocos2dx_physics_PhysicsJointSpring(lua_State* tolua_S) tolua_function(tolua_S,"getAnchr2",lua_cocos2dx_physics_PhysicsJointSpring_getAnchr2); tolua_function(tolua_S,"getAnchr1",lua_cocos2dx_physics_PhysicsJointSpring_getAnchr1); tolua_function(tolua_S,"getStiffness",lua_cocos2dx_physics_PhysicsJointSpring_getStiffness); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointSpring_createConstraints); tolua_function(tolua_S,"setRestLength",lua_cocos2dx_physics_PhysicsJointSpring_setRestLength); tolua_function(tolua_S,"setDamping",lua_cocos2dx_physics_PhysicsJointSpring_setDamping); tolua_function(tolua_S,"construct", lua_cocos2dx_physics_PhysicsJointSpring_construct); @@ -9277,6 +9504,53 @@ int lua_cocos2dx_physics_PhysicsJointGroove_getAnchr2(lua_State* tolua_S) return 0; } +int lua_cocos2dx_physics_PhysicsJointGroove_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointGroove* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointGroove",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointGroove*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointGroove_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointGroove_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointGroove:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointGroove_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointGroove_construct(lua_State* tolua_S) { int argc = 0; @@ -9339,6 +9613,7 @@ int lua_register_cocos2dx_physics_PhysicsJointGroove(lua_State* tolua_S) tolua_function(tolua_S,"getGrooveA",lua_cocos2dx_physics_PhysicsJointGroove_getGrooveA); tolua_function(tolua_S,"getGrooveB",lua_cocos2dx_physics_PhysicsJointGroove_getGrooveB); tolua_function(tolua_S,"getAnchr2",lua_cocos2dx_physics_PhysicsJointGroove_getAnchr2); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointGroove_createConstraints); tolua_function(tolua_S,"construct", lua_cocos2dx_physics_PhysicsJointGroove_construct); tolua_endmodule(tolua_S); std::string typeName = typeid(cocos2d::PhysicsJointGroove).name(); @@ -9490,6 +9765,53 @@ int lua_cocos2dx_physics_PhysicsJointRotarySpring_getStiffness(lua_State* tolua_ return 0; } +int lua_cocos2dx_physics_PhysicsJointRotarySpring_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointRotarySpring* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointRotarySpring",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointRotarySpring*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointRotarySpring_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointRotarySpring_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointRotarySpring:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointRotarySpring_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointRotarySpring_setStiffness(lua_State* tolua_S) { int argc = 0; @@ -9692,6 +10014,7 @@ int lua_register_cocos2dx_physics_PhysicsJointRotarySpring(lua_State* tolua_S) tolua_function(tolua_S,"getDamping",lua_cocos2dx_physics_PhysicsJointRotarySpring_getDamping); tolua_function(tolua_S,"setRestAngle",lua_cocos2dx_physics_PhysicsJointRotarySpring_setRestAngle); tolua_function(tolua_S,"getStiffness",lua_cocos2dx_physics_PhysicsJointRotarySpring_getStiffness); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointRotarySpring_createConstraints); tolua_function(tolua_S,"setStiffness",lua_cocos2dx_physics_PhysicsJointRotarySpring_setStiffness); tolua_function(tolua_S,"setDamping",lua_cocos2dx_physics_PhysicsJointRotarySpring_setDamping); tolua_function(tolua_S,"getRestAngle",lua_cocos2dx_physics_PhysicsJointRotarySpring_getRestAngle); @@ -9750,6 +10073,53 @@ int lua_cocos2dx_physics_PhysicsJointRotaryLimit_getMax(lua_State* tolua_S) return 0; } +int lua_cocos2dx_physics_PhysicsJointRotaryLimit_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointRotaryLimit* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointRotaryLimit",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointRotaryLimit*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointRotaryLimit_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointRotaryLimit_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointRotaryLimit:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointRotaryLimit_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointRotaryLimit_setMin(lua_State* tolua_S) { int argc = 0; @@ -9968,6 +10338,7 @@ int lua_register_cocos2dx_physics_PhysicsJointRotaryLimit(lua_State* tolua_S) tolua_beginmodule(tolua_S,"PhysicsJointRotaryLimit"); tolua_function(tolua_S,"getMax",lua_cocos2dx_physics_PhysicsJointRotaryLimit_getMax); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointRotaryLimit_createConstraints); tolua_function(tolua_S,"setMin",lua_cocos2dx_physics_PhysicsJointRotaryLimit_setMin); tolua_function(tolua_S,"setMax",lua_cocos2dx_physics_PhysicsJointRotaryLimit_setMax); tolua_function(tolua_S,"getMin",lua_cocos2dx_physics_PhysicsJointRotaryLimit_getMin); @@ -10075,6 +10446,53 @@ int lua_cocos2dx_physics_PhysicsJointRatchet_setAngle(lua_State* tolua_S) return 0; } +int lua_cocos2dx_physics_PhysicsJointRatchet_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointRatchet* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointRatchet",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointRatchet*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointRatchet_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointRatchet_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointRatchet:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointRatchet_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointRatchet_setPhase(lua_State* tolua_S) { int argc = 0; @@ -10323,6 +10741,7 @@ int lua_register_cocos2dx_physics_PhysicsJointRatchet(lua_State* tolua_S) tolua_beginmodule(tolua_S,"PhysicsJointRatchet"); tolua_function(tolua_S,"getAngle",lua_cocos2dx_physics_PhysicsJointRatchet_getAngle); tolua_function(tolua_S,"setAngle",lua_cocos2dx_physics_PhysicsJointRatchet_setAngle); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointRatchet_createConstraints); tolua_function(tolua_S,"setPhase",lua_cocos2dx_physics_PhysicsJointRatchet_setPhase); tolua_function(tolua_S,"getPhase",lua_cocos2dx_physics_PhysicsJointRatchet_getPhase); tolua_function(tolua_S,"setRatchet",lua_cocos2dx_physics_PhysicsJointRatchet_setRatchet); @@ -10480,6 +10899,53 @@ int lua_cocos2dx_physics_PhysicsJointGear_setPhase(lua_State* tolua_S) return 0; } +int lua_cocos2dx_physics_PhysicsJointGear_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointGear* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointGear",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointGear*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointGear_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointGear_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointGear:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointGear_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointGear_getRatio(lua_State* tolua_S) { int argc = 0; @@ -10584,6 +11050,7 @@ int lua_register_cocos2dx_physics_PhysicsJointGear(lua_State* tolua_S) tolua_function(tolua_S,"setRatio",lua_cocos2dx_physics_PhysicsJointGear_setRatio); tolua_function(tolua_S,"getPhase",lua_cocos2dx_physics_PhysicsJointGear_getPhase); tolua_function(tolua_S,"setPhase",lua_cocos2dx_physics_PhysicsJointGear_setPhase); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointGear_createConstraints); tolua_function(tolua_S,"getRatio",lua_cocos2dx_physics_PhysicsJointGear_getRatio); tolua_function(tolua_S,"construct", lua_cocos2dx_physics_PhysicsJointGear_construct); tolua_endmodule(tolua_S); @@ -10689,6 +11156,53 @@ int lua_cocos2dx_physics_PhysicsJointMotor_getRate(lua_State* tolua_S) return 0; } +int lua_cocos2dx_physics_PhysicsJointMotor_createConstraints(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::PhysicsJointMotor* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.PhysicsJointMotor",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::PhysicsJointMotor*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_physics_PhysicsJointMotor_createConstraints'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsJointMotor_createConstraints'", nullptr); + return 0; + } + bool ret = cobj->createConstraints(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.PhysicsJointMotor:createConstraints",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_physics_PhysicsJointMotor_createConstraints'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_physics_PhysicsJointMotor_construct(lua_State* tolua_S) { int argc = 0; @@ -10743,6 +11257,7 @@ int lua_register_cocos2dx_physics_PhysicsJointMotor(lua_State* tolua_S) tolua_beginmodule(tolua_S,"PhysicsJointMotor"); tolua_function(tolua_S,"setRate",lua_cocos2dx_physics_PhysicsJointMotor_setRate); tolua_function(tolua_S,"getRate",lua_cocos2dx_physics_PhysicsJointMotor_getRate); + tolua_function(tolua_S,"createConstraints",lua_cocos2dx_physics_PhysicsJointMotor_createConstraints); tolua_function(tolua_S,"construct", lua_cocos2dx_physics_PhysicsJointMotor_construct); tolua_endmodule(tolua_S); std::string typeName = typeid(cocos2d::PhysicsJointMotor).name(); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.hpp index 244b66a31e..1fb1604762 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.hpp @@ -258,6 +258,16 @@ int register_all_cocos2dx_physics(lua_State* tolua_S); + + + + + + + + + + From 0c4a180c2b2a072c1f45ebdd8fd807fdb360230f Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Thu, 8 Jan 2015 11:02:24 +0800 Subject: [PATCH 043/106] [ci skip] update changelog --- CHANGELOG | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index d02ca4ba14..6e3415fb7d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,5 @@ cocos2d-x-3.4rc0 Jan.9 2015 - [NEW] 3rd: update libcurl to v7.39 + [NEW] 3rd: update libcurl to v7.39, update luajit to 2.0.3 [FIX] FileUtils: getData() can't get data from file when file was using by other application on windows [FIX] FileUtils: getData() will cause memory leak if file size is 0 on windows @@ -9,6 +9,9 @@ cocos2d-x-3.4rc0 Jan.9 2015 [FIX] Sprite3DTest: Sprite3DUVAnimationTest, Sprite3DFakeShadowTest, Sprite3DLightMapTest, Sprite3DBasicToonShaderTest will crash on android when switch to foreground from background [FIX] HttpClient: http requests will be lost in immediately mode on iOS [FIX] WP8: compiling error on ARM architecture + [FIX] DrawNode: can not set color when DrawPoints, wrong behavior of drawRect + [FIX] GLProgramState: uniforms and attribute is not refreshed when come to foreground on android + [FIX] Particle: VAO and VBOs is not reset when come to foreground on android cocos2d-x-3.4beta0 Dec.31 2014 [NEW] 3D: support frustum culling From f6de697bde058e446374f76407217a20733f429f Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 8 Jan 2015 06:05:46 +0000 Subject: [PATCH 044/106] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 0432aabdf3..67e51c30ab 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -1467,8 +1467,13 @@ "external/curl/include/win32/curl/multi.h", "external/curl/include/win32/curl/stdcheaders.h", "external/curl/include/win32/curl/typecheck-gcc.h", + "external/curl/include/winrt_8.1/curl/Makefile.am", + "external/curl/include/winrt_8.1/curl/Makefile.in", "external/curl/include/winrt_8.1/curl/curl.h", "external/curl/include/winrt_8.1/curl/curlbuild.h", + "external/curl/include/winrt_8.1/curl/curlbuild.h.cmake", + "external/curl/include/winrt_8.1/curl/curlbuild.h.dist", + "external/curl/include/winrt_8.1/curl/curlbuild.h.in", "external/curl/include/winrt_8.1/curl/curlrules.h", "external/curl/include/winrt_8.1/curl/curlver.h", "external/curl/include/winrt_8.1/curl/easy.h", @@ -1476,8 +1481,13 @@ "external/curl/include/winrt_8.1/curl/multi.h", "external/curl/include/winrt_8.1/curl/stdcheaders.h", "external/curl/include/winrt_8.1/curl/typecheck-gcc.h", + "external/curl/include/wp8/curl/Makefile.am", + "external/curl/include/wp8/curl/Makefile.in", "external/curl/include/wp8/curl/curl.h", "external/curl/include/wp8/curl/curlbuild.h", + "external/curl/include/wp8/curl/curlbuild.h.cmake", + "external/curl/include/wp8/curl/curlbuild.h.dist", + "external/curl/include/wp8/curl/curlbuild.h.in", "external/curl/include/wp8/curl/curlrules.h", "external/curl/include/wp8/curl/curlver.h", "external/curl/include/wp8/curl/easy.h", @@ -1485,8 +1495,13 @@ "external/curl/include/wp8/curl/multi.h", "external/curl/include/wp8/curl/stdcheaders.h", "external/curl/include/wp8/curl/typecheck-gcc.h", + "external/curl/include/wp_8.1/curl/Makefile.am", + "external/curl/include/wp_8.1/curl/Makefile.in", "external/curl/include/wp_8.1/curl/curl.h", "external/curl/include/wp_8.1/curl/curlbuild.h", + "external/curl/include/wp_8.1/curl/curlbuild.h.cmake", + "external/curl/include/wp_8.1/curl/curlbuild.h.dist", + "external/curl/include/wp_8.1/curl/curlbuild.h.in", "external/curl/include/wp_8.1/curl/curlrules.h", "external/curl/include/wp_8.1/curl/curlver.h", "external/curl/include/wp_8.1/curl/easy.h", @@ -1517,8 +1532,6 @@ "external/curl/prebuilt/winrt_8.1/arm/libcurl.dll", "external/curl/prebuilt/winrt_8.1/arm/libcurl.lib", "external/curl/prebuilt/winrt_8.1/arm/libeay32.dll", - "external/curl/prebuilt/winrt_8.1/arm/libwebsockets.dll", - "external/curl/prebuilt/winrt_8.1/arm/libwebsockets.lib", "external/curl/prebuilt/winrt_8.1/arm/ssleay32.dll", "external/curl/prebuilt/winrt_8.1/win32/libcurl.dll", "external/curl/prebuilt/winrt_8.1/win32/libcurl.lib", @@ -1536,8 +1549,6 @@ "external/curl/prebuilt/wp_8.1/arm/libcurl.lib", "external/curl/prebuilt/wp_8.1/arm/libeay32.dll", "external/curl/prebuilt/wp_8.1/arm/libeay32.lib", - "external/curl/prebuilt/wp_8.1/arm/libwebsockets.dll", - "external/curl/prebuilt/wp_8.1/arm/libwebsockets.lib", "external/curl/prebuilt/wp_8.1/arm/ssleay32.dll", "external/curl/prebuilt/wp_8.1/arm/ssleay32.lib", "external/curl/prebuilt/wp_8.1/win32/libcurl.dll", @@ -2561,6 +2572,7 @@ "external/tinyxml2/tinyxml2.cpp", "external/tinyxml2/tinyxml2.h", "external/unzip/CMakeLists.txt", + "external/unzip/crypt.h", "external/unzip/ioapi.cpp", "external/unzip/ioapi.h", "external/unzip/ioapi_mem.cpp", @@ -5293,6 +5305,7 @@ "external/lua/luajit/build_android.sh", "external/lua/luajit/build_ios.sh", "external/lua/luajit/build_mac.sh", + "external/lua/luajit/build_win32.bat", "external/lua/luajit/include/lauxlib.h", "external/lua/luajit/include/lua.h", "external/lua/luajit/include/luaconf.h", @@ -5320,6 +5333,7 @@ "external/lua/luajit/src/doc/ext_jit.html", "external/lua/luajit/src/doc/extensions.html", "external/lua/luajit/src/doc/faq.html", + "external/lua/luajit/src/doc/img/contact.png", "external/lua/luajit/src/doc/install.html", "external/lua/luajit/src/doc/luajit.html", "external/lua/luajit/src/doc/running.html", @@ -5489,13 +5503,13 @@ "external/lua/luajit/src/src/luajit.h", "external/lua/luajit/src/src/lualib.h", "external/lua/luajit/src/src/msvcbuild.bat", + "external/lua/luajit/src/src/ps4build.bat", "external/lua/luajit/src/src/vm_arm.dasc", "external/lua/luajit/src/src/vm_mips.dasc", "external/lua/luajit/src/src/vm_ppc.dasc", "external/lua/luajit/src/src/vm_ppcspe.dasc", "external/lua/luajit/src/src/vm_x86.dasc", "external/lua/luajit/src/src/xedkbuild.bat", - "external/lua/luajit/src/v2.0.1_hotfix1.patch", "external/lua/luasocket/auxiliar.c", "external/lua/luasocket/auxiliar.h", "external/lua/luasocket/buffer.c", From 61438f7297262f728ac05ed3db404087b0ad978e Mon Sep 17 00:00:00 2001 From: Wenhai Lin Date: Thu, 8 Jan 2015 14:25:06 +0800 Subject: [PATCH 045/106] [Physics]Reduce temporary object creation and save mathematical labor --- cocos/2d/CCNode.cpp | 10 ++++----- cocos/physics/CCPhysicsBody.cpp | 36 ++++++++++++++++----------------- cocos/physics/CCPhysicsBody.h | 13 +++++++----- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 3b64b40af5..4ab0364f15 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -2049,12 +2049,12 @@ void Node::updatePhysicsBodyTransform(Scene* scene, const Mat4& parentTransform, void Node::updateTransformFromPhysics(const Mat4& parentTransform, uint32_t parentFlags) { - auto newPos = _physicsBody->getPosition(); - auto& recordPos = _physicsBody->_recordPosition; - if (parentFlags || recordPos.x != newPos.x || recordPos.y != newPos.y) + auto& newPosition = _physicsBody->getPosition(); + auto& recordedPosition = _physicsBody->_recordedPosition; + if (parentFlags || recordedPosition.x != newPosition.x || recordedPosition.y != newPosition.y) { - recordPos = newPos; - Vec3 vec3(newPos.x, newPos.y, 0); + recordedPosition = newPosition; + Vec3 vec3(newPosition.x, newPosition.y, 0); Vec3 ret; parentTransform.getInversed().transformPoint(vec3, &ret); setPosition(ret.x, ret.y); diff --git a/cocos/physics/CCPhysicsBody.cpp b/cocos/physics/CCPhysicsBody.cpp index 04ea19575e..694f9ec679 100644 --- a/cocos/physics/CCPhysicsBody.cpp +++ b/cocos/physics/CCPhysicsBody.cpp @@ -69,7 +69,9 @@ PhysicsBody::PhysicsBody() , _angularDamping(0.0f) , _tag(0) , _rotationOffset(0) -, _recordPosition(Vec2::ZERO) +, _recordedPosition(Vec2::ZERO) +, _recordedRotation(0.0f) +, _recordedAngle(0.0) { } @@ -332,13 +334,15 @@ void PhysicsBody::setGravityEnable(bool enable) void PhysicsBody::setPosition(const Vec2& position) { - _recordPosition = position; + _recordedPosition = position; cpBodySetPos(_cpBody, PhysicsHelper::point2cpv(position + _positionOffset)); } void PhysicsBody::setRotation(float rotation) { - cpBodySetAngle(_cpBody, -PhysicsHelper::float2cpfloat((rotation + _rotationOffset) * (M_PI / 180.0f))); + _recordedRotation = rotation; + _recordedAngle = - (rotation + _rotationOffset) * (M_PI / 180.0); + cpBodySetAngle(_cpBody, _recordedAngle); } void PhysicsBody::setScale(float scaleX, float scaleY) @@ -349,15 +353,21 @@ void PhysicsBody::setScale(float scaleX, float scaleY) } } -Vec2 PhysicsBody::getPosition() const +const Vec2& PhysicsBody::getPosition() { - cpVect vec = cpBodyGetPos(_cpBody); - return PhysicsHelper::cpv2point(vec) - _positionOffset; + _latestPosition.x = _cpBody->p.x - _positionOffset.x; + _latestPosition.y = _cpBody->p.y - _positionOffset.y; + + return _latestPosition; } -float PhysicsBody::getRotation() const +float PhysicsBody::getRotation() { - return -PhysicsHelper::cpfloat2float(cpBodyGetAngle(_cpBody) * (180.0f / M_PI)) - _rotationOffset; + if (_recordedAngle != cpBodyGetAngle(_cpBody)) { + _recordedAngle = cpBodyGetAngle(_cpBody); + _recordedRotation = - _recordedAngle * 180.0 / M_PI - _rotationOffset; + } + return _recordedRotation; } PhysicsShape* PhysicsBody::addShape(PhysicsShape* shape, bool addMassAndMoment/* = true*/) @@ -842,11 +852,6 @@ void PhysicsBody::setPositionOffset(const Vec2& position) } } -Vec2 PhysicsBody::getPositionOffset() const -{ - return _positionOffset; -} - void PhysicsBody::setRotationOffset(float rotation) { if (std::abs(_rotationOffset - rotation) > 0.5f) @@ -857,11 +862,6 @@ void PhysicsBody::setRotationOffset(float rotation) } } -float PhysicsBody::getRotationOffset() const -{ - return _rotationOffset; -} - Vec2 PhysicsBody::world2Local(const Vec2& point) { return PhysicsHelper::cpv2point(cpBodyWorld2Local(_cpBody, PhysicsHelper::point2cpv(point))); diff --git a/cocos/physics/CCPhysicsBody.h b/cocos/physics/CCPhysicsBody.h index 20a53befc8..249770c5d8 100644 --- a/cocos/physics/CCPhysicsBody.h +++ b/cocos/physics/CCPhysicsBody.h @@ -189,18 +189,18 @@ public: int getGroup() const; /** get the body position. */ - Vec2 getPosition() const; + const Vec2& getPosition(); /** get the body rotation. */ - float getRotation() const; + float getRotation(); /** set body position offset, it's the position witch relative to node */ void setPositionOffset(const Vec2& position); /** get body position offset. */ - Vec2 getPositionOffset() const; + const Vec2& getPositionOffset() const { return _positionOffset; } /** set body rotation offset, it's the rotation witch relative to node */ void setRotationOffset(float rotation); /** set the body rotation offset */ - float getRotationOffset() const; + float getRotationOffset() const { return _rotationOffset; } /** * @brief test the body is dynamic or not. @@ -338,9 +338,12 @@ protected: float _angularDamping; int _tag; - Vec2 _recordPosition; + Vec2 _recordedPosition; + Vec2 _latestPosition; Vec2 _positionOffset; float _rotationOffset; + float _recordedRotation; + double _recordedAngle; friend class PhysicsWorld; friend class PhysicsShape; From 6b67f55ab57a83ae2821ae9a43290b0cb93bc5cc Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 8 Jan 2015 06:32:36 +0000 Subject: [PATCH 046/106] [AUTO]: updating luabinding automatically --- .../scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp index 82ecb8bc68..2946dfc79c 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_physics_auto.cpp @@ -3488,7 +3488,7 @@ int lua_cocos2dx_physics_PhysicsBody_getPositionOffset(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsBody_getPositionOffset'", nullptr); return 0; } - cocos2d::Vec2 ret = cobj->getPositionOffset(); + const cocos2d::Vec2& ret = cobj->getPositionOffset(); vec2_to_luaval(tolua_S, ret); return 1; } @@ -3678,7 +3678,7 @@ int lua_cocos2dx_physics_PhysicsBody_getPosition(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_physics_PhysicsBody_getPosition'", nullptr); return 0; } - cocos2d::Vec2 ret = cobj->getPosition(); + const cocos2d::Vec2& ret = cobj->getPosition(); vec2_to_luaval(tolua_S, ret); return 1; } From 71820e6db1b2969670e2b47a0f510fc1686c9645 Mon Sep 17 00:00:00 2001 From: songmiao Date: Thu, 8 Jan 2015 15:16:47 +0800 Subject: [PATCH 047/106] add notes, deal with opengl shader in windows device, fix bug --- .../Classes/Camera3DTest/Camera3DTest.cpp | 38 +++++-------------- .../Classes/Camera3DTest/Camera3DTest.h | 20 +++++----- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index 800fb891c1..7f7392a5d8 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -974,7 +974,7 @@ CameraArcBallDemo::CameraArcBallDemo(void) ,_drawGrid(nullptr) ,_sprite3D1(nullptr) ,_sprite3D2(nullptr) -,_fRadius(1.0f) +,_radius(1.0f) ,_distanceZ(50.0f) ,_operate(OperateCamType::RotateCamera) ,_center(Vec3(0,0,0)) @@ -1100,7 +1100,7 @@ void CameraArcBallDemo::onTouchsMoved( const std::vector &touchs, Event { if (!touchs.empty()) { - if(_operate == OperateCamType::RotateCamera) + if(_operate == OperateCamType::RotateCamera) //arc ball rotate { Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 prelocation = touchs[0]->getPreviousLocationInView(); @@ -1112,13 +1112,13 @@ void CameraArcBallDemo::onTouchsMoved( const std::vector &touchs, Event Vec3 axes; float angle; - calculateArcBall(axes, angle, prelocation.x, prelocation.y, location.x, location.y); - Quaternion quat(axes, angle); + calculateArcBall(axes, angle, prelocation.x, prelocation.y, location.x, location.y); //calculate rotation quaternion parameters + Quaternion quat(axes, angle); //get rotation quaternion _rotationQuat = quat * _rotationQuat; - updateCameraTransform(); + updateCameraTransform(); //update camera Transform } - else if(_operate == OperateCamType::MoveCamera) + else if(_operate == OperateCamType::MoveCamera) //camera zoom { Point newPos = touchs[0]->getPreviousLocation() - touchs[0]->getLocation(); _distanceZ -= newPos.y*0.1f; @@ -1137,13 +1137,13 @@ void CameraArcBallDemo::calculateArcBall( cocos2d::Vec3 & axis, float & angle, f Vec3 sv = rotation_matrix * Vec3(1.0f,0.0f,0.0f); Vec3 lv = rotation_matrix * Vec3(0.0f,0.0f,-1.0f); - Vec3 p1 = sv * p1x + uv * p1y - lv * projectToSphere(_fRadius, p1x, p1y); - Vec3 p2 = sv * p2x + uv * p2y - lv * projectToSphere(_fRadius, p2x, p2y); + Vec3 p1 = sv * p1x + uv * p1y - lv * projectToSphere(_radius, p1x, p1y); + Vec3 p2 = sv * p2x + uv * p2y - lv * projectToSphere(_radius, p2x, p2y); Vec3::cross(p2, p1, &axis); axis.normalize(); - float t = (p2 - p1).length() / (2.0 * _fRadius); + float t = (p2 - p1).length() / (2.0 * _radius); if (t > 1.0) t = 1.0; if (t < -1.0) t = -1.0; @@ -1262,9 +1262,7 @@ void FogTestDemo::onEnter() auto s = Director::getInstance()->getWinSize(); auto listener = EventListenerTouchAllAtOnce::create(); - listener->onTouchesBegan = CC_CALLBACK_2(FogTestDemo::onTouchesBegan, this); listener->onTouchesMoved = CC_CALLBACK_2(FogTestDemo::onTouchesMoved, this); - listener->onTouchesEnded = CC_CALLBACK_2(FogTestDemo::onTouchesEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); // swich fog type @@ -1401,15 +1399,6 @@ void FogTestDemo::update(float dt) { } -void FogTestDemo::onTouchesBegan(const std::vector& touches, cocos2d::Event *event) -{ - for ( auto &item: touches ) - { - auto touch = item; - auto location = touch->getLocation(); - } -} - void FogTestDemo::onTouchesMoved(const std::vector& touches, cocos2d::Event *event) { if(touches.size()==1) @@ -1435,15 +1424,6 @@ void FogTestDemo::onTouchesMoved(const std::vector& touches, cocos2d::Ev } } -void FogTestDemo::onTouchesEnded(const std::vector& touches, cocos2d::Event *event) -{ - for ( auto &item: touches ) - { - auto touch = item; - auto location = touch->getLocationInView(); - } -} - void Camera3DTestScene::runThisTest() { auto layer = nextSpriteTestAction(); diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h index 09d29633e2..6700782a1e 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h @@ -178,20 +178,20 @@ public: void switchTargetCallback(Ref* sender); void onTouchsMoved(const std::vector &touchs, cocos2d::Event *event); void updateCameraTransform(); - void calculateArcBall( cocos2d::Vec3 & axis, float & angle, float p1x, float p1y, float p2x, float p2y ); - float projectToSphere( float r, float x, float y ); + void calculateArcBall( cocos2d::Vec3 & axis, float & angle, float p1x, float p1y, float p2x, float p2y );//calculate rotation quaternion parameters + float projectToSphere( float r, float x, float y );//points on the screen project to arc ball protected: Layer* _layer3D; CameraType _cameraType; Camera* _camera; DrawNode3D* _drawGrid; - Quaternion _rotationQuat; - float _fRadius; + Quaternion _rotationQuat; //rotation Quaternion + float _radius; //arc ball radius float _distanceZ; - OperateCamType _operate; - Vec3 _center; - int _target; + OperateCamType _operate; //switch rotate or zoom + Vec3 _center; //camera look target + int _target; //switch camera look target Sprite3D* _sprite3D1; Sprite3D* _sprite3D2; }; @@ -215,9 +215,7 @@ public: // overrides virtual std::string title() const override; - void onTouchesBegan(const std::vector& touches, cocos2d::Event *event); void onTouchesMoved(const std::vector& touches, cocos2d::Event *event); - void onTouchesEnded(const std::vector& touches, cocos2d::Event *event); void switchTypeCallback(Ref* sender,int type); @@ -229,6 +227,10 @@ protected: Sprite3D* _sprite3D2; GLProgram* _shader; GLProgramState* _state; + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + EventListenerCustom* _backToForegroundListener; +#endif }; class Camera3DTestScene : public TestScene From 83cf479cb480b056614178b5c0efaf2de4a95f52 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Thu, 8 Jan 2015 16:57:03 +0800 Subject: [PATCH 048/106] Fixed typo --- tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp index f302c824d0..232f355db5 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp @@ -1838,7 +1838,7 @@ std::string LabelIssue8492Test::subtitle() const LabelMultilineWithOutline::LabelMultilineWithOutline() { - auto label = Label::createWithTTF("Multiline txet\nwith\noutline feature", "fonts/arial.ttf", 24); + auto label = Label::createWithTTF("Multi-line text\nwith\noutline feature", "fonts/arial.ttf", 24); label->enableOutline(Color4B::ORANGE,1); label->setPosition(VisibleRect::center()); addChild(label); From e4d560b6584fe1dfdce34412dd7e14dec1c0fa26 Mon Sep 17 00:00:00 2001 From: Jun Hiroe Date: Thu, 8 Jan 2015 11:22:45 +0900 Subject: [PATCH 049/106] Replace tabs with spaces in cocos/2d dir --- cocos/2d/CCActionCamera.cpp | 10 +- cocos/2d/CCActionCatmullRom.cpp | 76 ++- cocos/2d/CCActionEase.cpp | 736 ++++++++++++++--------------- cocos/2d/CCActionGrid.cpp | 44 +- cocos/2d/CCActionGrid3D.cpp | 81 ++-- cocos/2d/CCActionInstant.cpp | 120 ++--- cocos/2d/CCActionInterval.cpp | 304 ++++++------ cocos/2d/CCActionPageTurn3D.cpp | 10 +- cocos/2d/CCActionProgressTimer.cpp | 23 +- cocos/2d/CCActionTiledGrid.cpp | 108 ++--- cocos/2d/CCActionTween.cpp | 10 +- cocos/2d/CCAnimation.cpp | 20 +- cocos/2d/CCAtlasNode.cpp | 18 +- cocos/2d/CCComponent.cpp | 2 +- cocos/2d/CCDrawNode.cpp | 124 ++--- cocos/2d/CCDrawingPrimitives.cpp | 4 +- cocos/2d/CCFont.cpp | 2 - cocos/2d/CCFontFNT.cpp | 107 +++-- cocos/2d/CCLabelAtlas.cpp | 2 +- cocos/2d/CCLayer.cpp | 2 +- cocos/2d/CCMenuItem.cpp | 56 +-- cocos/2d/CCMotionStreak.cpp | 1 - cocos/2d/CCNode.cpp | 32 +- cocos/2d/CCParticleSystem.cpp | 1 - cocos/2d/CCRenderTexture.cpp | 4 +- cocos/2d/CCSprite.cpp | 10 +- cocos/2d/CCSpriteBatchNode.cpp | 22 +- cocos/2d/CCSpriteFrame.cpp | 1 - cocos/2d/CCSpriteFrameCache.cpp | 1 - cocos/2d/CCTMXLayer.cpp | 7 +- cocos/2d/CCTMXTiledMap.cpp | 1 - cocos/2d/CCTMXXMLParser.cpp | 1 - cocos/2d/CCTransitionProgress.cpp | 1 - 33 files changed, 962 insertions(+), 979 deletions(-) diff --git a/cocos/2d/CCActionCamera.cpp b/cocos/2d/CCActionCamera.cpp index 2241bbec5b..33f2a720d5 100644 --- a/cocos/2d/CCActionCamera.cpp +++ b/cocos/2d/CCActionCamera.cpp @@ -159,11 +159,11 @@ OrbitCamera * OrbitCamera::create(float t, float radius, float deltaRadius, floa OrbitCamera* OrbitCamera::clone() const { - // no copy constructor - auto a = new (std::nothrow) OrbitCamera(); - a->initWithDuration(_duration, _radius, _deltaRadius, _angleZ, _deltaAngleZ, _angleX, _deltaAngleX); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) OrbitCamera(); + a->initWithDuration(_duration, _radius, _deltaRadius, _angleZ, _deltaAngleZ, _angleX, _deltaAngleX); + a->autorelease(); + return a; } bool OrbitCamera::initWithDuration(float t, float radius, float deltaRadius, float angleZ, float deltaAngleZ, float angleX, float deltaAngleX) diff --git a/cocos/2d/CCActionCatmullRom.cpp b/cocos/2d/CCActionCatmullRom.cpp index 42486072db..f936ccd047 100644 --- a/cocos/2d/CCActionCatmullRom.cpp +++ b/cocos/2d/CCActionCatmullRom.cpp @@ -138,7 +138,6 @@ Vec2 PointArray::getControlPointAtIndex(ssize_t index) void PointArray::replaceControlPoint(cocos2d::Vec2 &controlPoint, ssize_t index) { - Vec2 *temp = _controlPoints->at(index); temp->x = controlPoint.x; temp->y = controlPoint.y; @@ -201,9 +200,9 @@ Vec2 ccCardinalSplineAt(Vec2 &p0, Vec2 &p1, Vec2 &p2, Vec2 &p3, float tension, f float t2 = t * t; float t3 = t2 * t; - /* - * Formula: s(-ttt + 2tt - t)P1 + s(-ttt + tt)P2 + (2ttt - 3tt + 1)P2 + s(ttt - 2tt + t)P3 + (-2ttt + 3tt)P3 + s(ttt - tt)P4 - */ + /* + * Formula: s(-ttt + 2tt - t)P1 + s(-ttt + tt)P2 + (2ttt - 3tt + 1)P2 + s(ttt - 2tt + t)P3 + (-2ttt + 3tt)P3 + s(ttt - tt)P4 + */ float s = (1 - tension) / 2; float b1 = s * ((-t3 + (2 * t2)) - t); // s(-t3 + 2 t2 - t)P1 @@ -280,11 +279,11 @@ void CardinalSplineTo::startWithTarget(cocos2d::Node *target) CardinalSplineTo* CardinalSplineTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) CardinalSplineTo(); - a->initWithDuration(this->_duration, this->_points->clone(), this->_tension); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) CardinalSplineTo(); + a->initWithDuration(this->_duration, this->_points->clone(), this->_tension); + a->autorelease(); + return a; } void CardinalSplineTo::update(float time) @@ -292,10 +291,10 @@ void CardinalSplineTo::update(float time) ssize_t p; float lt; - // eg. - // p..p..p..p..p..p..p - // 1..2..3..4..5..6..7 - // want p to be 1, 2, 3, 4, 5, 6 + // eg. + // p..p..p..p..p..p..p + // 1..2..3..4..5..6..7 + // want p to be 1, 2, 3, 4, 5, 6 if (time == 1) { p = _points->count() - 1; @@ -307,7 +306,7 @@ void CardinalSplineTo::update(float time) lt = (time - _deltaT * (float)p) / _deltaT; } - // Interpolate + // Interpolate Vec2 pp0 = _points->getControlPointAtIndex(p-1); Vec2 pp1 = _points->getControlPointAtIndex(p+0); Vec2 pp2 = _points->getControlPointAtIndex(p+1); @@ -377,9 +376,9 @@ CardinalSplineBy* CardinalSplineBy::reverse() const { PointArray *copyConfig = _points->clone(); - // - // convert "absolutes" to "diffs" - // + // + // convert "absolutes" to "diffs" + // Vec2 p = copyConfig->getControlPointAtIndex(0); for (ssize_t i = 1; i < copyConfig->count(); ++i) { @@ -390,12 +389,11 @@ CardinalSplineBy* CardinalSplineBy::reverse() const p = current; } - - // convert to "diffs" to "reverse absolute" + // convert to "diffs" to "reverse absolute" PointArray *pReverse = copyConfig->reverse(); - // 1st element (which should be 0,0) should be here too + // 1st element (which should be 0,0) should be here too p = pReverse->getControlPointAtIndex(pReverse->count()-1); pReverse->removeControlPointAtIndex(pReverse->count()-1); @@ -424,11 +422,11 @@ void CardinalSplineBy::startWithTarget(cocos2d::Node *target) CardinalSplineBy* CardinalSplineBy::clone() const { - // no copy constructor - auto a = new (std::nothrow) CardinalSplineBy(); - a->initWithDuration(this->_duration, this->_points->clone(), this->_tension); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) CardinalSplineBy(); + a->initWithDuration(this->_duration, this->_points->clone(), this->_tension); + a->autorelease(); + return a; } /* CatmullRomTo @@ -464,11 +462,11 @@ bool CatmullRomTo::initWithDuration(float dt, cocos2d::PointArray *points) CatmullRomTo* CatmullRomTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) CatmullRomTo(); - a->initWithDuration(this->_duration, this->_points->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) CatmullRomTo(); + a->initWithDuration(this->_duration, this->_points->clone()); + a->autorelease(); + return a; } CatmullRomTo* CatmullRomTo::reverse() const @@ -511,20 +509,20 @@ bool CatmullRomBy::initWithDuration(float dt, cocos2d::PointArray *points) CatmullRomBy* CatmullRomBy::clone() const { - // no copy constructor - auto a = new (std::nothrow) CatmullRomBy(); - a->initWithDuration(this->_duration, this->_points->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) CatmullRomBy(); + a->initWithDuration(this->_duration, this->_points->clone()); + a->autorelease(); + return a; } CatmullRomBy* CatmullRomBy::reverse() const { PointArray *copyConfig = _points->clone(); - // - // convert "absolutes" to "diffs" - // + // + // convert "absolutes" to "diffs" + // Vec2 p = copyConfig->getControlPointAtIndex(0); for (ssize_t i = 1; i < copyConfig->count(); ++i) { @@ -535,7 +533,6 @@ CatmullRomBy* CatmullRomBy::reverse() const p = current; } - // convert to "diffs" to "reverse absolute" PointArray *reverse = copyConfig->reverse(); @@ -562,4 +559,3 @@ CatmullRomBy* CatmullRomBy::reverse() const } NS_CC_END; - diff --git a/cocos/2d/CCActionEase.cpp b/cocos/2d/CCActionEase.cpp index a158460fa2..6541d74da3 100644 --- a/cocos/2d/CCActionEase.cpp +++ b/cocos/2d/CCActionEase.cpp @@ -129,11 +129,11 @@ EaseIn* EaseIn::create(ActionInterval *action, float rate) EaseIn* EaseIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseIn(); - a->initWithAction(_inner->clone(), _rate); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseIn(); + a->initWithAction(_inner->clone(), _rate); + a->autorelease(); + return a; } void EaseIn::update(float time) @@ -169,11 +169,11 @@ EaseOut* EaseOut::create(ActionInterval *action, float rate) EaseOut* EaseOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseOut(); - a->initWithAction(_inner->clone(), _rate); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseOut(); + a->initWithAction(_inner->clone(), _rate); + a->autorelease(); + return a; } void EaseOut::update(float time) @@ -209,11 +209,11 @@ EaseInOut* EaseInOut::create(ActionInterval *action, float rate) EaseInOut* EaseInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseInOut(); - a->initWithAction(_inner->clone(), _rate); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseInOut(); + a->initWithAction(_inner->clone(), _rate); + a->autorelease(); + return a; } void EaseInOut::update(float time) @@ -250,11 +250,11 @@ EaseExponentialIn* EaseExponentialIn::create(ActionInterval* action) EaseExponentialIn* EaseExponentialIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseExponentialIn(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseExponentialIn(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseExponentialIn::update(float time) @@ -290,11 +290,11 @@ EaseExponentialOut* EaseExponentialOut::create(ActionInterval* action) EaseExponentialOut* EaseExponentialOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseExponentialOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseExponentialOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseExponentialOut::update(float time) @@ -331,11 +331,11 @@ EaseExponentialInOut* EaseExponentialInOut::create(ActionInterval *action) EaseExponentialInOut* EaseExponentialInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseExponentialInOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseExponentialInOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseExponentialInOut::update(float time) @@ -372,11 +372,11 @@ EaseSineIn* EaseSineIn::create(ActionInterval* action) EaseSineIn* EaseSineIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseSineIn(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseSineIn(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseSineIn::update(float time) @@ -413,11 +413,11 @@ EaseSineOut* EaseSineOut::create(ActionInterval* action) EaseSineOut* EaseSineOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseSineOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseSineOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseSineOut::update(float time) @@ -454,11 +454,11 @@ EaseSineInOut* EaseSineInOut::create(ActionInterval* action) EaseSineInOut* EaseSineInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseSineInOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseSineInOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseSineInOut::update(float time) @@ -515,11 +515,11 @@ EaseElasticIn* EaseElasticIn::create(ActionInterval *action, float period/* = 0. EaseElasticIn* EaseElasticIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseElasticIn(); - a->initWithAction(_inner->clone(), _period); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseElasticIn(); + a->initWithAction(_inner->clone(), _period); + a->autorelease(); + return a; } void EaseElasticIn::update(float time) @@ -561,11 +561,11 @@ EaseElasticOut* EaseElasticOut::create(ActionInterval *action, float period/* = EaseElasticOut* EaseElasticOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseElasticOut(); - a->initWithAction(_inner->clone(), _period); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseElasticOut(); + a->initWithAction(_inner->clone(), _period); + a->autorelease(); + return a; } void EaseElasticOut::update(float time) @@ -607,11 +607,11 @@ EaseElasticInOut* EaseElasticInOut::create(ActionInterval *action, float period/ EaseElasticInOut* EaseElasticInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseElasticInOut(); - a->initWithAction(_inner->clone(), _period); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseElasticInOut(); + a->initWithAction(_inner->clone(), _period); + a->autorelease(); + return a; } void EaseElasticInOut::update(float time) @@ -652,11 +652,11 @@ EaseBounceIn* EaseBounceIn::create(ActionInterval* action) EaseBounceIn* EaseBounceIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseBounceIn(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseBounceIn(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseBounceIn::update(float time) @@ -693,11 +693,11 @@ EaseBounceOut* EaseBounceOut::create(ActionInterval* action) EaseBounceOut* EaseBounceOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseBounceOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseBounceOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseBounceOut::update(float time) @@ -734,11 +734,11 @@ EaseBounceInOut* EaseBounceInOut::create(ActionInterval* action) EaseBounceInOut* EaseBounceInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseBounceInOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseBounceInOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseBounceInOut::update(float time) @@ -897,20 +897,20 @@ EaseBezierAction* EaseBezierAction::create(cocos2d::ActionInterval* action) void EaseBezierAction::setBezierParamer( float p0, float p1, float p2, float p3) { - _p0 = p0; - _p1 = p1; - _p2 = p2; - _p3 = p3; + _p0 = p0; + _p1 = p1; + _p2 = p2; + _p3 = p3; } EaseBezierAction* EaseBezierAction::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseBezierAction(); - a->initWithAction(_inner->clone()); - a->setBezierParamer(_p0,_p1,_p2,_p3); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseBezierAction(); + a->initWithAction(_inner->clone()); + a->setBezierParamer(_p0,_p1,_p2,_p3); + a->autorelease(); + return a; } void EaseBezierAction::update(float time) @@ -920,9 +920,9 @@ void EaseBezierAction::update(float time) EaseBezierAction* EaseBezierAction::reverse() const { - EaseBezierAction* reverseAction = EaseBezierAction::create(_inner->reverse()); - reverseAction->setBezierParamer(_p3,_p2,_p1,_p0); - return reverseAction; + EaseBezierAction* reverseAction = EaseBezierAction::create(_inner->reverse()); + reverseAction->setBezierParamer(_p3,_p2,_p1,_p0); + return reverseAction; } // @@ -931,29 +931,29 @@ EaseBezierAction* EaseBezierAction::reverse() const EaseQuadraticActionIn* EaseQuadraticActionIn::create(ActionInterval* action) { - EaseQuadraticActionIn *ret = new (std::nothrow) EaseQuadraticActionIn(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseQuadraticActionIn *ret = new (std::nothrow) EaseQuadraticActionIn(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseQuadraticActionIn* EaseQuadraticActionIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseQuadraticActionIn(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseQuadraticActionIn(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseQuadraticActionIn::update(float time) @@ -963,7 +963,7 @@ void EaseQuadraticActionIn::update(float time) EaseQuadraticActionIn* EaseQuadraticActionIn::reverse() const { - return EaseQuadraticActionIn::create(_inner->reverse()); + return EaseQuadraticActionIn::create(_inner->reverse()); } // @@ -972,39 +972,39 @@ EaseQuadraticActionIn* EaseQuadraticActionIn::reverse() const EaseQuadraticActionOut* EaseQuadraticActionOut::create(ActionInterval* action) { - EaseQuadraticActionOut *ret = new (std::nothrow) EaseQuadraticActionOut(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseQuadraticActionOut *ret = new (std::nothrow) EaseQuadraticActionOut(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseQuadraticActionOut* EaseQuadraticActionOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseQuadraticActionOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseQuadraticActionOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseQuadraticActionOut::update(float time) { - _inner->update(tweenfunc::quadraticOut(time)); + _inner->update(tweenfunc::quadraticOut(time)); } EaseQuadraticActionOut* EaseQuadraticActionOut::reverse() const { - return EaseQuadraticActionOut::create(_inner->reverse()); + return EaseQuadraticActionOut::create(_inner->reverse()); } // @@ -1013,39 +1013,39 @@ EaseQuadraticActionOut* EaseQuadraticActionOut::reverse() const EaseQuadraticActionInOut* EaseQuadraticActionInOut::create(ActionInterval* action) { - EaseQuadraticActionInOut *ret = new (std::nothrow) EaseQuadraticActionInOut(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseQuadraticActionInOut *ret = new (std::nothrow) EaseQuadraticActionInOut(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseQuadraticActionInOut* EaseQuadraticActionInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseQuadraticActionInOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseQuadraticActionInOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseQuadraticActionInOut::update(float time) { - _inner->update(tweenfunc::quadraticInOut(time)); + _inner->update(tweenfunc::quadraticInOut(time)); } EaseQuadraticActionInOut* EaseQuadraticActionInOut::reverse() const { - return EaseQuadraticActionInOut::create(_inner->reverse()); + return EaseQuadraticActionInOut::create(_inner->reverse()); } // @@ -1054,39 +1054,39 @@ EaseQuadraticActionInOut* EaseQuadraticActionInOut::reverse() const EaseQuarticActionIn* EaseQuarticActionIn::create(ActionInterval* action) { - EaseQuarticActionIn *ret = new (std::nothrow) EaseQuarticActionIn(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseQuarticActionIn *ret = new (std::nothrow) EaseQuarticActionIn(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseQuarticActionIn* EaseQuarticActionIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseQuarticActionIn(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseQuarticActionIn(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseQuarticActionIn::update(float time) { - _inner->update(tweenfunc::quartEaseIn(time)); + _inner->update(tweenfunc::quartEaseIn(time)); } EaseQuarticActionIn* EaseQuarticActionIn::reverse() const { - return EaseQuarticActionIn::create(_inner->reverse()); + return EaseQuarticActionIn::create(_inner->reverse()); } // @@ -1095,29 +1095,29 @@ EaseQuarticActionIn* EaseQuarticActionIn::reverse() const EaseQuarticActionOut* EaseQuarticActionOut::create(ActionInterval* action) { - EaseQuarticActionOut *ret = new (std::nothrow) EaseQuarticActionOut(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseQuarticActionOut *ret = new (std::nothrow) EaseQuarticActionOut(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseQuarticActionOut* EaseQuarticActionOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseQuarticActionOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseQuarticActionOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseQuarticActionOut::update(float time) @@ -1127,7 +1127,7 @@ void EaseQuarticActionOut::update(float time) EaseQuarticActionOut* EaseQuarticActionOut::reverse() const { - return EaseQuarticActionOut::create(_inner->reverse()); + return EaseQuarticActionOut::create(_inner->reverse()); } // @@ -1136,39 +1136,39 @@ EaseQuarticActionOut* EaseQuarticActionOut::reverse() const EaseQuarticActionInOut* EaseQuarticActionInOut::create(ActionInterval* action) { - EaseQuarticActionInOut *ret = new (std::nothrow) EaseQuarticActionInOut(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseQuarticActionInOut *ret = new (std::nothrow) EaseQuarticActionInOut(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseQuarticActionInOut* EaseQuarticActionInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseQuarticActionInOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseQuarticActionInOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseQuarticActionInOut::update(float time) { - _inner->update(tweenfunc::quartEaseInOut(time)); + _inner->update(tweenfunc::quartEaseInOut(time)); } EaseQuarticActionInOut* EaseQuarticActionInOut::reverse() const { - return EaseQuarticActionInOut::create(_inner->reverse()); + return EaseQuarticActionInOut::create(_inner->reverse()); } // @@ -1177,39 +1177,39 @@ EaseQuarticActionInOut* EaseQuarticActionInOut::reverse() const EaseQuinticActionIn* EaseQuinticActionIn::create(ActionInterval* action) { - EaseQuinticActionIn *ret = new (std::nothrow) EaseQuinticActionIn(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseQuinticActionIn *ret = new (std::nothrow) EaseQuinticActionIn(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseQuinticActionIn* EaseQuinticActionIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseQuinticActionIn(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseQuinticActionIn(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseQuinticActionIn::update(float time) { - _inner->update(tweenfunc::quintEaseIn(time)); + _inner->update(tweenfunc::quintEaseIn(time)); } EaseQuinticActionIn* EaseQuinticActionIn::reverse() const { - return EaseQuinticActionIn::create(_inner->reverse()); + return EaseQuinticActionIn::create(_inner->reverse()); } // @@ -1218,39 +1218,39 @@ EaseQuinticActionIn* EaseQuinticActionIn::reverse() const EaseQuinticActionOut* EaseQuinticActionOut::create(ActionInterval* action) { - EaseQuinticActionOut *ret = new (std::nothrow) EaseQuinticActionOut(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseQuinticActionOut *ret = new (std::nothrow) EaseQuinticActionOut(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseQuinticActionOut* EaseQuinticActionOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseQuinticActionOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseQuinticActionOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseQuinticActionOut::update(float time) { - _inner->update(tweenfunc::quintEaseOut(time)); + _inner->update(tweenfunc::quintEaseOut(time)); } EaseQuinticActionOut* EaseQuinticActionOut::reverse() const { - return EaseQuinticActionOut::create(_inner->reverse()); + return EaseQuinticActionOut::create(_inner->reverse()); } // @@ -1259,39 +1259,39 @@ EaseQuinticActionOut* EaseQuinticActionOut::reverse() const EaseQuinticActionInOut* EaseQuinticActionInOut::create(ActionInterval* action) { - EaseQuinticActionInOut *ret = new (std::nothrow) EaseQuinticActionInOut(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseQuinticActionInOut *ret = new (std::nothrow) EaseQuinticActionInOut(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseQuinticActionInOut* EaseQuinticActionInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseQuinticActionInOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseQuinticActionInOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseQuinticActionInOut::update(float time) { - _inner->update(tweenfunc::quintEaseInOut(time)); + _inner->update(tweenfunc::quintEaseInOut(time)); } EaseQuinticActionInOut* EaseQuinticActionInOut::reverse() const { - return EaseQuinticActionInOut::create(_inner->reverse()); + return EaseQuinticActionInOut::create(_inner->reverse()); } // @@ -1300,39 +1300,39 @@ EaseQuinticActionInOut* EaseQuinticActionInOut::reverse() const EaseCircleActionIn* EaseCircleActionIn::create(ActionInterval* action) { - EaseCircleActionIn *ret = new (std::nothrow) EaseCircleActionIn(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseCircleActionIn *ret = new (std::nothrow) EaseCircleActionIn(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseCircleActionIn* EaseCircleActionIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseCircleActionIn(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseCircleActionIn(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseCircleActionIn::update(float time) { - _inner->update(tweenfunc::circEaseIn(time)); + _inner->update(tweenfunc::circEaseIn(time)); } EaseCircleActionIn* EaseCircleActionIn::reverse() const { - return EaseCircleActionIn::create(_inner->reverse()); + return EaseCircleActionIn::create(_inner->reverse()); } // @@ -1341,39 +1341,39 @@ EaseCircleActionIn* EaseCircleActionIn::reverse() const EaseCircleActionOut* EaseCircleActionOut::create(ActionInterval* action) { - EaseCircleActionOut *ret = new (std::nothrow) EaseCircleActionOut(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseCircleActionOut *ret = new (std::nothrow) EaseCircleActionOut(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseCircleActionOut* EaseCircleActionOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseCircleActionOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseCircleActionOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseCircleActionOut::update(float time) { - _inner->update(tweenfunc::circEaseOut(time)); + _inner->update(tweenfunc::circEaseOut(time)); } EaseCircleActionOut* EaseCircleActionOut::reverse() const { - return EaseCircleActionOut::create(_inner->reverse()); + return EaseCircleActionOut::create(_inner->reverse()); } // @@ -1400,21 +1400,21 @@ EaseCircleActionInOut* EaseCircleActionInOut::create(ActionInterval* action) EaseCircleActionInOut* EaseCircleActionInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseCircleActionInOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseCircleActionInOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseCircleActionInOut::update(float time) { - _inner->update(tweenfunc::circEaseInOut(time)); + _inner->update(tweenfunc::circEaseInOut(time)); } EaseCircleActionInOut* EaseCircleActionInOut::reverse() const { - return EaseCircleActionInOut::create(_inner->reverse()); + return EaseCircleActionInOut::create(_inner->reverse()); } // @@ -1423,20 +1423,20 @@ EaseCircleActionInOut* EaseCircleActionInOut::reverse() const EaseCubicActionIn* EaseCubicActionIn::create(ActionInterval* action) { - EaseCubicActionIn *ret = new (std::nothrow) EaseCubicActionIn(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseCubicActionIn *ret = new (std::nothrow) EaseCubicActionIn(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseCubicActionIn* EaseCubicActionIn::clone() const @@ -1450,12 +1450,12 @@ EaseCubicActionIn* EaseCubicActionIn::clone() const void EaseCubicActionIn::update(float time) { - _inner->update(tweenfunc::cubicEaseIn(time)); + _inner->update(tweenfunc::cubicEaseIn(time)); } EaseCubicActionIn* EaseCubicActionIn::reverse() const { - return EaseCubicActionIn::create(_inner->reverse()); + return EaseCubicActionIn::create(_inner->reverse()); } // @@ -1464,39 +1464,39 @@ EaseCubicActionIn* EaseCubicActionIn::reverse() const EaseCubicActionOut* EaseCubicActionOut::create(ActionInterval* action) { - EaseCubicActionOut *ret = new (std::nothrow) EaseCubicActionOut(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseCubicActionOut *ret = new (std::nothrow) EaseCubicActionOut(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseCubicActionOut* EaseCubicActionOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseCubicActionOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseCubicActionOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseCubicActionOut::update(float time) { - _inner->update(tweenfunc::cubicEaseOut(time)); + _inner->update(tweenfunc::cubicEaseOut(time)); } EaseCubicActionOut* EaseCubicActionOut::reverse() const { - return EaseCubicActionOut::create(_inner->reverse()); + return EaseCubicActionOut::create(_inner->reverse()); } // @@ -1505,39 +1505,39 @@ EaseCubicActionOut* EaseCubicActionOut::reverse() const EaseCubicActionInOut* EaseCubicActionInOut::create(ActionInterval* action) { - EaseCubicActionInOut *ret = new (std::nothrow) EaseCubicActionInOut(); - if (ret) - { - if (ret->initWithAction(action)) - { - ret->autorelease(); - } - else - { - CC_SAFE_RELEASE_NULL(ret); - } - } + EaseCubicActionInOut *ret = new (std::nothrow) EaseCubicActionInOut(); + if (ret) + { + if (ret->initWithAction(action)) + { + ret->autorelease(); + } + else + { + CC_SAFE_RELEASE_NULL(ret); + } + } - return ret; + return ret; } EaseCubicActionInOut* EaseCubicActionInOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) EaseCubicActionInOut(); - a->initWithAction(_inner->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) EaseCubicActionInOut(); + a->initWithAction(_inner->clone()); + a->autorelease(); + return a; } void EaseCubicActionInOut::update(float time) { - _inner->update(tweenfunc::cubicEaseInOut(time)); + _inner->update(tweenfunc::cubicEaseInOut(time)); } EaseCubicActionInOut* EaseCubicActionInOut::reverse() const { - return EaseCubicActionInOut::create(_inner->reverse()); + return EaseCubicActionInOut::create(_inner->reverse()); } NS_CC_END diff --git a/cocos/2d/CCActionGrid.cpp b/cocos/2d/CCActionGrid.cpp index a8ea6bd53c..0c42ef8cfb 100644 --- a/cocos/2d/CCActionGrid.cpp +++ b/cocos/2d/CCActionGrid.cpp @@ -87,7 +87,7 @@ void GridAction::cacheTargetAsGridNode() GridAction* GridAction::reverse() const { // FIXME: This conversion isn't safe. - return (GridAction*)ReverseTime::create( this->clone() ); + return (GridAction*)ReverseTime::create( this->clone() ); } GridBase* GridAction::getGrid() @@ -184,11 +184,11 @@ bool AccelDeccelAmplitude::initWithAction(Action *action, float duration) AccelDeccelAmplitude* AccelDeccelAmplitude::clone() const { - // no copy constructor - auto a = new (std::nothrow) AccelDeccelAmplitude(); - a->initWithAction(_other->clone(), _rate); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) AccelDeccelAmplitude(); + a->initWithAction(_other->clone(), _rate); + a->autorelease(); + return a; } AccelDeccelAmplitude::~AccelDeccelAmplitude() @@ -256,11 +256,11 @@ bool AccelAmplitude::initWithAction(Action *action, float duration) AccelAmplitude* AccelAmplitude::clone() const { - // no copy constructor - auto a = new (std::nothrow) AccelAmplitude(); - a->initWithAction(_other->clone(), _duration); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) AccelAmplitude(); + a->initWithAction(_other->clone(), _duration); + a->autorelease(); + return a; } AccelAmplitude::~AccelAmplitude() @@ -338,11 +338,11 @@ void DeccelAmplitude::update(float time) DeccelAmplitude* DeccelAmplitude::clone() const { - // no copy constructor - auto a = new (std::nothrow) DeccelAmplitude(); - a->initWithAction(_other->clone(), _duration); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) DeccelAmplitude(); + a->initWithAction(_other->clone(), _duration); + a->autorelease(); + return a; } DeccelAmplitude* DeccelAmplitude::reverse() const @@ -379,13 +379,13 @@ StopGrid* StopGrid::create() StopGrid* StopGrid::clone() const { - return StopGrid::create(); + return StopGrid::create(); } StopGrid* StopGrid::reverse() const { - // no reverse, just clone it - return this->clone(); + // no reverse, just clone it + return this->clone(); } // implementation of ReuseGrid @@ -434,13 +434,13 @@ void ReuseGrid::cacheTargetAsGridNode() ReuseGrid* ReuseGrid::clone() const { - return ReuseGrid::create(_times); + return ReuseGrid::create(_times); } ReuseGrid* ReuseGrid::reverse() const { - // no reverse, just clone it - return this->clone(); + // no reverse, just clone it + return this->clone(); } NS_CC_END diff --git a/cocos/2d/CCActionGrid3D.cpp b/cocos/2d/CCActionGrid3D.cpp index b1918096e4..90b94b8656 100644 --- a/cocos/2d/CCActionGrid3D.cpp +++ b/cocos/2d/CCActionGrid3D.cpp @@ -64,11 +64,11 @@ bool Waves3D::initWithDuration(float duration, const Size& gridSize, unsigned in Waves3D* Waves3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) Waves3D(); + // no copy constructor + auto a = new (std::nothrow) Waves3D(); a->initWithDuration(_duration, _gridSize, _waves, _amplitude); - a->autorelease(); - return a; + a->autorelease(); + return a; } void Waves3D::update(float time) @@ -127,11 +127,11 @@ bool FlipX3D::initWithSize(const Size& gridSize, float duration) FlipX3D* FlipX3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) FlipX3D(); + // no copy constructor + auto a = new (std::nothrow) FlipX3D(); a->initWithSize(_gridSize, _duration); - a->autorelease(); - return a; + a->autorelease(); + return a; } void FlipX3D::update(float time) @@ -203,10 +203,10 @@ void FlipX3D::update(float time) FlipY3D* FlipY3D::clone() const { // no copy constructor - auto a = new (std::nothrow) FlipY3D(); + auto a = new (std::nothrow) FlipY3D(); a->initWithSize(_gridSize, _duration); - a->autorelease(); - return a; + a->autorelease(); + return a; } FlipY3D* FlipY3D::create(float duration) @@ -333,11 +333,11 @@ bool Lens3D::initWithDuration(float duration, const Size& gridSize, const Vec2& Lens3D* Lens3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) Lens3D(); - a->initWithDuration(_duration, _gridSize, _position, _radius); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Lens3D(); + a->initWithDuration(_duration, _gridSize, _position, _radius); + a->autorelease(); + return a; } void Lens3D::setPosition(const Vec2& pos) @@ -437,11 +437,11 @@ void Ripple3D::setPosition(const Vec2& position) Ripple3D* Ripple3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) Ripple3D(); - a->initWithDuration(_duration, _gridSize, _position, _radius, _waves, _amplitude); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Ripple3D(); + a->initWithDuration(_duration, _gridSize, _position, _radius, _waves, _amplitude); + a->autorelease(); + return a; } void Ripple3D::update(float time) @@ -504,11 +504,11 @@ bool Shaky3D::initWithDuration(float duration, const Size& gridSize, int range, Shaky3D* Shaky3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) Shaky3D(); + // no copy constructor + auto a = new (std::nothrow) Shaky3D(); a->initWithDuration(_duration, _gridSize, _randrange, _shakeZ); - a->autorelease(); - return a; + a->autorelease(); + return a; } void Shaky3D::update(float time) @@ -570,11 +570,11 @@ bool Liquid::initWithDuration(float duration, const Size& gridSize, unsigned int Liquid* Liquid::clone() const { - // no copy constructor - auto a = new (std::nothrow) Liquid(); - a->initWithDuration(_duration, _gridSize, _waves, _amplitude); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Liquid(); + a->initWithDuration(_duration, _gridSize, _waves, _amplitude); + a->autorelease(); + return a; } void Liquid::update(float time) @@ -632,11 +632,11 @@ bool Waves::initWithDuration(float duration, const Size& gridSize, unsigned int Waves* Waves::clone() const { - // no copy constructor - auto a = new (std::nothrow) Waves(); - a->initWithDuration(_duration, _gridSize, _waves, _amplitude, _horizontal, _vertical); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Waves(); + a->initWithDuration(_duration, _gridSize, _waves, _amplitude, _horizontal, _vertical); + a->autorelease(); + return a; } void Waves::update(float time) @@ -707,11 +707,11 @@ void Twirl::setPosition(const Vec2& position) Twirl *Twirl::clone() const { - // no copy constructor - auto a = new (std::nothrow) Twirl(); - a->initWithDuration(_duration, _gridSize, _position, _twirls, _amplitude); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Twirl(); + a->initWithDuration(_duration, _gridSize, _position, _twirls, _amplitude); + a->autorelease(); + return a; } void Twirl::update(float time) @@ -744,4 +744,3 @@ void Twirl::update(float time) } NS_CC_END - diff --git a/cocos/2d/CCActionInstant.cpp b/cocos/2d/CCActionInstant.cpp index c5e0035808..7bcc16dc22 100644 --- a/cocos/2d/CCActionInstant.cpp +++ b/cocos/2d/CCActionInstant.cpp @@ -82,10 +82,10 @@ ActionInstant* Show::reverse() const Show * Show::clone() const { - // no copy constructor - auto a = new (std::nothrow) Show(); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Show(); + a->autorelease(); + return a; } // @@ -114,10 +114,10 @@ ActionInstant *Hide::reverse() const Hide * Hide::clone() const { - // no copy constructor - auto a = new (std::nothrow) Hide(); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Hide(); + a->autorelease(); + return a; } // @@ -143,15 +143,15 @@ void ToggleVisibility::update(float time) ToggleVisibility * ToggleVisibility::reverse() const { - return ToggleVisibility::create(); + return ToggleVisibility::create(); } ToggleVisibility * ToggleVisibility::clone() const { - // no copy constructor - auto a = new (std::nothrow) ToggleVisibility(); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) ToggleVisibility(); + a->autorelease(); + return a; } // @@ -159,37 +159,37 @@ ToggleVisibility * ToggleVisibility::clone() const // RemoveSelf * RemoveSelf::create(bool isNeedCleanUp /*= true*/) { - RemoveSelf *ret = new (std::nothrow) RemoveSelf(); + RemoveSelf *ret = new (std::nothrow) RemoveSelf(); - if (ret && ret->init(isNeedCleanUp)) { - ret->autorelease(); - } + if (ret && ret->init(isNeedCleanUp)) { + ret->autorelease(); + } - return ret; + return ret; } bool RemoveSelf::init(bool isNeedCleanUp) { - _isNeedCleanUp = isNeedCleanUp; - return true; + _isNeedCleanUp = isNeedCleanUp; + return true; } void RemoveSelf::update(float time) { - CC_UNUSED_PARAM(time); - _target->removeFromParentAndCleanup(_isNeedCleanUp); + CC_UNUSED_PARAM(time); + _target->removeFromParentAndCleanup(_isNeedCleanUp); } RemoveSelf *RemoveSelf::reverse() const { - return RemoveSelf::create(_isNeedCleanUp); + return RemoveSelf::create(_isNeedCleanUp); } RemoveSelf * RemoveSelf::clone() const { - // no copy constructor - auto a = new (std::nothrow) RemoveSelf(); - a->init(_isNeedCleanUp); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) RemoveSelf(); + a->init(_isNeedCleanUp); + a->autorelease(); + return a; } // @@ -226,11 +226,11 @@ FlipX* FlipX::reverse() const FlipX * FlipX::clone() const { - // no copy constructor - auto a = new (std::nothrow) FlipX(); - a->initWithFlipX(_flipX); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) FlipX(); + a->initWithFlipX(_flipX); + a->autorelease(); + return a; } // // FlipY @@ -266,11 +266,11 @@ FlipY* FlipY::reverse() const FlipY * FlipY::clone() const { - // no copy constructor - auto a = new (std::nothrow) FlipY(); - a->initWithFlipY(_flipY); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) FlipY(); + a->initWithFlipY(_flipY); + a->autorelease(); + return a; } // @@ -297,17 +297,17 @@ bool Place::initWithPosition(const Vec2& pos) { Place * Place::clone() const { - // no copy constructor - auto a = new (std::nothrow) Place(); - a->initWithPosition(_position); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Place(); + a->initWithPosition(_position); + a->autorelease(); + return a; } Place * Place::reverse() const { - // no reverse, just clone - return this->clone(); + // no reverse, just clone + return this->clone(); } void Place::update(float time) { @@ -348,7 +348,7 @@ CallFunc * CallFunc::create(Ref* selectorTarget, SEL_CallFunc selector) bool CallFunc::initWithFunction(const std::function &func) { - _function = func; + _function = func; return true; } @@ -390,8 +390,8 @@ CallFunc * CallFunc::clone() const CallFunc * CallFunc::reverse() const { - // no reverse here, just return a clone - return this->clone(); + // no reverse here, just return a clone + return this->clone(); } void CallFunc::update(float time) { @@ -466,8 +466,8 @@ bool CallFuncN::initWithTarget(Ref* selectorTarget, SEL_CallFuncN selector) CallFuncN * CallFuncN::clone() const { - // no copy constructor - auto a = new (std::nothrow) CallFuncN(); + // no copy constructor + auto a = new (std::nothrow) CallFuncN(); if( _selectorTarget) { a->initWithTarget(_selectorTarget, _callFuncN); @@ -476,8 +476,8 @@ CallFuncN * CallFuncN::clone() const a->initWithFunction(_functionN); } - a->autorelease(); - return a; + a->autorelease(); + return a; } // @@ -519,16 +519,16 @@ void __CCCallFuncND::execute() __CCCallFuncND * __CCCallFuncND::clone() const { - // no copy constructor - auto a = new __CCCallFuncND(); + // no copy constructor + auto a = new __CCCallFuncND(); if( _selectorTarget) { a->initWithTarget(_selectorTarget, _callFuncND, _data); } - a->autorelease(); - return a; + a->autorelease(); + return a; } // @@ -580,16 +580,16 @@ bool __CCCallFuncO::initWithTarget(Ref* selectorTarget, SEL_CallFuncO selector, __CCCallFuncO * __CCCallFuncO::clone() const { - // no copy constructor - auto a = new __CCCallFuncO(); + // no copy constructor + auto a = new __CCCallFuncO(); if( _selectorTarget) { a->initWithTarget(_selectorTarget, _callFuncO, _object); } - a->autorelease(); - return a; + a->autorelease(); + return a; } Ref* __CCCallFuncO::getObject() const diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index 4a03d8064c..e3ea8b8a3c 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -62,10 +62,10 @@ ExtraAction* ExtraAction::create() } ExtraAction* ExtraAction::clone() const { - // no copy constructor - auto a = new (std::nothrow) ExtraAction(); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) ExtraAction(); + a->autorelease(); + return a; } ExtraAction* ExtraAction::reverse() const @@ -265,11 +265,11 @@ bool Sequence::initWithTwoActions(FiniteTimeAction *actionOne, FiniteTimeAction Sequence* Sequence::clone() const { - // no copy constructor - auto a = new (std::nothrow) Sequence(); + // no copy constructor + auto a = new (std::nothrow) Sequence(); a->initWithTwoActions(_actions[0]->clone(), _actions[1]->clone() ); - a->autorelease(); - return a; + a->autorelease(); + return a; } Sequence::~Sequence(void) @@ -333,15 +333,15 @@ void Sequence::update(float t) _actions[0]->stop(); } } - else if(found==0 && _last==1 ) - { - // Reverse mode ? - // FIXME: Bug. this case doesn't contemplate when _last==-1, found=0 and in "reverse mode" - // since it will require a hack to know if an action is on reverse mode or not. - // "step" should be overriden, and the "reverseMode" value propagated to inner Sequences. - _actions[1]->update(0); - _actions[1]->stop(); - } + else if(found==0 && _last==1 ) + { + // Reverse mode ? + // FIXME: Bug. this case doesn't contemplate when _last==-1, found=0 and in "reverse mode" + // since it will require a hack to know if an action is on reverse mode or not. + // "step" should be overriden, and the "reverseMode" value propagated to inner Sequences. + _actions[1]->update(0); + _actions[1]->stop(); + } // Last action found and it is done. if( found == _last && _actions[found]->isDone() ) { @@ -402,11 +402,11 @@ bool Repeat::initWithAction(FiniteTimeAction *action, unsigned int times) Repeat* Repeat::clone(void) const { - // no copy constructor - auto a = new (std::nothrow) Repeat(); - a->initWithAction( _innerAction->clone(), _times ); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Repeat(); + a->initWithAction( _innerAction->clone(), _times ); + a->autorelease(); + return a; } Repeat::~Repeat(void) @@ -512,11 +512,11 @@ bool RepeatForever::initWithAction(ActionInterval *action) RepeatForever *RepeatForever::clone() const { - // no copy constructor - auto a = new (std::nothrow) RepeatForever(); - a->initWithAction(_innerAction->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) RepeatForever(); + a->initWithAction(_innerAction->clone()); + a->autorelease(); + return a; } void RepeatForever::startWithTarget(Node* target) @@ -678,12 +678,12 @@ bool Spawn::initWithTwoActions(FiniteTimeAction *action1, FiniteTimeAction *acti Spawn* Spawn::clone(void) const { - // no copy constructor - auto a = new (std::nothrow) Spawn(); + // no copy constructor + auto a = new (std::nothrow) Spawn(); a->initWithTwoActions(_one->clone(), _two->clone()); - a->autorelease(); - return a; + a->autorelease(); + return a; } Spawn::~Spawn(void) @@ -787,14 +787,14 @@ bool RotateTo::initWithDuration(float duration, const Vec3& dstAngle3D) RotateTo* RotateTo::clone(void) const { - // no copy constructor - auto a = new (std::nothrow) RotateTo(); + // no copy constructor + auto a = new (std::nothrow) RotateTo(); if(_is3D) - a->initWithDuration(_duration, _dstAngle); + a->initWithDuration(_duration, _dstAngle); else a->initWithDuration(_duration, _dstAngle.x, _dstAngle.y); - a->autorelease(); - return a; + a->autorelease(); + return a; } void RotateTo::calculateAngles(float &startAngle, float &diffAngle, float dstAngle) @@ -872,8 +872,8 @@ void RotateTo::update(float time) RotateTo *RotateTo::reverse() const { - CCASSERT(false, "RotateTo doesn't support the 'reverse' method"); - return nullptr; + CCASSERT(false, "RotateTo doesn't support the 'reverse' method"); + return nullptr; } // @@ -950,14 +950,14 @@ bool RotateBy::initWithDuration(float duration, const Vec3& deltaAngle3D) RotateBy* RotateBy::clone() const { - // no copy constructor - auto a = new (std::nothrow) RotateBy(); + // no copy constructor + auto a = new (std::nothrow) RotateBy(); if(_is3D) a->initWithDuration(_duration, _deltaAngle); else a->initWithDuration(_duration, _deltaAngle.x, _deltaAngle.y); - a->autorelease(); - return a; + a->autorelease(); + return a; } void RotateBy::startWithTarget(Node *target) @@ -1073,11 +1073,11 @@ bool MoveBy::initWithDuration(float duration, const Vec3& deltaPosition) MoveBy* MoveBy::clone() const { - // no copy constructor - auto a = new (std::nothrow) MoveBy(); + // no copy constructor + auto a = new (std::nothrow) MoveBy(); a->initWithDuration(_duration, _positionDelta); - a->autorelease(); - return a; + a->autorelease(); + return a; } void MoveBy::startWithTarget(Node *target) @@ -1158,11 +1158,11 @@ bool MoveTo::initWithDuration(float duration, const Vec3& position) MoveTo* MoveTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) MoveTo(); + // no copy constructor + auto a = new (std::nothrow) MoveTo(); a->initWithDuration(_duration, _endPosition); - a->autorelease(); - return a; + a->autorelease(); + return a; } void MoveTo::startWithTarget(Node *target) @@ -1210,17 +1210,17 @@ bool SkewTo::initWithDuration(float t, float sx, float sy) SkewTo* SkewTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) SkewTo(); - a->initWithDuration(_duration, _endSkewX, _endSkewY); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) SkewTo(); + a->initWithDuration(_duration, _endSkewX, _endSkewY); + a->autorelease(); + return a; } SkewTo* SkewTo::reverse() const { - CCASSERT(false, "reverse() not supported in SkewTo"); - return nullptr; + CCASSERT(false, "reverse() not supported in SkewTo"); + return nullptr; } void SkewTo::startWithTarget(Node *target) @@ -1313,11 +1313,11 @@ SkewBy* SkewBy::create(float t, float sx, float sy) SkewBy * SkewBy::clone() const { - // no copy constructor - auto a = new (std::nothrow) SkewBy(); - a->initWithDuration(_duration, _skewX, _skewY); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) SkewBy(); + a->initWithDuration(_duration, _skewX, _skewY); + a->autorelease(); + return a; } bool SkewBy::initWithDuration(float t, float deltaSkewX, float deltaSkewY) @@ -1380,11 +1380,11 @@ bool JumpBy::initWithDuration(float duration, const Vec2& position, float height JumpBy* JumpBy::clone() const { - // no copy constructor - auto a = new (std::nothrow) JumpBy(); - a->initWithDuration(_duration, _delta, _height, _jumps); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) JumpBy(); + a->initWithDuration(_duration, _delta, _height, _jumps); + a->autorelease(); + return a; } void JumpBy::startWithTarget(Node *target) @@ -1456,17 +1456,17 @@ bool JumpTo::initWithDuration(float duration, const Vec2& position, float height JumpTo* JumpTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) JumpTo(); + // no copy constructor + auto a = new (std::nothrow) JumpTo(); a->initWithDuration(_duration, _delta, _height, _jumps); - a->autorelease(); - return a; + a->autorelease(); + return a; } JumpTo* JumpTo::reverse() const { - CCASSERT(false, "reverse() not supported in JumpTo"); - return nullptr; + CCASSERT(false, "reverse() not supported in JumpTo"); + return nullptr; } void JumpTo::startWithTarget(Node *target) @@ -1519,11 +1519,11 @@ void BezierBy::startWithTarget(Node *target) BezierBy* BezierBy::clone() const { - // no copy constructor - auto a = new (std::nothrow) BezierBy(); - a->initWithDuration(_duration, _config); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) BezierBy(); + a->initWithDuration(_duration, _config); + a->autorelease(); + return a; } void BezierBy::update(float time) @@ -1596,11 +1596,11 @@ bool BezierTo::initWithDuration(float t, const ccBezierConfig &c) BezierTo* BezierTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) BezierTo(); - a->initWithDuration(_duration, _toConfig); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) BezierTo(); + a->initWithDuration(_duration, _toConfig); + a->autorelease(); + return a; } void BezierTo::startWithTarget(Node *target) @@ -1613,8 +1613,8 @@ void BezierTo::startWithTarget(Node *target) BezierTo* BezierTo::reverse() const { - CCASSERT(false, "CCBezierTo doesn't support the 'reverse' method"); - return nullptr; + CCASSERT(false, "CCBezierTo doesn't support the 'reverse' method"); + return nullptr; } @@ -1692,17 +1692,17 @@ bool ScaleTo::initWithDuration(float duration, float sx, float sy, float sz) ScaleTo* ScaleTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) ScaleTo(); - a->initWithDuration(_duration, _endScaleX, _endScaleY, _endScaleZ); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) ScaleTo(); + a->initWithDuration(_duration, _endScaleX, _endScaleY, _endScaleZ); + a->autorelease(); + return a; } ScaleTo* ScaleTo::reverse() const { - CCASSERT(false, "reverse() not supported in ScaleTo"); - return nullptr; + CCASSERT(false, "reverse() not supported in ScaleTo"); + return nullptr; } @@ -1760,11 +1760,11 @@ ScaleBy* ScaleBy::create(float duration, float sx, float sy, float sz) ScaleBy* ScaleBy::clone() const { - // no copy constructor - auto a = new (std::nothrow) ScaleBy(); + // no copy constructor + auto a = new (std::nothrow) ScaleBy(); a->initWithDuration(_duration, _endScaleX, _endScaleY, _endScaleZ); - a->autorelease(); - return a; + a->autorelease(); + return a; } void ScaleBy::startWithTarget(Node *target) @@ -1820,11 +1820,11 @@ void Blink::startWithTarget(Node *target) Blink* Blink::clone(void) const { - // no copy constructor - auto a = new (std::nothrow) Blink(); - a->initWithDuration(_duration, _times); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Blink(); + a->initWithDuration(_duration, _times); + a->autorelease(); + return a; } void Blink::update(float time) @@ -1858,11 +1858,11 @@ FadeIn* FadeIn::create(float d) FadeIn* FadeIn::clone() const { - // no copy constructor - auto a = new (std::nothrow) FadeIn(); + // no copy constructor + auto a = new (std::nothrow) FadeIn(); a->initWithDuration(_duration,255.0f); - a->autorelease(); - return a; + a->autorelease(); + return a; } void FadeIn::setReverseAction(cocos2d::FadeTo *ac) @@ -1912,11 +1912,11 @@ FadeOut* FadeOut::create(float d) FadeOut* FadeOut::clone() const { - // no copy constructor - auto a = new (std::nothrow) FadeOut(); + // no copy constructor + auto a = new (std::nothrow) FadeOut(); a->initWithDuration(_duration,0.0f); - a->autorelease(); - return a; + a->autorelease(); + return a; } void FadeOut::startWithTarget(cocos2d::Node *target) @@ -1973,17 +1973,17 @@ bool FadeTo::initWithDuration(float duration, GLubyte opacity) FadeTo* FadeTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) FadeTo(); - a->initWithDuration(_duration, _toOpacity); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) FadeTo(); + a->initWithDuration(_duration, _toOpacity); + a->autorelease(); + return a; } FadeTo* FadeTo::reverse() const { - CCASSERT(false, "reverse() not supported in FadeTo"); - return nullptr; + CCASSERT(false, "reverse() not supported in FadeTo"); + return nullptr; } void FadeTo::startWithTarget(Node *target) @@ -2031,17 +2031,17 @@ bool TintTo::initWithDuration(float duration, GLubyte red, GLubyte green, GLubyt TintTo* TintTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) TintTo(); - a->initWithDuration(_duration, _to.r, _to.g, _to.b); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) TintTo(); + a->initWithDuration(_duration, _to.r, _to.g, _to.b); + a->autorelease(); + return a; } TintTo* TintTo::reverse() const { - CCASSERT(false, "reverse() not supported in TintTo"); - return nullptr; + CCASSERT(false, "reverse() not supported in TintTo"); + return nullptr; } void TintTo::startWithTarget(Node *target) @@ -2093,11 +2093,11 @@ bool TintBy::initWithDuration(float duration, GLshort deltaRed, GLshort deltaGre TintBy* TintBy::clone() const { - // no copy constructor - auto a = new (std::nothrow) TintBy(); - a->initWithDuration(_duration, (GLubyte)_deltaR, (GLubyte)_deltaG, (GLubyte)_deltaB); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) TintBy(); + a->initWithDuration(_duration, (GLubyte)_deltaR, (GLubyte)_deltaG, (GLubyte)_deltaB); + a->autorelease(); + return a; } void TintBy::startWithTarget(Node *target) @@ -2143,11 +2143,11 @@ DelayTime* DelayTime::create(float d) DelayTime* DelayTime::clone() const { - // no copy constructor - auto a = new (std::nothrow) DelayTime(); + // no copy constructor + auto a = new (std::nothrow) DelayTime(); a->initWithDuration(_duration); - a->autorelease(); - return a; + a->autorelease(); + return a; } void DelayTime::update(float time) @@ -2196,11 +2196,11 @@ bool ReverseTime::initWithAction(FiniteTimeAction *action) ReverseTime* ReverseTime::clone() const { - // no copy constructor - auto a = new (std::nothrow) ReverseTime(); - a->initWithAction( _other->clone() ); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) ReverseTime(); + a->initWithAction( _other->clone() ); + a->autorelease(); + return a; } ReverseTime::ReverseTime() : _other(nullptr) @@ -2313,11 +2313,11 @@ void Animate::setAnimation(cocos2d::Animation *animation) Animate* Animate::clone() const { - // no copy constructor - auto a = new (std::nothrow) Animate(); - a->initWithAnimation(_animation->clone()); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) Animate(); + a->initWithAnimation(_animation->clone()); + a->autorelease(); + return a; } void Animate::startWithTarget(Node *target) @@ -2458,21 +2458,21 @@ bool TargetedAction::initWithTarget(Node* target, FiniteTimeAction* action) TargetedAction* TargetedAction::clone() const { - // no copy constructor - auto a = new (std::nothrow) TargetedAction(); + // no copy constructor + auto a = new (std::nothrow) TargetedAction(); // win32 : use the _other's copy object. - a->initWithTarget(_forcedTarget, _action->clone()); - a->autorelease(); - return a; + a->initWithTarget(_forcedTarget, _action->clone()); + a->autorelease(); + return a; } TargetedAction* TargetedAction::reverse() const { - // just reverse the internal action - auto a = new (std::nothrow) TargetedAction(); - a->initWithTarget(_forcedTarget, _action->reverse()); - a->autorelease(); - return a; + // just reverse the internal action + auto a = new (std::nothrow) TargetedAction(); + a->initWithTarget(_forcedTarget, _action->reverse()); + a->autorelease(); + return a; } void TargetedAction::startWithTarget(Node *target) diff --git a/cocos/2d/CCActionPageTurn3D.cpp b/cocos/2d/CCActionPageTurn3D.cpp index 7799d8d9ec..ae5a75d2e2 100644 --- a/cocos/2d/CCActionPageTurn3D.cpp +++ b/cocos/2d/CCActionPageTurn3D.cpp @@ -49,11 +49,11 @@ PageTurn3D* PageTurn3D::create(float duration, const Size& gridSize) PageTurn3D *PageTurn3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) PageTurn3D(); - a->initWithDuration(_duration, _gridSize); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) PageTurn3D(); + a->initWithDuration(_duration, _gridSize); + a->autorelease(); + return a; } GridBase* PageTurn3D::getGrid() diff --git a/cocos/2d/CCActionProgressTimer.cpp b/cocos/2d/CCActionProgressTimer.cpp index b738084bb3..8467c21b1d 100644 --- a/cocos/2d/CCActionProgressTimer.cpp +++ b/cocos/2d/CCActionProgressTimer.cpp @@ -55,17 +55,17 @@ bool ProgressTo::initWithDuration(float duration, float percent) ProgressTo* ProgressTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) ProgressTo(); + // no copy constructor + auto a = new (std::nothrow) ProgressTo(); a->initWithDuration(_duration, _to); - a->autorelease(); - return a; + a->autorelease(); + return a; } ProgressTo* ProgressTo::reverse() const { - CCASSERT(false, "reverse() not supported in ProgressTo"); - return nullptr; + CCASSERT(false, "reverse() not supported in ProgressTo"); + return nullptr; } void ProgressTo::startWithTarget(Node *target) @@ -105,11 +105,11 @@ bool ProgressFromTo::initWithDuration(float duration, float fromPercentage, floa ProgressFromTo* ProgressFromTo::clone() const { - // no copy constructor - auto a = new (std::nothrow) ProgressFromTo(); - a->initWithDuration(_duration, _from, _to); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) ProgressFromTo(); + a->initWithDuration(_duration, _from, _to); + a->autorelease(); + return a; } @@ -129,4 +129,3 @@ void ProgressFromTo::update(float time) } NS_CC_END - diff --git a/cocos/2d/CCActionTiledGrid.cpp b/cocos/2d/CCActionTiledGrid.cpp index f06fef868c..182751e23d 100644 --- a/cocos/2d/CCActionTiledGrid.cpp +++ b/cocos/2d/CCActionTiledGrid.cpp @@ -74,11 +74,11 @@ bool ShakyTiles3D::initWithDuration(float duration, const Size& gridSize, int ra ShakyTiles3D* ShakyTiles3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) ShakyTiles3D(); + // no copy constructor + auto a = new (std::nothrow) ShakyTiles3D(); a->initWithDuration(_duration, _gridSize, _randrange, _shakeZ); - a->autorelease(); - return a; + a->autorelease(); + return a; } void ShakyTiles3D::update(float time) @@ -154,11 +154,11 @@ bool ShatteredTiles3D::initWithDuration(float duration, const Size& gridSize, in ShatteredTiles3D* ShatteredTiles3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) ShatteredTiles3D(); - a->initWithDuration(_duration, _gridSize, _randrange, _shatterZ); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) ShatteredTiles3D(); + a->initWithDuration(_duration, _gridSize, _randrange, _shatterZ); + a->autorelease(); + return a; } void ShatteredTiles3D::update(float time) @@ -239,11 +239,11 @@ bool ShuffleTiles::initWithDuration(float duration, const Size& gridSize, unsign ShuffleTiles* ShuffleTiles::clone() const { - // no copy constructor - auto a = new (std::nothrow) ShuffleTiles(); - a->initWithDuration(_duration, _gridSize, _seed); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) ShuffleTiles(); + a->initWithDuration(_duration, _gridSize, _seed); + a->autorelease(); + return a; } ShuffleTiles::~ShuffleTiles() @@ -371,11 +371,11 @@ FadeOutTRTiles* FadeOutTRTiles::create(float duration, const Size& gridSize) FadeOutTRTiles* FadeOutTRTiles::clone() const { - // no copy constructor - auto a = new (std::nothrow) FadeOutTRTiles(); - a->initWithDuration(_duration, _gridSize); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) FadeOutTRTiles(); + a->initWithDuration(_duration, _gridSize); + a->autorelease(); + return a; } float FadeOutTRTiles::testFunc(const Size& pos, float time) @@ -467,11 +467,11 @@ FadeOutBLTiles* FadeOutBLTiles::create(float duration, const Size& gridSize) FadeOutBLTiles* FadeOutBLTiles::clone() const { - // no copy constructor - auto a = new (std::nothrow) FadeOutBLTiles(); - a->initWithDuration(_duration, _gridSize); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) FadeOutBLTiles(); + a->initWithDuration(_duration, _gridSize); + a->autorelease(); + return a; } float FadeOutBLTiles::testFunc(const Size& pos, float time) @@ -508,11 +508,11 @@ FadeOutUpTiles* FadeOutUpTiles::create(float duration, const Size& gridSize) FadeOutUpTiles* FadeOutUpTiles::clone() const { - // no copy constructor - auto a = new (std::nothrow) FadeOutUpTiles(); - a->initWithDuration(_duration, _gridSize); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) FadeOutUpTiles(); + a->initWithDuration(_duration, _gridSize); + a->autorelease(); + return a; } float FadeOutUpTiles::testFunc(const Size& pos, float time) @@ -562,11 +562,11 @@ FadeOutDownTiles* FadeOutDownTiles::create(float duration, const Size& gridSize) FadeOutDownTiles* FadeOutDownTiles::clone() const { - // no copy constructor - auto a = new (std::nothrow) FadeOutDownTiles(); - a->initWithDuration(_duration, _gridSize); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) FadeOutDownTiles(); + a->initWithDuration(_duration, _gridSize); + a->autorelease(); + return a; } float FadeOutDownTiles::testFunc(const Size& pos, float time) @@ -630,11 +630,11 @@ bool TurnOffTiles::initWithDuration(float duration, const Size& gridSize, unsign TurnOffTiles* TurnOffTiles::clone() const { - // no copy constructor - auto a = new (std::nothrow) TurnOffTiles(); + // no copy constructor + auto a = new (std::nothrow) TurnOffTiles(); a->initWithDuration(_duration, _gridSize, _seed ); - a->autorelease(); - return a; + a->autorelease(); + return a; } TurnOffTiles::~TurnOffTiles(void) @@ -744,11 +744,11 @@ bool WavesTiles3D::initWithDuration(float duration, const Size& gridSize, unsign WavesTiles3D* WavesTiles3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) WavesTiles3D(); + // no copy constructor + auto a = new (std::nothrow) WavesTiles3D(); a->initWithDuration(_duration, _gridSize, _waves, _amplitude); - a->autorelease(); - return a; + a->autorelease(); + return a; } void WavesTiles3D::update(float time) @@ -807,11 +807,11 @@ bool JumpTiles3D::initWithDuration(float duration, const Size& gridSize, unsigne JumpTiles3D* JumpTiles3D::clone() const { - // no copy constructor - auto a = new (std::nothrow) JumpTiles3D(); + // no copy constructor + auto a = new (std::nothrow) JumpTiles3D(); a->initWithDuration(_duration, _gridSize, _jumps, _amplitude); - a->autorelease(); - return a; + a->autorelease(); + return a; } void JumpTiles3D::update(float time) @@ -875,11 +875,11 @@ bool SplitRows::initWithDuration(float duration, unsigned int rows) SplitRows* SplitRows::clone() const { - // no copy constructor - auto a = new (std::nothrow) SplitRows(); + // no copy constructor + auto a = new (std::nothrow) SplitRows(); a->initWithDuration(_duration, _rows); - a->autorelease(); - return a; + a->autorelease(); + return a; } void SplitRows::startWithTarget(Node *target) @@ -938,11 +938,11 @@ bool SplitCols::initWithDuration(float duration, unsigned int cols) SplitCols* SplitCols::clone() const { - // no copy constructor - auto a = new (std::nothrow) SplitCols(); + // no copy constructor + auto a = new (std::nothrow) SplitCols(); a->initWithDuration(_duration, _cols); - a->autorelease(); - return a; + a->autorelease(); + return a; } void SplitCols::startWithTarget(Node *target) diff --git a/cocos/2d/CCActionTween.cpp b/cocos/2d/CCActionTween.cpp index 19f6d29725..13d2603189 100644 --- a/cocos/2d/CCActionTween.cpp +++ b/cocos/2d/CCActionTween.cpp @@ -57,11 +57,11 @@ bool ActionTween::initWithDuration(float duration, const std::string& key, float ActionTween *ActionTween::clone() const { - // no copy constructor - auto a = new (std::nothrow) ActionTween(); - a->initWithDuration(_duration, _key.c_str(), _from, _to); - a->autorelease(); - return a; + // no copy constructor + auto a = new (std::nothrow) ActionTween(); + a->initWithDuration(_duration, _key.c_str(), _from, _to); + a->autorelease(); + return a; } void ActionTween::startWithTarget(Node *target) diff --git a/cocos/2d/CCAnimation.cpp b/cocos/2d/CCAnimation.cpp index ba84b43024..3d8631a4bd 100644 --- a/cocos/2d/CCAnimation.cpp +++ b/cocos/2d/CCAnimation.cpp @@ -70,14 +70,14 @@ AnimationFrame::~AnimationFrame() AnimationFrame* AnimationFrame::clone() const { - // no copy constructor - auto frame = new (std::nothrow) AnimationFrame(); + // no copy constructor + auto frame = new (std::nothrow) AnimationFrame(); frame->initWithSpriteFrame(_spriteFrame->clone(), - _delayUnits, - _userInfo); + _delayUnits, + _userInfo); - frame->autorelease(); - return frame; + frame->autorelease(); + return frame; } // implementation of Animation @@ -191,12 +191,12 @@ float Animation::getDuration(void) const Animation* Animation::clone() const { - // no copy constructor - auto a = new (std::nothrow) Animation(); + // no copy constructor + auto a = new (std::nothrow) Animation(); a->initWithAnimationFrames(_frames, _delayPerUnit, _loops); a->setRestoreOriginalFrame(_restoreOriginalFrame); - a->autorelease(); - return a; + a->autorelease(); + return a; } NS_CC_END diff --git a/cocos/2d/CCAtlasNode.cpp b/cocos/2d/CCAtlasNode.cpp index 77d2aadb8a..ad1e29129c 100644 --- a/cocos/2d/CCAtlasNode.cpp +++ b/cocos/2d/CCAtlasNode.cpp @@ -59,21 +59,21 @@ AtlasNode::~AtlasNode() AtlasNode * AtlasNode::create(const std::string& tile, int tileWidth, int tileHeight, int itemsToRender) { - AtlasNode * ret = new (std::nothrow) AtlasNode(); - if (ret->initWithTileFile(tile, tileWidth, tileHeight, itemsToRender)) - { - ret->autorelease(); - return ret; - } - CC_SAFE_DELETE(ret); - return nullptr; + AtlasNode * ret = new (std::nothrow) AtlasNode(); + if (ret->initWithTileFile(tile, tileWidth, tileHeight, itemsToRender)) + { + ret->autorelease(); + return ret; + } + CC_SAFE_DELETE(ret); + return nullptr; } bool AtlasNode::initWithTileFile(const std::string& tile, int tileWidth, int tileHeight, int itemsToRender) { CCASSERT(tile.size() > 0, "file size should not be empty"); Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(tile); - return initWithTexture(texture, tileWidth, tileHeight, itemsToRender); + return initWithTexture(texture, tileWidth, tileHeight, itemsToRender); } bool AtlasNode::initWithTexture(Texture2D* texture, int tileWidth, int tileHeight, int itemsToRender) diff --git a/cocos/2d/CCComponent.cpp b/cocos/2d/CCComponent.cpp index 34c0d19c01..2a252db2d0 100644 --- a/cocos/2d/CCComponent.cpp +++ b/cocos/2d/CCComponent.cpp @@ -118,7 +118,7 @@ Component* Component::create(void) { CC_SAFE_DELETE(ret); } - return ret; + return ret; } const std::string& Component::getName() const diff --git a/cocos/2d/CCDrawNode.cpp b/cocos/2d/CCDrawNode.cpp index e9d04b546d..56685de3b1 100644 --- a/cocos/2d/CCDrawNode.cpp +++ b/cocos/2d/CCDrawNode.cpp @@ -43,62 +43,62 @@ static Vec2 v2fzero(0.0f,0.0f); static inline Vec2 v2f(float x, float y) { Vec2 ret(x, y); - return ret; + return ret; } static inline Vec2 v2fadd(const Vec2 &v0, const Vec2 &v1) { - return v2f(v0.x+v1.x, v0.y+v1.y); + return v2f(v0.x+v1.x, v0.y+v1.y); } static inline Vec2 v2fsub(const Vec2 &v0, const Vec2 &v1) { - return v2f(v0.x-v1.x, v0.y-v1.y); + return v2f(v0.x-v1.x, v0.y-v1.y); } static inline Vec2 v2fmult(const Vec2 &v, float s) { - return v2f(v.x * s, v.y * s); + return v2f(v.x * s, v.y * s); } static inline Vec2 v2fperp(const Vec2 &p0) { - return v2f(-p0.y, p0.x); + return v2f(-p0.y, p0.x); } static inline Vec2 v2fneg(const Vec2 &p0) { - return v2f(-p0.x, - p0.y); + return v2f(-p0.x, - p0.y); } static inline float v2fdot(const Vec2 &p0, const Vec2 &p1) { - return p0.x * p1.x + p0.y * p1.y; + return p0.x * p1.x + p0.y * p1.y; } static inline Vec2 v2fforangle(float _a_) { - return v2f(cosf(_a_), sinf(_a_)); + return v2f(cosf(_a_), sinf(_a_)); } static inline Vec2 v2fnormalize(const Vec2 &p) { - Vec2 r = Vec2(p.x, p.y).getNormalized(); - return v2f(r.x, r.y); + Vec2 r = Vec2(p.x, p.y).getNormalized(); + return v2f(r.x, r.y); } static inline Vec2 __v2f(const Vec2 &v) { //#ifdef __LP64__ - return v2f(v.x, v.y); + return v2f(v.x, v.y); // #else -// return * ((Vec2*) &v); +// return * ((Vec2*) &v); // #endif } static inline Tex2F __t(const Vec2 &v) { - return *(Tex2F*)&v; + return *(Tex2F*)&v; } // implementation of DrawNode @@ -175,9 +175,9 @@ void DrawNode::ensureCapacity(int count) if(_bufferCount + count > _bufferCapacity) { - _bufferCapacity += MAX(_bufferCapacity, count); - _buffer = (V2F_C4B_T2F*)realloc(_buffer, _bufferCapacity*sizeof(V2F_C4B_T2F)); - } + _bufferCapacity += MAX(_bufferCapacity, count); + _buffer = (V2F_C4B_T2F*)realloc(_buffer, _bufferCapacity*sizeof(V2F_C4B_T2F)); + } } void DrawNode::ensureCapacityGLPoint(int count) @@ -646,21 +646,21 @@ void DrawNode::drawDot(const Vec2 &pos, float radius, const Color4F &color) { unsigned int vertex_count = 2*3; ensureCapacity(vertex_count); - - V2F_C4B_T2F a = {Vec2(pos.x - radius, pos.y - radius), Color4B(color), Tex2F(-1.0, -1.0) }; - V2F_C4B_T2F b = {Vec2(pos.x - radius, pos.y + radius), Color4B(color), Tex2F(-1.0, 1.0) }; - V2F_C4B_T2F c = {Vec2(pos.x + radius, pos.y + radius), Color4B(color), Tex2F( 1.0, 1.0) }; - V2F_C4B_T2F d = {Vec2(pos.x + radius, pos.y - radius), Color4B(color), Tex2F( 1.0, -1.0) }; - - V2F_C4B_T2F_Triangle *triangles = (V2F_C4B_T2F_Triangle *)(_buffer + _bufferCount); + + V2F_C4B_T2F a = {Vec2(pos.x - radius, pos.y - radius), Color4B(color), Tex2F(-1.0, -1.0) }; + V2F_C4B_T2F b = {Vec2(pos.x - radius, pos.y + radius), Color4B(color), Tex2F(-1.0, 1.0) }; + V2F_C4B_T2F c = {Vec2(pos.x + radius, pos.y + radius), Color4B(color), Tex2F( 1.0, 1.0) }; + V2F_C4B_T2F d = {Vec2(pos.x + radius, pos.y - radius), Color4B(color), Tex2F( 1.0, -1.0) }; + + V2F_C4B_T2F_Triangle *triangles = (V2F_C4B_T2F_Triangle *)(_buffer + _bufferCount); V2F_C4B_T2F_Triangle triangle0 = {a, b, c}; V2F_C4B_T2F_Triangle triangle1 = {a, c, d}; - triangles[0] = triangle0; - triangles[1] = triangle1; - - _bufferCount += vertex_count; - - _dirty = true; + triangles[0] = triangle0; + triangles[1] = triangle1; + + _bufferCount += vertex_count; + + _dirty = true; } void DrawNode::drawRect(const Vec2 &p1, const Vec2 &p2, const Vec2 &p3, const Vec2& p4, const Color4F &color) @@ -675,48 +675,48 @@ void DrawNode::drawSegment(const Vec2 &from, const Vec2 &to, float radius, const { unsigned int vertex_count = 6*3; ensureCapacity(vertex_count); - - Vec2 a = __v2f(from); - Vec2 b = __v2f(to); - - - Vec2 n = v2fnormalize(v2fperp(v2fsub(b, a))); - Vec2 t = v2fperp(n); - - Vec2 nw = v2fmult(n, radius); - Vec2 tw = v2fmult(t, radius); - Vec2 v0 = v2fsub(b, v2fadd(nw, tw)); - Vec2 v1 = v2fadd(b, v2fsub(nw, tw)); - Vec2 v2 = v2fsub(b, nw); - Vec2 v3 = v2fadd(b, nw); - Vec2 v4 = v2fsub(a, nw); - Vec2 v5 = v2fadd(a, nw); - Vec2 v6 = v2fsub(a, v2fsub(nw, tw)); - Vec2 v7 = v2fadd(a, v2fadd(nw, tw)); - - - V2F_C4B_T2F_Triangle *triangles = (V2F_C4B_T2F_Triangle *)(_buffer + _bufferCount); - + + Vec2 a = __v2f(from); + Vec2 b = __v2f(to); + + + Vec2 n = v2fnormalize(v2fperp(v2fsub(b, a))); + Vec2 t = v2fperp(n); + + Vec2 nw = v2fmult(n, radius); + Vec2 tw = v2fmult(t, radius); + Vec2 v0 = v2fsub(b, v2fadd(nw, tw)); + Vec2 v1 = v2fadd(b, v2fsub(nw, tw)); + Vec2 v2 = v2fsub(b, nw); + Vec2 v3 = v2fadd(b, nw); + Vec2 v4 = v2fsub(a, nw); + Vec2 v5 = v2fadd(a, nw); + Vec2 v6 = v2fsub(a, v2fsub(nw, tw)); + Vec2 v7 = v2fadd(a, v2fadd(nw, tw)); + + + V2F_C4B_T2F_Triangle *triangles = (V2F_C4B_T2F_Triangle *)(_buffer + _bufferCount); + V2F_C4B_T2F_Triangle triangles0 = { {v0, Color4B(color), __t(v2fneg(v2fadd(n, t)))}, {v1, Color4B(color), __t(v2fsub(n, t))}, {v2, Color4B(color), __t(v2fneg(n))}, }; - triangles[0] = triangles0; - + triangles[0] = triangles0; + V2F_C4B_T2F_Triangle triangles1 = { {v3, Color4B(color), __t(n)}, {v1, Color4B(color), __t(v2fsub(n, t))}, {v2, Color4B(color), __t(v2fneg(n))}, }; - triangles[1] = triangles1; - + triangles[1] = triangles1; + V2F_C4B_T2F_Triangle triangles2 = { {v3, Color4B(color), __t(n)}, {v4, Color4B(color), __t(v2fneg(n))}, {v2, Color4B(color), __t(v2fneg(n))}, }; - triangles[2] = triangles2; + triangles[2] = triangles2; V2F_C4B_T2F_Triangle triangles3 = { {v3, Color4B(color), __t(n)}, @@ -730,18 +730,18 @@ void DrawNode::drawSegment(const Vec2 &from, const Vec2 &to, float radius, const {v4, Color4B(color), __t(v2fneg(n)) }, {v5, Color4B(color), __t(n)}, }; - triangles[4] = triangles4; + triangles[4] = triangles4; V2F_C4B_T2F_Triangle triangles5 = { {v6, Color4B(color), __t(v2fsub(t, n))}, {v7, Color4B(color), __t(v2fadd(n, t))}, {v5, Color4B(color), __t(n)}, }; - triangles[5] = triangles5; - - _bufferCount += vertex_count; - - _dirty = true; + triangles[5] = triangles5; + + _bufferCount += vertex_count; + + _dirty = true; } void DrawNode::drawPolygon(const Vec2 *verts, int count, const Color4F &fillColor, float borderWidth, const Color4F &borderColor) diff --git a/cocos/2d/CCDrawingPrimitives.cpp b/cocos/2d/CCDrawingPrimitives.cpp index 6ba59709ad..9920e9ea8c 100644 --- a/cocos/2d/CCDrawingPrimitives.cpp +++ b/cocos/2d/CCDrawingPrimitives.cpp @@ -124,8 +124,8 @@ void init() void free() { - CC_SAFE_RELEASE_NULL(s_shader); - s_initialized = false; + CC_SAFE_RELEASE_NULL(s_shader); + s_initialized = false; } void drawPoint(const Vec2& point) diff --git a/cocos/2d/CCFont.cpp b/cocos/2d/CCFont.cpp index 11da370314..69616fd316 100644 --- a/cocos/2d/CCFont.cpp +++ b/cocos/2d/CCFont.cpp @@ -102,5 +102,3 @@ const char * Font::getCurrentGlyphCollection() const NS_CC_END - - diff --git a/cocos/2d/CCFontFNT.cpp b/cocos/2d/CCFontFNT.cpp index f53a81d679..ce41d0d825 100644 --- a/cocos/2d/CCFontFNT.cpp +++ b/cocos/2d/CCFontFNT.cpp @@ -85,17 +85,17 @@ typedef struct _BMFontPadding { typedef struct _FontDefHashElement { - unsigned int key; // key. Font Unicode value - BMFontDef fontDef; // font definition - UT_hash_handle hh; + unsigned int key; // key. Font Unicode value + BMFontDef fontDef; // font definition + UT_hash_handle hh; } tFontDefHashElement; // Equal function for targetSet. typedef struct _KerningHashElement { - int key; // key for the hash. 16-bit for 1st element, 16-bit for 2nd element - int amount; - UT_hash_handle hh; + int key; // key for the hash. 16-bit for 1st element, 16-bit for 2nd element + int amount; + UT_hash_handle hh; } tKerningHashElement; /** @brief BMFontConfiguration has parsed configuration of the the .fnt file @@ -147,7 +147,7 @@ public: std::set* getCharacterSet() const; private: std::set* parseConfigFile(const std::string& controlFile); - std::set* parseBinaryConfigFile(unsigned char* pData, unsigned long size, const std::string& controlFile); + std::set* parseBinaryConfigFile(unsigned char* pData, unsigned long size, const std::string& controlFile); void parseCharacterDefinition(std::string line, BMFontDef *characterDefinition); void parseInfoArguments(std::string line); void parseCommonArguments(std::string line); @@ -274,7 +274,7 @@ std::set* BMFontConfiguration::parseConfigFile(const std::string& { std::string fullpath = FileUtils::getInstance()->fullPathForFilename(controlFile); - Data data = FileUtils::getInstance()->getDataFromFile(fullpath); + Data data = FileUtils::getInstance()->getDataFromFile(fullpath); CCASSERT((!data.isNull() && data.getSize() > 0), "BMFontConfiguration::parseConfigFile | Open file error."); if (memcmp("BMF", data.getBytes(), 3) == 0) { @@ -369,28 +369,28 @@ std::set* BMFontConfiguration::parseBinaryConfigFile(unsigned char pData += 4; remains -= 4; while (remains > 0) - { + { unsigned char blockId = pData[0]; pData += 1; remains -= 1; uint32_t blockSize = 0; memcpy(&blockSize, pData, 4); pData += 4; remains -= 4; if (blockId == 1) - { + { /* - fontSize 2 int 0 - bitField 1 bits 2 bit 0: smooth, bit 1: unicode, bit 2: italic, bit 3: bold, bit 4: fixedHeigth, bits 5-7: reserved - charSet 1 uint 3 - stretchH 2 uint 4 - aa 1 uint 6 - paddingUp 1 uint 7 - paddingRight 1 uint 8 - paddingDown 1 uint 9 - paddingLeft 1 uint 10 - spacingHoriz 1 uint 11 - spacingVert 1 uint 12 - outline 1 uint 13 added with version 2 - fontName n+1 string 14 null terminated string with length n + fontSize 2 int 0 + bitField 1 bits 2 bit 0: smooth, bit 1: unicode, bit 2: italic, bit 3: bold, bit 4: fixedHeigth, bits 5-7: reserved + charSet 1 uint 3 + stretchH 2 uint 4 + aa 1 uint 6 + paddingUp 1 uint 7 + paddingRight 1 uint 8 + paddingDown 1 uint 9 + paddingLeft 1 uint 10 + spacingHoriz 1 uint 11 + spacingVert 1 uint 12 + outline 1 uint 13 added with version 2 + fontName n+1 string 14 null terminated string with length n */ _padding.top = (unsigned char)pData[7]; @@ -401,16 +401,16 @@ std::set* BMFontConfiguration::parseBinaryConfigFile(unsigned char else if (blockId == 2) { /* - lineHeight 2 uint 0 - base 2 uint 2 - scaleW 2 uint 4 - scaleH 2 uint 6 - pages 2 uint 8 - bitField 1 bits 10 bits 0-6: reserved, bit 7: packed - alphaChnl 1 uint 11 - redChnl 1 uint 12 - greenChnl 1 uint 13 - blueChnl 1 uint 14 + lineHeight 2 uint 0 + base 2 uint 2 + scaleW 2 uint 4 + scaleH 2 uint 6 + pages 2 uint 8 + bitField 1 bits 10 bits 0-6: reserved, bit 7: packed + alphaChnl 1 uint 11 + redChnl 1 uint 12 + greenChnl 1 uint 13 + blueChnl 1 uint 14 */ uint16_t lineHeight = 0; memcpy(&lineHeight, pData, 2); @@ -424,8 +424,8 @@ std::set* BMFontConfiguration::parseBinaryConfigFile(unsigned char uint16_t pages = 0; memcpy(&pages, pData + 8, 2); CCASSERT(pages == 1, "CCBitfontAtlas: only supports 1 page"); } - else if (blockId == 3) - { + else if (blockId == 3) + { /* pageNames p*(n+1) strings 0 p null terminated strings, each with length n */ @@ -438,22 +438,22 @@ std::set* BMFontConfiguration::parseBinaryConfigFile(unsigned char else if (blockId == 4) { /* - id 4 uint 0+c*20 These fields are repeated until all characters have been described - x 2 uint 4+c*20 - y 2 uint 6+c*20 - width 2 uint 8+c*20 - height 2 uint 10+c*20 - xoffset 2 int 12+c*20 - yoffset 2 int 14+c*20 - xadvance 2 int 16+c*20 - page 1 uint 18+c*20 - chnl 1 uint 19+c*20 + id 4 uint 0+c*20 These fields are repeated until all characters have been described + x 2 uint 4+c*20 + y 2 uint 6+c*20 + width 2 uint 8+c*20 + height 2 uint 10+c*20 + xoffset 2 int 12+c*20 + yoffset 2 int 14+c*20 + xadvance 2 int 16+c*20 + page 1 uint 18+c*20 + chnl 1 uint 19+c*20 */ unsigned long count = blockSize / 20; for (unsigned long i = 0; i < count; i++) - { + { tFontDefHashElement* element = (tFontDefHashElement*)malloc( sizeof(*element) ); uint32_t charId = 0; memcpy(&charId, pData + (i * 20), 4); @@ -486,18 +486,17 @@ std::set* BMFontConfiguration::parseBinaryConfigFile(unsigned char validCharsString->insert(element->fontDef.charID); } } - else if (blockId == 5) { + else if (blockId == 5) { /* - first 4 uint 0+c*10 These fields are repeated until all kerning pairs have been described - second 4 uint 4+c*10 - amount 2 int 8+c*10 + first 4 uint 0+c*10 These fields are repeated until all kerning pairs have been described + second 4 uint 4+c*10 + amount 2 int 8+c*10 */ unsigned long count = blockSize / 20; for (unsigned long i = 0; i < count; i++) - { - + { uint32_t first = 0; memcpy(&first, pData + (i * 10), 4); uint32_t second = 0; memcpy(&second, pData + (i * 10) + 4, 4); int16_t amount = 0; memcpy(&amount, pData + (i * 10) + 8, 2); @@ -693,12 +692,12 @@ FontFNT::FontFNT(BMFontConfiguration *theContfig, const Vec2& imageOffset /* = V :_configuration(theContfig) ,_imageOffset(CC_POINT_PIXELS_TO_POINTS(imageOffset)) { - _configuration->retain(); + _configuration->retain(); } FontFNT::~FontFNT() { - _configuration->release(); + _configuration->release(); } void FontFNT::purgeCachedData() diff --git a/cocos/2d/CCLabelAtlas.cpp b/cocos/2d/CCLabelAtlas.cpp index 1b5b803533..055cd6643c 100644 --- a/cocos/2d/CCLabelAtlas.cpp +++ b/cocos/2d/CCLabelAtlas.cpp @@ -71,7 +71,7 @@ LabelAtlas* LabelAtlas::create(const std::string& string, const std::string& cha bool LabelAtlas::initWithString(const std::string& string, const std::string& charMapFile, int itemWidth, int itemHeight, int startCharMap) { Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(charMapFile); - return initWithString(string, texture, itemWidth, itemHeight, startCharMap); + return initWithString(string, texture, itemWidth, itemHeight, startCharMap); } bool LabelAtlas::initWithString(const std::string& string, Texture2D* texture, int itemWidth, int itemHeight, int startCharMap) diff --git a/cocos/2d/CCLayer.cpp b/cocos/2d/CCLayer.cpp index 363230eb8e..011d47a95f 100644 --- a/cocos/2d/CCLayer.cpp +++ b/cocos/2d/CCLayer.cpp @@ -680,7 +680,7 @@ LayerGradient* LayerGradient::create() bool LayerGradient::init() { - return initWithColor(Color4B(0, 0, 0, 255), Color4B(0, 0, 0, 255)); + return initWithColor(Color4B(0, 0, 0, 255), Color4B(0, 0, 0, 255)); } bool LayerGradient::initWithColor(const Color4B& start, const Color4B& end) diff --git a/cocos/2d/CCMenuItem.cpp b/cocos/2d/CCMenuItem.cpp index 26a54194b7..f2dfb426fa 100644 --- a/cocos/2d/CCMenuItem.cpp +++ b/cocos/2d/CCMenuItem.cpp @@ -81,15 +81,15 @@ MenuItem* MenuItem::create( const ccMenuCallback& callback) // FIXME: deprecated bool MenuItem::initWithTarget(cocos2d::Ref *target, SEL_MenuHandler selector ) { - _target = target; - CC_SAFE_RETAIN(_target); - return initWithCallback( std::bind(selector,target, std::placeholders::_1) ); + _target = target; + CC_SAFE_RETAIN(_target); + return initWithCallback( std::bind(selector,target, std::placeholders::_1) ); } bool MenuItem::initWithCallback(const ccMenuCallback& callback) { setAnchorPoint(Vec2(0.5f, 0.5f)); - _callback = callback; + _callback = callback; _enabled = true; _selected = false; return true; @@ -101,8 +101,8 @@ MenuItem::~MenuItem() void MenuItem::onExit() { - Node::onExit(); - CC_SAFE_RELEASE(_target); + Node::onExit(); + CC_SAFE_RELEASE(_target); } void MenuItem::selected() @@ -121,7 +121,7 @@ void MenuItem::activate() { if( _callback ) { - _callback(this); + _callback(this); } #if CC_ENABLE_SCRIPT_BINDING if (kScriptTypeNone != _scriptType) @@ -159,14 +159,14 @@ bool MenuItem::isSelected() const // FIXME: deprecated void MenuItem::setTarget(Ref *target, SEL_MenuHandler selector) { - _target = target; - CC_SAFE_RETAIN(_target); - setCallback( std::bind( selector, target, std::placeholders::_1) ); + _target = target; + CC_SAFE_RETAIN(_target); + setCallback( std::bind( selector, target, std::placeholders::_1) ); } void MenuItem::setCallback(const ccMenuCallback& callback) { - _callback = callback; + _callback = callback; } std::string MenuItem::getDescription() const @@ -223,9 +223,9 @@ MenuItemLabel* MenuItemLabel::create(Node *label) // FIXME:: deprecated bool MenuItemLabel::initWithLabel(Node* label, Ref* target, SEL_MenuHandler selector) { - _target = target; - CC_SAFE_RETAIN(_target); - return initWithLabel(label, std::bind(selector,target, std::placeholders::_1) ); + _target = target; + CC_SAFE_RETAIN(_target); + return initWithLabel(label, std::bind(selector,target, std::placeholders::_1) ); } bool MenuItemLabel::initWithLabel(Node* label, const ccMenuCallback& callback) @@ -345,9 +345,9 @@ MenuItemAtlasFont * MenuItemAtlasFont::create(const std::string& value, const st // FIXME:: deprecated bool MenuItemAtlasFont::initWithString(const std::string& value, const std::string& charMapFile, int itemWidth, int itemHeight, char startCharMap, Ref* target, SEL_MenuHandler selector) { - _target = target; - CC_SAFE_RETAIN(_target); - return initWithString(value, charMapFile, itemWidth, itemHeight, startCharMap, std::bind(selector,target, std::placeholders::_1) ); + _target = target; + CC_SAFE_RETAIN(_target); + return initWithString(value, charMapFile, itemWidth, itemHeight, startCharMap, std::bind(selector,target, std::placeholders::_1) ); } bool MenuItemAtlasFont::initWithString(const std::string& value, const std::string& charMapFile, int itemWidth, int itemHeight, char startCharMap, const ccMenuCallback& callback) @@ -431,9 +431,9 @@ bool MenuItemFont::initWithString(const std::string& value, Ref* target, SEL_Men { CCASSERT( !value.empty(), "Value length must be greater than 0"); - _target = target; + _target = target; CC_SAFE_RETAIN(target); - return initWithString(value, std::bind(selector,target, std::placeholders::_1) ); + return initWithString(value, std::bind(selector,target, std::placeholders::_1) ); } bool MenuItemFont::initWithString(const std::string& value, const ccMenuCallback& callback) @@ -580,9 +580,9 @@ MenuItemSprite * MenuItemSprite::create(Node *normalSprite, Node *selectedSprite // FIXME: deprecated bool MenuItemSprite::initWithNormalSprite(Node* normalSprite, Node* selectedSprite, Node* disabledSprite, Ref* target, SEL_MenuHandler selector) { - _target = target; - CC_SAFE_RETAIN(_target); - return initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, std::bind(selector,target, std::placeholders::_1) ); + _target = target; + CC_SAFE_RETAIN(_target); + return initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, std::bind(selector,target, std::placeholders::_1) ); } bool MenuItemSprite::initWithNormalSprite(Node* normalSprite, Node* selectedSprite, Node* disabledSprite, const ccMenuCallback& callback) @@ -760,9 +760,9 @@ MenuItemImage * MenuItemImage::create(const std::string& normalImage, const std: // FIXME:: deprecated bool MenuItemImage::initWithNormalImage(const std::string& normalImage, const std::string& selectedImage, const std::string& disabledImage, Ref* target, SEL_MenuHandler selector) { - _target = target; - CC_SAFE_RETAIN(_target); - return initWithNormalImage(normalImage, selectedImage, disabledImage, std::bind(selector,target, std::placeholders::_1) ); + _target = target; + CC_SAFE_RETAIN(_target); + return initWithNormalImage(normalImage, selectedImage, disabledImage, std::bind(selector,target, std::placeholders::_1) ); } bool MenuItemImage::initWithNormalImage(const std::string& normalImage, const std::string& selectedImage, const std::string& disabledImage, const ccMenuCallback& callback) { @@ -877,9 +877,9 @@ MenuItemToggle * MenuItemToggle::create() // FIXME:: deprecated bool MenuItemToggle::initWithTarget(Ref* target, SEL_MenuHandler selector, MenuItem* item, va_list args) { - _target = target; - CC_SAFE_RETAIN(_target); - return initWithCallback(std::bind( selector, target, std::placeholders::_1), item, args); + _target = target; + CC_SAFE_RETAIN(_target); + return initWithCallback(std::bind( selector, target, std::placeholders::_1), item, args); } bool MenuItemToggle::initWithCallback(const ccMenuCallback &callback, MenuItem *item, va_list args) diff --git a/cocos/2d/CCMotionStreak.cpp b/cocos/2d/CCMotionStreak.cpp index 4c9138a131..e164154007 100644 --- a/cocos/2d/CCMotionStreak.cpp +++ b/cocos/2d/CCMotionStreak.cpp @@ -412,4 +412,3 @@ void MotionStreak::draw(Renderer *renderer, const Mat4 &transform, uint32_t flag } NS_CC_END - diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 4ab0364f15..e74e4aa052 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -724,9 +724,9 @@ void Node::ignoreAnchorPointForPosition(bool newValue) { if (newValue != _ignoreAnchorPointForPosition) { - _ignoreAnchorPointForPosition = newValue; + _ignoreAnchorPointForPosition = newValue; _transformUpdated = _transformDirty = _inverseDirty = true; - } + } } /// tag getter @@ -1705,8 +1705,8 @@ const Mat4& Node::getNodeToParentTransform() const bool needsSkewMatrix = ( _skewX || _skewY ); // Rotation values - // Change rotation code to handle X and Y - // If we skew with the exact same value for both x and y then we're simply just rotating + // Change rotation code to handle X and Y + // If we skew with the exact same value for both x and y then we're simply just rotating float cx = 1, sx = 0, cy = 1, sy = 0; if (_rotationZ_X != _rotationZ_Y || (! needsSkewMatrix && !_anchorPointInPoints.equals(Vec2::ZERO))) { @@ -2069,12 +2069,12 @@ void Node::updateTransformFromPhysics(const Mat4& parentTransform, uint32_t pare GLubyte Node::getOpacity(void) const { - return _realOpacity; + return _realOpacity; } GLubyte Node::getDisplayedOpacity() const { - return _displayedOpacity; + return _displayedOpacity; } void Node::setOpacity(GLubyte opacity) @@ -2086,7 +2086,7 @@ void Node::setOpacity(GLubyte opacity) void Node::updateDisplayedOpacity(GLubyte parentOpacity) { - _displayedOpacity = _realOpacity * parentOpacity/255.0; + _displayedOpacity = _realOpacity * parentOpacity/255.0; updateColor(); if (_cascadeOpacityEnabled) @@ -2146,26 +2146,26 @@ void Node::disableCascadeOpacity() const Color3B& Node::getColor(void) const { - return _realColor; + return _realColor; } const Color3B& Node::getDisplayedColor() const { - return _displayedColor; + return _displayedColor; } void Node::setColor(const Color3B& color) { - _displayedColor = _realColor = color; - - updateCascadeColor(); + _displayedColor = _realColor = color; + + updateCascadeColor(); } void Node::updateDisplayedColor(const Color3B& parentColor) { - _displayedColor.r = _realColor.r * parentColor.r/255.0; - _displayedColor.g = _realColor.g * parentColor.g/255.0; - _displayedColor.b = _realColor.b * parentColor.b/255.0; + _displayedColor.r = _realColor.r * parentColor.r/255.0; + _displayedColor.g = _realColor.g * parentColor.g/255.0; + _displayedColor.b = _realColor.b * parentColor.b/255.0; updateColor(); if (_cascadeColorEnabled) @@ -2203,7 +2203,7 @@ void Node::setCascadeColorEnabled(bool cascadeColorEnabled) void Node::updateCascadeColor() { - Color3B parentColor = Color3B::WHITE; + Color3B parentColor = Color3B::WHITE; if (_parent && _parent->isCascadeColorEnabled()) { parentColor = _parent->getDisplayedColor(); diff --git a/cocos/2d/CCParticleSystem.cpp b/cocos/2d/CCParticleSystem.cpp index f1b743f6fa..e660522559 100644 --- a/cocos/2d/CCParticleSystem.cpp +++ b/cocos/2d/CCParticleSystem.cpp @@ -1180,4 +1180,3 @@ void ParticleSystem::setScaleY(float newScaleY) NS_CC_END - diff --git a/cocos/2d/CCRenderTexture.cpp b/cocos/2d/CCRenderTexture.cpp index 4c2157843f..06c7e7a11f 100644 --- a/cocos/2d/CCRenderTexture.cpp +++ b/cocos/2d/CCRenderTexture.cpp @@ -383,12 +383,12 @@ void RenderTexture::clearStencil(int stencilValue) void RenderTexture::visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t parentFlags) { // override visit. - // Don't call visit on its children + // Don't call visit on its children if (!_visible || !isVisitableByVisitingCamera()) { return; } - + uint32_t flags = processParentFlags(parentTransform, parentFlags); Director* director = Director::getInstance(); diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index caa06dbe50..431bdabd61 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -564,7 +564,7 @@ void Sprite::updateTransform(void) // MARMALADE CHANGE: ADDED CHECK FOR nullptr, TO PERMIT SPRITES WITH NO BATCH NODE / TEXTURE ATLAS if (_textureAtlas) - { + { _textureAtlas->updateQuad(&_quad, _atlasIndex); } @@ -879,11 +879,11 @@ void Sprite::updateColor(void) Color4B color4( _displayedColor.r, _displayedColor.g, _displayedColor.b, _displayedOpacity ); // special opacity for premultiplied textures - if (_opacityModifyRGB) + if (_opacityModifyRGB) { - color4.r *= _displayedOpacity/255.0f; - color4.g *= _displayedOpacity/255.0f; - color4.b *= _displayedOpacity/255.0f; + color4.r *= _displayedOpacity/255.0f; + color4.g *= _displayedOpacity/255.0f; + color4.b *= _displayedOpacity/255.0f; } _quad.bl.colors = color4; diff --git a/cocos/2d/CCSpriteBatchNode.cpp b/cocos/2d/CCSpriteBatchNode.cpp index ec1a6d1cf7..5386b8d737 100644 --- a/cocos/2d/CCSpriteBatchNode.cpp +++ b/cocos/2d/CCSpriteBatchNode.cpp @@ -653,22 +653,22 @@ void SpriteBatchNode::updateQuadFromSprite(Sprite *sprite, ssize_t index) CCASSERT(sprite != nullptr, "Argument must be non-nil"); CCASSERT(dynamic_cast(sprite) != nullptr, "CCSpriteBatchNode only supports Sprites as children"); - // make needed room - while (index >= _textureAtlas->getCapacity() || _textureAtlas->getCapacity() == _textureAtlas->getTotalQuads()) + // make needed room + while (index >= _textureAtlas->getCapacity() || _textureAtlas->getCapacity() == _textureAtlas->getTotalQuads()) { - this->increaseAtlasCapacity(); + this->increaseAtlasCapacity(); } - // - // update the quad directly. Don't add the sprite to the scene graph - // - sprite->setBatchNode(this); + // + // update the quad directly. Don't add the sprite to the scene graph + // + sprite->setBatchNode(this); sprite->setAtlasIndex(index); - sprite->setDirty(true); - - // UpdateTransform updates the textureAtlas quad - sprite->updateTransform(); + sprite->setDirty(true); + + // UpdateTransform updates the textureAtlas quad + sprite->updateTransform(); } SpriteBatchNode * SpriteBatchNode::addSpriteWithoutQuad(Sprite*child, int z, int aTag) diff --git a/cocos/2d/CCSpriteFrame.cpp b/cocos/2d/CCSpriteFrame.cpp index 8a5a6468fe..62e5403c81 100644 --- a/cocos/2d/CCSpriteFrame.cpp +++ b/cocos/2d/CCSpriteFrame.cpp @@ -196,4 +196,3 @@ Texture2D* SpriteFrame::getTexture() } NS_CC_END - diff --git a/cocos/2d/CCSpriteFrameCache.cpp b/cocos/2d/CCSpriteFrameCache.cpp index 2b876f0e67..a8c4679c96 100644 --- a/cocos/2d/CCSpriteFrameCache.cpp +++ b/cocos/2d/CCSpriteFrameCache.cpp @@ -428,4 +428,3 @@ SpriteFrame* SpriteFrameCache::getSpriteFrameByName(const std::string& name) } NS_CC_END - diff --git a/cocos/2d/CCTMXLayer.cpp b/cocos/2d/CCTMXLayer.cpp index 74c157b82e..044cb42665 100644 --- a/cocos/2d/CCTMXLayer.cpp +++ b/cocos/2d/CCTMXLayer.cpp @@ -288,13 +288,13 @@ Sprite* TMXLayer::reusedTileWithRect(Rect rect) else { // FIXME: HACK: Needed because if "batch node" is nil, - // then the Sprite'squad will be reset + // then the Sprite'squad will be reset _reusedTile->setBatchNode(nullptr); - // Re-init the sprite + // Re-init the sprite _reusedTile->setTextureRect(rect, false, rect.size); - // restore the batch node + // restore the batch node _reusedTile->setBatchNode(this); } @@ -732,4 +732,3 @@ std::string TMXLayer::getDescription() const NS_CC_END - diff --git a/cocos/2d/CCTMXTiledMap.cpp b/cocos/2d/CCTMXTiledMap.cpp index d8176215d0..d5a3d842e8 100644 --- a/cocos/2d/CCTMXTiledMap.cpp +++ b/cocos/2d/CCTMXTiledMap.cpp @@ -263,4 +263,3 @@ std::string TMXTiledMap::getDescription() const NS_CC_END - diff --git a/cocos/2d/CCTMXXMLParser.cpp b/cocos/2d/CCTMXXMLParser.cpp index e818c0107f..e9801c4c4f 100644 --- a/cocos/2d/CCTMXXMLParser.cpp +++ b/cocos/2d/CCTMXXMLParser.cpp @@ -712,4 +712,3 @@ void TMXMapInfo::textHandler(void *ctx, const char *ch, int len) } NS_CC_END - diff --git a/cocos/2d/CCTransitionProgress.cpp b/cocos/2d/CCTransitionProgress.cpp index ddd0710af6..899731e785 100644 --- a/cocos/2d/CCTransitionProgress.cpp +++ b/cocos/2d/CCTransitionProgress.cpp @@ -341,4 +341,3 @@ ProgressTimer* TransitionProgressOutIn::progressTimerNodeWithRenderTexture(Rende } NS_CC_END - From 7046f508dad8231d41aa0c31f22584876d2ae18a Mon Sep 17 00:00:00 2001 From: dualface Date: Fri, 9 Jan 2015 03:10:54 +0800 Subject: [PATCH 050/106] update proj.win32 for templates --- .../runtime-src/proj.win32/HelloLua.vcxproj | 18 +++++++++--------- .../runtime-src/proj.win32/HelloLua.vcxproj | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.win32/HelloLua.vcxproj b/templates/lua-template-default/frameworks/runtime-src/proj.win32/HelloLua.vcxproj index f7df1afe6e..3db7d95da8 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.win32/HelloLua.vcxproj +++ b/templates/lua-template-default/frameworks/runtime-src/proj.win32/HelloLua.vcxproj @@ -19,8 +19,8 @@ Application true Unicode - v100 v110 + v120 v110_xp v120_xp @@ -28,8 +28,8 @@ Application false Unicode - v100 v110 + v120 v110_xp v120_xp @@ -68,7 +68,7 @@ - $(ProjectDir)..\Classes;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories) + $(ProjectDir)..\Classes;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories);$(_COCOS_HEADER_WIN32_BEGIN);$(_COCOS_HEADER_WIN32_END) Level3 @@ -85,8 +85,8 @@ Windows MachineX86 true - $(OutDir);%(AdditionalLibraryDirectories) - libcurl_imp.lib;lua51.lib;websockets.lib;%(AdditionalDependencies) + $(OutDir);%(AdditionalLibraryDirectories);$(_COCOS_LIB_PATH_WIN32_BEGIN);$(_COCOS_LIB_PATH_WIN32_END) + libcurl_imp.lib;lua51.lib;websockets.lib;%(AdditionalDependencies);$(_COCOS_LIB_WIN32_BEGIN);$(_COCOS_LIB_WIN32_END) 0x0409 @@ -118,7 +118,7 @@ - $(ProjectDir)..\Classes;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories) + $(ProjectDir)..\Classes;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories);$(_COCOS_HEADER_WIN32_BEGIN);$(_COCOS_HEADER_WIN32_END) Level3 @@ -133,8 +133,8 @@ Windows MachineX86 - $(OutDir);%(AdditionalLibraryDirectories) - libcurl_imp.lib;lua51.lib;websockets.lib;%(AdditionalDependencies) + $(OutDir);%(AdditionalLibraryDirectories);$(_COCOS_LIB_PATH_WIN32_BEGIN);$(_COCOS_LIB_PATH_WIN32_END) + libcurl_imp.lib;lua51.lib;websockets.lib;%(AdditionalDependencies);$(_COCOS_LIB_WIN32_BEGIN);$(_COCOS_LIB_WIN32_END) true @@ -194,4 +194,4 @@ - \ No newline at end of file + diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj index 9bf3ab3b1a..8b9622207e 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj @@ -19,8 +19,8 @@ Application true Unicode - v100 v110 + v120 v110_xp v120_xp @@ -28,8 +28,8 @@ Application false Unicode - v100 v110 + v120 v110_xp v120_xp @@ -68,7 +68,7 @@ - $(ProjectDir)..\Classes;$(ProjectDir)..\Classes\runtime;$(ProjectDir)..\Classes\service;$(ProjectDir)..\Classes\protobuf-lite;$(EngineRoot)external\win32-specific\zlib\include;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)external\curl\include\win32;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories) + $(ProjectDir)..\Classes;$(ProjectDir)..\Classes\runtime;$(ProjectDir)..\Classes\service;$(ProjectDir)..\Classes\protobuf-lite;$(EngineRoot)external\win32-specific\zlib\include;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)external\curl\include\win32;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories);$(_COCOS_HEADER_WIN32_BEGIN);$(_COCOS_HEADER_WIN32_END) Level3 @@ -88,8 +88,8 @@ Windows MachineX86 true - $(OutDir);%(AdditionalLibraryDirectories) - libcurl_imp.lib;lua51.lib;websockets.lib;%(AdditionalDependencies) + $(OutDir);%(AdditionalLibraryDirectories);$(_COCOS_LIB_PATH_WIN32_BEGIN);$(_COCOS_LIB_PATH_WIN32_END) + libcurl_imp.lib;lua51.lib;websockets.lib;%(AdditionalDependencies);$(_COCOS_LIB_WIN32_BEGIN);$(_COCOS_LIB_WIN32_END) $(ProjectDir)../../../runtime/win32/$(TargetName).pdb $(ProjectDir)../../../runtime/win32/$(TargetName)$(TargetExt) @@ -125,7 +125,7 @@ xcopy /Y /Q "$(ProjectDir)..\Classes\lang" "$(ProjectDir)..\..\..\runtime\win32\ - $(ProjectDir)..\Classes;$(ProjectDir)..\Classes\service;$(ProjectDir)..\Classes\runtime;$(ProjectDir)..\Classes\protobuf-lite;$(EngineRoot)external\win32-specific\zlib\include;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;$(EngineRoot)external\curl\include\win32;$(EngineRoot);%(AdditionalIncludeDirectories) + $(ProjectDir)..\Classes;$(ProjectDir)..\Classes\service;$(ProjectDir)..\Classes\runtime;$(ProjectDir)..\Classes\protobuf-lite;$(EngineRoot)external\win32-specific\zlib\include;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;$(EngineRoot)external\curl\include\win32;$(EngineRoot);%(AdditionalIncludeDirectories);$(_COCOS_HEADER_WIN32_BEGIN);$(_COCOS_HEADER_WIN32_END) Level3 @@ -143,8 +143,8 @@ xcopy /Y /Q "$(ProjectDir)..\Classes\lang" "$(ProjectDir)..\..\..\runtime\win32\ Windows MachineX86 - $(OutDir);%(AdditionalLibraryDirectories) - libcurl_imp.lib;lua51.lib;websockets.lib;%(AdditionalDependencies) + $(OutDir);%(AdditionalLibraryDirectories);$(_COCOS_LIB_PATH_WIN32_BEGIN);$(_COCOS_LIB_PATH_WIN32_END) + libcurl_imp.lib;lua51.lib;websockets.lib;%(AdditionalDependencies);$(_COCOS_LIB_WIN32_BEGIN);$(_COCOS_LIB_WIN32_END) true @@ -300,4 +300,4 @@ xcopy /Y /Q "$(ProjectDir)..\Classes\lang" "$(ProjectDir)..\..\..\runtime\win32\ - \ No newline at end of file + From c041787f01eb1e43d4fb4cf65e644f1536a37049 Mon Sep 17 00:00:00 2001 From: dualface Date: Fri, 9 Jan 2015 04:14:31 +0800 Subject: [PATCH 051/106] update proj.android for template --- .../cpp-template-default/proj.android/jni/Android.mk | 10 ++++++++++ .../runtime-src/proj.android/jni/Android.mk | 11 ++++++++++- .../runtime-src/proj.android/jni/Android.mk | 9 +++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/templates/cpp-template-default/proj.android/jni/Android.mk b/templates/cpp-template-default/proj.android/jni/Android.mk index 426d1f6c21..75e64b0fc4 100644 --- a/templates/cpp-template-default/proj.android/jni/Android.mk +++ b/templates/cpp-template-default/proj.android/jni/Android.mk @@ -16,8 +16,18 @@ LOCAL_SRC_FILES := hellocpp/main.cpp \ LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes +# _COCOS_HEADER_ANDROID_BEGIN +# _COCOS_HEADER_ANDROID_END + + LOCAL_STATIC_LIBRARIES := cocos2dx_static +# _COCOS_LIB_ANDROID_BEGIN +# _COCOS_LIB_ANDROID_END + include $(BUILD_SHARED_LIBRARY) $(call import-module,.) + +# _COCOS_LIB_IMPORT_ANDROID_BEGIN +# _COCOS_LIB_IMPORT_ANDROID_END diff --git a/templates/lua-template-default/frameworks/runtime-src/proj.android/jni/Android.mk b/templates/lua-template-default/frameworks/runtime-src/proj.android/jni/Android.mk index a35e293081..0ea50bd5e3 100644 --- a/templates/lua-template-default/frameworks/runtime-src/proj.android/jni/Android.mk +++ b/templates/lua-template-default/frameworks/runtime-src/proj.android/jni/Android.mk @@ -11,9 +11,18 @@ LOCAL_SRC_FILES := hellolua/main.cpp \ LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes - + +# _COCOS_HEADER_ANDROID_BEGIN +# _COCOS_HEADER_ANDROID_END + LOCAL_STATIC_LIBRARIES := cocos2d_lua_static +# _COCOS_LIB_ANDROID_BEGIN +# _COCOS_LIB_ANDROID_END + include $(BUILD_SHARED_LIBRARY) $(call import-module,scripting/lua-bindings/proj.android) + +# _COCOS_LIB_IMPORT_ANDROID_BEGIN +# _COCOS_LIB_IMPORT_ANDROID_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.android/jni/Android.mk b/templates/lua-template-runtime/frameworks/runtime-src/proj.android/jni/Android.mk index ef9e414e37..15a4a01563 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.android/jni/Android.mk +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.android/jni/Android.mk @@ -45,8 +45,17 @@ $(LOCAL_PATH)/../../Classes/runtime \ $(LOCAL_PATH)/../../Classes \ $(LOCAL_PATH)/../../../cocos2d-x/external +# _COCOS_HEADER_ANDROID_BEGIN +# _COCOS_HEADER_ANDROID_END + LOCAL_STATIC_LIBRARIES := cocos2d_lua_static +# _COCOS_LIB_ANDROID_BEGIN +# _COCOS_LIB_ANDROID_END + include $(BUILD_SHARED_LIBRARY) $(call import-module,scripting/lua-bindings/proj.android) + +# _COCOS_LIB_IMPORT_ANDROID_BEGIN +# _COCOS_LIB_IMPORT_ANDROID_END From bdac739541db61595d6d41e9719281b55e7a9c26 Mon Sep 17 00:00:00 2001 From: yinjimmy Date: Fri, 9 Jan 2015 04:18:41 +0800 Subject: [PATCH 052/106] Fix: executeScriptFile can not load .luac file when .lua is not exist --- .../lua-bindings/manual/CCLuaStack.cpp | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp index c77e14f530..13ef8b4e9e 100644 --- a/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp +++ b/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp @@ -275,33 +275,47 @@ int LuaStack::executeString(const char *codes) int LuaStack::executeScriptFile(const char* filename) { CCAssert(filename, "CCLuaStack::executeScriptFile() - invalid filename"); - + static const std::string BYTECODE_FILE_EXT = ".luac"; static const std::string NOT_BYTECODE_FILE_EXT = ".lua"; - + + std::string buf(filename); + // + // remove .lua or .luac + // + size_t pos = buf.rfind(BYTECODE_FILE_EXT); + if (pos != std::string::npos) + { + buf = buf.substr(0, pos); + } + else + { + pos = buf.rfind(NOT_BYTECODE_FILE_EXT); + if (pos == buf.length() - NOT_BYTECODE_FILE_EXT.length()) + { + buf = buf.substr(0, pos); + } + } + FileUtils *utils = FileUtils::getInstance(); - // + // // 1. check .lua suffix // 2. check .luac suffix // - std::string buf(filename); - if (!utils->isFileExist(buf)) + std::string tmpfilename = buf + NOT_BYTECODE_FILE_EXT; + if (utils->isFileExist(tmpfilename)) { - std::string notBytecodeFilename = buf + NOT_BYTECODE_FILE_EXT; - if (utils->isFileExist(notBytecodeFilename)) + buf = tmpfilename; + } + else + { + tmpfilename = buf + BYTECODE_FILE_EXT; + if (utils->isFileExist(tmpfilename)) { - buf = notBytecodeFilename; - } - else - { - std::string bytecodeFilename = buf + BYTECODE_FILE_EXT; - if (utils->isFileExist(bytecodeFilename)) - { - buf = bytecodeFilename; - } + buf = tmpfilename; } } - + std::string fullPath = utils->fullPathForFilename(buf); Data data = utils->getDataFromFile(fullPath); int rn = 0; From c9a8dfb6ee41603012339bc38a5adac0f28056e9 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 9 Jan 2015 09:37:55 +0800 Subject: [PATCH 053/106] Fixed can't update scale and rotation of static body --- 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 694f9ec679..4d622b116a 100644 --- a/cocos/physics/CCPhysicsBody.cpp +++ b/cocos/physics/CCPhysicsBody.cpp @@ -289,7 +289,6 @@ void PhysicsBody::setDynamic(bool dynamic) { cpBodySetMass(_cpBody, _mass); cpBodySetMoment(_cpBody, _moment); - _cpBody->CP_PRIVATE(node).idleTime = 0.0f; } } else @@ -303,7 +302,8 @@ void PhysicsBody::setDynamic(bool dynamic) { cpBodySetMass(_cpBody, PHYSICS_INFINITY); cpBodySetMoment(_cpBody, PHYSICS_INFINITY); - _cpBody->CP_PRIVATE(node).idleTime = (cpFloat)INFINITY; + cpBodySetVel(_cpBody, cpvzero); + cpBodySetAngVel(_cpBody, 0.0); } } } From ba0beaffdc03d83f4d6b84d5d56b67d41cd8ae14 Mon Sep 17 00:00:00 2001 From: Takao Kato Date: Fri, 9 Jan 2015 09:58:09 +0800 Subject: [PATCH 054/106] fixed getParentToNodeTransform. it returned a wrong transform if _transformDirty was true. --- cocos/2d/CCNode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 4ab0364f15..74ba46945e 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -1829,7 +1829,7 @@ const Mat4& Node::getParentToNodeTransform() const { if ( _inverseDirty ) { - _inverse = _transform.getInversed(); + _inverse = getNodeToParentTransform().getInversed(); _inverseDirty = false; } From 718c400bfaa02009ec08cea89b9140f8afca4fe8 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 9 Jan 2015 10:21:50 +0800 Subject: [PATCH 055/106] Fixed bodies display wrong in Physics:Pump test case --- tests/lua-tests/src/PhysicsTest/PhysicsTest.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua b/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua index 725744fe5d..8a8e496944 100644 --- a/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua +++ b/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua @@ -799,7 +799,7 @@ local function PhysicsDemoPump() sgearB:setCategoryBitmask(4); sgearB:setCollisionBitmask(4); sgearB:setTag(1); - world:addJoint(cc.PhysicsJointPin:construct(body, sgearB, sgearB:getPosition())); + world:addJoint(cc.PhysicsJointPin:construct(body, sgearB, cc.p(sgear:getPosition()))); -- big gear @@ -809,7 +809,7 @@ local function PhysicsDemoPump() bgear:setPosition(cc.p(VisibleRect:leftBottom().x + 275, VisibleRect:leftBottom().y)); layer:addChild(bgear); bgearB:setCategoryBitmask(4); - world:addJoint(cc.PhysicsJointPin:construct(body, bgearB, bgearB:getPosition())); + world:addJoint(cc.PhysicsJointPin:construct(body, bgearB, cc.p(bgear:getPosition()))); -- pump @@ -840,7 +840,7 @@ local function PhysicsDemoPump() sgearB:setCollisionBitmask(5); world:addJoint(cc.PhysicsJointPin:construct(body, pluggerB, cc.p(VisibleRect:leftBottom().x + 75, VisibleRect:leftBottom().y-90))); world:addJoint(cc.PhysicsJointDistance:construct(pluggerB, sgearB, - pluggerB:world2Local(cc.p(VisibleRect:leftBottom().x + 75, VisibleRect:leftBottom().y)), cc.p(44, 0))); + pluggerB:world2Local(cc.p(0,0)), cc.p(44, 0))); end initWithLayer(layer, onEnter) From 9de53712020959371a444337ca1907d40a46c72f Mon Sep 17 00:00:00 2001 From: songmiao Date: Fri, 9 Jan 2015 10:23:40 +0800 Subject: [PATCH 056/106] fix bug and add notes --- .../Classes/Camera3DTest/Camera3DTest.cpp | 70 +++++++++++++------ 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index 7f7392a5d8..8f525dbf58 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -40,8 +40,12 @@ static std::function createFunctions[] = { CL(Camera3DTestDemo), CL(CameraClippingDemo), - CL(CameraArcBallDemo), - CL(FogTestDemo) +#if (CC_TARGET_PLATFORM != CC_PLATFORM_WP8) && (CC_TARGET_PLATFORM != CC_PLATFORM_WINRT) + // 3DEffect use custom shader which is not supported on WP8/WinRT yet. + CL(FogTestDemo), +#endif + CL(CameraArcBallDemo) + }; #define MAX_LAYER (sizeof(createFunctions) / sizeof(createFunctions[0])) @@ -1133,32 +1137,34 @@ void CameraArcBallDemo::calculateArcBall( cocos2d::Vec3 & axis, float & angle, f Mat4 rotation_matrix; Mat4::createRotation(_rotationQuat, &rotation_matrix); - Vec3 uv = rotation_matrix * Vec3(0.0f,1.0f,0.0f); - Vec3 sv = rotation_matrix * Vec3(1.0f,0.0f,0.0f); - Vec3 lv = rotation_matrix * Vec3(0.0f,0.0f,-1.0f); + Vec3 uv = rotation_matrix * Vec3(0.0f,1.0f,0.0f); //rotation y + Vec3 sv = rotation_matrix * Vec3(1.0f,0.0f,0.0f); //rotation x + Vec3 lv = rotation_matrix * Vec3(0.0f,0.0f,-1.0f);//rotation z - Vec3 p1 = sv * p1x + uv * p1y - lv * projectToSphere(_radius, p1x, p1y); - Vec3 p2 = sv * p2x + uv * p2y - lv * projectToSphere(_radius, p2x, p2y); + Vec3 p1 = sv * p1x + uv * p1y - lv * projectToSphere(_radius, p1x, p1y); //start point screen transform to 3d + Vec3 p2 = sv * p2x + uv * p2y - lv * projectToSphere(_radius, p2x, p2y); //end point screen transform to 3d - Vec3::cross(p2, p1, &axis); + Vec3::cross(p2, p1, &axis); //calculate rotation axis axis.normalize(); float t = (p2 - p1).length() / (2.0 * _radius); - + //clamp -1 to 1 if (t > 1.0) t = 1.0; if (t < -1.0) t = -1.0; - angle = asin(t); + angle = asin(t); //rotation angle } +/* project an x,y pair onto a sphere of radius r or a +hyperbolic sheet if we are away from the center of the sphere. */ float CameraArcBallDemo::projectToSphere( float r, float x, float y ) { float d, t, z; d = sqrt(x*x + y*y); - if (d < r * 0.70710678118654752440) + if (d < r * 0.70710678118654752440)//inside sphere { z = sqrt(r*r - d*d); } - else + else //on hyperbola { t = r / 1.41421356237309504880; z = t*t / d; @@ -1259,7 +1265,8 @@ void FogTestDemo::onEnter() { BaseTest::onEnter(); schedule(schedule_selector(FogTestDemo::update), 0.0f); - + Director::getInstance()->setClearColor(Color4F(0.5,0.5,0.5,1)); + auto s = Director::getInstance()->getWinSize(); auto listener = EventListenerTouchAllAtOnce::create(); listener->onTouchesMoved = CC_CALLBACK_2(FogTestDemo::onTouchesMoved, this); @@ -1288,8 +1295,6 @@ void FogTestDemo::onEnter() addChild(layer3D,0); _layer3D=layer3D; - - glClearColor(0.5,0.5,0.5,1.0); _shader =GLProgram::createWithFilenames("Sprite3DTest/fog.vert","Sprite3DTest/fog.frag"); _state = GLProgramState::create(_shader); @@ -1351,6 +1356,27 @@ void FogTestDemo::onEnter() } _layer3D->setCameraMask(2); + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + _backToForegroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, + [this](EventCustom*) + { + Director::getInstance()->setClearColor(Color4F(0.5,0.5,0.5,1)); + auto glProgram = _state->getGLProgram(); + glProgram->reset(); + glProgram->initWithFilenames("Sprite3DTest/fog.vert","Sprite3DTest/fog.frag"); + glProgram->link(); + glProgram->updateUniforms(); + + _state->setUniformVec4("u_fogColor", Vec4(0.5,0.5,0.5,1.0)); + _state->setUniformFloat("u_fogStart",10); + _state->setUniformFloat("u_fogEnd",60); + _state->setUniformInt("u_fogEquation" ,0); + } + ); + Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundListener, -1); +#endif + } void FogTestDemo::switchTypeCallback(Ref* sender,int type) @@ -1388,11 +1414,15 @@ void FogTestDemo::switchTypeCallback(Ref* sender,int type) void FogTestDemo::onExit() { BaseTest::onExit(); - glClearColor(0.0,0.0,0.0,1.0); + Director::getInstance()->setClearColor(Color4F(0,0,0,1)); if (_camera) { _camera = nullptr; } + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + Director::getInstance()->getEventDispatcher()->removeEventListener(_backToForegroundListener); +#endif } void FogTestDemo::update(float dt) @@ -1403,9 +1433,9 @@ void FogTestDemo::onTouchesMoved(const std::vector& touches, cocos2d::Ev { if(touches.size()==1) { - auto touch = touches[0]; - auto location = touch->getLocation(); - Point newPos = touch->getPreviousLocation()-location; + Vec2 prelocation = touches[0]->getPreviousLocationInView(); + Vec2 location = touches[0]->getLocationInView(); + Vec2 newPos = prelocation - location; if(_cameraType==CameraType::FreeCamera) { Vec3 cameraDir; @@ -1417,7 +1447,7 @@ void FogTestDemo::onTouchesMoved(const std::vector& touches, cocos2d::Ev cameraRightDir.normalize(); cameraRightDir.y=0; Vec3 cameraPos= _camera->getPosition3D(); - cameraPos+=cameraDir*newPos.y*0.1f; + cameraPos-=cameraDir*newPos.y*0.1f; cameraPos+=cameraRightDir*newPos.x*0.1f; _camera->setPosition3D(cameraPos); } From 1d7a4a5c0599bb180b560b72d3961400be3ec24d Mon Sep 17 00:00:00 2001 From: youyou <501251991@qq.com> Date: Fri, 9 Jan 2015 10:24:38 +0800 Subject: [PATCH 057/106] fixed event frame will go twice loop when goto frame --- .../editor-support/cocostudio/ActionTimeline/CCTimeLine.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCTimeLine.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCTimeLine.cpp index 65d8f2be7d..662f368724 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCTimeLine.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCTimeLine.cpp @@ -145,11 +145,7 @@ void Timeline::binarySearchKeyFrame(int frameIndex) needEnterFrame = true; _fromIndex = 0; - - if(length > 1) - _toIndex = 1; - else - _toIndex = 0; + _toIndex = 0; from = to = _frames.at(0); _currentKeyFrameIndex = 0; From 2f3270fa0baf9b043ee71f05c7657b5b4c7fc478 Mon Sep 17 00:00:00 2001 From: yinjimmy Date: Fri, 9 Jan 2015 12:32:54 +0800 Subject: [PATCH 058/106] Fix: can not load Lua project with command `cocos run -p mac -m release` --- .../runtime-src/Classes/AppDelegate.cpp | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp index 9450522f13..30d69c3a95 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp @@ -54,7 +54,7 @@ void AppDelegate::initGLContextAttrs() bool AppDelegate::applicationDidFinishLaunching() { // -#if ((CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) && (CC_TARGET_PLATFORM != CC_PLATFORM_MAC) && (CC_CODE_IDE_DEBUG_SUPPORT > 0)) +#if ((CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) && (CC_TARGET_PLATFORM != CC_PLATFORM_MAC) && (CC_CODE_IDE_DEBUG_SUPPORT > 0) && (COCOS2D_DEBUG > 0)) _project.setDebuggerType(kCCRuntimeDebuggerCodeIDE); #endif @@ -188,25 +188,18 @@ void StartupCall::startup() } updateConfigParser(project); - if (FileUtils::getInstance()->isFileExist(path)) + updatePreviewFuncForPath(path); + + // launch + if (project.getDebuggerType() == kCCRuntimeDebuggerNone) { - updatePreviewFuncForPath(path); - - // launch - if (project.getDebuggerType() == kCCRuntimeDebuggerNone) - { - _previewFunc(path); - } - else - { - // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE - initRuntime(project.getProjectDir()); - startRuntime(); - } + _previewFunc(path); } else { - CCLOG("[ERROR]: %s is not exist.", path.c_str()); + // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE + initRuntime(project.getProjectDir()); + startRuntime(); } // track start event @@ -358,12 +351,6 @@ void StartupCall::updatePreviewFuncForPath(const std::string &path) // set loader _previewFunc = [](const std::string &path) { CCLOG("[WARNING]: unsupport %s", path.c_str()); }; - if (!FileUtils::getInstance()->isFileExist(path)) - { - CCLOG("[ERROR]: %s is not exist.", path.c_str()); - return ; - } - if (endWithString(path, ".lua")) { _launchEvent = "lua"; From 7514ce4d62abf45e6b73de731ce12638fd65f4ee Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 9 Jan 2015 14:20:26 +0800 Subject: [PATCH 059/106] [ci skip] Update CHANGELOG --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 6e3415fb7d..fde3730a72 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ cocos2d-x-3.4rc0 Jan.9 2015 [NEW] 3rd: update libcurl to v7.39, update luajit to 2.0.3 + [NEW] 3rd: update luajit to v2.0.3 [FIX] FileUtils: getData() can't get data from file when file was using by other application on windows [FIX] FileUtils: getData() will cause memory leak if file size is 0 on windows From 275c7d180c72da3101b842a25b99aca5c9324e2e Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Fri, 9 Jan 2015 14:31:31 +0800 Subject: [PATCH 060/106] [ci skip] update changelogs --- CHANGELOG | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index fde3730a72..eafce46707 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,18 +1,18 @@ cocos2d-x-3.4rc0 Jan.9 2015 [NEW] 3rd: update libcurl to v7.39, update luajit to 2.0.3 [NEW] 3rd: update luajit to v2.0.3 - + + [FIX] DrawNode: can not set color when DrawPoints, wrong behavior of drawRect [FIX] FileUtils: getData() can't get data from file when file was using by other application on windows [FIX] FileUtils: getData() will cause memory leak if file size is 0 on windows [FIX] GLProgram: when there is a shader compile error in shader, it will crash on windows + [FIX] GLProgramState: uniforms and attribute is not refreshed when come to foreground on android + [FIX] HttpClient: http requests will be lost in immediately mode on iOS [FIX] JumpTo: can not be applied more than once + [FIX] Particle: VAO and VBOs is not reset when come to foreground on android [FIX] Physics integration: physics body is not still after disabling gravitational force by PhysicsBody::setGravityEnable() [FIX] Sprite3DTest: Sprite3DUVAnimationTest, Sprite3DFakeShadowTest, Sprite3DLightMapTest, Sprite3DBasicToonShaderTest will crash on android when switch to foreground from background - [FIX] HttpClient: http requests will be lost in immediately mode on iOS [FIX] WP8: compiling error on ARM architecture - [FIX] DrawNode: can not set color when DrawPoints, wrong behavior of drawRect - [FIX] GLProgramState: uniforms and attribute is not refreshed when come to foreground on android - [FIX] Particle: VAO and VBOs is not reset when come to foreground on android cocos2d-x-3.4beta0 Dec.31 2014 [NEW] 3D: support frustum culling From 8f0eb300e0a75eb7be77c26a851fed89d927d8ac Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Fri, 9 Jan 2015 14:32:53 +0800 Subject: [PATCH 061/106] [ci skip] update changelog --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index eafce46707..e8447a5093 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,5 @@ cocos2d-x-3.4rc0 Jan.9 2015 - [NEW] 3rd: update libcurl to v7.39, update luajit to 2.0.3 + [NEW] 3rd: update libcurl to v7.39 [NEW] 3rd: update luajit to v2.0.3 [FIX] DrawNode: can not set color when DrawPoints, wrong behavior of drawRect From f98ff24e971904dc704e2bb9a499d94498ad9f2a Mon Sep 17 00:00:00 2001 From: yinjimmy Date: Fri, 9 Jan 2015 14:39:45 +0800 Subject: [PATCH 062/106] Support `isLandscape` field in config.json --- .../frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm | 4 ++++ .../frameworks/runtime-src/proj.win32/service/PlayerWin.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm index ef2858d90b..9695fdef20 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm @@ -182,6 +182,10 @@ static void glfwDropFunc(GLFWwindow *window, int count, const char **files) { config->changeFrameOrientationToLandscape(); } + else + { + config->changeFrameOrientationToPortait(); + } config->setScriptFile(parser->getEntryFile()); } diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.cpp index aa62c3033c..0c5bcb0dff 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.cpp @@ -673,6 +673,10 @@ void PlayerWin::parseCocosProjectConfig(ProjectConfig &config) { config.changeFrameOrientationToLandscape(); } + else + { + config.changeFrameOrientationToPortait(); + } config.setScriptFile(parser->getEntryFile()); } From ca7fe406f4cd558361d69fbd3084aeb589f29c16 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Fri, 9 Jan 2015 14:56:00 +0800 Subject: [PATCH 063/106] [ci skip] update Authors --- AUTHORS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS b/AUTHORS index 5bcb776903..b724591508 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1065,6 +1065,9 @@ Developers: ton1517 Fix the issue that JumpTo can not be applied more than once + takaokato + Fix wrong result in Node:getParenttoNodeTransform() if node is transformed + Retired Core Developers: WenSheng Yang Author of windows port, CCTextField, From 2c728fa3416f8aaeed3bf8c9b565349e26612d9c Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 9 Jan 2015 15:01:08 +0800 Subject: [PATCH 064/106] Fixed can't run new CPP project on android by Eclipse --- templates/cpp-template-default/proj.android/.classpath | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/templates/cpp-template-default/proj.android/.classpath b/templates/cpp-template-default/proj.android/.classpath index b3e30abe7f..d57ec02513 100644 --- a/templates/cpp-template-default/proj.android/.classpath +++ b/templates/cpp-template-default/proj.android/.classpath @@ -1,10 +1,9 @@ - + - From 4715de45916686aef6a8023a9bf1ab66ddb3127a Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 9 Jan 2015 15:07:06 +0800 Subject: [PATCH 065/106] [ci skip] Update CHANGELOG --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index e8447a5093..a90ab0f0a8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,6 +12,7 @@ cocos2d-x-3.4rc0 Jan.9 2015 [FIX] Particle: VAO and VBOs is not reset when come to foreground on android [FIX] Physics integration: physics body is not still after disabling gravitational force by PhysicsBody::setGravityEnable() [FIX] Sprite3DTest: Sprite3DUVAnimationTest, Sprite3DFakeShadowTest, Sprite3DLightMapTest, Sprite3DBasicToonShaderTest will crash on android when switch to foreground from background + [FIX] Template: multiple dex files define error on Android if using Eclipse to build new generated application [FIX] WP8: compiling error on ARM architecture cocos2d-x-3.4beta0 Dec.31 2014 From 08ec8cc8bfe29403d52dfc01c0dc24857ea81cf9 Mon Sep 17 00:00:00 2001 From: samuele3hu Date: Fri, 9 Jan 2015 15:23:54 +0800 Subject: [PATCH 066/106] Fix some lua-tests bugs --- tests/lua-tests/src/BillBoardTest/BillBoardTest.lua | 6 +++--- .../CocoStudioActionTimelineTest.lua | 4 ++-- tests/lua-tests/src/PhysicsTest/PhysicsTest.lua | 2 +- tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua | 7 ++++++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/lua-tests/src/BillBoardTest/BillBoardTest.lua b/tests/lua-tests/src/BillBoardTest/BillBoardTest.lua index cc175b9797..fe76a35f75 100644 --- a/tests/lua-tests/src/BillBoardTest/BillBoardTest.lua +++ b/tests/lua-tests/src/BillBoardTest/BillBoardTest.lua @@ -77,9 +77,9 @@ function BillBoardTest:init() cameraDir = cc.vec3normalize(cameraDir) cameraDir.y = 0 transformMat = self._camera:getNodeToWorldTransform() - cameraRightDir.x = -transformMat[1] - cameraRightDir.y = -transformMat[2] - cameraRightDir.z = -transformMat[3] + cameraRightDir.x = transformMat[1] + cameraRightDir.y = transformMat[2] + cameraRightDir.z = transformMat[3] cameraRightDir = cc.vec3normalize(cameraRightDir) cameraRightDir.y=0 diff --git a/tests/lua-tests/src/CocoStudioTest/CocoStudioActionTimelineTest/CocoStudioActionTimelineTest.lua b/tests/lua-tests/src/CocoStudioTest/CocoStudioActionTimelineTest/CocoStudioActionTimelineTest.lua index a789e939fd..2729bcfda6 100644 --- a/tests/lua-tests/src/CocoStudioTest/CocoStudioActionTimelineTest/CocoStudioActionTimelineTest.lua +++ b/tests/lua-tests/src/CocoStudioTest/CocoStudioActionTimelineTest/CocoStudioActionTimelineTest.lua @@ -243,9 +243,9 @@ function TestChangePlaySection:onEnter() local function onTouchesEnded(touches, event) if action:getStartFrame() == 0 then - action:gotoFrameAndPlay(70, action:getDuration(), true) + action:gotoFrameAndPlay(41, 81, true) else - action:gotoFrameAndPlay(0, 60, true) + action:gotoFrameAndPlay(0, 40, true) end end diff --git a/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua b/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua index 8a8e496944..59d00d315f 100644 --- a/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua +++ b/tests/lua-tests/src/PhysicsTest/PhysicsTest.lua @@ -1246,7 +1246,7 @@ local function PhysicsPositionRotationTest() local leftBall = cc.Sprite:create("Images/ball.png"); leftBall:setPosition(-30, 0); leftBall:setScale(2); - leftBall:setPhysicsBody(cc.PhysicsBody:createCircle(leftBall:getContentSize().width/4)); + leftBall:setPhysicsBody(cc.PhysicsBody:createCircle(leftBall:getContentSize().width)); leftBall:getPhysicsBody():setTag(DRAG_BODYS_TAG); parent:addChild(leftBall); diff --git a/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua b/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua index 0ac74b5da6..c45c609c82 100644 --- a/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua +++ b/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua @@ -1,5 +1,6 @@ local visibleRect = cc.Director:getInstance():getOpenGLView():getVisibleRect() local centerPos = cc.p(visibleRect.x + visibleRect.width / 2,visibleRect.y + visibleRect.height /2) +local targetPlatform = cc.Application:getInstance():getTargetPlatform() local function VideoPlayerTest() local layer = cc.Layer:create() --createTestLayer("VideoPlayerTest", "") @@ -93,7 +94,11 @@ local function VideoPlayerTest() ------------------------------------------------------------ local function menuResourceVideoCallback(tag, sender) if nil ~= videoPlayer then - videoPlayer:setFileName("res/cocosvideo.mp4") + if cc.PLATFORM_OS_IPHONE == targetPlatform then + videoPlayer:setFileName("cocosvideo.mp4") + else + videoPlayer:setFileName("res/cocosvideo.mp4") + end videoPlayer:play() end end From 2c1f9f39de801931f037bdf4711e77a0c667fa6e Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 9 Jan 2015 15:35:02 +0800 Subject: [PATCH 067/106] [ci skip] Update CHANGELOG --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index a90ab0f0a8..e602d41d0f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ cocos2d-x-3.4rc0 Jan.9 2015 [NEW] 3rd: update libcurl to v7.39 [NEW] 3rd: update luajit to v2.0.3 + [FIX] C++: crash when run clang static analyzer in Xcode [FIX] DrawNode: can not set color when DrawPoints, wrong behavior of drawRect [FIX] FileUtils: getData() can't get data from file when file was using by other application on windows [FIX] FileUtils: getData() will cause memory leak if file size is 0 on windows From e1c575b7b7a8efa613ae1d28f3c5f4a86cda7bec Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 9 Jan 2015 15:36:23 +0800 Subject: [PATCH 068/106] [ci skip]Update Authors --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index b724591508..dec4bf7097 100644 --- a/AUTHORS +++ b/AUTHORS @@ -815,6 +815,7 @@ Developers: Precompiled headers improvements Added Application::openUrl for all supported platforms ecept WP8 and WinRT Scale9Sprite capInsets set fix + Clang static analyzer crash fix youknowone Adds iOS-like elastic bounceback support for cocos2d::extension::ScrollView From 6a55fef70e7396cdb59c89223bf9357e5d1a505b Mon Sep 17 00:00:00 2001 From: samuele3hu Date: Fri, 9 Jan 2015 16:45:51 +0800 Subject: [PATCH 069/106] Update the VideoPlayerTest to passing the fullpath of video resource --- tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua b/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua index c45c609c82..8122f3c651 100644 --- a/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua +++ b/tests/lua-tests/src/VideoPlayerTest/VideoPlayerTest.lua @@ -1,6 +1,5 @@ local visibleRect = cc.Director:getInstance():getOpenGLView():getVisibleRect() local centerPos = cc.p(visibleRect.x + visibleRect.width / 2,visibleRect.y + visibleRect.height /2) -local targetPlatform = cc.Application:getInstance():getTargetPlatform() local function VideoPlayerTest() local layer = cc.Layer:create() --createTestLayer("VideoPlayerTest", "") @@ -94,11 +93,8 @@ local function VideoPlayerTest() ------------------------------------------------------------ local function menuResourceVideoCallback(tag, sender) if nil ~= videoPlayer then - if cc.PLATFORM_OS_IPHONE == targetPlatform then - videoPlayer:setFileName("cocosvideo.mp4") - else - videoPlayer:setFileName("res/cocosvideo.mp4") - end + local videoFullPath = cc.FileUtils:getInstance():fullPathForFilename("cocosvideo.mp4") + videoPlayer:setFileName(videoFullPath) videoPlayer:play() end end From d92a525bfaab1a650217abaf247718ce409a3963 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 9 Jan 2015 16:52:40 +0800 Subject: [PATCH 070/106] Fixed dead loop when width of label[system font] smaller then one word of the string on android --- .../android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java index 7b01bc9942..28c0fd4c57 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java @@ -384,7 +384,7 @@ public class Cocos2dxBitmap { i = lastIndexOfSpace + 1; // skip space } else { // Should not exceed the width. - if (tempWidth > maxWidth) { + if (tempWidth > maxWidth && i != start + 1) { strList.add(string.substring(start, i - 1)); // Compute from previous char. --i; From e2c7743db16c6c79147c8fbfea83a1850e117264 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 9 Jan 2015 18:51:30 +0800 Subject: [PATCH 071/106] Add test case --- .../Classes/LabelTest/LabelTestNew.cpp | 20 ++++++++++++++++++- .../Classes/LabelTest/LabelTestNew.h | 11 ++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp index 232f355db5..8617d9e93b 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp @@ -83,7 +83,8 @@ static std::function createFunctions[] = CL(LabelAdditionalKerningTest), CL(LabelIssue8492Test), CL(LabelMultilineWithOutline), - CL(LabelIssue9255Test) + CL(LabelIssue9255Test), + CL(LabelSmallDimensionsTest) }; #define MAX_LAYER (sizeof(createFunctions) / sizeof(createFunctions[0])) @@ -1877,3 +1878,20 @@ std::string LabelIssue9255Test::subtitle() const { return "switch to desktop and switch back. Crashed!!!"; } + +LabelSmallDimensionsTest::LabelSmallDimensionsTest() +{ + auto label = Label::createWithSystemFont("Hello World!", "fonts/arial.ttf", 24, Size(30,100)); + label->setPosition(VisibleRect::center()); + addChild(label); +} + +std::string LabelSmallDimensionsTest::title() const +{ + return "Test create Label[system font] with small dimensions"; +} + +std::string LabelSmallDimensionsTest::subtitle() const +{ + return "Program should not dead loop"; +} diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h index 0d83a93736..22dece7eed 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h @@ -544,5 +544,16 @@ public: virtual std::string subtitle() const override; }; +class LabelSmallDimensionsTest : public AtlasDemoNew +{ +public: + CREATE_FUNC(LabelSmallDimensionsTest); + + LabelSmallDimensionsTest(); + + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; + #endif From e04087ea4169475c8b8b14e9670064258c877cf3 Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 9 Jan 2015 19:09:43 +0800 Subject: [PATCH 072/106] [ci skip] Update CHANGELOG --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index e602d41d0f..c2d5ab99ce 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -10,6 +10,7 @@ cocos2d-x-3.4rc0 Jan.9 2015 [FIX] GLProgramState: uniforms and attribute is not refreshed when come to foreground on android [FIX] HttpClient: http requests will be lost in immediately mode on iOS [FIX] JumpTo: can not be applied more than once + [FIX] Label: may cause deak lock if using system font on Android [FIX] Particle: VAO and VBOs is not reset when come to foreground on android [FIX] Physics integration: physics body is not still after disabling gravitational force by PhysicsBody::setGravityEnable() [FIX] Sprite3DTest: Sprite3DUVAnimationTest, Sprite3DFakeShadowTest, Sprite3DLightMapTest, Sprite3DBasicToonShaderTest will crash on android when switch to foreground from background From 57cd4cd3c69a24995ec23a50dfa998c5cc78600a Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 9 Jan 2015 19:14:19 +0800 Subject: [PATCH 073/106] Fixed VideoPlayer can't play when passing the full path of video resource --- .../android/java/src/org/cocos2dx/lib/Cocos2dxVideoView.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxVideoView.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxVideoView.java index e55f80ec31..e2881c232b 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxVideoView.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxVideoView.java @@ -210,13 +210,16 @@ public class Cocos2dxVideoView extends SurfaceView implements MediaPlayerControl private boolean isAssetRouse = false; private String fileName = null; - + private String assetResourceRoot = "assets/"; public void setVideoFileName(String path) { if (path.startsWith("/")) { isAssetRouse = false; setVideoURI(Uri.parse(path),null); } else { + if (path.startsWith(assetResourceRoot)) { + path = path.substring(assetResourceRoot.length()); + } fileName = path; isAssetRouse = true; setVideoURI(Uri.parse(path),null); From 15220c7499f5076c1cc1ef50979d635b18fb7be7 Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 9 Jan 2015 19:29:50 +0800 Subject: [PATCH 074/106] [ci skip] Update CHANGELOG --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index c2d5ab99ce..9d06c54381 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -15,6 +15,7 @@ cocos2d-x-3.4rc0 Jan.9 2015 [FIX] Physics integration: physics body is not still after disabling gravitational force by PhysicsBody::setGravityEnable() [FIX] Sprite3DTest: Sprite3DUVAnimationTest, Sprite3DFakeShadowTest, Sprite3DLightMapTest, Sprite3DBasicToonShaderTest will crash on android when switch to foreground from background [FIX] Template: multiple dex files define error on Android if using Eclipse to build new generated application + [FIX] VideoPlayer: can not play video if passing path returned from FileUtils::fullPathForFilename() on Android [FIX] WP8: compiling error on ARM architecture cocos2d-x-3.4beta0 Dec.31 2014 From ad42e15b62a1dfe6bdf64ce96fd9ccf4ba2f6d0e Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Fri, 9 Jan 2015 21:22:55 +0800 Subject: [PATCH 075/106] [ci skip]Update CHANGELOG --- CHANGELOG | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 9d06c54381..58b11e9123 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,11 +7,11 @@ cocos2d-x-3.4rc0 Jan.9 2015 [FIX] FileUtils: getData() can't get data from file when file was using by other application on windows [FIX] FileUtils: getData() will cause memory leak if file size is 0 on windows [FIX] GLProgram: when there is a shader compile error in shader, it will crash on windows - [FIX] GLProgramState: uniforms and attribute is not refreshed when come to foreground on android + [FIX] GLProgramState: Assert error because uniforms and attribute is not refreshed when come to foreground on android [FIX] HttpClient: http requests will be lost in immediately mode on iOS [FIX] JumpTo: can not be applied more than once - [FIX] Label: may cause deak lock if using system font on Android - [FIX] Particle: VAO and VBOs is not reset when come to foreground on android + [FIX] Label: may cause infinite loop if using system font on Android + [FIX] Particle: GL_INVALID_CALL error because VAO and VBOs is not reset when come to foreground on android [FIX] Physics integration: physics body is not still after disabling gravitational force by PhysicsBody::setGravityEnable() [FIX] Sprite3DTest: Sprite3DUVAnimationTest, Sprite3DFakeShadowTest, Sprite3DLightMapTest, Sprite3DBasicToonShaderTest will crash on android when switch to foreground from background [FIX] Template: multiple dex files define error on Android if using Eclipse to build new generated application From 23f20ef910c0757f09abe6f75e9f9ab780a45a01 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Fri, 9 Jan 2015 21:52:54 +0800 Subject: [PATCH 076/106] [ci skip] update release notes --- docs/RELEASE_NOTES.md | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index bd957ad193..00eee090a4 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -5,21 +5,23 @@ - [cocos2d-x v3.4 Release Notes](#) - [Misc Information](#) - [Requirements](#) - - [Runtime Requirements](#) - - [Compiler Requirements](#) - - [How to run tests](#) - - [Mac OSX & iOS](#) - - [Android](#) - - [Windows](#) - - [Linux](#) - - [How to start a new game](#) + - [Runtime Requirements](#) + - [Compiler Requirements](#) + - [How to run tests](#) + - [Mac OSX & iOS](#) + - [Android](#) + - [Windows](#) + - [Linux](#) + - [How to start a new game](#) +- [v3.4rc0](#) + - [Bugs fixed in v3.4rc0](#) - [v3.4beta0](#) - - [Highlights of v3.4beta0](#) - - [Features in detail](#) + - [Highlights of v3.4beta0](#) + - [Features in detail](#) # Misc Information -* Full Changelog: https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x-3.4beta0/CHANGELOG +* Full Changelog: https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x-3.4rc0/CHANGELOG * v3.0 Release Notes can be found here: [v3.0 Release Notes](https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x-3.0/docs/RELEASE_NOTES.md) # Requirements @@ -105,6 +107,16 @@ Run Please refer to this document: [ReadMe](../README.md) +# v3.4rc0 +##Bugs fixed in v3.4rc0 +* FileUtils::GetData() can not get data on windows +* FileUtils::GetData() memory leaks when file size is 0 on windows +* it will crash if GLProgram log compile or link error info on windows +* Assert error exist because of outdated uniforms and attributes in GLProgramState when app come to foreground on android +* GL_INVALID_CALL error because VAO and VBO is not reset when app come to foreground on android +* Update Luajit to v2.0.3, it fix some crash problems on windows +* Update libcurl to new version v7.39.0 +* More bugs fixed # v3.4beta0 From df9713e060bab658de4a2414c132ead540b15703 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Fri, 9 Jan 2015 21:55:59 +0800 Subject: [PATCH 077/106] [ci skip] update release notes --- docs/RELEASE_NOTES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 00eee090a4..ca8454e272 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -111,9 +111,9 @@ Please refer to this document: [ReadMe](../README.md) ##Bugs fixed in v3.4rc0 * FileUtils::GetData() can not get data on windows * FileUtils::GetData() memory leaks when file size is 0 on windows -* it will crash if GLProgram log compile or link error info on windows +* Crash if GLProgram log compile or link error info on windows * Assert error exist because of outdated uniforms and attributes in GLProgramState when app come to foreground on android -* GL_INVALID_CALL error because VAO and VBO is not reset when app come to foreground on android +* GL_INVALID_OPERATION error because VAO and VBO is not reset when app come to foreground on android * Update Luajit to v2.0.3, it fix some crash problems on windows * Update libcurl to new version v7.39.0 * More bugs fixed From b0d1dd2435f4625530d1bbfd023144c1a23e3916 Mon Sep 17 00:00:00 2001 From: Satoshi SUZUKI Date: Sat, 10 Jan 2015 19:30:42 +0900 Subject: [PATCH 078/106] FileUtils::fullPathForFilename should return "" if resource is not found. I Think this method should return empty string when the resource is not found. Because, I cannot check if the file found or not with current implementation. --- cocos/platform/CCFileUtils.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index 7145e3b3cc..a6940f6fe0 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -779,9 +779,8 @@ std::string FileUtils::fullPathForFilename(const std::string &filename) CCLOG("cocos2d: fullPathForFilename: No file found at %s. Possible missing file.", filename.c_str()); } - // FIXME: Should it return nullptr ? or an empty string ? - // The file wasn't found, return the file name passed in. - return filename; + // The file wasn't found, return empty string. + return ""; } std::string FileUtils::fullPathFromRelativeFile(const std::string &filename, const std::string &relativeFile) From 6d297d377bb10c22d213904c73bc5db0b4f5d2b3 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 12 Jan 2015 10:08:55 +0800 Subject: [PATCH 079/106] camera visible check --- cocos/2d/CCScene.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cocos/2d/CCScene.cpp b/cocos/2d/CCScene.cpp index c3adab81b9..fc33b133ec 100644 --- a/cocos/2d/CCScene.cpp +++ b/cocos/2d/CCScene.cpp @@ -126,6 +126,9 @@ void Scene::render(Renderer* renderer) const auto& transform = getNodeToParentTransform(); for (const auto& camera : _cameras) { + if (!camera->isVisible()) + continue; + Camera::_visitingCamera = camera; if (Camera::_visitingCamera->getCameraFlag() == CameraFlag::DEFAULT) { From 20f6839821c9f49cf3ef988e4ee0c46c72bf86c9 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 12 Jan 2015 10:25:15 +0800 Subject: [PATCH 080/106] [ci skip] update CHANGELOG(fix typo) --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 58b11e9123..b03b134b2a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -11,7 +11,7 @@ cocos2d-x-3.4rc0 Jan.9 2015 [FIX] HttpClient: http requests will be lost in immediately mode on iOS [FIX] JumpTo: can not be applied more than once [FIX] Label: may cause infinite loop if using system font on Android - [FIX] Particle: GL_INVALID_CALL error because VAO and VBOs is not reset when come to foreground on android + [FIX] Particle: GL_INVALID_OPERATION error because VAO and VBOs is not reset when come to foreground on android [FIX] Physics integration: physics body is not still after disabling gravitational force by PhysicsBody::setGravityEnable() [FIX] Sprite3DTest: Sprite3DUVAnimationTest, Sprite3DFakeShadowTest, Sprite3DLightMapTest, Sprite3DBasicToonShaderTest will crash on android when switch to foreground from background [FIX] Template: multiple dex files define error on Android if using Eclipse to build new generated application From 489dc2da160b85109bb616a4be02eab2819fa54c Mon Sep 17 00:00:00 2001 From: zhangbin Date: Mon, 12 Jan 2015 10:27:14 +0800 Subject: [PATCH 081/106] 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 9663fc53f3..8abc84bb53 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 9663fc53f3f93311ecef798dca5ea38a52137bb6 +Subproject commit 8abc84bb53caa4bcb96ee227db34507e1e344e9f From 78b32332d3ae2bb40bfacc7823d6fec8b9879949 Mon Sep 17 00:00:00 2001 From: pipu Date: Mon, 12 Jan 2015 10:55:15 +0800 Subject: [PATCH 082/106] Parse InnerActionFrame, AlphaFrame, modify cocostudio editor version number. --- .../ActionTimeline/CCActionTimeline.cpp | 44 +- .../ActionTimeline/CCActionTimeline.h | 21 +- .../ActionTimeline/CCActionTimelineCache.cpp | 328 ++++---- .../ActionTimeline/CCActionTimelineCache.h | 38 +- .../cocostudio/ActionTimeline/CCFrame.cpp | 118 ++- .../cocostudio/ActionTimeline/CCFrame.h | 35 +- .../cocostudio/ActionTimeline/CSLoader.cpp | 44 +- .../cocostudio/ActionTimeline/CSLoader.h | 2 + .../cocostudio/CSParseBinary_generated.h | 482 +++++++----- .../cocostudio/FlatBuffersSerialize.cpp | 706 +++++++++++------- .../cocostudio/FlatBuffersSerialize.h | 37 +- .../ProjectNodeReader/ProjectNodeReader.cpp | 34 +- .../ActionTimelineTestScene.cpp | 24 +- 13 files changed, 1186 insertions(+), 727 deletions(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp index 6ab3e3cf69..f112b125a1 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp @@ -93,14 +93,14 @@ bool ActionTimeline::init() void ActionTimeline::play(std::string name, bool loop) { - if(_indexes.find(name) == _indexes.end()) + if (_animationInfos.find(name) == _animationInfos.end()) { - CCLOG("Cann't find action indexes for %s.", name.c_str()); - return; + CCLOG("Can't find animation info for %s", name.c_str()); + return; } - - ActionIndexes& indexes = _indexes[name]; - gotoFrameAndPlay(indexes.startIndex, indexes.endIndex, loop); + + AnimationInfo& index = _animationInfos[name]; + gotoFrameAndPlay(index.startIndex, index.endIndex, loop); } void ActionTimeline::gotoFrameAndPlay(int startIndex) @@ -278,26 +278,37 @@ void ActionTimeline::removeTimeline(Timeline* timeline) } } -void ActionTimeline::addIndexes(const ActionIndexes& indexes) + +void ActionTimeline::addAnimationInfo(const AnimationInfo& animationInfo) { - if(_indexes.find(indexes.name) != _indexes.end()) + if (_animationInfos.find(animationInfo.name) != _animationInfos.end()) { - CCLOG("ActionIndexes (%s) already exsists.", indexes.name.c_str()); + CCLOG("Animation (%s) already exists.", animationInfo.name.c_str()); return; } - - _indexes[indexes.name] = indexes; + + _animationInfos[animationInfo.name] = animationInfo; } -void ActionTimeline::removeIndexes(std::string name) +void ActionTimeline::removeAnimationInfo(std::string animationName) { - if(_indexes.find(name) == _indexes.end()) + if (_animationInfos.find(animationName) == _animationInfos.end()) { - CCLOG("ActionIndexes %s don't exsists.", name.c_str()); + CCLOG("AnimationInfo (%s) not exists.", animationName.c_str()); return; } - - _indexes.erase(name); + + _animationInfos.erase(animationName); +} + +bool ActionTimeline::IsAnimationInfoExists(const std::string& animationName) +{ + return _animationInfos.find(animationName) != _animationInfos.end(); +} + +AnimationInfo ActionTimeline::getAnimationInfo(const std::string &animationName) +{ + return _animationInfos.find(animationName)->second; } void ActionTimeline::setFrameEventCallFunc(std::function listener) @@ -348,5 +359,4 @@ void ActionTimeline::stepToFrame(int frameIndex) _timelineList.at(i)->stepToFrame(frameIndex); } } - NS_TIMELINE_END diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h index 567188dec2..35dd7ae9cd 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h @@ -31,7 +31,7 @@ THE SOFTWARE. NS_TIMELINE_BEGIN -struct ActionIndexes +struct AnimationInfo { std::string name; int startIndex; @@ -63,9 +63,9 @@ public: ActionTimeline(); virtual ~ActionTimeline(); + virtual void play(std::string animationName, bool loop); + virtual bool init(); - - virtual void play(std::string name, bool loop); /** Goto the specified frame index, and start playing from this index. * @param startIndex The animation will play from this index. @@ -97,7 +97,6 @@ public: * @param startIndex The animation will pause at this index. */ virtual void gotoFrameAndPause(int startIndex); - /** Pause the animation. */ virtual void pause(); @@ -132,12 +131,14 @@ public: /** add Timeline to ActionTimeline */ virtual void addTimeline(Timeline* timeline); virtual void removeTimeline(Timeline* timeline); - - /** add ActionIndexes */ - virtual void addIndexes(const ActionIndexes& indexes); - virtual void removeIndexes(std::string name); - + virtual const cocos2d::Vector& getTimelines() const { return _timelineList; } + + /** add ActionIndexes*/ + virtual void addAnimationInfo(const AnimationInfo& animationInfo); + virtual void removeAnimationInfo(std::string animationName); + virtual bool IsAnimationInfoExists(const std::string& animationName); + virtual AnimationInfo getAnimationInfo(const std::string& animationName); /** Set ActionTimeline's frame event callback function */ void setFrameEventCallFunc(std::function listener); @@ -182,7 +183,7 @@ protected: std::function _frameEventListener; std::function _lastFrameListener; - std::map _indexes; + std::map _animationInfos; }; NS_TIMELINE_END diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp index f6db2f1ae1..be329dc430 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp @@ -47,18 +47,16 @@ using namespace flatbuffers; namespace cocostudio { namespace timeline{ -static const char* FrameType_VisibleFrame = "VisibleFrame"; -static const char* FrameType_PositionFrame = "PositionFrame"; -static const char* FrameType_ScaleFrame = "ScaleFrame"; -static const char* FrameType_RotationFrame = "RotationFrame"; -static const char* FrameType_SkewFrame = "SkewFrame"; -static const char* FrameType_RotationSkewFrame = "RotationSkewFrame"; -static const char* FrameType_AnchorFrame = "AnchorPointFrame"; -static const char* FrameType_InnerActionFrame = "InnerActionFrame"; -static const char* FrameType_ColorFrame = "ColorFrame"; -static const char* FrameType_TextureFrame = "TextureFrame"; -static const char* FrameType_EventFrame = "EventFrame"; -static const char* FrameType_ZOrderFrame = "ZOrderFrame"; +static const char* Property_VisibleForFrame = "VisibleForFrame"; +static const char* Property_Position = "Position"; +static const char* Property_Scale = "Scale"; +static const char* Property_RotationSkew = "RotationSkew"; +static const char* Property_CColor = "CColor"; +static const char* Property_FileData = "FileData"; +static const char* Property_FrameEvent = "FrameEvent"; +static const char* Property_Alpha = "Alpha"; +static const char* Property_ZOrder = "ZOrder"; +static const char* Property_ActionValue = "ActionValue"; static const char* ACTION = "action"; static const char* DURATION = "duration"; @@ -108,6 +106,7 @@ void ActionTimelineCache::purge() void ActionTimelineCache::init() { using namespace std::placeholders; + /* _funcs.insert(Pair(FrameType_VisibleFrame, std::bind(&ActionTimelineCache::loadVisibleFrame, this, _1))); _funcs.insert(Pair(FrameType_PositionFrame, std::bind(&ActionTimelineCache::loadPositionFrame, this, _1))); _funcs.insert(Pair(FrameType_ScaleFrame, std::bind(&ActionTimelineCache::loadScaleFrame, this, _1))); @@ -120,6 +119,7 @@ void ActionTimelineCache::init() _funcs.insert(Pair(FrameType_TextureFrame, std::bind(&ActionTimelineCache::loadTextureFrame, this, _1))); _funcs.insert(Pair(FrameType_EventFrame, std::bind(&ActionTimelineCache::loadEventFrame, this, _1))); _funcs.insert(Pair(FrameType_ZOrderFrame, std::bind(&ActionTimelineCache::loadZOrderFrame, this, _1))); + */ } @@ -439,7 +439,18 @@ ActionTimeline* ActionTimelineCache::loadAnimationActionWithFlatBuffersFile(cons float speed = nodeAction->speed(); action->setTimeSpeed(speed); - + auto animationlist = csparsebinary->animationList(); + int animationcount = animationlist->size(); + for (int i = 0; i < animationcount; i++) + { + auto animationdata = animationlist->Get(i); + AnimationInfo info; + info.name = animationdata->name()->c_str(); + info.startIndex = animationdata->startIndex(); + info.endIndex = animationdata->endIndex(); + action->addAnimationInfo(info); + } + auto timelines = nodeAction->timeLines(); int timelineLength = timelines->size(); for (int i = 0; i < timelineLength; i++) @@ -460,14 +471,14 @@ Timeline* ActionTimelineCache::loadTimelineWithFlatBuffers(const flatbuffers::Ti { Timeline* timeline = nullptr; - // get frame type - std::string frameType = flatbuffers->frameType()->c_str(); - if(frameType == "") + // property + std::string property = flatbuffers->property()->c_str(); + if(property == "") return nullptr; - CCLOG("frameType = %s", frameType.c_str()); + CCLOG("property = %s", property.c_str()); - if(frameType != "") + if(property != "") { timeline = Timeline::create(); @@ -482,68 +493,77 @@ Timeline* ActionTimelineCache::loadTimelineWithFlatBuffers(const flatbuffers::Ti auto frameFlatbuf = framesFlatbuf->Get(i); Frame* frame = nullptr; - if (frameType == FrameType_VisibleFrame) + if (property == Property_VisibleForFrame) { - auto visibleFrame = frameFlatbuf->visibleFrame(); - frame = loadVisibleFrameWithFlatBuffers(visibleFrame); + auto boolFrame = frameFlatbuf->boolFrame(); + frame = loadVisibleFrameWithFlatBuffers(boolFrame); } - else if (frameType == FrameType_ZOrderFrame) + else if (property == Property_Position) { - auto zOrderFrame = frameFlatbuf->zOrderFrame(); - frame = loadZOrderFrameWithFlatBuffers(zOrderFrame); - } - else if (frameType == FrameType_RotationSkewFrame) - { - auto rotationSkewFrame = frameFlatbuf->rotationSkewFrame(); - frame = loadRotationSkewFrameWithFlatBuffers(rotationSkewFrame); - } - else if (frameType == FrameType_EventFrame) - { - auto eventFrame = frameFlatbuf->eventFrame(); - frame = loadEventFrameWithFlatBuffers(eventFrame); - } - else if (frameType == FrameType_AnchorFrame) - { - auto anchorPointFrame = frameFlatbuf->anchorPointFrame(); - frame = loadAnchorPointFrameWithFlatBuffers(anchorPointFrame); - } - else if (frameType == FrameType_PositionFrame) - { - auto potisionFrame = frameFlatbuf->positionFrame(); + auto potisionFrame = frameFlatbuf->pointFrame(); frame = loadPositionFrameWithFlatBuffers(potisionFrame); } - else if (frameType == FrameType_ScaleFrame) + else if (property == Property_Scale) { auto scaleFrame = frameFlatbuf->scaleFrame(); frame = loadScaleFrameWithFlatBuffers(scaleFrame); } - else if (frameType == FrameType_ColorFrame) + else if (property == Property_RotationSkew) + { + auto scaleFrame = frameFlatbuf->scaleFrame(); + frame = loadRotationSkewFrameWithFlatBuffers(scaleFrame); + } + else if (property == Property_CColor) { auto colorFrame = frameFlatbuf->colorFrame(); frame = loadColorFrameWithFlatBuffers(colorFrame); } - else if (frameType == FrameType_TextureFrame) + else if (property == Property_FrameEvent) + { + auto eventFrame = frameFlatbuf->eventFrame(); + frame = loadEventFrameWithFlatBuffers(eventFrame); + } + else if (property == Property_FileData) { auto textureFrame = frameFlatbuf->textureFrame(); frame = loadTextureFrameWithFlatBuffers(textureFrame); } + else if (property == Property_Alpha) + { + auto intFrame = frameFlatbuf->intFrame(); + frame = loadAlphaFrameWithFlatBuffers(intFrame); + } + else if (property == Property_ZOrder) + { + auto intFrame = frameFlatbuf->intFrame(); + frame = loadZOrderFrameWithFlatBuffers(intFrame); + } + else if (property == Property_ActionValue) + { + auto innerActionFrame = frameFlatbuf->innerActionFrame(); + frame = loadInnerActionFrameWithFlatBuffers(innerActionFrame); + } + if (!frame) + { + CCLOG("frame is invalid."); + continue; + } timeline->addFrame(frame); } } return timeline; } - -Frame* ActionTimelineCache::loadVisibleFrameWithFlatBuffers(const flatbuffers::TimeLineBoolFrame *flatbuffers) + +Frame* ActionTimelineCache::loadVisibleFrameWithFlatBuffers(const flatbuffers::BoolFrame *flatbuffers) { VisibleFrame* frame = VisibleFrame::create(); bool visible = flatbuffers->value(); + frame->setVisible(visible); - CCLOG("visible = %d", visible); - int frameIndex = flatbuffers->frameIndex(); frame->setFrameIndex(frameIndex); @@ -552,81 +572,8 @@ Frame* ActionTimelineCache::loadVisibleFrameWithFlatBuffers(const flatbuffers::T return frame; } - -Frame* ActionTimelineCache::loadZOrderFrameWithFlatBuffers(const flatbuffers::TimeLineIntFrame *flatbuffers) -{ - ZOrderFrame* frame = ZOrderFrame::create(); - int zorder = flatbuffers->value(); - frame->setZOrder(zorder); - - CCLOG("zorder = %d", zorder); - - int frameIndex = flatbuffers->frameIndex(); - frame->setFrameIndex(frameIndex); - - bool tween = flatbuffers->tween(); - frame->setTween(tween); - - return frame; -} - -Frame* ActionTimelineCache::loadRotationSkewFrameWithFlatBuffers(const flatbuffers::TimeLinePointFrame *flatbuffers) -{ - RotationSkewFrame* frame = RotationSkewFrame::create(); - - auto f_rotationSkew = flatbuffers->postion(); - Vec2 rotationSkew(f_rotationSkew->x(), f_rotationSkew->y()); - frame->setSkewX(rotationSkew.x); - frame->setSkewY(rotationSkew.y); - - int frameIndex = flatbuffers->frameIndex(); - frame->setFrameIndex(frameIndex); - - bool tween = flatbuffers->tween(); - frame->setTween(tween); - - return frame; -} - -Frame* ActionTimelineCache::loadEventFrameWithFlatBuffers(const flatbuffers::TimeLineStringFrame *flatbuffers) -{ - EventFrame* frame = EventFrame::create(); - - std::string event = flatbuffers->value()->c_str(); - - if (event != "") - frame->setEvent(event); - - CCLOG("event = %s", event.c_str()); - - int frameIndex = flatbuffers->frameIndex(); - frame->setFrameIndex(frameIndex); - - bool tween = flatbuffers->tween(); - frame->setTween(tween); - - return frame; -} - -Frame* ActionTimelineCache::loadAnchorPointFrameWithFlatBuffers(const flatbuffers::TimeLinePointFrame *flatbuffers) -{ - AnchorPointFrame* frame = AnchorPointFrame::create(); - - auto f_anchorPoint = flatbuffers->postion(); - Vec2 anchorPoint(f_anchorPoint->x(), f_anchorPoint->y()); - frame->setAnchorPoint(anchorPoint); - - int frameIndex = flatbuffers->frameIndex(); - frame->setFrameIndex(frameIndex); - - bool tween = flatbuffers->tween(); - frame->setTween(tween); - - return frame; -} - -Frame* ActionTimelineCache::loadPositionFrameWithFlatBuffers(const flatbuffers::TimeLinePointFrame *flatbuffers) +Frame* ActionTimelineCache::loadPositionFrameWithFlatBuffers(const flatbuffers::PointFrame *flatbuffers) { PositionFrame* frame = PositionFrame::create(); @@ -643,12 +590,12 @@ Frame* ActionTimelineCache::loadPositionFrameWithFlatBuffers(const flatbuffers:: return frame; } -Frame* ActionTimelineCache::loadScaleFrameWithFlatBuffers(const flatbuffers::TimeLinePointFrame *flatbuffers) +Frame* ActionTimelineCache::loadScaleFrameWithFlatBuffers(const flatbuffers::ScaleFrame *flatbuffers) { ScaleFrame* frame = ScaleFrame::create(); - auto f_scale = flatbuffers->postion(); - Vec2 scale(f_scale->x(), f_scale->y()); + auto f_scale = flatbuffers->scale(); + Vec2 scale(f_scale->scaleX(), f_scale->scaleY()); frame->setScaleX(scale.x); frame->setScaleY(scale.y); @@ -661,16 +608,14 @@ Frame* ActionTimelineCache::loadScaleFrameWithFlatBuffers(const flatbuffers::Tim return frame; } -Frame* ActionTimelineCache::loadColorFrameWithFlatBuffers(const flatbuffers::TimeLineColorFrame *flatbuffers) +Frame* ActionTimelineCache::loadRotationSkewFrameWithFlatBuffers(const flatbuffers::ScaleFrame *flatbuffers) { - ColorFrame* frame = ColorFrame::create(); + RotationSkewFrame* frame = RotationSkewFrame::create(); - auto f_color = flatbuffers->color(); - Color3B color(f_color->r(), f_color->g(), f_color->b()); - frame->setColor(color); - - int alpha = f_color->a(); - frame->setAlpha(alpha); + auto f_scale = flatbuffers->scale(); + Vec2 rotationSkew(f_scale->scaleX(), f_scale->scaleY()); + frame->setSkewX(rotationSkew.x); + frame->setSkewY(rotationSkew.y); int frameIndex = flatbuffers->frameIndex(); frame->setFrameIndex(frameIndex); @@ -681,7 +626,24 @@ Frame* ActionTimelineCache::loadColorFrameWithFlatBuffers(const flatbuffers::Tim return frame; } -Frame* ActionTimelineCache::loadTextureFrameWithFlatBuffers(const flatbuffers::TimeLineTextureFrame *flatbuffers) +Frame* ActionTimelineCache::loadColorFrameWithFlatBuffers(const flatbuffers::ColorFrame *flatbuffers) +{ + ColorFrame* frame = ColorFrame::create(); + + auto f_color = flatbuffers->color(); + Color3B color(f_color->r(), f_color->g(), f_color->b()); + frame->setColor(color); + + int frameIndex = flatbuffers->frameIndex(); + frame->setFrameIndex(frameIndex); + + bool tween = flatbuffers->tween(); + frame->setTween(tween); + + return frame; +} + +Frame* ActionTimelineCache::loadTextureFrameWithFlatBuffers(const flatbuffers::TextureFrame *flatbuffers) { std::string path = ""; int resourceType = 0; @@ -689,7 +651,7 @@ Frame* ActionTimelineCache::loadTextureFrameWithFlatBuffers(const flatbuffers::T TextureFrame* frame = TextureFrame::create(); - auto fileNameData = flatbuffers->fileNameData(); + auto fileNameData = flatbuffers->textureFile(); resourceType = fileNameData->resourceType(); switch (resourceType) @@ -727,7 +689,6 @@ Frame* ActionTimelineCache::loadTextureFrameWithFlatBuffers(const flatbuffers::T break; } - frame->setTextureName(path); int frameIndex = flatbuffers->frameIndex(); @@ -739,6 +700,85 @@ Frame* ActionTimelineCache::loadTextureFrameWithFlatBuffers(const flatbuffers::T return frame; } +Frame* ActionTimelineCache::loadEventFrameWithFlatBuffers(const flatbuffers::EventFrame *flatbuffers) +{ + EventFrame* frame = EventFrame::create(); + + std::string event = flatbuffers->value()->c_str(); + + if (event != "") + frame->setEvent(event); + + CCLOG("event = %s", event.c_str()); + + int frameIndex = flatbuffers->frameIndex(); + frame->setFrameIndex(frameIndex); + + bool tween = flatbuffers->tween(); + frame->setTween(tween); + + return frame; +} + +Frame* ActionTimelineCache::loadAlphaFrameWithFlatBuffers(const flatbuffers::IntFrame *flatbuffers) +{ + AlphaFrame* frame = AlphaFrame::create(); + + int alpha = flatbuffers->value(); + + frame->setAlpha(alpha); + + int frameIndex = flatbuffers->frameIndex(); + frame->setFrameIndex(frameIndex); + + bool tween = flatbuffers->tween(); + frame->setTween(tween); + + return frame; +} + +Frame* ActionTimelineCache::loadZOrderFrameWithFlatBuffers(const flatbuffers::IntFrame *flatbuffers) +{ + ZOrderFrame* frame = ZOrderFrame::create(); + + int zorder = flatbuffers->value(); + + frame->setZOrder(zorder); + + int frameIndex = flatbuffers->frameIndex(); + frame->setFrameIndex(frameIndex); + + bool tween = flatbuffers->tween(); + frame->setTween(tween); + + return frame; +} + +Frame* ActionTimelineCache::loadInnerActionFrameWithFlatBuffers(const flatbuffers::InnerActionFrame *flatbuffers) +{ + InnerActionFrame* frame = InnerActionFrame::create(); + + InnerActionType innerActionType = (InnerActionType)flatbuffers->innerActionType(); + + std::string currentAnimationFrame = flatbuffers->currentAniamtionName()->c_str(); + + int singleFrameIndex = flatbuffers->singleFrameIndex(); + + int frameIndex = flatbuffers->frameIndex(); + frame->setFrameIndex(frameIndex); + + bool tween = flatbuffers->tween(); + frame->setTween(tween); + + frame->setInnerActionType(innerActionType); + frame->setSingleFrameIndex(singleFrameIndex); + + frame->setEnterWithName(true); + frame->setAnimationName(currentAnimationFrame); + + return frame; +} + ActionTimeline* ActionTimelineCache::createActionWithFlatBuffersForSimulator(const std::string& fileName) { FlatBuffersSerialize* fbs = FlatBuffersSerialize::getInstance(); @@ -758,6 +798,18 @@ ActionTimeline* ActionTimelineCache::createActionWithFlatBuffersForSimulator(con float speed = nodeAction->speed(); action->setTimeSpeed(speed); + auto animationlist = csparsebinary->animationList(); + int animationcount = animationlist->size(); + for (int i = 0; i < animationcount; i++) + { + auto animationdata = animationlist->Get(i); + AnimationInfo info; + info.name = animationdata->name()->c_str(); + info.startIndex = animationdata->startIndex(); + info.endIndex = animationdata->endIndex(); + action->addAnimationInfo(info); + } + auto timeLines = nodeAction->timeLines(); int timelineLength = timeLines->size(); for (int i = 0; i < timelineLength; i++) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.h b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.h index 08612740db..700a5feacd 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.h @@ -38,12 +38,14 @@ namespace flatbuffers struct NodeAction; struct TimeLine; - struct TimeLineBoolFrame; - struct TimeLineIntFrame; - struct TimeLineStringFrame; - struct TimeLinePointFrame; - struct TimeLineColorFrame; - struct TimeLineTextureFrame; + struct PointFrame; + struct ScaleFrame; + struct ColorFrame; + struct TextureFrame; + struct EventFrame; + struct IntFrame; + struct BoolFrame; + struct InnerActionFrame; } NS_TIMELINE_BEGIN @@ -54,7 +56,8 @@ class Frame; class CC_STUDIO_DLL ActionTimelineCache { -public: +public: + /** Gets the singleton */ static ActionTimelineCache* getInstance(); @@ -100,16 +103,17 @@ protected: Timeline* loadTimelineWithFlatBuffers(const flatbuffers::TimeLine* flatbuffers); - - Frame* loadVisibleFrameWithFlatBuffers (const flatbuffers::TimeLineBoolFrame* flatbuffers); - Frame* loadZOrderFrameWithFlatBuffers (const flatbuffers::TimeLineIntFrame* flatbuffers); - Frame* loadRotationSkewFrameWithFlatBuffers (const flatbuffers::TimeLinePointFrame* flatbuffers); - Frame* loadEventFrameWithFlatBuffers (const flatbuffers::TimeLineStringFrame* flatbuffers); - Frame* loadAnchorPointFrameWithFlatBuffers (const flatbuffers::TimeLinePointFrame* flatbuffers); - Frame* loadPositionFrameWithFlatBuffers (const flatbuffers::TimeLinePointFrame* flatbuffers); - Frame* loadScaleFrameWithFlatBuffers (const flatbuffers::TimeLinePointFrame* flatbuffers); - Frame* loadColorFrameWithFlatBuffers (const flatbuffers::TimeLineColorFrame* flatbuffers); - Frame* loadTextureFrameWithFlatBuffers (const flatbuffers::TimeLineTextureFrame* flatbuffers); + + Frame* loadVisibleFrameWithFlatBuffers (const flatbuffers::BoolFrame* flatbuffers); + Frame* loadPositionFrameWithFlatBuffers (const flatbuffers::PointFrame* flatbuffers); + Frame* loadScaleFrameWithFlatBuffers (const flatbuffers::ScaleFrame* flatbuffers); + Frame* loadRotationSkewFrameWithFlatBuffers (const flatbuffers::ScaleFrame* flatbuffers); + Frame* loadColorFrameWithFlatBuffers (const flatbuffers::ColorFrame* flatbuffers); + Frame* loadTextureFrameWithFlatBuffers (const flatbuffers::TextureFrame* flatbuffers); + Frame* loadEventFrameWithFlatBuffers (const flatbuffers::EventFrame* flatbuffers); + Frame* loadAlphaFrameWithFlatBuffers (const flatbuffers::IntFrame* flatbuffers); + Frame* loadZOrderFrameWithFlatBuffers (const flatbuffers::IntFrame* flatbuffers); + Frame* loadInnerActionFrameWithFlatBuffers (const flatbuffers::InnerActionFrame* flatbuffers); protected: diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp index dc0595fbf0..b5ed343624 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp @@ -27,6 +27,8 @@ THE SOFTWARE. #include "CCActionTimeline.h" #include "2d/CCSpriteFrameCache.h" #include "2d/CCSpriteFrame.h" +#include +#include USING_NS_CC; @@ -466,20 +468,89 @@ InnerActionFrame* InnerActionFrame::create() InnerActionFrame::InnerActionFrame() : _innerActionType(LoopAction) , _startFrameIndex(0) + , _endFrameIndex(0) { + } void InnerActionFrame::onEnter(Frame *nextFrame, int currentFrameIndex) { + int start = _startFrameIndex; + int end = _endFrameIndex; + auto actiontimeline = static_cast(_node->getActionByTag(_node->getTag())); + if (InnerActionType::SingleFrame == _innerActionType) + { + actiontimeline->gotoFrameAndPause(_singleFrameIndex); + return; + } + + if (_enterWithName) + { + if (_animationName == "-- ALL --") + { + start = 0; + end = actiontimeline->getDuration(); + } + else if(actiontimeline->IsAnimationInfoExists(_animationName)) + { + AnimationInfo info = actiontimeline->getAnimationInfo(_animationName); + start = info.startIndex; + end = info.endIndex; + } + else + { + CCLOG("Animation %s not exists!", _animationName.c_str()); + } + } + + if (InnerActionType::NoLoopAction == _innerActionType) + { + actiontimeline->gotoFrameAndPlay(start, end, false); + } + else if (InnerActionType::LoopAction == _innerActionType) + { + actiontimeline->gotoFrameAndPlay(start, end, true); + } } +void InnerActionFrame::setStartFrameIndex(int frameIndex) throw() +{ + if(_enterWithName) + { + CCLOG(" cannot set start when enter frame with name. setEnterWithName false firstly!"); + throw std::exception(); + } + _startFrameIndex = frameIndex; +} + + +void InnerActionFrame::setEndFrameIndex(int frameIndex) throw() +{ + if(_enterWithName) + { + CCLOG(" cannot set end when enter frame with name. setEnterWithName false firstly!"); + throw std::exception(); + } + _endFrameIndex = frameIndex; +} + +void InnerActionFrame::setAnimationName(const std::string& animationName) throw() +{ + if(!_enterWithName) + { + CCLOG(" cannot set aniamtioname when enter frame with index. setEnterWithName true firstly!"); + throw std::exception(); + } + _animationName = animationName; + +} Frame* InnerActionFrame::clone() { InnerActionFrame* frame = InnerActionFrame::create(); frame->setInnerActionType(_innerActionType); frame->setStartFrameIndex(_startFrameIndex); - + frame->setEndFrameIndex(_endFrameIndex); frame->cloneProperty(this); return frame; @@ -548,6 +619,51 @@ Frame* ColorFrame::clone() return frame; } +// AlphaFrame +AlphaFrame* AlphaFrame::create() +{ + AlphaFrame* frame = new (std::nothrow) AlphaFrame(); + if (frame) + { + frame->autorelease(); + return frame; + } + CC_SAFE_DELETE(frame); + return nullptr; +} + +AlphaFrame::AlphaFrame() + : _alpha(255) +{ +} + +void AlphaFrame::onEnter(Frame *nextFrame, int currentFrameIndex) +{ + _node->setOpacity(_alpha); + + if (_tween) + { + _betweenAlpha = static_cast(nextFrame)->_alpha - _alpha; + } +} + +void AlphaFrame::apply(float percent) +{ + if (_tween) + { + GLubyte alpha = _alpha + _betweenAlpha * percent; + _node->setOpacity(alpha); + } +} + +Frame* AlphaFrame::clone() +{ + AlphaFrame* frame = AlphaFrame::create(); + frame->setAlpha(_alpha); + frame->cloneProperty(this); + + return frame; +} // EventFrame EventFrame* EventFrame::create() diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h index e5d411f159..1e2b6df5ef 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h @@ -263,13 +263,27 @@ public: inline void setInnerActionType(InnerActionType type) { _innerActionType = type; } inline InnerActionType getInnerActionType() const { return _innerActionType; } - - inline void setStartFrameIndex(int frameIndex) { _startFrameIndex = frameIndex; } + + inline void setEnterWithName(bool isEnterWithName) { _enterWithName = isEnterWithName;} + + void setStartFrameIndex(int frameIndex) throw(); inline int getStartFrameIndex() const { return _startFrameIndex; } + void setEndFrameIndex(int frameIndex) throw(); + inline int getEndFrameIndex() const { return _endFrameIndex; } + + void setAnimationName(const std::string& animationNamed) throw(); + + inline void setSingleFrameIndex(int frameIndex) { _singleFrameIndex = frameIndex;} + inline int getSingleFrameIndex() const { return _singleFrameIndex;} + protected: InnerActionType _innerActionType; int _startFrameIndex; + int _endFrameIndex; + int _singleFrameIndex; + std::string _animationName; + bool _enterWithName; }; @@ -299,6 +313,23 @@ protected: int _betweenBlue; }; +class CC_STUDIO_DLL AlphaFrame : public Frame +{ +public: + static AlphaFrame* create(); + AlphaFrame(); + + virtual void onEnter(Frame *nextFrame, int currentFrameIndex) override; + virtual void apply(float percent) override; + virtual Frame* clone() override; + + inline void setAlpha(GLubyte alpha) { _alpha = alpha; } + inline GLubyte getAlpha() const { return _alpha; } + +protected: + GLubyte _alpha; + int _betweenAlpha; +}; class CC_STUDIO_DLL EventFrame : public Frame { diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp index a43591bccf..ed9af698af 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp @@ -181,7 +181,7 @@ CSLoader::CSLoader() , _jsonPath("") , _monoCocos2dxVersion("") , _rootNode(nullptr) -, _csBuildID("2.0.8.0") +, _csBuildID("2.1.0.0") { CREATE_CLASS_NODE_READER_INFO(NodeReader); CREATE_CLASS_NODE_READER_INFO(SingleNodeReader); @@ -285,6 +285,7 @@ ActionTimeline* CSLoader::createTimeline(const std::string &filename) return nullptr; } +/* ActionTimelineNode* CSLoader::createActionTimelineNode(const std::string& filename) { Node* root = createNode(filename); @@ -308,6 +309,7 @@ ActionTimelineNode* CSLoader::createActionTimelineNode(const std::string& filena return node; } + */ @@ -833,29 +835,16 @@ Node* CSLoader::nodeWithFlatBuffers(const flatbuffers::NodeTree *nodetree) CCLOG("filePath = %s", filePath.c_str()); if (filePath != "" && FileUtils::getInstance()->isFileExist(filePath)) { - - Node* root = createNodeWithFlatBuffersFile(filePath); - reader->setPropsWithFlatBuffers(root, options->data()); - - bool isloop = projectNodeOptions->isLoop(); - bool isautoplay = projectNodeOptions->isAutoPlay(); - + + node = createNodeWithFlatBuffersFile(filePath); + reader->setPropsWithFlatBuffers(node, options->data()); + cocostudio::timeline::ActionTimeline* action = cocostudio::timeline::ActionTimelineCache::getInstance()->createActionWithFlatBuffersFile(filePath); if (action) { - root->runAction(action); - if (isautoplay) - { - action->gotoFrameAndPlay(0, isloop); - } - else - { - action->gotoFrameAndPause(0); - } + node->runAction(action); } - - node = ActionTimelineNode::create(root, action); - node->setName(root->getName()); + } } else if (classname == "SimpleAudio") @@ -1182,22 +1171,11 @@ Node* CSLoader::nodeWithFlatBuffersForSimulator(const flatbuffers::NodeTree *nod { node = createNodeWithFlatBuffersForSimulator(filePath); reader->setPropsWithFlatBuffers(node, options->data()); - - bool isloop = projectNodeOptions->isLoop(); - bool isautoplay = projectNodeOptions->isAutoPlay(); - cocostudio::timeline::ActionTimeline* action = cocostudio::timeline::ActionTimelineCache::getInstance()->createActionWithFlatBuffersFile(filePath); + + cocostudio::timeline::ActionTimeline* action = cocostudio::timeline::ActionTimelineCache::getInstance()->createActionWithFlatBuffersForSimulator(filePath); if (action) { node->runAction(action); - action->gotoFrameAndPlay(0); - if (isautoplay) - { - action->gotoFrameAndPlay(0, isloop); - } - else - { - action->gotoFrameAndPause(0); - } } } } diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.h b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.h index 505645e5fc..a3fc4cab41 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.h @@ -77,8 +77,10 @@ public: static cocos2d::Node* createNode(const std::string& filename); static cocostudio::timeline::ActionTimeline* createTimeline(const std::string& filename); + /* static cocostudio::timeline::ActionTimelineNode* createActionTimelineNode(const std::string& filename); static cocostudio::timeline::ActionTimelineNode* createActionTimelineNode(const std::string& filename, int startIndex, int endIndex, bool loop); + */ cocos2d::Node* createNodeFromJson(const std::string& filename); cocos2d::Node* loadNodeWithFile(const std::string& fileName); diff --git a/cocos/editor-support/cocostudio/CSParseBinary_generated.h b/cocos/editor-support/cocostudio/CSParseBinary_generated.h index d4ebff7371..2f2d5b0220 100644 --- a/cocos/editor-support/cocostudio/CSParseBinary_generated.h +++ b/cocos/editor-support/cocostudio/CSParseBinary_generated.h @@ -33,15 +33,18 @@ struct ListViewOptions; struct ProjectNodeOptions; struct ComponentOptions; struct ComAudioOptions; +struct AnimationInfo; struct NodeAction; struct TimeLine; struct Frame; -struct TimeLineBoolFrame; -struct TimeLineIntFrame; -struct TimeLineStringFrame; -struct TimeLinePointFrame; -struct TimeLineColorFrame; -struct TimeLineTextureFrame; +struct PointFrame; +struct ScaleFrame; +struct ColorFrame; +struct TextureFrame; +struct EventFrame; +struct IntFrame; +struct BoolFrame; +struct InnerActionFrame; struct RotationSkew; struct Position; struct Scale; @@ -177,7 +180,8 @@ struct CSParseBinary : private flatbuffers::Table { const flatbuffers::Vector> *texturePngs() const { return GetPointer> *>(6); } const NodeTree *nodeTree() const { return GetPointer(8); } const NodeAction *action() const { return GetPointer(10); } - const flatbuffers::String *version() const { return GetPointer(12); } + const flatbuffers::Vector> *animationList() const { return GetPointer> *>(12); } + const flatbuffers::String *version() const { return GetPointer(14); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, 4 /* textures */) && @@ -190,7 +194,10 @@ struct CSParseBinary : private flatbuffers::Table { verifier.VerifyTable(nodeTree()) && VerifyField(verifier, 10 /* action */) && verifier.VerifyTable(action()) && - VerifyField(verifier, 12 /* version */) && + VerifyField(verifier, 12 /* animationList */) && + verifier.Verify(animationList()) && + verifier.VerifyVectorOfTables(animationList()) && + VerifyField(verifier, 14 /* version */) && verifier.Verify(version()) && verifier.EndTable(); } @@ -203,11 +210,12 @@ struct CSParseBinaryBuilder { void add_texturePngs(flatbuffers::Offset>> texturePngs) { fbb_.AddOffset(6, texturePngs); } void add_nodeTree(flatbuffers::Offset nodeTree) { fbb_.AddOffset(8, nodeTree); } void add_action(flatbuffers::Offset action) { fbb_.AddOffset(10, action); } - void add_version(flatbuffers::Offset version) { fbb_.AddOffset(12, version); } + void add_animationList(flatbuffers::Offset>> animationList) { fbb_.AddOffset(12, animationList); } + void add_version(flatbuffers::Offset version) { fbb_.AddOffset(14, version); } CSParseBinaryBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } CSParseBinaryBuilder &operator=(const CSParseBinaryBuilder &); flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 5)); + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 6)); return o; } }; @@ -217,9 +225,11 @@ inline flatbuffers::Offset CreateCSParseBinary(flatbuffers::FlatB flatbuffers::Offset>> texturePngs = 0, flatbuffers::Offset nodeTree = 0, flatbuffers::Offset action = 0, + flatbuffers::Offset>> animationList = 0, flatbuffers::Offset version = 0) { CSParseBinaryBuilder builder_(_fbb); builder_.add_version(version); + builder_.add_animationList(animationList); builder_.add_action(action); builder_.add_nodeTree(nodeTree); builder_.add_texturePngs(texturePngs); @@ -1675,16 +1685,12 @@ inline flatbuffers::Offset CreateListViewOptions(flatbuffers::F struct ProjectNodeOptions : private flatbuffers::Table { const WidgetOptions *nodeOptions() const { return GetPointer(4); } const flatbuffers::String *fileName() const { return GetPointer(6); } - uint8_t isLoop() const { return GetField(8, 1); } - uint8_t isAutoPlay() const { return GetField(10, 1); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, 4 /* nodeOptions */) && verifier.VerifyTable(nodeOptions()) && VerifyField(verifier, 6 /* fileName */) && verifier.Verify(fileName()) && - VerifyField(verifier, 8 /* isLoop */) && - VerifyField(verifier, 10 /* isAutoPlay */) && verifier.EndTable(); } }; @@ -1694,26 +1700,20 @@ struct ProjectNodeOptionsBuilder { flatbuffers::uoffset_t start_; void add_nodeOptions(flatbuffers::Offset nodeOptions) { fbb_.AddOffset(4, nodeOptions); } void add_fileName(flatbuffers::Offset fileName) { fbb_.AddOffset(6, fileName); } - void add_isLoop(uint8_t isLoop) { fbb_.AddElement(8, isLoop, 1); } - void add_isAutoPlay(uint8_t isAutoPlay) { fbb_.AddElement(10, isAutoPlay, 1); } ProjectNodeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } ProjectNodeOptionsBuilder &operator=(const ProjectNodeOptionsBuilder &); flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 4)); + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 2)); return o; } }; inline flatbuffers::Offset CreateProjectNodeOptions(flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset nodeOptions = 0, - flatbuffers::Offset fileName = 0, - uint8_t isLoop = 1, - uint8_t isAutoPlay = 1) { + flatbuffers::Offset fileName = 0) { ProjectNodeOptionsBuilder builder_(_fbb); builder_.add_fileName(fileName); builder_.add_nodeOptions(nodeOptions); - builder_.add_isAutoPlay(isAutoPlay); - builder_.add_isLoop(isLoop); return builder_.Finish(); } @@ -1814,10 +1814,50 @@ inline flatbuffers::Offset CreateComAudioOptions(flatbuffers::F return builder_.Finish(); } +struct AnimationInfo : private flatbuffers::Table { + const flatbuffers::String *name() const { return GetPointer(4); } + int32_t startIndex() const { return GetField(6, 0); } + int32_t endIndex() const { return GetField(8, 0); } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, 4 /* name */) && + verifier.Verify(name()) && + VerifyField(verifier, 6 /* startIndex */) && + VerifyField(verifier, 8 /* endIndex */) && + verifier.EndTable(); + } +}; + +struct AnimationInfoBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) { fbb_.AddOffset(4, name); } + void add_startIndex(int32_t startIndex) { fbb_.AddElement(6, startIndex, 0); } + void add_endIndex(int32_t endIndex) { fbb_.AddElement(8, endIndex, 0); } + AnimationInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + AnimationInfoBuilder &operator=(const AnimationInfoBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + return o; + } +}; + +inline flatbuffers::Offset CreateAnimationInfo(flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + int32_t startIndex = 0, + int32_t endIndex = 0) { + AnimationInfoBuilder builder_(_fbb); + builder_.add_endIndex(endIndex); + builder_.add_startIndex(startIndex); + builder_.add_name(name); + return builder_.Finish(); +} + struct NodeAction : private flatbuffers::Table { int32_t duration() const { return GetField(4, 0); } float speed() const { return GetField(6, 0); } const flatbuffers::Vector> *timeLines() const { return GetPointer> *>(8); } + const flatbuffers::String *currentAnimationName() const { return GetPointer(10); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, 4 /* duration */) && @@ -1825,6 +1865,8 @@ struct NodeAction : private flatbuffers::Table { VerifyField(verifier, 8 /* timeLines */) && verifier.Verify(timeLines()) && verifier.VerifyVectorOfTables(timeLines()) && + VerifyField(verifier, 10 /* currentAnimationName */) && + verifier.Verify(currentAnimationName()) && verifier.EndTable(); } }; @@ -1835,10 +1877,11 @@ struct NodeActionBuilder { void add_duration(int32_t duration) { fbb_.AddElement(4, duration, 0); } void add_speed(float speed) { fbb_.AddElement(6, speed, 0); } void add_timeLines(flatbuffers::Offset>> timeLines) { fbb_.AddOffset(8, timeLines); } + void add_currentAnimationName(flatbuffers::Offset currentAnimationName) { fbb_.AddOffset(10, currentAnimationName); } NodeActionBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } NodeActionBuilder &operator=(const NodeActionBuilder &); flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 4)); return o; } }; @@ -1846,8 +1889,10 @@ struct NodeActionBuilder { inline flatbuffers::Offset CreateNodeAction(flatbuffers::FlatBufferBuilder &_fbb, int32_t duration = 0, float speed = 0, - flatbuffers::Offset>> timeLines = 0) { + flatbuffers::Offset>> timeLines = 0, + flatbuffers::Offset currentAnimationName = 0) { NodeActionBuilder builder_(_fbb); + builder_.add_currentAnimationName(currentAnimationName); builder_.add_timeLines(timeLines); builder_.add_speed(speed); builder_.add_duration(duration); @@ -1855,13 +1900,13 @@ inline flatbuffers::Offset CreateNodeAction(flatbuffers::FlatBufferB } struct TimeLine : private flatbuffers::Table { - const flatbuffers::String *frameType() const { return GetPointer(4); } + const flatbuffers::String *property() const { return GetPointer(4); } int32_t actionTag() const { return GetField(6, 0); } const flatbuffers::Vector> *frames() const { return GetPointer> *>(8); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && - VerifyField(verifier, 4 /* frameType */) && - verifier.Verify(frameType()) && + VerifyField(verifier, 4 /* property */) && + verifier.Verify(property()) && VerifyField(verifier, 6 /* actionTag */) && VerifyField(verifier, 8 /* frames */) && verifier.Verify(frames()) && @@ -1873,7 +1918,7 @@ struct TimeLine : private flatbuffers::Table { struct TimeLineBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; - void add_frameType(flatbuffers::Offset frameType) { fbb_.AddOffset(4, frameType); } + void add_property(flatbuffers::Offset property) { fbb_.AddOffset(4, property); } void add_actionTag(int32_t actionTag) { fbb_.AddElement(6, actionTag, 0); } void add_frames(flatbuffers::Offset>> frames) { fbb_.AddOffset(8, frames); } TimeLineBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } @@ -1885,46 +1930,43 @@ struct TimeLineBuilder { }; inline flatbuffers::Offset CreateTimeLine(flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset frameType = 0, + flatbuffers::Offset property = 0, int32_t actionTag = 0, flatbuffers::Offset>> frames = 0) { TimeLineBuilder builder_(_fbb); builder_.add_frames(frames); builder_.add_actionTag(actionTag); - builder_.add_frameType(frameType); + builder_.add_property(property); return builder_.Finish(); } struct Frame : private flatbuffers::Table { - const TimeLineBoolFrame *visibleFrame() const { return GetPointer(4); } - const TimeLineIntFrame *zOrderFrame() const { return GetPointer(6); } - const TimeLinePointFrame *rotationSkewFrame() const { return GetPointer(8); } - const TimeLineStringFrame *eventFrame() const { return GetPointer(10); } - const TimeLinePointFrame *anchorPointFrame() const { return GetPointer(12); } - const TimeLinePointFrame *positionFrame() const { return GetPointer(14); } - const TimeLinePointFrame *scaleFrame() const { return GetPointer(16); } - const TimeLineColorFrame *colorFrame() const { return GetPointer(18); } - const TimeLineTextureFrame *textureFrame() const { return GetPointer(20); } + const PointFrame *pointFrame() const { return GetPointer(4); } + const ScaleFrame *scaleFrame() const { return GetPointer(6); } + const ColorFrame *colorFrame() const { return GetPointer(8); } + const TextureFrame *textureFrame() const { return GetPointer(10); } + const EventFrame *eventFrame() const { return GetPointer(12); } + const IntFrame *intFrame() const { return GetPointer(14); } + const BoolFrame *boolFrame() const { return GetPointer(16); } + const InnerActionFrame *innerActionFrame() const { return GetPointer(18); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && - VerifyField(verifier, 4 /* visibleFrame */) && - verifier.VerifyTable(visibleFrame()) && - VerifyField(verifier, 6 /* zOrderFrame */) && - verifier.VerifyTable(zOrderFrame()) && - VerifyField(verifier, 8 /* rotationSkewFrame */) && - verifier.VerifyTable(rotationSkewFrame()) && - VerifyField(verifier, 10 /* eventFrame */) && - verifier.VerifyTable(eventFrame()) && - VerifyField(verifier, 12 /* anchorPointFrame */) && - verifier.VerifyTable(anchorPointFrame()) && - VerifyField(verifier, 14 /* positionFrame */) && - verifier.VerifyTable(positionFrame()) && - VerifyField(verifier, 16 /* scaleFrame */) && + VerifyField(verifier, 4 /* pointFrame */) && + verifier.VerifyTable(pointFrame()) && + VerifyField(verifier, 6 /* scaleFrame */) && verifier.VerifyTable(scaleFrame()) && - VerifyField(verifier, 18 /* colorFrame */) && + VerifyField(verifier, 8 /* colorFrame */) && verifier.VerifyTable(colorFrame()) && - VerifyField(verifier, 20 /* textureFrame */) && + VerifyField(verifier, 10 /* textureFrame */) && verifier.VerifyTable(textureFrame()) && + VerifyField(verifier, 12 /* eventFrame */) && + verifier.VerifyTable(eventFrame()) && + VerifyField(verifier, 14 /* intFrame */) && + verifier.VerifyTable(intFrame()) && + VerifyField(verifier, 16 /* boolFrame */) && + verifier.VerifyTable(boolFrame()) && + VerifyField(verifier, 18 /* innerActionFrame */) && + verifier.VerifyTable(innerActionFrame()) && verifier.EndTable(); } }; @@ -1932,123 +1974,197 @@ struct Frame : private flatbuffers::Table { struct FrameBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; - void add_visibleFrame(flatbuffers::Offset visibleFrame) { fbb_.AddOffset(4, visibleFrame); } - void add_zOrderFrame(flatbuffers::Offset zOrderFrame) { fbb_.AddOffset(6, zOrderFrame); } - void add_rotationSkewFrame(flatbuffers::Offset rotationSkewFrame) { fbb_.AddOffset(8, rotationSkewFrame); } - void add_eventFrame(flatbuffers::Offset eventFrame) { fbb_.AddOffset(10, eventFrame); } - void add_anchorPointFrame(flatbuffers::Offset anchorPointFrame) { fbb_.AddOffset(12, anchorPointFrame); } - void add_positionFrame(flatbuffers::Offset positionFrame) { fbb_.AddOffset(14, positionFrame); } - void add_scaleFrame(flatbuffers::Offset scaleFrame) { fbb_.AddOffset(16, scaleFrame); } - void add_colorFrame(flatbuffers::Offset colorFrame) { fbb_.AddOffset(18, colorFrame); } - void add_textureFrame(flatbuffers::Offset textureFrame) { fbb_.AddOffset(20, textureFrame); } + void add_pointFrame(flatbuffers::Offset pointFrame) { fbb_.AddOffset(4, pointFrame); } + void add_scaleFrame(flatbuffers::Offset scaleFrame) { fbb_.AddOffset(6, scaleFrame); } + void add_colorFrame(flatbuffers::Offset colorFrame) { fbb_.AddOffset(8, colorFrame); } + void add_textureFrame(flatbuffers::Offset textureFrame) { fbb_.AddOffset(10, textureFrame); } + void add_eventFrame(flatbuffers::Offset eventFrame) { fbb_.AddOffset(12, eventFrame); } + void add_intFrame(flatbuffers::Offset intFrame) { fbb_.AddOffset(14, intFrame); } + void add_boolFrame(flatbuffers::Offset boolFrame) { fbb_.AddOffset(16, boolFrame); } + void add_innerActionFrame(flatbuffers::Offset innerActionFrame) { fbb_.AddOffset(18, innerActionFrame); } FrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } FrameBuilder &operator=(const FrameBuilder &); flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 9)); + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 8)); return o; } }; inline flatbuffers::Offset CreateFrame(flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset visibleFrame = 0, - flatbuffers::Offset zOrderFrame = 0, - flatbuffers::Offset rotationSkewFrame = 0, - flatbuffers::Offset eventFrame = 0, - flatbuffers::Offset anchorPointFrame = 0, - flatbuffers::Offset positionFrame = 0, - flatbuffers::Offset scaleFrame = 0, - flatbuffers::Offset colorFrame = 0, - flatbuffers::Offset textureFrame = 0) { + flatbuffers::Offset pointFrame = 0, + flatbuffers::Offset scaleFrame = 0, + flatbuffers::Offset colorFrame = 0, + flatbuffers::Offset textureFrame = 0, + flatbuffers::Offset eventFrame = 0, + flatbuffers::Offset intFrame = 0, + flatbuffers::Offset boolFrame = 0, + flatbuffers::Offset innerActionFrame = 0) { FrameBuilder builder_(_fbb); + builder_.add_innerActionFrame(innerActionFrame); + builder_.add_boolFrame(boolFrame); + builder_.add_intFrame(intFrame); + builder_.add_eventFrame(eventFrame); builder_.add_textureFrame(textureFrame); builder_.add_colorFrame(colorFrame); builder_.add_scaleFrame(scaleFrame); - builder_.add_positionFrame(positionFrame); - builder_.add_anchorPointFrame(anchorPointFrame); - builder_.add_eventFrame(eventFrame); - builder_.add_rotationSkewFrame(rotationSkewFrame); - builder_.add_zOrderFrame(zOrderFrame); - builder_.add_visibleFrame(visibleFrame); + builder_.add_pointFrame(pointFrame); return builder_.Finish(); } -struct TimeLineBoolFrame : private flatbuffers::Table { +struct PointFrame : private flatbuffers::Table { int32_t frameIndex() const { return GetField(4, 0); } uint8_t tween() const { return GetField(6, 1); } - uint8_t value() const { return GetField(8, 0); } + const Position *postion() const { return GetStruct(8); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, 4 /* frameIndex */) && VerifyField(verifier, 6 /* tween */) && - VerifyField(verifier, 8 /* value */) && + VerifyField(verifier, 8 /* postion */) && verifier.EndTable(); } }; -struct TimeLineBoolFrameBuilder { +struct PointFrameBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_frameIndex(int32_t frameIndex) { fbb_.AddElement(4, frameIndex, 0); } void add_tween(uint8_t tween) { fbb_.AddElement(6, tween, 1); } - void add_value(uint8_t value) { fbb_.AddElement(8, value, 0); } - TimeLineBoolFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - TimeLineBoolFrameBuilder &operator=(const TimeLineBoolFrameBuilder &); - flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + void add_postion(const Position *postion) { fbb_.AddStruct(8, postion); } + PointFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + PointFrameBuilder &operator=(const PointFrameBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); return o; } }; -inline flatbuffers::Offset CreateTimeLineBoolFrame(flatbuffers::FlatBufferBuilder &_fbb, +inline flatbuffers::Offset CreatePointFrame(flatbuffers::FlatBufferBuilder &_fbb, int32_t frameIndex = 0, uint8_t tween = 1, - uint8_t value = 0) { - TimeLineBoolFrameBuilder builder_(_fbb); - builder_.add_frameIndex(frameIndex); - builder_.add_value(value); - builder_.add_tween(tween); - return builder_.Finish(); -} - -struct TimeLineIntFrame : private flatbuffers::Table { - int32_t frameIndex() const { return GetField(4, 0); } - uint8_t tween() const { return GetField(6, 1); } - int32_t value() const { return GetField(8, 0); } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, 4 /* frameIndex */) && - VerifyField(verifier, 6 /* tween */) && - VerifyField(verifier, 8 /* value */) && - verifier.EndTable(); - } -}; - -struct TimeLineIntFrameBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_frameIndex(int32_t frameIndex) { fbb_.AddElement(4, frameIndex, 0); } - void add_tween(uint8_t tween) { fbb_.AddElement(6, tween, 1); } - void add_value(int32_t value) { fbb_.AddElement(8, value, 0); } - TimeLineIntFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - TimeLineIntFrameBuilder &operator=(const TimeLineIntFrameBuilder &); - flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); - return o; - } -}; - -inline flatbuffers::Offset CreateTimeLineIntFrame(flatbuffers::FlatBufferBuilder &_fbb, - int32_t frameIndex = 0, - uint8_t tween = 1, - int32_t value = 0) { - TimeLineIntFrameBuilder builder_(_fbb); - builder_.add_value(value); + const Position *postion = 0) { + PointFrameBuilder builder_(_fbb); + builder_.add_postion(postion); builder_.add_frameIndex(frameIndex); builder_.add_tween(tween); return builder_.Finish(); } -struct TimeLineStringFrame : private flatbuffers::Table { +struct ScaleFrame : private flatbuffers::Table { + int32_t frameIndex() const { return GetField(4, 0); } + uint8_t tween() const { return GetField(6, 1); } + const Scale *scale() const { return GetStruct(8); } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, 4 /* frameIndex */) && + VerifyField(verifier, 6 /* tween */) && + VerifyField(verifier, 8 /* scale */) && + verifier.EndTable(); + } +}; + +struct ScaleFrameBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_frameIndex(int32_t frameIndex) { fbb_.AddElement(4, frameIndex, 0); } + void add_tween(uint8_t tween) { fbb_.AddElement(6, tween, 1); } + void add_scale(const Scale *scale) { fbb_.AddStruct(8, scale); } + ScaleFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + ScaleFrameBuilder &operator=(const ScaleFrameBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + return o; + } +}; + +inline flatbuffers::Offset CreateScaleFrame(flatbuffers::FlatBufferBuilder &_fbb, + int32_t frameIndex = 0, + uint8_t tween = 1, + const Scale *scale = 0) { + ScaleFrameBuilder builder_(_fbb); + builder_.add_scale(scale); + builder_.add_frameIndex(frameIndex); + builder_.add_tween(tween); + return builder_.Finish(); +} + +struct ColorFrame : private flatbuffers::Table { + int32_t frameIndex() const { return GetField(4, 0); } + uint8_t tween() const { return GetField(6, 1); } + const Color *color() const { return GetStruct(8); } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, 4 /* frameIndex */) && + VerifyField(verifier, 6 /* tween */) && + VerifyField(verifier, 8 /* color */) && + verifier.EndTable(); + } +}; + +struct ColorFrameBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_frameIndex(int32_t frameIndex) { fbb_.AddElement(4, frameIndex, 0); } + void add_tween(uint8_t tween) { fbb_.AddElement(6, tween, 1); } + void add_color(const Color *color) { fbb_.AddStruct(8, color); } + ColorFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + ColorFrameBuilder &operator=(const ColorFrameBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + return o; + } +}; + +inline flatbuffers::Offset CreateColorFrame(flatbuffers::FlatBufferBuilder &_fbb, + int32_t frameIndex = 0, + uint8_t tween = 1, + const Color *color = 0) { + ColorFrameBuilder builder_(_fbb); + builder_.add_color(color); + builder_.add_frameIndex(frameIndex); + builder_.add_tween(tween); + return builder_.Finish(); +} + +struct TextureFrame : private flatbuffers::Table { + int32_t frameIndex() const { return GetField(4, 0); } + uint8_t tween() const { return GetField(6, 1); } + const ResourceData *textureFile() const { return GetPointer(8); } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, 4 /* frameIndex */) && + VerifyField(verifier, 6 /* tween */) && + VerifyField(verifier, 8 /* textureFile */) && + verifier.VerifyTable(textureFile()) && + verifier.EndTable(); + } +}; + +struct TextureFrameBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_frameIndex(int32_t frameIndex) { fbb_.AddElement(4, frameIndex, 0); } + void add_tween(uint8_t tween) { fbb_.AddElement(6, tween, 1); } + void add_textureFile(flatbuffers::Offset textureFile) { fbb_.AddOffset(8, textureFile); } + TextureFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + TextureFrameBuilder &operator=(const TextureFrameBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + return o; + } +}; + +inline flatbuffers::Offset CreateTextureFrame(flatbuffers::FlatBufferBuilder &_fbb, + int32_t frameIndex = 0, + uint8_t tween = 1, + flatbuffers::Offset textureFile = 0) { + TextureFrameBuilder builder_(_fbb); + builder_.add_textureFile(textureFile); + builder_.add_frameIndex(frameIndex); + builder_.add_tween(tween); + return builder_.Finish(); +} + +struct EventFrame : private flatbuffers::Table { int32_t frameIndex() const { return GetField(4, 0); } uint8_t tween() const { return GetField(6, 1); } const flatbuffers::String *value() const { return GetPointer(8); } @@ -2062,141 +2178,151 @@ struct TimeLineStringFrame : private flatbuffers::Table { } }; -struct TimeLineStringFrameBuilder { +struct EventFrameBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_frameIndex(int32_t frameIndex) { fbb_.AddElement(4, frameIndex, 0); } void add_tween(uint8_t tween) { fbb_.AddElement(6, tween, 1); } void add_value(flatbuffers::Offset value) { fbb_.AddOffset(8, value); } - TimeLineStringFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - TimeLineStringFrameBuilder &operator=(const TimeLineStringFrameBuilder &); - flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + EventFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + EventFrameBuilder &operator=(const EventFrameBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); return o; } }; -inline flatbuffers::Offset CreateTimeLineStringFrame(flatbuffers::FlatBufferBuilder &_fbb, +inline flatbuffers::Offset CreateEventFrame(flatbuffers::FlatBufferBuilder &_fbb, int32_t frameIndex = 0, uint8_t tween = 1, flatbuffers::Offset value = 0) { - TimeLineStringFrameBuilder builder_(_fbb); + EventFrameBuilder builder_(_fbb); builder_.add_value(value); builder_.add_frameIndex(frameIndex); builder_.add_tween(tween); return builder_.Finish(); } -struct TimeLinePointFrame : private flatbuffers::Table { +struct IntFrame : private flatbuffers::Table { int32_t frameIndex() const { return GetField(4, 0); } uint8_t tween() const { return GetField(6, 1); } - const Position *postion() const { return GetStruct(8); } + int32_t value() const { return GetField(8, 0); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, 4 /* frameIndex */) && VerifyField(verifier, 6 /* tween */) && - VerifyField(verifier, 8 /* postion */) && + VerifyField(verifier, 8 /* value */) && verifier.EndTable(); } }; -struct TimeLinePointFrameBuilder { +struct IntFrameBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_frameIndex(int32_t frameIndex) { fbb_.AddElement(4, frameIndex, 0); } void add_tween(uint8_t tween) { fbb_.AddElement(6, tween, 1); } - void add_postion(const Position *postion) { fbb_.AddStruct(8, postion); } - TimeLinePointFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - TimeLinePointFrameBuilder &operator=(const TimeLinePointFrameBuilder &); - flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + void add_value(int32_t value) { fbb_.AddElement(8, value, 0); } + IntFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + IntFrameBuilder &operator=(const IntFrameBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); return o; } }; -inline flatbuffers::Offset CreateTimeLinePointFrame(flatbuffers::FlatBufferBuilder &_fbb, +inline flatbuffers::Offset CreateIntFrame(flatbuffers::FlatBufferBuilder &_fbb, int32_t frameIndex = 0, uint8_t tween = 1, - const Position *postion = 0) { - TimeLinePointFrameBuilder builder_(_fbb); - builder_.add_postion(postion); + int32_t value = 0) { + IntFrameBuilder builder_(_fbb); + builder_.add_value(value); builder_.add_frameIndex(frameIndex); builder_.add_tween(tween); return builder_.Finish(); } -struct TimeLineColorFrame : private flatbuffers::Table { +struct BoolFrame : private flatbuffers::Table { int32_t frameIndex() const { return GetField(4, 0); } uint8_t tween() const { return GetField(6, 1); } - const Color *color() const { return GetStruct(8); } + uint8_t value() const { return GetField(8, 1); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, 4 /* frameIndex */) && VerifyField(verifier, 6 /* tween */) && - VerifyField(verifier, 8 /* color */) && + VerifyField(verifier, 8 /* value */) && verifier.EndTable(); } }; -struct TimeLineColorFrameBuilder { +struct BoolFrameBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_frameIndex(int32_t frameIndex) { fbb_.AddElement(4, frameIndex, 0); } void add_tween(uint8_t tween) { fbb_.AddElement(6, tween, 1); } - void add_color(const Color *color) { fbb_.AddStruct(8, color); } - TimeLineColorFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - TimeLineColorFrameBuilder &operator=(const TimeLineColorFrameBuilder &); - flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + void add_value(uint8_t value) { fbb_.AddElement(8, value, 1); } + BoolFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + BoolFrameBuilder &operator=(const BoolFrameBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); return o; } }; -inline flatbuffers::Offset CreateTimeLineColorFrame(flatbuffers::FlatBufferBuilder &_fbb, +inline flatbuffers::Offset CreateBoolFrame(flatbuffers::FlatBufferBuilder &_fbb, int32_t frameIndex = 0, uint8_t tween = 1, - const Color *color = 0) { - TimeLineColorFrameBuilder builder_(_fbb); - builder_.add_color(color); + uint8_t value = 1) { + BoolFrameBuilder builder_(_fbb); builder_.add_frameIndex(frameIndex); + builder_.add_value(value); builder_.add_tween(tween); return builder_.Finish(); } -struct TimeLineTextureFrame : private flatbuffers::Table { +struct InnerActionFrame : private flatbuffers::Table { int32_t frameIndex() const { return GetField(4, 0); } uint8_t tween() const { return GetField(6, 1); } - const ResourceData *fileNameData() const { return GetPointer(8); } + int32_t innerActionType() const { return GetField(8, 0); } + const flatbuffers::String *currentAniamtionName() const { return GetPointer(10); } + int32_t singleFrameIndex() const { return GetField(12, 0); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, 4 /* frameIndex */) && VerifyField(verifier, 6 /* tween */) && - VerifyField(verifier, 8 /* fileNameData */) && - verifier.VerifyTable(fileNameData()) && + VerifyField(verifier, 8 /* innerActionType */) && + VerifyField(verifier, 10 /* currentAniamtionName */) && + verifier.Verify(currentAniamtionName()) && + VerifyField(verifier, 12 /* singleFrameIndex */) && verifier.EndTable(); } }; -struct TimeLineTextureFrameBuilder { +struct InnerActionFrameBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_frameIndex(int32_t frameIndex) { fbb_.AddElement(4, frameIndex, 0); } void add_tween(uint8_t tween) { fbb_.AddElement(6, tween, 1); } - void add_fileNameData(flatbuffers::Offset fileNameData) { fbb_.AddOffset(8, fileNameData); } - TimeLineTextureFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - TimeLineTextureFrameBuilder &operator=(const TimeLineTextureFrameBuilder &); - flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 3)); + void add_innerActionType(int32_t innerActionType) { fbb_.AddElement(8, innerActionType, 0); } + void add_currentAniamtionName(flatbuffers::Offset currentAniamtionName) { fbb_.AddOffset(10, currentAniamtionName); } + void add_singleFrameIndex(int32_t singleFrameIndex) { fbb_.AddElement(12, singleFrameIndex, 0); } + InnerActionFrameBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + InnerActionFrameBuilder &operator=(const InnerActionFrameBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 5)); return o; } }; -inline flatbuffers::Offset CreateTimeLineTextureFrame(flatbuffers::FlatBufferBuilder &_fbb, +inline flatbuffers::Offset CreateInnerActionFrame(flatbuffers::FlatBufferBuilder &_fbb, int32_t frameIndex = 0, uint8_t tween = 1, - flatbuffers::Offset fileNameData = 0) { - TimeLineTextureFrameBuilder builder_(_fbb); - builder_.add_fileNameData(fileNameData); + int32_t innerActionType = 0, + flatbuffers::Offset currentAniamtionName = 0, + int32_t singleFrameIndex = 0) { + InnerActionFrameBuilder builder_(_fbb); + builder_.add_singleFrameIndex(singleFrameIndex); + builder_.add_currentAniamtionName(currentAniamtionName); + builder_.add_innerActionType(innerActionType); builder_.add_frameIndex(frameIndex); builder_.add_tween(tween); return builder_.Finish(); diff --git a/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp b/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp index a780c70bf4..b75d0a671b 100644 --- a/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp +++ b/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp @@ -68,15 +68,16 @@ using namespace flatbuffers; namespace cocostudio { -static const char* FrameType_VisibleFrame = "VisibleFrame"; -static const char* FrameType_PositionFrame = "PositionFrame"; -static const char* FrameType_ScaleFrame = "ScaleFrame"; -static const char* FrameType_RotationSkewFrame = "RotationSkewFrame"; -static const char* FrameType_AnchorFrame = "AnchorPointFrame"; -static const char* FrameType_ColorFrame = "ColorFrame"; -static const char* FrameType_TextureFrame = "TextureFrame"; -static const char* FrameType_EventFrame = "EventFrame"; -static const char* FrameType_ZOrderFrame = "ZOrderFrame"; +static const char* Property_VisibleForFrame = "VisibleForFrame"; +static const char* Property_Position = "Position"; +static const char* Property_Scale = "Scale"; +static const char* Property_RotationSkew = "RotationSkew"; +static const char* Property_CColor = "CColor"; +static const char* Property_FileData = "FileData"; +static const char* Property_FrameEvent = "FrameEvent"; +static const char* Property_Alpha = "Alpha"; +static const char* Property_ZOrder = "ZOrder"; +static const char* Property_ActionValue = "ActionValue"; static FlatBuffersSerialize* _instanceFlatBuffersSerialize = nullptr; @@ -232,7 +233,7 @@ std::string FlatBuffersSerialize::serializeFlatBuffersWithXMLFile(const std::str Offset nodeTree; Offset aciton; - + std::vector> animationInfos; const tinyxml2::XMLElement* child = element->FirstChildElement(); @@ -250,15 +251,26 @@ std::string FlatBuffersSerialize::serializeFlatBuffersWithXMLFile(const std::str const tinyxml2::XMLElement* objectData = child; nodeTree = createNodeTree(objectData, rootType); } - + else if (name == "AnimationList") // animation list + { + const tinyxml2::XMLElement* animationinfoElement = child->FirstChildElement(); + while (animationinfoElement) + { + auto animationinfo = createAnimationInfo(animationinfoElement); + animationInfos.push_back(animationinfo); + animationinfoElement = animationinfoElement->NextSiblingElement(); + } + } child = child->NextSiblingElement(); } + auto csparsebinary = CreateCSParseBinary(*_builder, _builder->CreateVector(_textures), _builder->CreateVector(_texturePngs), nodeTree, aciton, + _builder->CreateVector(animationInfos), _builder->CreateString(_csdVersion)); _builder->Finish(csparsebinary); @@ -514,6 +526,7 @@ Offset FlatBuffersSerialize::createNodeAction(const tinyxml2::XMLEle { int duration = 0; float speed = 0.0f; + std::string currentAnimationName = ""; // CCLOG("animation name = %s", objectData->Name()); @@ -534,6 +547,10 @@ Offset FlatBuffersSerialize::createNodeAction(const tinyxml2::XMLEle { speed = atof(value.c_str()); } + else if (name == "ActivedAnimationName") + { + currentAnimationName = value.c_str(); + } attribute = attribute->Next(); } @@ -552,13 +569,43 @@ Offset FlatBuffersSerialize::createNodeAction(const tinyxml2::XMLEle return CreateNodeAction(*_builder, duration, speed, - _builder->CreateVector(timelines)); + _builder->CreateVector(timelines), + _builder->CreateString(currentAnimationName)); } + +Offset FlatBuffersSerialize::createAnimationInfo(const tinyxml2::XMLElement *objectData) + { + std::string infoName = ""; + int startIndex = 0; + int endIndex = 0; + + const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); + while (attribute) + { + std::string attriname = attribute->Name(); + std::string attrivalue = attribute->Value(); + if (attriname == "Name") + { + infoName = attrivalue; + } + else if (attriname == "StartIndex") + { + startIndex = atoi(attrivalue.c_str()); + } + else if (attriname == "EndIndex") + { + endIndex = atoi(attrivalue.c_str()); + } + attribute = attribute->Next(); + } + return CreateAnimationInfo(*_builder, _builder->CreateString(infoName), startIndex, endIndex); + } + Offset FlatBuffersSerialize::createTimeLine(const tinyxml2::XMLElement *objectData) { int actionTag = 0; - std::string frameType = ""; + std::string property = ""; // TimelineData attrsibutes const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); @@ -571,9 +618,9 @@ Offset FlatBuffersSerialize::createTimeLine(const tinyxml2::XMLElement { actionTag = atoi(value.c_str()); } - else if (name == "FrameType") + else if (name == "Property") { - frameType = value; + property = value; } attribute = attribute->Next(); @@ -587,210 +634,113 @@ Offset FlatBuffersSerialize::createTimeLine(const tinyxml2::XMLElement { Offset frame; - if (frameType == FrameType_VisibleFrame) + if (property == Property_VisibleForFrame) { - auto visibleFrame = createTimeLineBoolFrame(frameElement); + auto boolFrame = createBoolFrame(frameElement); frame = CreateFrame(*_builder, - visibleFrame); - } - else if (frameType == FrameType_ZOrderFrame) - { - auto zOrderFrame = createTimeLineIntFrame(frameElement); - frame = CreateFrame(*_builder, - 0, // VisibleFrame - zOrderFrame); - } - else if (frameType == FrameType_RotationSkewFrame) - { - auto rotationSkewFrame = createTimeLinePointFrame(frameElement); - frame = CreateFrame(*_builder, - 0, // VisibleFrame - 0, // ZOrderFrame - rotationSkewFrame); - } - else if (frameType == FrameType_EventFrame) - { - auto eventFrame = createTimeLineStringFrame(frameElement); - frame = CreateFrame(*_builder, - 0, // VisibleFrame - 0, // ZOrderFrame - 0, // RotationSkewFrame - eventFrame); - } - else if (frameType == FrameType_AnchorFrame) - { - auto anchorPointFrame = createTimeLinePointFrame(frameElement); - frame = CreateFrame(*_builder, - 0, // VisibleFrame - 0, // ZOrderFrame - 0, // RotationSkewFrame + 0, // PointFrame + 0, // ScaleFrame + 0, // ColorFrame + 0, // TextureFrame 0, // EventFrame - anchorPointFrame); + 0, // IntFrame + boolFrame); } - else if (frameType == FrameType_PositionFrame) + else if (property == Property_Position) { - auto positionFrame = createTimeLinePointFrame(frameElement); + auto pointFrame = createPointFrame(frameElement); frame = CreateFrame(*_builder, - 0, // VisibleFrame - 0, // ZOrderFrame - 0, // RotationSkewFrame - 0, // EventFrame - 0, // AnchorPointFrame - positionFrame); + pointFrame); } - else if (frameType == FrameType_ScaleFrame) + else if (property == Property_Scale) { - auto scaleFrame = createTimeLinePointFrame(frameElement); + auto scaleFrame = createScaleFrame(frameElement); frame = CreateFrame(*_builder, - 0, // VisibleFrame - 0, // ZOrderFrame - 0, // RotationSkewFrame - 0, // EventFrame - 0, // AnchorPointFrame - 0, // PositionFrame + 0, // PointFrame scaleFrame); } - else if (frameType == FrameType_ColorFrame) + else if (property == Property_RotationSkew) { - auto colorFrame = createTimeLineColorFrame(frameElement); + auto scaleFrame = createScaleFrame(frameElement); frame = CreateFrame(*_builder, - 0, // VisibleFrame - 0, // ZOrderFrame - 0, // RotationSkewFrame - 0, // EventFrame - 0, // AnchorPointFrame - 0, // PositionFrame + 0, // PointFrame + scaleFrame); + } + else if (property == Property_CColor) + { + auto colorFrame = createColorFrame(frameElement); + frame = CreateFrame(*_builder, + 0, // PointFrame 0, // ScaleFrame colorFrame); } - else if (frameType == FrameType_TextureFrame) + else if (property == Property_FileData) { - auto textureFrame = createTimeLineTextureFrame(frameElement); + auto textureFrame = createTextureFrame(frameElement); frame = CreateFrame(*_builder, - 0, // VisibleFrame - 0, // ZOrderFrame - 0, // RotationSkewFrame - 0, // EventFrame - 0, // AnchorPointFrame - 0, // PositionFrame + 0, // PointFrame 0, // ScaleFrame 0, // ColorFrame textureFrame); } + else if (property == Property_FrameEvent) + { + auto eventFrame = createEventFrame(frameElement); + frame = CreateFrame(*_builder, + 0, // PointFrame + 0, // ScaleFrame + 0, // ColorFrame + 0, // TextureFrame + eventFrame); + } + else if (property == Property_Alpha) + { + auto intFrame = createIntFrame(frameElement); + frame = CreateFrame(*_builder, + 0, // PointFrame + 0, // ScaleFrame + 0, // ColorFrame + 0, // TextureFrame + 0, // EventFrame + intFrame); + } + else if (property == Property_ZOrder) + { + auto intFrame = createIntFrame(frameElement); + frame = CreateFrame(*_builder, + 0, // PointFrame + 0, // ScaleFrame + 0, // ColorFrame + 0, // TextureFrame + 0, // EventFrame + intFrame); + } + else if (property == Property_ActionValue) + { + auto innerActionFrame = createInnerActionFrame(frameElement); + frame = CreateFrame(*_builder, + 0, // PointFrame + 0, // ScaleFrame + 0, // ColorFrame + 0, // TextureFrame + 0, // EventFrame + 0, // IntFrame + 0, // BoolFrame + innerActionFrame); + } + frames.push_back(frame); frameElement = frameElement->NextSiblingElement(); } return CreateTimeLine(*_builder, - _builder->CreateString(frameType), + _builder->CreateString(property), actionTag, _builder->CreateVector(frames)); } - -Offset FlatBuffersSerialize::createTimeLineBoolFrame(const tinyxml2::XMLElement *objectData) -{ - int frameIndex = 0; - bool tween = true; - bool value = false; - const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); - while (attribute) - { - std::string name = attribute->Name(); - std::string attrivalue = attribute->Value(); - - if (name == "Value") - { - value = (attrivalue == "True") ? true : false; - } - else if (name == "FrameIndex") - { - frameIndex = atoi(attrivalue.c_str()); - } - else if (name == "Tween") - { - tween = atoi(attrivalue.c_str()); - } - - attribute = attribute->Next(); - } - - return CreateTimeLineBoolFrame(*_builder, - frameIndex, - tween, - value); -} - -Offset FlatBuffersSerialize::createTimeLineIntFrame(const tinyxml2::XMLElement *objectData) -{ - int frameIndex = 0; - bool tween = true; - int value = 0; - - const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); - while (attribute) - { - std::string name = attribute->Name(); - std::string attrivalue = attribute->Value(); - - if (name == "Value") // to be gonna modify - { - value = atoi(attrivalue.c_str()); - } - else if (name == "FrameIndex") - { - frameIndex = atoi(attrivalue.c_str()); - } - else if (name == "Tween") - { - tween = (attrivalue == "True") ? true : false; - } - - attribute = attribute->Next(); - } - - return CreateTimeLineIntFrame(*_builder, - frameIndex, - tween, - value); -} - -Offset FlatBuffersSerialize::createTimeLineStringFrame(const tinyxml2::XMLElement *objectData) -{ - int frameIndex = 0; - bool tween = true; - std::string value = ""; - - const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); - while (attribute) - { - std::string name = attribute->Name(); - std::string attrivalue = attribute->Value(); - - if (name == "Value") // to be gonna modify - { - value = attrivalue; - } - else if (name == "FrameIndex") - { - frameIndex = atoi(attrivalue.c_str()); - } - else if (name == "Tween") - { - tween = (attrivalue == "True") ? true : false; - } - - attribute = attribute->Next(); - } - - return CreateTimeLineStringFrame(*_builder, - frameIndex, - tween, - _builder->CreateString(value)); -} - -Offset FlatBuffersSerialize::createTimeLinePointFrame(const tinyxml2::XMLElement *objectData) +Offset FlatBuffersSerialize::createPointFrame(const tinyxml2::XMLElement *objectData) { int frameIndex = 0; bool tween = true; @@ -824,17 +774,57 @@ Offset FlatBuffersSerialize::createTimeLinePointFrame(const Position f_position(position.x, position.y); - return CreateTimeLinePointFrame(*_builder, - frameIndex, - tween, - &f_position); + return CreatePointFrame(*_builder, + frameIndex, + tween, + &f_position); } -Offset FlatBuffersSerialize::createTimeLineColorFrame(const tinyxml2::XMLElement *objectData) +Offset FlatBuffersSerialize::createScaleFrame(const tinyxml2::XMLElement *objectData) { int frameIndex = 0; bool tween = true; - Color4B color; + Vec2 scale; + + const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); + while (attribute) + { + std::string name = attribute->Name(); + std::string value = attribute->Value(); + + if (name == "X") + { + scale.x = atof(value.c_str()); + } + else if (name == "Y") + { + scale.y = atof(value.c_str()); + } + else if (name == "FrameIndex") + { + frameIndex = atoi(value.c_str()); + } + else if (name == "Tween") + { + tween = (value == "True") ? true : false; + } + + attribute = attribute->Next(); + } + + Scale f_scale(scale.x, scale.y); + + return CreateScaleFrame(*_builder, + frameIndex, + tween, + &f_scale); +} + +Offset FlatBuffersSerialize::createColorFrame(const tinyxml2::XMLElement *objectData) +{ + int frameIndex = 0; + bool tween = true; + Color3B color; const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); while (attribute) @@ -846,10 +836,6 @@ Offset FlatBuffersSerialize::createTimeLineColorFrame(const { frameIndex = atoi(value.c_str()); } - else if (name == "Alpha") - { - color.a = atoi(value.c_str()); - } else if (name == "Tween") { tween = (value == "True") ? true : false; @@ -879,7 +865,7 @@ Offset FlatBuffersSerialize::createTimeLineColorFrame(const else if (name == "B") { color.b = atoi(value.c_str()); - } + } attribute = attribute->Next(); } @@ -887,85 +873,244 @@ Offset FlatBuffersSerialize::createTimeLineColorFrame(const child = child->NextSiblingElement(); } - Color f_color(color.a, color.r, color.g, color.b); + Color f_color(255, color.r, color.g, color.b); - return CreateTimeLineColorFrame(*_builder, - frameIndex, - tween, - &f_color); + return CreateColorFrame(*_builder, + frameIndex, + tween, + &f_color); } - Offset FlatBuffersSerialize::createTimeLineTextureFrame(const tinyxml2::XMLElement *objectData) +Offset FlatBuffersSerialize::createTextureFrame(const tinyxml2::XMLElement *objectData) +{ + int frameIndex = 0; + bool tween = true; + + std::string path = ""; + std::string plistFile = ""; + int resourceType = 0; + + std::string texture = ""; + std::string texturePng = ""; + + const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); + while (attribute) { - int frameIndex = 0; - bool tween = true; + std::string attriname = attribute->Name(); + std::string value = attribute->Value(); - std::string path = ""; - std::string plistFile = ""; - int resourceType = 0; + if (attriname == "FrameIndex") + { + frameIndex = atoi(value.c_str()); + } + else if (attriname == "Tween") + { + tween = (value == "True") ? true : false; + } - std::string texture = ""; - std::string texturePng = ""; - - const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); + attribute = attribute->Next(); + } + + const tinyxml2::XMLElement* child = objectData->FirstChildElement(); + while (child) + { + attribute = child->FirstAttribute(); while (attribute) { std::string attriname = attribute->Name(); std::string value = attribute->Value(); - if (attriname == "FrameIndex") + if (attriname == "Path") { - frameIndex = atoi(value.c_str()); + path = value; } - else if (attriname == "Tween") + else if (attriname == "Type") { - tween = (value == "True") ? true : false; + resourceType = getResourceType(value); + } + else if (attriname == "Plist") + { + plistFile = value; + texture = value; } attribute = attribute->Next(); } - const tinyxml2::XMLElement* child = objectData->FirstChildElement(); - while (child) + if (resourceType == 1) { - attribute = child->FirstAttribute(); - while (attribute) - { - std::string attriname = attribute->Name(); - std::string value = attribute->Value(); - - if (attriname == "Path") - { - path = value; - } - else if (attriname == "Type") - { - resourceType = getResourceType(value); - } - else if (attriname == "Plist") - { - plistFile = value; - texture = value; - } - - attribute = attribute->Next(); - } - - if (resourceType == 1) - { - _textures.push_back(_builder->CreateString(texture)); - } - - child = child->NextSiblingElement(); + _textures.push_back(_builder->CreateString(texture)); } - return CreateTimeLineTextureFrame(*_builder, - frameIndex, - tween, - CreateResourceData(*_builder, - _builder->CreateString(path), - _builder->CreateString(plistFile), - resourceType)); + child = child->NextSiblingElement(); + } + + return CreateTextureFrame(*_builder, + frameIndex, + tween, + CreateResourceData(*_builder, + _builder->CreateString(path), + _builder->CreateString(plistFile), + resourceType)); +} + +Offset FlatBuffersSerialize::createEventFrame(const tinyxml2::XMLElement *objectData) +{ + int frameIndex = 0; + bool tween = true; + std::string value = ""; + + const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); + while (attribute) + { + std::string name = attribute->Name(); + std::string attrivalue = attribute->Value(); + + if (name == "Value") // to be gonna modify + { + value = attrivalue; + } + else if (name == "FrameIndex") + { + frameIndex = atoi(attrivalue.c_str()); + } + else if (name == "Tween") + { + tween = (attrivalue == "True") ? true : false; + } + + attribute = attribute->Next(); + } + + return CreateEventFrame(*_builder, + frameIndex, + tween, + _builder->CreateString(value)); +} + +Offset FlatBuffersSerialize::createIntFrame(const tinyxml2::XMLElement *objectData) +{ + int frameIndex = 0; + bool tween = true; + int value = 0; + + const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); + while (attribute) + { + std::string name = attribute->Name(); + std::string attrivalue = attribute->Value(); + + if (name == "Value") // to be gonna modify + { + value = atoi(attrivalue.c_str()); + } + else if (name == "FrameIndex") + { + frameIndex = atoi(attrivalue.c_str()); + } + else if (name == "Tween") + { + tween = (attrivalue == "True") ? true : false; + } + + attribute = attribute->Next(); + } + + return CreateIntFrame(*_builder, + frameIndex, + tween, + value); +} + +Offset FlatBuffersSerialize::createBoolFrame(const tinyxml2::XMLElement *objectData) +{ + int frameIndex = 0; + bool tween = true; + bool value = true; + + const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); + while (attribute) + { + std::string name = attribute->Name(); + std::string attrivalue = attribute->Value(); + + if (name == "Value") + { + value = (attrivalue == "True") ? true : false; + } + else if (name == "FrameIndex") + { + frameIndex = atoi(attrivalue.c_str()); + } + else if (name == "Tween") + { + tween = (attrivalue == "True") ? true : false; + } + + attribute = attribute->Next(); + } + + return CreateBoolFrame(*_builder, + frameIndex, + tween, + value); +} + + Offset FlatBuffersSerialize::createInnerActionFrame(const tinyxml2::XMLElement *objectData) + { + int frameIndex = 0; + bool tween = true; + int innerActionType = 0; + std::string currentAniamtionName = ""; + int singleFrameIndex = 0; + + const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); + while (attribute) + { + std::string name = attribute->Name(); + std::string attrivalue = attribute->Value(); + + if (name == "InnerActionType") + { + if (attrivalue == "LoopAction") + { + innerActionType = 0; + } + else if (attrivalue == "NoLoopAction") + { + innerActionType = 1; + } + else if (attrivalue == "SingleFrame") + { + innerActionType = 2; + } + } + else if (name == "CurrentAniamtionName") + { + currentAniamtionName = attrivalue; + } + else if (name == "SingleFrameIndex") + { + singleFrameIndex = atoi(attrivalue.c_str()); + } + else if (name == "FrameIndex") + { + frameIndex = atoi(attrivalue.c_str()); + } + else if (name == "Tween") + { + tween = (attrivalue == "True") ? true : false; + } + + attribute = attribute->Next(); + } + + return CreateInnerActionFrame(*_builder, + frameIndex, + tween, + innerActionType, + _builder->CreateString(currentAniamtionName), + singleFrameIndex); } /* create flat buffers with XML */ @@ -1005,7 +1150,7 @@ FlatBufferBuilder* FlatBuffersSerialize::createFlatBuffersWithXMLFileForSimulato if (attribute) _csdVersion = attribute->Value(); } - + if (strcmp("Content", element->Name()) == 0) { const tinyxml2::XMLAttribute* attribute = element->FirstAttribute(); @@ -1040,7 +1185,7 @@ FlatBufferBuilder* FlatBuffersSerialize::createFlatBuffersWithXMLFileForSimulato Offset nodeTree; Offset aciton; - + std::vector > animationInfos; const tinyxml2::XMLElement* child = element->FirstChildElement(); @@ -1058,6 +1203,16 @@ FlatBufferBuilder* FlatBuffersSerialize::createFlatBuffersWithXMLFileForSimulato const tinyxml2::XMLElement* objectData = child; nodeTree = createNodeTreeForSimulator(objectData, rootType); } + else if (name == "AnimationList") // animation list + { + const tinyxml2::XMLElement* animationinfoElement = child->FirstChildElement(); + while (animationinfoElement) + { + auto animationinfo = createAnimationInfo(animationinfoElement); + animationInfos.push_back(animationinfo); + animationinfoElement = animationinfoElement->NextSiblingElement(); + } + } child = child->NextSiblingElement(); } @@ -1067,8 +1222,9 @@ FlatBufferBuilder* FlatBuffersSerialize::createFlatBuffersWithXMLFileForSimulato _builder->CreateVector(_texturePngs), nodeTree, aciton, + _builder->CreateVector(animationInfos), _builder->CreateString(_csdVersion)); - _builder->Finish(csparsebinary); + _builder->Finish(csparsebinary); _textures.clear(); _texturePngs.clear(); @@ -1190,26 +1346,6 @@ Offset FlatBuffersSerialize::createProjectNodeOptionsForSimu std::string filename = ""; - - bool isloop = true; - bool isAutoPlay = true; - const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); - while (attribute) - { - std::string attriname = attribute->Name(); - std::string value = attribute->Value(); - if (attriname == "IsLoop") - { - isloop = (value == "True") ? true : false; - - } - else if (attriname == "IsAutoPlay") - { - isAutoPlay = (value == "True") ? true : false; - } - attribute = attribute->Next(); - } - // FileData const tinyxml2::XMLElement* child = objectData->FirstChildElement(); while (child) @@ -1218,19 +1354,19 @@ Offset FlatBuffersSerialize::createProjectNodeOptionsForSimu if (name == "FileData") { - const tinyxml2::XMLAttribute* attributeFileData = child->FirstAttribute(); + const tinyxml2::XMLAttribute* attribute = child->FirstAttribute(); - while (attributeFileData) + while (attribute) { - name = attributeFileData->Name(); - std::string value = attributeFileData->Value(); + name = attribute->Name(); + std::string value = attribute->Value(); if (name == "Path") { filename = value; } - attributeFileData = attributeFileData->Next(); + attribute = attribute->Next(); } } @@ -1239,9 +1375,7 @@ Offset FlatBuffersSerialize::createProjectNodeOptionsForSimu return CreateProjectNodeOptions(*_builder, nodeOptions, - _builder->CreateString(filename), - isloop, - isAutoPlay); + _builder->CreateString(filename)); } } diff --git a/cocos/editor-support/cocostudio/FlatBuffersSerialize.h b/cocos/editor-support/cocostudio/FlatBuffersSerialize.h index bdaea811ea..9cd0d804f2 100644 --- a/cocos/editor-support/cocostudio/FlatBuffersSerialize.h +++ b/cocos/editor-support/cocostudio/FlatBuffersSerialize.h @@ -65,16 +65,18 @@ namespace flatbuffers struct TextAtlasOptions; - struct NodeAction; + struct AnimationInfo; struct TimeLine; struct Frame; - struct TimeLineBoolFrame; - struct TimeLineIntFrame; - struct TimeLineStringFrame; - struct TimeLinePointFrame; - struct TimeLineColorFrame; - struct TimeLineTextureFrame; + struct PointFrame; + struct ScaleFrame; + struct ColorFrame; + struct TextureFrame; + struct EventFrame; + struct IntFrame; + struct BoolFrame; + struct InnerActionFrame; } namespace tinyxml2 @@ -109,13 +111,18 @@ public: // NodeAction flatbuffers::Offset createNodeAction(const tinyxml2::XMLElement* objectData); - flatbuffers::Offset createTimeLine(const tinyxml2::XMLElement* objectData); - flatbuffers::Offset createTimeLineBoolFrame(const tinyxml2::XMLElement* objectData); - flatbuffers::Offset createTimeLineIntFrame(const tinyxml2::XMLElement* objectData); - flatbuffers::Offset createTimeLineStringFrame(const tinyxml2::XMLElement* objectData); - flatbuffers::Offset createTimeLinePointFrame(const tinyxml2::XMLElement* objectData); - flatbuffers::Offset createTimeLineColorFrame(const tinyxml2::XMLElement* objectData); - flatbuffers::Offset createTimeLineTextureFrame(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createTimeLine(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createPointFrame(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createScaleFrame(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createColorFrame(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createTextureFrame(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createEventFrame(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createIntFrame(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createBoolFrame(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createInnerActionFrame(const tinyxml2::XMLElement* objectData); + + //Animation Info + flatbuffers::Offset createAnimationInfo(const tinyxml2::XMLElement* objectData); /**/ int getResourceType(std::string key); @@ -126,7 +133,7 @@ public: flatbuffers::FlatBufferBuilder* createFlatBuffersWithXMLFileForSimulator(const std::string& xmlFileName); flatbuffers::Offset createNodeTreeForSimulator(const tinyxml2::XMLElement* objectData, std::string classType); - flatbuffers::Offset createProjectNodeOptionsForSimulator(const tinyxml2::XMLElement* objectData); + flatbuffers::Offset createProjectNodeOptionsForSimulator(const tinyxml2::XMLElement* objectData); /**/ std::string getCsdVersion() { return _csdVersion; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ProjectNodeReader/ProjectNodeReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ProjectNodeReader/ProjectNodeReader.cpp index 810f4d1f26..090b5185ce 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ProjectNodeReader/ProjectNodeReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ProjectNodeReader/ProjectNodeReader.cpp @@ -69,26 +69,6 @@ namespace cocostudio auto nodeOptions = *(Offset*)(&temp); std::string filename = ""; - bool isloop = true; - bool isAutoPlay = true; - - const tinyxml2::XMLAttribute* attribute = objectData->FirstAttribute(); - while (attribute) - { - std::string attriname = attribute->Name(); - std::string value = attribute->Value(); - - if (attriname == "IsLoop") - { - isloop = (value == "True") ? true : false; - } - else if (attriname == "IsAutoPlay") - { - isAutoPlay = (value == "True") ? true : false; - } - - attribute = attribute->Next(); - } // FileData const tinyxml2::XMLElement* child = objectData->FirstChildElement(); @@ -98,12 +78,12 @@ namespace cocostudio if (name == "FileData") { - const tinyxml2::XMLAttribute* attributeFileData = child->FirstAttribute(); + const tinyxml2::XMLAttribute* attribute = child->FirstAttribute(); - while (attributeFileData) + while (attribute) { - name = attributeFileData->Name(); - std::string value = attributeFileData->Value(); + name = attribute->Name(); + std::string value = attribute->Value(); if (name == "Path") { @@ -112,7 +92,7 @@ namespace cocostudio filename = convert; } - attributeFileData = attributeFileData->Next(); + attribute = attribute->Next(); } } @@ -121,9 +101,7 @@ namespace cocostudio auto options = CreateProjectNodeOptions(*builder, nodeOptions, - builder->CreateString(filename), - isloop, - isAutoPlay); + builder->CreateString(filename)); return *(Offset*)(&options); } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.cpp b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.cpp index 70ac3c14b9..14921367a6 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.cpp @@ -197,7 +197,11 @@ void TestActionTimeline::onEnter() { ActionTimelineTestLayer::onEnter(); - ActionTimelineNode* node = CSLoader::createActionTimelineNode("ActionTimeline/DemoPlayer.csb", 0, 40, true); + Node* node = CSLoader::createNode("ActionTimeline/DemoPlayer.csb"); + ActionTimeline* action = CSLoader::createTimeline("ActionTimeline/DemoPlayer.csb"); + node->runAction(action); + action->gotoFrameAndPlay(0); +// ActionTimelineNode* node = CSLoader::createActionTimelineNode("ActionTimeline/DemoPlayer.csb", 0, 40, true); node->setScale(0.2f); node->setPosition(VisibleRect::center()); @@ -217,8 +221,14 @@ void TestChangePlaySection::onEnter() { ActionTimelineTestLayer::onEnter(); + Node* node = CSLoader::createNode("ActionTimeline/DemoPlayer.csb"); + action = CSLoader::createTimeline("ActionTimeline/DemoPlayer.csb"); + node->runAction(action); + action->gotoFrameAndPlay(41); + /* ActionTimelineNode* node = CSLoader::createActionTimelineNode("ActionTimeline/DemoPlayer.csb", 41, 81, true); action = node->getActionTimeline(); + */ node->setScale(0.2f); node->setPosition(VisibleRect::center()); @@ -250,8 +260,14 @@ void TestTimelineFrameEvent::onEnter() { ActionTimelineTestLayer::onEnter(); + Node* node = CSLoader::createNode("ActionTimeline/DemoPlayer.csb"); + ActionTimeline* action = CSLoader::createTimeline("ActionTimeline/DemoPlayer.csb"); + node->runAction(action); + action->gotoFrameAndPlay(0); + /* ActionTimelineNode* node = CSLoader::createActionTimelineNode("ActionTimeline/DemoPlayer.csb", 0, 40, true); ActionTimeline* action = node->getActionTimeline(); + */ node->setScale(0.2f); node->setPosition(150,100); @@ -291,7 +307,11 @@ void TestTimelinePerformance::onEnter() for (int i = 0; i< 100; i++) { - ActionTimelineNode* node = CSLoader::createActionTimelineNode("ActionTimeline/DemoPlayer.csb", 41, 81, true); + Node* node = CSLoader::createNode("ActionTimeline/DemoPlayer.csb"); + ActionTimeline* action = CSLoader::createTimeline("ActionTimeline/DemoPlayer.csb"); + node->runAction(action); + action->gotoFrameAndPlay(41); +// ActionTimelineNode* node = CSLoader::createActionTimelineNode("ActionTimeline/DemoPlayer.csb", 41, 81, true); node->setScale(0.1f); node->setPosition(i*2,100); From 6237115fbf53fab2be5f9ace0455271d760c3a0f Mon Sep 17 00:00:00 2001 From: pipu Date: Mon, 12 Jan 2015 11:09:19 +0800 Subject: [PATCH 083/106] Fixes bug that clone InnerActionFrame. --- .../cocostudio/ActionTimeline/CCActionTimeline.h | 2 +- .../cocostudio/ActionTimeline/CCFrame.cpp | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h index 35dd7ae9cd..877f88c853 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h @@ -134,7 +134,7 @@ public: virtual const cocos2d::Vector& getTimelines() const { return _timelineList; } - /** add ActionIndexes*/ + /** AnimationInfo*/ virtual void addAnimationInfo(const AnimationInfo& animationInfo); virtual void removeAnimationInfo(std::string animationName); virtual bool IsAnimationInfoExists(const std::string& animationName); diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp index b5ed343624..00f5c8610f 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp @@ -549,8 +549,16 @@ Frame* InnerActionFrame::clone() { InnerActionFrame* frame = InnerActionFrame::create(); frame->setInnerActionType(_innerActionType); - frame->setStartFrameIndex(_startFrameIndex); - frame->setEndFrameIndex(_endFrameIndex); + if(_enterWithName) + { + frame->setEnterWithName(true); + frame->setAnimationName(_animationName); + } + else + { + frame->setStartFrameIndex(_startFrameIndex); + frame->setEndFrameIndex(_endFrameIndex); + } frame->cloneProperty(this); return frame; From 82be4701b581391db76476d748ed6b7529065b0b Mon Sep 17 00:00:00 2001 From: pipu Date: Mon, 12 Jan 2015 11:12:38 +0800 Subject: [PATCH 084/106] Update resource DemoPlayer.csb in path tests/cpp-tests/Resources/ActionTimeline --- .../Resources/ActionTimeline/DemoPlayer.csb | Bin 14356 -> 14888 bytes 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 tests/cpp-tests/Resources/ActionTimeline/DemoPlayer.csb diff --git a/tests/cpp-tests/Resources/ActionTimeline/DemoPlayer.csb b/tests/cpp-tests/Resources/ActionTimeline/DemoPlayer.csb old mode 100755 new mode 100644 index 7d78bc16374f4b11323d80653216c1de12e9da65..7332c152972371eafc96cf6dfcdb24564be88ce1 GIT binary patch literal 14888 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 literal 14356 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 Date: Mon, 12 Jan 2015 11:31:09 +0800 Subject: [PATCH 085/106] [ci skip]update version --- cocos/cocos2d.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/cocos2d.cpp b/cocos/cocos2d.cpp index 0ebb62b653..3d104dc7bc 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.4beta0"; + return "cocos2d-x 3.4"; } NS_CC_END From 4cc0dd129ad9c898693903039252a9739cf7af3f Mon Sep 17 00:00:00 2001 From: jianglong0156 Date: Mon, 12 Jan 2015 11:57:03 +0800 Subject: [PATCH 086/106] issue cocos2d/cocos2d-js #2563 : ActionTimelineData need to use its constructor in jsb code. So i modify the constructor to public --- .../cocostudio/ActionTimeline/CCActionTimeline.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h index 567188dec2..acf03b2582 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h @@ -45,10 +45,10 @@ public: virtual void setActionTag(int actionTag) { _actionTag = actionTag; } virtual int getActionTag() const { return _actionTag; } -protected: +CC_CONSTRUCTOR_ACCESS: ActionTimelineData(); virtual bool init(int actionTag); - +protected: int _actionTag; }; From 7e83336af876f16ec5a77640c76aba795c8f4e33 Mon Sep 17 00:00:00 2001 From: pipu Date: Mon, 12 Jan 2015 13:54:17 +0800 Subject: [PATCH 087/106] Update InnerActionFrame. --- .../cocostudio/ActionTimeline/CCFrame.cpp | 13 +++++++++---- .../cocostudio/ActionTimeline/CCFrame.h | 2 ++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp index 00f5c8610f..430f6fea5a 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp @@ -453,6 +453,8 @@ Frame* AnchorPointFrame::clone() // InnerActionFrame +const std::string InnerActionFrame::AnimationAllName = "-- ALL --"; + InnerActionFrame* InnerActionFrame::create() { InnerActionFrame* frame = new (std::nothrow) InnerActionFrame(); @@ -466,9 +468,12 @@ InnerActionFrame* InnerActionFrame::create() } InnerActionFrame::InnerActionFrame() - : _innerActionType(LoopAction) - , _startFrameIndex(0) - , _endFrameIndex(0) +: _innerActionType(InnerActionType::SingleFrame) +, _startFrameIndex(0) +, _endFrameIndex(0) +, _singleFrameIndex(0) +, _enterWithName(false) +, _animationName("") { } @@ -486,7 +491,7 @@ void InnerActionFrame::onEnter(Frame *nextFrame, int currentFrameIndex) if (_enterWithName) { - if (_animationName == "-- ALL --") + if (_animationName == AnimationAllName) { start = 0; end = actiontimeline->getDuration(); diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h index 1e2b6df5ef..bbf6f917c6 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.h @@ -255,6 +255,8 @@ enum InnerActionType class CC_STUDIO_DLL InnerActionFrame : public Frame { public: + static const std::string AnimationAllName; + static InnerActionFrame* create(); InnerActionFrame(); From d5416d8a7afd28b49545998b46e3648cd33c0e13 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 12 Jan 2015 14:43:31 +0800 Subject: [PATCH 088/106] refresh attributes and uniforms in glprogramstate --- cocos/renderer/CCGLProgramState.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cocos/renderer/CCGLProgramState.cpp b/cocos/renderer/CCGLProgramState.cpp index 1c3f3b96c4..0682cd47ef 100644 --- a/cocos/renderer/CCGLProgramState.cpp +++ b/cocos/renderer/CCGLProgramState.cpp @@ -375,6 +375,7 @@ void GLProgramState::applyAttributes(bool applyAttribFlags) { // Don't set attributes if they weren't set // Use Case: Auto-batching + updateUniformsAndAttributes(); if(_vertexAttribsFlags) { // enable/disable vertex attribs if (applyAttribFlags) @@ -389,6 +390,7 @@ void GLProgramState::applyAttributes(bool applyAttribFlags) void GLProgramState::applyUniforms() { // set uniforms + updateUniformsAndAttributes(); for(auto& uniform : _uniforms) { uniform.second.apply(); } From 2b79ff1d87a9bd3cc3b8d5d410dce80c92bf6f70 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 12 Jan 2015 14:59:12 +0800 Subject: [PATCH 089/106] add param for usage in class VertexBuffer and IndexBuffer --- cocos/renderer/CCVertexIndexBuffer.cpp | 22 ++++++++++++---------- cocos/renderer/CCVertexIndexBuffer.h | 10 ++++++---- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/cocos/renderer/CCVertexIndexBuffer.cpp b/cocos/renderer/CCVertexIndexBuffer.cpp index ca3d53a2b2..c24efdd5e2 100644 --- a/cocos/renderer/CCVertexIndexBuffer.cpp +++ b/cocos/renderer/CCVertexIndexBuffer.cpp @@ -42,10 +42,10 @@ bool IndexBuffer::_enableShadowCopy = true; bool IndexBuffer::_enableShadowCopy = false; #endif -VertexBuffer* VertexBuffer::create(int sizePerVertex, int vertexNumber) +VertexBuffer* VertexBuffer::create(int sizePerVertex, int vertexNumber, GLenum usage/* = GL_STATIC_DRAW*/) { auto result = new (std::nothrow) VertexBuffer(); - if(result && result->init(sizePerVertex, vertexNumber)) + if(result && result->init(sizePerVertex, vertexNumber, usage)) { result->autorelease(); return result; @@ -85,12 +85,13 @@ VertexBuffer::~VertexBuffer() #endif } -bool VertexBuffer::init(int sizePerVertex, int vertexNumber) +bool VertexBuffer::init(int sizePerVertex, int vertexNumber, GLenum usage/* = GL_STATIC_DRAW*/) { if(0 == sizePerVertex || 0 == vertexNumber) return false; _sizePerVertex = sizePerVertex; _vertexNumber = vertexNumber; + _usage = usage; if(isShadowCopyEnabled()) { @@ -99,7 +100,7 @@ bool VertexBuffer::init(int sizePerVertex, int vertexNumber) glGenBuffers(1, &_vbo); glBindBuffer(GL_ARRAY_BUFFER, _vbo); - glBufferData(GL_ARRAY_BUFFER, getSize(), nullptr, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, getSize(), nullptr, _usage); glBindBuffer(GL_ARRAY_BUFFER, 0); return true; } @@ -158,7 +159,7 @@ void VertexBuffer::recreateVBO() const buffer = &_shadowCopy[0]; } CCLOG("recreate IndexBuffer with size %d %d", getSizePerVertex(), _vertexNumber); - glBufferData(GL_ARRAY_BUFFER, _sizePerVertex * _vertexNumber, buffer, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, _sizePerVertex * _vertexNumber, buffer, _usage); glBindBuffer(GL_ARRAY_BUFFER, 0); if(!glIsBuffer(_vbo)) { @@ -171,10 +172,10 @@ int VertexBuffer::getSize() const return _sizePerVertex * _vertexNumber; } -IndexBuffer* IndexBuffer::create(IndexType type, int number) +IndexBuffer* IndexBuffer::create(IndexType type, int number, GLenum usage/* = GL_STATIC_DRAW*/) { auto result = new (std::nothrow) IndexBuffer(); - if(result && result->init(type, number)) + if(result && result->init(type, number, usage)) { result->autorelease(); return result; @@ -211,16 +212,17 @@ IndexBuffer::~IndexBuffer() #endif } -bool IndexBuffer::init(IndexBuffer::IndexType type, int number) +bool IndexBuffer::init(IndexBuffer::IndexType type, int number, GLenum usage/* = GL_STATIC_DRAW*/) { if(number <=0 ) return false; _type = type; _indexNumber = number; + _usage = usage; glGenBuffers(1, &_vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vbo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, getSize(), nullptr, GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, getSize(), nullptr, _usage); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); if(isShadowCopyEnabled()) @@ -295,7 +297,7 @@ void IndexBuffer::recreateVBO() const buffer = &_shadowCopy[0]; } CCLOG("recreate IndexBuffer with size %d %d ", getSizePerIndex(), _indexNumber); - glBufferData(GL_ARRAY_BUFFER, getSize(), buffer, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, getSize(), buffer, _usage); glBindBuffer(GL_ARRAY_BUFFER, 0); if(!glIsBuffer(_vbo)) { diff --git a/cocos/renderer/CCVertexIndexBuffer.h b/cocos/renderer/CCVertexIndexBuffer.h index 1eaffe76f3..4ee7070d87 100644 --- a/cocos/renderer/CCVertexIndexBuffer.h +++ b/cocos/renderer/CCVertexIndexBuffer.h @@ -36,7 +36,7 @@ class EventListenerCustom; class CC_DLL VertexBuffer : public Ref { public: - static VertexBuffer* create(int sizePerVertex, int vertexNumber); + static VertexBuffer* create(int sizePerVertex, int vertexNumber, GLenum usage = GL_STATIC_DRAW); int getSizePerVertex() const; int getVertexNumber() const; @@ -50,7 +50,7 @@ protected: VertexBuffer(); virtual ~VertexBuffer(); - bool init(int sizePerVertex, int vertexNumber); + bool init(int sizePerVertex, int vertexNumber, GLenum usage = GL_STATIC_DRAW); protected: //event listener for foreground void recreateVBO() const; @@ -61,6 +61,7 @@ protected: int _vertexNumber; //buffer used for shadow copy std::vector _shadowCopy; + GLenum _usage; protected: static bool _enableShadowCopy; public: @@ -78,7 +79,7 @@ public: }; public: - static IndexBuffer* create(IndexType type, int number); + static IndexBuffer* create(IndexType type, int number, GLenum usage = GL_STATIC_DRAW); IndexType getType() const; int getSizePerIndex() const; @@ -93,7 +94,7 @@ protected: IndexBuffer(); virtual ~IndexBuffer(); - bool init(IndexType type, int number); + bool init(IndexType type, int number, GLenum usage = GL_STATIC_DRAW); protected: mutable GLuint _vbo; @@ -106,6 +107,7 @@ protected: EventListenerCustom* _recreateVBOEventListener; //buffer used for shadow copy std::vector _shadowCopy; + GLenum _usage; protected: static bool _enableShadowCopy; public: From a902df93c64d174c45705003cd546f82e446ea25 Mon Sep 17 00:00:00 2001 From: SunLightJuly Date: Mon, 12 Jan 2015 15:12:01 +0800 Subject: [PATCH 090/106] modified the manual binding files to support functions call chain --- .../manual/3d/lua_cocos2dx_3d_manual.cpp | 9 ++- .../manual/cocos2d/lua_cocos2dx_manual.cpp | 57 ++++++++++++------- .../cocos2d/lua_cocos2dx_physics_manual.cpp | 9 ++- .../spine/lua_cocos2dx_spine_manual.cpp | 9 ++- 4 files changed, 56 insertions(+), 28 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp b/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp index 8eedee6a6e..7d82dad974 100644 --- a/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/3d/lua_cocos2dx_3d_manual.cpp @@ -62,7 +62,8 @@ int lua_cocos2dx_3d_Sprite3D_setBlendFunc(lua_State* L) BlendFunc blendFunc = {src, dst}; cobj->setBlendFunc(blendFunc); - return 0; + lua_settop(L, 1); + return 1; } luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Sprite3D:setBlendFunc",argc, 2); return 0; @@ -167,7 +168,8 @@ int lua_cocos2dx_3d_AABB_reset(lua_State* L) if(!ok) return 0; cobj->reset(); - return 0; + lua_settop(L, 1); + return 1; } luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.AABB:reset",argc, 0); return 0; @@ -746,7 +748,8 @@ int lua_cocos2dx_3d_OBB_reset(lua_State* L) if(!ok) return 0; cobj->reset(); - return 0; + lua_settop(L, 1); + return 1; } luaL_error(L, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.OBB:reset",argc, 0); return 0; diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp index 109a57bc4c..7fdc079b8c 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp @@ -2077,7 +2077,8 @@ int tolua_cocos2d_Node_setContentSize(lua_State* tolua_S) return 0; cobj->setContentSize(size); - return 0; + lua_settop(tolua_S, 1); + return 1; } else if(2 == argc) { @@ -2094,7 +2095,8 @@ int tolua_cocos2d_Node_setContentSize(lua_State* tolua_S) return 0; cobj->setContentSize(Size(width, height)); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:setContentSize",argc, 1); @@ -2135,7 +2137,8 @@ int tolua_cocos2d_Node_setAnchorPoint(lua_State* tolua_S) return 0; cobj->setAnchorPoint(pt); - return 0; + lua_settop(tolua_S, 1); + return 1; } else if(2 == argc) { @@ -2152,7 +2155,8 @@ int tolua_cocos2d_Node_setAnchorPoint(lua_State* tolua_S) return 0; cobj->setAnchorPoint(cocos2d::Vec2(x,y)); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:setAnchorPoint",argc, 1); @@ -2261,7 +2265,8 @@ static int lua_cocos2dx_Node_enumerateChildren(lua_State* tolua_S) return ret; }); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "enumerateChildren",argc, 2); return 0; @@ -2302,7 +2307,8 @@ int lua_cocos2dx_Node_setAdditionalTransform(lua_State* tolua_S) if (!ok) { break; } cobj->setAdditionalTransform(arg0); - return 0; + lua_settop(tolua_S, 1); + return 1; } }while(0); ok = true; @@ -2313,7 +2319,8 @@ int lua_cocos2dx_Node_setAdditionalTransform(lua_State* tolua_S) if (!ok) { break; } cobj->setAdditionalTransform(&arg0); - return 0; + lua_settop(tolua_S, 1); + return 1; } }while(0); ok = true; @@ -2410,7 +2417,8 @@ int lua_cocos2dx_Node_setPhysicsBody(lua_State* tolua_S) return 0; } cobj->setPhysicsBody(arg0); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:setPhysicsBody",argc, 1); return 0; @@ -2457,7 +2465,8 @@ int lua_cocos2dx_Node_removeFromPhysicsWorld(lua_State* tolua_S) return 0; } cobj->removeFromPhysicsWorld(); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:removeFromPhysicsWorld",argc, 0); return 0; @@ -3872,7 +3881,8 @@ int lua_cocos2dx_GLProgram_setUniformLocationWithMatrix2fv(lua_State* tolua_S) cobj->setUniformLocationWithMatrix2fv(arg0, arg1, arg2); CC_SAFE_DELETE_ARRAY(arg1); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.GLProgram:setUniformLocationWithMatrix2fv",argc, 3); return 0; @@ -3946,7 +3956,8 @@ int lua_cocos2dx_GLProgram_setUniformLocationWithMatrix3fv(lua_State* tolua_S) cobj->setUniformLocationWithMatrix3fv(arg0, arg1, arg2); CC_SAFE_DELETE_ARRAY(arg1); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.GLProgram:setUniformLocationWithMatrix3fv",argc, 3); return 0; @@ -4020,7 +4031,8 @@ int lua_cocos2dx_GLProgram_setUniformLocationWithMatrix4fv(lua_State* tolua_S) cobj->setUniformLocationWithMatrix4fv(arg0, arg1, arg2); CC_SAFE_DELETE_ARRAY(arg1); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.GLProgram:setUniformLocationWithMatrix4fv",argc, 3); return 0; @@ -4092,7 +4104,8 @@ int lua_cocos2dx_GLProgram_setUniformLocationWith3iv(lua_State* tolua_S) cobj->setUniformLocationWith3iv(arg0, arg1, arg2); CC_SAFE_DELETE_ARRAY(arg1); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.GLProgram:setUniformLocationWith3iv",argc, 3); return 0; @@ -4164,7 +4177,8 @@ int lua_cocos2dx_GLProgram_setUniformLocationWith4iv(lua_State* tolua_S) } cobj->setUniformLocationWith4iv(arg0, arg1, arg2); CC_SAFE_DELETE_ARRAY(arg1); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.GLProgram:setUniformLocationWith4iv",argc, 3); return 0; @@ -4233,7 +4247,8 @@ int lua_cocos2dx_GLProgram_setUniformLocationWith2iv(lua_State* tolua_S) cobj->setUniformLocationWith2iv(arg0, arg1, arg2); CC_SAFE_DELETE_ARRAY(arg1); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.GLProgram:setUniformLocationWith2iv",argc, 3); return 0; @@ -6578,7 +6593,8 @@ static int lua_cocos2dx_Console_addCommand(lua_State* tolua_S) }; cobj->addCommand(outValue); } - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "cc.Console:addCommand",argc, 2); return 0; @@ -6653,7 +6669,8 @@ static int lua_cocos2dx_GLProgramState_setVertexAttribPointer(lua_State* tolua_S if(!ok) return 0; cobj->setVertexAttribPointer(arg0, arg1, arg2, arg3, arg4, (void*)&arg5); - return 0; + lua_settop(tolua_S, 1); + return 1; } else if (argc == 7) { @@ -6713,7 +6730,8 @@ static int lua_cocos2dx_GLProgramState_setVertexAttribPointer(lua_State* tolua_S CC_SAFE_DELETE(arg5); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.GLProgramState:setVertexAttribPointer",argc, 6); return 0; @@ -6927,7 +6945,8 @@ int lua_cocos2dx_TMXLayer_setTiles(lua_State* tolua_S) cobj->setTiles(arg0); CC_SAFE_DELETE_ARRAY(arg0); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.TMXLayer:setTiles",argc, 1); return 0; diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_physics_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_physics_manual.cpp index 4210a0b49b..39a8fb706b 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_physics_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_physics_manual.cpp @@ -180,7 +180,8 @@ int lua_cocos2dx_physics_PhysicsWorld_rayCast(lua_State* tolua_S) return 0; cobj->rayCast(arg0, arg1, arg2, nullptr); toluafix_remove_function_by_refid(tolua_S, handler); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "rayCast",argc, 4); return 0; @@ -236,7 +237,8 @@ int lua_cocos2dx_physics_PhysicsWorld_queryRect(lua_State* tolua_S) return 0; cobj->queryRect(arg0, arg1, nullptr); toluafix_remove_function_by_refid(tolua_S, handler); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "queryRect",argc, 3); return 0; @@ -295,7 +297,8 @@ int lua_cocos2dx_physics_PhysicsWorld_queryPoint(lua_State* tolua_S) return 0; cobj->queryPoint(arg0, arg1, nullptr); toluafix_remove_function_by_refid(tolua_S, handler); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "queryPoint",argc, 3); return 0; diff --git a/cocos/scripting/lua-bindings/manual/spine/lua_cocos2dx_spine_manual.cpp b/cocos/scripting/lua-bindings/manual/spine/lua_cocos2dx_spine_manual.cpp index a5a71e250b..ad7deee34f 100644 --- a/cocos/scripting/lua-bindings/manual/spine/lua_cocos2dx_spine_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/spine/lua_cocos2dx_spine_manual.cpp @@ -364,7 +364,8 @@ static int lua_cocos2dx_spine_SkeletonAnimation_addAnimation(lua_State* tolua_S) return 0; cobj->addAnimation(arg0, arg1, arg2); - return 0; + lua_settop(tolua_S, 1); + return 1; } if (argc == 4) { @@ -385,7 +386,8 @@ static int lua_cocos2dx_spine_SkeletonAnimation_addAnimation(lua_State* tolua_S) cobj->addAnimation(arg0, arg1, arg2, arg3); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "addAnimation",argc, 3); return 0; @@ -440,7 +442,8 @@ static int lua_cocos2dx_spine_SkeletonAnimation_setAnimation(lua_State* tolua_S) cobj->setAnimation(arg0, arg1, arg2); - return 0; + lua_settop(tolua_S, 1); + return 1; } luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "setAnimation",argc, 3); return 0; From c9afc4a4d438f2e8582f3c8f5a838ed11be9091d Mon Sep 17 00:00:00 2001 From: pipu Date: Mon, 12 Jan 2015 15:17:01 +0800 Subject: [PATCH 091/106] Modify tools/tolua/cocos2dx_csloader.ini --- tools/tolua/cocos2dx_csloader.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tolua/cocos2dx_csloader.ini b/tools/tolua/cocos2dx_csloader.ini index a4710ed473..778b5b1187 100644 --- a/tools/tolua/cocos2dx_csloader.ini +++ b/tools/tolua/cocos2dx_csloader.ini @@ -36,7 +36,7 @@ classes = CSLoader # will apply to all class names. This is a convenience wildcard to be able to skip similar named # functions from all classes. -skip = CSLoader::[nodeFromXML nodeFromProtocolBuffers createTimeline nodeWithFlatBuffers createActionTimelineNode] +skip = CSLoader::[createTimeline nodeWithFlatBuffers] rename_functions = From 3a64d723de75e7e5b65ed40a66981272537f08c4 Mon Sep 17 00:00:00 2001 From: SunLightJuly Date: Mon, 12 Jan 2015 15:21:21 +0800 Subject: [PATCH 092/106] modified lua_cocos2dx_Node_setRotationQuat() to to support chain call --- .../lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp index 7fdc079b8c..43592b943b 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp @@ -2363,7 +2363,8 @@ int lua_cocos2dx_Node_setRotationQuat(lua_State* tolua_S) if (!ok) { break; } cobj->setRotationQuat(arg0); - return 0; + lua_settop(L, 1); + return 1; } }while(0); From 32450ae9a3c9a7f10ac03750272e6cb83baeafe7 Mon Sep 17 00:00:00 2001 From: andyque Date: Mon, 12 Jan 2015 16:16:39 +0800 Subject: [PATCH 093/106] fix empty http string --- .../UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.cpp index 9914773141..284dbd15e6 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIWebViewTest/UIWebViewTest.cpp @@ -71,7 +71,10 @@ bool WebViewTest::init() resetBtn->setPosition(Vec2(winSize/2) + Vec2(50, _webView->getContentSize().height/2 + resetBtn->getContentSize().height/2 + 10)); resetBtn->addClickEventListener([=](Ref*){ - _webView->loadURL(std::string("http://") + urlTextField->getString()); + if (urlTextField->getString().size() != 0) + { + _webView->loadURL(std::string("http://") + urlTextField->getString()); + } }); this->addChild(resetBtn); From 0982c6b4e5940ae057ca8526bb3272417c6dfaca Mon Sep 17 00:00:00 2001 From: pipu Date: Mon, 12 Jan 2015 16:25:33 +0800 Subject: [PATCH 094/106] Add "AlphaFrame" into cocos2dx_studio.ini. --- tools/tolua/cocos2dx_studio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tolua/cocos2dx_studio.ini b/tools/tolua/cocos2dx_studio.ini index 34639066d7..27a6346b4c 100644 --- a/tools/tolua/cocos2dx_studio.ini +++ b/tools/tolua/cocos2dx_studio.ini @@ -30,7 +30,7 @@ headers = %(cocosdir)s/cocos/editor-support/cocostudio/CocoStudio.h # what classes to produce code for. You can use regular expressions here. When testing the regular # expression, it will be enclosed in "^$", like this: "^Menu*$". -classes = Armature ArmatureAnimation Skin Bone ArmatureDataManager \w+Data$ ActionManagerEx ComAudio ComController ComAttribute ComRender BatchNode SceneReader GUIReader ActionObject Tween DisplayManager NodeReader ActionTimeline.* .*Frame$ Timeline ActionTimelineNode +classes = Armature ArmatureAnimation Skin Bone ArmatureDataManager \w+Data$ ActionManagerEx ComAudio ComController ComAttribute ComRender BatchNode SceneReader GUIReader ActionObject Tween DisplayManager NodeReader ActionTimeline.* .*Frame$ Timeline ActionTimelineNode AlphaFrame # what should we skip? in the format ClassName::[function function] # ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also From d9adda89c2b81976eac126e2bc9bcfbb09d4686d Mon Sep 17 00:00:00 2001 From: pipu Date: Mon, 12 Jan 2015 16:51:50 +0800 Subject: [PATCH 095/106] Update cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_csloader_manual.cpp --- .../lua_cocos2dx_csloader_manual.cpp | 60 ------------------- tools/tolua/cocos2dx_csloader.ini | 2 +- tools/tolua/cocos2dx_studio.ini | 2 +- 3 files changed, 2 insertions(+), 62 deletions(-) diff --git a/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_csloader_manual.cpp b/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_csloader_manual.cpp index 3525f2940a..1989ded113 100644 --- a/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_csloader_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocostudio/lua_cocos2dx_csloader_manual.cpp @@ -64,65 +64,6 @@ tolua_lerror: return 0; } -int lua_cocos2dx_csloader_CSLoader_createActionTimelineNode(lua_State* tolua_S) -{ - int argc = 0; - bool ok = true; -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertable(tolua_S, 1, "cc.CSLoader", 0, &tolua_err)) goto tolua_lerror; -#endif - - argc = lua_gettop(tolua_S) - 1; - - do - { - if (argc == 4) - { - std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2, &arg0, "cc.CSLoader:createActionTimelineNode"); - if (!ok) { break; } - int arg1; - ok &= luaval_to_int32(tolua_S, 3, (int *)&arg1, "cc.CSLoader:createActionTimelineNode"); - if (!ok) { break; } - int arg2; - ok &= luaval_to_int32(tolua_S, 4, (int *)&arg2, "cc.CSLoader:createActionTimelineNode"); - if (!ok) { break; } - bool arg3; - ok &= luaval_to_boolean(tolua_S, 5, &arg3, "cc.CSLoader:createActionTimelineNode"); - if (!ok) { break; } - cocostudio::timeline::ActionTimelineNode* ret = cocos2d::CSLoader::createActionTimelineNode(arg0, arg1, arg2, arg3); - object_to_luaval(tolua_S, "ccs.ActionTimelineNode", (cocostudio::timeline::ActionTimelineNode*)ret); - return 1; - } - } while (0); - ok = true; - do - { - if (argc == 1) - { - std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2, &arg0, "cc.CSLoader:createActionTimelineNode"); - if (!ok) { break; } - cocostudio::timeline::ActionTimelineNode* ret = cocos2d::CSLoader::createActionTimelineNode(arg0); - object_to_luaval(tolua_S, "ccs.ActionTimelineNode", (cocostudio::timeline::ActionTimelineNode*)ret); - return 1; - } - } while (0); - ok = true; - CCLOG("%s has wrong number of arguments: %d, was expecting %d", "cc.CSLoader:createActionTimelineNode", argc, 1); - return 0; -#if COCOS2D_DEBUG >= 1 -tolua_lerror: - tolua_error(tolua_S, "#ferror in function 'lua_cocos2dx_csloader_CSLoader_createActionTimelineNode'.", &tolua_err); -#endif - return 0; - -} - int register_all_cocos2dx_csloader_manual(lua_State* L) { lua_pushstring(L, "cc.CSLoader"); @@ -130,7 +71,6 @@ int register_all_cocos2dx_csloader_manual(lua_State* L) if (lua_istable(L,-1)) { tolua_function(L, "createTimeline", lua_cocos2dx_csloader_CSLoader_createTimeline); - tolua_function(L, "createActionTimelineNode", lua_cocos2dx_csloader_CSLoader_createActionTimelineNode); } lua_pop(L, 1); diff --git a/tools/tolua/cocos2dx_csloader.ini b/tools/tolua/cocos2dx_csloader.ini index 778b5b1187..a4710ed473 100644 --- a/tools/tolua/cocos2dx_csloader.ini +++ b/tools/tolua/cocos2dx_csloader.ini @@ -36,7 +36,7 @@ classes = CSLoader # will apply to all class names. This is a convenience wildcard to be able to skip similar named # functions from all classes. -skip = CSLoader::[createTimeline nodeWithFlatBuffers] +skip = CSLoader::[nodeFromXML nodeFromProtocolBuffers createTimeline nodeWithFlatBuffers createActionTimelineNode] rename_functions = diff --git a/tools/tolua/cocos2dx_studio.ini b/tools/tolua/cocos2dx_studio.ini index 27a6346b4c..34639066d7 100644 --- a/tools/tolua/cocos2dx_studio.ini +++ b/tools/tolua/cocos2dx_studio.ini @@ -30,7 +30,7 @@ headers = %(cocosdir)s/cocos/editor-support/cocostudio/CocoStudio.h # what classes to produce code for. You can use regular expressions here. When testing the regular # expression, it will be enclosed in "^$", like this: "^Menu*$". -classes = Armature ArmatureAnimation Skin Bone ArmatureDataManager \w+Data$ ActionManagerEx ComAudio ComController ComAttribute ComRender BatchNode SceneReader GUIReader ActionObject Tween DisplayManager NodeReader ActionTimeline.* .*Frame$ Timeline ActionTimelineNode AlphaFrame +classes = Armature ArmatureAnimation Skin Bone ArmatureDataManager \w+Data$ ActionManagerEx ComAudio ComController ComAttribute ComRender BatchNode SceneReader GUIReader ActionObject Tween DisplayManager NodeReader ActionTimeline.* .*Frame$ Timeline ActionTimelineNode # what should we skip? in the format ClassName::[function function] # ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also From c7a923b6583309314c1694d5bd982b1fbf8d8c7f Mon Sep 17 00:00:00 2001 From: pipu Date: Mon, 12 Jan 2015 17:59:30 +0800 Subject: [PATCH 096/106] Update method clone() for InnerActionFrame. --- cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp index 430f6fea5a..733b774544 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCFrame.cpp @@ -554,6 +554,7 @@ Frame* InnerActionFrame::clone() { InnerActionFrame* frame = InnerActionFrame::create(); frame->setInnerActionType(_innerActionType); + frame->setSingleFrameIndex(_singleFrameIndex); if(_enterWithName) { frame->setEnterWithName(true); From aaccdef1ebd3b0c053a0fdc0776c15c04d1e85ff Mon Sep 17 00:00:00 2001 From: pipu Date: Mon, 12 Jan 2015 19:14:04 +0800 Subject: [PATCH 097/106] Modify cocos/editor-support/cocostudio/CMakeLists.txt. --- cocos/editor-support/cocostudio/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cocos/editor-support/cocostudio/CMakeLists.txt b/cocos/editor-support/cocostudio/CMakeLists.txt index 238b094634..d877ba9349 100644 --- a/cocos/editor-support/cocostudio/CMakeLists.txt +++ b/cocos/editor-support/cocostudio/CMakeLists.txt @@ -3,6 +3,8 @@ if(WINDOWS AND BUILD_SHARED_LIBS) ADD_DEFINITIONS (-D_USRSTUDIODLL) endif() +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions") + set(COCOS_CS_SRC editor-support/cocostudio/CCActionFrame.cpp From e5204ed89f12fed98c765587e7a5bea9836d6797 Mon Sep 17 00:00:00 2001 From: minggo Date: Mon, 12 Jan 2015 19:40:40 +0800 Subject: [PATCH 098/106] [ci skip] Update CHANGELOG --- CHANGELOG | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index b03b134b2a..98c58ce173 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +cocos2d-x-3.4 Jan.15 2015 + [NEW] VertexBuffer&IndexBuffer: allow setting usage(GL_STATIC_DRAW or GL_DYNAMIC_DRAW) in create method + + [FIX] GLProgramState: may cause GL_INVALID_VALUE error at start up on Android + cocos2d-x-3.4rc0 Jan.9 2015 [NEW] 3rd: update libcurl to v7.39 [NEW] 3rd: update luajit to v2.0.3 From b18cfe3f801bb7caa60797e6f82455f25056ed24 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Mon, 12 Jan 2015 20:03:36 +0800 Subject: [PATCH 099/106] [ci skip] update Authors --- AUTHORS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AUTHORS b/AUTHORS index dec4bf7097..b59ff826ed 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1068,6 +1068,9 @@ Developers: takaokato Fix wrong result in Node:getParenttoNodeTransform() if node is transformed + + AknEp + Fix FileUtils::fullPathForFilename return empty string if file not found Retired Core Developers: WenSheng Yang From 93d1d9c940cce5f12f7139dbb1456bb7d0072f88 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Mon, 12 Jan 2015 12:08:54 +0000 Subject: [PATCH 100/106] [AUTO]: updating luabinding automatically --- .../lua-bindings/auto/api/ActionTimeline.lua | 68 +- .../lua-bindings/auto/api/AlphaFrame.lua | 42 + .../auto/api/InnerActionFrame.lua | 40 +- .../auto/api/lua_cocos2dx_studio_auto_api.lua | 5 + .../auto/lua_cocos2dx_studio_auto.cpp | 1045 +++++++++++++---- .../auto/lua_cocos2dx_studio_auto.hpp | 13 + 6 files changed, 956 insertions(+), 257 deletions(-) create mode 100644 cocos/scripting/lua-bindings/auto/api/AlphaFrame.lua diff --git a/cocos/scripting/lua-bindings/auto/api/ActionTimeline.lua b/cocos/scripting/lua-bindings/auto/api/ActionTimeline.lua index 1012c8894b..3db4d9858b 100644 --- a/cocos/scripting/lua-bindings/auto/api/ActionTimeline.lua +++ b/cocos/scripting/lua-bindings/auto/api/ActionTimeline.lua @@ -33,18 +33,6 @@ -- @function [parent=#ActionTimeline] pause -- @param self --------------------------------- --- @overload self, int, bool --- @overload self, int --- @overload self, int, int, bool --- @overload self, int, int, int, bool --- @function [parent=#ActionTimeline] gotoFrameAndPlay --- @param self --- @param #int startIndex --- @param #int endIndex --- @param #int currentFrameIndex --- @param #bool loop - -------------------------------- -- -- @function [parent=#ActionTimeline] init @@ -57,6 +45,11 @@ -- @param self -- @param #ccs.Timeline timeline +-------------------------------- +-- +-- @function [parent=#ActionTimeline] clearFrameEventCallFunc +-- @param self + -------------------------------- -- Last frame callback will call when arriving last frame -- @function [parent=#ActionTimeline] setLastFrameCallFunc @@ -73,20 +66,39 @@ -- -- @function [parent=#ActionTimeline] play -- @param self --- @param #string name +-- @param #string animationName -- @param #bool loop +-------------------------------- +-- +-- @function [parent=#ActionTimeline] getAnimationInfo +-- @param self +-- @param #string animationName +-- @return AnimationInfo#AnimationInfo ret (return value: ccs.AnimationInfo) + -------------------------------- -- Resume the animation. -- @function [parent=#ActionTimeline] resume -- @param self +-------------------------------- +-- +-- @function [parent=#ActionTimeline] removeAnimationInfo +-- @param self +-- @param #string animationName + -------------------------------- -- Get current animation speed. -- @function [parent=#ActionTimeline] getTimeSpeed -- @param self -- @return float#float ret (return value: float) +-------------------------------- +-- AnimationInfo +-- @function [parent=#ActionTimeline] addAnimationInfo +-- @param self +-- @param #ccs.AnimationInfo animationInfo + -------------------------------- -- -- @function [parent=#ActionTimeline] getDuration @@ -107,15 +119,23 @@ -- @return bool#bool ret (return value: bool) -------------------------------- --- --- @function [parent=#ActionTimeline] removeIndexes +-- @overload self, int, bool +-- @overload self, int +-- @overload self, int, int, bool +-- @overload self, int, int, int, bool +-- @function [parent=#ActionTimeline] gotoFrameAndPlay -- @param self --- @param #string name - +-- @param #int startIndex +-- @param #int endIndex +-- @param #int currentFrameIndex +-- @param #bool loop + -------------------------------- -- --- @function [parent=#ActionTimeline] clearFrameEventCallFunc +-- @function [parent=#ActionTimeline] IsAnimationInfoExists -- @param self +-- @param #string animationName +-- @return bool#bool ret (return value: bool) -------------------------------- -- End frame of this action.
@@ -125,12 +145,6 @@ -- @param self -- @return int#int ret (return value: int) --------------------------------- --- Set current frame index, this will cause action plays to this frame. --- @function [parent=#ActionTimeline] setCurrentFrame --- @param self --- @param #int frameIndex - -------------------------------- -- Set the animation speed, this will speed up or slow down the speed. -- @function [parent=#ActionTimeline] setTimeSpeed @@ -149,10 +163,10 @@ -- @param #int duration -------------------------------- --- add ActionIndexes --- @function [parent=#ActionTimeline] addIndexes +-- Set current frame index, this will cause action plays to this frame. +-- @function [parent=#ActionTimeline] setCurrentFrame -- @param self --- @param #ccs.ActionIndexes indexes +-- @param #int frameIndex -------------------------------- -- diff --git a/cocos/scripting/lua-bindings/auto/api/AlphaFrame.lua b/cocos/scripting/lua-bindings/auto/api/AlphaFrame.lua new file mode 100644 index 0000000000..d4ca6bb842 --- /dev/null +++ b/cocos/scripting/lua-bindings/auto/api/AlphaFrame.lua @@ -0,0 +1,42 @@ + +-------------------------------- +-- @module AlphaFrame +-- @extend Frame +-- @parent_module ccs + +-------------------------------- +-- +-- @function [parent=#AlphaFrame] getAlpha +-- @param self +-- @return unsigned char#unsigned char ret (return value: unsigned char) + +-------------------------------- +-- +-- @function [parent=#AlphaFrame] setAlpha +-- @param self +-- @param #unsigned char alpha + +-------------------------------- +-- +-- @function [parent=#AlphaFrame] create +-- @param self +-- @return AlphaFrame#AlphaFrame ret (return value: ccs.AlphaFrame) + +-------------------------------- +-- +-- @function [parent=#AlphaFrame] apply +-- @param self +-- @param #float percent + +-------------------------------- +-- +-- @function [parent=#AlphaFrame] clone +-- @param self +-- @return Frame#Frame ret (return value: ccs.Frame) + +-------------------------------- +-- +-- @function [parent=#AlphaFrame] AlphaFrame +-- @param self + +return nil diff --git a/cocos/scripting/lua-bindings/auto/api/InnerActionFrame.lua b/cocos/scripting/lua-bindings/auto/api/InnerActionFrame.lua index 1ca735b5ef..8237d881d7 100644 --- a/cocos/scripting/lua-bindings/auto/api/InnerActionFrame.lua +++ b/cocos/scripting/lua-bindings/auto/api/InnerActionFrame.lua @@ -4,18 +4,54 @@ -- @extend Frame -- @parent_module ccs +-------------------------------- +-- +-- @function [parent=#InnerActionFrame] getEndFrameIndex +-- @param self +-- @return int#int ret (return value: int) + +-------------------------------- +-- +-- @function [parent=#InnerActionFrame] getStartFrameIndex +-- @param self +-- @return int#int ret (return value: int) + -------------------------------- -- -- @function [parent=#InnerActionFrame] getInnerActionType -- @param self -- @return int#int ret (return value: int) +-------------------------------- +-- +-- @function [parent=#InnerActionFrame] setEndFrameIndex +-- @param self +-- @param #int frameIndex + +-------------------------------- +-- +-- @function [parent=#InnerActionFrame] setEnterWithName +-- @param self +-- @param #bool isEnterWithName + +-------------------------------- +-- +-- @function [parent=#InnerActionFrame] setSingleFrameIndex +-- @param self +-- @param #int frameIndex + -------------------------------- -- -- @function [parent=#InnerActionFrame] setStartFrameIndex -- @param self -- @param #int frameIndex +-------------------------------- +-- +-- @function [parent=#InnerActionFrame] getSingleFrameIndex +-- @param self +-- @return int#int ret (return value: int) + -------------------------------- -- -- @function [parent=#InnerActionFrame] setInnerActionType @@ -24,9 +60,9 @@ -------------------------------- -- --- @function [parent=#InnerActionFrame] getStartFrameIndex +-- @function [parent=#InnerActionFrame] setAnimationName -- @param self --- @return int#int ret (return value: int) +-- @param #string animationNamed -------------------------------- -- diff --git a/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_studio_auto_api.lua b/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_studio_auto_api.lua index 2c1a6f7f29..31610513d1 100644 --- a/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_studio_auto_api.lua +++ b/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_studio_auto_api.lua @@ -236,6 +236,11 @@ -- @field [parent=#ccs] ColorFrame#ColorFrame ColorFrame preloaded module +-------------------------------------------------------- +-- the ccs AlphaFrame +-- @field [parent=#ccs] AlphaFrame#AlphaFrame AlphaFrame preloaded module + + -------------------------------------------------------- -- the ccs EventFrame -- @field [parent=#ccs] EventFrame#EventFrame EventFrame preloaded module diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp index 6b7dba851f..c6f5763df3 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp @@ -18228,6 +18228,100 @@ int lua_register_cocos2dx_studio_AnchorPointFrame(lua_State* tolua_S) return 1; } +int lua_cocos2dx_studio_InnerActionFrame_getEndFrameIndex(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::InnerActionFrame* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.InnerActionFrame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::InnerActionFrame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_InnerActionFrame_getEndFrameIndex'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_InnerActionFrame_getEndFrameIndex'", nullptr); + return 0; + } + int ret = cobj->getEndFrameIndex(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.InnerActionFrame:getEndFrameIndex",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_InnerActionFrame_getEndFrameIndex'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::InnerActionFrame* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.InnerActionFrame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::InnerActionFrame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex'", nullptr); + return 0; + } + int ret = cobj->getStartFrameIndex(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.InnerActionFrame:getStartFrameIndex",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_InnerActionFrame_getInnerActionType(lua_State* tolua_S) { int argc = 0; @@ -18275,6 +18369,153 @@ int lua_cocos2dx_studio_InnerActionFrame_getInnerActionType(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_InnerActionFrame_setEndFrameIndex(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::InnerActionFrame* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.InnerActionFrame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::InnerActionFrame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_InnerActionFrame_setEndFrameIndex'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + int arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.InnerActionFrame:setEndFrameIndex"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_InnerActionFrame_setEndFrameIndex'", nullptr); + return 0; + } + cobj->setEndFrameIndex(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.InnerActionFrame:setEndFrameIndex",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_InnerActionFrame_setEndFrameIndex'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_InnerActionFrame_setEnterWithName(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::InnerActionFrame* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.InnerActionFrame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::InnerActionFrame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_InnerActionFrame_setEnterWithName'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccs.InnerActionFrame:setEnterWithName"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_InnerActionFrame_setEnterWithName'", nullptr); + return 0; + } + cobj->setEnterWithName(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.InnerActionFrame:setEnterWithName",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_InnerActionFrame_setEnterWithName'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_InnerActionFrame_setSingleFrameIndex(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::InnerActionFrame* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.InnerActionFrame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::InnerActionFrame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_InnerActionFrame_setSingleFrameIndex'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + int arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.InnerActionFrame:setSingleFrameIndex"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_InnerActionFrame_setSingleFrameIndex'", nullptr); + return 0; + } + cobj->setSingleFrameIndex(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.InnerActionFrame:setSingleFrameIndex",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_InnerActionFrame_setSingleFrameIndex'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_InnerActionFrame_setStartFrameIndex(lua_State* tolua_S) { int argc = 0; @@ -18324,6 +18565,53 @@ int lua_cocos2dx_studio_InnerActionFrame_setStartFrameIndex(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_InnerActionFrame_getSingleFrameIndex(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::InnerActionFrame* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.InnerActionFrame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::InnerActionFrame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_InnerActionFrame_getSingleFrameIndex'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_InnerActionFrame_getSingleFrameIndex'", nullptr); + return 0; + } + int ret = cobj->getSingleFrameIndex(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.InnerActionFrame:getSingleFrameIndex",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_InnerActionFrame_getSingleFrameIndex'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_InnerActionFrame_setInnerActionType(lua_State* tolua_S) { int argc = 0; @@ -18373,7 +18661,7 @@ int lua_cocos2dx_studio_InnerActionFrame_setInnerActionType(lua_State* tolua_S) return 0; } -int lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex(lua_State* tolua_S) +int lua_cocos2dx_studio_InnerActionFrame_setAnimationName(lua_State* tolua_S) { int argc = 0; cocostudio::timeline::InnerActionFrame* cobj = nullptr; @@ -18393,29 +18681,31 @@ int lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_InnerActionFrame_setAnimationName'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; - if (argc == 0) + if (argc == 1) { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccs.InnerActionFrame:setAnimationName"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_InnerActionFrame_setAnimationName'", nullptr); return 0; } - int ret = cobj->getStartFrameIndex(); - tolua_pushnumber(tolua_S,(lua_Number)ret); - return 1; + cobj->setAnimationName(arg0); + return 0; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.InnerActionFrame:getStartFrameIndex",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.InnerActionFrame:setAnimationName",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_InnerActionFrame_setAnimationName'.",&tolua_err); #endif return 0; @@ -18504,10 +18794,16 @@ int lua_register_cocos2dx_studio_InnerActionFrame(lua_State* tolua_S) tolua_beginmodule(tolua_S,"InnerActionFrame"); tolua_function(tolua_S,"new",lua_cocos2dx_studio_InnerActionFrame_constructor); - tolua_function(tolua_S,"getInnerActionType",lua_cocos2dx_studio_InnerActionFrame_getInnerActionType); - tolua_function(tolua_S,"setStartFrameIndex",lua_cocos2dx_studio_InnerActionFrame_setStartFrameIndex); - tolua_function(tolua_S,"setInnerActionType",lua_cocos2dx_studio_InnerActionFrame_setInnerActionType); + tolua_function(tolua_S,"getEndFrameIndex",lua_cocos2dx_studio_InnerActionFrame_getEndFrameIndex); tolua_function(tolua_S,"getStartFrameIndex",lua_cocos2dx_studio_InnerActionFrame_getStartFrameIndex); + tolua_function(tolua_S,"getInnerActionType",lua_cocos2dx_studio_InnerActionFrame_getInnerActionType); + tolua_function(tolua_S,"setEndFrameIndex",lua_cocos2dx_studio_InnerActionFrame_setEndFrameIndex); + tolua_function(tolua_S,"setEnterWithName",lua_cocos2dx_studio_InnerActionFrame_setEnterWithName); + tolua_function(tolua_S,"setSingleFrameIndex",lua_cocos2dx_studio_InnerActionFrame_setSingleFrameIndex); + tolua_function(tolua_S,"setStartFrameIndex",lua_cocos2dx_studio_InnerActionFrame_setStartFrameIndex); + tolua_function(tolua_S,"getSingleFrameIndex",lua_cocos2dx_studio_InnerActionFrame_getSingleFrameIndex); + tolua_function(tolua_S,"setInnerActionType",lua_cocos2dx_studio_InnerActionFrame_setInnerActionType); + tolua_function(tolua_S,"setAnimationName",lua_cocos2dx_studio_InnerActionFrame_setAnimationName); tolua_function(tolua_S,"create", lua_cocos2dx_studio_InnerActionFrame_create); tolua_endmodule(tolua_S); std::string typeName = typeid(cocostudio::timeline::InnerActionFrame).name(); @@ -18804,6 +19100,196 @@ int lua_register_cocos2dx_studio_ColorFrame(lua_State* tolua_S) return 1; } +int lua_cocos2dx_studio_AlphaFrame_getAlpha(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::AlphaFrame* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.AlphaFrame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::AlphaFrame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_AlphaFrame_getAlpha'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_AlphaFrame_getAlpha'", nullptr); + return 0; + } + uint16_t ret = cobj->getAlpha(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.AlphaFrame:getAlpha",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_AlphaFrame_getAlpha'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_AlphaFrame_setAlpha(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::AlphaFrame* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.AlphaFrame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::AlphaFrame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_AlphaFrame_setAlpha'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + uint16_t arg0; + + ok &= luaval_to_uint16(tolua_S, 2,&arg0, "ccs.AlphaFrame:setAlpha"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_AlphaFrame_setAlpha'", nullptr); + return 0; + } + cobj->setAlpha(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.AlphaFrame:setAlpha",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_AlphaFrame_setAlpha'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_AlphaFrame_create(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"ccs.AlphaFrame",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_AlphaFrame_create'", nullptr); + return 0; + } + cocostudio::timeline::AlphaFrame* ret = cocostudio::timeline::AlphaFrame::create(); + object_to_luaval(tolua_S, "ccs.AlphaFrame",(cocostudio::timeline::AlphaFrame*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccs.AlphaFrame:create",argc, 0); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_AlphaFrame_create'.",&tolua_err); +#endif + return 0; +} +int lua_cocos2dx_studio_AlphaFrame_constructor(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::AlphaFrame* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_AlphaFrame_constructor'", nullptr); + return 0; + } + cobj = new cocostudio::timeline::AlphaFrame(); + cobj->autorelease(); + int ID = (int)cobj->_ID ; + int* luaID = &cobj->_luaID ; + toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccs.AlphaFrame"); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.AlphaFrame:AlphaFrame",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_AlphaFrame_constructor'.",&tolua_err); +#endif + + return 0; +} + +static int lua_cocos2dx_studio_AlphaFrame_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (AlphaFrame)"); + return 0; +} + +int lua_register_cocos2dx_studio_AlphaFrame(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"ccs.AlphaFrame"); + tolua_cclass(tolua_S,"AlphaFrame","ccs.AlphaFrame","ccs.Frame",nullptr); + + tolua_beginmodule(tolua_S,"AlphaFrame"); + tolua_function(tolua_S,"new",lua_cocos2dx_studio_AlphaFrame_constructor); + tolua_function(tolua_S,"getAlpha",lua_cocos2dx_studio_AlphaFrame_getAlpha); + tolua_function(tolua_S,"setAlpha",lua_cocos2dx_studio_AlphaFrame_setAlpha); + tolua_function(tolua_S,"create", lua_cocos2dx_studio_AlphaFrame_create); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocostudio::timeline::AlphaFrame).name(); + g_luaType[typeName] = "ccs.AlphaFrame"; + g_typeCast["AlphaFrame"] = "ccs.AlphaFrame"; + return 1; +} + int lua_cocos2dx_studio_EventFrame_setEvent(lua_State* tolua_S) { int argc = 0; @@ -20412,105 +20898,6 @@ int lua_cocos2dx_studio_ActionTimeline_pause(lua_State* tolua_S) return 0; } -int lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay(lua_State* tolua_S) -{ - int argc = 0; - cocostudio::timeline::ActionTimeline* cobj = nullptr; - bool ok = true; -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; -#endif - cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay'", nullptr); - return 0; - } -#endif - argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 2) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - bool arg1; - ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - cobj->gotoFrameAndPlay(arg0, arg1); - return 0; - } - }while(0); - ok = true; - do{ - if (argc == 1) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - cobj->gotoFrameAndPlay(arg0); - return 0; - } - }while(0); - ok = true; - do{ - if (argc == 3) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - int arg1; - ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - bool arg2; - ok &= luaval_to_boolean(tolua_S, 4,&arg2, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - cobj->gotoFrameAndPlay(arg0, arg1, arg2); - return 0; - } - }while(0); - ok = true; - do{ - if (argc == 4) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - int arg1; - ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - int arg2; - ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - bool arg3; - ok &= luaval_to_boolean(tolua_S, 5,&arg3, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - cobj->gotoFrameAndPlay(arg0, arg1, arg2, arg3); - return 0; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:gotoFrameAndPlay",argc, 4); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_studio_ActionTimeline_init(lua_State* tolua_S) { int argc = 0; @@ -20607,6 +20994,52 @@ int lua_cocos2dx_studio_ActionTimeline_removeTimeline(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimeline* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc'", nullptr); + return 0; + } + cobj->clearFrameEventCallFunc(); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:clearFrameEventCallFunc",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ActionTimeline_setLastFrameCallFunc(lua_State* tolua_S) { int argc = 0; @@ -20759,6 +21192,56 @@ int lua_cocos2dx_studio_ActionTimeline_play(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ActionTimeline_getAnimationInfo(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimeline* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_getAnimationInfo'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccs.ActionTimeline:getAnimationInfo"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_getAnimationInfo'", nullptr); + return 0; + } + cocostudio::timeline::AnimationInfo ret = cobj->getAnimationInfo(arg0); + #pragma warning NO CONVERSION FROM NATIVE FOR AnimationInfo; + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:getAnimationInfo",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_getAnimationInfo'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ActionTimeline_resume(lua_State* tolua_S) { int argc = 0; @@ -20805,6 +21288,55 @@ int lua_cocos2dx_studio_ActionTimeline_resume(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ActionTimeline_removeAnimationInfo(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimeline* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_removeAnimationInfo'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccs.ActionTimeline:removeAnimationInfo"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_removeAnimationInfo'", nullptr); + return 0; + } + cobj->removeAnimationInfo(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:removeAnimationInfo",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_removeAnimationInfo'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ActionTimeline_getTimeSpeed(lua_State* tolua_S) { int argc = 0; @@ -20852,6 +21384,56 @@ int lua_cocos2dx_studio_ActionTimeline_getTimeSpeed(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ActionTimeline_addAnimationInfo(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimeline* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_addAnimationInfo'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocostudio::timeline::AnimationInfo arg0; + + #pragma warning NO CONVERSION TO NATIVE FOR AnimationInfo + ok = false; + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_addAnimationInfo'", nullptr); + return 0; + } + cobj->addAnimationInfo(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:addAnimationInfo",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_addAnimationInfo'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ActionTimeline_getDuration(lua_State* tolua_S) { int argc = 0; @@ -20995,7 +21577,106 @@ int lua_cocos2dx_studio_ActionTimeline_isPlaying(lua_State* tolua_S) return 0; } -int lua_cocos2dx_studio_ActionTimeline_removeIndexes(lua_State* tolua_S) +int lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimeline* cobj = nullptr; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 2) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + bool arg1; + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + cobj->gotoFrameAndPlay(arg0, arg1); + return 0; + } + }while(0); + ok = true; + do{ + if (argc == 1) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + cobj->gotoFrameAndPlay(arg0); + return 0; + } + }while(0); + ok = true; + do{ + if (argc == 3) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + int arg1; + ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + bool arg2; + ok &= luaval_to_boolean(tolua_S, 4,&arg2, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + cobj->gotoFrameAndPlay(arg0, arg1, arg2); + return 0; + } + }while(0); + ok = true; + do{ + if (argc == 4) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + int arg1; + ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + int arg2; + ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + bool arg3; + ok &= luaval_to_boolean(tolua_S, 5,&arg3, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + cobj->gotoFrameAndPlay(arg0, arg1, arg2, arg3); + return 0; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:gotoFrameAndPlay",argc, 4); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_ActionTimeline_IsAnimationInfoExists(lua_State* tolua_S) { int argc = 0; cocostudio::timeline::ActionTimeline* cobj = nullptr; @@ -21015,7 +21696,7 @@ int lua_cocos2dx_studio_ActionTimeline_removeIndexes(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_removeIndexes'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_IsAnimationInfoExists'", nullptr); return 0; } #endif @@ -21025,67 +21706,22 @@ int lua_cocos2dx_studio_ActionTimeline_removeIndexes(lua_State* tolua_S) { std::string arg0; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccs.ActionTimeline:removeIndexes"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccs.ActionTimeline:IsAnimationInfoExists"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_removeIndexes'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_IsAnimationInfoExists'", nullptr); return 0; } - cobj->removeIndexes(arg0); - return 0; + bool ret = cobj->IsAnimationInfoExists(arg0); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:removeIndexes",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:IsAnimationInfoExists",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_removeIndexes'.",&tolua_err); -#endif - - return 0; -} -int lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc(lua_State* tolua_S) -{ - int argc = 0; - cocostudio::timeline::ActionTimeline* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc'", nullptr); - return 0; - } - cobj->clearFrameEventCallFunc(); - return 0; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:clearFrameEventCallFunc",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_IsAnimationInfoExists'.",&tolua_err); #endif return 0; @@ -21137,55 +21773,6 @@ int lua_cocos2dx_studio_ActionTimeline_getEndFrame(lua_State* tolua_S) return 0; } -int lua_cocos2dx_studio_ActionTimeline_setCurrentFrame(lua_State* tolua_S) -{ - int argc = 0; - cocostudio::timeline::ActionTimeline* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - int arg0; - - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:setCurrentFrame"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'", nullptr); - return 0; - } - cobj->setCurrentFrame(arg0); - return 0; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:setCurrentFrame",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_studio_ActionTimeline_setTimeSpeed(lua_State* tolua_S) { int argc = 0; @@ -21330,7 +21917,7 @@ int lua_cocos2dx_studio_ActionTimeline_setDuration(lua_State* tolua_S) return 0; } -int lua_cocos2dx_studio_ActionTimeline_addIndexes(lua_State* tolua_S) +int lua_cocos2dx_studio_ActionTimeline_setCurrentFrame(lua_State* tolua_S) { int argc = 0; cocostudio::timeline::ActionTimeline* cobj = nullptr; @@ -21350,7 +21937,7 @@ int lua_cocos2dx_studio_ActionTimeline_addIndexes(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_addIndexes'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'", nullptr); return 0; } #endif @@ -21358,24 +21945,23 @@ int lua_cocos2dx_studio_ActionTimeline_addIndexes(lua_State* tolua_S) argc = lua_gettop(tolua_S)-1; if (argc == 1) { - cocostudio::timeline::ActionIndexes arg0; + int arg0; - #pragma warning NO CONVERSION TO NATIVE FOR ActionIndexes - ok = false; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:setCurrentFrame"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_addIndexes'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'", nullptr); return 0; } - cobj->addIndexes(arg0); + cobj->setCurrentFrame(arg0); return 0; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:addIndexes",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:setCurrentFrame",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_addIndexes'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'.",&tolua_err); #endif return 0; @@ -21469,25 +22055,27 @@ int lua_register_cocos2dx_studio_ActionTimeline(lua_State* tolua_S) tolua_function(tolua_S,"getCurrentFrame",lua_cocos2dx_studio_ActionTimeline_getCurrentFrame); tolua_function(tolua_S,"getStartFrame",lua_cocos2dx_studio_ActionTimeline_getStartFrame); tolua_function(tolua_S,"pause",lua_cocos2dx_studio_ActionTimeline_pause); - tolua_function(tolua_S,"gotoFrameAndPlay",lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay); tolua_function(tolua_S,"init",lua_cocos2dx_studio_ActionTimeline_init); tolua_function(tolua_S,"removeTimeline",lua_cocos2dx_studio_ActionTimeline_removeTimeline); + tolua_function(tolua_S,"clearFrameEventCallFunc",lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc); tolua_function(tolua_S,"setLastFrameCallFunc",lua_cocos2dx_studio_ActionTimeline_setLastFrameCallFunc); tolua_function(tolua_S,"getTimelines",lua_cocos2dx_studio_ActionTimeline_getTimelines); tolua_function(tolua_S,"play",lua_cocos2dx_studio_ActionTimeline_play); + tolua_function(tolua_S,"getAnimationInfo",lua_cocos2dx_studio_ActionTimeline_getAnimationInfo); tolua_function(tolua_S,"resume",lua_cocos2dx_studio_ActionTimeline_resume); + tolua_function(tolua_S,"removeAnimationInfo",lua_cocos2dx_studio_ActionTimeline_removeAnimationInfo); tolua_function(tolua_S,"getTimeSpeed",lua_cocos2dx_studio_ActionTimeline_getTimeSpeed); + tolua_function(tolua_S,"addAnimationInfo",lua_cocos2dx_studio_ActionTimeline_addAnimationInfo); tolua_function(tolua_S,"getDuration",lua_cocos2dx_studio_ActionTimeline_getDuration); tolua_function(tolua_S,"gotoFrameAndPause",lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPause); tolua_function(tolua_S,"isPlaying",lua_cocos2dx_studio_ActionTimeline_isPlaying); - tolua_function(tolua_S,"removeIndexes",lua_cocos2dx_studio_ActionTimeline_removeIndexes); - tolua_function(tolua_S,"clearFrameEventCallFunc",lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc); + tolua_function(tolua_S,"gotoFrameAndPlay",lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay); + tolua_function(tolua_S,"IsAnimationInfoExists",lua_cocos2dx_studio_ActionTimeline_IsAnimationInfoExists); tolua_function(tolua_S,"getEndFrame",lua_cocos2dx_studio_ActionTimeline_getEndFrame); - tolua_function(tolua_S,"setCurrentFrame",lua_cocos2dx_studio_ActionTimeline_setCurrentFrame); tolua_function(tolua_S,"setTimeSpeed",lua_cocos2dx_studio_ActionTimeline_setTimeSpeed); tolua_function(tolua_S,"clearLastFrameCallFunc",lua_cocos2dx_studio_ActionTimeline_clearLastFrameCallFunc); tolua_function(tolua_S,"setDuration",lua_cocos2dx_studio_ActionTimeline_setDuration); - tolua_function(tolua_S,"addIndexes",lua_cocos2dx_studio_ActionTimeline_addIndexes); + tolua_function(tolua_S,"setCurrentFrame",lua_cocos2dx_studio_ActionTimeline_setCurrentFrame); tolua_function(tolua_S,"create", lua_cocos2dx_studio_ActionTimeline_create); tolua_endmodule(tolua_S); std::string typeName = typeid(cocostudio::timeline::ActionTimeline).name(); @@ -21898,6 +22486,7 @@ TOLUA_API int register_all_cocos2dx_studio(lua_State* tolua_S) lua_register_cocos2dx_studio_ActionMoveFrame(tolua_S); lua_register_cocos2dx_studio_SceneReader(tolua_S); lua_register_cocos2dx_studio_ActionTimelineCache(tolua_S); + lua_register_cocos2dx_studio_AlphaFrame(tolua_S); lua_register_cocos2dx_studio_AnimationData(tolua_S); lua_register_cocos2dx_studio_AnchorPointFrame(tolua_S); lua_register_cocos2dx_studio_ActionScaleFrame(tolua_S); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp index d32028d033..5826ecde7d 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp @@ -487,6 +487,19 @@ int register_all_cocos2dx_studio(lua_State* tolua_S); + + + + + + + + + + + + + From 27da58e4b5f608321f6f1ee6c81fd39404c0d9a6 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Mon, 12 Jan 2015 12:13:39 +0000 Subject: [PATCH 101/106] [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 67e51c30ab..0a5759f301 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -4690,6 +4690,7 @@ "cocos/scripting/lua-bindings/auto/api/ActionTimelineNode.lua", "cocos/scripting/lua-bindings/auto/api/ActionTintFrame.lua", "cocos/scripting/lua-bindings/auto/api/ActionTween.lua", + "cocos/scripting/lua-bindings/auto/api/AlphaFrame.lua", "cocos/scripting/lua-bindings/auto/api/AmbientLight.lua", "cocos/scripting/lua-bindings/auto/api/AnchorPointFrame.lua", "cocos/scripting/lua-bindings/auto/api/Animate.lua", From 5d781d7eb43f5afef73b956070f63b42b0570359 Mon Sep 17 00:00:00 2001 From: jianglong0156 Date: Mon, 12 Jan 2015 20:49:43 +0800 Subject: [PATCH 102/106] issue cocos2d/cocos2d-js #2563 : cccomrender need to use its constructor in jsb code. So i modify the constructor to public --- cocos/editor-support/cocostudio/CCComRender.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/editor-support/cocostudio/CCComRender.h b/cocos/editor-support/cocostudio/CCComRender.h index 0ff90d979c..02b6e3fdd5 100644 --- a/cocos/editor-support/cocostudio/CCComRender.h +++ b/cocos/editor-support/cocostudio/CCComRender.h @@ -34,7 +34,7 @@ namespace cocostudio { class CC_STUDIO_DLL ComRender : public cocos2d::Component { DECLARE_CLASS_COMPONENT_INFO -protected: +CC_CONSTRUCTOR_ACCESS: /** * @js ctor */ From 4d2a425450624d1b9182119c6a60968709585d1f Mon Sep 17 00:00:00 2001 From: SunLightJuly Date: Tue, 13 Jan 2015 01:02:04 +0800 Subject: [PATCH 103/106] fixed typo --- .../lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp index 43592b943b..a2d13c4401 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp @@ -2363,7 +2363,7 @@ int lua_cocos2dx_Node_setRotationQuat(lua_State* tolua_S) if (!ok) { break; } cobj->setRotationQuat(arg0); - lua_settop(L, 1); + lua_settop(tolua_S, 1); return 1; } }while(0); From f466f4e9861f9417ff70b6095442191b6079897c Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Mon, 12 Jan 2015 11:32:51 -0800 Subject: [PATCH 104/106] added missing arial font that is required by WP8 --- .../Resources/fonts/arial.ttf | Bin 0 -> 778552 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 templates/cpp-template-default/Resources/fonts/arial.ttf diff --git a/templates/cpp-template-default/Resources/fonts/arial.ttf b/templates/cpp-template-default/Resources/fonts/arial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..abc899cd55086105f439df7a6d01db84168aebb5 GIT binary patch literal 778552 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�~L; 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 z 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

%_(Aj7q33!xs4IE+IDaLfo1Ni*OlT3|2Q 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≻eV-cDRM4!ASV-ak`k|4qmt_)#7vDc`VQe!pAaY!}E^17L~FVB~F5 zkR91i$jV48BOfv~z|BsmGpH35Z@3NSpmnf*i19-Gc;hU6o6%V3Y;rgG>H`Cv!`;Ju z0|S$ElS~&lC%Y&6E(pxm%{NVV&UerEO%Gho3QT&PZK90$Qu9RXJb8w0hIyXV?2jl0 z7Z_FdD0GtK&Krj#->3*=Ln|2;7LKqW9RyhC%UBtNr8)0QA<>Q|H{SkQ+`DMdNQnj! z3K}qRCR25Qp^ywtL!4kJpmZbA67pw{kHD?y6Z6SPi8gsZ$Z0L8R}hUoDWP~FNJZe? zNq7fs+&s2;A9SGc55X;|gd2{i_&Q=tC`m?FqjP90bjKbcGE@o`7-q5jkFbj^&LZJb z3k}c?(^28Tz`{rtX_912V{~Iom+3AuDI~7Y=RBe?0HO|sBcr?FW55H~zw|!yUGcX~ zALULS+I{VY-FvRNb~pF1%uOqDe{Mhex1X{ov%UGoo4r+Mo+d}B z-UmmiWQVm=Vs_ot_GJwTd`fSAs> z0Lb3u0KN8srdwxUcWln`kFJ=oxzhE}ij|K&ylm;NT$}FMjpv_#L&w(pbKh+m(bWE( z{J_x{-+1SZ*WV+*#E@K@{4vJeDMi>yb)JQ1d0C)0AI?`<^(_T0!QsK1quZmpI!|4= zB|5+}APoOxc$#NgcxrTA^lkk+?oaifTfYc6OL@YYMOJ&gbtoTXoxt1pAFS^O{_6WY z_-Xhocc7kxHv|urUGIgTL9+YpwP3&6c%z|>HyYol!t99}B+g?F=5(lzsg89HB`VCG zr~*R9MPc?N&z0tcatO1hLzq2D7}Jc_4j+l5#Lk33AwE7?aJXgp3W8!{=4%Qj|I6Pb zCU4&Vn4}3$J|=91ebXSOx^+KAGQ;-V)eqhDZGZWR zqeowOX@Q@17kZ{zhUB9;PBbAlC>R04sWfWLbT-nR zjZ|kN+1V)WY$Q4xMV*Z}8tPhN{z}4|Xfh2m4M<*?n31^Bbdza)@*&S-<-d|`CVwd4 zuO43hu3s1C$R%;sFmqs%agu40d6H$4b&_q4agJ$@d5&d{b&hRsdT+)->37M}p2-R3 z@s{c7=_SjGmm!z;HuKM|x0c*detY!;=0~jeXC5folYS}f6VF0KFK&+-;)baq9)TM9 z=gohHSXTa_@}Hq2P?0`V-OhSY5clqg3&uy??3}L3Lz$WU&Zjrq>EG1B#&{zs5HuRQQGvAEbGLT6R0Gzv9Z3^{Lxl zzO%Joud-Xl{N&jQuASDUZCB3m`KrR}kKA!#+si-s%^z5w$lN6}2J|Toq-usFuGBa87IZ;Z-3|UCFIGhP7!EE0XPoS8EKL@2ZbQ^qGWWx#Nl&yfPG=PuX>&-rbzmWle(w7MZcn^rW$PXIp?!U{4FMcsx@ z={DuZx`sFka^Jcdz^RK}qJ#{0hDJ1BHm`jB`aS#hd9o$Zd$&3J&bW_HyMY-N@VJuGST_^iz1v%oLzLjOs% zaCK>VDH@uPfriMmCKWK?Cj~Mjv{S#(OZ{$Ivfv4Y(Skb3FZ5FEi)1G_OT9Env7h&? z`GvUx`vm6!R?y*R&-s~u6bwessTop6LtlsZqR{rx&QM24p%50=Xek8$IqlTt%lNb}x4=%kuAPg_3;3>W*twPqR>{GMSAs-{pX{!8r? z{x+#Z-6%LWpFd{vb-WQS8YYFvkBSjB z^PXD9g2*}1Y}%5>P`jtfa`0%VPejhtYnWR=uAvrXCwFDU`gKOhY}7M-S3+!(*rcv1 z+dVIqWa;pMdL5Gzu0~A74^dUQ(FA)&osl+3BmH6zUay%VYl zhE>Uj4fg)1t|_Sma49wpYpGNMaLPuh-aJGaY`zdM`Qwcjn`W|^yv^8VS}7qrjjuAU zG+l1K7NO!BXVAy4TO?t`vN9i5&-=)8rzmrax%keno zfaEimNK|>HRf5@Er@DQ0I#6j{-o}n1&=NhmgnK%LL=UV-W>P(&iozE`$Akt#X~N(e*yT%b z2}i=Y)JixA!16_WaTn)Dc6VpUo=Dgg`Hx6^WKZVi{qlGUaqE9Slv|*r+t<%pICcfU zj(mYyX4L^unp<}XWg>{+G-&r?c@?hrLQ4F{G{V*??3X&R)niV;Idzl6ve*FcLjx}8XK^%^3^u%!?-o|K`?n6=kQ^@b*6Z~FjwuwFHcG!D1)cMNt7b5C?! z;GT;jmb2We^s5cajED4x9sAw?)_-RzvA9a45?jVz;>ftGyuG9b_vOY7#;x)l)`!^+ zzQck@U1`7mu>DoI4F6y{p`37h=02tW))cXzdr|U0Y@K3j7h8wey7O~8Y_>ZTx8yP! z;8S#@>~5GR>;~D!tSNX2-c=iDO|W5#mQjP*nAd}#1y|afb&XXnFi&#Lb6x4$=rX&^ z3MMQKhc+MF%}yW~9qbs6^lmqV z)}iW5v%?;L!DRqEtjq1rBGv`2aXZF2WwU#M`DldkG;1~@>CZ^X-+6X|`b!44VsyBy zcAL08H`YQ;^Qc| zK;=Nk58qjYY{FU*#BA*Nc$Xor9d+X<6&*Q57upXk0M`a5IJVnRO;_A4_2N`>4d2vt zad9;|&o9n%Az|7aSK?G(T_lwYSE{|^?fodRRgQm5@LeAAfsUsMM@A`ZN$3`6l;4-W z=>tFZQ-qXsk&5o|i+prBBeUVTrw>2UqSQWeXj^@s{ZHlgKK)4PdtlLbA9uaZ7qoAE z<0zl`-5>dt`_BFbyxIY&;2+@CPR(_#wp@%IG|X3+!k7%_u3 z5Vk`oe2yv@O^J&T6A2%1xS0dle~`aFR7VFJCpdnl{LF|t7mnw2&*`5tyx}l8R9|CA z_LvH6A!j{nvRuV(vKXt}7b)Wn<1H84?_gWaTP+9pLF=oQ*X?gQ|0us>`mODK=O<=& z=Nv`Sx7+0i*dQO`dyw=^Er&?@Hk-Mg4E*0u`ksk=H!ba35C1>PZELIvv*S{|X^o03+3*2X zKU%*|RMzRQ+T-#Xo@hm94|QEBtSysIX$v#fW#=c(Qzr##Z}%i`q*>+{=E-pMi!5*C zc#Hh*7qu;3Xa>OVk9C_I`+Mzy!bYe<$muRbJ#Ig$cKgLXT=(#K0vDzLY1zolMCx`Y zDUBCi4RHI(f(9wM8cJNxh6eJy%NbN+TA#b~&-YhG%2RvZ%iY2@eelPo+~>T6<<1PQ zKCkw>oVESeY}okRWLou$5bgOTC@I9}sxb@;Rz9z=)X15DPsmu4)w>)v6|= z)(zT_2e8%R8#Pye78Rt4?Kme-jG8c?C&ogv*CAWvNYLTdTl5~)jhIN)8qX7Duqqq+ zAQU(Xw=BH~dzM({!h0MMO2qh3ogZl|@m}b7$}Fok6(b)nsjhR<2IZ98K3l+@v1F_n zTTg3GTfO~Gm!-sA;u+!_?;h_NU(n`m^RyML(yy?sa;^5RF1W_F(RG9S2G8~0t>zt; zXPi&F4tu{af9CzSt=)OX+YyO&lCBS_x?#mJz_A_yox!f#7xxEdsI3jCy$Wa#pmDe% z4hFp*Ps(lfV#i?x^G;dJFz1+o`(Z`uHa))-aYlGmhKJ8!>(C8U92F!HflZ>e#h)U;aV(bf)uU2xu>DoRq}EqlZ9E5XRodF@oo z3Din3z5(Z{<3T52V@`&U7%Ex-@`WNw1Wd6hl(^j$n?ke;7ERy;!*|-j9RuKwPeXS< zfm)L%h}q`p_mJcTq-#T?85ryk#!l=j0Gyl#9S1T6XGD^5o=!W-m)NBzL%NVig3H5m zKs<#E1nqaNw|9B-5Wg#}v*hOg>Vs?|mi_DA+`N9t>MJj-%guVkS&|ITbrdQk?RPG} z>dF;-?su;~b>8?fM9U@Mif@CK?dYb zED*m^hoMo*OH5Txq#v4xvO#>1aj2=)If;$sV~rC`qn-2EG(HX1#Vgn{;}xb&>>9uW zonfb_I$xTV8ndQGP0cSxS$7%sq{I*&QI}mR&nK`1JQj8-LoHMHY#V@6d zV!ioNn?xZDs!0eZS-TnO`HsC<+jaVuvt?;L}}b&zr4p!nu9x|tmAz-oBr2u_d z=gat{(y}sZEEV@)O>lut#o|wf-L8}_*c48spa2Ay+OmtZ{B*?Q zBcK6JC;U-tKKhMp0x0f>(!nCumS~$T_Vnd$)U;~oSqsArLhezoPb&>fsy`iq4UVVN znZ}Wq0wBuNV@R*`g}q|42Uy$}OK%^F;*3O%_*^yF2zR>zln z(1)cklhJD$6MPSP5;NvYwGj<}i67{E%oa}-x$G&Mrzjq`+n#iXnj)!;x5=H-XPQc$ zWJ;6%NmTJ&2fA-7zxzgLxVVRNJ&LaVL61_FgXqx$JHP`_fKp!!dl)4y!hG34X+{~K z=+PmVF5NyKU-E+vH94nVymX4r(7i+X^!xef>vOy7$Ia;DwA?fN>Tmlmye8GK@4Xk& z{p;^>`ey$kxApqb=z)uPg>s?1T=Gfd$o8)I!WOSjvBk62-e9zVw4;!9JDy&0#!YWq zrMJCt74rD&hz@G;&GdZF2?!v5#AP9K8K9baGHb*)of z*Lok>tOhBl0_UIu0+LmloyA3?yp*C|7uVP0`=yz=iBw+==cL8=|A}n@lR}jjfDOj0 zTdU=&>b2FItL17%8j@u!W)vq+UX1V4Dp?uIaV~f@zUf9bmd%k$R3}7QcFgg$gI76j z#&XUN=H$I}w&M^z4}Cj;?C1&tuU-EguFykV;XU>+5UhspVicJm(riSC0z$;~<30{| zg!#hoQ(@j3W@6`(@Xf%%R1W4=i>t$n(bZe@1q6~Ho>8EMi$1Q&_wg&}<8rN!i#zYB zvx8%(%7hL+@Kl_|W$N9@qIWgqL2;E{`Kw%ys|0~H#H50VRq6+<|48S>vRdy7Tm#*& z@O%Tb9+Lin-VLjEUe&v$H}4%mr*hW&5Km~`vRK^j56|i^eVadPTjN)ayfI>?vl_e3 zn*5_@y(^)(iqun0^KDHm-c;SRsA*l3a&y!6rkzb6H+|itYf>v~>ZGPVkw`zz`gUE7 zv>+NA?Ji#Ey7!yJ^)f1Ai<(ulSwC)3^Sb7*o8{)nWw;%gw{%@$^7o$p(XK1JC$7*- zjq;)JW$VWc6_**R219j2$)>k<=;on(C;}0WVLUk--0gy(@pJcdvg?ZPOCR7FqeS73 zezAVMUqqwveqE=6%<(Lva|%yF2#$@ zW{hgG>jF@0yWKa9s&?Nui7OPt(!moVu;i%(OPE3S7|~SM*_|W$Ec}?2;;G-kQ|qN0 z@%1$am;q;M@kWFc0uKt}j$kLQ0$e_uK;38Pb|q~ji*f$l-LBOCbxCjzor){yRGdu( znqifGNX%_r_X}V|JHEo5%hM zLqT+AjMJSP5eWi}8*b@3DNn(OxRpQE5e1(wM)^GmW0F+A2P<&8^Ru0N!(YrS;2Vde z5{Qh6WL;|s1Q(z$?IIQe4o%!vM4ySfz93IEr#h*o@N4*ciOF(S*m>!!Mm0Y?tG}2> zpc=s(1=WPvB7|^hr-#p-u2Ibo&wp3?7~dL)LJ}bsur0!*NK7(-UgBM+g3P<_m-lQ9|v3&pnU+*YFt!VAc*E1$z!0;U4!~iyT*Is8r1;6smiuw`Pytp zmbYd%XSLld44Quz)4#OqUZ|V_T}k-EMDJak@4e6P97U>!MPPlci$z+Yce$FyeC;|J zT|hnm!*lzC3rJD{D29bx(vS>Zx=#7A&%XnIr8DC#YZc~<{%5YinSHv z+%>58wEMkDT%!;gE?b24H5hZbXwf*=>65W)KxP@5dq|1uwn`RhidxGVY>zCCupuN- z7!1k+Jqj9`V3Pzs*a8b6B^3o}t_x(9-wZ6UzScz$SA<9=bU{eD+AGCc3KgMQRCpyl z5jG1KWO7K1gtW_k4>0e|d)ckI1^D`BwzHq*=4}5C%NCc`$vgOCkRmOTU+N9?Pk!S* zR9G=xjcm^wcgqaQ*p2%fuy|i>MGMXkJi_CFdsdP2V=~egkvc(J2&Z)GmlxQn^DS&A7s261Gv zUZwu5Anc9so@}ymv2(U#c3^hVO2^X3^1|y&A1V5jop788e-l4b^i8pANN`x;(D>}& z?84b)`eCNw@ixcY_$tRk(u1x?N*^iv)NURaovE77t7^M(Hwz8ra;=8TzS7w0jg+`e{jzuN8NFNRq2SYae9pqDx7#KvLZx984+_qpQ zWYF8qwouTA5@3(2z2HCz1f`fHy;qm=TGtPZ~nynWP)`Zvb2iH-TG3ip1P4 zuowihpB`q_@B>G#5i&nk!;vQe6NZxYBA%+H{W#&?R-Fq}AS14;(FhDTBh)`K0FZqf zFL*;lW+R1#a#dcWtQBhM$c)9HBnJAgQr*e4ry!N`rjrGkLMiPjF4VFO5u+fIQjn9( zWTEp542g`K@uVpp0mJL}_+=51kRdUcDx&-Oi4Th+v+r>2Df-Wj9z9nqTDtVs<)5!g zs*4vanl`84snE{2`-07b)!y=&c5b?9o%hh&_T2I~yQzV(=XZCkGqS7Wxu0ZjnIB%% zCQm%FX8rzh5Lme5xY7igY?QuKhs|$Tk=>A$eW*WaXbKDs$fYHjq>?CWlw?`g3*~*1 z$y79rl#dKljc8>}=8_%@d+;7P71iHME16j>Ow^f4oQB=-_B~Y;7|VeZ>2*e3kJ+PM z3u?_z*dMjjOaZpgLAF^fkGra2cn|ev{K3Q&TBt_$nsTJ33>!J5`q#5N{)o=aI?VPvSUS)`&bot}l&ae(H)B5p|;Zg(v`e zGQ(u0Ib@*D#uzkcLjXmTI^2+fPr5DxZHg2t=&sOB3_>F*@Uk0N@7!_Em`hswjhX#; zpJ6MSCe5fR%Z86etEz_F-+$oL4XzjODsta-<<5P7gKh5i*$Z!zOShDlU-YXPzF=vu z2QvYqu0?OG$v#p4(oKC@wk(>}szE`wdpCmOa*6Y{1HWgl9v8nH-mQCuWepe5iTZKa-MX`+WRq`%v$3_P!;F=f^znyNB#vtda8^IDo3t1>CK)ohKho)KjOi)4^5 z;ZZAM5vXe!#PT(V`(_POYWg;pwnEbgjYv!>=<8t3Qm=uftuU$uhcA9u8x(>jgEH4y zh8az%g%Ykw!=oM-T~E`7?CF%R;BSEHPnv5cozenusF%Oj$&{Q8ZLq+Lc$7{=_%suP zf)UEljGzx}-WOTjHgjpRZ|;jN%ZIIO8{G8jgHQji;OT<4@sk!OdwqLP!{Giy%NC7p zo&L=HBOmkHVMFWcAHTl;`2#B}@7*vc^wYN4gKD$GADuYsh7nVL9viT<-@0dZKjK+E zby{;>`GBocE1K60Up%_9s?QChFTQ8Y5q3O1qq?!BWzN{1m6Lk4G&Ww+O6$ygc8t%K z-vD1nB#+F-sCJY7P0HEl(sJuX=p^FbQq>PQ_x#&ux7~hw+w9xpO;ByE=2lCqz14wIK+JKNeIYT{hT?lBd$G|V*{sE8%MuqmBRQN<4joQo$fX3G zdsfq+0Gtl=kBmE*5hybj8k71qxQzKKrHmo~&mIMvCtc7Xu4m=jYMTP)N}Dx0YQ@%kHfW2NAGD zQTC@q5YkCvA%yvXF02C9r=WLo%D~>G<>=6&fZ8|O3zZ(BGLiY5M$NgWEeUnib-p5$ zM@z^32?V$WBVnm95(?KU^@UOoJy>RuFNQ-QZ0dMTA*(jjh%h(d#wKY4YZfBhC}LGB zo>1T=P&942Xd*%8-0Z?k!Nd{;<;nEsx^w)opFZ(&a#FxoF#Wm;_2~9BzpT2uW_rVj zdGUgY4`oWiv*Pn7&b?0l?7&Nlo>)>l@7|U`JQnXazURocO)p1+{F`e78)odAtEq?puGQrXpN&%4}Pd|N_yMc;S7?Rz`)e$;rR z{7?l?XG$wdtFt{GmUmblvF*>koP9TIo?)!+Q8m44SrxB>*19KMQCD@4U#7+?%e|GA zyH; z4=#tx_F04dv^fO`Mj4puMTw(gE}B=<0TZ9uPNV+3~F?ljfJYSs7_P}JR_ zyQ2?*c6QhfRlg0&dLNYaPVKur?Td`@gZ!~QMb{=lJCE(Du4I)@^Qlr6?(NG|XKRu< zk_(e-lV2s3Bne5 z8}SvP?b3rhE?3J_Wmygu{NWI*1lAB1=;l-Hr%r>(pFVw>rZrG@J42uU~ob%HLh_KHtRmuUgeUOs;BQ z&NrR?Eq}ayEZ^TgjMmf-l}CB2j!Dt7PzjmF65oY#ImFvUU6;CNGrNN^50# zp|p_kRyLZ$y&=O=Ctu4H-~&zFjZi?K#_j_$?H@FWY-IZ>c(8yKOSg+3Pzdf*{_vW= z|A~-db0?^``zWXR0^JL^1A{a~Ek=}{p&3y+lHNdt>5%ExtZb8;FM;EX>V9vRbbuX7 z?lCUPOX4HjPq)*0M8D`Pv=>W9XE=Uh+a{ zt`+zpaO=da3EEF98qz{qJ^eyl5-(uv-S+cdKu7+EdY8$?9w`6fzgC7$fq(YZudaI` z_bHpcI+x&?7dO1XLb;!>Vjr-3bN$(~J6ORE_DpWTj@;jN&^R#oGH(_VAM$Hd2MgGM z_irZ{e^jhMO65O9*tQAJrfH;Qc-#>&IYp#ot4Po0QTED${dP^bxQnWF#mKh&XOM&XrYQIbtb zB>j{=MQ;if0ShHoNk}?4+GuEQh8A5*YMQXCh*z14*)smTvZp=9pJ*S$&z|kq{`#vd z#E##hJN!hh&*M4A6YSyKcs_;`8qb)Hmvkp}UrS+lWvWpfa$PBm9w~?HgrguK_i{9a z2d0N+29{i4npAW_dTeEz{c33)Cf(KY`tUW8r^9EZZ__?Y#E`aRMOA73;vb3y5Zin*+fudd$2uSspn+-Ew)0*Y+$c$Kh6L5=4MWHMAB z2#>sEy~*hBh#Rq$GbNyFE=AHHV^&s@PAP?vOtq4zI@d0b0eG(($z1pZ6zHdS2jy~l zv6z5=ZQ08!s?s9Xo<%E$t-hV$@(7$@55hF*xnSKJzaSQZQA7 z^ScCb5#GiKpvg-Ru(HpMrdxQp$CGgqs9dbUPtu51ZWRKFAtPLy?j$sDp@2&iGwx?7 zw}Vv*sGG`Pc1+uOVYFm_?!cjqi!NM>z01zq%Lcx(;WcH-jhDQi`-{(6D>t_XNA?>x z?T;*?t9xeb%j>4D`T3u7+xKRo={jQ{EEb1lIl zR>yqDKu346^}49yMa@X^u>D#+FBwdQQt93$y?cx(8PQ`}Xj*!CXnA^lXnoo?z!)@C zWa3_jrC2IdG6-f-;uYehx~$CKOQ|k%^(rj09AwX^uHrI9A1^b6YAedT!J1#d)CVI+ zmq`j8E)lN@aYRUyBp{G+p@!$pA2`H!we=o7 zzU{z(n@5Zv-Mj6&J7?T-%ZxjZUNoe#am1{)Q9ZIvr$s8(xSpf{hOQ-0(>Gjk7tKbGldl?GAR=-rP&M z=lA^M;UC=TMm4aGZ&vbms&FP-Kp0pwRR}p%jxUV-} z<2Ej{t+#QoM-+ZCA?d&j#0c`!Mu$N#`ho44>++Rt8m zUi||0U3=q}&6{#hLyp*vEbMO)=@n!bs(nh75?zU}m(t7JXc?jmF%PkfS0&{1=zA$_r%ohzIuaYu(6C?7_?s$F9i`CJ@VYSH8GbIzkA*)*_<;kV-Zl!| z5?_PHHzM^+H0Tb{AXFF8_(psmj(jBq6g2)Rf*jCjM=cl%a#GUGLNdu?p5cfnfY+B&2?%F9|y)vX|s< z@2#sHGWcJ6zCOA!b$!}8E;Kj5n^FTqysETk zh(`+S!4ryHe8O&uoG3V9?o%qAU>o9TS6j*5B07r}j?*W}V?+U2Wc9-{!t%;s*Vf`} z3Y=8u5RAT|Cv32=4zWDAenU?;d-U2tFHRY8MXajgiQFG=y8f{{Ut%vRB~$zLUBP~G z>aVxW958&`^4pXp&G%f_THE^j8*(4#THf9N;9u_jjd91$OQz+@?eqSgf|ixTya`EPi&cwBvQ(h7ATwTw3RShcAf*T$j*K#3{bC(x{*;7GY)EYH3gn~) zEu^HZV74(5Fu|)fDes(3@=Mw;SDfED`MmZAb#Faz_RQJW?|oYK$_hQjy?Ba$;VBGK zUo}Cz#9&vjHWf=;ISlXCVLs0U9wzAz8&();B^PEQ8URIrKI)90~r>oWAVMZ z3yz$vd|vm~H*557pDCyBz>hLr$)KnDsZqUwTe5J(qc|QE99g-Qg=}EvX49Ttd@@@#3iopgs`RN-owe~sIb=V2fuus@E9{)YPXo&*s)s{$?Gjovi6z5d zbD2uRmsHdYug?^h`du!+DdjX?&~tR%d9|66Ca=q9O38b<=gt}Z`t>iVYD{_yi_2!^ zW_I*%|4;4@v-=OIujmPjV%aDd5x7*vzu>>d*cU_k+XNFr)RIn?S<>!`q9R^#m|uxy zKej(ukZJKT#F`z%tzW6u2bq0svM_m~`b@M};!M1V6}8=5%huICSIei?E~@2f?P$P< z6r7-wGB9wq)!a?W>FJZS&d_v)*WlDi5DpSe;O>GE2`dXJtQte2ctAvh3Rw;P(ttlP zkI8jKF0FzBgIBAX0hZNSHiIWuZ&C0Vr_a#6_3F;2UVZVY zy{}%gd>;( z#^Cz2qc>-jWIi0CmYU?OueXn%!JssGn%vn;?+m{_b0)(xO=V4zJCD0H^R(#ylQq=H@qm0hu z*?Tl^lR$|ACpYvX<&D(6B=NP(U9M7%Ey z%<1BULGSXq{lsCvp4WKMlx?i)MK*fx)$=Z@pUUR7KR>#B$n@H2uWdfkcI*D_?MJrv zZ<)&EdtPKicjgY~zTJ^)pWM`(sWwX`=I9hOG*ul9%Cpqdk#7)P3*FqAtgvTM}#G0TWw%0*XCJv#7oWMg*_yId-I}jS#p+86T+Z zf^&me8;V2~@CHEPgFwKW=(m$U>0hq-diUBRBWJ&J#p6e&?fTWvX0o=cFIw5?c`DNO z;?)n&>|LVXxAeZZFXQcu_rLApS)0S{NB9u?*41n7J=FTI`Q^Rm%vkzZ$iW6aynpJ< znNxSIz3`4vL2qHuxn@S$$Z-YBuOC%Ys16!>PcHWpPua~sy=cW;7Wu`k+fOAju0+*{ z!Iv%>R|h+ybXCVLti!V;M3_if{wuX3AQ$KofV58q2T5at(}Tu>APYNbuu6)6isRKG zVZ{}37bFJBLv16RBU}Ruho>imW)@73&P;3!txNnShavC|HvkE>UDY~f+9d{ptd^acN$tXyoGu9>0v>E)7w zn4`o%KFpz{gB79jL}N&KPM5&Q5Gf z=-hImSZzQQ4wphjP6wio9Y3*ig5WDE4keV57_We}SS~R*%AGd59P>&Mzb$2P*uf59 zo}Rcj67d^Qd~xFb6h!}$Byuvx` z75ICAiWBHh2wL@i^Tx5q}HsDXw ze>Fd_*yc@RhVHg7tZc#%CLs&N+E|1MzCY5KfDsIMIUlO#U}GqeY7D7SGK!INkL+Ry z!4~2>HR)%uz;TO~1{0y;g#5XK70by`JRyH7eZr5+e^rhrzN*j*4cbd%c#pX?Xw!?&(;mvc;TSw*W}*5aq;MD2j4hg!2FG@g4xP;4SMtSpUq%jv>$4D z^UV>BWnhoL$c<52p_|H5Lb^_ExFN=_jNK6Bb7NOV`BdlJD4!gi9OJ{I7dZI{_wYjA zxDta3n~}SBsF`+brw7QwrwAlYqo&<_Tp=;yU}3IO2^~6#oMG z9Hgm(jbW`5G6mMT({R;;aUIWxplJO#nH3b*dmv?i19epv>+*ydoA z;epGS+#NU={LkyZ?-+me_?|(oq>moW-H~uD7}?Z2`@m&QbAEC2)`B=(h5%GR8-Z#j4 z%NtUY(o1LRB{w0qOs8*-BNq4#v*oIyKl~fw_UXxZw)W#lwmuFavC7&0X^-mRV=msK z0JMRT8Dji+@r)j593FP$H`^ONf?kUIzU}Ncxu@Ac*+`Po61GEWQuOffRP86vkDLOo zbRooC&H&^dGRQ&wMJVD(Q6;CFN5Ya{MUtp6twFzlg{SG!vwwjZZ3o*Aj|P**cI;NB z8%9D?x>oJ2=)I_A2G~RnjY(DvEr2;kPKE(tn2`EM==8|+Mv+&^U>Kp5Z#4krT4&%0 zq&diDs&MY;^+pyl>4HYn%A&=jWQ@|HTLMVcInEGt(I^7+bWrRNs232bp4LFfUVeQ- z5~v}QVoGRO?$w<0Ssy#=OIOJM++#36m55v7w%1ra9;M+`oxNo>-WkugX={o}rZL@Cp?wKu%iI!{G zN~K0ALk3U?>2`iUkYsZbh0{K0zO zQ&%7C85zh2=>`S|MK0tQ250aY!4HkyzLqc85#76^g}daa&523MCmYKFGHp z$ix@L*Tp$x^F6zfSwx4BzuqJV;;8Vr{XjOpD6}rbfg!eMkC!0}iErPF%p-l~Y1S8+ zKylW0PqMh!NqaCCvc7w5*0!oF?fOx!t?wR`nfKBj7Jb(D00My9Dn%|9Ji#ZOpMu7* z1<`-%B>f#*(!`+CBm9tpfKIgw6^&?YGNhpYA%{u+@zkbTq&8iB#ktg`d0!&6Y3z?3 zeEFv}Jbbp}CrC_zeq#4x8& zU3*c|_AufNAmA+UlwUS3^%~5 z3(AEi;CLKlZ>SddDbE-TmNVw%NPK^8PcTwPuWA^Xb^0ewD)vn(pxjK`Bvh+y(w$M3 z!-^jyC z&$E^-YnX9s?iJR!l{<62*sJW-TrcgFX#WO0!zcM?Sf?UKnVWpF8wjcfdWL|`V(xkf zx??>Re8t`8Z$T4{HAGh6eh;7h<5&rx3Pdah`r}Os@ zZdNQ)W!_@hpZjhLYso!-+uGbWcd(}1%Xa_}uj}6F8AzT*mWRPD9YxE4QD|0CtCyqn zax-CND2i-0H^crN+>HPLyd035r8lg!zBo_A$$uK51R#DgY5P%Ski7e-+bjORI?6sg z%0Bot`T36??aZ7LnQTe0RD;x?%|a$y(Jn5s_AM4y9emo9n&Ir8V-T!=|14 z9=i}ZY<>1%xsP`HbZ4@FBP>yRnOfk8vyM26tAWBgK)O2X;_L!S<;yN!qUDNcS!;CN z8gWnWu{UttTDoqwGtI2?qLC7jv!Dq1S|B^9g!2tHco39{FS60Yj_%y0x&4!@LS zTh-Ctpf?(hhm(pDRHBx+C8^AdFG%tkp=nWG9juP>crYI2s|-wMW1m^r0sYGszFA&p z=W`Xd$j+8qmfH9l`AUTs$4vl}hCKN3UTVOSeO9ftpe6hKcDL6PMW9vzcLbtV+2xKR z;8XHP88^nFI#Z&;!J}@!&^8HdOqdA-s+fjCCcys)bxc^z^PdnnWCHUCErEwkpHM4F zM)p_xNBemkwW7E`l`a_T8deR55g#p0m3SOwsK9O3rdc|Y24VkGi1KLQT7;Hm0u&Lp z6huJsIvW2`g-eCrfKwTsmSBo3ws#8SrBFHZ^7UyjQ7v#_^5kxz1MSTMYYdZ@ESp#$ z^C1JBwe~R7d2y~wN+uhGz9^mnuAo#D_oF_u7DK=idKCS1*VZ76h#QWaz3vUEYm2}6I_BH~h|RL_2{&QBLyWZ?sR1B!>IhnEeg7+y1= z?jqeq#xcd0q%SEOQ!&dp+defpFFmhpT7_p)&Dc7Afp21v*Z69Sd#9VqYAgEI)YKu! zw*;`vDO-JQRpe&xb}#pOIg(=_$2AQ`-+MS`I5FX3oG zz;#rt*RC!^{6_`$LU4ky?oJOq>JGQNEUb} zLAsE>gzixgEFx z^@h9Zb&{kc$y#+jEe9ZtN;{e^M5>Wqr`ajw-;H>A^`CPmmw$EZ#-p|BYghh>Ir-VI zEu6g^Fmycfdoa>ICKLAhYS@ycJkWU0XMG*;9PxZ#*Sf7KU zNV_I3B6k|5I;uIYC`;Mvx74P0KJxJ27=Gj7M+`?i{3*jz9=^@6&BHevHhcIQ!x|6& z&iI{|&oj>R@(IQXUT!s7L6{z+0eFVUu5z5Q%V)UV#+kL*CN9Q zay`Lo(E0lP&g$x?#f#BzB)!%OO&IQj23q7vE2j2E&&RS8%TaLq_ni&p8+1_b^GgT& zE*W#KMRd4M{ueu6P}Lf>=M}~qjNE2q?FRNCj5hpPRAc3L8=f@q35IzF#87}(@SKP~ zYG%e>3)xz>nMy{Z0}2edmUu+aM4V{CN@;MNFbzOSpog2xj!Q%qct|+fK>`r&#K_a* zbRX@0KQ_krhI#VmtdAJkWor5@!(R=2m*E8i|EH1NX1v$Pml}U+z25wWkL5u?RzSK#iM5Wz3{K_BeTUu8}u@=O|%tDJKw|V=F z&6F~DkUyfDRCpiHz`dfUy;`YxCu7wp!Hq)PA2U9hEn+}NTfm#81$t$HrP-u6El_o% zbvNs_>lEGMd|bz=$s-XsgDHk+8L5g)OYNr@w=X`um|QR*0tWS7yuNXit)cjn_I*d? zyI?^0WJfN5;7-hsD%|EPx|<;1o1{C`$@m_l{u&BU)MFH3+BF%jQFLC#U?ii2NpHM{ z)O@1>(+Bufcu&TAdia1T02OZ=nPSu{1{2fExFnYm3yQ24i_&HmPSsC^!VFOW;by|% zcC9h*+%@J^e;m+k09}n9)g}&+-)|z|xchQb7Uov5Ya4TqL-?PiyQ#gQy*Gb}zjkT+ z*7iI3EabQf^e2(!OzAJcl92X8L2TN`8L~_ho$0NeGGjPl@rZoo7^Hkhwi+2LvDnu! zIp#n1rnhASNs#J*st36mpHq$a}uq z)2O$eIfd(X97jga7+kkX`sJRP91$}BctdS10zuqka@7F?QM|&m`ljl$N9roFm6cN3 zA4k(4^!cJ*102F*_8K>*SPG5ZF-H_HYNb5}^KUdOd!s><&1upr_QH5Fqgc|hL=%tH#^^LMjS$A(X) z4!rEwO>E_ec^k@lcndbLK{s7|{^1$mC6lBfyj*CABM2w-OH>zwe)^?qMld86j)!6H zB304H*%`iE(!B!>u$jWpZ-&-7M}LqF-vtXB85ZEEgCCUEYpSLP6%V>9Hm2KiFR|XY z!}{9DUSY50zp+SsW8FT3>_>bUeSu$ricH@@U(h0NgJL&TG?UaoriY z|J=^1bH{E63e?LvHCGK<^J7LY2X!E*7j>p1YK6~eLGgHFa7{q6MT`LT&&m-uLb9Mb z>O%!)zt0yAht$GAFc^sd<^5}@0x-K5iYgb_KcN*4lyO$NKc8J2*r zDJlzJbydEkaF?}BD=17HQwCWd*uMR`+op|;)R#{l@atc*3sGrOzI)TGU+nO2H4R%i zaMRft-3m`aqeH(h)%qRg*D~sL*=!61{F2A(1+ix3e4o=GU>Zu)^=dGP;zgu=p_c-P zj>opE%LAgzvHyiyF1kE$1SOc{Kq%a;%TYJ^|F2#T{V%Q>Rl@I3i>6kZbu- z5Lk!*-@Bbs@PE+dV}ID;oi*SH8z7;32ssH`)$`%pf)P4yAXHrAbqE@S#tPbwgWUtM zj$P*=C}gK=fd}SbP=N!48kZ=cAP*VPw%mOB&ppJJ+{@p&mtCH_{@(WN zy}6sf;iW@-F54jY!fXzyb|mfc<~WXS7jRc_kH8uR4nq>ip`(1R$kLdX`v=0cehVpM zfm-q}BfG`8-N=_1*Bh}0v)>umUXqQ*8m2>X(_|qCZ$exRK!n3L80D*k%*N=8x=TV3 zgveWl=On?sOAaDgO$hAWh0QKGsJmPV89et7K1$r1UwSt$gG)wa_x#21m;VyKw;Q&5 z_$`K8^5XYW!%`0y0{e91bT4r0#{P&5ZV@uLt=WndiX_l-O~%7hb&23s62GnI#Ba8l zp0k^>A_P9tRnAF%kiMHq0wgK?`_i|Br|*)$;enaly%)N-|6BY%*EQ!_kPcHFuN&SM zvVucGm2zbC50u8THL7JRyF=!CP&iaZn$TUULrWgvtR@Rq@AN#ww@Ee@lfrzPYJpe= zf0PUinez|wZM*yQK~m&4DS@|3q@g&_zkel;?=7)h*f#PReisrw_e+ELUAvp+)X;7U zyIJhU=J{#Yj9n+cYmd@4?!trYeAJz!c;I_kh-9GP)r)#cVvtW8GzQX^U!K2%EqMnVkFH~ zl%iFYK`Wwn#-xzZA7gGiT3#z!V|$+;W20KI89Z=kOd8P-o5pz07^_WUQ(jgXlX|4F ziR!{J7BFGsa(H5>28fN8d6_pvXyNqvovs(e)|2qXehAmmATr-6IOczOOZUH=rSkDt zx9`YZde2qsw%>5;y6sz9`}K}z%M;Cgiz@he_pDoY@42HDiQaV7PM_U$+xI`)Q*S!+ zALXi7_U-@Gi?1AhY3rPd=DWAHR8_W|T_TRXeCVY+=2rB%>(0Jam3_DT_n{xL_`Zvh zEOUSf zC19A4^4UB{+EE%-){fP&bK3|7^!6knSGxCJo0qE zF^s>4TK2;y?9Z;k-4U+aHrrD+zR(^G1Rp2-LCR($1Au>%^oOLfOpb9+^Nk7*e96P9g138 zSEs0ju{woaDh%r52|Gx^wdzH$X?JuJt`(I~oe}!nIrOLe4G7$#p1AWTyM25Ajt}td zjr8q6qx#;rSD+ZS0OfQ1H++=_|CGmn5;lEtP0gl%BV^(^|A)Qzj*qfR|3KgKmZ_PR z=_QkyR6+s?X+RRpixg?01(X&*q)Cw`C_Nxe5Gi8823U4o6oYh77sRr5a79$q1zqgo zy1VEqWG46foOdP(?Ed!t?&se7x&PciCTC{e)6aR%bDr{jgscSqm)+wpotb_%T}+qw zFV64*=xuR)GJX4N1*@^87_IrE}+j>Ki`eLtkniy7Qr{nDWwC`{sz=3 ztu~-eCGrC83%PeReXV5hwn7y{bI8^pcfJ~AJ~hQ!I>5)$eT6=8sc(Z%^Z`N%Jio7{ z2!QYL-Ews)r+F#4dl&;uRqH{7@w7K!W?l2kf(PI~;&AoK%^yxEN>`WAjjcpGfLO*n zgcY{b!?wZZQEPxFStj3TXtwYgUKVgmhAFrQ!!HIQgU^#>9|1BR=K+8r`lh(i&29o< z*YPDj(F`4t(Aae(8dV-TNkF`Ncn3T#YXKfKx=EM4uLyq|x-LZJa=f;W4C(2pg~#k> z}v&5OnhRu5Sqhp`Htqe(c$HMAbep!4%*$JNfe$}zs%2c5J z!!g$E6)J4i2Ef|vaaO}nW1s3z0k$Oqv(Gaxv)4Et@y-*L`uyjj0+$EQu97=j%yCJcV!@5Op-b`>3r4HCn7Kt~G4n9Im@Eb?atsa* z89E`6;%-~c9CF*@lIo5nq~FhlxLU9C>RCnS;nz&9%#38{mrK)!R8Q)bp5gW|`Q^#i zTvLu9m9uAe%JTUjwqfv3drMrei~*OJNnXg1UjV#ElRIO)Y4kLa0%Xp(aXTSEP7`O! zZ*AFvyzS-v;$r0x^y+>04h0JczCcZ}%S#c@9qb)~j{30LM>xpP>akI73#lX8K} za<5mdx)rH4QccPVVVaK%mwt))FJ8m~(TL$5+X|?!5G@F(rbeTCg~X~aloaO2g8Pgs zY&DR&?b|QZ@Q;zr_X~b63`c!epW6vT$j7Gk?lWad@4i#|RRf~vnu7dlrK0zgsr_oE zOdU|Ds_ojT)zqu0@sVN(tIjQS-DftYR6x|Xf4}wN0r(2wNd$RjN~thEshgKt!^DRn zExl&1=LW9xj*&qEB;-{P-(9#!UH5h@(Xex{HabG1L3~F}&PS!IqC>CWxM}b;W;HxI zC(V1!gU?Mh4K3|ECuOc2aHXY&To|be?6%9;Z6tT>3d|YMea+`w2Q)!JSEbCh$xQwf z_X;*!@Ec|xMlfYAp(Xp#i*UZ9iye%Gw0%b2=Oy^9nE&1TZ!P`$gyw~=d7?9+Z+tL& z6cRRwj#R75@eClsU62$$V@k0J)g>2-t65>m+ZUjFj&dL@GIN1|CqqLHV#7OEw=eY; zxq4TZ^egfAx;ArCS=$PWxjr+k6W)YKlahPif?E98wNWe^h1#Il_S^}dsVl< z46;R%Ew~|ydN|`TICJQqXI5NZz-R1XW*}u*)vOeV$szYNm}D_xX67L_z2P$j@;%c8 z1ZlNE+b2>$Z*p=57|pOZKmRLS zz_2IyEnKMfL*fPr8>EH&f^vbJ+Od4~Wr(olfbSuBU2od7={V~b-zR?5I8iKH`1?iT zXR+6r|M&5)V}IU-zT%?5j-sz-;bpZ~IuEjO%yQDwWYJN_&5~@sqT|3Ce}kFKzzXDj z6%d4s_fnP5f*a^>DJOA`nKaeZVav z!k;ut=Kd)>m{qdtAevv*CA;6c?{p*8dJYYU*7uHXy(4qw^5uJ1uih(ObIYT*h<}M4 zne)h;SRPK%QIMQ|ug`%Tm-rgJaF(@U;{~ACvY$Gz4xUsxzDrw9PkwguSdkoW@p>(f zumy{R^2|gYH_ua+6e|Nzm`>|FtfJk#9&(|gdR(Z7BXg!g4Aqq}dvh(sWq^m3PVqYG z5_KFx9UN!Tc|-&(?v?1rE(glU5AGL`uy!S`3VXfl|IggD(7-!nM8g7U{C*MVDD$M^C6p40vVheMJ9F;n)E05lxKI(;JTRK~z+fJM zb99;6QHl%z0uCP^2!-6yM|bRCmv)X=GW^y#cfYpmx()H?Sm(`86!qv|v*>|G;%~Dp z@oC~iE5wJ~Y5m5I0_ki>jG5A>*hzY+`z0f?;`{SC+={PB6+I#Ef>bf-pq zUY#fl{$Ri_OHkrvDu%RRK!FRLKN5IU(zdi?s;b~a_Q2&8b zI3#}IvR)*<;38fmv@qRBe9Lz{|Abt1k@!k2r|C8X+Gb|ixZQ&-OjBy(q{0U03*aqq zf?)&x1+2XZy)G|lT9BMhOs$sGjJvDzNiqrhz663D*GfRDDupg^dbLhv# zz<{LBH0I%e(HHOy_elskrhz_XMcWu17C^#hrU}`IgDvEm($ZLlJ(9+X>-E zV%W7=<)!fp1%JB{4kjy>?`*iEey?(*ylCRY+W5x!?XmbL$CrM_6c+Mj_8wHZbkg(@ zjgK9B>#g^Wzj6ZfgzKyLtwqyUt!Fj3E%*rM)vgN=&g&H>T*#qm&5naIYFe}PbZ3Ah zz`+mZQZLZi+yC&_0BKC+vT-&$WVR=WB5nBRI+Gg8ZmV?ru60c^b?q zL{fNnQIkn&mlEtv3J)qqqYms-VynP>M;|@TCT;FNZS$}n<8Q>*u!S!?I;vlXmGL{3 zBk|K#=Y#{(kHll~)9k~$mW*8C1}JJGUOIa2g8DdH&FdApK^~SmQJ$RoeMHwW9RW1l zF2U)u!D>PXhxB@12nH6`U>1%$1UDigXyzg1`ALbeT6oVRCDZrVH~fG+&xsm6(Q;B+ z`QaJJ5GAJzp|t2i=B1rTfo18H(?jl*hVQh9Ov7dx$VE}jm ze-z=#Nr{!%M{qlffeCEcSbS%ZQl*+3Z;_CXQ_PS*&0sZVTXND2!8GQ#;w5AXr?Eha zkM9XCUL&Xq#0da%0zwGK1;Pm7x1Os4nD6V|vDYXb!F)mOb>+QUg)r9-iZ#~wGZ4i5 ziFo6>XrS*EQOscnFD{iUq+IkQ05p0;N#n}ZX47}g@`g0xas`KCSjw&4cd&?Tl-CGm z7TKRGvn)9gVgUYtCW(-tdP_s4iPB1#^Fza4QWV_12qyZfH|#L!%pxqx%@Q1<5!MXh zDMX|4ym%WnpCsP47w$7gdS`&I&~2(u(1}~xf=$|DC;}dnSSx zLSK$oFlFLq#6~eHTjVX$Zu2p-xDAa1U)h-Q=wY@@Gcm2JtMWHCR{88dB>q7k0kk83 zV_ovYD*A$WBQ$r9uC3vZO{WDtgh>*9&G1^Z;0g|lV#ND2f-_@Yib{qEVZ-|l8m1b- zyBY=fcI)x^aEgmVZemWxIzkT*TYScL07Uh*1+0Q~zCHdrt5^_!4GPY!tdb{L=lStJ z@vq~rf}Ihjil4DhmABE&fsmfTTSmgK9>z?vWCTh>`d$OVfgTbcS8c$EVg_Rw!$nY< zYr5eugY7bwBurfMwtctK1px!`BMWbYW+<+aH+-fTW5ZNJk zs^6%(9B>4v(C4|13YI);uHaA8uGR39CanMgmT1nsF%4^&{_N*N3L@)&*9$CnhxCU*X32SNHDu+_iMYl?@!yX>i+eW?Y7ruvgP7uojYIu zUN|qm=$gWA_8B+N8#<(Kr#W4+=A(a6@hx!``j-!+6Gx`O?##5;*lZq!hMbt;xzJ*72Ue$}CvjzN?q31|7S4sy&8|p(<#pHhx*^4FHFyT~ zt*Y!)?cI>K`1Xx=T-R;*kViM)wME)ttMY{VcPxfc*)6OpKfAP`!aHTi)PWtZcX}pt zuUk6gL&^dVVL=V(9PAedD=a99R_An&4v9X~=7lytv?0calqOM4Y0@SS z$fZ)yDo6-KS&$F!B*mZ)`GWdyAQF0fk6A{9!E}-cR=`#yJy;m54oblq-%$)8V2p(} z_-hsNFly$uZLt;v$!N_D9uaTC!bww|?!1f&0A}A@pvWnfJfM`n1qpNaz4=b)@IDT34W| zv%Jt#NG&_zzpb+K+?1p|u~)k2+FnCzu162P<~FXRHMeaD)*LrBkvuJXDJFO7e8b6f zEW$2@*V<-ki}2Pine%b{^ZB?tF&{o5$e0@OI9P;5#5_lSu)bv_b!+`dE;0AVay*~$j-#Q(;j3xrjP%Ik&a^J zYa`tb2-B6UWPf3oq;4=*Tjr^52OrKZRoN--;*yGN2cn)DJ5&@GrPeqcJ|jREcf!tuT^4MgA{qauKOOZdSL(^!~*V4KhFXBF#CFow-MK#5s(z`X!s+YV}(HJk$W zTtGA#uz#!U4q0>vR?CyXPpW|d^c1HaL0fJ12qf)@^)b)E1yV2)`;lMQkoX6`t|38k zC?1-ZA`$Zh8SCgMST90u(?!g&Ep-P6DM&Dhv`MNkCG^8-8&NgFfvCEe4>A`gH+0Nk zhoX)EV{btMbiP%joXUuiVy&2xBiqmCj-Xg7&MA{leaJfob192pD zUR+zF7mZ16&8RqRgLphCP0sWws|6NWMD?)r5_YWQrxFoZA|>tobfGG44yr@#twxNV z=Xi`BP1^LSunqT%iv8$yv5A64CA(Z)(!M=)ImKSW&QXcGQ6g^T2chLGX^-$9RJA)w;k9y1bvmJRi=K^&g;5qIr7L66WM4^(#C2f< zo4%1Qa4A(!tsLP^jAaqcNb{{Q*}O2&E~$AIA-p{-E)BCV*-4_PRxKhqoYtbVY1G6^dO4VR) zEIGcm;m($FUwNn^yN{)Zw`Z_-_6W-e*A4FL5!E8i@5ux|5za3aPDutMC5)%^V{|ig zV!EzSSFIbP+on@=n-p;jfL)=YER?FHF)-9qq)iAd4e4lF$ZDpr7KkY*PE|V?Bsp7& zl)$9MoNdyNHL&dlw%c$Lesh}@oiUg1$4;S}l ze*44wANkHi;#c)r+L?BfYN|I$rdtD9sT^rE711JrixDQOkjig*sj!0r0BC?qQ4msN zKS)GTihCvp$s=UN1{x!GH;t3Sa;=V(+F+zn}2R(hufNId#X_ z`wC<4KQnjUlTR(YeTV$=iaB#uT<)^!(Yr1`zKuz12X&24eEZFpUOV&lD_DX}pXEP_-E7LWl2+OH$*PIfofX^>GZG+>+xk>f?W{0Cil*)mYqAH~J&d8rR_ z+xElK8vkKe#ge8~KfWU_hG|u^odQv!EWYkPW`jYA5H&|+&J^S1T>NR?D@3`pm|;Y7 zx@*r1KPPC;i7HkVl8EM1HPaj(-KZ%RAFPa4j)>*F4zKVR=@{~u4~RmhO_sVcO^@6s zK3J{-btva0<0+9eFZ5KuPPsYBr|_9Ff=i#lq>}Vm_&au2JJl_QvC$EvNF_-?7}5Rk z3fSUbc%-40{f>12$&Mskhh6j|c9Dro7)#Zn^4!|=+T3yJ<8qZUUpb&7q7|0jmTul2 z;ofaVSf*GE?JSu-QD+iTaw7ha2THbXD%>QQq{2}^2nK|lULJkOY>M=TB8e*N zfUq)|C1!shC1B1D@lAkuWEWL0Nk~F`6NLCC2$@Onf$s=gjwgQ9fNeuY>IuI1TD^u# zltOA~Y^XjYhi*;#Pn&_CWT}8#!Di4?2HFaUFOvt+e*%`PSxnq&FJK4YEF)OTIPoAg zcFnU*+X}=pl1w?lcF-okmAQ^=NrBK#o*3-PT|jD@RvSSsKh&##yOIuK{HazuVQ(yw z+zJXie0aj*jPBkW248AwwI4+5rJiDH^Pc$sXu_AH(kahVNmrNuoUro&&p+ z2_AUHC3h$ErE-|>;a=KPa2wY4aA8!IlTT^ZM|46`S)@TK!5;pv_Ejw^CC$D{xH?YW zS>YUN;&dyF(0ZU-*z<{)i$u5X1Gm|h^9f{L09zMfF!%%>9n2`sB&o6S3OaW!p4zKV zLmLNZ&o_-{BZVsB2d-k2_5&b-_$0)I)3-8xGPeqkhv;ym$P%?yaH?Y$9@z_G0{i+w zDlWJaL}3DM9~RRf)FuHZ9LJ?NfiXxlQ-EI(wwn#MK&r(WNik<7G?1Fk72?x4Q3~+O za#Hb_kR3y;=68_nn7ott`9}~L{Ry;<64eBYihvL}-mvopytG)s;-c4Tb7MP4-Qw%- z47{PZb4M{Y`MCIJ`NBKz%vzUIT0^gq~0^_^>%Ta{j6OafE%tQMF1hSShG{m#a3!p z2XPKps9jr$lra=UKAUy0jY-M!Zz>|5YdTob+~0N`u4Gq9gE1%=5&J9xx66;gP!{8X z&p`ST7P55ty=qk0!%4!nY2OtzjN5W2R~>du4*4RHY>{*5dC$Q!3eittW2HlE)8DIz z_Q`ZA++6UMorFCZq<>`)EpvVA9T?TE7}dl|L>Ygwo|$nxn;qU-2EZ70gCq#jCV}Ev;-0HKsP)_^pu)IBLIcNFFB3aPJd%2O@ zERDlmjRW*6&MVVurM>h8T9mbqk@Sr^22-5?tgy~-)4`Ugdr%-_Os;O%S#}%R<%j-8 zK)^Kx{BG;!X=8A8jc0j{oJS7%5tOlYY(J{wYP-14*f!LWp*o=_jzl8jPZ1W8u7~-h zBsNEf1^?bEnjvY62J_y1CVY5Jxy?NhQ&#WW(t3NT7%s z+WKm|AIc@Bqpgx+P_uJO4YYL)7@l3UOE{?qHOy@Khe*0ZlaL|&q_&-*OoN~C-FkT} z8><_upUGy*v-S0?UN#6`pBqPk*%C~#nq5)E0%@maG0;trOVCSw2?IZ=GF1#@1zq_8 zw=RlnSRf?>vaO;6zO-zws|SpVHMj#Le%VJp?MP^##7K}oJr9oX4QDR-GyJwhtSAqh zAOM@%pGiQ(nye~$NrDR|kju~WTM<$W3Nu`x0O~{{ULuVoFW10-kPsXtC2%7pWmqdh zDS5RU60S-m4p{Ku(!{}u#U2Ubxhc@EYTUGf6)X1c-|x(C6K+LGFK^#wzh=T?;!Srk z{j~V{yJGj$6a;9cbIa9y%%^6#`UzVLsGLeNLi5#ERFyU)yonCMieqv0?0jEYSwgsQ z5F_diB9=2YYw#f4Xu>*Sa>5Q(iy%s|hllYM@ClFRN%9n|ltd`cW+zMJC%)op+ttt5 z{aE`Ynnz}Hu;?U_{dOOZBaM|~KIUg*DVpd|k{nO~YAWsO7^a^I`>>ijXr(nr5lzY= zLJ=O7^stZy(Fka6nj;Y^yp+n)>~v^XYIZv7h0ACe*?6CzGqwR|EKbW(JE*~MzO7q$ zEHsFy0l2d(EO*ume?V)(``G|27yY65%{*IbDpgir64YAlrySoA@_d6C%pNpmql@1IF{s21J@cFcY4@ zKJJ8lrwDhbA>cNH<4_EC2A3%Yz%V(YC<14ppf}c7C?vk)QbHsMAsu9n`GS->rJWST~mDzi1*35 zbhq6*osCm&(oZqZNYMj@PEI$Zn(Vf8M@rlGGHHW$y(ben3`Y_W4!j>F?2jUR4 zKpYS>_|qs52WO@TekwsZ2%L&MXgIdrEHa>l`B4G$nX?@RXO!7YmZ;#Ck@AX2rRwcb z!J2{>m*R;sAHxd`DSyd_cAc~ibxwjz5ePUXBTMY)0z@Fa$;=SQ`gbfS0PKU=>iE3) zJD*71(&&0=m#zsDM8R$xtFkbVq&hazx z`e$(PNW##jw{#ZeD4!EtZ=Ul zZ_C)8aWvzn44076NfPtiIo_O5n{X%HWcgOxCm<@K_hs3LA*K(v}Fi5+K(QK^d!v5xmS)wkg|{qsmW;UI}Cf8TJe{L$YTS z;m_`jV;M>Y@iQs*)KX85mCGjJPx761nXnqDRJ~Jp>@! z?4;Qira^k>P|wPqm3#9&weeqHzxeZ;iy!T-j~`lg-`z_W{q7+-=Tn#xE!i}F^chxw zD}{kYCrrw8oqXl!nGfH5<@Ll26o3vpp^v4Ueu4k>*(@y;C!x#ha2sM@eBF_^-}& zv+;_vhY$)%V4se6V8?K!t(#3afV1c@f<=P|n=dm%gwY7jit<_%vB10@8Z;|hWjr32P>pqkNHH`|#+fNc;cu7XC!2>onRlgKodomKm{cm@%_v{laD2e|-MX?t7ly_pbEp#Cf5yHVZ^8?!^~gj#H>7MKko`9xu7nlsC!V(FXsS~u~v zj*A8=HSx7>;%glTT9X>4NilKljS04~NE5Q@&~#HZEGIjJTCI9o_g?||F~-jtkhXkS zGLW`Lb6_sv0varEjVZt@0gbjIX!6VPvn%7Do%{&y5Sj1v9kc6>=XR~#^zFp8+I( zQQOgY*u{uQyunHFocNQdR}oxlH=r_GeWo+QWuuQ+IJ$21Y)<%TZ1Mp>1~3VN`Kjha zfb86%w{o*f`{Lh-Z%bPmr%78jZzf8O(8}M+)j|*&#jx64&1IQNrnil+Q(CXIIVlUg zYmIk#_bLAp&4Voyr4ruR*sIaHzxIXz}K3kew^vmU1T;F6E2 zZlkpn>gbS5Hvj?KvRyjjJPFyF>*kSY)OMtc^O7!-Z5#y*oXek{WuxPi76uZCG6;%@ zgr*fl;vZV19^jBsfa!>>$R^u5E{;revVOJ4Ys&L4%t^H z*A;Dgj8gQFqyy$oz$oKRBd}Ku-Qd7x|C#e%xT$MA7*`JxUM$^4NJq#tJ>lgWDoh zIc}3@I&`TP007zHRGq6!0hZrz)u#*D^_FbYa+g@mV9iTLdwzGTP-BoEP(XHA8p5!G zsI6vp%S~zB+QQ7&{9#;_^s)LMCPXku_eXr*=S4R;P-GxEU^505nILZ(cm&=c}!x(hRd z1(~IR9{y_seJcA@50Zw;Lp+es&Tv}SzF)Rp< z3OhdElcFC3_dK<8`+Sq4D>EU3c~B^7?oy?+pQ23BXMb7OKi50Du1ihUt9?4vOzB=> z$S%-x4-vhANC+X)t0hE9_4=_l+B=0EoraDM2X5?GcBH&q;N~wvTVhUx9C}=6YsRC3 zf9#Ei*xwQ;2mSeVHE~t_1repV6o+svvCe0Y@fwjSlgg zGhs7b%z6HtOy4|sXo@#8DDKRB${;uTVqwJ%5sSiPz2fMMCR zoBMUnY#(pvbp4=+a%9;}&$4nBe=9U`@FrG!!@%|(v$FaPTGMysyM1c!Fc|t5Oceig z>wQsAY^P$2{ZzbQRPFq#_?pZJb8@i@P}bH>_h+{+ym#Xp(Ljhoe%ISKh zM<2G{Hd{lHkni{8RCrSjm5_>DNcbp?Ju{1l?4*2~sN5MaE-n z%6R#aOHFdqVk&!VS?Y}9>&5_ zU>Nh*@Y3Se;L3^&5D{!;{NTlEh`Ua2y!_ z=lL0D7N)3GW>dDI+6ei_F$$v$L~DU%7l~|}cmnc~ql#Xa4clh3S=PgCAz(3@Oh8D| ziOip(`9oafrVMoW@i59r0L}=qIN}?*AOe5+VMtay#1YZ2<~KpU6Z9*0`F-r6r|_R7 z36GFGQC>c)Q;{oxv_#N>T;sQ}0`z^L=5IiHEjt|BB%|hgY z&OCBKyM0nNb1NPvHzb^ec6`B}5=TE3C(}ML zBNmfR>fQjty}&T`WNMU%GzNZyZ0z0Q-c5UFb-S)4I~+_c^g662Ss#n(ouB-rYeAb* zo2hpS#BNi_M=}-@_a;h0lt2(xsT zB@N=e_^|l$;s&iYM@-NE+_ubtMhHVb?vPBp|nXu!qb7{>E^)J{C4Hex7R zs-kbTN#PTdm=~0XRn9%E-P9dGfOn5g74N0NQGRN8r=gKf87h;{Ve(nbA{=Os$znXO z;T?Qej3&yrUcL+ahd)d0B$Rzxy+rHqH0EtagUlMAWs4fbmAv%$ipEO$Rz8Qc1`=&S zujrpPvf>uL7T7Q}D1Ft~7 z6@}8A^R>-uNQ_Hjee<=+$3=QoTXWKPiB{9F@YYD*U2bBh(VE1n!+zlFh(D>d1T8MZ z{Lmk%vf*-*G&sJZA+`_=u{W?q(yN#6LQl0ljM8aF=~-GUXngaiXnTo|3l@yF251Zk zDK?n{fhPGnWFN-!5^Iq!ZH-Py+8RS1_;*A8!E=FKL|uG!Vzu#6jV%yYAwQ=sN>}+- z)OqPB77<^k8ZAk*6aC87MuP8AOdTJxhQyd*KPOg5b36HZ(x#EoisD1py!{jH)K=A% z?L-SPXJwunYm*?OB+tU zQWA75(N3BU>LumnG%7)Oq*og&iTG&i@G7dN?F!`J!%6#sQ$W5k(8^Z(f@YltvV`v@ zUXyqW4P}E=8(V-a)m$C5QL8dBGMEpimYdU#mL;mqJ*Y^6rV?pOE`j8Fy|Ro}tKf=J zPBg!HsHp?=OG8c+UDie%Euo#|5P+en?Qm^(X=ATZLg{or4;a-(lSXtEjn6_)fy)d2v)FPiFc~ z{D7}y?K|;@=I_MQSUt3ZsZ8V(Pd9%V7AD3GiMG)GwqfMG;L+2COd%J(dxb)Y&{3#_ zCvG?4I-xIaD7CP{7%7YqZW1O5Q-vAA9N{+Hc3>Ego%mH+rS+}S|I_E*R?qxjeSYHN z#q1yW{paGvF&F(^w20pSws>*ef?w<6#qwY1@1jNY9v>&4rYHXW)Bm9i%9kiv-)k}b zENb<-coF^Z5B^U+7pj`R`+s1x7Ya*-JA~E3I*4oU5$+crf+xn~fC7G6Xb|=a2ZiT_ zqr%I=pMjv$*^k1JzEVtH+>)+Gb0_3YOu?+wHnJd50o^4sS|NgunvasHNqfas4yHB9ybaTgqwxw!YpB~Fke_KEE84=cfyizlW?!F6?d*3!jrK7 z*d;tC>=zCTFA6USuL^G(uo4hZDZ-ooO--#Y&x&chm@{7}~qzpmOulR+# z2Dxlp^_%I={F_PU78U5qlCUz^)Si?-#b)th7=u!#TT_n@z9TfS(uL|cE1_9cIC>)wpJ z`nA$-I;9ZHJi1xh-8hhbu}JX0i@r%bO5YLJqHjW6v7_-N;M^a9l{;evu>#76?_N-*Y2WEyh*iWYlxdgdqNFSG zF$dGVMcFP56Hk#uVUKX9oGD#`e>cg=I9>#qu|QWy;iMD5DbT>@h*M^qnir2BI2e!5 zJ2j*3*>R`uzyE`A&q|kOpPG%&n0Ro``?LFv-aY#M)2HvpACz5>5f~z!LNCER5qpNn zLd^lH>!nk1&yaby)ef0APde3DAnuztr1my?i|5-S=PsGL{;>_C zA=Y9KG~KDYM_vJ5!3!Rt5WIoFnr(X`f>cVQq1DS;BorQ{RT?g?kPvGTF?ILE*TsLu zzqM>0><|oW?x^@nUwlEa)4uqERmUm|GonRB(Tqa&Z88c{Bp(lG=_2i0vD4ODeOSJ(D z+yaTi0R%hdVkC2Qd#`SL>kCXuLsReH{yx#lINSXKY=M7axs(R?GsuI;X@N*dW_AUE<%B zu<(#4ru3MyZ3s*69RI3k7enkIvd2%MnD<#b+CLZLy%n?aS6FD}V&(AL3s-GAxFcRd zapV#tzL%1#R|>JW;$@ZbQug+wpEs@h_0BcFt&M+vVczFUnDh9{%(>)q_D=kk%6M;f zu##=Q{?@6cTf3e`@_yy*CdBGR+QU8qiC1tg42(0(W!_({3ON{F{ zXlp>4MtWz)a-COHFCWW#yz|}h2e&-1_BX1Um3-2F7@HjX+81fn1lEXIW{o64Lrm=QYu!9yKOqlsUOM zxmb4|uiU3`x8ce1L6caQhLN{Ewqoe@(MYA89ck8y2p4a8ge)Q4l!^gEz43FG;`{P|ovWIOu+$Ap^t%3!)ybP@h zp>V<> z#(n)O=FF-bc<-bUFF$%><;^Hvg-y$8l!8K!bRio<@b&1^VFKb!NNhe z2OgQQZJvDM{#~z6>VNLQ#?l_QZ_9jX&Iga8l_1kiwYoaD-8ykne)lo{NaKt1R}We^ z{^kuZPGGQEtXGPazwy$uTbBlnh|>DKSM*4s>ifq`U;f~NHeGteb~P6-|LfPw&n#Lp zc=1i+H(ArfQ->R0n7?}9!kefDXoru&V)b^e9WFqHdZC?&+pO>?d{E>tMR$;S1T`3o z5EdG@EJ3h9la5SG8a4Dond{*c zyPr^Pk{E)ED10zgBWy1a77kE-sEp#n@g5-2$Sr`8(BP?%cvtn23FKHOqGqK#i<~o@ z8=c#o=bSnxOg{?9AXz}yw34Xjya4`5qSu#H7d2ae4NU}av>VXt;F{*fm!a`m;1BeJ z?60R`f1gGas9bQ(KcW3P9_=R;Y6K=^{zN`&zD&5fAsjbDe5<|eZuC?UDgcR?5r~$G z`~?Wavdokpp+!MB_GN|OZ~VGPID9T5EXAOHuOjmqFZ8(i`A#QrS*7}v(s#>lMtP|} z{~Z4j?LgV$A7~UAp?>SxdI~HEY#PlD9d_LVaFV1PVoOyUrf>iogIG@zOX*3L?dVhK zaOh5MYXig_e3jjPrWG1VG zn3jTZLM+DZXvm%wZ}45!YK4Q=Xo_#v9F?04DD?@gH<*)h9tO2VRg=@Pm7$$DZK3P; z3m!OpPRp^4yk;wu<6R1zJ*gT22m( z?eYX)#JAD6-M8C!%%}5h%l!j@XJIZw@iJf|Kv)>C4v2BINo@^v?rgPJ8SGW7Wgg!N zuv#6H$|_M0yO|_DZcbU59@=f39yz4Ga@(F;IAiRh+n)p;WA~e9%pNs$z^~&91Fmqo z&C7oGJ^RxaTbEBC75~>)@f(NdNBcZ>!|bJ>j}!C%P~WjjhCk5uIqGu@=MOCh@%~Qm zzMTK>C;9j_V0_~@5~1MU!Cn*xOLu|K)g)Pi;~k{C;vLutl+yAY*OfpjijqV;!S0B^ z!8&Ts^^3oOtgX2Ct9W>E>Mbo?`<1*pwR9%iDNdBObMBXNaz!2;S>XMfIdwL5@;&!V zo_x>dn|n{3)T`GdWT3b7+iy~@-V-PG?uB?@O);E#!*zdz&qNmOOyMKe2j2TRsuzoZ z*=;9nB3Vb_4dSQ*Jl>Y{V*;U>O%z7+<{yLn-L?GOn;(%H#hIO$(5X@sk*m{T@n!5; zqOp`mL)>V=w>aH`ZxPAl_!e+fN%*wU^H<|roE9#DdT`&pvd&qKwBtX}{6EfimEQ!pD)~A@DY)*qGRrv6Pld@x11JOykxoF>dFyJ`qm8-iAR# zBNKy0ed6WoGn&i)m`9YzCSS~EubX5WofcG>AKd3uh=6MC)9NGC1+Bi1g^Q?t zu@2tOEq+NY{UMYWtv_ej|E51QhFbY&l5^C$Kdt6S!>@_rdE6Q?UZ**J4ew8zAr2Q?+mYx&reRC ziRP!pkCMh)E1&wKm4Al&-C_-i`FRC!+obr)$?nj2O^=UM4s%Q!-XHd(Xh3_&L$It& zr{f-ipclMUT^s15vVU;B_>4-@B|sy$*VGL1FO1k%Yd z(@B%wM4@xdmQaSx(W6bsY0@1LN5Zr+Ma?oA*%DDq^MryWFh$M|hl{ykdNDUrPvf2( zi2sm)T1n$56KNi@2ICRV%w%3mPw|Lnno%XbXhg6n@FpkIm_1ER8=F?2Ca2x%0kBI( zc9thXT%8BtDtOJHk~}cu)eZGen^e{7Vm=eIK zaPAB!n*_R-d`F+bEaT$O-1zT8=RyLBzW_V4SRG!@!^IFb5wWUY;622B3W;Mb$E6?0 zjdYZhmw{~-;XeY78m@&J7v0*NUA+ChKBLR)?D75$j=#=dmoxX-Pyg|cPme74-KZ}g zI(>TU&iTt8f9S5|k3!u$cjjH$wYk$TO$t0UcH{natn$;pv+@V(8>f7IX36tX;DZ-l zeRJn0CupTS0g9`|%mA}WE0;Z+q!d=jd9V_#$qm3)?rP{+v{*8I6VDgmd7@@+g}bzR zTOOy=0g@Nx_u#dlLt(nZf**FY1x|Nqp`ST$P{^r>)+af=2A$|)W-*)symF5_j4)|V zgDl#dhLl5Moocj2tX8AV5J8Xt4G0SfVC>Mu899V1j~?KpDKs*gJY!vwFPEi}(ln$NFdbW%3Tv zWpCGxY$-5UjQj;H}B0hYj{IwHPo-;wgaO1IQ01oqC7gq>q4Z zr)I;66T2d)(sjkg;lFJzGO&k*@(-$m2HPgnjY$-i}oI#`jw^xDF8$B z_rIt-+__CHDKBlZv10&(?oZ8Cy`|-)yMsRk#hJnF!QH{8pd3_u*)lAhFY(I~B{ZB| zKd;db^C+NK^SI{xJGiUB92));^h$N&(_?BX>iNkJW2A`xr2m{>_V*7Yt)cmZ!Ai=G zy_ztPPRt<;%M0rY2`%A5HJ`V9;7DMi1iE>_WGp#b5Wc>ri9245J&#@1bPQWzwB7~!t=%_2Y&w$M zWwM>0$1SKtp!ZFG#`80kop}BO>@uD3;oAugqvh!&xyRGz@$?W~Lv!gLAyUvl?X(9f zES)CJ5FfOMo4&>K!xcL1wbDOoF1`8bma`r-LJ<4w4b7#0-1J_ubhE-sH?(Ydln!o4 z?9EZ!w9-FLmfrGoOWU=G6x`pPM#jUjAn2U(0cMh)Q>fpMs1?)rGySw@-lell6ha2M z*(1Iq@YRQKlmdv;j#E2_!Lr%8yCw~^JRmS8Zks1k#U^~R5ix)e&c<%bw!km(lG=^-nw8^1TRBm)0tgJBfW?CY zmF7%kpcQZBr_@F(ONS@b0IOv6yA67`%Rpfmy3JQp%&EYt4zd)73D;UI;bm}{BgmBG zT^wG$fKBN!q5D^}{BRM#$5#dIAq#1`6LEM=m_%zv(auB!ACgp;mw}>@`1-3^?|gLZ z+*|RQjM8Xz`+alo>z#<~^V^ZF*4j1lsLR`5-A(7rec(t2bL0>b@#xu)49h}DdyXYM zq{hP)(*w6BhoE$|3WX&9;GFE5_(8)5R9tt-?Q8tN?vmDiMGmM?W*8qZlS z$v^8X)s_+RaOGzCX5|6hQ#!q(3(7uY8)GNqFnp}m#x>i^m?5n16j`GQWVn!xVjqYJ<}<&&TKH~O;79akpXWdeMDccKZ?-p zqB$GlAq^!4iAyR+i6JLt2#`4Nc;agaU$irkCrDJo6A4;~@em@yN#Ps>7X4FN)52I4 zrrz6m7KJc|AfT!m!GLFzAb@VV_=^w|R;2W}{2~svw^N6rP7J;{a9f^D%ZO}VSP4b7 z)jL-0V>`cv*TT`i#CI%}bK(Qp?)bdecrkrJd}Lzg<+gkV3llRq1T*MV&6q(Z*v*)5 z1D|l3Z(ys9WY6-a2jFQP`w>E3h79LNvruy87wKGK|@ikPg;C-jF6Vs-r9QrRHi+ zSM$xzX`Y4BT-|K_T+ce`At^WL^qDCYr`Yu=)T3Igc|BNu?*CVWA zB#rYh;B7S?h9?qiu;%BFPskaGGs2qN6+Lr+h(=mn7^r{R501eEa(wgAR|uyd@;fU5 z<^@0f2t&L?b6QE|4rn~CQF&^aJxY22N9L2S%=u#R{x8?W8$Vq-|Aw($YnJzmPhI&& zzgLta2UhfbEPf*X54f%`?X|UZ8PmTfc3b??dyQu??7})i`GgN(8modksjt-E-G9#a zrC)J}PC5RZ`bDa|GW8MLGq#ZmT4OCDLluB zF>wQ^BjP^kKIfL*{loAs0%dKzCBdD*afq0c7D`Q`DZ-ED+zG|RDk&rulJ+6v^jDje zvZPNDj0D`orFf+8K#IF(ltsE0OulXI#2wLxbY7THA91(|2RJUq_JD7p;|@rS;MNV~Lq)!Z{6IwF3r=^CAXpvF zuEV7t3l^W8Q%$s>$rVuqaQB?O_5)iXDQ$*VBpgw?=i-Gt-82+oEMF{CEi?~+#mLSP zzu=m=k)h~}A7FjrY4H9FvR?5+$HloTMAxoeu^(2%)?sjk6rc+^m8}S1Vm&M+Fr$NC?yhU(BEF3=U^Je&hd3TKg* z8ZL$SC7dAu8xW&~O9&om8At8@(F$q^H%2a0h1dW(ww$s}D_5>qfoSK?Jd>?P3In~n zOqqj#Yb%&5fiM*RVZ{eSuhDO__nNzgcDaV{W5tfqkcK{FPbAkZ=E{L}2o$cQI1zYWPSn+3SZ_C*4yFhBTQ1lWBa5hxZ%M&1D&*bGpUaz2)X@Ty{L==PH1OGw#h z1c4#xmUHkF)k9CgI+Q=v&M)|y?>K^>*KnVq1*iLqI1N;gkJeRTNB0ZCu)#>9#83FHVZKYI|hBu85#EXm%ueR>1scTxz_R{4AK`xBtV`2A^m^8RE?6-^ku z7GXQlv#VneorYCqqP~9{y|hS5D%BTE&Mx-*owy}l4<5@Z>{n|B*f-j@+jrZK0m$hm zyIxD2vp3ll!Jcj>9K~&RCEeav8ZJ$iX4(}~2+lGlyH=S^Zpmr z%T=x#yR1dm;oj&t;u`@0ge|)bNBcQanb0XO9itN;t2)Ul+jvAf+?Zz1);K2YNkAn) zN|23JF~XFR;rc6NZ0zVVtrTERVaj#r3|5KsN^!>sH+9?!0zb7puq!c z>-!EUtyRa4#Y?A7r9$o4+6}cQYvm0nORTN$R9#w2#N1fWzO=SJuaLjno7;x|*6+>C z(%z?M@b{`M97Zv2A07p^U~T9SQ-y%f{;4(>c%4Pl^2(`KFct9PT; zNAVtQ^@@TE@mRsMv=U3=dGHOoH~DVao_HR6lk^V~>z@t%1O7BqGoqTcO|L2!c=?+W zWB3-zhtyLl^%wWbms$lPl!mU*j zvXT*2m2FZLu(5Zvg!_yE8ym+5fp9@|c=#P@_&e{QZT_n$M>laT+UBDuv%fnS^n+Az zG|5(!?`m4njZH@D5;@!mL4X{PmL$26|4_$zUI$5i{RS)mPKuKi(0E;4!+Kr=J@3@> z=OOM&7EjOfKIlHj8r7)Z-JpJ9Az#CZ1DV&#PSP*jqKN)I7xIFQ(Wo&Wb*)x9aWoou zH>ZI-Vz!4@D~brWoUE6q80Bb9^}6xcYaB(_s>NPwk$zJRu0~~Uq7Ji>xD}BpG!tTK+Tz5cX20?ln5Cj8NpOFbwMx#NHZ-$GLU|goJhP9vH z^hooR*Kt2j9%`1OxpQC;fglMpxo*C!tc3L)Elw+_>-CcS>%#@twY~d}C$XNIK1a0S zH+i&S#Mfd#>g71=-C9Q(*1!|e#cz3#VXVPm(|Nf96uF!gs;`=}oN}J8BDJ>t^n!8i zSG6&G59Vz-2?Pn*Mbvv-@v z91Vvge`ax+AW21SN9Wya`7&ZHf`LS!Q%PwlG)}AiqazZNYKlf5%{-C$w@fK>wl|WV z9t;Lv^*r5>&bp1^a8x`@nf|R<#a1E1@&s9~_J8YR+HeF$c+9B%%9vqk2Z%g{zEhB1IP+_3)062U|zlN4N)jr^=J{hDfkN?ko3p^l>YxLO*Ar{{%E9expry zv%;Q{o;I3Y6~1RYPuuj$(;E;;p+R?4cS3hohaZ>okoc177E&Xrq8%?qsZweOOtR1K zhfeUNgXt;Nu(#+y(sym_kU$C}3i}*j5d(aoP#a+!to%Yt_gQW5z}CV#m#iF}xegqz zdI#%z`=0pvUbmlHcp?5N%lZB^u0dbdKhrQDmx}fCf63o9iK##Ti(L~xAOE@!%bUL- z{t>n{k8@Oy^-OW6q5?(WIj>p^D;7F#bFX!*aw`;X3g_pwqe|(o>d37um8!Ly`8TJJEg@a;>e_0L@%;w0uUOO zVIuHUXCOG!^1R^ZafLN;9mSoZp}Z=XQHu#|sdX|**?p5AV4c&X)!0WsB?AJQ@kz+c7x5YOX&KWpk>h*Klw= z&TVbi=B#Y1ziMLKttKWEiu&5MtH{jkt4&TtVMR6I3@eINihb0E9fJ(Pidg{aSk$My z8UeJED390Emr<4u16LOhpX4rdSG%R9ZZ^g}!!7a`_a+z)-MH7+JefUEjH8%Orq!~| z-Z3vbw_9ErO=z&NOJ06%ue`#*06w7u`rGpY8K%4d3H#9L^ltb z)PIp?q6UTWY(Vq?ZiE6S5#eb)(f0G8L&>>L#!6}q<3_;Ut)`tQ)Rj{&%uYm0;&Ym* z?^s+`iVcK-1|<=Q+&#hzex#{mywNA!ysT|L^;MQ6}f!Nis9%d7iWW&N-LV zTvNHI=IPX5Q-4o=6SKld_SK)zC#f4TBc(=TvGal<tl$arpnE@*R6 z-!L5;jDERHWLra#Xc(>BPF)uQghdL4qev*!^FHd|t)j;1hVffvPDPI)-D+!&?bf68 z1l~g@jEV(`GkNx1o36O{4*jP8eM|i{e9lRYL&iHvF?a4=18zER&MmVG z{rLuPN8MKEve(nHr+L}Sy9H``cFWSTcT3iEi`De)mMk62%RYFJ>DJvj zR%`X1X(KQHbD#7js3GXwYcJ8XVlqgA6d%hysmJiqaS2 zsVxm(7SS4 zyZ)DrC)z#g9+>YB_tnoIapKRs7wIP)t&;EXzW%T}20md4ssdpmw11}mNqrhsAJoUf zR!(*X>8nilD%&w_Y>nlxZWk|5G-D-2IaW3SNTqr_igwW+%z<~{>#NU+RnrtC;)POw zLG$i?b+fshBR#-gD5ah-LrbZpIrcz5t+NtYOxgUxMPeuduWzhgZG2ex#}<6iyFr%U zn1Xn-3lW*Hcx1is6Am6>fAo}=goJ?wY5H?UMIpqwOHnvIsv%W*umUG8L z;n+>yEv_A2ZMjzf3@#jB!1ZUBIv*)o)pb*3v$%u1WmAYZiGTPXNbB9DNz4{X1ot9B zQ3?b$WH366QQ$YY8|Si)thB|HUB!3m4u_GUgBJ&%eb)ahvaa$wQnEHr=o7%d0T?i?=!jfj!4 zb(qqU$1*!X849%FAjbVduR3^_R(J4q?W*s$GsjjJ8XqnAR_ph4@ajSE>LbZ3(PNVm z!YAwnMB5>r=~~9U3W!G>Sj$jV3`Ru*%RI{L`0o9kjhfaS>ADhfNsgunl ze`&N#@r%6Vdbuf!>}D8TGk&bNo$JbxTBd&lcw=T`@Xr3N0K2ta&YW($Up*P~u?XuX znXR^i*DA0BEF-r$eFN@#cW-nL*A-U~hwyFFz@}6zW2`xLITB!>>Hu(}S|>qoUME(g zSY?Yd4XmcZoK;R-@H=0$8X5v8c(-%MY{^7;XtF=D>~VpULsP=dv6JFU!?&v|^f($Orq%S@ zsZzD0RetH%)Y#=|k^VHvn=MIPVX#~PTv?S|n^YGdkHf9>kw51x$EiYWurD}62x5-} zNSYi;$MrX?06=`_G|+C5ee^w~CxGVwib?TM6_Ubez#`*D(wYPS2d&3q_9`Qub+p+h zChf+FrSJGUad$n-Hpw^Y*I4A-zwMV#B5%@v?3Z6yj2-sBbj-hl4>-$0R6%dXG=rdc zdA;QxqUlEfjPdchaJ)Z|Js&%M5PA|18a?2tH`gV~>8UrJ?jZD9JcO(DZdP|seONzR zoNbzY!tsmLwp;WP#Zf&U53tdbO$9_#o-bxhZHoY z#=2Ip;K=deV66{3?YPH7CbZhKCS{5#aKYa`qAbR2c^=4D!I9wb8rpY4 zGVg9?{b-SbWc(3Re(1!-^e}2|9Lg|F%FyzLkbQu1F5H z@DC^d{l}7nv7aW>rs6M%oqoXFp%NH~Tsni=V{I>eF3QI{N1Ya(4V%+Pqh;Z z!>_#P!sTMk!F6ae(<%8$OWubFMj3($t(8`X@ja^TUA0QAR0ELWuA&uZSNh9D|PSybdv;h49%q@j# zAXFj)%0PVUgy{eWBWn6Ht>~Bs3Kytj=@1Fq-Q49G203oj1?w=50j3r0tfJbX zErnVx!X*%-SIQ1*84t`%LwQvQ;~Dz()x)u%0kuB>*D65wxQfAo>Zi>VPGS2hQT6gm zBCw{gT{vyq#OViK{PTBWM%#1GVt1@Ai1VKpLpMBF*!E`O#=`1*?icI65yJ{ke_A;1 z;d?svirzj4nrlp_bstdHq21-LJ-%ND9N0X%SP3|1GR^5E_w}(Lkp$5yEqPn^3%FF4@+Ceb@3kb>H}|gdJu%%!|9le zY`BSP67qLwLgA-;ork}pwiodH$*jvg%HN!!S6O1EC0uG;t@rl!&M}vYMe42kFO3cQ zM&o(?1>3MYQprvUMT7{!f+qn*|DfKnUtt6(7c`Sqo-Y?wCdBLK&D!9bf+*ZtX(824Y(BnUS@o0%R@R zK^s3m0(|x;A3LSf3_xp$!Lz*jL~W`*!O%Pyg#sbYU^b#O!%$sdp8^yr2C#eqr2vK+ zs$mi6OAcsJVK7CZ3;6k3ejcVR(8xHwD9i9f-EI&50HCj`usn)td8mc^X4LMvfnp^o z4J7eyg18*9e!L47SH%frH2ZR-_e+6z4g49%iAcbl2Q*eJ<(c-j~ zBb^!}gM&E6H4VegmbuWQRe=v=VS>AA{z}a7Oz^pWrOdD=09?Ck7yaWr678PZ@VqHb zM*lSYTcTGUc<&VLtb@1B)h8c7NzCd(^`nLA)p!q#fHPjhdjJ9sD_C4{_~MUl0t2DB z;a||6H8MiQ&hDs!0r5{KN!-;KFs?N(094e>DU1`v3QL?Q6CJic%VOO526H>eW4w`Vp}I0ZfEuFAC+|vhoEkF7V>C^~t&?+x}kt zav1f*dBeB=Yka=Dz*9_)!{q2IX0Ky9E~jp-}&`}8+d9pGno z37WuHt3BNf>JY8bJyP?Wqn+!Xqs?(|)Hb>Iso%RXs#{Z`(LXYKOJOIZR>W>_$r@z+UbB|}2XP?Jq8O^~+ z1je~)qLMyrxk5P;gY*u_Z4nNa*f}2n+Ati!VkmSFpYh%SvC~QM-a#a-x6kqEj*l$O z<-S$EcAp8Oq}d537NEv@dqP{4*qPXq&=S~P>)fIK0Q>KCcz2dSc%bZ#r%#rk=mEud z?0EtcjvRfn6346usr*rI^${atDVl|oMgF~%$hZJa#vdwmW&^LxqYTjCdteBfD`;Rh zRw<$RTi@8R^_35wX{YeOMVPQtwI#1yU@tlcqTM(W? zIThT#gX}zH9Htblyvh0`W1??LbX;swd{RPMeD;59@0Dc!m4)|zY`&2@(A9jyY;3+p zROH`TZG4P_5#c{~T2^HLe=ys44DIwXp_Jvy)Uro2I4+%Dur%5Z1qps&v{8QIFk=me z=f5)4PW?|t+J83CaF%o^`~i$Lf&K*2?FLj!Wt3WpHTltGOv8f`Ct%ks0w4n`*NGb8 zzaX)4H;5+u1(eUJB4iW1MOC9+CejusEAj*{!UPGffI$>^FV1obc%Pl+d*BWbm{098 zx7Gwn8?e%C8Qp64CYtpEM5cy893B9*#3+HH`(a)=i;?L8o5b`D(WaLd3 zU=K+a!lb>%KVJ$8^I5M}I;TQQ3`-Gp6Zo;&Glh2f@GdjOw}erO8XnmfF`QZ}s_Vy<$YS z$@zz@N8z~!J^ubr_+Ijy5>0pm7J=7klw5uu|afyhn`hBsONK`d?#*lBT zj&s~KRlTBgN`fTOsA~y`El!l?Sp`vs5)9^oTCh*AEYG=tBSmLTWdtFB!}vXDlYdHh zzlxef#J_oNAnq1xZ7@?4gKcQ2jjoRF+2t5OU&!fJyWtC?CX~%dl4UZ1PlK*d6iSK% zY9kMsg|=xjwdSHOOloCCq$5R-x(gmPN*Q}J+7XTGro6x8#XmoA-fy1T@#>p(8y{RY zvw3N@_g!cG{1-FtyrOh*+Xu$g5B>hMA-n`) z#8BSEZWq6p3qcLOTi~(^JpG*<+o-?*+v(cl(jAvr3+D(wsBnq-0?%@ffqBa)^V;%w zth9gKY+`CL8VMx=C6Pp-E~Py2zueD{t7sG!9z2-}prjnaJh?+g=OLRD>V-?5s2)a8 z;Gi;;d`ff^y*Cyv+@Mz9{8|0&_@3Fz8){KY~xO9)-M+4S?D7b|T&c zF~^(mA+qMhOdxYSBFM7N2gGL%cOvp~0NCrzidk45+Lc2PEf7XkDr|$vDUKSaREpU^ zd1L#haKFs#IfYOln$cerj3DOx5PFVWsZfU0(;-Ymuf&Va<3zkq}Hi{6~dC zylY|OVge%O2xU~7AXJI2``Dm0y->`qG?ag)URU_KaMO8ne|6=IId{(P^WebIKfU#~ z6U2ni3)2l$ueW`?YtGL+{%-RppL*|6_eU=6c4S!BXK%h}xA=A?*ufGF^+FNR&6#*X zs3mr-|BB!hp*#GK`X36diap_98`~0lEkuPi?Xe)rY*2_7DskoY0s3(Lt>8}W%aGd+ zD4sytaKYUU1tK<>mB;L9>}NOg78Wl?;IW&+C*I9Ny>Pc!IphYSfGe`TmoYduS2*MO zeGc~uXmPJ{uf=$WcFeUL9n;j?!x8q;i{(P7*n_R3aJdjxw^${laFvk4RYJ7pvPuXa z7%qFUWG@=>MzAZp2or2&1U5RBhZg4W5+RO+&8DetvJR-ryrFAl4Nxo91IenNUmbW? zFOy|J@O-8MC!ByZb^$LH7X6)5CyI$0#hK3%XK7|tuv>VDJ-|00I3zq=jMPQ~H#yQC z?mIeoeE3Y`9M{Fcx#2~@rQzQOH-}5yX+ln5v#FspK0Bt?y8TtU6{u3+X~Sm0Y%K5| zR(o;qpw5E_b&fByQBRwa3EHVl(8gtgb}b07i$piPcy2zW>3#G*J1}jFo;fB{*}pev zg{QSCI3M6X0+o2=g;jWVmI9Cv93UAv;rWCLjd;rfYN9HABAxapcpOAc)<<1N6ygq~ zI+>w31?23(*Q1UOkzjc)gntoq5~<9I@^E=>s(4?#U#KWlY*t5jR$W&3R2|l~(Z&e% zQuRG`Uz?}R){Yc|ceYJv`xr~V6hdSelt({2 z%7eXvk+qF5kSUO}w3Pxjc#TDr?&S*Elc~~17RDla-K9eINa9so6~|ygm+xe4G61UQ z=nH(mG#*5FW}A)@S>x{(N@TTfjG$qpw1ib_4YDTT2VKXbB%IET*KGw6LU6l*YJdp; z-Wf}4>dKqwdWp0RCTr1=(p=<7KwY?@F5G9pdqr45$51d`GlB0nJ&zc;zTT3!+#dYxD87Sz+U@Oj&~-K+HAzSyu8d>y+>QW*rwFP_;=n4cR(2a7@IrlQ7)n*A&)ySBq6jP)epMo9NTbWMAwA+&5GDOSjP{M?ntT5~; z_=+;7!HX^Ayb;0qxy*XkE&lnl3fnr(b?miK$Oh?a(O&rL@5D8C{Z6g=omP7ABRwo0 z+&`S`(^arcFs%@tF%&GWVWn!H@bzT&gr`E|wm@ptBIDf0UGA&lxTUs7I1Gxz0QpE78l>PcUX8`^A%6is&E}9DkV*-!-V*}5|;h3(AhrpDe*d|V@u7n z|De64eXD+F8RsU>O-@fONIht7GR$eo8QQt#dF~m3^I~R`HqDskZVF6`8H0lZ!VQ?5 zJ2E&tJiKINVuCi&nB<=9#jIWLHQs>Nqxhp~kL^$Eu29GqufmoGwgd9p<)?53E~!%t zwmzA%2|5bBUDE;G0NN&qGJDO{X9uw8{7a-QK%Pv;|+&ig)VnqS(M` zIi#fzH5u7WilV3|Xq}{;R2;5KDTvt-o=i;5fYB`XuwKSje(~W4B2Z|1^|=d0<&}5+ zYSH3{*JJNrEqaNH!XNj2TX^Z`1>JC7eCN4mUwY>Kr%7&1z}`oFD*B~<;fz9`yX-(~ zaBjGDe9l~y`(^e)?IT<+rBBHcj0K{!kSEnV)4gu_0}lUEW| zJ_ZW-IPHxH&q3xL2)WNe&{TEIX(on6Nb&ka2b8MMjw(?__lFQ8L7P<>i+WjPU}w@J zDHGuOq46_1F*6gP<;bwI%`~EDvQOn9i>50JvB^>Kd}yE7L(O9DFLt-Ay6P}E!AjYb zg8GkQTPx*#wQb#7T3-C(%B|O4HvIkjj~?G+NZs`F$6WsYTVk@Pny064sr>%IpRMbc z|DOv-EnVxs&wJ7l0|%$-5B}yWlnjEi?7>1uMwEX#gO9;{^l{oruG>SmgfX+eNuT06 zO+VLlp+3*Gh3mQ7V|GhyZA^vjX`}h-EXZoHrX$#&l}HMFW7&zzSF*S+b%nRLEt&xV57k{ z4T0Vq7C}91#pQu(Y2v|BP&4ClS#I(hZJ$(a=&6nDx9)~L{#`3Q1L7N}mY#LzJsLv3 z2o|#s>V`>Sdi*Xo{uT_!+f8Mehw%)=S0bDYjjj!tSu=+u{p~)FO==HV5l;@Clt#k) z`Upu!{Hsf_LkavA=Z83uCEZBQTacb(m=`NN`WfJu0%Rm2IE;VNm4x2I|Gl3TRif9n z!lmN&mkZAow!SEC1A|-D6VR1CuAb3$hx#G7duibuV=%az7U2!8k)4_L3y@_;Sa;%Q ze`>w@g=>3(w|j58{VbREz`@C`8Moc0dfWDI|HG}W!a^}$KW4?fDCiQ(#P&}NSQ$!{ z81IZ!s%ta3>cN>28K?RrV`{j$?4<1J#?0{fWv6B@PFz}cQTEcRs}oDB)>QAQE>WtH zR4_v$(&mU9n$XyGPALKN)37p2i2rd+n}ScT#N$cCOti`jiBYu)VJ!0X!${77*&a`2 z)Jd`-0jv&psX+THPU_=Yb`1vcDI2ql=II8RoJ;mjs!+H}G6+z7@8p`~o}?)+9JDSo zl6`hyOgXKEha@#<&8g%+PqMkvpasVD0jG@KLnVANJhF9D$+Eh#u~MzI{AR_1)0~$4y8LWs#)6wy-}TPJADlYlgLSXKgx>Jsnm10r?sCykcyZqH(_UZu zp%_{C7;W#rEqwmvm!jf;u#l1d3rrE!Ks}%;W1BbJtaOR<9v0nH{#Be;#xd#lIgY8^ zfHGn9EOG*>XrcBpDFuC{5bNy>z&1nobXY?aQ!RF-=o0BI+k+^%&XL~EGHJBYpx=_O zMv+_jYS(kr)JB8Fju)Vx;+@Iy+G=c6#Dm37yeF=T&)3-AAH{~Wno641zBK5um7QMuc zz|xXav_ZVVe+q=mH-XsCf0OT!TmeCl5+>+}nfPiw+iByFfMC%<4^VTko%vGky?Rd1 zVuCm}Csos6JJN_SQSrJ$cVZTMOvcy}B^yw8BR(JzjXD{NDW9 zMK?TgO4}sEhqb&LdC>7xRjeY@&$0ajvZ`2^+5=QaYIan-t6>g)j}Rv01~esB1}Q^dGId%9un%bYW{C1#Mdo)zOW1Rfg($mN zC8GEb<&fcixky|s&nXcJ(TTg%@(R_ZO>Wy^AAC-nGWm)5g;e3b!fN|gG3d=*qTj&Z zom6<{jjz4hsMX&VJ`_LeQz*q)yW?IE$G`T$i+x4ELg8IHG2E#Iy--b5oze9V@e}{w z^Fio6r=7~#*`7Fys^V+^*y@JUl!7uyJU+~dZ4`bd6rB+knd)lWmr1E+UJP0 zn?bf>`qcV!r4(al9bL*Xb`%#4aYC`;slqdjZruMqIcScLqlptD!6b5GtQB$n zfm1o=c(t)B(!$Z9RMEQSWY>Mpxn5sFG!1I4^KWPVp@gD&4d;dh6yKy<`9)D_j7%jwoQN)?2MDDR`MD8xnR-j$zE z**b99xpx=7-C8Ii9X0Hfg*%@sTrTDhN=(_Ro!gD-KO|BLCc5;&i~h*eXec6&+SdtcxlW6xA~TgMoqE(@6$>A^<4K z0^d%b?lx7`mC6xa-J!u4*aFP$fwQzte=8E7tGaO~+eT5gWPx8?RK zIL>Acgq&|$!IF$2Nr0SDtO)Mu z%LI{883&CBHz8L!DJ6t{rui*d%GJXr-@dz1kU!jnlQ(WH_Q(PPh!V^V(0>9fGbm!cf zyU&hN0eymsdGaDaYk}NSjBKqcB~snOuOryb4P1>(2)aU+AA!cKxlAX~xB z)HT%DA*+Le2>yH^_Bg%h0BEptu*m|N7?Ra?Xlg)PMh`2sHQMjBcFoX6l|;_4Z7YL) zx6cVun9wbMC5xzhEI9OnAgmIy-60q+IHma%$)w#dS!6uCc#S3#Lx&EnmoY80=YVb^ zU?Ox>IFv7k0q-hD$=qdEtv=YW`hv&Q%>{Av4E0_*Lv3whLg8Vc8*Hsdw^2{DUGf*~ zgu@WJkku~O5>t#Plwsn2=f3L`SCw8{eMPNa-zWl&^^H#BCDE3~#nAg=i|Jv^x7Nsp|&IDT=rIX%pp@#d858N+g33Yq2Po?$}n5!@kf z4XywcsQGBo_vA!NZf8!-LD=#7Q1}tO1b5Ark4ocSfcRmCuvZ2J{YejYdc7E8y)_ zixTIg(aC2u)yxj|56_%Yeo^MWtm#UQ%AB0}nWk?MPnWzDe<7jQT3Or4Hf5)0Te1tX zMz+iw|FAJJCNV8BKcSql~t*9D2&Fhso+4MS6l-{C=D@hR_X(h z+k$bk5MP9^MJ}bG7&ihGYJhYYkn}QRHDL&U>UV($y)rj?Q*6Vnw?F>mJyxa+x2Xv4EA*D<08hp zC|;>K31@XFquYx@+r=hwUUVaM#ndUTYg`6>tjE2f{^+02l~;5Ki!oY3Vpvq(y;k!+ zv-aTE&|e2G(U$_Czv#fFMQhW@u@!k#(TbeYVMPL0Nmk^cZd}x-nXOaE;d0@2j=nZ| zRZ8`^%3M8M^_3SVmb$LbxQ0ZA#0HgVCc1COBIpeg!Kf|E#*!camBcu%WHOyiQ48=$ zEEtcIHd~j?mIvu5l)LAlYgQ^%Zl%&mt<==xv51yqsaV>xQsi>T9e>987!Z=nAS9PT zNNEV-J69i5S>@FW%(aCPI`}ggd4Oxe}6Y5C?Y1p`zd^T$J!}3pN93(vL zFnLFOrbE&1f01=}Z@v1waS&&dT1-z-oE?AWaW`BedVTfH8B5N?qO@Ip*0YCX*5*^o zYIcy!x^G?^HQ80dkV`9Z8p6t#k0&i3VjCO0Gdu>_lf*b5`ZZXnX+-l>J|h?%L6!l6 zMPx5aKxG$0;xi}7JKrLkP~}amHZMSy+{^)vzKb~w0!S+QD`51pX_g;{x_ zpmB)f_90kF#|3F0M);`|e; zeqdp=Zv*`*cNB(|AI59Dno;C)s1$@JpcEqtom}Mb5P2zem{!Kt)+&ABGi^FHlq>`x zP8?PVf@_|=#j!aAX>fg59R&6o`<38CP}$(b&s4=7syJH}zY;fTsv1;95YiGK7Fkx_ zJ(-{q4XRpD!LxLiV`gf`(9zrl*cLTtpoqq9_8f0fK2TASav9+SEjRGL2FgXK4a-gF zx-6z*n@>gm>ToCt-Bb@?3*e&!Ddl3Y1a=CKN09xS7~w*_azLQ3gQU0?j7pP=pi$m2 z11RCq;CU8^uzQ|vd;6@b=8gL4=!wUjb)>QR;N{vC2d;bLs>=I&PPqsA83)bSYHY)l z&IICBE@xz}Tm;L`FW*^iUYQ56?@wy^(p@OmDB4<(-eFYd6`+jMAuy z7BmpKNuc>ax;hXhu^xyLj}Ri-=fp^32Lg>~d=ijNj=l^SfsNvsb)FK6B})GU#6BlQ zzhtsKkBSph4Vu##gtgN&&|~@;RC7fw0-%MWb(6)~LdTbc7*GuOTXAx0j*o1gQ2pJ8Ni?U6i?Iqz%6$6u#s;Enxfm#pv zc6n%hfC1FC>qSBwQ`lB`e|_O#;eO=$pLp`k*9zDCcISH=4bPKL1`03l+EI8R_|#J# z(QWTHqWX?D#r?vXM_=?<+a6o<0&+$_sv91V!cPTmR43bmjW%Bm0wf^lkn zCMJvpEN^DHf0chN=H~eS&-wEOA8YXE)ec7ObJD~p4{J}w(}d9jfQvvP(%?JEvi|t& z0baxaFJgcfF~CYYz>63_#XXh}NDMqOlAi^2fKF>5AjWVfIt?QF-|?Rp68!!rzdsP4 zI2rn5nn^(vM-yK{;b}Q-7O%mVnyDQMJ+>XWSd6Pz z?~is_4k;KYIwdP^(NCj9dCAFCpm?^V#N&l66mM4a`6e0QVRm|=yq9@48Sh`7`Qh>K;?RC}lP~7kt)R3J@F$XS^aYE% z6S3Ffp2}cjLXSqO0~TWHQ5_FKI_+U2){z5Q2$@)(3!~nl90X;oWROu^fO)}_|N4F5 z^|n_FN8#$U4fme9YBL2H+in1!b>kkxci@-v7ESqiCGa20gW%3g>{yQyRT84V6DIy3 z2Mf%Xok;)=LJC>-Q~>cVdvPHC)S+iSaB5gZYqZ);rl6eP7IV7^1?@mrFF@N?9hj#? z4yBjxvLpcUM`=x$a7UmL&RF5@r|hbLfU!-|vV?8&5?19Ul)@~@p)sLT+Elur)F>5p z&cik(m@Rb@6Ql=0$Xpc&X@nEO!CudyU@voCE&`ST(SeSbHywMKm6A!ugdPr6`>X(h zy*eKJF7H4kXdoyc^N9;dGUTWgA%?hjE(7_R4{in6VbWWl6rO8)Wh>U`*s1qHhwUSIti+V(oRU0NA{MhzrvXtMtaf3-H>+zY zHKDG*<~lMETbxSTsxE{Ei{Mfxz97Clz9z26g*Rt2pP+?1b+?>7NP3yqk)NWC3gVy4 zC%d_%!z=vZ4uwT3H)yFIG4kPRzZ;Q~h>nMVLdlh_n^U7&=JtecK7d(6R!|lp_x1Bd>UKQEn#{+RN)p!*h>+6jzin0aaBj8`$ ziqBU=%s~GCz4f%>zNu+$;1dE)0lC)pk6o(~xeBAE=}Bjx8FR{FC(Gr!L5e9E8O@2;Mhjo?T<}1lO>Li9;G=HCZroj~0!6 zR*hvn?tbT#(J|Iondh|m2#jmm+XD0Gc<;d1m3xN?`gO5SVN3lz=#HDBwpm7d93hM;tnNDy66oE9E%_6QJ;@!LbuTv}TqtE%n~5 zqBJI2L{MbK+`^K=JB59PJF^AYIxB^;{q@5B*WWsTlXkusgevRv3ilU&i7{c*#K5+z z)He#B6KNlaC5_sHh;!^<&w%{knvtI2`4Kgf{gXrEV^gv}$xp5E z4oe7kuG(E0SNe%%M!HnVVd`deI$|p~irdSox^qQTciyQ``o&U6nxTp8KZ7;c6kz)* zfOIiq0%Qd%p6E>cqdO3Zpn#y(eYt=Z=+m9#($SQo>n^%4=q@U&;#?0E=X$6(qdenW z4;AO$K5;ZpGsnl-5{Wb5FWwke<9%cig5(Bz@K93vke!U+F7F=%Pxf*om!?(0U853& zxF0|%#M!Bw6Tt^nRw8~9tgEaHBPS(Gw|A=1rxPtfwM{(yHK4EbLGQ4bTcN#F;N>0urTzI@hth{Z-%*Mu1r+J=zqEOzt<-!TaT(W%I?%OWVjym_ExAp3N zOQxMLyE?h_lv{69&q|E!H}0r5?YN2kCIbCRE2RDdD`Y6AJGO?k0QAzOQ}M;VRz_Qs zw_5CNL?)fWEW^`#*|w#V>%i;78O9dIV<&{-ShI^ui?&b{)9Xl>E>TY_`~($nD-O=0 zv#S(d)z8Cw@G2p3gcI=5yFgmfQ->1d8}SN=tFeG#(+JlR)d)g{b3q_(Nw2;PAIJ&3 z*s<_7f=PLfJ>h&I{Kmj4z(oVShKafBbjbjIJLZGK`7dS6g6C5DrYpEu< zB1q%@CAdpa6LzqqpN2c%I0y`&UO;OsrcrmmziQX4F_c=}fgsT6h*c+{@wC^WwDwA+ zwZkm}Zb5m~aBwJ_UIdmr)K-+X14RRnvyx%Y6z+0|llwQFiMg0yN##ME6E-hA-M zo2UKmhUj(b5vY(pztAXp7G4!kqcHhE+kx-YHb_&R0MF8N1f;2GKLF`J9V;?OY;*?K z7y=(T9|@=PL2mIreMrlYHA6hgknE7&L&gl5KV-p>9YekxV)ZXMqWr3oYs+sgxue`1 z(61jY5G@>te>%rgDSE%UZZ*+v-D=R~$WPZsoj-`F#zCa^^06p#0?}M~dA_1DT2WD{ z83X$1mI(T5y6JW}9~PClcvLT|Xb>Aw#nf023F~u6`l48{=Bb^!63fF*Qh7~==+!KZ$-PpI!%%l2@h{oz_j~Q{% ztZmz#K4Q|ajYB6L@$|OmS}tmGoRVZ|KVNO~?D0nrJnGnqz<>`pYUQonyR8thlAoU4 zRG!^b*dRupeqB+Gsz&FW=GWXJ zSUbLKf%_`&6=jB%6h~NLMU*a6QcbDpsTPc;Hn!8ml8j<63wY*pM^{G(F=Dy0ilj)w z8sT$gMkMTTuv`ek^P;^h^=JW zTyVij$DexQFNZzSB>F!5^yN)W+n*?`81hj3`YBW9o-kpyTkO1E1e=DAoVYG6>NYRD z;>5bEr!0G199?y0%UMlFPK^`)7Z>%jTa0x=NiAxr6V$WRd6-XiJ?9P)8|C7j5_*Ir z{mdEc#<6wb8iEhm)4F2zlv1Upg(~5^?GPJnwxEFV!td!}I#}=uc9U5RilwT~u>qa+ zyl#>P$4~6#8VV2xB@R$$9H1`Rf&3cHx}ArW14yQ}*b4wHqpB>!R`Zaga(EySvL4IL zRoe2J{Q_1^xGvUX5r!(~-tOLsp6{cPWbHViu*MIE`eAK$%hc*R^nF&b{DV`VOr|E| z?8@3&nS(`Iysl10$l(bWbF7P7#n)R~3%;$8zi(*W54^4A557Yl9rK^2bE`A394_T8 zWgp}(BlQmDSc}7pD95@8>$MzmxlA1Cj5^Y2G#g#V7{|nKj+;KSUhjcnll9pX%u~!u zUDvv9F+HR7QRW@`9p)qYBjywO6Xr|$OQt8AZOqQo=b6j&Wf-^|G6N{6B}}m3QK@ipzvgt#r0v$aEGX5u3>u|E77D6s0UfNq&;>+)cS5 zMyH_YnHqgla#m2(ym>Z7%?>4I|CMxH)H>nVqX!%{VOmw+;~)XM9dq2zTAtgs1riW8 z3kkZ*o6?61y3-m9F*;9)_V4vdtWQ`BcS_Qh0ZT^f=k=#i^p=nEk-#DPqcmq!#25Kc z75A%(ln`ITc_K?oWlIY`|9LCfrywLM5JWK(r0TS;@jVdqY&Dfb+8j(dswW^sphvvr62Uh#<5DxT2RThEG@v~5-x zEp^;c;4e$8lzWA^O}$-PVcq4n1ua($-5lMv2YcR)u2R%rn1m;>nC^l2Mg|T$$2r54^5)q{yJBuCG%_WkQDGUXybgimxELt3*21>C3x8b;srVahES7QN!H2X3 z2N%#uBG2(dtf7sm-^uNi=~H1iV@|ur<lhH2A<6q8&cwXs)C#A&9wek56qu?>yO-8GS8SBz1T~Y(g;W;`Dk7 zhmnddkw(5F|1_OS5a?$`RhIZLMFF-4Ue*uWTKq`aa2Wt+xVnV*IfK6hTBH?PgoMy= zvH8H;;;)5nq(u&|_m{l;6L{ysG=-oJ8DwgZKW=6jw&MYL>;;3T1v3tJ5oRX&gSPiL zC8C-bM|XKofY>kd_h|Ww4<``w$0Ku4h#jIGzQkzOtgN2hd)#W)-O+}}aGU>*iT}#4 z?A(Pim;yd_#*F@zMz9VkZjvfLVkfpLX=rvmB@kkXHoUb^0Va~%I5>;6FlwdC+50(( zaSu(fN_X=$0?}B$YV5_UiJ!{t7)XSk_l|oSdJLgaEBni?C&Waw-cZHF$MrmKHa?%U z*?992#7OQ!7O41%FF1AyLb4ac0jHWytieGH1$|tajJ3uVAeli-H&)>SW}Nwqeu@bJ3A!|Yvazo7lWa}v2r2e1@~%8V+UV;+yldKtRg4nY0Q zj7ebuRgaQz!1o)n4O6tKzVYFc(vx$OD<)Tu?=hj*`2Oc==laeFpPoK9cYekB)o0h9 z+2f2}XZD|~U2M+vT^znReWkh7cXhZj(_1Jt{raViQdfDuo@qO32mN3n1fxGBCMf7yV;wY@gobZBd^~gkrfIvAPBeK>;=u{jK3w#Uor@%Qiha z?hx=q(&|^OgBG3m)O%k%He}AY)`3@^@WB2Le&2LOzjargcK#j9TIS4cJLT4vi+*yM?u zHG(f#5fC!y0pg1dBn?b=9da+y$s$6E6IU($8Zhtp9o$9O96#zJb27Nx6w{Fr+k(>m z(LS_PpqDC63g&hnvMm&M_rr5v@%n@KkM<$KC_3y6LQ!0BkdzgclD`p!)uYKHU1Te# zO|NMc|7`u)%?GzpghabhMoH-G9}6y`L6;IyUUtH1%M!l82mnWf>Gin1d1TUxMwBN< zr`^LLV%*)&JDCz~4x(1bbRq$PM@B+;&_aSfE>QZ!?BYBSHotK9pi{+hwi1E`DO}*D zBv_-QiOpGM43u&$^^fTMOr81DL*R%afETlT08g(D<&B_Prf6ZatkbaSM|M6#BWSZS zTH@H&?8TGMyr;GG{^fHw9i>;lc*R8%2a3Nz(LCCJ-s3aDjq4E?dXM+eWlo-IQ))+g`aS5%kw;MYRJqV0(Z;0L&V}W5Bc%jGT7VWSA5Orn?fSX%k*^tlRDH~FN zlQG3>MjJqm%RwJ+tf#>NW<`tvGx5K)20Dt4usyq^``a)nr?Vc3!+ae%|HIH1*SCt> zTg4sg_LCVki!_?{3+^m-ec@Ge9M&ozE^~TeEI|$f2&Myqu`0AB^koQbma$5}U?BAF z^ZV<(fbjsQ$=ehl%`d5wHLf}J?Dd9vhno0TVS4>nOS&7=H1PXwfK$-x=l}9DeuX1~ zKc4-+wrKp>v4~$6L)qM{KX7Q3f+SWtR_V|hbzPy|&8#3gBn(CJSjco;E0#1J>vhSB z{jkxbu;~;yIN9)B(8v<8@R)+F6A5A*j7Ww>QWvp0)PZ|pa`@^zo=_EwV6rSg$eMf* zGAjy#%Jo@He@-I~K*e{&1^oOiP6=tnH~=_#j5mS&@u2H7qXa0N&4euVhwwtK57HaN zmUYP!`qOvEWBd9qM?7slq3L-$3?A zr@(%j&nrKHWI92umV4BIM@(nr&=!x5QdW$5Kph_JVwUwVia(HP0^$Z+%W&twFFXPJ z1&jfK=0e07!JV}Q%Nj8{X#~iRLoS;B8pMltk=!pLpQiuxwI{4kt z!EOE0*4Bfe)?GWkdhxx&k*!ZXa^rcM!0rRcClyXz{mZMLx_R8>W6y&wx(XWdbMV`P zo}jQSvX)vGiJ`WwCcxST6#1mVb2D0qBlwfBu7n1d{>?2C)mtQ$+rL#LugK#LBL0guPbR z{*Lws{YaoYey$^!v_)|gW$-TY-0CZjVLgvLXoO4|J-NI>kCLLkniOSt~lVc=))czax38Q&h?8Q%j;PFyLY6G?6!3mb|4 zz#X|{ASA>C1WX11=kUHUHJ_pjNyc z<|Wun2e2di&fOX0b7X~eVmKhtWVo>(`3H!sQcE4R24!x7S^^e*fu*f)Cw4z|_vX3# z-*|pc;O$oJi;L!daZX zmvHvNnC6~ysxjHf>hC?qJH;C3ea-8dYl|w&t9mewg(Z}nszQF21NL|JCsJKB?5z}2L`GqeT z&?PfBfdFE{mrVN56DJmmr_iahG^O~wCBZ0$pw}V6!eWl<4#D*b)E3Ib7d2co%H<;T z(_UJ4_O#~7ckb9adD87Gp4lV@qujoE>2IDVi6`#rbM+@8b7d&jdeJqHt~mYZX_IkY zIcG}!j1=Tdsh5wk1AbPegHAjZ9BNsEDm+gU+Q@6_p|0@F)PJ6gKXePkoEarA2BFIX zx_ag90rqg)7#Kb_a%uM3ERID%L~RdR`k!+H_o1Y+HcqCPhWDy6_*q~JAUNG zzqjSTSRA>{-}o!_uL~Dm^IF>zzjW7#9N(3*8Fk z>gR5begy8I3Sgh{tgwR)JB`S#V`=>iAVTC<_4i5jmoa*bt?sbJFy*f}q?4zhcc~1m zqey;7X((}>S_465MdAo=m}&#T&r0Ghq$A<*Ei5bz{bJ#+Zfn#3_}vHJnL^$1_`8WU zJ^nK1wvc-6&8t@nE57CpA5NCgMD0^6(r-O>1M#>K(YD7p+BSisZ{WEY%Kdvz;A=P5 zUorcf_1F|yGzTf-~ zvNEYuKvrgBddv(~X`-&8!fn?jfkARd>cU}ExO-5K3nvF29_?{Ahe_$0wHgS@i?F-; z78@D3vjb2Hlai5By9l53Y-#B?GljWF4ZfNxRS%BTS~gzK=uvCf?aOlOH57fcO6N>fI!D)nRj{_fY$eo#2F;H#N+cG;}s zY8z{{DNj9m_d^j6Tx zBL|O~us~fYX0(R%V`!|&F+()g-0Q^1{E2Y)r9h-U zqDCU#coi&Y2@C=u8Q#^nMyCw2GNnzeqD?u5+!6n6a*IIwZ4_fuG@M@A%eJ|fgHX6j zD73@-{Y!HJPZdQRh9P@%-tFF<_?^+vYn|o-8Iy;)(bB1s-0#}<2Q;6t4%-o|myLYL zoaB&UrFQk--~Z|l?}F)Pwvyxj)avCkH@~i)cmFRIwo*C(j7MtV;8|nF9d!n28Q2G; zWl|#Jgf(x}o3{p7!!6^|@HJso=Z3p|p;=O|8KtGLr6OsME0FN$IlwG}`7%~2Wvo)Fp>2 z5{&&InMVEkD{H!_k5*P2i-a-gklvW4-Ypddvp z>PE`@qtT_z`&Xpx$o~j|j?-Q8{!0q4$ZQz${(g)sRsF6y_>CTgAZ&;=;(UOR7+Me# z8wp|$YBC^TrlHbgJ|N5(t5pp30!#6glyB6L6nG8#Sxx{UO9`oBa{>r=0eyn#0`U!t zE)d^2C=tUg4xrn-$~LdEE!t7aCUa@AALr6IcPVqvIFE9ziI8iJIpTO(S{v1=Q^jC&@(R8w3Lj-X>tPpf!Q#c0f32+Z?DPH9?fzaIe4+MNE!rrFU8;t z$uHcIC3PU$I1CP=odpUA2@y93Bb`;0%AE*sj#=*}n}^?bWk_vb-L?Tm6XKS(r%-RT z8SfZ6Q}Y^6;vL`WR3chXN1b(*eDN)_m4G%d^p>OimSxu^TvE)7O@ti4iS!Zjcr$X5 z=v~RR0SW}48Fi;v8%yK0#v`+Sf$P?9|o~d4>Uac;38G|t9(lj^A zEIfMYqi8wX9d+|(IQ~pR(-ewt{fZUP!Y7p6m)WlCDp8ySy}<&Wc2|B&%fnpmJVNsZcVj#AA3U z3uLpR+{OcAli&<-jU*x!R1S?jMJag!XGlieDykbgyi!O&nw7Zf8TI8&Tifc_>wkX! z-d{iS;(a%~zGmj=k+UxvKI*5xQXguYh|Uqq^%iuFn0a7@7JBTJH#cm0^O@HcExGdQ z>wbPk+vVu{+sX^Tj`->^dmaEj3tJVqhP+$JtFWU`NCI|&AOXe%HR@wR zhVJpyK?mjlj4f6&?rPe5?xRdNNuS_Q@tVVMqu=ht&miwWTb~AG;;}?J zcq2W+(h;ICRy@@HC&VJlls=nq=hY3Ce{8EfhRF{-gC-7L;t&{BCmu}_b@q8jX;I&S=syEOFnZj80 zy5hU(j_HQOm8p+s0vH(ms$=Kl#Wyynj^3H0^uc@UrM~+3fC1=E^XmV@-gkhvRi68w zrM>sEEXk5A*|II!l2>fU$8lmicJ?G8CJ;gh2_z&CD1=SJDA0r!D60uAv}IGAI137< zBV{zDEfhMSPztxK5K1AfAy)ps_dD_mNontGpZh%j=MpR(Nk>QLd*Ana_t+u56=;s& zVEg3cTWC}BLVtj6IDq@i4-5@h^VA87YsDdEBMjhapgMEZ{f=}2Q&z+J!mzc$6vs-* z-#hXNy&8VGURez-lQ+8KK4r-nUQ?FBVYE7v|9Pl36T?{*{3XiguDE|392^P1a*uF~(pMaA@iJT8k>GJ+jPg=2`Y?pMWips`YShA&T6;8z%8o+;2!fvgHh0ah*n z4OK823UKAzB;}W7owGnfMUUf`V?ah2J1dz)E4HKWh%9gHCnBCNyfw{ucpURi<lX zj&;-HI0bU(@;?!Zk5pnMmVQiOK*k#UE+gXjdj4zqpR8O7zJ5K{S$t#}G>=HXxLhr4 z1B8FPOQlk8fK5){v0?>W>!AU1gcj(8FWSO??W_4Y_pV%dFJuGHOI!K-R2{%}m~qG* zRyaG*tKfxQAxukt#3&lm>wqCP*J=Dp`T5Fr$BxdZIskoTk3Xoxc$g};}Bsa0gOaJ8mR}IkKttzXT%HXfui&wRAL`0 zpaTje;pTJfjd<8tvOMbL@{wD0mhy&CZ166HGZATJNB9&@K68YWW0{p>jtOG?2mF1) zEud=u(lo*UNlHs#qFw2KmZ&DfN?-`=8Y19FMRRnCdy^HsJMP6cr%Nyaf=j@Y z0if|$L9f9i8_q8qxn^F~EQuOU(=4UgERXa7MTgD0MA(>n_V3>>F518U@b}=q=eaYW z&~^ioF76%qLZ7zO*uYN^nzT*2Mq`t!i=Qq`)lSzOj7*7{3)t=+LUU!A_ zGS~Nvzu{hX`L#lsBk5`pT3wgxHoLxS{GCfjU6MILrw1r8@IcRF8$k-9IqId zi9}CwM$phf^mL@ZLh2_HJ~ig%W*WTST$oWRc+q$au93Hu24ty4N?Lp*itG>+pV;d$ zYpSlUzCH_mTqAYApI?2FEwwLI-1oQl_<0kn&AxqJ>(UKEOZJZZjhLgzE#{Zx<7KCx z_v_!^(BDaPgZbQ2nN$rg(s^=)%Idbxvz}^w!>Zz>L6q_in()6#KWNdY!Z_PW+8^&H z-4SuwLis6=K|AzX_}LD8ZX!QUzX>;OlJ*GCap+J5?u*Gmii!>q4t|^^gcfq{;_yD# zM&K(brDBb`Y*=!Mm)&<*Cv2Yd(5|*?tXJR47xVmGciqLWy6NT<%v;@mKTP-S1L3@l z`}T3q$O}ZT-5d3$0}c9|w@1H7ze>MRze&ACb)Uh6x!8Mo0h8VZ6@nI8Jw|EkRgzxI z8{fvpz|3sPjd}zGv67tPHG}K~G3@KqmVdIl|DkKX_t=w?J#;8P^dmvP?dIu4`9BZcFDw8I?*O5l z#CUZ54nZ#>g$YcRqiOX@iU=K$okT7H+5=*N+d}Ib!dwPsvBRu6=|@uhv)|)7Jhv27 z`v#62+$?l6afMxAG2Gj>K|7+)oQE&5Ee;;m0cspvcIImc+j*?>C+G#H4C_I? z6j=(S-hjH8YoM2fLOpI58cF36V7K)^knqNB59#~^PR-T%kA*A6t&e;?IPaqsUw?Sj zE8W%KS;yoH)+jXsV>a#_*?Fqv9IMc7nTz^PyI4B^*@;@u*^adOHk$xD!UwA`cEH zo++IT@sWaXCQb|UI9P)z<{rzYJq?r+iIH}#2YP#HCsW1}^8nP<*5(wx20=KY319!@ zL#x+sN?yHmX7icfyMD{e*B-h3Pm87a&~M+nW!3##u6}3Lvc6Ydoc8m#zkBQ3zaTmk zhUu_j2ik1@BRXVtECo6wSVQo)vREJ4*F=azzehM4*G%SDidV3mdQyK%-=r7By+=Oe zB*4j`F=L~uIpd&!BWyvoQ$LbD6z?bR4Ibgf!(*6;UPasw$zAv{l+{vXvB2=EGYu$S zV0%xp;pY`ZCvU%uFX!D)F4}$JnKwxR_n-0y52wU$KlHUpPTbY3BOiiQ)N>wgom|_k z>eek$EzvEqEpn>MRTa7>RTHWgwt=&4LuThT2&Qco4UcdEXKbaZ*wZUD+r=Oh5s!7NvE#6eQy7K%X|GB zmhgH$b@`zudd&|O_ujwud%r4vusHwh!8<>^1$W|!smhKH(gc`Q9gV$xoc?|}qBh2_Rxmj?4d`_H+1I2%f17&zL{|VWFAs6n-Oc4dsBjobVRo8p1fPLBz$l z2E!D(6Dhnx9A+L;SUMLGOO*gM;c9t=3g0)wvc+ zi&bZ+R@rr&mAU$Rj7EzGVm^#vNYMRU9(0lb9z0<$=k$7kUzh0R9fOF}qJRD%S_^yi zuo^rrRQ&VaVp>uwB8P(4YoSJE1sG6vAj`N>I43OTr{UCOi-JO!@@3OrXn>>*Qpy?i zEh&@&jVK5#Q^U*nJvJ4Qt3%9s3fV9uiWNwxMJh=C_@2jRq@ON2;wng zW!jQy19V!*7Xz{}tq6D+BoZ_SDPX9ckN%_p zmyHcGX794D2x;4sw&!i4jerMv&s^iAPeaWb*~$c%$Otq@n;;Kjws~Ng0w~nv3x*vx z)=j;bxBc;|-`sTe8+ZLNfAE*LUVGE#+poQGi(t<4bsI2a=$n7Pm9IYh_%GjhXyBzk z(~j~T*(&x!m$7j-%Au=myq2pqUBF!+ZZK{zUCU{ZLnJmyXGjwE2RV$eidQO7s$e&(C^FVH`w*E;6klmAivcY*Dfi}xJ< zM*C+^@Mq=!{M@I2;_NI3SLkjFO{_s)_Tt16KclR6M0ZFtnOs;l=~7rHM_qP?^O9IyziSi_ z7e4fZcld_m#%t*cu0jR*er!*9=<186uWOuyo5l2Duf0KHR>sNXxPMkSD91YMntL;`GwL-VTHIt`jT*-^o}?vqLYFX@!Yhf&d?=v zN+%!?V&$bXIinRFYK;PC)@jkro=im|bw90>kI}U@BMi-_VR~PRVj*6Ko$w*-v9LvG z6_yH@3X%Y=K(_}FvlQF|4P+!D3Gx6F2+fqV)q5bzcs}0dX$UtAeo(fcvhj=Z1JCi? zOj#fNX(X8c2&*X*ZW=n6KIatPoZp}S=#0Y$uu47T)(W;$@7O~Ph~*+8Q-jll`_q`x zjtQy>`Y!!>(w8L+*H)1pXu@39mh+*;FWMFkgxPLqA?#=X(Pnc!~Jbki@ zpoE^x!ehd-&>K9$pZeTxu-kW-#)5;tG9wxXN?e~=2g>9ZxH%LNRnWW??WL6h(8t!j z9Dvg;;Z+Br`qCN`x4Lrbi?Nc~!OZCBTtjrVUp>*^WP>K9Gj{OO;>4-VUD2Pc75 zMT1|ti!}JDdT~UDcWI!Ajp*=coXr)qc$CFMXJ@r!*tANYUL4RUm7{cdlC8(k<;U33 z$=fgICk;I@@%vj>-waiL@H4WYZ@g&~j6@(EIy4ro!)+;Y`249*I$CY1 zwYE4~{ME%>&Mw~~%pYAGS_vI&RcM1@z42V@dHxGR*Q>5AzBW{37SW+?u*l%nMAXnJ z|1PtlSvO-o5%#DJYcvse7^CO*^+(Mj7mkn^EU|t(R8xZ;h23)i0+7)jy~q*@%La>ze;ddf4C?KAjd#$f(d#*H82lBgzXro<>5+(3!&WG3c#Xyij8px4 z8f7DTM;O_s3eDj_!66P599l_1Qii1!WG2~USUO9rCK$krQ-g$ptPg#_2^@;yQ)^@H zw;E{#!5XD6d@_=2nUY&@vF*+GK0vpVC(~PZo*dtB?n%DQ_Lf<~a{IR6tY1G*n7?Do zVqxgw<*O#sj)a9EE(HF`r#o|}fbql{)S5vA`rtreQ&dExOT%Y!lN8o4?+H|(A-18| z0fPk@0ZK~55R@6xGnKMKSd)~5A};(<{@H?ag*jM0|GRqizv*|=1r7J;-&O2stXCLa z?~H!o-}bY_GLBj<{UrNYxO0Vj_-h%IeX>ymji`lYe!2J{eDC1=u>6s(;{a(dUbcTH zPQ5&TDbsg_dxXOU++<`wC!v+Rq$+%MDKQImvue5KL3rN}lUJi~Eo!cWyTRqqLQUlN zSAM9{2Rm8)klkV-9k&oOf+SqMI!uI4ZQ5sQqJy7`(&Jd^(e z5j8U13cea-P~VTc(g-(jTKIckU_~8N*qwphy&)K;W9jqk-cj)=eSIn6RCS# zAdt11n18gcmB&9rp8%yf)0C@V!C|58wN?^1a`5a7i?e zlVg{~gm7$DY)kC>v4I#y5e98UMd&B@dg1GAFBD>2`2O9>_h)d*@1kTsZ2!Jp;_L<$ z4OxN{;gvDJTZmHOd-pJUy_Gi}d4elOJ%k)Q8~M~C-LDp8j{E)N@b^H6_>ccSlbd#K z;U3Cs*dP~yUJr9blU_q!D+N`QjH3SPI=eAoGYd9xF11 zyo%u^vh0GUv4N@~-$z9~Y|Jfl-)HEXjq0 zJo1ZxQy3V-D5YdH1)-$O9in`qiX`^l=Os6Glzq1%aea2P7Au0NFAyg2-$K*`5O_e@ z2cP_mOFqh%P*NuBcHDi*$t7o(h+Ij)q`|j=x#4Y?qVEsKEffilUkf#I^^fuqlGJ2} z(7`Se*<6I)guXzMI^riuO~Svhw-mWd_oMjQaX$|iFw%PDapnHw#V#|x6d1XK!tax( z80W*7ha9~1$TDPoRX@t3Tj(3ZZ9@lk;YY1STZ&+szq_l*C5X5Vl$DW{kWL_u^W`Ra zpBzb-kN4kd$2)g5jOF_-^>6bFVgGA>Ax+HRGwkGL{M{ZZomna@E!|wYtyC;6HUB3) zzvcg3&o7!<7yP~BJ-_fI_9F8O{@=nx0=6f6kM9RQD&^|fZecz;x6;h0V6yR9BDtMAvoh-4@KEE^{@wTHI2>-D-9{249rG`LM|xkqCKR zO=WiUwDBNxp!x~&<_G$H$sFc7g30ZSGiPfY)PWg>;AU|-TAGW?zM@r(QuT$D^6*S|~kO#QxSE-*1p z8M-NS$_o=TQ_L5Uk|WVvieQ>b{S#i`^cQ%6tCS$vs27;UDn6iep<(Yg0LuglJu^M~ z3%$Vw`c*jXv0cMRz5YEJ+)tO^DiG`~jS6)385RPT&B;v~jPbxUo&H|@8 z?Z^#WY8PK*Cn*7b^?}R^^|_)Vovy7D#izuh6kbgZ7-p9hyp^~LDwc@faZf{HO^}O( zD1&lTp4gs?%Gr861VgzaQU2^G{K|LliWYesP)nd4zcH)_5yXgx7QBJD=5Ab5kr?4e zdCa^00PXmJK<;y*12-d#@zYgtzmXTGGy5ISIiK_W&iOl^`X0kQ#`~T3`yO*X=2H** zi1JIHfv2LZDU<}aoV?QEBJ~EH}mcVNP`;h-NOiy zQ3qdU#KDI&pAiRN?+{=>Y>sKmto{-yRt0h)rTB{-e#5evg!31B|3oWDCPwM;|CApv zFH}dP)yPU!XsF;51g7>X*ypc0ayM5bTll-mzF#JAWhGuaL>r3N#_FDMO28k{0SRa4 zW;{l^C$hO;Wob!>slTutldYZPkNBeWB!toct)c&dc|i^d78Hbb;ux=wAywq$Q3kK5 zoP1;qM+e0*tzXrHb&%Gt5$>R>JuW7@d8cf5<&do8eBFt1B$vT}w$5Pr>JBItpmKVD{44jIXh?cNBi>ar{bUEKJHg?^h{x$_8gt4viP+LZ%*vtdiaIDwc4*}ukh*>YY+nBZMlirg+2r# zl{8Ro%A1RIsdR&Hs*C8nIL`aMY7=MXdD-q&c?`mIVY*r1jc=Ju(p$)<7}%~e z=a2~f8`-4Nzok>ZrPIiG2QI+h>{Myx*47-hJ$ekfsg_4&P?-h!hOg!X`NSo7C@sSS zj1CMLDA74{DqI!UFv+RP90!GaxA2mz)3H~m7}+bl#2JqKLAIo_IfKFcfPmjuzonsj z*oiM-KD$V#XbLaERPg;>suG;8QVEbYsW&mdyEkQhAOEOuX!IqQMjVUSED*xdYOLs? zz)nlO-)wy!a6#+B^$uwGiTXsnr{1ISXcDomtEwM(p!)v%>G7)k0o7U8RNr?my}0+j z>T47j^A7`ddTuG^31MODwNPKR{9D3$l$buC)o|;zss|8O!$){i(7mnIiY3XioG63T z#qUTDXwu{qr?NJ7(;ya9R#D4)>&I^@Q$BG(?ql2+^NS|x`G1;%JZ??3^@{43Uar1^cJl*>tsD@qN8UmEqXueYv)y82eYN_LDvc)5yM_06AyN&0 zrW$7XKtBvKIJ9^3MVkoC;CuKVsn>*4iUt*IGPL>kpus=7$?ykewN77gLTW*zDOCSk z{#&*4wyeJS?E04ax@2cvT?R7qF5b<*A-#?}2y(sS?*VP6=_ZKY#K7ai2b@cIpR)^S z;^Rg2^%vb0$O}xFT<*ucJ8{^CL>34C#@IUzv}ZD%9o5y7ginsT<$Otc%9M0w@+91Q zJMR_lR6WWixGZ<&9?p5>XWOBKBbyAJ6!pfOB)j~0(Ajd5yk9PTp=6t?t zT2KlL@(O?1>GLJ4u%6vmn?-~9lR1s%GD_JfDM{`X4sca`Y*QLsjYSa=%x0+@%HmSU za3b9qz=wwH)D(2V{A)u~D3>g$onN~x^myBfQ0;m%l@Tr+8noNJp~E}P5s zExfAx5@XMfO<%fq=hR$v*VJ6LL)tSjT|22_@?>{O`PAC#Y3G)lap9ynyj`Dbm~^&z z(b}u~u04Eac4~J`ZfZBE>H_ZT!rNk&i*euR$8(0I3z$u4 zukcs!FE^kAAY>I?7x18eM3weN;y+C1Ra_}hZ4^k+01D(Zfl^t1FAlOb0G0+YqB?s5 zT%GWC=GJBFdP63+!*^~rnVC3ic2Bh-nTu;$5}B3F>7~~RzI#g3bqj4(iITvil4N+^ z^7aKOUDcI7q{)<&l?F@NvBJG*i+V4QG7irB1Jo^H(E?n$!iSHl__USG9o!KG>hI0l zQAHDnnJ;i1(#!mv>K4TNtlVUZn0(SF2X=rlwbsnTDvIG9k?1@iT%zZiFS%N2ZOI0d9E0v5+ z%y^vaVE8WHQZMGx+yw3+StmB?;#zIgR7pRX1vfBQa@lMn?qg>>j*Px2{9~W=Ii1nM zEy-rBx>1*j*Oo;?Xg>>tAL26j8W5Pt)b17z$;L9;9c5)9lh=zP#zR~P9LN*Mg@_ZG z?YR&r8whNqb&w!YNFUiONK>Mr7ld4JAYhz*N@*_i87)^$6N*6jSZ);9RpwV<+7uz0 zKA=OkA=n!lN`q0b&cEe$o9&tfRTDZFCMEQcciJ^hjlo$}QYvZ0DXliEKar{ply;)P z*{&)!sr~V`61~TiE^DtVj!n`9Q0wZ|M>|6GlgeGLpv9TC+JfP9I#)X1Q(9zqssj!N z+x#K^PVPit*uqWO183$ZeV9f`kTXNB>MS|4Spq{~c&B$I;cpDZ#$%wEz)+oukDz!M z!@0$TVfJ`px*|HeB3aUuu8ht}l}E8lJ5==zw~h*lsxu31

^0r7XT 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 =6j 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

okG(z1$EL-Iw)0HFW9 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

5T4(J7RUssJ3lH8XDc6u&1)6 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 literal 0 HcmV?d00001 From f53a493ac77a733b3c22cde395e9e78a908c4cf7 Mon Sep 17 00:00:00 2001 From: Dale Stammen Date: Mon, 12 Jan 2015 11:56:58 -0800 Subject: [PATCH 105/106] fixed automatic adding of resources --- .../proj.wp8-xaml/App/HelloCpp.csproj | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/templates/cpp-template-default/proj.wp8-xaml/App/HelloCpp.csproj b/templates/cpp-template-default/proj.wp8-xaml/App/HelloCpp.csproj index 15b9a6324b..12c8bb2361 100644 --- a/templates/cpp-template-default/proj.wp8-xaml/App/HelloCpp.csproj +++ b/templates/cpp-template-default/proj.wp8-xaml/App/HelloCpp.csproj @@ -112,15 +112,6 @@ - - Assets\Resources\CloseNormal.png - - - Assets\Resources\CloseSelected.png - - - Assets\Resources\HelloWorld.png - PreserveNewest @@ -142,6 +133,12 @@ + + + Assets\Resources\%(RecursiveDir)%(FileName)%(Extension) + PreserveNewest + + HelloCppComponent From 9766e9f748d5b88f442bdf3f61b4b48ff29abfd5 Mon Sep 17 00:00:00 2001 From: zhangbin Date: Tue, 13 Jan 2015 11:16:54 +0800 Subject: [PATCH 106/106] 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 8abc84bb53..53130d3397 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 8abc84bb53caa4bcb96ee227db34507e1e344e9f +Subproject commit 53130d33970b5d9b15a8f0e4c2632e352a6ade9f