diff --git a/CHANGELOG b/CHANGELOG index 7430fca79a..546f4d6574 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +cocos2d-x-3.3 Dec.12 + [FIX] Billboard: allow billboard rotate along z axis + [FIX] Bundle3D: create aabb for mesh whose aabb does not exist (user custom mesh) + [FIX] FileUtils: createDirectory(): doesn't invoke closedir() after opendir on platforms other than WP8/WinRT/Windows + cocos2d-x-3.3-rc2 Dec.5 [FIX] C++: use 100% of one core on Windows [FIX] Label: when a label is added to a invisible parent node, app will crash if switching from background diff --git a/cocos/3d/CCBillBoard.cpp b/cocos/3d/CCBillBoard.cpp index 62ad110ad2..4d614f2889 100644 --- a/cocos/3d/CCBillBoard.cpp +++ b/cocos/3d/CCBillBoard.cpp @@ -99,14 +99,12 @@ BillBoard* BillBoard::create(Mode mode) void BillBoard::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { auto camera = Camera::getVisitingCamera(); - const Mat4& camWorldMat = camera->getNodeToWorldTransform(); if (memcmp(_camWorldMat.m, camWorldMat.m, sizeof(float) * 16) != 0 || memcmp(_mvTransform.m, transform.m, sizeof(float) * 16) != 0 || _modeDirty) { Vec3 anchorPoint(_anchorPointInPoints.x , _anchorPointInPoints.y , 0.0f); Mat4 localToWorld = transform; localToWorld.translate(anchorPoint); - Vec3 camDir; switch (_mode) { @@ -121,14 +119,20 @@ void BillBoard::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) break; } _modeDirty = false; - if (camDir.length() < MATH_TOLERANCE) { camDir.set(camWorldMat.m[8], camWorldMat.m[9], camWorldMat.m[10]); } camDir.normalize(); - - static Vec3 upAxis(0.0f, 1.0f, 0.0f); + Quaternion rotationQuaternion; + this->getNodeToWorldTransform().getRotation(&rotationQuaternion); + // fetch the rotation angle of z + float rotationZ = atan2(2*(rotationQuaternion.w*rotationQuaternion.z + rotationQuaternion.x*rotationQuaternion.y), + (1 - 2* (rotationQuaternion.y*rotationQuaternion.y + rotationQuaternion.z *rotationQuaternion.z))); + Mat4 rotationMatrix; + rotationMatrix.setIdentity(); + rotationMatrix.rotateZ(rotationZ); + Vec3 upAxis = Vec3(rotationMatrix.m[4],rotationMatrix.m[5],rotationMatrix.m[6]); Vec3 x, y; camWorldMat.transformVector(upAxis, &y); Vec3::cross(camDir, y, &x); diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index 55d67940b8..8b0af28cd5 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -79,6 +79,9 @@ public: //load .obj file static bool loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeDatas& nodedatas, const std::string& fullPath, const char* mtl_basepath = nullptr); + + //calculate aabb + static AABB calculateAABB(const std::vector& vertex, int stride, const std::vector& index); protected: @@ -154,8 +157,6 @@ CC_CONSTRUCTOR_ACCESS: Bundle3D(); virtual ~Bundle3D(); - static AABB calculateAABB(const std::vector& vertex, int stride, const std::vector& index); - protected: static Bundle3D* _instance; std::string _modelPath; diff --git a/cocos/3d/CCMeshVertexIndexData.cpp b/cocos/3d/CCMeshVertexIndexData.cpp index c30032867c..6cd420b8d5 100644 --- a/cocos/3d/CCMeshVertexIndexData.cpp +++ b/cocos/3d/CCMeshVertexIndexData.cpp @@ -31,6 +31,7 @@ #include "3d/CCObjLoader.h" #include "3d/CCSprite3DMaterial.h" #include "3d/CCMesh.h" +#include "3d/CCBundle3D.h" #include "base/ccMacros.h" #include "base/CCEventCustom.h" @@ -102,14 +103,22 @@ MeshVertexData* MeshVertexData::create(const MeshData& meshdata) vertexdata->_vertexBuffer->updateVertices((void*)&meshdata.vertex[0], (int)meshdata.vertex.size() * 4 / vertexdata->_vertexBuffer->getSizePerVertex(), 0); } - + bool needCalcAABB = (meshdata.subMeshAABB.size() != meshdata.subMeshIndices.size()); for (size_t i = 0; i < meshdata.subMeshIndices.size(); i++) { auto& index = meshdata.subMeshIndices[i]; auto indexBuffer = IndexBuffer::create(IndexBuffer::IndexType::INDEX_TYPE_SHORT_16, (int)(index.size())); indexBuffer->updateIndices(&index[0], (int)index.size(), 0); std::string id = (i < meshdata.subMeshIds.size() ? meshdata.subMeshIds[i] : ""); - MeshIndexData* indexdata = MeshIndexData::create(id, vertexdata, indexBuffer, meshdata.subMeshAABB[i]); + MeshIndexData* indexdata = nullptr; + if (needCalcAABB) + { + auto aabb = Bundle3D::calculateAABB(meshdata.vertex, meshdata.getPerVertexSize(), index); + indexdata = MeshIndexData::create(id, vertexdata, indexBuffer, aabb); + } + else + indexdata = MeshIndexData::create(id, vertexdata, indexBuffer, meshdata.subMeshAABB[i]); + vertexdata->_indexs.pushBack(indexdata); } diff --git a/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp b/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp index c88b516fd1..66eed46a93 100644 --- a/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp +++ b/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp @@ -921,7 +921,13 @@ Offset FlatBuffersSerialize::createTimeLineTextureFrame(co if (attriname == "Path") { - path = value; + std::string inFullpath = FileUtils::getInstance()->fullPathForFilename(value).c_str(); + + // xml read + if (!FileUtils::getInstance()->isFileExist(inFullpath)) + path = ""; + else + path = value; } else if (attriname == "Type") { @@ -930,6 +936,17 @@ Offset FlatBuffersSerialize::createTimeLineTextureFrame(co else if (attriname == "Plist") { plistFile = value; + + std::string inFullpath = FileUtils::getInstance()->fullPathForFilename(value).c_str(); + + // xml read + if (!FileUtils::getInstance()->isFileExist(inFullpath)) + { + path = ""; + plistFile = ""; + } + else + plistFile = value; } attribute = attribute->Next(); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp index 841827b841..7bb18720b6 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.cpp @@ -609,9 +609,20 @@ namespace cocostudio button->setBright(displaystate); button->setEnabled(displaystate); - + Size contentSize; + if (!button->isScale9Enabled()) + { + button->setUnifySizeEnabled(true); + contentSize = button->getVirtualRendererSize(); + } + auto widgetReader = WidgetReader::getInstance(); widgetReader->setPropsWithFlatBuffers(node, (Table*)options->widgetOptions()); + + if (!button->isScale9Enabled()) + { + button->setContentSize(contentSize); + } } Node* ButtonReader::createNodeWithFlatBuffers(const flatbuffers::Table *buttonOptions) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index fbd2f8336f..8d56c85eed 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -41,7 +41,7 @@ THE SOFTWARE. #endif #include -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) #include #endif @@ -1102,17 +1102,28 @@ bool FileUtils::createDirectory(const std::string& path) // Create path recursively subpath = ""; - for (int i = 0; i < dirs.size(); ++i) { + for (int i = 0; i < dirs.size(); ++i) + { subpath += dirs[i]; dir = opendir(subpath.c_str()); + if (!dir) { + // directory doesn't exist, should create a new one + int ret = mkdir(subpath.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); if (ret != 0 && (errno != EEXIST)) { + // current directory can not be created, sub directories can not be created too + // should return return false; } } + else + { + // directory exists, should close opened dir + closedir(dir); + } } return true; #endif @@ -1122,8 +1133,9 @@ bool FileUtils::createDirectory(const std::string& path) static int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) { auto ret = remove(fpath); - if (ret) { - log("Fail to remove:%s ",fpath); + if (ret) + { + log("Fail to remove: %s ",fpath); } return ret; @@ -1242,33 +1254,44 @@ bool FileUtils::renameFile(const std::string &path, const std::string &oldname, CCASSERT(!path.empty(), "Invalid path"); std::string oldPath = path + oldname; std::string newPath = path + name; - + // Rename a file -#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) + std::regex pat("\\/"); + std::string _old = std::regex_replace(oldPath, pat, "\\"); + std::string _new = std::regex_replace(newPath, pat, "\\"); + if (MoveFileEx(std::wstring(_old.begin(), _old.end()).c_str(), + std::wstring(_new.begin(), _new.end()).c_str(), + MOVEFILE_REPLACE_EXISTING & MOVEFILE_WRITE_THROUGH)) + { + return true; + } + return false; +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + std::regex pat("\\/"); + std::string _old = std::regex_replace(oldPath, pat, "\\"); + std::string _new = std::regex_replace(newPath, pat, "\\"); + + if(FileUtils::getInstance()->isFileExist(_new)) + { + DeleteFileA(_new.c_str()); + } + + MoveFileA(_old.c_str(), _new.c_str()); + + if (0 == GetLastError()) + return true; + else + return false; +#else int errorCode = rename(oldPath.c_str(), newPath.c_str()); - + if (0 != errorCode) { CCLOGERROR("Fail to rename file %s to %s !Error code is %d", oldPath.c_str(), newPath.c_str(), errorCode); return false; } return true; -#else - std::regex pat("\\/"); - std::string _old = std::regex_replace(oldPath, pat, "\\"); - std::string _new = std::regex_replace(newPath, pat, "\\"); - - if(FileUtils::getInstance()->isFileExist(_new)) - { - DeleteFileA(_new.c_str()); - } - - MoveFileA(_old.c_str(), _new.c_str()); - - if(0 == GetLastError()) - return true; - else - return false; #endif } diff --git a/cocos/scripting/lua-bindings/auto/api/Widget.lua b/cocos/scripting/lua-bindings/auto/api/Widget.lua index d53254d5fc..28296c3d89 100644 --- a/cocos/scripting/lua-bindings/auto/api/Widget.lua +++ b/cocos/scripting/lua-bindings/auto/api/Widget.lua @@ -51,6 +51,12 @@ -- @param self -- @param #bool isPropagate +-------------------------------- +-- return true represent the widget use Unify Size, false represent the widget couldn't use Unify Size +-- @function [parent=#Widget] isUnifySizeEnabled +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- Returns size percent of widget
-- return size percent diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp index 33f6a10904..c91c046408 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp @@ -1204,6 +1204,53 @@ int lua_cocos2dx_ui_Widget_setPropagateTouchEvents(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_Widget_isUnifySizeEnabled(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::Widget* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.Widget",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::Widget*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Widget_isUnifySizeEnabled'", 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_ui_Widget_isUnifySizeEnabled'", nullptr); + return 0; + } + bool ret = cobj->isUnifySizeEnabled(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Widget:isUnifySizeEnabled",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Widget_isUnifySizeEnabled'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_Widget_getSizePercent(lua_State* tolua_S) { int argc = 0; @@ -3980,6 +4027,7 @@ int lua_register_cocos2dx_ui_Widget(lua_State* tolua_S) tolua_function(tolua_S,"setCallbackName",lua_cocos2dx_ui_Widget_setCallbackName); tolua_function(tolua_S,"getVirtualRenderer",lua_cocos2dx_ui_Widget_getVirtualRenderer); tolua_function(tolua_S,"setPropagateTouchEvents",lua_cocos2dx_ui_Widget_setPropagateTouchEvents); + tolua_function(tolua_S,"isUnifySizeEnabled",lua_cocos2dx_ui_Widget_isUnifySizeEnabled); tolua_function(tolua_S,"getSizePercent",lua_cocos2dx_ui_Widget_getSizePercent); tolua_function(tolua_S,"setPositionPercent",lua_cocos2dx_ui_Widget_setPositionPercent); tolua_function(tolua_S,"setSwallowTouches",lua_cocos2dx_ui_Widget_setSwallowTouches); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp index edf53b37a8..b3d1c1de3c 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp @@ -486,6 +486,7 @@ int register_all_cocos2dx_ui(lua_State* tolua_S); + #endif // __cocos2dx_ui_h__ diff --git a/cocos/ui/UIWidget.h b/cocos/ui/UIWidget.h index de63822ebf..3d4e11e60f 100644 --- a/cocos/ui/UIWidget.h +++ b/cocos/ui/UIWidget.h @@ -619,7 +619,10 @@ public: *@return void */ void setUnifySizeEnabled(bool enable); - + /** + *@return true represent the widget use Unify Size, false represent the widget couldn't use Unify Size + */ + bool isUnifySizeEnabled()const; /** * callbackName getter and setter. */ @@ -667,10 +670,6 @@ CC_CONSTRUCTOR_ACCESS: *@return void */ void dispatchFocusEvent(Widget* widgetLoseFocus, Widget* widgetGetFocus); - /** - *@return true represent the widget use Unify Size, false represent the widget couldn't use Unify Size - */ - bool isUnifySizeEnabled()const; protected: //call back function called when size changed. diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 6347c9199f..0fc72cf398 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -1,53 +1,54 @@ -# cocos2d-x v3.3rc1 Release Notes # +# cocos2d-x v3.3rc2 Release Notes # **Table of Contents** *generated with [DocToc](http://doctoc.herokuapp.com/)* -- [cocos2d-x v3.3rc1 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](#) -- [Notes of v3.3rc1](#) -- [Highlights of v3.3rc1](#) -- [Notes of v3.3rc0](#) -- [Highlights of v3.3rc0](#) -- [Features in detail](#) - - [Light](#) - - [Spine runtime](#) - - [AssetsManagerEx](#) - - [Application::openURL](#) - - [ClippingRectangleNode](#) - - [Facebook platform support](#) -- [Highlights of v3.3beta0](#) -- [Features in detail](#) - - [BillBoard](#) - - [Triangles command](#) - - [WebView](#) - - [New audio](#) -- [Highlights of v3.3alpha0](#) -- [Features in detail](#) - - [Camera](#) - - [Reskin](#) - - [Attachment](#) - - [Better support for FBX](#) - - [New fbx-conv](#) - - [AABB, OBB and Ray](#) - - [ui::Scale9Sprite](#) - - [c++11 random support](#) - - [RenderTexture save function](#) - - [Primitive](#) - - [Consistent way to set GL context attributes](#) - - [Only two libraries left](#) +- [cocos2d-x v3.3rc2 Release Notes](#cocos2d-x-v33rc2-release-notes) +- [Misc Information](#misc-information) +- [Requirements](#requirements) + - [Runtime Requirements](#runtime-requirements) + - [Compiler Requirements](#compiler-requirements) + - [How to run tests](#how-to-run-tests) + - [Mac OSX & iOS](#mac-osx-&-ios) + - [Android](#android) + - [Windows](#windows) + - [Linux](#linux) + - [How to start a new game](#how-to-start-a-new-game) +- [Highlights of v3.3rc2](#highlights-of-v33rc2) +- [Notes of v3.3rc1](#notes-of-v33rc1) +- [Highlights of v3.3rc1](#highlights-of-v33rc1) +- [Notes of v3.3rc0](#notes-of-v33rc0) +- [Highlights of v3.3rc0](#highlights-of-v33rc0) +- [Features in detail](#features-in-detail) + - [Light](#light) + - [Spine runtime](#spine-runtime) + - [AssetsManagerEx](#assetsmanagerex) + - [Application::openURL](#applicationopenurl) + - [ClippingRectangleNode](#clippingrectanglenode) + - [Facebook platform support](#facebook-platform-support) +- [Highlights of v3.3beta0](#highlights-of-v33beta0) +- [Features in detail](#features-in-detail-1) + - [BillBoard](#billboard) + - [Triangles command](#triangles-command) + - [WebView](#webview) + - [New audio](#new-audio) +- [Highlights of v3.3alpha0](#highlights-of-v33alpha0) +- [Features in detail](#features-in-detail-2) + - [Camera](#camera) + - [Reskin](#reskin) + - [Attachment](#attachment) + - [Better support for FBX](#better-support-for-fbx) + - [New fbx-conv](#new-fbx-conv) + - [AABB, OBB and Ray](#aabb-obb-and-ray) + - [ui::Scale9Sprite](#uiscale9sprite) + - [c++11 random support](#c11-random-support) + - [RenderTexture save function](#rendertexture-save-function) + - [Primitive](#primitive) + - [Consistent way to set GL context attributes](#consistent-way-to-set-gl-context-attributes) + - [Only two libraries left](#only-two-libraries-left) # Misc Information -* Full Changelog: https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x-3.3rc1/CHANGELOG +* Full Changelog: https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x-3.3rc2/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 @@ -133,6 +134,10 @@ Run Please refer to this document: [ReadMe](../README.md) +# Highlights of v3.3rc2 +* Support for android arm64 architecture, all test cases run on Nexus 9 +* Cocos Studio Reader: Replace [Protobuffer](https://github.com/google/protobuf) by [FlatBuffer](https://github.com/google/flatbuffers) + # Notes of v3.3rc1 **android** @@ -206,7 +211,7 @@ require "cocos.init" * Application: added openURL() * Added `AssetsManagerEx`, it is an enhancement version of `AssetsManager` * TileMap: supported staggered tile map -* Added `ClippingRectangNode`, it is more effecient for renctangle clipping +* Added `ClippingRectangleNode`, it is more efficient for renctangle clipping * Node: schedule/unschedule lambda functions * Facebook platform support in `plugin` on iOS and Android, all features has been added, but the API needs to be polished with Facebook guys @@ -318,7 +323,7 @@ You can refer to [this document](http://www.cocos2d-x.org/wiki/Integrate_the_Fac * 3d: `BillBoard` * audio: new audio is added on iOS and Android * DrawNode: added as many functions as `DrawPrimitive`, and `DrawPrimitive` is deprecated -* Renderer: added `trianle command` +* Renderer: added `triangle command` * UI: added `WebView` on iOS and Android * Many other small features added and many bugs fixed @@ -417,13 +422,13 @@ Full test case please refer to `tests/cpp-tests/Classes/NewAudioEngineTest/NewAu # Highlights of v3.3alpha0 -* 3d: `Camera`, 'Reskin', 'Attachment', 'Better support for FBX', 'New fbx-conv', `AABB`, `OBB` and `Ray` +* 3d: `Camera`, `Reskin`, `Attachment`, `Better support for FBX`, `New fbx-conv`, `AABB`, `OBB` and `Ray` * ui: added `Scale9Sprite` * FileUitls: added `isDirectoryExist()`, `createDirectory()`, `removeDirectory()`, `removeFile()`, `renameFile()` and `getFileSize()` * Device: added `setKeepScreenOn()` on iOS and Android * Added c++11 random support * RenderTexture: added a call back function for `saveToFile()` -* Primitive: Support Points, Lines and Triagles for rendering +* Primitive: Support Points, Lines and Triangles for rendering * SpriteFrameCache: support loading from plist file content data * Added a consistent way to set GL context attributes for all platforms * Only two libraries in cocos2d-x, one for c++ codes, another one for lua-binding codes diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 1c8f9616f6..7508bd1b39 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 1c8f9616f6e160f25e79cf87fec77754e6958822 +Subproject commit 7508bd1b3984d30942362b6717863f832d435703