From 4a218ea3e21f308ab8bd4a93ceff7bc31b937598 Mon Sep 17 00:00:00 2001 From: Wenhai Lin Date: Wed, 28 Jan 2015 15:30:52 +0800 Subject: [PATCH 01/93] Fixed game awaked by the clock on Android --- .../org/cocos2dx/lib/Cocos2dxActivity.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 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 cf8d82670f..23516b871c 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java @@ -44,7 +44,6 @@ import android.preference.PreferenceManager.OnActivityResultListener; import android.util.Log; import android.view.ViewGroup; import android.widget.FrameLayout; -import android.opengl.GLSurfaceView; public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener { // =========================================================== @@ -252,17 +251,25 @@ public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelpe @Override protected void onResume() { super.onResume(); - - Cocos2dxHelper.onResume(); - this.mGLSurfaceView.onResume(); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + + if (hasFocus) { + Cocos2dxHelper.onResume(); + mGLSurfaceView.onResume(); + } + else { + Cocos2dxHelper.onPause(); + mGLSurfaceView.onPause(); + } } @Override protected void onPause() { super.onPause(); - - Cocos2dxHelper.onPause(); - this.mGLSurfaceView.onPause(); } @Override From 295e8532d21e8beb84d66ce97a64bf874cf8df90 Mon Sep 17 00:00:00 2001 From: Vladimir Perminov Date: Sun, 17 May 2015 12:40:14 +0300 Subject: [PATCH 02/93] FileUtilsWin32 correct use all unicode version winapi Move to FileUtilsWin32 implements: isDirectoryExistInternal isDirectoryExist createDirectory removeDirectory removeFile renameFile And use common convert to wide char. --- cocos/platform/CCFileUtils.cpp | 101 ++----- cocos/platform/win32/CCFileUtils-win32.cpp | 293 +++++++++++++++++---- cocos/platform/win32/CCFileUtils-win32.h | 47 +++- 3 files changed, 313 insertions(+), 128 deletions(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index e1599b8082..fb0dcec330 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -989,24 +989,17 @@ bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const return true; } return false; -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - unsigned long fAttrib = GetFileAttributesA(dirPath.c_str()); - if (fAttrib != INVALID_FILE_ATTRIBUTES && - (fAttrib & FILE_ATTRIBUTE_DIRECTORY)) - { - return true; - } - return false; -#else +#elif (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) struct stat st; if (stat(dirPath.c_str(), &st) == 0) { return S_ISDIR(st.st_mode); } return false; +#else + CCASSERT(false, "FileUtils not support isDirectoryExistInternal"); + return false; #endif - - } bool FileUtils::isDirectoryExist(const std::string& dirPath) const @@ -1098,25 +1091,7 @@ bool FileUtils::createDirectory(const std::string& path) } } return true; -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - if ((GetFileAttributesA(path.c_str())) == INVALID_FILE_ATTRIBUTES) - { - subpath = ""; - for (unsigned int i = 0; i < dirs.size(); ++i) - { - subpath += dirs[i]; - if (!isDirectoryExist(subpath)) - { - BOOL ret = CreateDirectoryA(subpath.c_str(), NULL); - if (!ret && ERROR_ALREADY_EXISTS != GetLastError()) - { - return false; - } - } - } - } - return true; -#else +#elif (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) DIR *dir = NULL; // Create path recursively @@ -1145,6 +1120,9 @@ bool FileUtils::createDirectory(const std::string& path) } } return true; +#else + CCASSERT(false, "FileUtils not support createDirectory"); + return false; #endif } @@ -1206,21 +1184,12 @@ bool FileUtils::removeDirectory(const std::string& path) return true; } return false; -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - std::string command = "cmd /c rd /s /q "; - // Path may include space. - command += "\"" + path + "\""; - - if (WinExec(command.c_str(), SW_HIDE) > 31) - return true; - else - return false; #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) if (nftw(path.c_str(),unlink_cb, 64, FTW_DEPTH | FTW_PHYS)) return false; else return true; -#else +#elif (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) std::string command = "rm -r "; // Path may include space. command += "\"" + path + "\""; @@ -1228,6 +1197,9 @@ bool FileUtils::removeDirectory(const std::string& path) return true; else return false; +#else + CCASSERT(false, "FileUtils not support removeDirectory"); + return false; #endif } @@ -1242,29 +1214,15 @@ bool FileUtils::removeFile(const std::string &path) return true; } return false; -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - std::string command = "cmd /c del /q "; - std::string win32path = path; - int len = win32path.length(); - for (int i = 0; i < len; ++i) - { - if (win32path[i] == '/') - { - win32path[i] = '\\'; - } - } - command += win32path; - - if (WinExec(command.c_str(), SW_HIDE) > 31) - return true; - else - return false; -#else +#elif (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) if (remove(path.c_str())) { return false; } else { return true; } +#else + CCASSERT(false, "FileUtils not support removeFile"); + return false; #endif } @@ -1286,29 +1244,7 @@ bool FileUtils::renameFile(const std::string &path, const std::string &oldname, 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)) - { - if (!DeleteFileA(_new.c_str())) - { - CCLOGERROR("Fail to delete file %s !Error code is 0x%x", newPath.c_str(), GetLastError()); - } - } - - if (MoveFileA(_old.c_str(), _new.c_str())) - { - return true; - } - else - { - CCLOGERROR("Fail to rename file %s to %s !Error code is 0x%x", oldPath.c_str(), newPath.c_str(), GetLastError()); - return false; - } -#else +#elif (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) int errorCode = rename(oldPath.c_str(), newPath.c_str()); if (0 != errorCode) @@ -1317,6 +1253,9 @@ bool FileUtils::renameFile(const std::string &path, const std::string &oldname, return false; } return true; +#else + CCASSERT(false, "FileUtils not support renameFile"); + return false; #endif } diff --git a/cocos/platform/win32/CCFileUtils-win32.cpp b/cocos/platform/win32/CCFileUtils-win32.cpp index c14c748563..2d9cca5d9f 100644 --- a/cocos/platform/win32/CCFileUtils-win32.cpp +++ b/cocos/platform/win32/CCFileUtils-win32.cpp @@ -30,6 +30,7 @@ THE SOFTWARE. #include "platform/CCCommon.h" #include #include +#include using namespace std; @@ -56,20 +57,80 @@ static inline std::string convertPathFormatToUnixStyle(const std::string& path) return ret; } +static std::wstring StringUtf8ToWideChar(const std::string& strUtf8) +{ + std::wstring ret; + if (!strUtf8.empty()) + { + int nNum = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, nullptr, 0); + if (nNum) + { + WCHAR* wideCharString = new WCHAR[nNum + 1]; + wideCharString[0] = 0; + + nNum = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, wideCharString, nNum + 1); + + ret = wideCharString; + delete[] wideCharString; + } + else + { + CCLOG("Wrong convert to WideChar code:0x%x", GetLastError()); + } + } + return ret; +} + +static std::string StringWideCharToUtf8(const std::wstring& strWideChar) +{ + std::string ret; + if (!strWideChar.empty()) + { + int nNum = WideCharToMultiByte(CP_UTF8, 0, strWideChar.c_str(), -1, nullptr, 0, nullptr, FALSE); + if (nNum) + { + char* utf8String = new char[nNum + 1]; + utf8String[0] = 0; + + nNum = WideCharToMultiByte(CP_UTF8, 0, strWideChar.c_str(), -1, utf8String, nNum + 1, nullptr, FALSE); + + ret = utf8String; + delete[] utf8String; + } + else + { + CCLOG("Wrong convert to Utf8 code:0x%x", GetLastError()); + } + } + + return ret; +} + static void _checkPath() { if (0 == s_resourcePath.length()) { - WCHAR *pUtf16ExePath = nullptr; - _get_wpgmptr(&pUtf16ExePath); + if (IsDebuggerPresent()) + { + WCHAR utf16Path[CC_MAX_PATH] = { 0 }; + GetCurrentDirectoryW(sizeof(utf16Path)-1, utf16Path); - // We need only directory part without exe - WCHAR *pUtf16DirEnd = wcsrchr(pUtf16ExePath, L'\\'); + s_resourcePath = convertPathFormatToUnixStyle(StringWideCharToUtf8(utf16Path)); + s_resourcePath.append("/"); + } + else + { + WCHAR *pUtf16ExePath = nullptr; + _get_wpgmptr(&pUtf16ExePath); - char utf8ExeDir[CC_MAX_PATH] = { 0 }; - int nNum = WideCharToMultiByte(CP_UTF8, 0, pUtf16ExePath, pUtf16DirEnd-pUtf16ExePath+1, utf8ExeDir, sizeof(utf8ExeDir), nullptr, nullptr); + // We need only directory part without exe + WCHAR *pUtf16DirEnd = wcsrchr(pUtf16ExePath, L'\\'); - s_resourcePath = convertPathFormatToUnixStyle(utf8ExeDir); + char utf8ExeDir[CC_MAX_PATH] = { 0 }; + int nNum = WideCharToMultiByte(CP_UTF8, 0, pUtf16ExePath, pUtf16DirEnd - pUtf16ExePath + 1, utf8ExeDir, sizeof(utf8ExeDir), nullptr, nullptr); + + s_resourcePath = convertPathFormatToUnixStyle(utf8ExeDir); + } } } @@ -99,6 +160,17 @@ bool FileUtilsWin32::init() return FileUtils::init(); } +bool FileUtilsWin32::isDirectoryExistInternal(const std::string& dirPath) const +{ + unsigned long fAttrib = GetFileAttributes(StringUtf8ToWideChar(dirPath).c_str()); + if (fAttrib != INVALID_FILE_ATTRIBUTES && + (fAttrib & FILE_ATTRIBUTE_DIRECTORY)) + { + return true; + } + return false; +} + bool FileUtilsWin32::isFileExistInternal(const std::string& strFilePath) const { if (0 == strFilePath.length()) @@ -112,10 +184,7 @@ bool FileUtilsWin32::isFileExistInternal(const std::string& strFilePath) const strPath.insert(0, _defaultResRootPath); } - WCHAR utf16Buf[CC_MAX_PATH] = {0}; - MultiByteToWideChar(CP_UTF8, 0, strPath.c_str(), -1, utf16Buf, sizeof(utf16Buf)/sizeof(utf16Buf[0])); - - DWORD attr = GetFileAttributesW(utf16Buf); + DWORD attr = GetFileAttributesW(StringUtf8ToWideChar(strPath).c_str()); if(attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY)) return false; // not a file return true; @@ -195,10 +264,7 @@ static Data getData(const std::string& filename, bool forString) // check if the filename uses correct case characters CC_BREAK_IF(!checkFileName(fullPath, filename)); - WCHAR wszBuf[CC_MAX_PATH] = {0}; - MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf)/sizeof(wszBuf[0])); - - HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); + HANDLE fileHandle = ::CreateFile(StringUtf8ToWideChar(fullPath).c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE); size = ::GetFileSize(fileHandle, nullptr); @@ -280,10 +346,7 @@ unsigned char* FileUtilsWin32::getFileData(const std::string& filename, const ch // check if the filename uses correct case characters CC_BREAK_IF(!checkFileName(fullPath, filename)); - WCHAR wszBuf[CC_MAX_PATH] = {0}; - MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf)/sizeof(wszBuf[0])); - - HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); + HANDLE fileHandle = ::CreateFile(StringUtf8ToWideChar(fullPath).c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE); *size = ::GetFileSize(fileHandle, nullptr); @@ -340,49 +403,191 @@ string FileUtilsWin32::getWritablePath() const } // Get full path of executable, e.g. c:\Program Files (x86)\My Game Folder\MyGame.exe - char full_path[CC_MAX_PATH + 1]; - ::GetModuleFileNameA(nullptr, full_path, CC_MAX_PATH + 1); + WCHAR full_path[CC_MAX_PATH + 1] = { 0 }; + ::GetModuleFileName(nullptr, full_path, CC_MAX_PATH + 1); // Debug app uses executable directory; Non-debug app uses local app data directory //#ifndef _DEBUG - // Get filename of executable only, e.g. MyGame.exe - char *base_name = strrchr(full_path, '\\'); + // Get filename of executable only, e.g. MyGame.exe + WCHAR *base_name = wcsrchr(full_path, '\\'); + wstring retPath; + if(base_name) + { + WCHAR app_data_path[CC_MAX_PATH + 1]; - if(base_name) + // Get local app data directory, e.g. C:\Documents and Settings\username\Local Settings\Application Data + if (SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, app_data_path))) { - char app_data_path[CC_MAX_PATH + 1]; + wstring ret(app_data_path); - // Get local app data directory, e.g. C:\Documents and Settings\username\Local Settings\Application Data - if (SUCCEEDED(SHGetFolderPathA(nullptr, CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, app_data_path))) + // Adding executable filename, e.g. C:\Documents and Settings\username\Local Settings\Application Data\MyGame.exe + ret += base_name; + + // Remove ".exe" extension, e.g. C:\Documents and Settings\username\Local Settings\Application Data\MyGame + ret = ret.substr(0, ret.rfind(L".")); + + ret += L"\\"; + + // Create directory + if (SUCCEEDED(SHCreateDirectoryEx(nullptr, ret.c_str(), nullptr))) { - string ret((char*)app_data_path); + retPath = ret; + } + } + } + if (retPath.empty()) +//#endif // not defined _DEBUG + { + // If fetching of local app data directory fails, use the executable one + retPath = full_path; - // Adding executable filename, e.g. C:\Documents and Settings\username\Local Settings\Application Data\MyGame.exe - ret += base_name; + // remove xxx.exe + retPath = retPath.substr(0, retPath.rfind(L"\\") + 1); + } - // Remove ".exe" extension, e.g. C:\Documents and Settings\username\Local Settings\Application Data\MyGame - ret = ret.substr(0, ret.rfind(".")); + return convertPathFormatToUnixStyle(StringWideCharToUtf8(retPath)); +} - ret += "\\"; +bool FileUtilsWin32::renameFile(const std::string &path, const std::string &oldname, const std::string &name) +{ + CCASSERT(!path.empty(), "Invalid path"); + std::string oldPath = path + oldname; + std::string newPath = path + name; - // Create directory - if (SUCCEEDED(SHCreateDirectoryExA(nullptr, ret.c_str(), nullptr))) + std::regex pat("\\/"); + std::string _old = std::regex_replace(oldPath, pat, "\\"); + std::string _new = std::regex_replace(newPath, pat, "\\"); + + std::wstring _wNew = StringUtf8ToWideChar(_new); + + if (FileUtils::getInstance()->isFileExist(_new)) + { + if (!DeleteFile(_wNew.c_str())) + { + CCLOGERROR("Fail to delete file %s !Error code is 0x%x", newPath.c_str(), GetLastError()); + } + } + + if (MoveFile(StringUtf8ToWideChar(_old).c_str(), _wNew.c_str())) + { + return true; + } + else + { + CCLOGERROR("Fail to rename file %s to %s !Error code is 0x%x", oldPath.c_str(), newPath.c_str(), GetLastError()); + return false; + } +} + +bool FileUtilsWin32::createDirectory(const std::string& dirPath) +{ + CCASSERT(!dirPath.empty(), "Invalid path"); + + if (isDirectoryExist(dirPath)) + return true; + + std::wstring path = StringUtf8ToWideChar(dirPath); + + // Split the path + size_t start = 0; + size_t found = path.find_first_of(L"/\\", start); + std::wstring subpath; + std::vector dirs; + + if (found != std::wstring::npos) + { + while (true) + { + subpath = path.substr(start, found - start + 1); + if (!subpath.empty()) + dirs.push_back(subpath); + start = found + 1; + found = path.find_first_of(L"/\\", start); + if (found == std::wstring::npos) + { + if (start < path.length()) { - return convertPathFormatToUnixStyle(ret); + dirs.push_back(path.substr(start)); + } + break; + } + } + } + + if ((GetFileAttributes(path.c_str())) == INVALID_FILE_ATTRIBUTES) + { + subpath = L""; + for (unsigned int i = 0; i < dirs.size(); ++i) + { + subpath += dirs[i]; + + std::string utf8Path = StringWideCharToUtf8(subpath); + if (!isDirectoryExist(utf8Path)) + { + BOOL ret = CreateDirectory(subpath.c_str(), NULL); + if (!ret && ERROR_ALREADY_EXISTS != GetLastError()) + { + CCLOGERROR("Fail create directory %s !Error code is 0x%x", utf8Path.c_str(), GetLastError()); + return false; } } } -//#endif // not defined _DEBUG + } + return true; +} - // If fetching of local app data directory fails, use the executable one - string ret((char*)full_path); +bool FileUtilsWin32::removeFile(const std::string &filepath) +{ + std::regex pat("\\/"); + std::string win32path = std::regex_replace(filepath, pat, "\\"); - // remove xxx.exe - ret = ret.substr(0, ret.rfind("\\") + 1); + if (DeleteFile(StringUtf8ToWideChar(win32path).c_str())) + { + return true; + } + else + { + CCLOGERROR("Fail remove file %s !Error code is 0x%x", filepath.c_str(), GetLastError()); + return false; + } +} - ret = convertPathFormatToUnixStyle(ret); - - return ret; +bool FileUtilsWin32::removeDirectory(const std::string& dirPath) +{ + std::wstring wpath = StringUtf8ToWideChar(dirPath); + std::wstring files = wpath + L"*.*"; + WIN32_FIND_DATA wfd; + HANDLE search = FindFirstFileEx(files.c_str(), FindExInfoStandard, &wfd, FindExSearchNameMatch, NULL, 0); + bool ret = true; + if (search != INVALID_HANDLE_VALUE) + { + BOOL find = true; + while (find) + { + //. .. + if (wfd.cFileName[0] != '.') + { + std::wstring temp = wpath + wfd.cFileName; + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + temp += '/'; + ret = ret && this->removeDirectory(StringWideCharToUtf8(temp)); + } + else + { + SetFileAttributes(temp.c_str(), FILE_ATTRIBUTE_NORMAL); + ret = ret && DeleteFile(temp.c_str()); + } + } + find = FindNextFile(search, &wfd); + } + FindClose(search); + } + if (ret && RemoveDirectory(wpath.c_str())) + { + return true; + } + return false; } NS_CC_END diff --git a/cocos/platform/win32/CCFileUtils-win32.h b/cocos/platform/win32/CCFileUtils-win32.h index 17f6c1ec01..fc6f95e9c8 100644 --- a/cocos/platform/win32/CCFileUtils-win32.h +++ b/cocos/platform/win32/CCFileUtils-win32.h @@ -49,11 +49,52 @@ class CC_DLL FileUtilsWin32 : public FileUtils public: /* override funtions */ bool init(); - virtual std::string getWritablePath() const; - virtual bool isAbsolutePath(const std::string& strPath) const; + virtual std::string getWritablePath() const override; + virtual bool isAbsolutePath(const std::string& strPath) const override; protected: - virtual bool isFileExistInternal(const std::string& strFilePath) const; + virtual bool isFileExistInternal(const std::string& strFilePath) const override; + + /** + * Renames a file under the given directory. + * + * @param path The parent directory path of the file, it must be an absolute path. + * @param oldname The current name of the file. + * @param name The new name of the file. + * @return True if the file have been renamed successfully, false if not. + */ + virtual bool renameFile(const std::string &path, const std::string &oldname, const std::string &name) override; + + /** + * Checks whether a directory exists without considering search paths and resolution orders. + * @param dirPath The directory (with absolute path) to look up for + * @return Returns true if the directory found at the given absolute path, otherwise returns false + */ + virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; + + /** + * Removes a file. + * + * @param filepath The full path of the file, it must be an absolute path. + * @return True if the file have been removed successfully, false if not. + */ + virtual bool removeFile(const std::string &filepath) override; + + /** + * Creates a directory. + * + * @param dirPath The path of the directory, it must be an absolute path. + * @return True if the directory have been created successfully, false if not. + */ + virtual bool createDirectory(const std::string& dirPath) override; + + /** + * Removes a directory. + * + * @param dirPath The full path of the directory, it must be an absolute path. + * @return True if the directory have been removed successfully, false if not. + */ + virtual bool removeDirectory(const std::string& dirPath) override; /** * Gets resource file data From bfb3fbb1c08937ec65e018ee196564db46b0959e Mon Sep 17 00:00:00 2001 From: Vladimir Perminov Date: Sun, 17 May 2015 19:24:57 +0300 Subject: [PATCH 03/93] Revert _checkPath --- cocos/platform/win32/CCFileUtils-win32.cpp | 25 ++++++---------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/cocos/platform/win32/CCFileUtils-win32.cpp b/cocos/platform/win32/CCFileUtils-win32.cpp index 2d9cca5d9f..213221f293 100644 --- a/cocos/platform/win32/CCFileUtils-win32.cpp +++ b/cocos/platform/win32/CCFileUtils-win32.cpp @@ -110,27 +110,16 @@ static void _checkPath() { if (0 == s_resourcePath.length()) { - if (IsDebuggerPresent()) - { - WCHAR utf16Path[CC_MAX_PATH] = { 0 }; - GetCurrentDirectoryW(sizeof(utf16Path)-1, utf16Path); + WCHAR *pUtf16ExePath = nullptr; + _get_wpgmptr(&pUtf16ExePath); - s_resourcePath = convertPathFormatToUnixStyle(StringWideCharToUtf8(utf16Path)); - s_resourcePath.append("/"); - } - else - { - WCHAR *pUtf16ExePath = nullptr; - _get_wpgmptr(&pUtf16ExePath); + // We need only directory part without exe + WCHAR *pUtf16DirEnd = wcsrchr(pUtf16ExePath, L'\\'); - // We need only directory part without exe - WCHAR *pUtf16DirEnd = wcsrchr(pUtf16ExePath, L'\\'); + char utf8ExeDir[CC_MAX_PATH] = { 0 }; + int nNum = WideCharToMultiByte(CP_UTF8, 0, pUtf16ExePath, pUtf16DirEnd-pUtf16ExePath+1, utf8ExeDir, sizeof(utf8ExeDir), nullptr, nullptr); - char utf8ExeDir[CC_MAX_PATH] = { 0 }; - int nNum = WideCharToMultiByte(CP_UTF8, 0, pUtf16ExePath, pUtf16DirEnd - pUtf16ExePath + 1, utf8ExeDir, sizeof(utf8ExeDir), nullptr, nullptr); - - s_resourcePath = convertPathFormatToUnixStyle(utf8ExeDir); - } + s_resourcePath = convertPathFormatToUnixStyle(utf8ExeDir); } } From 98c3ba6f4b1e94b6b5b27af0e4296141301fbb5b Mon Sep 17 00:00:00 2001 From: MAUSMAUSgames Date: Sun, 24 May 2015 17:30:26 +0200 Subject: [PATCH 04/93] using Action::_tag as flag field adding options to use tag as flag field to Node::stopAllActionsByTag and ActionManager::removeAllActionsByTag --- cocos/2d/CCActionManager.cpp | 4 ++-- cocos/2d/CCActionManager.h | 3 ++- cocos/2d/CCNode.cpp | 4 ++-- cocos/2d/CCNode.h | 3 ++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cocos/2d/CCActionManager.cpp b/cocos/2d/CCActionManager.cpp index 4739541b24..5151296538 100644 --- a/cocos/2d/CCActionManager.cpp +++ b/cocos/2d/CCActionManager.cpp @@ -287,7 +287,7 @@ void ActionManager::removeActionByTag(int tag, Node *target) } } -void ActionManager::removeAllActionsByTag(int tag, Node *target) +void ActionManager::removeAllActionsByTag(int tag, Node *target, bool bitwiseFilter) { CCASSERT(tag != Action::INVALID_TAG, ""); CCASSERT(target != nullptr, ""); @@ -302,7 +302,7 @@ void ActionManager::removeAllActionsByTag(int tag, Node *target) { Action *action = (Action*)element->actions->arr[i]; - if (action->getTag() == (int)tag && action->getOriginalTarget() == target) + if ((action->getTag() == (int)tag || (bitwiseFilter && action->getTag() != Action::INVALID_TAG && (action->getTag() & tag) != 0)) && action->getOriginalTarget() == target) { removeActionAtIndex(i, element); --limit; diff --git a/cocos/2d/CCActionManager.h b/cocos/2d/CCActionManager.h index 68d8656f4c..94612c5a46 100644 --- a/cocos/2d/CCActionManager.h +++ b/cocos/2d/CCActionManager.h @@ -110,9 +110,10 @@ public: * * @param tag The actions' tag. * @param target A certain target. + * @param bitwiseFilter If true, tag is used as a flag field using "bitwise AND" * @js NA */ - void removeAllActionsByTag(int tag, Node *target); + void removeAllActionsByTag(int tag, Node *target, bool bitwiseFilter = false); /** Gets an action given its tag an a target. * diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 423a60286e..3a7e4611fa 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -1563,10 +1563,10 @@ void Node::stopActionByTag(int tag) _actionManager->removeActionByTag(tag, this); } -void Node::stopAllActionsByTag(int tag) +void Node::stopAllActionsByTag(int tag, bool bitwiseFilter) { CCASSERT( tag != Action::INVALID_TAG, "Invalid tag"); - _actionManager->removeAllActionsByTag(tag, this); + _actionManager->removeAllActionsByTag(tag, this, bitwiseFilter); } Action * Node::getActionByTag(int tag) diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index 5333bbb33f..90d9e094cb 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -1224,8 +1224,9 @@ public: * Removes all actions from the running action list by its tag. * * @param tag A tag that indicates the action to be removed. + * @param bitwiseFilter If true, tag is used as a flag field using "bitwise AND" */ - void stopAllActionsByTag(int tag); + void stopAllActionsByTag(int tag, bool bitwiseFilter = false); /** * Gets an action from the running action list by its tag. From 847cba026cd18622f207e7435616f7d8181f603c Mon Sep 17 00:00:00 2001 From: MAUSMAUSgames Date: Thu, 28 May 2015 09:52:49 +0200 Subject: [PATCH 05/93] added _flags to Action, change API to stopActionsByFlags --- cocos/2d/CCAction.cpp | 1 + cocos/2d/CCAction.h | 12 +++++ cocos/2d/CCActionManager.cpp | 35 ++++++++++++- cocos/2d/CCActionManager.h | 11 +++- cocos/2d/CCNode.cpp | 12 ++++- cocos/2d/CCNode.h | 10 +++- .../ActionManagerTest/ActionManagerTest.cpp | 51 +++++++++++++++++++ .../ActionManagerTest/ActionManagerTest.h | 15 ++++++ 8 files changed, 139 insertions(+), 8 deletions(-) diff --git a/cocos/2d/CCAction.cpp b/cocos/2d/CCAction.cpp index 24b8a6eaa6..589f3884eb 100644 --- a/cocos/2d/CCAction.cpp +++ b/cocos/2d/CCAction.cpp @@ -40,6 +40,7 @@ Action::Action() :_originalTarget(nullptr) ,_target(nullptr) ,_tag(Action::INVALID_TAG) +,_flags(0) { } diff --git a/cocos/2d/CCAction.h b/cocos/2d/CCAction.h index d98f90971d..68c9e9e19a 100644 --- a/cocos/2d/CCAction.h +++ b/cocos/2d/CCAction.h @@ -143,6 +143,16 @@ public: * @param tag Used to identify the action easily. */ inline void setTag(int tag) { _tag = tag; } + /** Returns a flag field that is used to group the actions easily. + * + * @return A tag. + */ + inline unsigned int getFlags() const { return _flags; } + /** Changes the flag field that is used to group the actions easily. + * + * @param tag Used to identify the action easily. + */ + inline void setFlags(unsigned int flags) { _flags = flags; } CC_CONSTRUCTOR_ACCESS: Action(); @@ -159,6 +169,8 @@ protected: Node *_target; /** The action tag. An identifier of the action. */ int _tag; + /** The action flag field. To categorize action into certain groups.*/ + unsigned int _flags; private: CC_DISALLOW_COPY_AND_ASSIGN(Action); diff --git a/cocos/2d/CCActionManager.cpp b/cocos/2d/CCActionManager.cpp index 5151296538..df7f082e99 100644 --- a/cocos/2d/CCActionManager.cpp +++ b/cocos/2d/CCActionManager.cpp @@ -287,7 +287,7 @@ void ActionManager::removeActionByTag(int tag, Node *target) } } -void ActionManager::removeAllActionsByTag(int tag, Node *target, bool bitwiseFilter) +void ActionManager::removeAllActionsByTag(int tag, Node *target) { CCASSERT(tag != Action::INVALID_TAG, ""); CCASSERT(target != nullptr, ""); @@ -302,7 +302,38 @@ void ActionManager::removeAllActionsByTag(int tag, Node *target, bool bitwiseFil { Action *action = (Action*)element->actions->arr[i]; - if ((action->getTag() == (int)tag || (bitwiseFilter && action->getTag() != Action::INVALID_TAG && (action->getTag() & tag) != 0)) && action->getOriginalTarget() == target) + if (action->getTag() == (int)tag && action->getOriginalTarget() == target) + { + removeActionAtIndex(i, element); + --limit; + } + else + { + ++i; + } + } + } +} + +void ActionManager::removeActionsByFlags(unsigned int flags, Node *target) +{ + if (flags == 0) + { + return; + } + CCASSERT(target != nullptr, ""); + + tHashElement *element = nullptr; + HASH_FIND_PTR(_targets, &target, element); + + if (element) + { + auto limit = element->actions->num; + for (int i = 0; i < limit;) + { + Action *action = (Action*)element->actions->arr[i]; + + if ((action->getFlags() & flags) != 0 && action->getOriginalTarget() == target) { removeActionAtIndex(i, element); --limit; diff --git a/cocos/2d/CCActionManager.h b/cocos/2d/CCActionManager.h index 94612c5a46..404292192c 100644 --- a/cocos/2d/CCActionManager.h +++ b/cocos/2d/CCActionManager.h @@ -110,10 +110,17 @@ public: * * @param tag The actions' tag. * @param target A certain target. - * @param bitwiseFilter If true, tag is used as a flag field using "bitwise AND" * @js NA */ - void removeAllActionsByTag(int tag, Node *target, bool bitwiseFilter = false); + void removeAllActionsByTag(int tag, Node *target); + + /** Removes all actions matching at least one bit in flags and the target. + * + * @param flags The flag field to match the actions' flags based on bitwise AND. + * @param target A certain target. + * @js NA + */ + void removeActionsByFlags(unsigned int flags, Node *target); /** Gets an action given its tag an a target. * diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 3a7e4611fa..91926e8dd5 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -1563,10 +1563,18 @@ void Node::stopActionByTag(int tag) _actionManager->removeActionByTag(tag, this); } -void Node::stopAllActionsByTag(int tag, bool bitwiseFilter) +void Node::stopAllActionsByTag(int tag) { CCASSERT( tag != Action::INVALID_TAG, "Invalid tag"); - _actionManager->removeAllActionsByTag(tag, this, bitwiseFilter); + _actionManager->removeAllActionsByTag(tag, this); +} + +void Node::stopActionsByFlags(unsigned int flags) +{ + if (flags > 0) + { + _actionManager->removeActionsByFlags(flags, this); + } } Action * Node::getActionByTag(int tag) diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index 90d9e094cb..b5e465f45a 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -1224,9 +1224,15 @@ public: * Removes all actions from the running action list by its tag. * * @param tag A tag that indicates the action to be removed. - * @param bitwiseFilter If true, tag is used as a flag field using "bitwise AND" */ - void stopAllActionsByTag(int tag, bool bitwiseFilter = false); + void stopAllActionsByTag(int tag); + + /** + * Removes all actions from the running action list by its flags. + * + * @param flags A flag field that removes actions based on bitwise AND. + */ + void stopActionsByFlags(unsigned int flags); /** * Gets an action from the running action list by its tag. diff --git a/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.cpp b/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.cpp index c0bb7b5582..d8f0b9f4aa 100644 --- a/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.cpp +++ b/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.cpp @@ -18,6 +18,7 @@ ActionManagerTests::ActionManagerTests() ADD_TEST_CASE(PauseTest); ADD_TEST_CASE(StopActionTest); ADD_TEST_CASE(StopAllActionsTest); + ADD_TEST_CASE(StopActionsByFlagsTest); ADD_TEST_CASE(ResumeTest); } @@ -291,3 +292,53 @@ void ResumeTest::resumeGrossini(float time) auto director = Director::getInstance(); director->getActionManager()->resumeTarget(pGrossini); } + +//------------------------------------------------------------------ +// +// StopActionsByFlagsTest +// +//------------------------------------------------------------------ +void StopActionsByFlagsTest::onEnter() +{ + ActionManagerTest::onEnter(); + + auto l = Label::createWithTTF("Should stop scale & move after 4 seconds but keep rotate", "fonts/Thonburi.ttf", 16.0f); + addChild(l); + l->setPosition( Vec2(VisibleRect::center().x, VisibleRect::top().y - 75) ); + + auto pMove1 = MoveBy::create(2, Vec2(200, 0)); + auto pMove2 = MoveBy::create(2, Vec2(-200, 0)); + auto pSequenceMove = Sequence::createWithTwoActions(pMove1, pMove2); + auto pRepeatMove = RepeatForever::create(pSequenceMove); + pRepeatMove->setFlags(kMoveFlag | kRepeatForeverFlag); + + auto pScale1 = ScaleBy::create(2, 1.5f); + auto pScale2 = ScaleBy::create(2, 1.0f/1.5f); + auto pSequenceScale = Sequence::createWithTwoActions(pScale1, pScale2); + auto pRepeatScale = RepeatForever::create(pSequenceScale); + pRepeatScale->setFlags(kScaleFlag | kRepeatForeverFlag); + + auto pRotate = RotateBy::create(2, 360); + auto pRepeatRotate = RepeatForever::create(pRotate); + pRepeatRotate->setFlags(kRotateFlag | kRepeatForeverFlag); + + auto pChild = Sprite::create(s_pathGrossini); + pChild->setPosition( VisibleRect::center() ); + + addChild(pChild, 1, kTagGrossini); + pChild->runAction(pRepeatMove); + pChild->runAction(pRepeatScale); + pChild->runAction(pRepeatRotate); + this->scheduleOnce((SEL_SCHEDULE)&StopActionsByFlagsTest::stopAction, 4); +} + +void StopActionsByFlagsTest::stopAction(float time) +{ + auto sprite = getChildByTag(kTagGrossini); + sprite->stopActionsByFlags(kMoveFlag | kScaleFlag); +} + +std::string StopActionsByFlagsTest::subtitle() const +{ + return "Stop All Actions By Flags Test"; +} diff --git a/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.h b/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.h index 574af60526..746f76f807 100644 --- a/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.h +++ b/tests/cpp-tests/Classes/ActionManagerTest/ActionManagerTest.h @@ -81,4 +81,19 @@ public: void resumeGrossini(float time); }; +class StopActionsByFlagsTest : public ActionManagerTest +{ +public: + CREATE_FUNC(StopActionsByFlagsTest); + + virtual std::string subtitle() const override; + virtual void onEnter() override; + void stopAction(float time); +protected: + const unsigned int kMoveFlag = 0x01; + const unsigned int kScaleFlag = 0x02; + const unsigned int kRotateFlag = 0x04; + const unsigned int kRepeatForeverFlag = 0x08; // You don't need this for the test, but it's for demonstration how to activate several flags on an action. +}; + #endif From f1d879f7ed524a252970ec37d9f0a91e60a8d93d Mon Sep 17 00:00:00 2001 From: lite3 Date: Mon, 8 Jun 2015 13:34:45 +0800 Subject: [PATCH 06/93] remove old path When added existing new searchPath --- cocos/platform/CCFileUtils.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index b5b502decd..c1c524deb3 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -892,6 +892,14 @@ void FileUtils::addSearchPath(const std::string &searchpath,const bool front) { path += "/"; } + + std::string newpath = std::string(path); + auto iter = std::find(_searchPathArray.begin(), _searchPathArray.end(), newpath); + if (iter != _searchPathArray.cend()) + { + _searchPathArray.erase(iter); + } + if (front) { _searchPathArray.insert(_searchPathArray.begin(), path); } else { From c249f7cb696eafe40ae895c57dd7c6b74ffd3ba0 Mon Sep 17 00:00:00 2001 From: lite3 Date: Mon, 15 Jun 2015 19:48:12 +0800 Subject: [PATCH 07/93] keep old behavior --- cocos/platform/CCFileUtils.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index c1c524deb3..efd63e2ba0 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -892,12 +892,14 @@ void FileUtils::addSearchPath(const std::string &searchpath,const bool front) { path += "/"; } - - std::string newpath = std::string(path); - auto iter = std::find(_searchPathArray.begin(), _searchPathArray.end(), newpath); + + auto iter = std::find(_searchPathArray.begin(), _searchPathArray.end(), searchpath); if (iter != _searchPathArray.cend()) { - _searchPathArray.erase(iter); + if (front) + _searchPathArray.erase(iter); + else + return; } if (front) { From 5d4e8aa2752e0892a8466d3b66fd0728f632f407 Mon Sep 17 00:00:00 2001 From: dkorchinskiy Date: Tue, 16 Jun 2015 16:56:06 +0300 Subject: [PATCH 08/93] Fix crash on Windows if pass string more than 16kb to cocos2d::log --- cocos/base/CCConsole.cpp | 73 +++++++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 20 deletions(-) diff --git a/cocos/base/CCConsole.cpp b/cocos/base/CCConsole.cpp index aa306ce6bc..9433a37714 100644 --- a/cocos/base/CCConsole.cpp +++ b/cocos/base/CCConsole.cpp @@ -123,12 +123,12 @@ static bool isFloat( std::string myString ) { static ssize_t mydprintf(int sock, const char *format, ...) { va_list args; - char buf[16386]; + char buf[16386]; - va_start(args, format); - vsnprintf(buf, sizeof(buf), format, args); - va_end(args); - return send(sock, buf, strlen(buf),0); + va_start(args, format); + vsnprintf(buf, sizeof(buf), format, args); + va_end(args); + return send(sock, buf, strlen(buf),0); } static void sendPrompt(int fd) @@ -235,20 +235,53 @@ void SendLogToWindow(const char *log) static void _log(const char *format, va_list args) { - char buf[MAX_LOG_LENGTH]; + int bufferSize = MAX_LOG_LENGTH; + char* buf = nullptr; + + do + { + buf = new (std::nothrow) char[bufferSize]; + if (buf == nullptr) + return; // not enough memory + + int ret = vsnprintf(buf, bufferSize - 3, format, args); + if (ret < 0) + { + bufferSize *= 2; + + delete [] buf; + } + else + break; + + } while (true); - vsnprintf(buf, MAX_LOG_LENGTH-3, format, args); strcat(buf, "\n"); #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID - __android_log_print(ANDROID_LOG_DEBUG, "cocos2d-x debug info", "%s", buf); + __android_log_print(ANDROID_LOG_DEBUG, "cocos2d-x debug info", "%s", buf); #elif CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT - WCHAR wszBuf[MAX_LOG_LENGTH] = {0}; - MultiByteToWideChar(CP_UTF8, 0, buf, -1, wszBuf, sizeof(wszBuf)); - OutputDebugStringW(wszBuf); - WideCharToMultiByte(CP_ACP, 0, wszBuf, -1, buf, sizeof(buf), nullptr, FALSE); - printf("%s", buf); + + int pos = 0; + int len = strlen(buf); + char tempBuf[MAX_LOG_LENGTH + 1] = { 0 }; + WCHAR wszBuf[MAX_LOG_LENGTH + 1] = { 0 }; + + do + { + std::copy(buf + pos, buf + pos + MAX_LOG_LENGTH, tempBuf); + + tempBuf[MAX_LOG_LENGTH] = 0; + + MultiByteToWideChar(CP_UTF8, 0, tempBuf, -1, wszBuf, sizeof(wszBuf)); + OutputDebugStringW(wszBuf); + WideCharToMultiByte(CP_ACP, 0, wszBuf, -1, tempBuf, sizeof(tempBuf), nullptr, FALSE); + printf("%s", tempBuf); + + pos += MAX_LOG_LENGTH; + + } while (pos < len); SendLogToWindow(buf); fflush(stdout); #else @@ -258,7 +291,7 @@ static void _log(const char *format, va_list args) #endif Director::getInstance()->getConsole()->log(buf); - + delete [] buf; } // FIXME: Deprecated @@ -290,7 +323,7 @@ Console::Console() , _bindAddress("") { // VS2012 doesn't support initializer list, so we create a new array and assign its elements to '_command'. - Command commands[] = { + Command commands[] = { { "allocator", "Display allocator diagnostics for all allocators", std::bind(&Console::commandAllocator, this, std::placeholders::_1, std::placeholders::_2) }, { "config", "Print the Configuration object", std::bind(&Console::commandConfig, this, std::placeholders::_1, std::placeholders::_2) }, { "debugmsg", "Whether or not to forward the debug messages on the console. Args: [on | off]", [&](int fd, const std::string& args) { @@ -326,10 +359,10 @@ Console::Console() }; ; - for (int i = 0; i < sizeof(commands)/sizeof(commands[0]); ++i) - { - _commands[commands[i].name] = commands[i]; - } + for (int i = 0; i < sizeof(commands)/sizeof(commands[0]); ++i) + { + _commands[commands[i].name] = commands[i]; + } } Console::~Console() @@ -1190,7 +1223,7 @@ void Console::loop() #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) closesocket(_listenfd); - WSACleanup(); + WSACleanup(); #else close(_listenfd); #endif From 993e420ce4130fe9ca5fb9316f540842e3c74970 Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Fri, 3 Jul 2015 11:30:38 +0800 Subject: [PATCH 09/93] Fix drawLine & drawPoints won't use blendFunc bug --- cocos/2d/CCDrawNode.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cocos/2d/CCDrawNode.cpp b/cocos/2d/CCDrawNode.cpp index 2d04abb00f..c2b0b37b73 100644 --- a/cocos/2d/CCDrawNode.cpp +++ b/cocos/2d/CCDrawNode.cpp @@ -371,7 +371,9 @@ void DrawNode::onDrawGLLine(const Mat4 &transform, uint32_t flags) auto glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR); glProgram->use(); glProgram->setUniformsForBuiltins(transform); - + + GL::blendFunc(_blendFunc.src, _blendFunc.dst); + if (_dirtyGLLine) { glBindBuffer(GL_ARRAY_BUFFER, _vboGLLine); @@ -412,7 +414,9 @@ void DrawNode::onDrawGLPoint(const Mat4 &transform, uint32_t flags) auto glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_COLOR_TEXASPOINTSIZE); glProgram->use(); glProgram->setUniformsForBuiltins(transform); - + + GL::blendFunc(_blendFunc.src, _blendFunc.dst); + if (_dirtyGLPoint) { glBindBuffer(GL_ARRAY_BUFFER, _vboGLPoint); From d6fc8ecc94effb2662de8fc90e5cda9886cc945e Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Mon, 6 Jul 2015 16:02:19 +0800 Subject: [PATCH 10/93] Fix when use percentage size & position to a UIWidget which parent is a layout component, when change simulator screen size, layout won't effect correctly. --- cocos/ui/UILayoutComponent.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/cocos/ui/UILayoutComponent.cpp b/cocos/ui/UILayoutComponent.cpp index 200a2714f2..0f7bc5dadc 100644 --- a/cocos/ui/UILayoutComponent.cpp +++ b/cocos/ui/UILayoutComponent.cpp @@ -21,7 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ - +#include "UIPageView.h" #include "UILayoutComponent.h" #include "2d/CCNode.h" #include "GUIDefine.h" @@ -667,7 +667,23 @@ namespace ui { _owner->setPosition(ownerPosition); _owner->setContentSize(ownerSize); - ui::Helper::doLayout(_owner); + if (typeid(*_owner) == typeid(PageView)) + { + PageView* page = static_cast(_owner); + page->forceDoLayout(); + + Vector _layoutVector = page->getPages(); + Vector::iterator iter = _layoutVector.begin(); + while (iter != _layoutVector.end()) + { + ui::Helper::doLayout(*(iter)); + iter++; + } + } + else + { + ui::Helper::doLayout(_owner); + } } void LayoutComponent::setActiveEnabled(bool enable) From 9fab1e77021bf55556060a931e7949d6d26e4e1f Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Mon, 6 Jul 2015 16:39:00 +0800 Subject: [PATCH 11/93] Change to use auto & for each to enum sub items --- cocos/ui/UILayoutComponent.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cocos/ui/UILayoutComponent.cpp b/cocos/ui/UILayoutComponent.cpp index 0f7bc5dadc..70fa9aa57b 100644 --- a/cocos/ui/UILayoutComponent.cpp +++ b/cocos/ui/UILayoutComponent.cpp @@ -673,11 +673,9 @@ namespace ui { page->forceDoLayout(); Vector _layoutVector = page->getPages(); - Vector::iterator iter = _layoutVector.begin(); - while (iter != _layoutVector.end()) + for each (auto item in _layoutVector) { - ui::Helper::doLayout(*(iter)); - iter++; + ui::Helper::doLayout(item); } } else From 214684b3be28c393f726163ddc5946cd6dc56d30 Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Mon, 6 Jul 2015 16:45:04 +0800 Subject: [PATCH 12/93] Fix --- cocos/ui/UILayoutComponent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/ui/UILayoutComponent.cpp b/cocos/ui/UILayoutComponent.cpp index 70fa9aa57b..50a01a7d85 100644 --- a/cocos/ui/UILayoutComponent.cpp +++ b/cocos/ui/UILayoutComponent.cpp @@ -673,7 +673,7 @@ namespace ui { page->forceDoLayout(); Vector _layoutVector = page->getPages(); - for each (auto item in _layoutVector) + for(auto& item : _layoutVector) { ui::Helper::doLayout(item); } From 3b69a1726fbffe808fba4b92b615bfaaa7c99fc6 Mon Sep 17 00:00:00 2001 From: VisualSj Date: Mon, 6 Jul 2015 17:17:20 +0800 Subject: [PATCH 13/93] Fixed a bug that action texture address error --- cocos/scripting/js-bindings/script/studio/jsb_studio_load.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/scripting/js-bindings/script/studio/jsb_studio_load.js b/cocos/scripting/js-bindings/script/studio/jsb_studio_load.js index 0c0e533e61..1b8ae731d8 100644 --- a/cocos/scripting/js-bindings/script/studio/jsb_studio_load.js +++ b/cocos/scripting/js-bindings/script/studio/jsb_studio_load.js @@ -140,8 +140,8 @@ ccs._parser = cc.Class.extend({ return json["widgetTree"]; }, - parse: function(file, json){ - var resourcePath = this._dirname(file); + parse: function(file, json, resourcePath){ + resourcePath = resourcePath || this._dirname(file); this.pretreatment(json, resourcePath); var node = this.parseNode(this.getNodeJson(json), resourcePath, file); node && this.deferred(json, resourcePath, node, file); From 9a6ffd8904e85f520e399f4347f2cd274fcc66f9 Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Tue, 7 Jul 2015 09:54:42 +0800 Subject: [PATCH 14/93] Add bug test for PageView layout & CCNodeDraw::onDrawGLLine --- .../UserCameraReader/UserCameraReader.cpp | 1 + .../Classes/BugsTest/Bug-CCDrawNode.cpp | 40 ++++++++++++++++++ .../Classes/BugsTest/Bug-CCDrawNode.h | 14 +++++++ .../Classes/BugsTest/Bug-PageViewLayout.cpp | 41 +++++++++++++++++++ .../Classes/BugsTest/Bug-PageViewLayout.h | 14 +++++++ tests/cpp-tests/Classes/BugsTest/BugsTest.cpp | 4 ++ tests/cpp-tests/Resources/ccs-res | 2 +- tests/cpp-tests/proj.win32/cpp-tests.vcxproj | 4 ++ .../proj.win32/cpp-tests.vcxproj.filters | 12 ++++++ 9 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.cpp create mode 100644 tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.h create mode 100644 tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.cpp create mode 100644 tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.h diff --git a/cocos/editor-support/cocostudio/WidgetReader/UserCameraReader/UserCameraReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/UserCameraReader/UserCameraReader.cpp index 6f3fa906e4..f05bd905f3 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/UserCameraReader/UserCameraReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/UserCameraReader/UserCameraReader.cpp @@ -125,6 +125,7 @@ namespace cocostudio else if(value == "USER1") cameraFlag = 1 << 1; else if(value == "USER2") cameraFlag = 1 << 2; else if(value == "USER3") cameraFlag = 1 << 3; + else if(value == "USER4") cameraFlag = 1 << 4; } attribute = attribute->Next(); diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.cpp b/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.cpp new file mode 100644 index 0000000000..918a00d93e --- /dev/null +++ b/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.cpp @@ -0,0 +1,40 @@ +// +// CCDrawNode::onDrawGLPoint & CCDrawNode::onDrawGLLine miss +// calling GL::blendFunc, so when a sprite set blendFunc, these +// function will get a wrong result. +// In this test, see a red line when bug resolved. +// + +#include "Bug-CCDrawNode.h" + +USING_NS_CC; + +bool BugDrawNodeLayer::init() +{ + if (BugsTestBase::init()) + { + auto size = Director::getInstance()->getWinSize(); + auto testSprite = Sprite::create("cocosui/CloseNormal.png"); + BlendFunc blend; + blend.src = GL_ZERO; + blend.dst = GL_ONE_MINUS_SRC_ALPHA; + testSprite->setBlendFunc(blend); + testSprite->setPosition(Vec2(size.width / 2, size.height / 2)); + testSprite->setScale(10); + addChild(testSprite); + + auto drawNode = DrawNode::create(); + drawNode->drawLine(Vec2(0, 0), Vec2(size.width, size.height), Color4F(1, 0, 0, 0.5f)); + addChild(drawNode); + + auto label = Label::create(); + label->setString(std::string("If you see a red line, the bug is fixed!")); + label->setPosition(size.width / 2, size.height / 4); + label->setTextColor(Color4B::ORANGE); + addChild(label); + + return true; + } + + return false; +} diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.h b/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.h new file mode 100644 index 0000000000..d55729d2a6 --- /dev/null +++ b/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.h @@ -0,0 +1,14 @@ +#ifndef __BUG_CCDRAWNODE_H__ +#define __BUG_CCDRAWNODE_H__ + +#include "BugsTest.h" + +class BugDrawNodeLayer : public BugsTestBase +{ +public: + CREATE_FUNC(BugDrawNodeLayer); + + virtual bool init() override; +}; + +#endif \ No newline at end of file diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.cpp b/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.cpp new file mode 100644 index 0000000000..65895dd515 --- /dev/null +++ b/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.cpp @@ -0,0 +1,41 @@ +// +// When a pageview set to relative position & size, if it +// has child widget set to relative position & size either, +// when change layer size, relayout won't correctly effect +// to the child. +// In this test, if button at the center of panel, bug is fixed! +// + +#include "Bug-PageViewLayout.h" +#include "cocostudio/CocoStudio.h" +#include "ui/CocosGUI.h" +#include "CCFileUtils.h" + +USING_NS_CC; +using namespace ui; + +bool BugPageViewLayer::init() +{ + if (BugsTestBase::init()) + { + auto size = Director::getInstance()->getWinSize(); + + FileUtils::getInstance()->addSearchPath("ccs-res/cocosui/CustomTest/CustomWidgetCallbackBindTest"); + FileUtils::getInstance()->addSearchPath("ccs-res/cocosui/CustomTest/CustomWidgetCallbackBindTest/Default", true); + auto rootNode = CSLoader::createNode("cocosui/CustomTest/CustomWidgetCallbackBindTest/PageViewBugScene.csb"); + auto child = rootNode->getChildByName("ProjectNode_1"); + child->setContentSize(Size(480, 320)); + Helper::doLayout(child); + addChild(rootNode); + + auto label = Label::create(); + label->setString(std::string("If button is at the center of panel, the bug is fixed!")); + label->setPosition(size.width / 2, size.height / 4); + label->setTextColor(Color4B::ORANGE); + this->addChild(label); + + return true; + } + + return false; +} diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.h b/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.h new file mode 100644 index 0000000000..a8218d7a28 --- /dev/null +++ b/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.h @@ -0,0 +1,14 @@ +#ifndef __BUG_PAGEVIEWLAYOUT_H__ +#define __BUG_PAGEVIEWLAYOUT_H__ + +#include "BugsTest.h" + +class BugPageViewLayer : public BugsTestBase +{ +public: + CREATE_FUNC(BugPageViewLayer); + + virtual bool init() override; +}; + +#endif // !__BUG_PAGEVIEWLAYOUT_H__ diff --git a/tests/cpp-tests/Classes/BugsTest/BugsTest.cpp b/tests/cpp-tests/Classes/BugsTest/BugsTest.cpp index f2bfecc07a..c2323763a3 100644 --- a/tests/cpp-tests/Classes/BugsTest/BugsTest.cpp +++ b/tests/cpp-tests/Classes/BugsTest/BugsTest.cpp @@ -9,6 +9,8 @@ #include "Bug-1159.h" #include "Bug-1174.h" #include "Bug-Child.h" +#include "Bug-CCDrawNode.h" +#include "Bug-PageViewLayout.h" BugsTests::BugsTests() { @@ -23,4 +25,6 @@ BugsTests::BugsTests() ADD_TEST_CASE(Bug1174Layer); ADD_TEST_CASE(BugChild); ADD_TEST_CASE(BugCameraMask); + ADD_TEST_CASE(BugDrawNodeLayer); + ADD_TEST_CASE(BugPageViewLayer); } diff --git a/tests/cpp-tests/Resources/ccs-res b/tests/cpp-tests/Resources/ccs-res index dc719c1676..6bf41210fb 160000 --- a/tests/cpp-tests/Resources/ccs-res +++ b/tests/cpp-tests/Resources/ccs-res @@ -1 +1 @@ -Subproject commit dc719c167623d343cd5fdaaba867e9e1a26a24d3 +Subproject commit 6bf41210fb5b1fc1e3458ae690461b7c6e73f0b0 diff --git a/tests/cpp-tests/proj.win32/cpp-tests.vcxproj b/tests/cpp-tests/proj.win32/cpp-tests.vcxproj index d1432c9dfd..647fc25f62 100644 --- a/tests/cpp-tests/proj.win32/cpp-tests.vcxproj +++ b/tests/cpp-tests/proj.win32/cpp-tests.vcxproj @@ -151,7 +151,9 @@ xcopy "$(OutDir)..\*.dll" "$(OutDir)" /D /Y + + @@ -354,7 +356,9 @@ xcopy "$(OutDir)..\*.dll" "$(OutDir)" /D /Y + + diff --git a/tests/cpp-tests/proj.win32/cpp-tests.vcxproj.filters b/tests/cpp-tests/proj.win32/cpp-tests.vcxproj.filters index 69be119287..aee368235e 100644 --- a/tests/cpp-tests/proj.win32/cpp-tests.vcxproj.filters +++ b/tests/cpp-tests/proj.win32/cpp-tests.vcxproj.filters @@ -960,6 +960,12 @@ Classes\Scene3DTest + + Classes\BugsTest + + + Classes\BugsTest + @@ -1748,5 +1754,11 @@ Classes\Scene3DTest + + Classes\BugsTest + + + Classes\BugsTest + \ No newline at end of file From 4bd1fa7d37a66374309bf8c1b019de7257cd950f Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Tue, 7 Jul 2015 10:08:47 +0800 Subject: [PATCH 15/93] Fixed crash cause by the case of file name on WIN32. --- cocos/platform/win32/CCFileUtils-win32.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cocos/platform/win32/CCFileUtils-win32.cpp b/cocos/platform/win32/CCFileUtils-win32.cpp index c14c748563..8cb636e72a 100644 --- a/cocos/platform/win32/CCFileUtils-win32.cpp +++ b/cocos/platform/win32/CCFileUtils-win32.cpp @@ -159,10 +159,9 @@ static bool checkFileName(const std::string& fullPath, const std::string& filena std::string msg = "File path error: \""; msg.append(filename).append("\" the real name is: ").append(realName); - CCLOG("%s", msg.c_str()); + log("%s", msg.c_str()); return false; } - } else { @@ -193,7 +192,7 @@ static Data getData(const std::string& filename, bool forString) std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filename); // check if the filename uses correct case characters - CC_BREAK_IF(!checkFileName(fullPath, filename)); + checkFileName(fullPath, filename); WCHAR wszBuf[CC_MAX_PATH] = {0}; MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf)/sizeof(wszBuf[0])); @@ -278,7 +277,7 @@ unsigned char* FileUtilsWin32::getFileData(const std::string& filename, const ch std::string fullPath = fullPathForFilename(filename); // check if the filename uses correct case characters - CC_BREAK_IF(!checkFileName(fullPath, filename)); + checkFileName(fullPath, filename); WCHAR wszBuf[CC_MAX_PATH] = {0}; MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf)/sizeof(wszBuf[0])); From a9dfd8012ca9bd9557a0de9fcba0ce7d4cf260ba Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Tue, 7 Jul 2015 11:02:00 +0800 Subject: [PATCH 16/93] Add new bug test to Android, Win 10, Win Universal, Linux project file --- tests/cpp-tests/CMakeLists.txt | 2 ++ .../cpp-tests/proj.android-studio/app/jni/Android.mk | 2 ++ tests/cpp-tests/proj.android/jni/Android.mk | 2 ++ tests/cpp-tests/proj.win10/cpp-tests.vcxproj | 4 ++++ tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters | 12 ++++++++++++ .../cpp-tests.Shared/cpp-tests.Shared.vcxitems | 4 ++++ .../cpp-tests.Shared.vcxitems.filters | 12 ++++++++++++ 7 files changed, 38 insertions(+) diff --git a/tests/cpp-tests/CMakeLists.txt b/tests/cpp-tests/CMakeLists.txt index 36dfb8a705..0dd94940ed 100644 --- a/tests/cpp-tests/CMakeLists.txt +++ b/tests/cpp-tests/CMakeLists.txt @@ -29,6 +29,8 @@ set(TESTS_SRC Classes/AppDelegate.cpp Classes/BaseTest.cpp Classes/BillBoardTest/BillBoardTest.cpp + Classes/BugsTest/Bug-CCDrawNode.cpp + Classes/BugsTest/Bug-PageViewLayout.cpp Classes/BugsTest/Bug-1159.cpp Classes/BugsTest/Bug-1174.cpp Classes/BugsTest/Bug-350.cpp diff --git a/tests/cpp-tests/proj.android-studio/app/jni/Android.mk b/tests/cpp-tests/proj.android-studio/app/jni/Android.mk index 6179bca134..6844b42a50 100644 --- a/tests/cpp-tests/proj.android-studio/app/jni/Android.mk +++ b/tests/cpp-tests/proj.android-studio/app/jni/Android.mk @@ -20,6 +20,8 @@ LOCAL_SRC_FILES := main.cpp \ ../../../Classes/Box2DTestBed/GLES-Render.cpp \ ../../../Classes/Box2DTestBed/Test.cpp \ ../../../Classes/Box2DTestBed/TestEntries.cpp \ +../../../Classes/BugsTest/Bug-CCDrawNode.cpp \ +../../../Classes/BugsTest/Bug-PageViewLayout.cpp \ ../../../Classes/BugsTest/Bug-1159.cpp \ ../../../Classes/BugsTest/Bug-1174.cpp \ ../../../Classes/BugsTest/Bug-350.cpp \ diff --git a/tests/cpp-tests/proj.android/jni/Android.mk b/tests/cpp-tests/proj.android/jni/Android.mk index fdf9a83c53..5a28621436 100644 --- a/tests/cpp-tests/proj.android/jni/Android.mk +++ b/tests/cpp-tests/proj.android/jni/Android.mk @@ -20,6 +20,8 @@ LOCAL_SRC_FILES := main.cpp \ ../../Classes/Box2DTestBed/GLES-Render.cpp \ ../../Classes/Box2DTestBed/Test.cpp \ ../../Classes/Box2DTestBed/TestEntries.cpp \ +../../Classes/BugsTest/Bug-CCDrawNode.cpp \ +../../Classes/BugsTest/Bug-PageViewLayout.cpp \ ../../Classes/BugsTest/Bug-1159.cpp \ ../../Classes/BugsTest/Bug-1174.cpp \ ../../Classes/BugsTest/Bug-350.cpp \ diff --git a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj index 6efdc834f6..331d7f7250 100644 --- a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj +++ b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj @@ -298,6 +298,8 @@ + + @@ -546,6 +548,8 @@ + + diff --git a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters index d979dc6a43..1601899174 100644 --- a/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters +++ b/tests/cpp-tests/proj.win10/cpp-tests.vcxproj.filters @@ -467,6 +467,12 @@ Classes\BugsTest + + Classes\BugsTest + + + Classes\BugsTest + Classes\BugsTest @@ -1206,6 +1212,12 @@ Classes\BugsTest + + Classes\BugsTest + + + Classes\BugsTest + Classes\BugsTest diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems index d13db0bb66..dfbf32d6e3 100644 --- a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems +++ b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems @@ -38,6 +38,8 @@ + + @@ -291,6 +293,8 @@ + + diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters index 6d13ce25c5..2027f4aa60 100644 --- a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters +++ b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters @@ -222,6 +222,12 @@ Classes\BugsTest + + Classes\BugsTest + + + Classes\BugsTest + Classes\BugsTest @@ -867,6 +873,12 @@ Classes\BugsTest + + Classes\BugsTest + + + Classes\BugsTest + Classes\BugsTest From 37674c3689bcc67ae01589fc6dabaff866a1d6a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=82=96=E5=B3=B0?= Date: Tue, 7 Jul 2015 11:17:08 +0800 Subject: [PATCH 17/93] Add bug test to Mac & iOS cpp-test project --- build/cocos2d_tests.xcodeproj/project.pbxproj | 16 ++++++++++++++++ .../Classes/BugsTest/Bug-PageViewLayout.cpp | 3 +-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/build/cocos2d_tests.xcodeproj/project.pbxproj b/build/cocos2d_tests.xcodeproj/project.pbxproj index 88669d2829..975b7b0518 100644 --- a/build/cocos2d_tests.xcodeproj/project.pbxproj +++ b/build/cocos2d_tests.xcodeproj/project.pbxproj @@ -814,6 +814,10 @@ 688669711AE8E8B500C2CFD9 /* SpritePolygonTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6886696F1AE8E8B500C2CFD9 /* SpritePolygonTest.cpp */; }; 688669721AE8E8B500C2CFD9 /* SpritePolygonTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6886696F1AE8E8B500C2CFD9 /* SpritePolygonTest.cpp */; }; 826294431AAF071500CB7CF7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 826294421AAF071500CB7CF7 /* Security.framework */; }; + 94D793D91B4B7A3600F60F10 /* Bug-CCDrawNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94D793D51B4B7A3600F60F10 /* Bug-CCDrawNode.cpp */; }; + 94D793DA1B4B7A3600F60F10 /* Bug-CCDrawNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94D793D51B4B7A3600F60F10 /* Bug-CCDrawNode.cpp */; }; + 94D793DB1B4B7A3600F60F10 /* Bug-PageViewLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94D793D71B4B7A3600F60F10 /* Bug-PageViewLayout.cpp */; }; + 94D793DC1B4B7A3600F60F10 /* Bug-PageViewLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94D793D71B4B7A3600F60F10 /* Bug-PageViewLayout.cpp */; }; A05FCACA177C124500BE600E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15C64822165F391E007D4F18 /* Cocoa.framework */; }; A07A521E1783A1D20073F6A7 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 15C6482E165F399D007D4F18 /* libz.dylib */; }; A07A521F1783A1D20073F6A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15C64832165F3AFD007D4F18 /* Foundation.framework */; }; @@ -1774,6 +1778,10 @@ 70A7F72D191D3E4900F0F206 /* shaderTest.psh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = shaderTest.psh.h; sourceTree = ""; }; 70A7F730191D421B00F0F206 /* ShaderTest.vsh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShaderTest.vsh.h; sourceTree = ""; }; 826294421AAF071500CB7CF7 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + 94D793D51B4B7A3600F60F10 /* Bug-CCDrawNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "Bug-CCDrawNode.cpp"; sourceTree = ""; }; + 94D793D61B4B7A3600F60F10 /* Bug-CCDrawNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Bug-CCDrawNode.h"; sourceTree = ""; }; + 94D793D71B4B7A3600F60F10 /* Bug-PageViewLayout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "Bug-PageViewLayout.cpp"; sourceTree = ""; }; + 94D793D81B4B7A3600F60F10 /* Bug-PageViewLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Bug-PageViewLayout.h"; sourceTree = ""; }; A035A71117822E9E00987F6C /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; A07A52291783A1D20073F6A7 /* cpp-tests iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "cpp-tests iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; A07A52B71783AE6D0073F6A7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; @@ -2427,6 +2435,10 @@ 1AC3597618CECF0B00F37B72 /* BugsTest */ = { isa = PBXGroup; children = ( + 94D793D51B4B7A3600F60F10 /* Bug-CCDrawNode.cpp */, + 94D793D61B4B7A3600F60F10 /* Bug-CCDrawNode.h */, + 94D793D71B4B7A3600F60F10 /* Bug-PageViewLayout.cpp */, + 94D793D81B4B7A3600F60F10 /* Bug-PageViewLayout.h */, 1AC3597718CECF0B00F37B72 /* Bug-1159.cpp */, 1AC3597818CECF0B00F37B72 /* Bug-1159.h */, 1AC3597918CECF0B00F37B72 /* Bug-1174.cpp */, @@ -4904,6 +4916,7 @@ 1AC35BEB18CECF0C00F37B72 /* CCControlSliderTest.cpp in Sources */, 1AC35C4D18CECF0C00F37B72 /* SpineTest.cpp in Sources */, 3E92EA821921A1400094CD21 /* Sprite3DTest.cpp in Sources */, + 94D793DB1B4B7A3600F60F10 /* Bug-PageViewLayout.cpp in Sources */, 1AC35C1D18CECF0C00F37B72 /* NewRendererTest.cpp in Sources */, 1AC35B6718CECF0C00F37B72 /* AnimationsTestLayer.cpp in Sources */, 29080DB7191B595E0066F8DF /* UIListViewTest_Editor.cpp in Sources */, @@ -5047,6 +5060,7 @@ 1AC35B2518CECF0C00F37B72 /* ActionsProgressTest.cpp in Sources */, 1AC35B6518CECF0C00F37B72 /* EffectsTest.cpp in Sources */, 1AC35B7118CECF0C00F37B72 /* TestHeaderLayer.cpp in Sources */, + 94D793D91B4B7A3600F60F10 /* Bug-CCDrawNode.cpp in Sources */, 29080D93191B595E0066F8DF /* CustomImageTest.cpp in Sources */, 1AC35B2118CECF0C00F37B72 /* ActionManagerTest.cpp in Sources */, 1AC35C3D18CECF0C00F37B72 /* PhysicsTest.cpp in Sources */, @@ -5185,6 +5199,7 @@ 1AC35B2818CECF0C00F37B72 /* ActionsTest.cpp in Sources */, 1AC35C4A18CECF0C00F37B72 /* ShaderTest.cpp in Sources */, B609E67419C18DAD003D0074 /* BillBoardTest.cpp in Sources */, + 94D793DC1B4B7A3600F60F10 /* Bug-PageViewLayout.cpp in Sources */, C04F935B1941B05400E9FEAB /* TileMapTest2.cpp in Sources */, 1AC35B4418CECF0C00F37B72 /* Bug-624.cpp in Sources */, 1AC35BF818CECF0C00F37B72 /* SocketIOTest.cpp in Sources */, @@ -5293,6 +5308,7 @@ 1AC35BEA18CECF0C00F37B72 /* CCControlSceneManager.cpp in Sources */, 182C5CBB1A95B30500C30D34 /* CocosStudio3DTest.cpp in Sources */, 1AC35B7418CECF0C00F37B72 /* TimelineCallbackTestLayer.cpp in Sources */, + 94D793DA1B4B7A3600F60F10 /* Bug-CCDrawNode.cpp in Sources */, 29080D9E191B595E0066F8DF /* CustomParticleWidgetReader.cpp in Sources */, 1AC35BFC18CECF0C00F37B72 /* NotificationCenterTest.cpp in Sources */, 29FBBBFF196A9ECD00E65826 /* CocostudioParserJsonTest.cpp in Sources */, diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.cpp b/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.cpp index 65895dd515..3572c5f41b 100644 --- a/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.cpp +++ b/tests/cpp-tests/Classes/BugsTest/Bug-PageViewLayout.cpp @@ -9,7 +9,7 @@ #include "Bug-PageViewLayout.h" #include "cocostudio/CocoStudio.h" #include "ui/CocosGUI.h" -#include "CCFileUtils.h" +#include "platform/CCFileUtils.h" USING_NS_CC; using namespace ui; @@ -21,7 +21,6 @@ bool BugPageViewLayer::init() auto size = Director::getInstance()->getWinSize(); FileUtils::getInstance()->addSearchPath("ccs-res/cocosui/CustomTest/CustomWidgetCallbackBindTest"); - FileUtils::getInstance()->addSearchPath("ccs-res/cocosui/CustomTest/CustomWidgetCallbackBindTest/Default", true); auto rootNode = CSLoader::createNode("cocosui/CustomTest/CustomWidgetCallbackBindTest/PageViewBugScene.csb"); auto child = rootNode->getChildByName("ProjectNode_1"); child->setContentSize(Size(480, 320)); From 3ccfb2f3641daf1acad2512bb983fe885a8b14a2 Mon Sep 17 00:00:00 2001 From: VisualSj Date: Tue, 7 Jul 2015 15:44:42 +0800 Subject: [PATCH 18/93] Update the web index --- web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web b/web index 8048837e50..2facd5b38b 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 8048837e508ad8f7f2b36ab8426ed32e36996cb3 +Subproject commit 2facd5b38b539b48866988aadb809118ce7a65e1 From 707b4d8b908ca445fe1baf29eec135d81dd46f9a Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Tue, 7 Jul 2015 19:44:18 +0800 Subject: [PATCH 19/93] Fix windows universal project file --- .../cpp-tests.Shared.vcxitems | 8 +++---- .../cpp-tests.Shared.vcxitems.filters | 24 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems index dfbf32d6e3..7c802de63c 100644 --- a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems +++ b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems @@ -38,8 +38,6 @@ - - @@ -50,7 +48,9 @@ + + @@ -293,8 +293,6 @@ - - @@ -305,7 +303,9 @@ + + diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters index 2027f4aa60..a05a9aafcb 100644 --- a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters +++ b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters @@ -222,12 +222,6 @@ Classes\BugsTest - - Classes\BugsTest - - - Classes\BugsTest - Classes\BugsTest @@ -802,6 +796,12 @@ Classes\NavMeshTest + + Classes\BugsTest + + + Classes\BugsTest + @@ -873,12 +873,6 @@ Classes\BugsTest - - Classes\BugsTest - - - Classes\BugsTest - Classes\BugsTest @@ -1779,5 +1773,11 @@ Classes\NavMeshTest + + Classes\BugsTest + + + Classes\BugsTest + \ No newline at end of file From 8429cc1d9093ed052c13c0da669be8a455413319 Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Wed, 8 Jul 2015 09:35:29 +0800 Subject: [PATCH 20/93] Update CCDrawNode bug test --- tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.cpp b/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.cpp index 918a00d93e..60913d0c14 100644 --- a/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.cpp +++ b/tests/cpp-tests/Classes/BugsTest/Bug-CCDrawNode.cpp @@ -25,10 +25,12 @@ bool BugDrawNodeLayer::init() auto drawNode = DrawNode::create(); drawNode->drawLine(Vec2(0, 0), Vec2(size.width, size.height), Color4F(1, 0, 0, 0.5f)); + Vec2 point = Vec2(size.width / 2, size.height / 2); + drawNode->drawPoint(point, 8, Color4F(1, 0, 0, 0.5f)); addChild(drawNode); auto label = Label::create(); - label->setString(std::string("If you see a red line, the bug is fixed!")); + label->setString(std::string("If you see a red line with a block at center, the bug is fixed!")); label->setPosition(size.width / 2, size.height / 4); label->setTextColor(Color4B::ORANGE); addChild(label); From 06c06a1f0384e1192a0e44e60766409f9efe99cf Mon Sep 17 00:00:00 2001 From: Jacky Date: Wed, 8 Jul 2015 10:07:35 +0800 Subject: [PATCH 21/93] fix polygon sprite bug. --- cocos/2d/CCSprite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index 5482e8934c..883b28c32b 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -223,7 +223,7 @@ bool Sprite::initWithPolygon(const cocos2d::PolygonInfo &info) { Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(info.filename); bool res = false; - if(initWithTexture(texture)); + if(initWithTexture(texture)) { _polyInfo = info; setContentSize(_polyInfo.rect.size/Director::getInstance()->getContentScaleFactor()); From b395ef06d83e510f42ad27a34009855fff111262 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Wed, 8 Jul 2015 10:48:20 +0800 Subject: [PATCH 22/93] AudioEngine:support preload for audio[WIN32/WINRT 8.1/WP8.1] --- cocos/audio/AudioEngine.cpp | 14 +++ cocos/audio/include/AudioEngine.h | 6 + cocos/audio/win32/AudioEngine-win32.cpp | 113 ++++++++++-------- cocos/audio/win32/AudioEngine-win32.h | 1 + cocos/audio/winrt/AudioEngine-winrt.cpp | 70 ++++++----- cocos/audio/winrt/AudioEngine-winrt.h | 1 + .../NewAudioEngineTest/NewAudioEngineTest.cpp | 24 ++-- 7 files changed, 137 insertions(+), 92 deletions(-) diff --git a/cocos/audio/AudioEngine.cpp b/cocos/audio/AudioEngine.cpp index 252c8de835..6c43b6bfa9 100644 --- a/cocos/audio/AudioEngine.cpp +++ b/cocos/audio/AudioEngine.cpp @@ -415,4 +415,18 @@ AudioProfile* AudioEngine::getProfile(const std::string &name) } } +void AudioEngine::preload(const std::string& filePath) +{ + lazyInit(); + + if (_audioEngineImpl) + { + if (!FileUtils::getInstance()->isFileExist(filePath)){ + return; + } + + _audioEngineImpl->preload(filePath); + } +} + #endif diff --git a/cocos/audio/include/AudioEngine.h b/cocos/audio/include/AudioEngine.h index 6b3945fb61..8ed011dcfb 100644 --- a/cocos/audio/include/AudioEngine.h +++ b/cocos/audio/include/AudioEngine.h @@ -281,6 +281,12 @@ public: */ static AudioProfile* getProfile(const std::string &profileName); + /** + * Preload audio file. + * @param filePath The file path of an audio. + */ + static void preload(const std::string& filePath); + protected: static void remove(int audioID); diff --git a/cocos/audio/win32/AudioEngine-win32.cpp b/cocos/audio/win32/AudioEngine-win32.cpp index 573daa2867..923c6671c2 100644 --- a/cocos/audio/win32/AudioEngine-win32.cpp +++ b/cocos/audio/win32/AudioEngine-win32.cpp @@ -47,15 +47,18 @@ static ALCdevice *s_ALDevice = nullptr; static ALCcontext *s_ALContext = nullptr; static bool MPG123_LAZYINIT = true; +static AudioEngineThreadPool* s_threadPool = nullptr; + namespace cocos2d { namespace experimental { class AudioEngineThreadPool { public: AudioEngineThreadPool() - : _running(true) - , _numThread(6) + : _numThread(6) { + s_threadPool = this; + _threads.reserve(_numThread); _tasks.reserve(_numThread); @@ -88,21 +91,17 @@ namespace cocos2d { void destroy() { - _running = false; + std::unique_lock lk(_sleepMutex); _sleepCondition.notify_all(); - - for (int index = 0; index < _numThread; ++index) { - _threads[index].join(); - } - } + } + private: - bool _running; std::vector _threads; std::vector< std::function > _tasks; void threadFunc(int index) { - while (_running) { + while (s_threadPool == this) { std::function task = nullptr; _taskMutex.lock(); task = _tasks[index]; @@ -194,6 +193,54 @@ bool AudioEngineImpl::init() return ret; } +AudioCache* AudioEngineImpl::preload(const std::string& filePath) +{ + AudioCache* audioCache = nullptr; + + do + { + auto it = _audioCaches.find(filePath); + if (it != _audioCaches.end()) + { + audioCache = &it->second; + break; + } + + auto ext = strchr(filePath.c_str(), '.'); + AudioCache::FileFormat fileFormat = AudioCache::FileFormat::UNKNOWN; + + if (_stricmp(ext, ".ogg") == 0){ + fileFormat = AudioCache::FileFormat::OGG; + } + else if (_stricmp(ext, ".mp3") == 0){ + fileFormat = AudioCache::FileFormat::MP3; + + if (MPG123_LAZYINIT){ + auto error = mpg123_init(); + if (error == MPG123_OK){ + MPG123_LAZYINIT = false; + } + else{ + log("Basic setup goes wrong: %s", mpg123_plain_strerror(error)); + break; + } + } + } + else{ + log("unsupported media type:%s\n", ext); + break; + } + + audioCache = &_audioCaches[filePath]; + audioCache->_fileFormat = fileFormat; + + audioCache->_fileFullPath = FileUtils::getInstance()->fullPathForFilename(filePath); + _threadPool->addTask(std::bind(&AudioCache::readDataTask, audioCache)); + } while (false); + + return audioCache; +} + int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume) { bool availableSourceExist = false; @@ -209,48 +256,10 @@ int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume return AudioEngine::INVALID_AUDIO_ID; } - AudioCache* audioCache = nullptr; - auto it = _audioCaches.find(filePath); - if (it == _audioCaches.end()) { - audioCache = &_audioCaches[filePath]; - auto ext = strchr(filePath.c_str(), '.'); - bool eraseCache = true; - - if (_stricmp(ext, ".ogg") == 0){ - audioCache->_fileFormat = AudioCache::FileFormat::OGG; - eraseCache = false; - } - else if (_stricmp(ext, ".mp3") == 0){ - audioCache->_fileFormat = AudioCache::FileFormat::MP3; - - if (MPG123_LAZYINIT){ - auto error = mpg123_init(); - if(error == MPG123_OK){ - MPG123_LAZYINIT = false; - eraseCache = false; - } - else{ - log("Basic setup goes wrong: %s", mpg123_plain_strerror(error)); - } - } - else{ - eraseCache = false; - } - } - else{ - log("unsupported media type:%s\n", ext); - } - - if (eraseCache){ - _audioCaches.erase(filePath); - return AudioEngine::INVALID_AUDIO_ID; - } - - audioCache->_fileFullPath = FileUtils::getInstance()->fullPathForFilename(filePath); - _threadPool->addTask(std::bind(&AudioCache::readDataTask, audioCache)); - } - else { - audioCache = &it->second; + AudioCache* audioCache = preload(filePath); + if (audioCache == nullptr) + { + return AudioEngine::INVALID_AUDIO_ID; } auto player = &_audioPlayers[_currentAudioID]; diff --git a/cocos/audio/win32/AudioEngine-win32.h b/cocos/audio/win32/AudioEngine-win32.h index 8103f3d027..d290bb367b 100644 --- a/cocos/audio/win32/AudioEngine-win32.h +++ b/cocos/audio/win32/AudioEngine-win32.h @@ -61,6 +61,7 @@ public: void uncache(const std::string& filePath); void uncacheAll(); + AudioCache* preload(const std::string& filePath); void update(float dt); diff --git a/cocos/audio/winrt/AudioEngine-winrt.cpp b/cocos/audio/winrt/AudioEngine-winrt.cpp index 22a322171e..4306bd8b46 100644 --- a/cocos/audio/winrt/AudioEngine-winrt.cpp +++ b/cocos/audio/winrt/AudioEngine-winrt.cpp @@ -142,45 +142,53 @@ bool AudioEngineImpl::init() return ret; } -int AudioEngineImpl::play2d(const std::string &filePath, bool loop, float volume) +AudioCache* AudioEngineImpl::preload(const std::string& filePath) { AudioCache* audioCache = nullptr; - auto it = _audioCaches.find(filePath); - if (it == _audioCaches.end()) { - audioCache = &_audioCaches[filePath]; + do + { + auto it = _audioCaches.find(filePath); + if (it == _audioCaches.end()) { + FileFormat fileFormat = FileFormat::UNKNOWN; - auto ext = filePath.substr(filePath.rfind('.')); - transform(ext.begin(), ext.end(), ext.begin(), tolower); + auto ext = filePath.substr(filePath.rfind('.')); + transform(ext.begin(), ext.end(), ext.begin(), tolower); - bool eraseCache = true; + if (ext.compare(".wav") == 0){ + fileFormat = FileFormat::WAV; + } + else if (ext.compare(".ogg") == 0){ + fileFormat = FileFormat::OGG; + } + else if (ext.compare(".mp3") == 0){ + fileFormat = FileFormat::MP3; + } + else{ + log("unsupported media type:%s\n", ext.c_str()); + break; + } - if (ext.compare(".wav") == 0){ - audioCache->_fileFormat = FileFormat::WAV; - eraseCache = false; - } - else if (ext.compare(".ogg") == 0){ - audioCache->_fileFormat = FileFormat::OGG; - eraseCache = false; - } - else if (ext.compare(".mp3") == 0){ - audioCache->_fileFormat = FileFormat::MP3; - eraseCache = false; - } - else{ - log("unsupported media type:%s\n", ext.c_str()); - } + audioCache = &_audioCaches[filePath]; + audioCache->_fileFormat = fileFormat; - if (eraseCache){ - _audioCaches.erase(filePath); - return AudioEngine::INVALID_AUDIO_ID; + std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath); + audioCache->_fileFullPath = fullPath; + _threadPool->addTask(std::bind(&AudioCache::readDataTask, audioCache)); } + else { + audioCache = &it->second; + } + } while (false); - std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath); - audioCache->_fileFullPath = fullPath; - _threadPool->addTask(std::bind(&AudioCache::readDataTask, audioCache)); - } - else { - audioCache = &it->second; + return audioCache; +} + +int AudioEngineImpl::play2d(const std::string &filePath, bool loop, float volume) +{ + auto audioCache = preload(filePath); + if (audioCache == nullptr) + { + return AudioEngine::INVALID_AUDIO_ID; } auto player = &_audioPlayers[_currentAudioID]; diff --git a/cocos/audio/winrt/AudioEngine-winrt.h b/cocos/audio/winrt/AudioEngine-winrt.h index 906ab7ff31..3ab18f2a43 100644 --- a/cocos/audio/winrt/AudioEngine-winrt.h +++ b/cocos/audio/winrt/AudioEngine-winrt.h @@ -58,6 +58,7 @@ NS_CC_BEGIN void setFinishCallback(int audioID, const std::function &callback); void uncache(const std::string& filePath); void uncacheAll(); + AudioCache* preload(const std::string& filePath); void update(float dt); private: diff --git a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp index a506c286a5..deddfa470b 100644 --- a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp +++ b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp @@ -303,7 +303,7 @@ bool AudioControlTest::init() } }); _playItem = playItem; - playItem->setPosition(layerSize.width * 0.3f,layerSize.height * 0.7f); + playItem->setPosition(layerSize.width * 0.3f,layerSize.height * 0.8f); addChild(playItem); auto stopItem = TextButton::create("stop", [&](TextButton* button){ @@ -314,7 +314,7 @@ bool AudioControlTest::init() ((TextButton*)_playItem)->setEnabled(true); } }); - stopItem->setPosition(layerSize.width * 0.7f,layerSize.height * 0.7f); + stopItem->setPosition(layerSize.width * 0.7f,layerSize.height * 0.8f); addChild(stopItem); auto pauseItem = TextButton::create("pause", [&](TextButton* button){ @@ -322,7 +322,7 @@ bool AudioControlTest::init() AudioEngine::pause(_audioID); } }); - pauseItem->setPosition(layerSize.width * 0.3f,layerSize.height * 0.6f); + pauseItem->setPosition(layerSize.width * 0.3f,layerSize.height * 0.7f); addChild(pauseItem); auto resumeItem = TextButton::create("resume", [&](TextButton* button){ @@ -330,32 +330,38 @@ bool AudioControlTest::init() AudioEngine::resume(_audioID); } }); - resumeItem->setPosition(layerSize.width * 0.7f,layerSize.height * 0.6f); + resumeItem->setPosition(layerSize.width * 0.7f,layerSize.height * 0.7f); addChild(resumeItem); auto loopItem = TextButton::create("enable-loop", [&](TextButton* button){ _loopEnabled = !_loopEnabled; - - if (_audioID != AudioEngine::INVALID_AUDIO_ID ) { + + if (_audioID != AudioEngine::INVALID_AUDIO_ID) { AudioEngine::setLoop(_audioID, _loopEnabled); } - if(_loopEnabled){ + if (_loopEnabled){ button->setString("disable-loop"); } else { button->setString("enable-loop"); } }); - loopItem->setPosition(layerSize.width * 0.3f,layerSize.height * 0.5f); + loopItem->setPosition(layerSize.width * 0.5f, layerSize.height * 0.5f); addChild(loopItem); + auto preloadItem = TextButton::create("preload", [&](TextButton* button){ + AudioEngine::preload("background.mp3"); + }); + preloadItem->setPosition(layerSize.width * 0.3f, layerSize.height * 0.6f); + addChild(preloadItem); + auto uncacheItem = TextButton::create("uncache", [&](TextButton* button){ AudioEngine::uncache("background.mp3"); _audioID = AudioEngine::INVALID_AUDIO_ID; ((TextButton*)_playItem)->setEnabled(true); }); - uncacheItem->setPosition(layerSize.width * 0.7f,layerSize.height * 0.5f); + uncacheItem->setPosition(layerSize.width * 0.7f,layerSize.height * 0.6f); addChild(uncacheItem); auto volumeSlider = SliderEx::create(); From fdd78ef73fb20ceb3b08529751c73a74d08ae865 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 8 Jul 2015 13:42:14 +0800 Subject: [PATCH 23/93] update objloader to latest --- cocos/3d/CCObjLoader.cpp | 1518 +++++++++++++++++++++----------------- cocos/3d/CCObjLoader.h | 142 ++-- 2 files changed, 900 insertions(+), 760 deletions(-) diff --git a/cocos/3d/CCObjLoader.cpp b/cocos/3d/CCObjLoader.cpp index 2facde285d..92da4d9495 100644 --- a/cocos/3d/CCObjLoader.cpp +++ b/cocos/3d/CCObjLoader.cpp @@ -1,725 +1,885 @@ // -// Copyright 2012-2013, Syoyo Fujita. +// Copyright 2012-2015, Syoyo Fujita. // // Licensed under 2-clause BSD liecense. // // -// version 0.9.6: Support Ni(index of refraction) mtl parameter. -// Parse transmittance material parameter correctly. -// version 0.9.5: Parse multiple group name. -// Add support of specifying the base path to load material file. -// version 0.9.4: Initial suupport of group tag(g) -// version 0.9.3: Fix parsing triple 'x/y/z' -// version 0.9.2: Add more .mtl load support -// version 0.9.1: Add initial .mtl load support -// version 0.9.0: Initial +// version 0.9.13: Report "Material file not found message" in `err`(#46) +// version 0.9.12: Fix groups being ignored if they have 'usemtl' just before 'g' (#44) +// version 0.9.11: Invert `Tr` parameter(#43) +// version 0.9.10: Fix seg fault on windows. +// version 0.9.9 : Replace atof() with custom parser. +// version 0.9.8 : Fix multi-materials(per-face material ID). +// version 0.9.7 : Support multi-materials(per-face material ID) per +// object/group. +// version 0.9.6 : Support Ni(index of refraction) mtl parameter. +// Parse transmittance material parameter correctly. +// version 0.9.5 : Parse multiple group name. +// Add support of specifying the base path to load material file. +// version 0.9.4 : Initial suupport of group tag(g) +// version 0.9.3 : Fix parsing triple 'x/y/z' +// version 0.9.2 : Add more .mtl load support +// version 0.9.1 : Add initial .mtl load support +// version 0.9.0 : Initial // -#include "CCObjLoader.h" +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include "platform/CCFileUtils.h" -#include "base/ccUtils.h" +#include "CCObjLoader.h" -NS_CC_BEGIN - -struct vertex_index -{ - int v_idx, vt_idx, vn_idx; - vertex_index() {}; - vertex_index(int idx) : v_idx(idx), vt_idx(idx), vn_idx(idx) {}; - vertex_index(int vidx, int vtidx, int vnidx) : v_idx(vidx), vt_idx(vtidx), vn_idx(vnidx) {}; +namespace tinyobj { -}; -// for std::map -static inline bool operator<(const vertex_index& a, const vertex_index& b) -{ - if (a.v_idx != b.v_idx) return (a.v_idx < b.v_idx); - if (a.vn_idx != b.vn_idx) return (a.vn_idx < b.vn_idx); - if (a.vt_idx != b.vt_idx) return (a.vt_idx < b.vt_idx); - return false; -} - -struct obj_shape -{ - std::vector v; - std::vector vn; - std::vector vt; -}; - -static inline bool isSpace(const char c) -{ - return (c == ' ') || (c == '\t'); -} - -static inline bool isNewLine(const char c) -{ - return (c == '\r') || (c == '\n') || (c == '\0'); -} - -// Make index zero-base, and also support relative index. -static inline int fixIndex(int idx, int n) -{ - int i; +#define TINYOBJ_SSCANF_BUFFER_SIZE (4096) - if (idx > 0) { - i = idx - 1; - } else if (idx == 0) { - i = 0; - } else { // negative value = relative - i = n + idx; + struct vertex_index { + int v_idx, vt_idx, vn_idx; + vertex_index(){}; + vertex_index(int idx) : v_idx(idx), vt_idx(idx), vn_idx(idx){}; + vertex_index(int vidx, int vtidx, int vnidx) + : v_idx(vidx), vt_idx(vtidx), vn_idx(vnidx){}; + }; + // for std::map + static inline bool operator<(const vertex_index &a, const vertex_index &b) { + if (a.v_idx != b.v_idx) + return (a.v_idx < b.v_idx); + if (a.vn_idx != b.vn_idx) + return (a.vn_idx < b.vn_idx); + if (a.vt_idx != b.vt_idx) + return (a.vt_idx < b.vt_idx); + + return false; } - return i; -} - -static inline std::string parseString(const char*& token) -{ - std::string s; - auto b = strspn(token, " \t"); - auto e = strcspn(token, " \t\r"); - s = std::string(&token[b], &token[e]); - token += (e - b); - return s; -} - -static inline int parseInt(const char*& token) -{ - token += strspn(token, " \t"); - int i = atoi(token); - token += strcspn(token, " \t\r"); - return i; -} - -static inline float parseFloat(const char*& token) -{ - token += strspn(token, " \t"); - float f = (float)utils::atof(token); - token += strcspn(token, " \t\r"); - return f; -} - -static inline void parseFloat2(float& x, float& y, const char*& token) -{ - x = parseFloat(token); - y = parseFloat(token); -} - -static inline void parseFloat3(float& x, float& y, float& z, const char*& token) -{ - x = parseFloat(token); - y = parseFloat(token); - z = parseFloat(token); -} - -// Parse triples: i, i/j/k, i//k, i/j -static vertex_index parseTriple(const char* &token, int vsize, int vnsize, int vtsize) -{ - vertex_index vi(-1); + struct obj_shape { + std::vector v; + std::vector vn; + std::vector vt; + }; - vi.v_idx = fixIndex(atoi(token), vsize); - token += strcspn(token, "/ \t\r"); - if (token[0] != '/') { - return vi; + static inline bool isSpace(const char c) { return (c == ' ') || (c == '\t'); } + + static inline bool isNewLine(const char c) { + return (c == '\r') || (c == '\n') || (c == '\0'); } - token++; - // i//k - if (token[0] == '/') { + // Make index zero-base, and also support relative index. + static inline int fixIndex(int idx, int n) { + if (idx > 0) return idx - 1; + if (idx == 0) return 0; + return n + idx; // negative value = relative + } + + static inline std::string parseString(const char *&token) { + std::string s; + token += strspn(token, " \t"); + size_t e = strcspn(token, " \t\r"); + s = std::string(token, &token[e]); + token += e; + return s; + } + + static inline int parseInt(const char *&token) { + token += strspn(token, " \t"); + int i = atoi(token); + token += strcspn(token, " \t\r"); + return i; + } + + + // Tries to parse a floating point number located at s. + // + // s_end should be a location in the string where reading should absolutely + // stop. For example at the end of the string, to prevent buffer overflows. + // + // Parses the following EBNF grammar: + // sign = "+" | "-" ; + // END = ? anything not in digit ? + // digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; + // integer = [sign] , digit , {digit} ; + // decimal = integer , ["." , integer] ; + // float = ( decimal , END ) | ( decimal , ("E" | "e") , integer , END ) ; + // + // Valid strings are for example: + // -0 +3.1417e+2 -0.0E-3 1.0324 -1.41 11e2 + // + // If the parsing is a success, result is set to the parsed value and true + // is returned. + // + // The function is greedy and will parse until any of the following happens: + // - a non-conforming character is encountered. + // - s_end is reached. + // + // The following situations triggers a failure: + // - s >= s_end. + // - parse failure. + // + static bool tryParseDouble(const char *s, const char *s_end, double *result) + { + if (s >= s_end) + { + return false; + } + + double mantissa = 0.0; + // This exponent is base 2 rather than 10. + // However the exponent we parse is supposed to be one of ten, + // thus we must take care to convert the exponent/and or the + // mantissa to a * 2^E, where a is the mantissa and E is the + // exponent. + // To get the final double we will use ldexp, it requires the + // exponent to be in base 2. + int exponent = 0; + + // NOTE: THESE MUST BE DECLARED HERE SINCE WE ARE NOT ALLOWED + // TO JUMP OVER DEFINITIONS. + char sign = '+'; + char exp_sign = '+'; + char const *curr = s; + + // How many characters were read in a loop. + int read = 0; + // Tells whether a loop terminated due to reaching s_end. + bool end_not_reached = false; + + /* + BEGIN PARSING. + */ + + // Find out what sign we've got. + if (*curr == '+' || *curr == '-') + { + sign = *curr; + curr++; + } + else if (isdigit(*curr)) { /* Pass through. */ } + else + { + goto fail; + } + + // Read the integer part. + while ((end_not_reached = (curr != s_end)) && isdigit(*curr)) + { + mantissa *= 10; + mantissa += static_cast(*curr - 0x30); + curr++; read++; + } + + // We must make sure we actually got something. + if (read == 0) + goto fail; + // We allow numbers of form "#", "###" etc. + if (!end_not_reached) + goto assemble; + + // Read the decimal part. + if (*curr == '.') + { + curr++; + read = 1; + while ((end_not_reached = (curr != s_end)) && isdigit(*curr)) + { + // NOTE: Don't use powf here, it will absolutely murder precision. + mantissa += static_cast(*curr - 0x30) * pow(10.0, -read); + read++; curr++; + } + } + else if (*curr == 'e' || *curr == 'E') {} + else + { + goto assemble; + } + + if (!end_not_reached) + goto assemble; + + // Read the exponent part. + if (*curr == 'e' || *curr == 'E') + { + curr++; + // Figure out if a sign is present and if it is. + if ((end_not_reached = (curr != s_end)) && (*curr == '+' || *curr == '-')) + { + exp_sign = *curr; + curr++; + } + else if (isdigit(*curr)) { /* Pass through. */ } + else + { + // Empty E is not allowed. + goto fail; + } + + read = 0; + while ((end_not_reached = (curr != s_end)) && isdigit(*curr)) + { + exponent *= 10; + exponent += static_cast(*curr - 0x30); + curr++; read++; + } + exponent *= (exp_sign == '+'? 1 : -1); + if (read == 0) + goto fail; + } + + assemble: + *result = (sign == '+'? 1 : -1) * ldexp(mantissa * pow(5.0, exponent), exponent); + return true; + fail: + return false; + } + static inline float parseFloat(const char *&token) { + token += strspn(token, " \t"); +#ifdef TINY_OBJ_LOADER_OLD_FLOAT_PARSER + float f = (float)atof(token); + token += strcspn(token, " \t\r"); +#else + const char *end = token + strcspn(token, " \t\r"); + double val = 0.0; + tryParseDouble(token, end, &val); + float f = static_cast(val); + token = end; +#endif + return f; + } + + + static inline void parseFloat2(float &x, float &y, const char *&token) { + x = parseFloat(token); + y = parseFloat(token); + } + + static inline void parseFloat3(float &x, float &y, float &z, + const char *&token) { + x = parseFloat(token); + y = parseFloat(token); + z = parseFloat(token); + } + + // Parse triples: i, i/j/k, i//k, i/j + static vertex_index parseTriple(const char *&token, int vsize, int vnsize, + int vtsize) { + vertex_index vi(-1); + + vi.v_idx = fixIndex(atoi(token), vsize); + token += strcspn(token, "/ \t\r"); + if (token[0] != '/') { + return vi; + } token++; + + // i//k + if (token[0] == '/') { + token++; + vi.vn_idx = fixIndex(atoi(token), vnsize); + token += strcspn(token, "/ \t\r"); + return vi; + } + + // i/j/k or i/j + vi.vt_idx = fixIndex(atoi(token), vtsize); + token += strcspn(token, "/ \t\r"); + if (token[0] != '/') { + return vi; + } + + // i/j/k + token++; // skip '/' vi.vn_idx = fixIndex(atoi(token), vnsize); token += strcspn(token, "/ \t\r"); return vi; } - // i/j/k or i/j - vi.vt_idx = fixIndex(atoi(token), vtsize); - token += strcspn(token, "/ \t\r"); - if (token[0] != '/') { - return vi; - } - - // i/j/k - token++; // skip '/' - vi.vn_idx = fixIndex(atoi(token), vnsize); - token += strcspn(token, "/ \t\r"); - return vi; -} - -static ssize_t updateVertex( std::map& vertexCache, std::vector& positions, std::vector& normals, - std::vector& texcoords, const std::vector& in_positions, const std::vector& in_normals, const std::vector& in_texcoords, - const vertex_index& i) -{ - const auto it = vertexCache.find(i); - - if (it != vertexCache.end()) - { - // found cache - return it->second; - } - - assert(in_positions.size() > static_cast(3*i.v_idx+2)); - - positions.push_back(in_positions[3*i.v_idx+0]); - positions.push_back(in_positions[3*i.v_idx+1]); - positions.push_back(in_positions[3*i.v_idx+2]); - - if (i.vn_idx >= 0) - { - normals.push_back(in_normals[3*i.vn_idx+0]); - normals.push_back(in_normals[3*i.vn_idx+1]); - normals.push_back(in_normals[3*i.vn_idx+2]); - } - - if (i.vt_idx >= 0) - { - texcoords.push_back(in_texcoords[2*i.vt_idx+0]); - texcoords.push_back(in_texcoords[2*i.vt_idx+1]); - } - - auto idx = positions.size() / 3 - 1; - vertexCache[i] = idx; - - return idx; -} - -static bool exportFaceGroupToShape( std::map& vertexCache, ObjLoader::shapes_t& shapes, const std::vector &in_positions, - const std::vector &in_normals, const std::vector &in_texcoords, const std::vector >& faceGroup, - const ObjLoader::material_t &material, const std::string &name) -{ - if (faceGroup.empty()) - { - return false; - } - - // Flattened version of vertex data - std::vector& positions = shapes.positions; - std::vector& normals = shapes.normals; - std::vector& texcoords = shapes.texcoords; - std::vector indices; - - // Flatten vertices and indices - for (size_t i = 0; i < faceGroup.size(); i++) - { - const std::vector& face = faceGroup[i]; + static unsigned int + updateVertex(std::map &vertexCache, + std::vector &positions, std::vector &normals, + std::vector &texcoords, + const std::vector &in_positions, + const std::vector &in_normals, + const std::vector &in_texcoords, const vertex_index &i) { + const std::map::iterator it = vertexCache.find(i); - vertex_index i0 = face[0]; - vertex_index i1(-1); - vertex_index i2 = face[1]; + if (it != vertexCache.end()) { + // found cache + return it->second; + } - size_t npolys = face.size(); + assert(in_positions.size() > (unsigned int)(3 * i.v_idx + 2)); - // Polygon -> triangle fan conversion - for (size_t k = 2; k < npolys; k++) - { - i1 = i2; - i2 = face[k]; + positions.push_back(in_positions[3 * i.v_idx + 0]); + positions.push_back(in_positions[3 * i.v_idx + 1]); + positions.push_back(in_positions[3 * i.v_idx + 2]); + + if (i.vn_idx >= 0) { + normals.push_back(in_normals[3 * i.vn_idx + 0]); + normals.push_back(in_normals[3 * i.vn_idx + 1]); + normals.push_back(in_normals[3 * i.vn_idx + 2]); + } + + if (i.vt_idx >= 0) { + texcoords.push_back(in_texcoords[2 * i.vt_idx + 0]); + texcoords.push_back(in_texcoords[2 * i.vt_idx + 1]); + } + + unsigned int idx = static_cast(positions.size() / 3 - 1); + vertexCache[i] = idx; + + return idx; + } + + void InitMaterial(material_t &material) { + material.name = ""; + material.ambient_texname = ""; + material.diffuse_texname = ""; + material.specular_texname = ""; + material.normal_texname = ""; + for (int i = 0; i < 3; i++) { + material.ambient[i] = 0.f; + material.diffuse[i] = 0.f; + material.specular[i] = 0.f; + material.transmittance[i] = 0.f; + material.emission[i] = 0.f; + } + material.illum = 0; + material.dissolve = 1.f; + material.shininess = 1.f; + material.ior = 1.f; + material.unknown_parameter.clear(); + } + + static bool exportFaceGroupToShape( + shape_t &shape, std::map vertexCache, + const std::vector &in_positions, + const std::vector &in_normals, + const std::vector &in_texcoords, + const std::vector > &faceGroup, + const int material_id, const std::string &name, bool clearCache) { + if (faceGroup.empty()) { + return false; + } + + // Flatten vertices and indices + for (size_t i = 0; i < faceGroup.size(); i++) { + const std::vector &face = faceGroup[i]; - unsigned short v0 = updateVertex(vertexCache, positions, normals, texcoords, in_positions, in_normals, in_texcoords, i0); - unsigned short v1 = updateVertex(vertexCache, positions, normals, texcoords, in_positions, in_normals, in_texcoords, i1); - unsigned short v2 = updateVertex(vertexCache, positions, normals, texcoords, in_positions, in_normals, in_texcoords, i2); + vertex_index i0 = face[0]; + vertex_index i1(-1); + vertex_index i2 = face[1]; - indices.push_back(v0); - indices.push_back(v1); - indices.push_back(v2); - } - } - - ObjLoader::shape_t shape; - shape.name = name; - shape.material = material; - shape.mesh.indices.swap(indices); - - shapes.shapes.push_back(shape); - return true; - -} - -std::string trim(const std::string& str) -{ - if (str.empty()) - return str; - auto len = str.length(); - char c = str[len - 1]; - while (c == '\r' || c == '\n') - { - len--; - c = str[len - 1]; - } - return str.substr(0, len); -} - -void InitMaterial(ObjLoader::material_t& material) -{ - material.name = ""; - material.ambient_texname = ""; - material.diffuse_texname = ""; - material.specular_texname = ""; - material.normal_texname = ""; - for (int i = 0; i < 3; i ++) - { - material.ambient[i] = 0.f; - material.diffuse[i] = 0.f; - material.specular[i] = 0.f; - material.transmittance[i] = 0.f; - material.emission[i] = 0.f; - } - material.illum = 0; - material.dissolve = 1.f; - material.shininess = 1.f; - material.unknown_parameter.clear(); -} - -static std::string& replacePathSeperator(std::string& path) -{ - for (int i = 0; i < path.size(); i++) { - if (path[i] == '\\') - path[i] = '/'; - } - return path; -} - -std::string LoadMtl ( std::map& material_map, const char* filename, const char* mtl_basepath) -{ - material_map.clear(); - std::stringstream err; - - std::string filepath; - - if (mtl_basepath) - { - filepath = std::string(mtl_basepath) + std::string(filename); - } - else - { - filepath = std::string(filename); - } - - std::istringstream ifs(FileUtils::getInstance()->getStringFromFile(filepath)); - if (!ifs) - { - err << "Cannot open file [" << filepath << "]" << std::endl; - return err.str(); - } - - ObjLoader::material_t material; - - int maxchars = 8192; // Alloc enough size. - std::vector buf(maxchars); // Alloc enough size. - while (ifs.peek() != -1) - { - ifs.getline(&buf[0], maxchars); - - std::string linebuf(&buf[0]); - - // Trim newline '\r\n' or '\r' - if (linebuf.size() > 0) - { - if (linebuf[linebuf.size()-1] == '\n') linebuf.erase(linebuf.size()-1); - } - if (linebuf.size() > 0) - { - if (linebuf[linebuf.size()-1] == '\n') linebuf.erase(linebuf.size()-1); - } - - // Skip if empty line. - if (linebuf.empty()) - { - continue; - } - - // Skip leading space. - const char* token = linebuf.c_str(); - token += strspn(token, " \t"); - - assert(token); - if (token[0] == '\0') continue; // empty line - - if (token[0] == '#') continue; // comment line - - // new mtl - if ((0 == strncmp(token, "newmtl", 6)) && isSpace((token[6]))) - { - // flush previous material. - material_map.insert(std::pair(material.name, material)); + size_t npolys = face.size(); - // initial temporary material - InitMaterial(material); + // Polygon -> triangle fan conversion + for (size_t k = 2; k < npolys; k++) { + i1 = i2; + i2 = face[k]; + + unsigned int v0 = updateVertex( + vertexCache, shape.mesh.positions, shape.mesh.normals, + shape.mesh.texcoords, in_positions, in_normals, in_texcoords, i0); + unsigned int v1 = updateVertex( + vertexCache, shape.mesh.positions, shape.mesh.normals, + shape.mesh.texcoords, in_positions, in_normals, in_texcoords, i1); + unsigned int v2 = updateVertex( + vertexCache, shape.mesh.positions, shape.mesh.normals, + shape.mesh.texcoords, in_positions, in_normals, in_texcoords, i2); + + shape.mesh.indices.push_back(v0); + shape.mesh.indices.push_back(v1); + shape.mesh.indices.push_back(v2); + + shape.mesh.material_ids.push_back(material_id); + } + } + + shape.name = name; + + if (clearCache) + vertexCache.clear(); + + return true; + } + + std::string LoadMtl(std::map &material_map, + std::vector &materials, + std::istream &inStream) { + std::stringstream err; + + // Create a default material anyway. + material_t material; + InitMaterial(material); + + int maxchars = 8192; // Alloc enough size. + std::vector buf(maxchars); // Alloc enough size. + while (inStream.peek() != -1) { + inStream.getline(&buf[0], maxchars); - // set new mtl name - char namebuf[4096]; - token += 7; - sscanf(token, "%s", namebuf); - material.name = namebuf; - continue; - } - - // ambient - if (token[0] == 'K' && token[1] == 'a' && isSpace((token[2]))) - { - token += 2; - float r, g, b; - parseFloat3(r, g, b, token); - material.ambient[0] = r; - material.ambient[1] = g; - material.ambient[2] = b; - continue; - } - - // diffuse - if (token[0] == 'K' && token[1] == 'd' && isSpace((token[2]))) - { - token += 2; - float r, g, b; - parseFloat3(r, g, b, token); - material.diffuse[0] = r; - material.diffuse[1] = g; - material.diffuse[2] = b; - continue; - } - - // specular - if (token[0] == 'K' && token[1] == 's' && isSpace((token[2]))) - { - token += 2; - float r, g, b; - parseFloat3(r, g, b, token); - material.specular[0] = r; - material.specular[1] = g; - material.specular[2] = b; - continue; - } - - // transmittance - if (token[0] == 'K' && token[1] == 't' && isSpace((token[2]))) - { - token += 2; - float r, g, b; - parseFloat3(r, g, b, token); - material.transmittance[0] = r; - material.transmittance[1] = g; - material.transmittance[2] = b; - continue; - } - - // ior(index of refraction) - if (token[0] == 'N' && token[1] == 'i' && isSpace((token[2]))) - { - token += 2; - material.ior = parseFloat(token); - continue; - } - - // emission - if(token[0] == 'K' && token[1] == 'e' && isSpace(token[2])) - { - token += 2; - float r, g, b; - parseFloat3(r, g, b, token); - material.emission[0] = r; - material.emission[1] = g; - material.emission[2] = b; - continue; - } - - // shininess - if(token[0] == 'N' && token[1] == 's' && isSpace(token[2])) - { - token += 2; - material.shininess = parseFloat(token); - continue; - } - - // illum model - if (0 == strncmp(token, "illum", 5) && isSpace(token[5])) - { - token += 6; - material.illum = parseInt(token); - continue; - } - - // dissolve - if ((token[0] == 'd' && isSpace(token[1]))) - { - token += 1; - material.dissolve = parseFloat(token); - continue; - } - if (token[0] == 'T' && token[1] == 'r' && isSpace(token[2])) - { - token += 2; - material.dissolve = parseFloat(token); - continue; - } - - // ambient texture - if ((0 == strncmp(token, "map_Ka", 6)) && isSpace(token[6])) - { - token += 7; - material.ambient_texname = trim(token); - replacePathSeperator(material.ambient_texname); - continue; - } - - // diffuse texture - if ((0 == strncmp(token, "map_Kd", 6)) && isSpace(token[6])) - { - token += 7; - material.diffuse_texname = trim(token); - replacePathSeperator(material.diffuse_texname); - continue; - } - - // specular texture - if ((0 == strncmp(token, "map_Ks", 6)) && isSpace(token[6])) - { - token += 7; - material.specular_texname = trim(token); - replacePathSeperator(material.specular_texname); - continue; - } - - // normal texture - if ((0 == strncmp(token, "map_Ns", 6)) && isSpace(token[6])) - { - token += 7; - material.normal_texname = trim(token); - replacePathSeperator(material.normal_texname); - continue; - } - - // unknown parameter - const char* _space = strchr(token, ' '); - if(!_space) - { - _space = strchr(token, '\t'); - } - if(_space) - { - auto len = _space - token; - std::string key(token, len); - std::string value = _space + 1; - material.unknown_parameter.insert(std::pair(key, value)); - } - } - // flush last material. - material_map.insert(std::pair(material.name, material)); - return err.str(); -} - -std::string ObjLoader::LoadObj(shapes_t& shapes, const char* filename, const char* mtl_basepath) -{ - shapes.reset(); - - std::stringstream err; - std::istringstream ifs(FileUtils::getInstance()->getStringFromFile(filename)); - std::map vertexCache; - //std::ifstream ifs(filename); - - if (!ifs) - { - err << "Cannot open file [" << filename << "]" << std::endl; - return err.str(); - } - - std::vector v; - std::vector vn; - std::vector vt; - std::vector > faceGroup; - std::string name; - - // material - std::map material_map; - material_t material; - - int maxchars = 8192; // Alloc enough size. - std::vector buf(maxchars); // Alloc enough size. - while (ifs.peek() != -1) - { - ifs.getline(&buf[0], maxchars); - - std::string linebuf(&buf[0]); - - // Trim newline '\r\n' or '\r' - if (linebuf.size() > 0) - { - if (linebuf[linebuf.size()-1] == '\n') linebuf.erase(linebuf.size()-1); - } - if (linebuf.size() > 0) - { - if (linebuf[linebuf.size()-1] == '\n') linebuf.erase(linebuf.size()-1); - } - - // Skip if empty line. - if (linebuf.empty()) - { - continue; - } - - // Skip leading space. - const char* token = linebuf.c_str(); - token += strspn(token, " \t"); - - assert(token); - if (token[0] == '\0') continue; // empty line - - if (token[0] == '#') continue; // comment line - - // vertex - if (token[0] == 'v' && isSpace((token[1]))) - { - token += 2; - float x, y, z; - parseFloat3(x, y, z, token); - v.push_back(x); - v.push_back(y); - v.push_back(z); - continue; - } - - // normal - if (token[0] == 'v' && token[1] == 'n' && isSpace((token[2]))) - { - token += 3; - float x, y, z; - parseFloat3(x, y, z, token); - vn.push_back(x); - vn.push_back(y); - vn.push_back(z); - continue; - } - - // texcoord - if (token[0] == 'v' && token[1] == 't' && isSpace((token[2]))) - { - token += 3; - float x, y; - parseFloat2(x, y, token); - vt.push_back(x); - vt.push_back(y); - continue; - } - - // face - if (token[0] == 'f' && isSpace((token[1]))) - { - token += 2; + std::string linebuf(&buf[0]); + + // Trim newline '\r\n' or '\n' + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\n') + linebuf.erase(linebuf.size() - 1); + } + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\r') + linebuf.erase(linebuf.size() - 1); + } + + // Skip if empty line. + if (linebuf.empty()) { + continue; + } + + // Skip leading space. + const char *token = linebuf.c_str(); token += strspn(token, " \t"); - std::vector face; - while (!isNewLine(token[0])) { - // fix warning, cast to int, i think int is enough - vertex_index vi = parseTriple(token, (int)v.size() / 3, (int)vn.size() / 3, (int)vt.size() / 2); - face.push_back(vi); - auto n = strspn(token, " \t\r"); - token += n; - } + assert(token); + if (token[0] == '\0') + continue; // empty line - faceGroup.push_back(face); + if (token[0] == '#') + continue; // comment line - continue; - } - - // use mtl - if ((0 == strncmp(token, "usemtl", 6)) && isSpace((token[6]))) - { - exportFaceGroupToShape(vertexCache, shapes, v, vn, vt, faceGroup, material, name); - faceGroup.clear(); - - char namebuf[4096]; - token += 7; - sscanf(token, "%s", namebuf); - - if (material_map.find(namebuf) != material_map.end()) - { - material = material_map[namebuf]; - } - else - { - // { error!! material not found } + // new mtl + if ((0 == strncmp(token, "newmtl", 6)) && isSpace((token[6]))) { + // flush previous material. + if (!material.name.empty()) { + material_map.insert( + std::pair(material.name, static_cast(materials.size()))); + materials.push_back(material); + } + + // initial temporary material InitMaterial(material); + + // set new mtl name + char namebuf[TINYOBJ_SSCANF_BUFFER_SIZE]; + token += 7; +#ifdef _MSC_VER + sscanf_s(token, "%s", namebuf, _countof(namebuf)); +#else + sscanf(token, "%s", namebuf); +#endif + material.name = namebuf; + continue; } - continue; + // ambient + if (token[0] == 'K' && token[1] == 'a' && isSpace((token[2]))) { + token += 2; + float r, g, b; + parseFloat3(r, g, b, token); + material.ambient[0] = r; + material.ambient[1] = g; + material.ambient[2] = b; + continue; + } + + // diffuse + if (token[0] == 'K' && token[1] == 'd' && isSpace((token[2]))) { + token += 2; + float r, g, b; + parseFloat3(r, g, b, token); + material.diffuse[0] = r; + material.diffuse[1] = g; + material.diffuse[2] = b; + continue; + } + + // specular + if (token[0] == 'K' && token[1] == 's' && isSpace((token[2]))) { + token += 2; + float r, g, b; + parseFloat3(r, g, b, token); + material.specular[0] = r; + material.specular[1] = g; + material.specular[2] = b; + continue; + } + + // transmittance + if (token[0] == 'K' && token[1] == 't' && isSpace((token[2]))) { + token += 2; + float r, g, b; + parseFloat3(r, g, b, token); + material.transmittance[0] = r; + material.transmittance[1] = g; + material.transmittance[2] = b; + continue; + } + + // ior(index of refraction) + if (token[0] == 'N' && token[1] == 'i' && isSpace((token[2]))) { + token += 2; + material.ior = parseFloat(token); + continue; + } + + // emission + if (token[0] == 'K' && token[1] == 'e' && isSpace(token[2])) { + token += 2; + float r, g, b; + parseFloat3(r, g, b, token); + material.emission[0] = r; + material.emission[1] = g; + material.emission[2] = b; + continue; + } + + // shininess + if (token[0] == 'N' && token[1] == 's' && isSpace(token[2])) { + token += 2; + material.shininess = parseFloat(token); + continue; + } + + // illum model + if (0 == strncmp(token, "illum", 5) && isSpace(token[5])) { + token += 6; + material.illum = parseInt(token); + continue; + } + + // dissolve + if ((token[0] == 'd' && isSpace(token[1]))) { + token += 1; + material.dissolve = parseFloat(token); + continue; + } + if (token[0] == 'T' && token[1] == 'r' && isSpace(token[2])) { + token += 2; + // Invert value of Tr(assume Tr is in range [0, 1]) + material.dissolve = 1.0 - parseFloat(token); + continue; + } + + // ambient texture + if ((0 == strncmp(token, "map_Ka", 6)) && isSpace(token[6])) { + token += 7; + material.ambient_texname = token; + continue; + } + + // diffuse texture + if ((0 == strncmp(token, "map_Kd", 6)) && isSpace(token[6])) { + token += 7; + material.diffuse_texname = token; + continue; + } + + // specular texture + if ((0 == strncmp(token, "map_Ks", 6)) && isSpace(token[6])) { + token += 7; + material.specular_texname = token; + continue; + } + + // normal texture + if ((0 == strncmp(token, "map_Ns", 6)) && isSpace(token[6])) { + token += 7; + material.normal_texname = token; + continue; + } + + // unknown parameter + const char *_space = strchr(token, ' '); + if (!_space) { + _space = strchr(token, '\t'); + } + if (_space) { + std::ptrdiff_t len = _space - token; + std::string key(token, len); + std::string value = _space + 1; + material.unknown_parameter.insert( + std::pair(key, value)); + } } + // flush last material. + material_map.insert( + std::pair(material.name, static_cast(materials.size()))); + materials.push_back(material); - // load mtl - if ((0 == strncmp(token, "mtllib", 6)) && isSpace((token[6]))) - { - char namebuf[4096]; - token += 7; - sscanf(token, "%s", namebuf); - - std::string err_mtl = LoadMtl(material_map, namebuf, mtl_basepath); - if (!err_mtl.empty()) - { - faceGroup.clear(); // for safety - //return err_mtl; - } - continue; - } - - // group name - if (token[0] == 'g' && isSpace((token[1]))) - { - // flush previous face group. - shape_t shape; - exportFaceGroupToShape(vertexCache, shapes, v, vn, vt, faceGroup, material, name); - - faceGroup.clear(); - - std::vector names; - while (!isNewLine(token[0])) - { - std::string str = parseString(token); - names.push_back(str); - token += strspn(token, " \t\r"); // skip tag - } - - assert(names.size() > 0); - - // names[0] must be 'g', so skipt 0th element. - if (names.size() > 1) - { - name = names[1]; - } - else - { - name = ""; - } - - continue; - } - - // object name - if (token[0] == 'o' && isSpace((token[1]))) - { - // flush previous face group. - shape_t shape; - exportFaceGroupToShape(vertexCache, shapes, v, vn, vt, faceGroup, material, name); - - faceGroup.clear(); - - // @todo { multiple object name? } - char namebuf[4096]; - token += 2; - sscanf(token, "%s", namebuf); - name = std::string(namebuf); - - continue; - } - - // Ignore unknown command. + return err.str(); } - shape_t shape; - exportFaceGroupToShape(vertexCache, shapes, v, vn, vt, faceGroup, material, name); - faceGroup.clear(); // for safety + std::string MaterialFileReader::operator()(const std::string &matId, + std::vector &materials, + std::map &matMap) { + std::string filepath; + + if (!m_mtlBasePath.empty()) { + filepath = std::string(m_mtlBasePath) + matId; + } else { + filepath = matId; + } + + std::ifstream matIStream(filepath.c_str()); + std::string err = LoadMtl(matMap, materials, matIStream); + if (!matIStream) { + std::stringstream ss; + ss << "WARN: Material file [ " << filepath << " ] not found. Created a default material."; + err += ss.str(); + } + return err; + } - return err.str(); + std::string LoadObj(std::vector &shapes, + std::vector &materials, // [output] + const char *filename, const char *mtl_basepath) { + + shapes.clear(); + + std::stringstream err; + + std::ifstream ifs(filename); + if (!ifs) { + err << "Cannot open file [" << filename << "]" << std::endl; + return err.str(); + } + + std::string basePath; + if (mtl_basepath) { + basePath = mtl_basepath; + } + MaterialFileReader matFileReader(basePath); + + return LoadObj(shapes, materials, ifs, matFileReader); + } + + std::string LoadObj(std::vector &shapes, + std::vector &materials, // [output] + std::istream &inStream, MaterialReader &readMatFn) { + std::stringstream err; + + std::vector v; + std::vector vn; + std::vector vt; + std::vector > faceGroup; + std::string name; + + // material + std::map material_map; + std::map vertexCache; + int material = -1; + + shape_t shape; + + int maxchars = 8192; // Alloc enough size. + std::vector buf(maxchars); // Alloc enough size. + while (inStream.peek() != -1) { + inStream.getline(&buf[0], maxchars); + + std::string linebuf(&buf[0]); + + // Trim newline '\r\n' or '\n' + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\n') + linebuf.erase(linebuf.size() - 1); + } + if (linebuf.size() > 0) { + if (linebuf[linebuf.size() - 1] == '\r') + linebuf.erase(linebuf.size() - 1); + } + + // Skip if empty line. + if (linebuf.empty()) { + continue; + } + + // Skip leading space. + const char *token = linebuf.c_str(); + token += strspn(token, " \t"); + + assert(token); + if (token[0] == '\0') + continue; // empty line + + if (token[0] == '#') + continue; // comment line + + // vertex + if (token[0] == 'v' && isSpace((token[1]))) { + token += 2; + float x, y, z; + parseFloat3(x, y, z, token); + v.push_back(x); + v.push_back(y); + v.push_back(z); + continue; + } + + // normal + if (token[0] == 'v' && token[1] == 'n' && isSpace((token[2]))) { + token += 3; + float x, y, z; + parseFloat3(x, y, z, token); + vn.push_back(x); + vn.push_back(y); + vn.push_back(z); + continue; + } + + // texcoord + if (token[0] == 'v' && token[1] == 't' && isSpace((token[2]))) { + token += 3; + float x, y; + parseFloat2(x, y, token); + vt.push_back(x); + vt.push_back(y); + continue; + } + + // face + if (token[0] == 'f' && isSpace((token[1]))) { + token += 2; + token += strspn(token, " \t"); + + std::vector face; + while (!isNewLine(token[0])) { + vertex_index vi = + parseTriple(token, static_cast(v.size() / 3), static_cast(vn.size() / 3), static_cast(vt.size() / 2)); + face.push_back(vi); + size_t n = strspn(token, " \t\r"); + token += n; + } + + faceGroup.push_back(face); + + continue; + } + + // use mtl + if ((0 == strncmp(token, "usemtl", 6)) && isSpace((token[6]))) { + + char namebuf[TINYOBJ_SSCANF_BUFFER_SIZE]; + token += 7; +#ifdef _MSC_VER + sscanf_s(token, "%s", namebuf, _countof(namebuf)); +#else + sscanf(token, "%s", namebuf); +#endif + + // Create face group per material. + bool ret = exportFaceGroupToShape(shape, vertexCache, v, vn, vt, + faceGroup, material, name, true); + if (ret) { + shapes.push_back(shape); + } + shape = shape_t(); + faceGroup.clear(); + + if (material_map.find(namebuf) != material_map.end()) { + material = material_map[namebuf]; + } else { + // { error!! material not found } + material = -1; + } + + continue; + } + + // load mtl + if ((0 == strncmp(token, "mtllib", 6)) && isSpace((token[6]))) { + char namebuf[TINYOBJ_SSCANF_BUFFER_SIZE]; + token += 7; +#ifdef _MSC_VER + sscanf_s(token, "%s", namebuf, _countof(namebuf)); +#else + sscanf(token, "%s", namebuf); +#endif + + std::string err_mtl = readMatFn(namebuf, materials, material_map); + if (!err_mtl.empty()) { + faceGroup.clear(); // for safety + return err_mtl; + } + + continue; + } + + // group name + if (token[0] == 'g' && isSpace((token[1]))) { + + // flush previous face group. + bool ret = exportFaceGroupToShape(shape, vertexCache, v, vn, vt, + faceGroup, material, name, true); + if (ret) { + shapes.push_back(shape); + } + + shape = shape_t(); + + // material = -1; + faceGroup.clear(); + + std::vector names; + while (!isNewLine(token[0])) { + std::string str = parseString(token); + names.push_back(str); + token += strspn(token, " \t\r"); // skip tag + } + + assert(names.size() > 0); + + // names[0] must be 'g', so skip the 0th element. + if (names.size() > 1) { + name = names[1]; + } else { + name = ""; + } + + continue; + } + + // object name + if (token[0] == 'o' && isSpace((token[1]))) { + + // flush previous face group. + bool ret = exportFaceGroupToShape(shape, vertexCache, v, vn, vt, + faceGroup, material, name, true); + if (ret) { + shapes.push_back(shape); + } + + // material = -1; + faceGroup.clear(); + shape = shape_t(); + + // @todo { multiple object name? } + char namebuf[TINYOBJ_SSCANF_BUFFER_SIZE]; + token += 2; +#ifdef _MSC_VER + sscanf_s(token, "%s", namebuf, _countof(namebuf)); +#else + sscanf(token, "%s", namebuf); +#endif + name = std::string(namebuf); + + continue; + } + + // Ignore unknown command. + } + + bool ret = exportFaceGroupToShape(shape, vertexCache, v, vn, vt, faceGroup, + material, name, true); + if (ret) { + shapes.push_back(shape); + } + faceGroup.clear(); // for safety + + return err.str(); + } } - -NS_CC_END diff --git a/cocos/3d/CCObjLoader.h b/cocos/3d/CCObjLoader.h index 3a9d38b3d5..fcdfee3632 100644 --- a/cocos/3d/CCObjLoader.h +++ b/cocos/3d/CCObjLoader.h @@ -1,40 +1,19 @@ // -// Copyright 2012-2013, Syoyo Fujita. +// Copyright 2012-2015, Syoyo Fujita. // // Licensed under 2-clause BSD liecense. // -// copied from Syoyo Fujita -// https://github.com/syoyo/tinyobjloader - -#ifndef __CCOBJLOADER_H__ -#define __CCOBJLOADER_H__ +//https://github.com/syoyo/tinyobjloader +#ifndef _TINY_OBJ_LOADER_H +#define _TINY_OBJ_LOADER_H #include #include #include -#include "base/ccTypes.h" -NS_CC_BEGIN - -/** - * @addtogroup _3d - * @{ - */ - -/** - * @brief .obj file Loader - * @js NA - * @lua NA - **/ -class ObjLoader -{ -public: - - /** - * model's material struct - **/ - typedef struct - { +namespace tinyobj { + + typedef struct { std::string name; float ambient[3]; @@ -43,8 +22,8 @@ public: float transmittance[3]; float emission[3]; float shininess; - float ior; // index of refraction - float dissolve; // 1 == opaque; 0 == fully transparent + float ior; // index of refraction + float dissolve; // 1 == opaque; 0 == fully transparent // illumination model (see http://www.fileformat.info/format/material/) int illum; @@ -55,61 +34,62 @@ public: std::map unknown_parameter; } material_t; - /** - * model's indices struct - **/ - typedef struct - { - std::vector indices; + typedef struct { + std::vector positions; + std::vector normals; + std::vector texcoords; + std::vector indices; + std::vector material_ids; // per-mesh material ID } mesh_t; - /** - * model's shape struct - **/ - typedef struct - { - std::string name; - material_t material; - mesh_t mesh; + typedef struct { + std::string name; + mesh_t mesh; } shape_t; - /** - * model's shapes struct - **/ - typedef struct - { - std::vector positions; - std::vector normals; - std::vector texcoords; + class MaterialReader { + public: + MaterialReader() {} + virtual ~MaterialReader() {} - std::vector shapes; - - void reset() - { - positions.clear(); - normals.clear(); - texcoords.clear(); - shapes.clear(); - } - }shapes_t; + virtual std::string operator()(const std::string &matId, + std::vector &materials, + std::map &matMap) = 0; + }; - /** - * Loads .obj from a file. - * @param shapes will be filled with parsed shape data - * @param filename the .obj file path . - * @param mtl_basepath It's optional, and used for base path for .mtl file - * @return The function returns error string, return empty string when loading .obj success. - */ - static std::string LoadObj( - shapes_t& shapes, // [output] - const char* filename, - const char* mtl_basepath = NULL); + class MaterialFileReader : public MaterialReader { + public: + MaterialFileReader(const std::string &mtl_basepath) + : m_mtlBasePath(mtl_basepath) {} + virtual ~MaterialFileReader() {} + virtual std::string operator()(const std::string &matId, + std::vector &materials, + std::map &matMap); + + private: + std::string m_mtlBasePath; + }; + + /// Loads .obj from a file. + /// 'shapes' will be filled with parsed shape data + /// The function returns error string. + /// Returns empty string when loading .obj success. + /// 'mtl_basepath' is optional, and used for base path for .mtl file. + std::string LoadObj(std::vector &shapes, // [output] + std::vector &materials, // [output] + const char *filename, const char *mtl_basepath = NULL); + + /// Loads object from a std::istream, uses GetMtlIStreamFn to retrieve + /// std::istream for materials. + /// Returns empty string when loading .obj success. + std::string LoadObj(std::vector &shapes, // [output] + std::vector &materials, // [output] + std::istream &inStream, MaterialReader &readMatFn); + + /// Loads materials into std::map + /// Returns an empty string if successful + std::string LoadMtl(std::map &material_map, + std::vector &materials, std::istream &inStream); +} -}; - -// end of 3d group -/// @} - -NS_CC_END - -#endif // _TINY_OBJ_LOADER_H +#endif // _TINY_OBJ_LOADER_H From 40b33604d8dda394e00efc0422e8a4b1ca953ac1 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 8 Jul 2015 13:44:15 +0800 Subject: [PATCH 24/93] adjust objloader to cocos --- cocos/3d/CCObjLoader.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/cocos/3d/CCObjLoader.cpp b/cocos/3d/CCObjLoader.cpp index 92da4d9495..2cf6100564 100644 --- a/cocos/3d/CCObjLoader.cpp +++ b/cocos/3d/CCObjLoader.cpp @@ -35,6 +35,8 @@ #include #include #include +#include "platform/CCFileUtils.h" +#include "base/ccUtils.h" #include "CCObjLoader.h" @@ -242,7 +244,7 @@ namespace tinyobj { static inline float parseFloat(const char *&token) { token += strspn(token, " \t"); #ifdef TINY_OBJ_LOADER_OLD_FLOAT_PARSER - float f = (float)atof(token); + float f = (float)utils::atof(token); token += strcspn(token, " \t\r"); #else const char *end = token + strcspn(token, " \t\r"); @@ -410,6 +412,15 @@ namespace tinyobj { return true; } + static std::string& replacePathSeperator(std::string& path) + { + for (int i = 0; i < path.size(); i++) { + if (path[i] == '\\') + path[i] = '/'; + } + return path; + } + std::string LoadMtl(std::map &material_map, std::vector &materials, std::istream &inStream) { @@ -569,6 +580,7 @@ namespace tinyobj { if ((0 == strncmp(token, "map_Ka", 6)) && isSpace(token[6])) { token += 7; material.ambient_texname = token; + replacePathSeperator(material.ambient_texname); continue; } @@ -576,6 +588,7 @@ namespace tinyobj { if ((0 == strncmp(token, "map_Kd", 6)) && isSpace(token[6])) { token += 7; material.diffuse_texname = token; + replacePathSeperator(material.diffuse_texname); continue; } @@ -583,6 +596,7 @@ namespace tinyobj { if ((0 == strncmp(token, "map_Ks", 6)) && isSpace(token[6])) { token += 7; material.specular_texname = token; + replacePathSeperator(material.specular_texname); continue; } @@ -590,6 +604,7 @@ namespace tinyobj { if ((0 == strncmp(token, "map_Ns", 6)) && isSpace(token[6])) { token += 7; material.normal_texname = token; + replacePathSeperator(material.normal_texname); continue; } @@ -625,7 +640,7 @@ namespace tinyobj { filepath = matId; } - std::ifstream matIStream(filepath.c_str()); + std::istringstream matIStream(cocos2d::FileUtils::getInstance()->getStringFromFile(filepath)); std::string err = LoadMtl(matMap, materials, matIStream); if (!matIStream) { std::stringstream ss; @@ -643,7 +658,7 @@ namespace tinyobj { std::stringstream err; - std::ifstream ifs(filename); + std::istringstream ifs(cocos2d::FileUtils::getInstance()->getStringFromFile(filename)); if (!ifs) { err << "Cannot open file [" << filename << "]" << std::endl; return err.str(); From dac84ade0d088d07fb215a3f11c447e3b5ec7850 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 8 Jul 2015 14:03:53 +0800 Subject: [PATCH 25/93] index to short --- cocos/3d/CCObjLoader.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/3d/CCObjLoader.h b/cocos/3d/CCObjLoader.h index fcdfee3632..2c23dd4b5a 100644 --- a/cocos/3d/CCObjLoader.h +++ b/cocos/3d/CCObjLoader.h @@ -38,7 +38,7 @@ namespace tinyobj { std::vector positions; std::vector normals; std::vector texcoords; - std::vector indices; + std::vector indices; std::vector material_ids; // per-mesh material ID } mesh_t; From f7cdd7162b84e40adffb919f41236b52b11faf34 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 8 Jul 2015 15:33:43 +0800 Subject: [PATCH 26/93] adapter according to latest objloader --- cocos/3d/CCBundle3D.cpp | 155 +++++++++++++++++++++++----------------- 1 file changed, 89 insertions(+), 66 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index b683e93e84..f8dbc9ff76 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -216,73 +216,24 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD else mtlPath = fullPath.substr(0, fullPath.find_last_of("\\/") + 1).c_str(); - ObjLoader::shapes_t shapes; - auto ret = ObjLoader::LoadObj(shapes, fullPath.c_str(), mtlPath.c_str()); + std::vector shapes; + std::vector materials; + auto ret = tinyobj::LoadObj(shapes, materials, fullPath.c_str(), mtlPath.c_str()); if (ret.empty()) { //fill data - MeshData* meshdata = new (std::nothrow) MeshData(); - MeshVertexAttrib attrib; - attrib.size = 3; - attrib.type = GL_FLOAT; - if (shapes.positions.size()) - { - attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; - attrib.attribSizeBytes = attrib.size * sizeof(float); - meshdata->attribs.push_back(attrib); - - } - bool hasnormal = false, hastex = false; - if (shapes.normals.size()) - { - hasnormal = true; - attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_NORMAL; - attrib.attribSizeBytes = attrib.size * sizeof(float);; - meshdata->attribs.push_back(attrib); - } - if (shapes.texcoords.size()) - { - hastex = true; - attrib.size = 2; - attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_TEX_COORD; - attrib.attribSizeBytes = attrib.size * sizeof(float); - meshdata->attribs.push_back(attrib); - } - auto vertexNum = shapes.positions.size() / 3; - for(unsigned int i = 0; i < vertexNum; i++) - { - meshdata->vertex.push_back(shapes.positions[i * 3]); - meshdata->vertex.push_back(shapes.positions[i * 3 + 1]); - meshdata->vertex.push_back(shapes.positions[i * 3 + 2]); - - if (hasnormal) - { - meshdata->vertex.push_back(shapes.normals[i * 3]); - meshdata->vertex.push_back(shapes.normals[i * 3 + 1]); - meshdata->vertex.push_back(shapes.normals[i * 3 + 2]); - } - - if (hastex) - { - meshdata->vertex.push_back(shapes.texcoords[i * 2]); - meshdata->vertex.push_back(shapes.texcoords[i * 2 + 1]); - } - } - meshdatas.meshDatas.push_back(meshdata); - + //convert material int i = 0; char str[20]; std::string dir = ""; auto last = fullPath.rfind("/"); if (last != -1) dir = fullPath.substr(0, last + 1); - - for (const auto& it : shapes.shapes) - { + for (auto& material : materials) { NMaterialData materialdata; NTextureData tex; - tex.filename = it.material.diffuse_texname.empty() ? it.material.diffuse_texname : dir + it.material.diffuse_texname; + tex.filename = material.diffuse_texname.empty() ? material.diffuse_texname : dir + material.diffuse_texname; tex.type = NTextureData::Usage::Diffuse; tex.wrapS = GL_CLAMP_TO_EDGE; tex.wrapT = GL_CLAMP_TO_EDGE; @@ -290,19 +241,91 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD sprintf(str, "%d", i++); materialdata.textures.push_back(tex); materialdata.id = str; + material.name = str; materialdatas.materials.push_back(materialdata); - - meshdata->subMeshIndices.push_back(it.mesh.indices); - meshdata->subMeshAABB.push_back(calculateAABB(meshdata->vertex, meshdata->getPerVertexSize(), it.mesh.indices)); - meshdata->subMeshIds.push_back(str); - auto node = new (std::nothrow) NodeData(); - auto modelnode = new (std::nothrow) ModelData(); - modelnode->matrialId = str; - modelnode->subMeshId = str; - node->id = it.name; - node->modelNodeDatas.push_back(modelnode); - nodedatas.nodes.push_back(node); } + + //convert mesh + i = 0; + for (auto& shape : shapes) { + auto mesh = shape.mesh; + MeshData* meshdata = new (std::nothrow) MeshData(); + MeshVertexAttrib attrib; + attrib.size = 3; + attrib.type = GL_FLOAT; + + if (mesh.positions.size()) + { + attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; + attrib.attribSizeBytes = attrib.size * sizeof(float); + meshdata->attribs.push_back(attrib); + + } + bool hasnormal = false, hastex = false; + if (mesh.normals.size()) + { + hasnormal = true; + attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_NORMAL; + attrib.attribSizeBytes = attrib.size * sizeof(float);; + meshdata->attribs.push_back(attrib); + } + if (mesh.texcoords.size()) + { + hastex = true; + attrib.size = 2; + attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_TEX_COORD; + attrib.attribSizeBytes = attrib.size * sizeof(float); + meshdata->attribs.push_back(attrib); + } + + auto vertexNum = mesh.positions.size() / 3; + for(unsigned int k = 0; k < vertexNum; k++) + { + meshdata->vertex.push_back(mesh.positions[k * 3]); + meshdata->vertex.push_back(mesh.positions[k * 3 + 1]); + meshdata->vertex.push_back(mesh.positions[k * 3 + 2]); + + if (hasnormal) + { + meshdata->vertex.push_back(mesh.normals[k * 3]); + meshdata->vertex.push_back(mesh.normals[k * 3 + 1]); + meshdata->vertex.push_back(mesh.normals[k * 3 + 2]); + } + + if (hastex) + { + meshdata->vertex.push_back(mesh.texcoords[k * 2]); + meshdata->vertex.push_back(mesh.texcoords[k * 2 + 1]); + } + } + + //split into submesh according to material + std::map > subMeshMap; + for (size_t k = 0; k < mesh.material_ids.size(); k++) { + int id = mesh.material_ids[k]; + size_t idx = k * 3; + subMeshMap[id].push_back(mesh.indices[idx]); + subMeshMap[id].push_back(mesh.indices[idx + 1]); + subMeshMap[id].push_back(mesh.indices[idx + 2]); + } + + auto node = new (std::nothrow) NodeData(); + node->id = shape.name; + for (auto& submesh : subMeshMap) { + meshdata->subMeshIndices.push_back(submesh.second); + meshdata->subMeshAABB.push_back(calculateAABB(meshdata->vertex, meshdata->getPerVertexSize(), submesh.second)); + sprintf(str, "%d", i++); + meshdata->subMeshIds.push_back(str); + + auto modelnode = new (std::nothrow) ModelData(); + modelnode->matrialId = submesh.first == -1 ? "" : materials[submesh.first].name; + modelnode->subMeshId = str; + node->modelNodeDatas.push_back(modelnode); + } + nodedatas.nodes.push_back(node); + meshdatas.meshDatas.push_back(meshdata); + } + return true; } CCLOG("warning: load %s file error: %s", fullPath.c_str(), ret.c_str()); From 7a36a57aff0cc4eda671b0ffcf798da074da5dee Mon Sep 17 00:00:00 2001 From: Daniele Di Bernardo Date: Wed, 8 Jul 2015 10:03:03 +0200 Subject: [PATCH 27/93] Fixed inertial scrolling for `CCScrollView` The inertial scrolling in `CCScrollView` usually works only if you're using the `Direction::BOTH` direction, and if there's enough scrolling space *both* on the X and the Y axis. But when you use the `Direction::HORIZONTAL` or `Direction::VERTICAL` directions you usually have 0px of available space on the Y or X axis respectively, so it won't work. This change enables you to scroll the view just on the X or on the Y axis using `Direction::HORIZONTAL` or `Direction::VERTICAL` and to use the inertial scroll accordingly. --- extensions/GUI/CCScrollView/CCScrollView.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/GUI/CCScrollView/CCScrollView.cpp b/extensions/GUI/CCScrollView/CCScrollView.cpp index 74683aa522..7cf34a2502 100644 --- a/extensions/GUI/CCScrollView/CCScrollView.cpp +++ b/extensions/GUI/CCScrollView/CCScrollView.cpp @@ -436,8 +436,8 @@ void ScrollView::deaccelerateScrolling(float dt) if ((fabsf(_scrollDistance.x) <= SCROLL_DEACCEL_DIST && fabsf(_scrollDistance.y) <= SCROLL_DEACCEL_DIST) || - newY >= maxInset.y || newY <= minInset.y || - newX >= maxInset.x || newX <= minInset.x) + ((_direction == Direction::BOTH || _direction == Direction::VERTICAL) && (newY >= maxInset.y || newY <= minInset.y)) || + ((_direction == Direction::BOTH || _direction == Direction::HORIZONTAL) && (newX >= maxInset.x || newX <= minInset.x))) { this->unschedule(CC_SCHEDULE_SELECTOR(ScrollView::deaccelerateScrolling)); this->relocateContainer(true); From 0862d313b28c24dc5c822bd7418cc271aa326628 Mon Sep 17 00:00:00 2001 From: zhangcheng Date: Wed, 8 Jul 2015 16:13:38 +0800 Subject: [PATCH 28/93] Fix cocos reader bug. Fixes child nodes can't be rendered when particle and TiledMap as parent and their resource have been removed from disk. --- .../GameMapReader/GameMapReader.cpp | 15 ++++++--------- .../ParticleReader/ParticleReader.cpp | 19 ++++++++----------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/GameMapReader/GameMapReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/GameMapReader/GameMapReader.cpp index 903bba1811..476fa9b59e 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/GameMapReader/GameMapReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/GameMapReader/GameMapReader.cpp @@ -238,15 +238,12 @@ namespace cocostudio setPropsWithFlatBuffers(tmx, (Table*)gameMapOptions); } } - //else - //{ - // Node* node = Node::create(); - // setPropsWithFlatBuffers(node, (Table*)gameMapOptions); - // auto label = Label::create(); - // label->setString(__String::createWithFormat("%s missed", errorFilePath.c_str())->getCString()); - // node->addChild(label); - // return node; - //} + else + { + Node* node = Node::create(); + setPropsWithFlatBuffers(node, (Table*)gameMapOptions); + return node; + } return tmx; } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ParticleReader/ParticleReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ParticleReader/ParticleReader.cpp index 51f4f79e25..9e27769f0d 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ParticleReader/ParticleReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ParticleReader/ParticleReader.cpp @@ -153,11 +153,11 @@ namespace cocostudio void ParticleReader::setPropsWithFlatBuffers(cocos2d::Node *node, const flatbuffers::Table *particleOptions) { - auto particle = static_cast(node); + auto particle = dynamic_cast(node); auto options = (ParticleSystemOptions*)particleOptions; auto f_blendFunc = options->blendFunc(); - if (f_blendFunc) + if (particle && f_blendFunc) { cocos2d::BlendFunc blendFunc = cocos2d::BlendFunc::ALPHA_PREMULTIPLIED; blendFunc.src = f_blendFunc->src(); @@ -208,15 +208,12 @@ namespace cocostudio particle->setPositionType(ParticleSystem::PositionType::GROUPED); } } - //else - //{ - // Node* node = Node::create(); - // setPropsWithFlatBuffers(node, (Table*)particleOptions); - // auto label = Label::create(); - // label->setString(__String::createWithFormat("%s missed", errorFilePath.c_str())->getCString()); - // node->addChild(label); - // return node; - //} + else + { + Node* node = Node::create(); + setPropsWithFlatBuffers(node, (Table*)particleOptions); + return node; + } return particle; } From 97a17cdc8a22c5c423d188d5dd42909eaae0de13 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 8 Jul 2015 17:00:01 +0800 Subject: [PATCH 29/93] program created dummy texture instead of empty texture --- cocos/3d/CCMesh.cpp | 3 +++ cocos/3d/CCSprite3D.cpp | 17 +++++++---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cocos/3d/CCMesh.cpp b/cocos/3d/CCMesh.cpp index 8fc83e59f3..8239f9085f 100644 --- a/cocos/3d/CCMesh.cpp +++ b/cocos/3d/CCMesh.cpp @@ -273,6 +273,9 @@ void Mesh::setTexture(Texture2D* tex) // Texture must be saved for future use // it doesn't matter if the material is already set or not // This functionality is added for compatibility issues + if (tex == nullptr) + tex = getDummyTexture(); + if (tex != _texture) { CC_SAFE_RETAIN(tex); diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 2b60a9c530..e8890cc0c0 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -352,8 +352,7 @@ Sprite3D* Sprite3D::createSprite3DNode(NodeData* nodedata,ModelData* modeldata,c if (modeldata->matrialId == "" && materialdatas.materials.size()) { const NTextureData* textureData = materialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); - if (!textureData->filename.empty()) - mesh->setTexture(textureData->filename); + mesh->setTexture(textureData->filename); } else { @@ -361,9 +360,10 @@ Sprite3D* Sprite3D::createSprite3DNode(NodeData* nodedata,ModelData* modeldata,c if(materialData) { const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); - if(textureData && !textureData->filename.empty()) + if(textureData) { - auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); + mesh->setTexture(textureData->filename); + auto tex = mesh->getTexture(); if(tex) { Texture2D::TexParams texParams; @@ -372,10 +372,8 @@ Sprite3D* Sprite3D::createSprite3DNode(NodeData* nodedata,ModelData* modeldata,c texParams.wrapS = textureData->wrapS; texParams.wrapT = textureData->wrapT; tex->setTexParameters(texParams); - mesh->setTexture(tex); mesh->_isTransparent = (materialData->getTextureData(NTextureData::Usage::Transparency) != nullptr); } - } } } @@ -506,9 +504,10 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m if(materialData) { const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); - if(textureData && !textureData->filename.empty()) + if(textureData) { - auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); + mesh->setTexture(textureData->filename); + auto tex = mesh->getTexture(); if(tex) { Texture2D::TexParams texParams; @@ -517,10 +516,8 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m texParams.wrapS = textureData->wrapS; texParams.wrapT = textureData->wrapT; tex->setTexParameters(texParams); - mesh->setTexture(tex); mesh->_isTransparent = (materialData->getTextureData(NTextureData::Usage::Transparency) != nullptr); } - } } } From 30c79fea02517bc001bd1ca902284a1326d4b6e4 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 8 Jul 2015 17:19:30 +0800 Subject: [PATCH 30/93] Add auto bindings for Frame::g|setTweenType --- tools/bindings-generator | 2 +- tools/tolua/cocos2dx_studio.ini | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/bindings-generator b/tools/bindings-generator index 618fce7b25..473c1cfbbf 160000 --- a/tools/bindings-generator +++ b/tools/bindings-generator @@ -1 +1 @@ -Subproject commit 618fce7b257aa5d3c68c5671a9368a4685a6b823 +Subproject commit 473c1cfbbf164c04f1d7b173fdcd63418ff15067 diff --git a/tools/tolua/cocos2dx_studio.ini b/tools/tolua/cocos2dx_studio.ini index 399627b379..6f1de96edf 100644 --- a/tools/tolua/cocos2dx_studio.ini +++ b/tools/tolua/cocos2dx_studio.ini @@ -53,8 +53,7 @@ skip = *::[^visit$ copyWith.* onEnter.* onExit.* ^description$ getObjectType .* ActionObject::[initWithDictionary initWithBinary], BaseData::[copy subtract], ActionTimelineCache::[getInstance loadActionTimelineFromXML], - ActionTimeline::[setFrameEventCallFunc], - Frame::[(g|s)etTweenType] + ActionTimeline::[setFrameEventCallFunc] rename_functions = ActionManagerEx::[shareManager=getInstance purgeActionManager=destroyInstance], SceneReader::[purgeSceneReader=destroyInstance] From 5d50663c35f60dce182f3030a102911a4d4f71f9 Mon Sep 17 00:00:00 2001 From: Wenhai Lin Date: Wed, 8 Jul 2015 18:04:43 +0800 Subject: [PATCH 31/93] AudioEngine:support preload for audio[MAC/iOS] --- cocos/audio/apple/AudioEngine-inl.h | 2 +- cocos/audio/apple/AudioEngine-inl.mm | 31 +++++++++++++++++++--------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/cocos/audio/apple/AudioEngine-inl.h b/cocos/audio/apple/AudioEngine-inl.h index 862690411a..a623596502 100644 --- a/cocos/audio/apple/AudioEngine-inl.h +++ b/cocos/audio/apple/AudioEngine-inl.h @@ -61,7 +61,7 @@ public: void uncache(const std::string& filePath); void uncacheAll(); - + AudioCache* preload(const std::string& filePath); void update(float dt); private: diff --git a/cocos/audio/apple/AudioEngine-inl.mm b/cocos/audio/apple/AudioEngine-inl.mm index 01b4c9260b..b35d37d785 100644 --- a/cocos/audio/apple/AudioEngine-inl.mm +++ b/cocos/audio/apple/AudioEngine-inl.mm @@ -283,6 +283,24 @@ bool AudioEngineImpl::init() return ret; } +AudioCache* AudioEngineImpl::preload(const std::string& filePath) +{ + AudioCache* audioCache = nullptr; + + auto it = _audioCaches.find(filePath); + if (it == _audioCaches.end()) { + audioCache = &_audioCaches[filePath]; + audioCache->_fileFullPath = FileUtils::getInstance()->fullPathForFilename(filePath); + + _threadPool->addTask(std::bind(&AudioCache::readDataTask, audioCache)); + } + else { + audioCache = &it->second; + } + + return audioCache; +} + int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume) { if (s_ALDevice == nullptr) { @@ -303,16 +321,9 @@ int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume return AudioEngine::INVALID_AUDIO_ID; } - AudioCache* audioCache = nullptr; - auto it = _audioCaches.find(filePath); - if (it == _audioCaches.end()) { - audioCache = &_audioCaches[filePath]; - audioCache->_fileFullPath = FileUtils::getInstance()->fullPathForFilename(filePath); - - _threadPool->addTask(std::bind(&AudioCache::readDataTask, audioCache)); - } - else { - audioCache = &it->second; + AudioCache* audioCache = preload(filePath); + if (audioCache == nullptr) { + return AudioEngine::INVALID_AUDIO_ID; } auto player = &_audioPlayers[_currentAudioID]; From bfe6db174e1a9a1df208ae0628b922040faa5b10 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 9 Jul 2015 01:07:59 +0000 Subject: [PATCH 32/93] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../scripting/lua-bindings/auto/api/Frame.lua | 13 +++ .../auto/lua_cocos2dx_studio_auto.cpp | 99 +++++++++++++++++++ .../auto/lua_cocos2dx_studio_auto.hpp | 2 + 3 files changed, 114 insertions(+) diff --git a/cocos/scripting/lua-bindings/auto/api/Frame.lua b/cocos/scripting/lua-bindings/auto/api/Frame.lua index dacd214807..9be7ffcdee 100644 --- a/cocos/scripting/lua-bindings/auto/api/Frame.lua +++ b/cocos/scripting/lua-bindings/auto/api/Frame.lua @@ -10,6 +10,13 @@ -- @param self -- @return Frame#Frame ret (return value: ccs.Frame) +-------------------------------- +-- +-- @function [parent=#Frame] setTweenType +-- @param self +-- @param #int tweenType +-- @return Frame#Frame self (return value: ccs.Frame) + -------------------------------- -- -- @function [parent=#Frame] setNode @@ -30,6 +37,12 @@ -- @param self -- @return bool#bool ret (return value: bool) +-------------------------------- +-- +-- @function [parent=#Frame] getTweenType +-- @param self +-- @return int#int ret (return value: int) + -------------------------------- -- -- @function [parent=#Frame] getEasingParams 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 e7b77f2c61..ac4bfc4457 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp @@ -15792,6 +15792,56 @@ int lua_cocos2dx_studio_Frame_clone(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_Frame_setTweenType(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::Frame* 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.Frame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::Frame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_Frame_setTweenType'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::tweenfunc::TweenType arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.Frame:setTweenType"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_Frame_setTweenType'", nullptr); + return 0; + } + cobj->setTweenType(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.Frame:setTweenType",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_Frame_setTweenType'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_Frame_setNode(lua_State* tolua_S) { int argc = 0; @@ -15939,6 +15989,53 @@ int lua_cocos2dx_studio_Frame_isEnterWhenPassed(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_Frame_getTweenType(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::Frame* 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.Frame",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::Frame*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_Frame_getTweenType'", 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_Frame_getTweenType'", nullptr); + return 0; + } + int ret = (int)cobj->getTweenType(); + 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.Frame:getTweenType",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_Frame_getTweenType'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_Frame_getEasingParams(lua_State* tolua_S) { int argc = 0; @@ -16387,9 +16484,11 @@ int lua_register_cocos2dx_studio_Frame(lua_State* tolua_S) tolua_beginmodule(tolua_S,"Frame"); tolua_function(tolua_S,"clone",lua_cocos2dx_studio_Frame_clone); + tolua_function(tolua_S,"setTweenType",lua_cocos2dx_studio_Frame_setTweenType); tolua_function(tolua_S,"setNode",lua_cocos2dx_studio_Frame_setNode); tolua_function(tolua_S,"setTimeline",lua_cocos2dx_studio_Frame_setTimeline); tolua_function(tolua_S,"isEnterWhenPassed",lua_cocos2dx_studio_Frame_isEnterWhenPassed); + tolua_function(tolua_S,"getTweenType",lua_cocos2dx_studio_Frame_getTweenType); tolua_function(tolua_S,"getEasingParams",lua_cocos2dx_studio_Frame_getEasingParams); tolua_function(tolua_S,"setEasingParams",lua_cocos2dx_studio_Frame_setEasingParams); tolua_function(tolua_S,"getFrameIndex",lua_cocos2dx_studio_Frame_getFrameIndex); 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 41c31388e8..60e3ce9e08 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp @@ -512,6 +512,8 @@ int register_all_cocos2dx_studio(lua_State* tolua_S); + + From 9f52b1e6fb6e1337c28b786ab4fc4ff2963bafaf Mon Sep 17 00:00:00 2001 From: VisualSj Date: Thu, 9 Jul 2015 11:49:11 +0800 Subject: [PATCH 33/93] Fixed a bug that is SingleNode setColor is null --- .../js-bindings/script/studio/parsers/timelineParser-2.x.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cocos/scripting/js-bindings/script/studio/parsers/timelineParser-2.x.js b/cocos/scripting/js-bindings/script/studio/parsers/timelineParser-2.x.js index 403eb6c679..eb3f478280 100644 --- a/cocos/scripting/js-bindings/script/studio/parsers/timelineParser-2.x.js +++ b/cocos/scripting/js-bindings/script/studio/parsers/timelineParser-2.x.js @@ -161,6 +161,9 @@ var node = new cc.Node(); this.generalAttributes(node, json); + var color = json["CColor"]; + if(color != null) + node.setColor(getColor(color)); return node; }; From 86a68f5a09567691221596af08cd2602fd50051b Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Thu, 9 Jul 2015 14:31:03 +0800 Subject: [PATCH 34/93] AudioEngine:refine thread pool --- cocos/audio/AudioEngine.cpp | 124 ++++++++++++++++++++++++ cocos/audio/apple/AudioEngine-inl.h | 4 - cocos/audio/apple/AudioEngine-inl.mm | 98 +------------------ cocos/audio/include/AudioEngine.h | 5 +- cocos/audio/win32/AudioEngine-win32.cpp | 94 +----------------- cocos/audio/win32/AudioEngine-win32.h | 4 - cocos/audio/winrt/AudioEngine-winrt.cpp | 99 +------------------ cocos/audio/winrt/AudioEngine-winrt.h | 4 - 8 files changed, 134 insertions(+), 298 deletions(-) diff --git a/cocos/audio/AudioEngine.cpp b/cocos/audio/AudioEngine.cpp index 6c43b6bfa9..84fecb35bc 100644 --- a/cocos/audio/AudioEngine.cpp +++ b/cocos/audio/AudioEngine.cpp @@ -61,8 +61,110 @@ AudioEngine::ProfileHelper* AudioEngine::_defaultProfileHelper = nullptr; std::unordered_map AudioEngine::_audioIDInfoMap; AudioEngineImpl* AudioEngine::_audioEngineImpl = nullptr; +AudioEngine::AudioEngineThreadPool* AudioEngine::s_threadPool = nullptr; + +class AudioEngine::AudioEngineThreadPool +{ +public: + AudioEngineThreadPool(bool detach) + : _numThread(6) + , _detach(detach) + { + s_threadPool = this; + + _threads.reserve(_numThread); + _tasks.reserve(_numThread); + + for (int index = 0; index < _numThread; ++index) { + _tasks.push_back(nullptr); + _threads.push_back(std::thread(std::bind(&AudioEngineThreadPool::threadFunc, this, index))); + if (_detach) + { + _threads[index].detach(); + } + } + } + + void addTask(const std::function &task){ + _taskMutex.lock(); + int targetIndex = -1; + for (int index = 0; index < _numThread; ++index) { + if (_tasks[index] == nullptr) { + targetIndex = index; + _tasks[index] = task; + break; + } + } + if (targetIndex == -1) { + _tasks.push_back(task); + _threads.push_back(std::thread(std::bind(&AudioEngineThreadPool::threadFunc, this, _numThread))); + if (_detach) + { + _threads[_numThread].detach(); + } + _numThread++; + } + _taskMutex.unlock(); + _sleepCondition.notify_all(); + } + + void destroy() + { + std::unique_lock lk(_sleepMutex); + _sleepCondition.notify_all(); + + if (!_detach) + { + for (int index = 0; index < _numThread; ++index) { + _threads[index].join(); + } + } + } + +private: + std::vector _threads; + std::vector< std::function > _tasks; + + void threadFunc(int index) + { + while (s_threadPool == this) { + std::function task = nullptr; + _taskMutex.lock(); + task = _tasks[index]; + _taskMutex.unlock(); + + if (nullptr == task) + { + std::unique_lock lk(_sleepMutex); + _sleepCondition.wait(lk); + continue; + } + + task(); + + _taskMutex.lock(); + _tasks[index] = nullptr; + _taskMutex.unlock(); + } + } + + int _numThread; + + std::mutex _taskMutex; + std::mutex _sleepMutex; + std::condition_variable _sleepCondition; + bool _detach; +}; + void AudioEngine::end() { + if (s_threadPool) + { + s_threadPool->destroy(); + delete s_threadPool; + s_threadPool = nullptr; + } + delete _audioEngineImpl; _audioEngineImpl = nullptr; @@ -82,6 +184,18 @@ bool AudioEngine::lazyInit() } } +#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 + if (_audioEngineImpl && s_threadPool == nullptr) + { + s_threadPool = new (std::nothrow) AudioEngineThreadPool(true); + } +#elif CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID + if (_audioEngineImpl && s_threadPool == nullptr) + { + s_threadPool = new (std::nothrow) AudioEngineThreadPool(false); + } +#endif + return true; } @@ -429,4 +543,14 @@ void AudioEngine::preload(const std::string& filePath) } } +void AudioEngine::addTask(const std::function &task) +{ + lazyInit(); + + if (_audioEngineImpl && s_threadPool) + { + s_threadPool->addTask(task); + } +} + #endif diff --git a/cocos/audio/apple/AudioEngine-inl.h b/cocos/audio/apple/AudioEngine-inl.h index a623596502..137e25a341 100644 --- a/cocos/audio/apple/AudioEngine-inl.h +++ b/cocos/audio/apple/AudioEngine-inl.h @@ -38,8 +38,6 @@ NS_CC_BEGIN namespace experimental{ #define MAX_AUDIOINSTANCES 24 -class AudioEngineThreadPool; - class AudioEngineImpl : public cocos2d::Ref { public: @@ -67,8 +65,6 @@ public: private: void _play2d(AudioCache *cache, int audioID); - AudioEngineThreadPool* _threadPool; - ALuint _alSources[MAX_AUDIOINSTANCES]; //source,used diff --git a/cocos/audio/apple/AudioEngine-inl.mm b/cocos/audio/apple/AudioEngine-inl.mm index b35d37d785..ce2c201565 100644 --- a/cocos/audio/apple/AudioEngine-inl.mm +++ b/cocos/audio/apple/AudioEngine-inl.mm @@ -42,93 +42,6 @@ using namespace cocos2d::experimental; static ALCdevice *s_ALDevice = nullptr; static ALCcontext *s_ALContext = nullptr; -namespace cocos2d { - namespace experimental { - class AudioEngineThreadPool - { - public: - AudioEngineThreadPool() - : _running(true) - , _numThread(6) - { - _threads.reserve(_numThread); - _tasks.reserve(_numThread); - - for (int index = 0; index < _numThread; ++index) { - _tasks.push_back(nullptr); - _threads.push_back( std::thread( std::bind(&AudioEngineThreadPool::threadFunc,this,index) ) ); - } - } - - void addTask(const std::function &task){ - _taskMutex.lock(); - int targetIndex = -1; - for (int index = 0; index < _numThread; ++index) { - if (_tasks[index] == nullptr) { - targetIndex = index; - _tasks[index] = task; - break; - } - } - if (targetIndex == -1) { - _tasks.push_back(task); - _threads.push_back( std::thread( std::bind(&AudioEngineThreadPool::threadFunc,this,_numThread) ) ); - - _numThread++; - } - _taskMutex.unlock(); - - _sleepCondition.notify_all(); - } - - void destroy() - { - _running = false; - _sleepCondition.notify_all(); - - for (int index = 0; index < _numThread; ++index) { - _threads[index].join(); - } - } - - private: - bool _running; - std::vector _threads; - std::vector< std::function > _tasks; - - void threadFunc(int index) - { - while (_running) { - std::function task = nullptr; - _taskMutex.lock(); - task = _tasks[index]; - _taskMutex.unlock(); - - if (nullptr == task) - { - std::unique_lock lk(_sleepMutex); - _sleepCondition.wait(lk); - continue; - } - - task(); - - _taskMutex.lock(); - _tasks[index] = nullptr; - _taskMutex.unlock(); - } - } - - int _numThread; - - std::mutex _taskMutex; - std::mutex _sleepMutex; - std::condition_variable _sleepCondition; - - }; - } -} - #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS @interface AudioEngineSessionHandler : NSObject { @@ -220,8 +133,7 @@ static id s_AudioEngineSessionHandler = nullptr; #endif AudioEngineImpl::AudioEngineImpl() -: _threadPool(nullptr) -, _lazyInitLoop(true) +: _lazyInitLoop(true) , _currentAudioID(0) { @@ -240,10 +152,7 @@ AudioEngineImpl::~AudioEngineImpl() if (s_ALDevice) { alcCloseDevice(s_ALDevice); } - if (_threadPool) { - _threadPool->destroy(); - delete _threadPool; - } + #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS [s_AudioEngineSessionHandler release]; #endif @@ -275,7 +184,6 @@ bool AudioEngineImpl::init() _alSourceUsed[_alSources[i]] = false; } - _threadPool = new (std::nothrow) AudioEngineThreadPool(); ret = true; } }while (false); @@ -292,7 +200,7 @@ AudioCache* AudioEngineImpl::preload(const std::string& filePath) audioCache = &_audioCaches[filePath]; audioCache->_fileFullPath = FileUtils::getInstance()->fullPathForFilename(filePath); - _threadPool->addTask(std::bind(&AudioCache::readDataTask, audioCache)); + AudioEngine::addTask(std::bind(&AudioCache::readDataTask, audioCache)); } else { audioCache = &it->second; diff --git a/cocos/audio/include/AudioEngine.h b/cocos/audio/include/AudioEngine.h index 8ed011dcfb..374a363e94 100644 --- a/cocos/audio/include/AudioEngine.h +++ b/cocos/audio/include/AudioEngine.h @@ -288,7 +288,7 @@ public: static void preload(const std::string& filePath); protected: - + static void addTask(const std::function &task); static void remove(int audioID); struct ProfileHelper @@ -341,6 +341,9 @@ protected: static ProfileHelper* _defaultProfileHelper; static AudioEngineImpl* _audioEngineImpl; + + class AudioEngineThreadPool; + static AudioEngineThreadPool* s_threadPool; friend class AudioEngineImpl; }; diff --git a/cocos/audio/win32/AudioEngine-win32.cpp b/cocos/audio/win32/AudioEngine-win32.cpp index 923c6671c2..b8629cfa3e 100644 --- a/cocos/audio/win32/AudioEngine-win32.cpp +++ b/cocos/audio/win32/AudioEngine-win32.cpp @@ -26,7 +26,7 @@ #if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 #include "AudioEngine-win32.h" -#include + #ifdef OPENAL_PLAIN_INCLUDES #include "alc.h" #include "alext.h" @@ -47,94 +47,9 @@ static ALCdevice *s_ALDevice = nullptr; static ALCcontext *s_ALContext = nullptr; static bool MPG123_LAZYINIT = true; -static AudioEngineThreadPool* s_threadPool = nullptr; - -namespace cocos2d { - namespace experimental { - class AudioEngineThreadPool - { - public: - AudioEngineThreadPool() - : _numThread(6) - { - s_threadPool = this; - - _threads.reserve(_numThread); - _tasks.reserve(_numThread); - - for (int index = 0; index < _numThread; ++index) { - _tasks.push_back(nullptr); - _threads.push_back( std::thread( std::bind(&AudioEngineThreadPool::threadFunc,this,index) ) ); - _threads[index].detach(); - } - } - - void addTask(const std::function &task){ - _taskMutex.lock(); - int targetIndex = -1; - for (int index = 0; index < _numThread; ++index) { - if (_tasks[index] == nullptr) { - targetIndex = index; - _tasks[index] = task; - break; - } - } - if (targetIndex == -1) { - _tasks.push_back(task); - _threads.push_back( std::thread( std::bind(&AudioEngineThreadPool::threadFunc,this,_numThread) ) ); - _threads[_numThread].detach(); - _numThread++; - } - _taskMutex.unlock(); - _sleepCondition.notify_all(); - } - - void destroy() - { - std::unique_lock lk(_sleepMutex); - _sleepCondition.notify_all(); - } - - private: - std::vector _threads; - std::vector< std::function > _tasks; - - void threadFunc(int index) - { - while (s_threadPool == this) { - std::function task = nullptr; - _taskMutex.lock(); - task = _tasks[index]; - _taskMutex.unlock(); - - if (nullptr == task) - { - std::unique_lock lk(_sleepMutex); - _sleepCondition.wait(lk); - continue; - } - - task(); - - _taskMutex.lock(); - _tasks[index] = nullptr; - _taskMutex.unlock(); - } - } - - int _numThread; - - std::mutex _taskMutex; - std::mutex _sleepMutex; - std::condition_variable _sleepCondition; - }; - } -} - AudioEngineImpl::AudioEngineImpl() : _lazyInitLoop(true) , _currentAudioID(0) -, _threadPool(nullptr) { } @@ -154,10 +69,6 @@ AudioEngineImpl::~AudioEngineImpl() alcCloseDevice(s_ALDevice); s_ALDevice = nullptr; } - if (_threadPool) { - _threadPool->destroy(); - delete _threadPool; - } mpg123_exit(); MPG123_LAZYINIT = true; @@ -185,7 +96,6 @@ bool AudioEngineImpl::init() _alSourceUsed[_alSources[i]] = false; } - _threadPool = new (std::nothrow) AudioEngineThreadPool(); ret = true; } }while (false); @@ -235,7 +145,7 @@ AudioCache* AudioEngineImpl::preload(const std::string& filePath) audioCache->_fileFormat = fileFormat; audioCache->_fileFullPath = FileUtils::getInstance()->fullPathForFilename(filePath); - _threadPool->addTask(std::bind(&AudioCache::readDataTask, audioCache)); + AudioEngine::addTask(std::bind(&AudioCache::readDataTask, audioCache)); } while (false); return audioCache; diff --git a/cocos/audio/win32/AudioEngine-win32.h b/cocos/audio/win32/AudioEngine-win32.h index d290bb367b..23aa2e2bba 100644 --- a/cocos/audio/win32/AudioEngine-win32.h +++ b/cocos/audio/win32/AudioEngine-win32.h @@ -38,8 +38,6 @@ NS_CC_BEGIN namespace experimental{ #define MAX_AUDIOINSTANCES 32 -class AudioEngineThreadPool; - class CC_DLL AudioEngineImpl : public cocos2d::Ref { public: @@ -68,8 +66,6 @@ public: private: void _play2d(AudioCache *cache, int audioID); - AudioEngineThreadPool* _threadPool; - ALuint _alSources[MAX_AUDIOINSTANCES]; //source,used diff --git a/cocos/audio/winrt/AudioEngine-winrt.cpp b/cocos/audio/winrt/AudioEngine-winrt.cpp index 4306bd8b46..7ba1af2c09 100644 --- a/cocos/audio/winrt/AudioEngine-winrt.cpp +++ b/cocos/audio/winrt/AudioEngine-winrt.cpp @@ -21,101 +21,13 @@ #if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT #include "AudioEngine-winrt.h" -#include - using namespace cocos2d; using namespace cocos2d::experimental; - -namespace cocos2d { - namespace experimental { - class AudioEngineThreadPool - { - public: - AudioEngineThreadPool() - : _running(true) - , _numThread(6) - { - _threads.reserve(_numThread); - _tasks.reserve(_numThread); - - for (int index = 0; index < _numThread; ++index) { - _tasks.push_back(nullptr); - _threads.push_back(std::thread(std::bind(&AudioEngineThreadPool::threadFunc, this, index))); - } - } - - void addTask(const std::function &task){ - _taskMutex.lock(); - int targetIndex = -1; - for (int index = 0; index < _numThread; ++index) { - if (_tasks[index] == nullptr) { - targetIndex = index; - _tasks[index] = task; - break; - } - } - if (targetIndex == -1) { - _tasks.push_back(task); - _threads.push_back(std::thread(std::bind(&AudioEngineThreadPool::threadFunc, this, _numThread))); - - _numThread++; - } - _taskMutex.unlock(); - _sleepCondition.notify_all(); - } - - void destroy() - { - _running = false; - _sleepCondition.notify_all(); - - for (int index = 0; index < _numThread; ++index) { - _threads[index].join(); - } - } - private: - bool _running; - std::vector _threads; - std::vector< std::function > _tasks; - - void threadFunc(int index) - { - while (_running) { - std::function task = nullptr; - _taskMutex.lock(); - task = _tasks[index]; - _taskMutex.unlock(); - - if (nullptr == task) - { - std::unique_lock lk(_sleepMutex); - _sleepCondition.wait(lk); - continue; - } - - task(); - - _taskMutex.lock(); - _tasks[index] = nullptr; - _taskMutex.unlock(); - } - } - - int _numThread; - - std::mutex _taskMutex; - std::mutex _sleepMutex; - std::condition_variable _sleepCondition; - }; - } -} - AudioEngineImpl::AudioEngineImpl() : _lazyInitLoop(true) , _currentAudioID(0) - , _threadPool(nullptr) { } @@ -123,21 +35,12 @@ AudioEngineImpl::AudioEngineImpl() AudioEngineImpl::~AudioEngineImpl() { _audioCaches.clear(); - - if (_threadPool) { - _threadPool->destroy(); - delete _threadPool; - } } bool AudioEngineImpl::init() { bool ret = false; - if (nullptr == _threadPool) { - _threadPool = new (std::nothrow) AudioEngineThreadPool(); - } - ret = true; return ret; } @@ -173,7 +76,7 @@ AudioCache* AudioEngineImpl::preload(const std::string& filePath) std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath); audioCache->_fileFullPath = fullPath; - _threadPool->addTask(std::bind(&AudioCache::readDataTask, audioCache)); + AudioEngine::addTask(std::bind(&AudioCache::readDataTask, audioCache)); } else { audioCache = &it->second; diff --git a/cocos/audio/winrt/AudioEngine-winrt.h b/cocos/audio/winrt/AudioEngine-winrt.h index 3ab18f2a43..97d84411dc 100644 --- a/cocos/audio/winrt/AudioEngine-winrt.h +++ b/cocos/audio/winrt/AudioEngine-winrt.h @@ -35,9 +35,6 @@ NS_CC_BEGIN namespace experimental{ #define MAX_AUDIOINSTANCES 32 - - class AudioEngineThreadPool; - class CC_DLL AudioEngineImpl : public cocos2d::Ref { public: @@ -73,7 +70,6 @@ NS_CC_BEGIN std::vector _toRemoveAudioIDs; bool _lazyInitLoop; int _currentAudioID; - AudioEngineThreadPool* _threadPool; }; } From a79586c052ba872460bad641dbbecaf8a3a6ef24 Mon Sep 17 00:00:00 2001 From: "folgerhu@sina.com" Date: Thu, 9 Jul 2015 17:02:12 +0800 Subject: [PATCH 35/93] CCTMXXMLParser code negligence --- cocos/2d/CCTMXXMLParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/2d/CCTMXXMLParser.cpp b/cocos/2d/CCTMXXMLParser.cpp index 1d163af57b..e559550a58 100644 --- a/cocos/2d/CCTMXXMLParser.cpp +++ b/cocos/2d/CCTMXXMLParser.cpp @@ -454,7 +454,7 @@ void TMXMapInfo::startElement(void *ctx, const char *name, const char **atts) // Y int y = attributeDict["y"].asInt(); - Vec2 p(x + objectGroup->getPositionOffset().x, _mapSize.height * _tileSize.height - y - objectGroup->getPositionOffset().x - attributeDict["height"].asInt()); + Vec2 p(x + objectGroup->getPositionOffset().x, _mapSize.height * _tileSize.height - y - objectGroup->getPositionOffset().y - attributeDict["height"].asInt()); p = CC_POINT_PIXELS_TO_POINTS(p); dict["x"] = Value(p.x); dict["y"] = Value(p.y); From 10fe728eee729fd74c2345f0901350eb1c1ce8b1 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Thu, 9 Jul 2015 17:54:21 +0800 Subject: [PATCH 36/93] animation quality default to low, do not interpolation --- cocos/base/CCConfiguration.cpp | 2 +- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 27 ++++++++++++------- .../Classes/Sprite3DTest/Sprite3DTest.h | 2 ++ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/cocos/base/CCConfiguration.cpp b/cocos/base/CCConfiguration.cpp index 0667ccc8d7..8ade3f0c55 100644 --- a/cocos/base/CCConfiguration.cpp +++ b/cocos/base/CCConfiguration.cpp @@ -50,7 +50,7 @@ Configuration::Configuration() , _maxDirLightInShader(1) , _maxPointLightInShader(1) , _maxSpotLightInShader(1) -, _animate3DQuality(Animate3DQuality::QUALITY_HIGH) +, _animate3DQuality(Animate3DQuality::QUALITY_LOW) { } diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 12ff471c23..5aecd29462 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -1243,17 +1243,17 @@ Sprite3DWithSkinTest::Sprite3DWithSkinTest() listener->onTouchesEnded = CC_CALLBACK_2(Sprite3DWithSkinTest::onTouchesEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); - // swich camera + // swich animation quality. In fact, you can set the sprite3d out of frustum to Animate3DQuality::QUALITY_NONE, it can save a lot of cpu time MenuItemFont::setFontName("fonts/arial.ttf"); MenuItemFont::setFontSize(15); - _menuItem = MenuItemFont::create("High Quality", CC_CALLBACK_1(Sprite3DWithSkinTest::switchAnimationQualityCallback,this)); + _animateQuality = (int)Animate3DQuality::QUALITY_LOW; + _menuItem = MenuItemFont::create(getAnimationQualityMessage(), CC_CALLBACK_1(Sprite3DWithSkinTest::switchAnimationQualityCallback,this)); _menuItem->setColor(Color3B(0,200,20)); auto menu = Menu::create(_menuItem,NULL); menu->setPosition(Vec2::ZERO); _menuItem->setPosition(VisibleRect::left().x + 50, VisibleRect::top().y -70); addChild(menu, 1); - - _animateQuality = (int)Animate3DQuality::QUALITY_HIGH; + _sprits.clear(); auto s = Director::getInstance()->getWinSize(); @@ -1303,18 +1303,25 @@ void Sprite3DWithSkinTest::addNewSpriteWithCoords(Vec2 p) } } +std::string Sprite3DWithSkinTest::getAnimationQualityMessage() const +{ + if (_animateQuality == (int)Animate3DQuality::QUALITY_NONE) + return "None Quality"; + else if (_animateQuality == (int)Animate3DQuality::QUALITY_LOW) + return "Low Quality"; + else if (_animateQuality == (int)Animate3DQuality::QUALITY_HIGH) + return "High Quality"; + + return ""; +} + void Sprite3DWithSkinTest::switchAnimationQualityCallback(Ref* sender) { ++_animateQuality; if (_animateQuality > (int)Animate3DQuality::QUALITY_HIGH) _animateQuality = (int)Animate3DQuality::QUALITY_NONE; - if (_animateQuality == (int)Animate3DQuality::QUALITY_NONE) - _menuItem->setString("None Quality"); - else if (_animateQuality == (int)Animate3DQuality::QUALITY_LOW) - _menuItem->setString("Low Quality"); - else if (_animateQuality == (int)Animate3DQuality::QUALITY_HIGH) - _menuItem->setString("High Quality"); + _menuItem->setString(getAnimationQualityMessage()); for (auto iter: _sprits) { diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h index 1a5a0e8fb2..17079ce4a2 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h @@ -287,6 +287,8 @@ public: void switchAnimationQualityCallback(cocos2d::Ref* sender); void onTouchesEnded(const std::vector& touches, cocos2d::Event* event); + + std::string getAnimationQualityMessage() const; private: std::vector _sprits; int _animateQuality; From 1ea79260833393028afa77de964fb70ebdd52b6e Mon Sep 17 00:00:00 2001 From: andyque Date: Fri, 10 Jul 2015 10:19:36 +0800 Subject: [PATCH 37/93] fix js template run error on linux. --- templates/js-template-default/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/js-template-default/CMakeLists.txt b/templates/js-template-default/CMakeLists.txt index fd463d9e7e..aa19beb019 100644 --- a/templates/js-template-default/CMakeLists.txt +++ b/templates/js-template-default/CMakeLists.txt @@ -257,6 +257,9 @@ message(STATUS "Flatbuffers include dirs: ${FLATBUFFERS_INCLUDE_DIRS}") add_subdirectory(frameworks/cocos2d-x/external/xxhash) include_directories(frameworks/cocos2d-x/external/xxhash) +#buid recast +add_subdirectory(frameworks/cocos2d-x/external/recast) + set(GAME_SRC frameworks/runtime-src/proj.linux/main.cpp frameworks/runtime-src/Classes/AppDelegate.cpp @@ -277,6 +280,7 @@ add_executable(${APP_NAME} target_link_libraries(${APP_NAME} jscocos2d cocos2d + recast ) set(APP_BIN_DIR "${CMAKE_BINARY_DIR}/bin") From c4587ecda182f83fdb0494116a4d0e0590c2fc2d Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 10 Jul 2015 11:44:20 +0800 Subject: [PATCH 38/93] if has normal use the shader with normal --- cocos/3d/CCSprite3D.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index e8890cc0c0..48992ac6e3 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -979,7 +979,10 @@ static GLProgramState* getGLProgramStateForAttribs(MeshVertexData* meshVertexDat } else { - shader = GLProgram::SHADER_3D_POSITION; + if (hasNormal && usesLight) + shader = GLProgram::SHADER_3D_POSITION_NORMAL; + else + shader = GLProgram::SHADER_3D_POSITION; } CCASSERT(shader, "Couldn't find shader for sprite"); From 81bc0b09da6ba48e5575d39d3582afe26252e2ce Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 10 Jul 2015 14:39:21 +0800 Subject: [PATCH 39/93] Label:Fixed create fail if the font(TTF) not contain a Unicode charmap. --- cocos/2d/CCFontFreeType.cpp | 23 +++++++++++++++++++++-- cocos/2d/CCLabel.cpp | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/cocos/2d/CCFontFreeType.cpp b/cocos/2d/CCFontFreeType.cpp index e3d02c9191..dae7b87744 100644 --- a/cocos/2d/CCFontFreeType.cpp +++ b/cocos/2d/CCFontFreeType.cpp @@ -137,9 +137,28 @@ bool FontFreeType::createFontObject(const std::string &fontName, int fontSize) if (FT_New_Memory_Face(getFTLibrary(), s_cacheFontData[fontName].data.getBytes(), s_cacheFontData[fontName].data.getSize(), 0, &face )) return false; - //we want to use unicode if (FT_Select_Charmap(face, FT_ENCODING_UNICODE)) - return false; + { + int foundIndex = -1; + for (int charmapIndex = 0; charmapIndex < face->num_charmaps; charmapIndex++) + { + if (face->charmaps[charmapIndex]->encoding != FT_ENCODING_NONE) + { + foundIndex = charmapIndex; + break; + } + } + + if (foundIndex == -1) + { + return false; + } + + if (FT_Select_Charmap(face, face->charmaps[foundIndex]->encoding)) + { + return false; + } + } // set the requested font size int dpi = 72; diff --git a/cocos/2d/CCLabel.cpp b/cocos/2d/CCLabel.cpp index 5104d34179..a52080e421 100644 --- a/cocos/2d/CCLabel.cpp +++ b/cocos/2d/CCLabel.cpp @@ -481,6 +481,7 @@ void Label::setFontAtlas(FontAtlas* atlas,bool distanceFieldEnabled /* = false * if (_fontAtlas) { + _batchNodes.clear(); FontAtlasCache::releaseFontAtlas(_fontAtlas); _fontAtlas = nullptr; } From eca192f7a6cb266248fa2bf39507492643d7cb5e Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 10 Jul 2015 14:43:28 +0800 Subject: [PATCH 40/93] Fixed compile error --- cocos/audio/AudioEngine.cpp | 1 + cocos/audio/android/AudioEngine-inl.cpp | 7 ++++++- cocos/audio/android/AudioEngine-inl.h | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cocos/audio/AudioEngine.cpp b/cocos/audio/AudioEngine.cpp index 84fecb35bc..2e2b68e847 100644 --- a/cocos/audio/AudioEngine.cpp +++ b/cocos/audio/AudioEngine.cpp @@ -23,6 +23,7 @@ ****************************************************************************/ #include "platform/CCPlatformConfig.h" +#include #if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 diff --git a/cocos/audio/android/AudioEngine-inl.cpp b/cocos/audio/android/AudioEngine-inl.cpp index cc939d140b..ec755a9a7a 100644 --- a/cocos/audio/android/AudioEngine-inl.cpp +++ b/cocos/audio/android/AudioEngine-inl.cpp @@ -1,5 +1,5 @@ /**************************************************************************** - Copyright (c) 2014 Chukong Technologies Inc. + Copyright (c) 2014-2015 Chukong Technologies Inc. http://www.cocos2d-x.org @@ -432,4 +432,9 @@ void AudioEngineImpl::setFinishCallback(int audioID, const std::function Date: Fri, 10 Jul 2015 17:00:16 +0800 Subject: [PATCH 41/93] Fix percentage setting won't effect when UISlider's background resource set to null --- .../WidgetReader/SliderReader/SliderReader.cpp | 4 ++-- cocos/ui/UISlider.cpp | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp index 4ca33378ce..18db60f410 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.cpp @@ -466,7 +466,7 @@ namespace cocostudio auto options = (SliderOptions*)sliderOptions; int percent = options->percent(); - slider->setPercent(percent); + //slider->setPercent(percent); bool imageFileExist = false; std::string imageErrorFilePath = ""; @@ -798,7 +798,7 @@ namespace cocostudio auto widgetReader = WidgetReader::getInstance(); widgetReader->setPropsWithFlatBuffers(node, (Table*)options->widgetOptions()); - + slider->setPercent(percent); } Node* SliderReader::createNodeWithFlatBuffers(const flatbuffers::Table *sliderOptions) diff --git a/cocos/ui/UISlider.cpp b/cocos/ui/UISlider.cpp index 427e0a1157..5e1a8894b8 100644 --- a/cocos/ui/UISlider.cpp +++ b/cocos/ui/UISlider.cpp @@ -553,12 +553,14 @@ void Slider::barRendererScaleChangedWithSize() if (btextureSize.width <= 0.0f || btextureSize.height <= 0.0f) { _barRenderer->setScale(1.0f); - return; } - float bscaleX = _contentSize.width / btextureSize.width; - float bscaleY = _contentSize.height / btextureSize.height; - _barRenderer->setScaleX(bscaleX); - _barRenderer->setScaleY(bscaleY); + else + { + float bscaleX = _contentSize.width / btextureSize.width; + float bscaleY = _contentSize.height / btextureSize.height; + _barRenderer->setScaleX(bscaleX); + _barRenderer->setScaleY(bscaleY); + } } } _barRenderer->setPosition(_contentSize.width / 2.0f, _contentSize.height / 2.0f); From 8ca9e10a22081f4f9ecdf756f82c6ddf4d8b1f76 Mon Sep 17 00:00:00 2001 From: Bin Zhang Date: Fri, 10 Jul 2015 17:01:08 +0800 Subject: [PATCH 42/93] Use msbuild to generating engine prebuilt libs on win32. --- tools/framework-compile/bin/gen_cocos_libs.py | 29 ++++++++----------- .../bin/gen_libs_config.json | 2 +- tools/framework-compile/bin/utils_cocos.py | 13 ++++----- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/tools/framework-compile/bin/gen_cocos_libs.py b/tools/framework-compile/bin/gen_cocos_libs.py index 2546233117..a461c89feb 100755 --- a/tools/framework-compile/bin/gen_cocos_libs.py +++ b/tools/framework-compile/bin/gen_cocos_libs.py @@ -96,12 +96,13 @@ class CocosLibsCompiler(object): # generate prebuilt mk files self.modify_binary_mk() - def build_win32_proj(self, cmd_path, sln_path, proj_name, mode): + def build_win32_proj(self, cmd_path, sln_path, proj_name): build_cmd = " ".join([ "\"%s\"" % cmd_path, "\"%s\"" % sln_path, - "/%s \"Release|Win32\"" % mode, - "/Project \"%s\"" % proj_name + "/t:%s" % proj_name, + "/property:Configuration=Release", + "/m" ]) utils_cocos.execute_command(build_cmd) @@ -157,7 +158,7 @@ class CocosLibsCompiler(object): clean_cmd = " ".join([ "\"%s\"" % vs_command, "\"%s\"" % proj_path, - "/clean \"Release|Win32\"" + "/t:Clean /p:Configuration=Release" ]) utils_cocos.execute_command(clean_cmd) @@ -184,15 +185,7 @@ class CocosLibsCompiler(object): else: for proj_name in win32_proj_info[key][CocosLibsCompiler.KEY_VS_BUILD_TARGETS]: # build the projects - self.build_win32_proj(vs_command, proj_path, proj_name, "build") - - lib_file_path = os.path.join(build_folder_path, "%s.lib" % proj_name) - if not os.path.exists(lib_file_path): - # if the lib is not generated, rebuild the project - self.build_win32_proj(vs_command, proj_path, proj_name, "rebuild") - - if not os.path.exists(lib_file_path): - raise Exception("Library %s not generated as expected!" % lib_file_path) + self.build_win32_proj(vs_command, proj_path, proj_name) # copy the libs into prebuilt dir for file_name in os.listdir(build_folder_path): @@ -208,10 +201,12 @@ class CocosLibsCompiler(object): for proj_name in win32_proj_info[key][CocosLibsCompiler.KEY_VS_RENAME_TARGETS]: src_name = os.path.join(win32_output_dir, "%s.lib" % proj_name) dst_name = os.path.join(win32_output_dir, "%s%s.lib" % (proj_name, suffix)) - if os.path.exists(src_name): - if os.path.exists(dst_name): - os.remove(dst_name) - os.rename(src_name, dst_name) + if not os.path.exists(src_name): + raise Exception("Library %s not generated as expected!" % src_name) + + if os.path.exists(dst_name): + os.remove(dst_name) + os.rename(src_name, dst_name) except Exception as e: raise e finally: diff --git a/tools/framework-compile/bin/gen_libs_config.json b/tools/framework-compile/bin/gen_libs_config.json index dbe9ffb87b..7da39e83b6 100755 --- a/tools/framework-compile/bin/gen_libs_config.json +++ b/tools/framework-compile/bin/gen_libs_config.json @@ -17,7 +17,7 @@ "vs_projs_info" : { "tools/simulator/frameworks/runtime-src/proj.win32/simulator.sln" : { "build_targets" : [ - "simulator" + "libluacocos2d", "libjscocos2d", "libsimulator" ], "rename_targets" : [ "libSpine", "libbox2d", "libbullet", "librecast", diff --git a/tools/framework-compile/bin/utils_cocos.py b/tools/framework-compile/bin/utils_cocos.py index b40c8d1104..9aac523c9b 100755 --- a/tools/framework-compile/bin/utils_cocos.py +++ b/tools/framework-compile/bin/utils_cocos.py @@ -92,26 +92,25 @@ def get_vs_cmd_path(vs_version): reg_flag_list = [ _winreg.KEY_WOW64_64KEY, _winreg.KEY_WOW64_32KEY ] # Find VS path - vsPath = None + msbuild_path = None for reg_flag in reg_flag_list: try: vs = _winreg.OpenKey( _winreg.HKEY_LOCAL_MACHINE, - r"SOFTWARE\Microsoft\VisualStudio", + r"SOFTWARE\Microsoft\MSBuild\ToolsVersions\%s" % vs_ver, 0, _winreg.KEY_READ | reg_flag ) - key = _winreg.OpenKey(vs, r"SxS\VS7") - vsPath, type = _winreg.QueryValueEx(key, vs_ver) + msbuild_path, type = _winreg.QueryValueEx(vs, 'MSBuildToolsPath') except: continue - if vsPath is not None: + if msbuild_path is not None and os.path.exists(msbuild_path): break # generate devenv path - if vsPath is not None: - commandPath = os.path.join(vsPath, "Common7", "IDE", "devenv") + if msbuild_path is not None: + commandPath = os.path.join(msbuild_path, "MSBuild.exe") else: commandPath = None From 600568fdba08f528e5c517c9374ce21dfc0c395b Mon Sep 17 00:00:00 2001 From: pandamicro Date: Sun, 12 Jul 2015 11:33:22 +0800 Subject: [PATCH 43/93] Migrate test case from #10692 @babcca --- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 33 ++++++++++++++++++ .../Classes/Sprite3DTest/Sprite3DTest.h | 12 +++++++ .../Resources/Sprite3DTest/mesh_model.c3b | Bin 0 -> 284227 bytes 3 files changed, 45 insertions(+) create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/mesh_model.c3b diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 12ff471c23..74b9ae5582 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -57,6 +57,7 @@ Sprite3DTests::Sprite3DTests() ADD_TEST_CASE(NodeAnimationTest); ADD_TEST_CASE(Issue9767); ADD_TEST_CASE(Sprite3DClippingTest); + ADD_TEST_CASE(Sprite3DTestMeshLight); }; //------------------------------------------------------------------ @@ -2609,3 +2610,35 @@ std::string Sprite3DClippingTest::subtitle() const { return ""; } + +Sprite3DTestMeshLight::Sprite3DTestMeshLight() +{ + auto s = Director::getInstance()->getWinSize(); + + auto _sprite = Sprite3D::create("Sprite3DTest/mesh_model.c3b"); + _sprite->setPosition(Vec2(0, 0)); + _sprite->setScale(0.05f); + _sprite->setCameraMask(2); + + PointLight * light = PointLight::create(Vec3(0, 0, 400), Color3B(255, 255, 255), 1000.0f); + + //setup camera + auto camera = Camera::createPerspective(40, s.width / s.height, 0.01f, 1000.f); + camera->setCameraFlag(CameraFlag::USER1); + camera->setPosition3D(Vec3(0.f, 30.f, 100.f)); + camera->lookAt(Vec3(0.f, 0.f, 0.f)); + addChild(camera); + + addChild(_sprite); + addChild(light); +} + +std::string Sprite3DTestMeshLight::title() const +{ + return "3D mesh with light without texture"; +} + +std::string Sprite3DTestMeshLight::subtitle() const +{ + return ""; +} \ No newline at end of file diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h index 1a5a0e8fb2..0dc4c05452 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h @@ -565,4 +565,16 @@ public: virtual std::string subtitle() const override; }; +class Sprite3DTestMeshLight : public Sprite3DTestDemo +{ +public: + CREATE_FUNC(Sprite3DTestMeshLight); + Sprite3DTestMeshLight(); + virtual std::string title() const override; + virtual std::string subtitle() const override; + +protected: + cocos2d::Sprite3D* _sprite; +}; + #endif diff --git a/tests/cpp-tests/Resources/Sprite3DTest/mesh_model.c3b b/tests/cpp-tests/Resources/Sprite3DTest/mesh_model.c3b new file mode 100644 index 0000000000000000000000000000000000000000..50f51efac06bf5a2a532c7505eabc02df60b7c53 GIT binary patch literal 284227 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

_IGF#&{*v~Te~?0->2_+8 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 QtV92BkN Date: Mon, 13 Jul 2015 10:40:43 +0800 Subject: [PATCH 44/93] Add Animate:getCurrentFrameIndex --- cocos/2d/CCActionInterval.cpp | 4 +++- cocos/2d/CCActionInterval.h | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index b325894bab..2ac44d820b 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -2270,6 +2270,7 @@ Animate::Animate() , _executedLoops(0) , _animation(nullptr) , _frameDisplayedEvent(nullptr) +, _currFrameIndex(0) { } @@ -2383,7 +2384,8 @@ void Animate::update(float t) float splitTime = _splitTimes->at(i); if( splitTime <= t ) { - AnimationFrame* frame = frames.at(i); + _currFrameIndex = i; + AnimationFrame* frame = frames.at(_currFrameIndex); frameToDisplay = frame->getSpriteFrame(); static_cast(_target)->setSpriteFrame(frameToDisplay); diff --git a/cocos/2d/CCActionInterval.h b/cocos/2d/CCActionInterval.h index cf0b1f4926..b424c6be36 100644 --- a/cocos/2d/CCActionInterval.h +++ b/cocos/2d/CCActionInterval.h @@ -1439,6 +1439,11 @@ public: Animation* getAnimation() { return _animation; } const Animation* getAnimation() const { return _animation; } + /** + * Gets the index of sprite frame currently displayed. + * @return int the index of sprite frame currently displayed. + */ + int getCurrentFrameIndex() { return _currFrameIndex; } // // Overrides // @@ -1462,6 +1467,7 @@ protected: std::vector* _splitTimes; int _nextFrame; SpriteFrame* _origFrame; + int _currFrameIndex; unsigned int _executedLoops; Animation* _animation; From 38756fb44b7e6fbe4ffbcc0575dced30af39bd8e Mon Sep 17 00:00:00 2001 From: VisualSj Date: Mon, 13 Jul 2015 11:14:06 +0800 Subject: [PATCH 45/93] update web index --- web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web b/web index 2facd5b38b..04de1400b6 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 2facd5b38b539b48866988aadb809118ce7a65e1 +Subproject commit 04de1400b6032ef15c9e9bd53548720ff82e3c5f From 80dff7f1c4d1f4e02fc2633693956bcd79211f4f Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Mon, 13 Jul 2015 11:32:25 +0800 Subject: [PATCH 46/93] Rollback pr12299 --- cocos/2d/CCLabel.cpp | 11 +----- cocos/2d/CCLabelTextFormatter.cpp | 4 +- .../Classes/LabelTest/LabelTestNew.cpp | 38 ------------------- .../Classes/LabelTest/LabelTestNew.h | 11 ------ 4 files changed, 3 insertions(+), 61 deletions(-) diff --git a/cocos/2d/CCLabel.cpp b/cocos/2d/CCLabel.cpp index 331bed2b27..10da20dd2a 100644 --- a/cocos/2d/CCLabel.cpp +++ b/cocos/2d/CCLabel.cpp @@ -682,16 +682,7 @@ void Label::updateQuads() _reusedRect.size.width = letterDef.width; _reusedRect.origin.x = letterDef.U; _reusedRect.origin.y = letterDef.V; - if (_lettersInfo[ctr].position.y > _contentSize.height) - { - auto clipTop = _lettersInfo[ctr].position.y - _contentSize.height; - _reusedRect.origin.y += clipTop; - _lettersInfo[ctr].position.y -= clipTop; - } - if (_lettersInfo[ctr].position.y - letterDef.height < 0.f) - { - _reusedRect.size.height = _lettersInfo[ctr].position.y < 0.f ? 0.f : _lettersInfo[ctr].position.y; - } + _reusedLetter->setTextureRect(_reusedRect,false,_reusedRect.size); _reusedLetter->setPosition(_lettersInfo[ctr].position); diff --git a/cocos/2d/CCLabelTextFormatter.cpp b/cocos/2d/CCLabelTextFormatter.cpp index 638897965e..a99a76bb7c 100644 --- a/cocos/2d/CCLabelTextFormatter.cpp +++ b/cocos/2d/CCLabelTextFormatter.cpp @@ -316,7 +316,7 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel) auto labelHeightPixel = theLabel->_labelHeight * contentScaleFactor; if (totalHeight > labelHeightPixel) { - int numLines = MIN(ceil(labelHeightPixel / theLabel->_commonLineHeight), theLabel->_currNumLines); + int numLines = labelHeightPixel / theLabel->_commonLineHeight; totalHeight = numLines * theLabel->_commonLineHeight; } switch (theLabel->_vAlignment) @@ -379,7 +379,7 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel) nextFontPositionY -= theLabel->_commonLineHeight; theLabel->recordPlaceholderInfo(i); - if(nextFontPositionY < 0.f) + if (nextFontPositionY < theLabel->_commonLineHeight) break; lineStart = true; diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp index e367f96e05..8eccfbf9c1 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp @@ -78,7 +78,6 @@ NewLabelTests::NewLabelTests() ADD_TEST_CASE(LabelIssue10773Test); ADD_TEST_CASE(LabelIssue11576Test); ADD_TEST_CASE(LabelIssue11699Test); - ADD_TEST_CASE(LabelIssue12259Test); ADD_TEST_CASE(LabelIssue12409Test); }; @@ -1937,43 +1936,6 @@ std::string LabelIssue11699Test::subtitle() const return "Outline should match with the characters exactly."; } -LabelIssue12259Test::LabelIssue12259Test() -{ - auto center = VisibleRect::center(); - - auto label = Label::createWithTTF("Hello", "fonts/arial.ttf", 100); - label->setDimensions(0, 70); - label->setPosition(center.x, center.y); - addChild(label); - - auto drawNode = DrawNode::create(); - auto labelSize = label->getContentSize(); - auto origin = Director::getInstance()->getWinSize(); - - origin.width = origin.width / 2 - (labelSize.width / 2); - origin.height = origin.height / 2 - (labelSize.height / 2); - - Vec2 vertices[4] = - { - Vec2(origin.width, origin.height), - Vec2(labelSize.width + origin.width, origin.height), - Vec2(labelSize.width + origin.width, labelSize.height + origin.height), - Vec2(origin.width, labelSize.height + origin.height) - }; - drawNode->drawPoly(vertices, 4, true, Color4F::WHITE); - addChild(drawNode); -} - -std::string LabelIssue12259Test::title() const -{ - return "Test for Issue #12259"; -} - -std::string LabelIssue12259Test::subtitle() const -{ - return "the texture of character should be cropped."; -} - LabelIssue12409Test::LabelIssue12409Test() { auto center = VisibleRect::center(); diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h index 826efbea20..bc24d1b34f 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h @@ -587,17 +587,6 @@ public: virtual std::string subtitle() const override; }; -class LabelIssue12259Test : public AtlasDemoNew -{ -public: - CREATE_FUNC(LabelIssue12259Test); - - LabelIssue12259Test(); - - virtual std::string title() const override; - virtual std::string subtitle() const override; -}; - class LabelIssue12409Test : public AtlasDemoNew { public: From 75920b8e11e166330b59972bf4f50d8897229af2 Mon Sep 17 00:00:00 2001 From: Bin Zhang Date: Mon, 13 Jul 2015 12:05:17 +0800 Subject: [PATCH 47/93] 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 87b34c49ee..2c32cadbf9 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 87b34c49ee6cfa9780681a4a752cd48427dda2a6 +Subproject commit 2c32cadbf9aea2a18ccd3ee43e81635f0b492886 From 2ddc1ccf3e9cb7e45a34fda3f2efddb492977bcd Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Mon, 13 Jul 2015 13:45:05 +0800 Subject: [PATCH 48/93] [ci skip]Update web index --- web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web b/web index fec945a700..048bf1f409 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit fec945a7000ff31a7c206ca2ca7fd13707a2570a +Subproject commit 048bf1f409b51fd3e8247ecaa61b987a4610fbd0 From adfa6d4f0d7c6ad1368c48a2e1c7a7fb57597f11 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Mon, 13 Jul 2015 15:38:33 +0800 Subject: [PATCH 49/93] Add test case for issue 12775 --- .../Classes/LabelTest/LabelTestNew.cpp | 20 ++++++++++++++++++ .../Classes/LabelTest/LabelTestNew.h | 11 ++++++++++ .../Resources/fonts/xingkai-incomplete.ttf | Bin 0 -> 25856 bytes 3 files changed, 31 insertions(+) create mode 100644 tests/cpp-tests/Resources/fonts/xingkai-incomplete.ttf diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp index 4513b1d6b8..d66c2290c9 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp @@ -81,6 +81,7 @@ NewLabelTests::NewLabelTests() ADD_TEST_CASE(LabelIssue12259Test); ADD_TEST_CASE(LabelIssue12409Test); ADD_TEST_CASE(LabelAddChildTest); + ADD_TEST_CASE(LabelIssue12775Test); }; LabelTTFAlignmentNew::LabelTTFAlignmentNew() @@ -2035,3 +2036,22 @@ std::string LabelAddChildTest::title() const { return "Label support add child nodes"; } + +LabelIssue12775Test::LabelIssue12775Test() +{ + auto center = VisibleRect::center(); + + auto label = Label::createWithTTF("Hello", "fonts/xingkai-incomplete.ttf", 30); + label->setPosition(center.x, center.y); + addChild(label); +} + +std::string LabelIssue12775Test::title() const +{ + return "Test for Issue #12775"; +} + +std::string LabelIssue12775Test::subtitle() const +{ + return "Should not crash if the font not contain a Unicode charmap."; +} diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h index beeb51b7c8..efe91d9954 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h @@ -619,4 +619,15 @@ public: virtual std::string title() const override; }; +class LabelIssue12775Test : public AtlasDemoNew +{ +public: + CREATE_FUNC(LabelIssue12775Test); + + LabelIssue12775Test(); + + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; + #endif diff --git a/tests/cpp-tests/Resources/fonts/xingkai-incomplete.ttf b/tests/cpp-tests/Resources/fonts/xingkai-incomplete.ttf new file mode 100644 index 0000000000000000000000000000000000000000..60f0900bf3bec66ba7450a3f6d682b45deb1360c GIT binary patch literal 25856 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 literal 0 HcmV?d00001 From 36e1f26570a0a70ab00632f24b96412a32568665 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Mon, 13 Jul 2015 16:44:33 +0800 Subject: [PATCH 50/93] Fix CCSprite ; missing --- cocos/2d/CCSprite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index ef05ac3d8a..faa5b61e79 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -288,7 +288,7 @@ Sprite::Sprite(void) , _insideBounds(true) { #if CC_SPRITE_DEBUG_DRAW - debugDraw(true) + debugDraw(true); #endif //CC_SPRITE_DEBUG_DRAW } From e65b01bdc035719fbeec87f2b3f8f67f35e4cdb1 Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Mon, 13 Jul 2015 17:06:01 +0800 Subject: [PATCH 51/93] Merge pr11866: FileUtilsWin32 correct use all unicode version winapi. --- cocos/platform/CCFileUtils.cpp | 312 ++++-------------- cocos/platform/CCFileUtils.h | 2 +- cocos/platform/apple/CCFileUtils-apple.h | 3 +- cocos/platform/apple/CCFileUtils-apple.mm | 25 +- cocos/platform/linux/CCFileUtils-linux.cpp | 10 - cocos/platform/linux/CCFileUtils-linux.h | 1 - cocos/platform/win32/CCFileUtils-win32.cpp | 310 ++++++++++++++--- cocos/platform/win32/CCFileUtils-win32.h | 48 ++- cocos/platform/winrt/CCFileUtilsWinRT.cpp | 203 +++++++++++- cocos/platform/winrt/CCFileUtilsWinRT.h | 43 ++- .../proj.android-studio/app/jni/Android.mk | 5 +- .../cpp-tests.Shared.vcxitems.filters | 6 +- 12 files changed, 640 insertions(+), 328 deletions(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index c554be52a0..bd7803cafb 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -41,24 +41,12 @@ THE SOFTWARE. #endif #include -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) -#include -#endif +NS_CC_BEGIN -#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) -#include -#endif - -#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) && (CC_TARGET_PLATFORM != CC_PLATFORM_WINRT) -#include -#include -#include -#endif +// Implement DictMaker #if (CC_TARGET_PLATFORM != CC_PLATFORM_IOS) && (CC_TARGET_PLATFORM != CC_PLATFORM_MAC) -NS_CC_BEGIN - typedef enum { SAX_NONE = 0, @@ -540,7 +528,6 @@ static tinyxml2::XMLElement* generateElementForArray(const ValueVector& array, t } #else -NS_CC_BEGIN /* The subclass FileUtilsApple should override these two method. */ ValueMap FileUtils::getValueMapFromFile(const std::string& filename) {return ValueMap();} @@ -550,6 +537,7 @@ bool FileUtils::writeToFile(ValueMap& dict, const std::string &fullPath) {return #endif /* (CC_TARGET_PLATFORM != CC_PLATFORM_IOS) && (CC_TARGET_PLATFORM != CC_PLATFORM_MAC) */ +// Implement FileUtils FileUtils* FileUtils::s_sharedFileUtils = nullptr; void FileUtils::destroyInstance() @@ -1070,6 +1058,59 @@ bool FileUtils::isDirectoryExist(const std::string& dirPath) const return false; } +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + +bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const +{ + CCASSERT(false, "FileUtils not support isDirectoryExistInternal"); + return false; +} + +bool FileUtils::createDirectory(const std::string& path) +{ + CCASSERT(false, "FileUtils not support createDirectory"); + return false; +} + +bool FileUtils::removeDirectory(const std::string& path) +{ + CCASSERT(false, "FileUtils not support removeDirectory"); + return false; +} + +bool FileUtils::removeFile(const std::string &path) +{ + CCASSERT(false, "FileUtils not support removeFile"); + return false; +} + +bool FileUtils::renameFile(const std::string &path, const std::string &oldname, const std::string &name) +{ + CCASSERT(false, "FileUtils not support renameFile"); + return false; +} + +std::string FileUtils::getSuitableFOpen(const std::string& filenameUtf8) const +{ + CCASSERT(false, "getSuitableFOpen should be override by platform FileUtils"); + return filenameUtf8; +} + +#else +#include +#include +#include + +bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const +{ + struct stat st; + if (stat(dirPath.c_str(), &st) == 0) + { + return S_ISDIR(st.st_mode); + } + return false; +} + bool FileUtils::createDirectory(const std::string& path) { CCASSERT(!path.empty(), "Invalid path"); @@ -1103,47 +1144,6 @@ bool FileUtils::createDirectory(const std::string& path) } } - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) - WIN32_FILE_ATTRIBUTE_DATA wfad; - std::wstring wpath(path.begin(), path.end()); - if (!(GetFileAttributesEx(wpath.c_str(), GetFileExInfoStandard, &wfad))) - { - subpath = ""; - for(unsigned int i = 0 ; i < dirs.size() ; ++i) - { - subpath += dirs[i]; - if (i > 0 && !isDirectoryExist(subpath)) - { - std::wstring wsubpath(subpath.begin(), subpath.end()); - BOOL ret = CreateDirectory(wsubpath.c_str(), NULL); - if (!ret && ERROR_ALREADY_EXISTS != GetLastError()) - { - return false; - } - } - } - } - return true; -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - if ((GetFileAttributesA(path.c_str())) == INVALID_FILE_ATTRIBUTES) - { - subpath = ""; - for (unsigned int i = 0; i < dirs.size(); ++i) - { - subpath += dirs[i]; - if (!isDirectoryExist(subpath)) - { - BOOL ret = CreateDirectoryA(subpath.c_str(), NULL); - if (!ret && ERROR_ALREADY_EXISTS != GetLastError()) - { - return false; - } - } - } - } - return true; -#else DIR *dir = NULL; // Create path recursively @@ -1172,22 +1172,8 @@ bool FileUtils::createDirectory(const std::string& path) } } return true; -#endif } -#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) -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); - } - - return ret; -} -#endif - bool FileUtils::removeDirectory(const std::string& path) { if (path.size() > 0 && path[path.size() - 1] != '/') @@ -1196,58 +1182,6 @@ bool FileUtils::removeDirectory(const std::string& path) return false; } - // Remove downloaded files - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) - std::wstring wpath = std::wstring(path.begin(), path.end()); - std::wstring files = wpath + L"*.*"; - WIN32_FIND_DATA wfd; - HANDLE search = FindFirstFileEx(files.c_str(), FindExInfoStandard, &wfd, FindExSearchNameMatch, NULL, 0); - bool ret=true; - if (search!=INVALID_HANDLE_VALUE) - { - BOOL find=true; - while (find) - { - //. .. - if(wfd.cFileName[0]!='.') - { - std::wstring temp = wpath + wfd.cFileName; - if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - temp += '/'; - ret = ret && this->removeDirectory(std::string(temp.begin(), temp.end())); - } - else - { - SetFileAttributes(temp.c_str(), FILE_ATTRIBUTE_NORMAL); - ret = ret && DeleteFile(temp.c_str()); - } - } - find = FindNextFile(search, &wfd); - } - FindClose(search); - } - if (ret && RemoveDirectory(wpath.c_str())) - { - return true; - } - return false; -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - std::string command = "cmd /c rd /s /q "; - // Path may include space. - command += "\"" + path + "\""; - - if (WinExec(command.c_str(), SW_HIDE) > 31) - return true; - else - return false; -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) - if (nftw(path.c_str(),unlink_cb, 64, FTW_DEPTH | FTW_PHYS)) - return false; - else - return true; -#else std::string command = "rm -r "; // Path may include space. command += "\"" + path + "\""; @@ -1255,44 +1189,15 @@ bool FileUtils::removeDirectory(const std::string& path) return true; else return false; -#endif } bool FileUtils::removeFile(const std::string &path) { - // Remove downloaded file - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) - std::wstring wpath(path.begin(), path.end()); - if (DeleteFile(wpath.c_str())) - { - return true; - } - return false; -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - std::string command = "cmd /c del /q "; - std::string win32path = path; - int len = win32path.length(); - for (int i = 0; i < len; ++i) - { - if (win32path[i] == '/') - { - win32path[i] = '\\'; - } - } - command += win32path; - - if (WinExec(command.c_str(), SW_HIDE) > 31) - return true; - else - return false; -#else if (remove(path.c_str())) { return false; } else { return true; } -#endif } bool FileUtils::renameFile(const std::string &path, const std::string &oldname, const std::string &name) @@ -1301,41 +1206,6 @@ bool FileUtils::renameFile(const std::string &path, const std::string &oldname, std::string oldPath = path + oldname; std::string newPath = path + name; - // Rename a file -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) - 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)) - { - if (!DeleteFileA(_new.c_str())) - { - CCLOGERROR("Fail to delete file %s !Error code is 0x%x", newPath.c_str(), GetLastError()); - } - } - - if (MoveFileA(_old.c_str(), _new.c_str())) - { - return true; - } - else - { - CCLOGERROR("Fail to rename file %s to %s !Error code is 0x%x", oldPath.c_str(), newPath.c_str(), GetLastError()); - return false; - } -#else int errorCode = rename(oldPath.c_str(), newPath.c_str()); if (0 != errorCode) @@ -1344,9 +1214,14 @@ bool FileUtils::renameFile(const std::string &path, const std::string &oldname, return false; } return true; -#endif } +std::string FileUtils::getSuitableFOpen(const std::string& filenameUtf8) const +{ + return filenameUtf8; +} + +#endif long FileUtils::getFileSize(const std::string &filepath) { CCASSERT(!filepath.empty(), "Invalid path"); @@ -1390,68 +1265,5 @@ bool FileUtils::isPopupNotify() const return s_popupNotify; } -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) -static std::wstring StringUtf8ToWideChar(const std::string& strUtf8) -{ - std::wstring ret; - if (!strUtf8.empty()) - { - int nNum = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, nullptr, 0); - if (nNum) - { - WCHAR* wideCharString = new WCHAR[nNum + 1]; - wideCharString[0] = 0; - - nNum = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, wideCharString, nNum + 1); - - ret = wideCharString; - delete[] wideCharString; - } - else - { - CCLOG("Wrong convert to WideChar code:0x%x", GetLastError()); - } - } - return ret; -} - -static std::string UTF8StringToMultiByte(const std::string& strUtf8) -{ - std::string ret; - if (!strUtf8.empty()) - { - std::wstring strWideChar = StringUtf8ToWideChar(strUtf8); - int nNum = WideCharToMultiByte(CP_ACP, 0, strWideChar.c_str(), -1, nullptr, 0, nullptr, FALSE); - if (nNum) - { - char* ansiString = new char[nNum + 1]; - ansiString[0] = 0; - - nNum = WideCharToMultiByte(CP_ACP, 0, strWideChar.c_str(), -1, ansiString, nNum + 1, nullptr, FALSE); - - ret = ansiString; - delete[] ansiString; - } - else - { - CCLOG("Wrong convert to Ansi code:0x%x", GetLastError()); - } - } - - return ret; -} - -std::string FileUtils::getSuitableFOpen(const std::string& filenameUtf8) const -{ - return UTF8StringToMultiByte(filenameUtf8); -} -#else -std::string FileUtils::getSuitableFOpen(const std::string& filenameUtf8) const -{ - return filenameUtf8; -} - -#endif - NS_CC_END diff --git a/cocos/platform/CCFileUtils.h b/cocos/platform/CCFileUtils.h index aa788aa11e..5b11a3c730 100644 --- a/cocos/platform/CCFileUtils.h +++ b/cocos/platform/CCFileUtils.h @@ -497,7 +497,7 @@ protected: * @param dirPath The directory (with absolute path) to look up for * @return Returns true if the directory found at the given absolute path, otherwise returns false */ - virtual bool isDirectoryExistInternal(const std::string& dirPath) const = 0; + virtual bool isDirectoryExistInternal(const std::string& dirPath) const; /** * Gets full path for filename, resolution directory and search path. diff --git a/cocos/platform/apple/CCFileUtils-apple.h b/cocos/platform/apple/CCFileUtils-apple.h index 8d23520e74..add8109323 100644 --- a/cocos/platform/apple/CCFileUtils-apple.h +++ b/cocos/platform/apple/CCFileUtils-apple.h @@ -57,7 +57,8 @@ public: void setBundle(NSBundle* bundle); private: virtual bool isFileExistInternal(const std::string& filePath) const override; - virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; + virtual bool removeDirectory(const std::string& dirPath) override; + NSBundle* getBundle() const; NSBundle* _bundle; }; diff --git a/cocos/platform/apple/CCFileUtils-apple.mm b/cocos/platform/apple/CCFileUtils-apple.mm index 4debc348b0..d4aa2e76df 100644 --- a/cocos/platform/apple/CCFileUtils-apple.mm +++ b/cocos/platform/apple/CCFileUtils-apple.mm @@ -394,14 +394,29 @@ bool FileUtilsApple::isFileExistInternal(const std::string& filePath) const return ret; } -bool FileUtilsApple::isDirectoryExistInternal(const std::string& dirPath) const +static int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) { - struct stat st; - if (stat(dirPath.c_str(), &st) == 0) + auto ret = remove(fpath); + if (ret) { - return S_ISDIR(st.st_mode); + log("Fail to remove: %s ",fpath); } - return false; + + return ret; +} + +bool FileUtilsApple::removeDirectory(const std::string& path) +{ + if (path.size() > 0 && path[path.size() - 1] != '/') + { + CCLOGERROR("Fail to remove directory, path must termniate with '/': %s", path.c_str()); + return false; + } + + if (nftw(path.c_str(),unlink_cb, 64, FTW_DEPTH | FTW_PHYS)) + return false; + else + return true; } std::string FileUtilsApple::getFullPathForDirectoryAndFilename(const std::string& directory, const std::string& filename) const diff --git a/cocos/platform/linux/CCFileUtils-linux.cpp b/cocos/platform/linux/CCFileUtils-linux.cpp index 7cd958ffb7..cd915e940d 100644 --- a/cocos/platform/linux/CCFileUtils-linux.cpp +++ b/cocos/platform/linux/CCFileUtils-linux.cpp @@ -122,16 +122,6 @@ bool FileUtilsLinux::isFileExistInternal(const std::string& strFilePath) const return (stat(strPath.c_str(), &sts) != -1) ? true : false; } -bool FileUtilsLinux::isDirectoryExistInternal(const std::string& dirPath) const -{ - struct stat st; - if (stat(dirPath.c_str(), &st) == 0) - { - return S_ISDIR(st.st_mode); - } - return false; -} - NS_CC_END #endif // CC_TARGET_PLATFORM == CC_PLATFORM_LINUX diff --git a/cocos/platform/linux/CCFileUtils-linux.h b/cocos/platform/linux/CCFileUtils-linux.h index 1605e8289f..2cddbb5ecb 100644 --- a/cocos/platform/linux/CCFileUtils-linux.h +++ b/cocos/platform/linux/CCFileUtils-linux.h @@ -53,7 +53,6 @@ public: virtual std::string getWritablePath() const; private: virtual bool isFileExistInternal(const std::string& strFilePath) const override; - virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; }; // end of platform group diff --git a/cocos/platform/win32/CCFileUtils-win32.cpp b/cocos/platform/win32/CCFileUtils-win32.cpp index 488e761052..27a2444809 100644 --- a/cocos/platform/win32/CCFileUtils-win32.cpp +++ b/cocos/platform/win32/CCFileUtils-win32.cpp @@ -30,6 +30,7 @@ THE SOFTWARE. #include "platform/CCCommon.h" #include #include +#include using namespace std; @@ -56,6 +57,81 @@ static inline std::string convertPathFormatToUnixStyle(const std::string& path) return ret; } +static std::wstring StringUtf8ToWideChar(const std::string& strUtf8) +{ + std::wstring ret; + if (!strUtf8.empty()) + { + int nNum = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, nullptr, 0); + if (nNum) + { + WCHAR* wideCharString = new WCHAR[nNum + 1]; + wideCharString[0] = 0; + + nNum = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, wideCharString, nNum + 1); + + ret = wideCharString; + delete[] wideCharString; + } + else + { + CCLOG("Wrong convert to WideChar code:0x%x", GetLastError()); + } + } + return ret; +} + +static std::string StringWideCharToUtf8(const std::wstring& strWideChar) +{ + std::string ret; + if (!strWideChar.empty()) + { + int nNum = WideCharToMultiByte(CP_UTF8, 0, strWideChar.c_str(), -1, nullptr, 0, nullptr, FALSE); + if (nNum) + { + char* utf8String = new char[nNum + 1]; + utf8String[0] = 0; + + nNum = WideCharToMultiByte(CP_UTF8, 0, strWideChar.c_str(), -1, utf8String, nNum + 1, nullptr, FALSE); + + ret = utf8String; + delete[] utf8String; + } + else + { + CCLOG("Wrong convert to Utf8 code:0x%x", GetLastError()); + } + } + + return ret; +} + +static std::string UTF8StringToMultiByte(const std::string& strUtf8) +{ + std::string ret; + if (!strUtf8.empty()) + { + std::wstring strWideChar = StringUtf8ToWideChar(strUtf8); + int nNum = WideCharToMultiByte(CP_ACP, 0, strWideChar.c_str(), -1, nullptr, 0, nullptr, FALSE); + if (nNum) + { + char* ansiString = new char[nNum + 1]; + ansiString[0] = 0; + + nNum = WideCharToMultiByte(CP_ACP, 0, strWideChar.c_str(), -1, ansiString, nNum + 1, nullptr, FALSE); + + ret = ansiString; + delete[] ansiString; + } + else + { + CCLOG("Wrong convert to Ansi code:0x%x", GetLastError()); + } + } + + return ret; +} + static void _checkPath() { if (0 == s_resourcePath.length()) @@ -99,6 +175,22 @@ bool FileUtilsWin32::init() return FileUtils::init(); } +bool FileUtilsWin32::isDirectoryExistInternal(const std::string& dirPath) const +{ + unsigned long fAttrib = GetFileAttributes(StringUtf8ToWideChar(dirPath).c_str()); + if (fAttrib != INVALID_FILE_ATTRIBUTES && + (fAttrib & FILE_ATTRIBUTE_DIRECTORY)) + { + return true; + } + return false; +} + +std::string FileUtilsWin32::getSuitableFOpen(const std::string& filenameUtf8) const +{ + return UTF8StringToMultiByte(filenameUtf8); +} + bool FileUtilsWin32::isFileExistInternal(const std::string& strFilePath) const { if (0 == strFilePath.length()) @@ -112,26 +204,12 @@ bool FileUtilsWin32::isFileExistInternal(const std::string& strFilePath) const strPath.insert(0, _defaultResRootPath); } - WCHAR utf16Buf[CC_MAX_PATH] = {0}; - MultiByteToWideChar(CP_UTF8, 0, strPath.c_str(), -1, utf16Buf, sizeof(utf16Buf)/sizeof(utf16Buf[0])); - - DWORD attr = GetFileAttributesW(utf16Buf); + DWORD attr = GetFileAttributesW(StringUtf8ToWideChar(strPath).c_str()); if(attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY)) return false; // not a file return true; } -bool FileUtilsWin32::isDirectoryExistInternal(const std::string& dirPath) const -{ - unsigned long fAttrib = GetFileAttributesA(dirPath.c_str()); - if (fAttrib != INVALID_FILE_ATTRIBUTES && - (fAttrib & FILE_ATTRIBUTE_DIRECTORY)) - { - return true; - } - return false; -} - bool FileUtilsWin32::isAbsolutePath(const std::string& strPath) const { if ( (strPath.length() > 2 @@ -206,10 +284,7 @@ static Data getData(const std::string& filename, bool forString) // check if the filename uses correct case characters CC_BREAK_IF(!checkFileName(fullPath, filename)); - WCHAR wszBuf[CC_MAX_PATH] = {0}; - MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf)/sizeof(wszBuf[0])); - - HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); + HANDLE fileHandle = ::CreateFile(StringUtf8ToWideChar(fullPath).c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE); size = ::GetFileSize(fileHandle, nullptr); @@ -291,10 +366,7 @@ unsigned char* FileUtilsWin32::getFileData(const std::string& filename, const ch // check if the filename uses correct case characters CC_BREAK_IF(!checkFileName(fullPath, filename)); - WCHAR wszBuf[CC_MAX_PATH] = {0}; - MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf)/sizeof(wszBuf[0])); - - HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); + HANDLE fileHandle = ::CreateFile(StringUtf8ToWideChar(fullPath).c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE); *size = ::GetFileSize(fileHandle, nullptr); @@ -351,49 +423,191 @@ string FileUtilsWin32::getWritablePath() const } // Get full path of executable, e.g. c:\Program Files (x86)\My Game Folder\MyGame.exe - char full_path[CC_MAX_PATH + 1]; - ::GetModuleFileNameA(nullptr, full_path, CC_MAX_PATH + 1); + WCHAR full_path[CC_MAX_PATH + 1] = { 0 }; + ::GetModuleFileName(nullptr, full_path, CC_MAX_PATH + 1); // Debug app uses executable directory; Non-debug app uses local app data directory //#ifndef _DEBUG - // Get filename of executable only, e.g. MyGame.exe - char *base_name = strrchr(full_path, '\\'); + // Get filename of executable only, e.g. MyGame.exe + WCHAR *base_name = wcsrchr(full_path, '\\'); + wstring retPath; + if(base_name) + { + WCHAR app_data_path[CC_MAX_PATH + 1]; - if(base_name) + // Get local app data directory, e.g. C:\Documents and Settings\username\Local Settings\Application Data + if (SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, app_data_path))) { - char app_data_path[CC_MAX_PATH + 1]; + wstring ret(app_data_path); - // Get local app data directory, e.g. C:\Documents and Settings\username\Local Settings\Application Data - if (SUCCEEDED(SHGetFolderPathA(nullptr, CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, app_data_path))) + // Adding executable filename, e.g. C:\Documents and Settings\username\Local Settings\Application Data\MyGame.exe + ret += base_name; + + // Remove ".exe" extension, e.g. C:\Documents and Settings\username\Local Settings\Application Data\MyGame + ret = ret.substr(0, ret.rfind(L".")); + + ret += L"\\"; + + // Create directory + if (SUCCEEDED(SHCreateDirectoryEx(nullptr, ret.c_str(), nullptr))) { - string ret((char*)app_data_path); + retPath = ret; + } + } + } + if (retPath.empty()) +//#endif // not defined _DEBUG + { + // If fetching of local app data directory fails, use the executable one + retPath = full_path; - // Adding executable filename, e.g. C:\Documents and Settings\username\Local Settings\Application Data\MyGame.exe - ret += base_name; + // remove xxx.exe + retPath = retPath.substr(0, retPath.rfind(L"\\") + 1); + } - // Remove ".exe" extension, e.g. C:\Documents and Settings\username\Local Settings\Application Data\MyGame - ret = ret.substr(0, ret.rfind(".")); + return convertPathFormatToUnixStyle(StringWideCharToUtf8(retPath)); +} - ret += "\\"; +bool FileUtilsWin32::renameFile(const std::string &path, const std::string &oldname, const std::string &name) +{ + CCASSERT(!path.empty(), "Invalid path"); + std::string oldPath = path + oldname; + std::string newPath = path + name; - // Create directory - if (SUCCEEDED(SHCreateDirectoryExA(nullptr, ret.c_str(), nullptr))) + std::regex pat("\\/"); + std::string _old = std::regex_replace(oldPath, pat, "\\"); + std::string _new = std::regex_replace(newPath, pat, "\\"); + + std::wstring _wNew = StringUtf8ToWideChar(_new); + + if (FileUtils::getInstance()->isFileExist(_new)) + { + if (!DeleteFile(_wNew.c_str())) + { + CCLOGERROR("Fail to delete file %s !Error code is 0x%x", newPath.c_str(), GetLastError()); + } + } + + if (MoveFile(StringUtf8ToWideChar(_old).c_str(), _wNew.c_str())) + { + return true; + } + else + { + CCLOGERROR("Fail to rename file %s to %s !Error code is 0x%x", oldPath.c_str(), newPath.c_str(), GetLastError()); + return false; + } +} + +bool FileUtilsWin32::createDirectory(const std::string& dirPath) +{ + CCASSERT(!dirPath.empty(), "Invalid path"); + + if (isDirectoryExist(dirPath)) + return true; + + std::wstring path = StringUtf8ToWideChar(dirPath); + + // Split the path + size_t start = 0; + size_t found = path.find_first_of(L"/\\", start); + std::wstring subpath; + std::vector dirs; + + if (found != std::wstring::npos) + { + while (true) + { + subpath = path.substr(start, found - start + 1); + if (!subpath.empty()) + dirs.push_back(subpath); + start = found + 1; + found = path.find_first_of(L"/\\", start); + if (found == std::wstring::npos) + { + if (start < path.length()) { - return convertPathFormatToUnixStyle(ret); + dirs.push_back(path.substr(start)); + } + break; + } + } + } + + if ((GetFileAttributes(path.c_str())) == INVALID_FILE_ATTRIBUTES) + { + subpath = L""; + for (unsigned int i = 0; i < dirs.size(); ++i) + { + subpath += dirs[i]; + + std::string utf8Path = StringWideCharToUtf8(subpath); + if (!isDirectoryExist(utf8Path)) + { + BOOL ret = CreateDirectory(subpath.c_str(), NULL); + if (!ret && ERROR_ALREADY_EXISTS != GetLastError()) + { + CCLOGERROR("Fail create directory %s !Error code is 0x%x", utf8Path.c_str(), GetLastError()); + return false; } } } -//#endif // not defined _DEBUG + } + return true; +} - // If fetching of local app data directory fails, use the executable one - string ret((char*)full_path); +bool FileUtilsWin32::removeFile(const std::string &filepath) +{ + std::regex pat("\\/"); + std::string win32path = std::regex_replace(filepath, pat, "\\"); - // remove xxx.exe - ret = ret.substr(0, ret.rfind("\\") + 1); + if (DeleteFile(StringUtf8ToWideChar(win32path).c_str())) + { + return true; + } + else + { + CCLOGERROR("Fail remove file %s !Error code is 0x%x", filepath.c_str(), GetLastError()); + return false; + } +} - ret = convertPathFormatToUnixStyle(ret); - - return ret; +bool FileUtilsWin32::removeDirectory(const std::string& dirPath) +{ + std::wstring wpath = StringUtf8ToWideChar(dirPath); + std::wstring files = wpath + L"*.*"; + WIN32_FIND_DATA wfd; + HANDLE search = FindFirstFileEx(files.c_str(), FindExInfoStandard, &wfd, FindExSearchNameMatch, NULL, 0); + bool ret = true; + if (search != INVALID_HANDLE_VALUE) + { + BOOL find = true; + while (find) + { + //. .. + if (wfd.cFileName[0] != '.') + { + std::wstring temp = wpath + wfd.cFileName; + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + temp += '/'; + ret = ret && this->removeDirectory(StringWideCharToUtf8(temp)); + } + else + { + SetFileAttributes(temp.c_str(), FILE_ATTRIBUTE_NORMAL); + ret = ret && DeleteFile(temp.c_str()); + } + } + find = FindNextFile(search, &wfd); + } + FindClose(search); + } + if (ret && RemoveDirectory(wpath.c_str())) + { + return true; + } + return false; } NS_CC_END diff --git a/cocos/platform/win32/CCFileUtils-win32.h b/cocos/platform/win32/CCFileUtils-win32.h index 86e0f9d4d9..fdb57df7ab 100644 --- a/cocos/platform/win32/CCFileUtils-win32.h +++ b/cocos/platform/win32/CCFileUtils-win32.h @@ -49,12 +49,54 @@ class CC_DLL FileUtilsWin32 : public FileUtils public: /* override funtions */ bool init(); - virtual std::string getWritablePath() const; - virtual bool isAbsolutePath(const std::string& strPath) const; + virtual std::string getWritablePath() const override; + virtual bool isAbsolutePath(const std::string& strPath) const override; + virtual std::string getSuitableFOpen(const std::string& filenameUtf8) const override; protected: virtual bool isFileExistInternal(const std::string& strFilePath) const override; + + /** + * Renames a file under the given directory. + * + * @param path The parent directory path of the file, it must be an absolute path. + * @param oldname The current name of the file. + * @param name The new name of the file. + * @return True if the file have been renamed successfully, false if not. + */ + virtual bool renameFile(const std::string &path, const std::string &oldname, const std::string &name) override; + + /** + * Checks whether a directory exists without considering search paths and resolution orders. + * @param dirPath The directory (with absolute path) to look up for + * @return Returns true if the directory found at the given absolute path, otherwise returns false + */ virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; + + /** + * Removes a file. + * + * @param filepath The full path of the file, it must be an absolute path. + * @return True if the file have been removed successfully, false if not. + */ + virtual bool removeFile(const std::string &filepath) override; + + /** + * Creates a directory. + * + * @param dirPath The path of the directory, it must be an absolute path. + * @return True if the directory have been created successfully, false if not. + */ + virtual bool createDirectory(const std::string& dirPath) override; + + /** + * Removes a directory. + * + * @param dirPath The full path of the directory, it must be an absolute path. + * @return True if the directory have been removed successfully, false if not. + */ + virtual bool removeDirectory(const std::string& dirPath) override; + /** * Gets resource file data * @@ -64,7 +106,7 @@ protected: * @return Upon success, a pointer to the data is returned, otherwise NULL. * @warning Recall: you are responsible for calling delete[] on any Non-NULL pointer returned. */ - virtual unsigned char* getFileData(const std::string& filename, const char* mode, ssize_t * size) override; + CC_DEPRECATED_ATTRIBUTE virtual unsigned char* getFileData(const std::string& filename, const char* mode, ssize_t * size) override; /** * Gets string from a file. diff --git a/cocos/platform/winrt/CCFileUtilsWinRT.cpp b/cocos/platform/winrt/CCFileUtilsWinRT.cpp index 78cfb434bf..5a474b83fb 100644 --- a/cocos/platform/winrt/CCFileUtilsWinRT.cpp +++ b/cocos/platform/winrt/CCFileUtilsWinRT.cpp @@ -23,9 +23,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "CCFileUtilsWinRT.h" +#include #include "CCWinRTUtils.h" #include "platform/CCCommon.h" - using namespace std; NS_CC_BEGIN @@ -47,6 +47,80 @@ static inline std::string convertPathFormatToUnixStyle(const std::string& path) return ret; } +static std::wstring StringUtf8ToWideChar(const std::string& strUtf8) +{ + std::wstring ret; + if (!strUtf8.empty()) + { + int nNum = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, nullptr, 0); + if (nNum) + { + WCHAR* wideCharString = new WCHAR[nNum + 1]; + wideCharString[0] = 0; + + nNum = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, wideCharString, nNum + 1); + + ret = wideCharString; + delete[] wideCharString; + } + else + { + CCLOG("Wrong convert to WideChar code:0x%x", GetLastError()); + } + } + return ret; +} + +static std::string StringWideCharToUtf8(const std::wstring& strWideChar) +{ + std::string ret; + if (!strWideChar.empty()) + { + int nNum = WideCharToMultiByte(CP_UTF8, 0, strWideChar.c_str(), -1, nullptr, 0, nullptr, FALSE); + if (nNum) + { + char* utf8String = new char[nNum + 1]; + utf8String[0] = 0; + + nNum = WideCharToMultiByte(CP_UTF8, 0, strWideChar.c_str(), -1, utf8String, nNum + 1, nullptr, FALSE); + + ret = utf8String; + delete[] utf8String; + } + else + { + CCLOG("Wrong convert to Utf8 code:0x%x", GetLastError()); + } + } + + return ret; +} + +static std::string UTF8StringToMultiByte(const std::string& strUtf8) +{ + std::string ret; + if (!strUtf8.empty()) + { + std::wstring strWideChar = StringUtf8ToWideChar(strUtf8); + int nNum = WideCharToMultiByte(CP_ACP, 0, strWideChar.c_str(), -1, nullptr, 0, nullptr, FALSE); + if (nNum) + { + char* ansiString = new char[nNum + 1]; + ansiString[0] = 0; + + nNum = WideCharToMultiByte(CP_ACP, 0, strWideChar.c_str(), -1, ansiString, nNum + 1, nullptr, FALSE); + + ret = ansiString; + delete[] ansiString; + } + else + { + CCLOG("Wrong convert to Ansi code:0x%x", GetLastError()); + } + } + + return ret; +} static void _checkPath() { @@ -72,7 +146,6 @@ FileUtils* FileUtils::getInstance() return s_sharedFileUtils; } - CCFileUtilsWinRT::CCFileUtilsWinRT() { } @@ -100,6 +173,11 @@ std::string CCFileUtilsWinRT::getFullPathForDirectoryAndFilename(const std::stri return FileUtils::getFullPathForDirectoryAndFilename(unixDirectory, unixFilename); } +std::string CCFileUtilsWinRT::getSuitableFOpen(const std::string& filenameUtf8) const +{ + return UTF8StringToMultiByte(filenameUtf8); +} + bool CCFileUtilsWinRT::isFileExistInternal(const std::string& strFilePath) const { bool ret = false; @@ -132,6 +210,99 @@ bool CCFileUtilsWinRT::isDirectoryExistInternal(const std::string& dirPath) cons return false; } +bool CCFileUtilsWinRT::createDirectory(const std::string& path) +{ + CCASSERT(!path.empty(), "Invalid path"); + + if (isDirectoryExist(path)) + return true; + + // Split the path + size_t start = 0; + size_t found = path.find_first_of("/\\", start); + std::string subpath; + std::vector dirs; + + if (found != std::string::npos) + { + while (true) + { + subpath = path.substr(start, found - start + 1); + if (!subpath.empty()) + dirs.push_back(subpath); + start = found + 1; + found = path.find_first_of("/\\", start); + if (found == std::string::npos) + { + if (start < path.length()) + { + dirs.push_back(path.substr(start)); + } + break; + } + } + } + + WIN32_FILE_ATTRIBUTE_DATA wfad; + std::wstring wpath(path.begin(), path.end()); + if (!(GetFileAttributesEx(wpath.c_str(), GetFileExInfoStandard, &wfad))) + { + subpath = ""; + for (unsigned int i = 0; i < dirs.size(); ++i) + { + subpath += dirs[i]; + if (i > 0 && !isDirectoryExist(subpath)) + { + std::wstring wsubpath(subpath.begin(), subpath.end()); + BOOL ret = CreateDirectory(wsubpath.c_str(), NULL); + if (!ret && ERROR_ALREADY_EXISTS != GetLastError()) + { + return false; + } + } + } + } + return true; +} + +bool CCFileUtilsWinRT::removeDirectory(const std::string& path) +{ + std::wstring wpath = std::wstring(path.begin(), path.end()); + std::wstring files = wpath + L"*.*"; + WIN32_FIND_DATA wfd; + HANDLE search = FindFirstFileEx(files.c_str(), FindExInfoStandard, &wfd, FindExSearchNameMatch, NULL, 0); + bool ret = true; + if (search != INVALID_HANDLE_VALUE) + { + BOOL find = true; + while (find) + { + //. .. + if (wfd.cFileName[0] != '.') + { + std::wstring temp = wpath + wfd.cFileName; + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + temp += '/'; + ret = ret && this->removeDirectory(std::string(temp.begin(), temp.end())); + } + else + { + SetFileAttributes(temp.c_str(), FILE_ATTRIBUTE_NORMAL); + ret = ret && DeleteFile(temp.c_str()); + } + } + find = FindNextFile(search, &wfd); + } + FindClose(search); + } + if (ret && RemoveDirectory(wpath.c_str())) + { + return true; + } + return false; +} + bool CCFileUtilsWinRT::isAbsolutePath(const std::string& strPath) const { if ( strPath.length() > 2 @@ -143,6 +314,34 @@ bool CCFileUtilsWinRT::isAbsolutePath(const std::string& strPath) const return false; } +bool CCFileUtilsWinRT::removeFile(const std::string &path) +{ + std::wstring wpath(path.begin(), path.end()); + if (DeleteFile(wpath.c_str())) + { + return true; + } + return false; +} + +bool CCFileUtilsWinRT::renameFile(const std::string &path, const std::string &oldname, const std::string &name) +{ + CCASSERT(!path.empty(), "Invalid path"); + std::string oldPath = path + oldname; + std::string newPath = path + name; + + 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; +} + static Data getData(const std::string& filename, bool forString) { if (filename.empty()) diff --git a/cocos/platform/winrt/CCFileUtilsWinRT.h b/cocos/platform/winrt/CCFileUtilsWinRT.h index 9cbd6a70a6..e6db42abe4 100644 --- a/cocos/platform/winrt/CCFileUtilsWinRT.h +++ b/cocos/platform/winrt/CCFileUtilsWinRT.h @@ -49,14 +49,55 @@ public: bool init(); virtual std::string getWritablePath() const; virtual bool isAbsolutePath(const std::string& strPath) const; - virtual std::string getPathForFilename(const std::string& filename, const std::string& resolutionDirectory, const std::string& searchPath) const override; + virtual std::string getPathForFilename(const std::string& filename, const std::string& resolutionDirectory, const std::string& searchPath) const override; virtual std::string getFullPathForDirectoryAndFilename(const std::string& strDirectory, const std::string& strFilename) const override; virtual std::string getStringFromFile(const std::string& filename) override; + virtual std::string getSuitableFOpen(const std::string& filenameUtf8) const override; static std::string getAppPath(); private: virtual bool isFileExistInternal(const std::string& strFilePath) const override; + + /** + * Renames a file under the given directory. + * + * @param path The parent directory path of the file, it must be an absolute path. + * @param oldname The current name of the file. + * @param name The new name of the file. + * @return True if the file have been renamed successfully, false if not. + */ + virtual bool renameFile(const std::string &path, const std::string &oldname, const std::string &name) override; + + /** + * Checks whether a directory exists without considering search paths and resolution orders. + * @param dirPath The directory (with absolute path) to look up for + * @return Returns true if the directory found at the given absolute path, otherwise returns false + */ virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; + + /** + * Removes a file. + * + * @param filepath The full path of the file, it must be an absolute path. + * @return True if the file have been removed successfully, false if not. + */ + virtual bool removeFile(const std::string &filepath) override; + + /** + * Creates a directory. + * + * @param dirPath The path of the directory, it must be an absolute path. + * @return True if the directory have been created successfully, false if not. + */ + virtual bool createDirectory(const std::string& dirPath) override; + + /** + * Removes a directory. + * + * @param dirPath The full path of the directory, it must be an absolute path. + * @return True if the directory have been removed successfully, false if not. + */ + virtual bool removeDirectory(const std::string& dirPath) override; }; // end of platform group diff --git a/tests/cpp-tests/proj.android-studio/app/jni/Android.mk b/tests/cpp-tests/proj.android-studio/app/jni/Android.mk index bc7073018c..ad86e4c835 100644 --- a/tests/cpp-tests/proj.android-studio/app/jni/Android.mk +++ b/tests/cpp-tests/proj.android-studio/app/jni/Android.mk @@ -95,6 +95,7 @@ LOCAL_SRC_FILES := main.cpp \ ../../../Classes/NewAudioEngineTest/NewAudioEngineTest.cpp \ ../../../Classes/NewEventDispatcherTest/NewEventDispatcherTest.cpp \ ../../../Classes/NewRendererTest/NewRendererTest.cpp \ +../../../Classes/NavMeshTest/NavMeshTest.cpp \ ../../../Classes/NodeTest/NodeTest.cpp \ ../../../Classes/OpenURLTest/OpenURLTest.cpp \ ../../../Classes/ParallaxTest/ParallaxTest.cpp \ @@ -201,10 +202,10 @@ LOCAL_SRC_FILES := main.cpp \ ../../../Classes/UnitTest/UnitTest.cpp \ ../../../Classes/UserDefaultTest/UserDefaultTest.cpp \ ../../../Classes/VisibleRect.cpp \ +../../../Classes/VibrateTest/VibrateTest.cpp \ ../../../Classes/ZwoptexTest/ZwoptexTest.cpp \ ../../../Classes/controller.cpp \ -../../../Classes/testBasic.cpp \ -../../../Classes/NavMeshTest/NavMeshTest.cpp +../../../Classes/testBasic.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes \ $(LOCAL_PATH)/../../../../.. diff --git a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters index b245f7bcdc..2848d57fe6 100644 --- a/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters +++ b/tests/cpp-tests/proj.win8.1-universal/cpp-tests.Shared/cpp-tests.Shared.vcxitems.filters @@ -799,6 +799,7 @@ Classes\NavMeshTest + @@ -1260,9 +1261,6 @@ Classes\UITest\CocostudioGUISceneTest\UICheckBoxTest - - Classes\UITest\CocostudioGUISceneTest\UIRadioButtonTest - Classes\UITest\CocostudioGUISceneTest\UIFocusTest @@ -1780,4 +1778,4 @@ Classes\NavMeshTest - + \ No newline at end of file From 697f21d3d14da70447c84e51309c96da8c1b8c72 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Mon, 13 Jul 2015 09:15:10 +0000 Subject: [PATCH 52/93] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../lua-bindings/auto/api/AudioEngine.lua | 8 ++++ .../auto/lua_cocos2dx_audioengine_auto.cpp | 37 +++++++++++++++++++ .../auto/lua_cocos2dx_audioengine_auto.hpp | 1 + 3 files changed, 46 insertions(+) diff --git a/cocos/scripting/lua-bindings/auto/api/AudioEngine.lua b/cocos/scripting/lua-bindings/auto/api/AudioEngine.lua index 9fcf68b382..5f4387f5dd 100644 --- a/cocos/scripting/lua-bindings/auto/api/AudioEngine.lua +++ b/cocos/scripting/lua-bindings/auto/api/AudioEngine.lua @@ -121,6 +121,14 @@ -- @param #float volume -- @return experimental::AudioEngine#experimental::AudioEngine self (return value: cc.experimental::AudioEngine) +-------------------------------- +-- Preload audio file.
+-- param filePath The file path of an audio. +-- @function [parent=#AudioEngine] preload +-- @param self +-- @param #string filePath +-- @return experimental::AudioEngine#experimental::AudioEngine self (return value: cc.experimental::AudioEngine) + -------------------------------- -- Play 2d sound.
-- param filePath The path of an audio file.
diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp index cd28c13787..a899e762ed 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp @@ -590,6 +590,42 @@ int lua_cocos2dx_audioengine_AudioEngine_setVolume(lua_State* tolua_S) #endif return 0; } +int lua_cocos2dx_audioengine_AudioEngine_preload(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,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 1) + { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:preload"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_preload'", nullptr); + return 0; + } + cocos2d::experimental::AudioEngine::preload(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:preload",argc, 1); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_audioengine_AudioEngine_preload'.",&tolua_err); +#endif + return 0; +} int lua_cocos2dx_audioengine_AudioEngine_play2d(lua_State* tolua_S) { int argc = 0; @@ -968,6 +1004,7 @@ int lua_register_cocos2dx_audioengine_AudioEngine(lua_State* tolua_S) tolua_function(tolua_S,"pauseAll", lua_cocos2dx_audioengine_AudioEngine_pauseAll); tolua_function(tolua_S,"uncacheAll", lua_cocos2dx_audioengine_AudioEngine_uncacheAll); tolua_function(tolua_S,"setVolume", lua_cocos2dx_audioengine_AudioEngine_setVolume); + tolua_function(tolua_S,"preload", lua_cocos2dx_audioengine_AudioEngine_preload); tolua_function(tolua_S,"play2d", lua_cocos2dx_audioengine_AudioEngine_play2d); tolua_function(tolua_S,"getState", lua_cocos2dx_audioengine_AudioEngine_getState); tolua_function(tolua_S,"resume", lua_cocos2dx_audioengine_AudioEngine_resume); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp index 8986dd181d..01e0146510 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp @@ -37,6 +37,7 @@ int register_all_cocos2dx_audioengine(lua_State* tolua_S); + #endif // __cocos2dx_audioengine_h__ From 8b50c307e5b32ac39ffbbc5087c91a2a0f2ae812 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Mon, 13 Jul 2015 09:35:35 +0000 Subject: [PATCH 53/93] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../lua-bindings/auto/api/AudioEngine.lua | 8 ++++ .../auto/lua_cocos2dx_audioengine_auto.cpp | 37 +++++++++++++++++++ .../auto/lua_cocos2dx_audioengine_auto.hpp | 1 + 3 files changed, 46 insertions(+) diff --git a/cocos/scripting/lua-bindings/auto/api/AudioEngine.lua b/cocos/scripting/lua-bindings/auto/api/AudioEngine.lua index 9fcf68b382..5f4387f5dd 100644 --- a/cocos/scripting/lua-bindings/auto/api/AudioEngine.lua +++ b/cocos/scripting/lua-bindings/auto/api/AudioEngine.lua @@ -121,6 +121,14 @@ -- @param #float volume -- @return experimental::AudioEngine#experimental::AudioEngine self (return value: cc.experimental::AudioEngine) +-------------------------------- +-- Preload audio file.
+-- param filePath The file path of an audio. +-- @function [parent=#AudioEngine] preload +-- @param self +-- @param #string filePath +-- @return experimental::AudioEngine#experimental::AudioEngine self (return value: cc.experimental::AudioEngine) + -------------------------------- -- Play 2d sound.
-- param filePath The path of an audio file.
diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp index cd28c13787..a899e762ed 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.cpp @@ -590,6 +590,42 @@ int lua_cocos2dx_audioengine_AudioEngine_setVolume(lua_State* tolua_S) #endif return 0; } +int lua_cocos2dx_audioengine_AudioEngine_preload(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,"ccexp.AudioEngine",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 1) + { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccexp.AudioEngine:preload"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_audioengine_AudioEngine_preload'", nullptr); + return 0; + } + cocos2d::experimental::AudioEngine::preload(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccexp.AudioEngine:preload",argc, 1); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_audioengine_AudioEngine_preload'.",&tolua_err); +#endif + return 0; +} int lua_cocos2dx_audioengine_AudioEngine_play2d(lua_State* tolua_S) { int argc = 0; @@ -968,6 +1004,7 @@ int lua_register_cocos2dx_audioengine_AudioEngine(lua_State* tolua_S) tolua_function(tolua_S,"pauseAll", lua_cocos2dx_audioengine_AudioEngine_pauseAll); tolua_function(tolua_S,"uncacheAll", lua_cocos2dx_audioengine_AudioEngine_uncacheAll); tolua_function(tolua_S,"setVolume", lua_cocos2dx_audioengine_AudioEngine_setVolume); + tolua_function(tolua_S,"preload", lua_cocos2dx_audioengine_AudioEngine_preload); tolua_function(tolua_S,"play2d", lua_cocos2dx_audioengine_AudioEngine_play2d); tolua_function(tolua_S,"getState", lua_cocos2dx_audioengine_AudioEngine_getState); tolua_function(tolua_S,"resume", lua_cocos2dx_audioengine_AudioEngine_resume); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp index 8986dd181d..01e0146510 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_audioengine_auto.hpp @@ -37,6 +37,7 @@ int register_all_cocos2dx_audioengine(lua_State* tolua_S); + #endif // __cocos2dx_audioengine_h__ From f558158667b3324a83c92160a46aec4287fdb598 Mon Sep 17 00:00:00 2001 From: Neo Kim Date: Wed, 8 Jul 2015 13:57:25 +0900 Subject: [PATCH 54/93] Use addProtectedChild() instead of addChild() in ScrollViewBar --- cocos/ui/UIScrollViewBar.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cocos/ui/UIScrollViewBar.cpp b/cocos/ui/UIScrollViewBar.cpp index e005d93d6a..79a0e728f2 100644 --- a/cocos/ui/UIScrollViewBar.cpp +++ b/cocos/ui/UIScrollViewBar.cpp @@ -103,16 +103,16 @@ bool ScrollViewBar::init() _upperHalfCircle = createSpriteFromBase64(HALF_CIRCLE_IMAGE); _upperHalfCircle->setAnchorPoint(Vec2::ANCHOR_MIDDLE_BOTTOM); - addChild(_upperHalfCircle); + addProtectedChild(_upperHalfCircle); _lowerHalfCircle = Sprite::createWithTexture(_upperHalfCircle->getTexture(), _upperHalfCircle->getTextureRect(), _upperHalfCircle->isTextureRectRotated()); _lowerHalfCircle->setScaleY(-1); _lowerHalfCircle->setAnchorPoint(Vec2::ANCHOR_MIDDLE_BOTTOM); - addChild(_lowerHalfCircle); + addProtectedChild(_lowerHalfCircle); _body = createSpriteFromBase64(BODY_IMAGE_1_PIXEL_HEIGHT); _body->setAnchorPoint(Vec2::ANCHOR_MIDDLE_BOTTOM); - addChild(_body); + addProtectedChild(_body); setColor(DEFAULT_COLOR); From 22ea504af8488dc2a05442c9cc857d4b79202c0c Mon Sep 17 00:00:00 2001 From: Neo Kim Date: Wed, 8 Jul 2015 15:16:47 +0900 Subject: [PATCH 55/93] Add methods to manipulate scroll bar's opacity --- cocos/ui/UIScrollView.cpp | 27 +++++++++++++++++++++++++++ cocos/ui/UIScrollView.h | 14 ++++++++++++++ cocos/ui/UIScrollViewBar.cpp | 13 +++++++------ cocos/ui/UIScrollViewBar.h | 4 ++++ 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/cocos/ui/UIScrollView.cpp b/cocos/ui/UIScrollView.cpp index f32cac06be..0cd8587b10 100644 --- a/cocos/ui/UIScrollView.cpp +++ b/cocos/ui/UIScrollView.cpp @@ -1149,6 +1149,33 @@ const Color3B& ScrollView::getScrollBarColor() const return Color3B::WHITE; } +void ScrollView::setScrollBarOpacity(GLubyte opacity) +{ + CCASSERT(_scrollBarEnabled, "Scroll bar should be enabled!"); + if(_verticalScrollBar != nullptr) + { + _verticalScrollBar->setOpacity(opacity); + } + if(_horizontalScrollBar != nullptr) + { + _horizontalScrollBar->setOpacity(opacity); + } +} + +GLubyte ScrollView::getScrollBarOpacity() const +{ + CCASSERT(_scrollBarEnabled, "Scroll bar should be enabled!"); + if(_verticalScrollBar != nullptr) + { + return _verticalScrollBar->getOpacity(); + } + else if(_horizontalScrollBar != nullptr) + { + return _horizontalScrollBar->getOpacity(); + } + return -1; +} + void ScrollView::setScrollBarAutoHideEnabled(bool autoHideEnabled) { CCASSERT(_scrollBarEnabled, "Scroll bar should be enabled!"); diff --git a/cocos/ui/UIScrollView.h b/cocos/ui/UIScrollView.h index 18f318e3a9..741e1528ee 100644 --- a/cocos/ui/UIScrollView.h +++ b/cocos/ui/UIScrollView.h @@ -449,6 +449,20 @@ public: */ const Color3B& getScrollBarColor() const; + /** + * @brief Set the scroll bar's opacity + * + * @param the scroll bar's opacity + */ + void setScrollBarOpacity(GLubyte opacity); + + /** + * @brief Get the scroll bar's opacity + * + * @return the scroll bar's opacity + */ + GLubyte getScrollBarOpacity() const; + /** * @brief Set scroll bar auto hide state * diff --git a/cocos/ui/UIScrollViewBar.cpp b/cocos/ui/UIScrollViewBar.cpp index 79a0e728f2..21413d3574 100644 --- a/cocos/ui/UIScrollViewBar.cpp +++ b/cocos/ui/UIScrollViewBar.cpp @@ -31,8 +31,8 @@ NS_CC_BEGIN namespace ui { -static const char* HALF_CIRCLE_IMAGE = "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAGCAMAAADAMI+zAAAAIVBMVEX///////////////////////////////////////////9/gMdvAAAAC3RSTlMAAgMLLFBTYWNkZuZhN4QAAAAvSURBVAjXRchBDgAgCAPBIi0q/3+wxBiZU7cAjJpTNBSPvMLrf7tqgPkR6hB2xzpFkgIfM9q/8QAAAABJRU5ErkJggg=="; -static const char* BODY_IMAGE_1_PIXEL_HEIGHT = "iVBORw0KGgoAAAANSUhEUgAAAAwAAAABCAMAAADdNb8LAAAAA1BMVEX///+nxBvIAAAAAXRSTlNm5DccCwAAAApJREFUeAFjQAYAAA0AAWHNnKQAAAAASUVORK5CYII="; +static const char* HALF_CIRCLE_IMAGE = "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAGCAMAAADAMI+zAAAAJ1BMVEX///////////////////////////////////////////////////9Ruv0SAAAADHRSTlMABgcbbW7Hz9Dz+PmlcJP5AAAAMElEQVR4AUXHwQ2AQAhFwYcLH1H6r1djzDK3ASxUpTBeK/uTCyz7dx54b44m4p5cD1MwAooEJyk3AAAAAElFTkSuQmCC"; +static const char* BODY_IMAGE_1_PIXEL_HEIGHT = "iVBORw0KGgoAAAANSUhEUgAAAAwAAAABCAMAAADdNb8LAAAAA1BMVEX///+nxBvIAAAACklEQVR4AWNABgAADQABYc2cpAAAAABJRU5ErkJggg=="; static const Color3B DEFAULT_COLOR(52, 65, 87); static const float DEFAULT_MARGIN = 20; @@ -65,6 +65,7 @@ _direction(direction), _upperHalfCircle(nullptr), _lowerHalfCircle(nullptr), _body(nullptr), +_opacity(100), _marginFromBoundary(DEFAULT_MARGIN), _marginForLength(DEFAULT_MARGIN), _touching(false), @@ -123,7 +124,7 @@ bool ScrollViewBar::init() if(_autoHideEnabled) { - setOpacity(0); + ProtectedNode::setOpacity(0); } return true; } @@ -165,7 +166,7 @@ void ScrollViewBar::setWidth(float width) void ScrollViewBar::setAutoHideEnabled(bool autoHideEnabled) { _autoHideEnabled = autoHideEnabled; - setOpacity(255); + ProtectedNode::setOpacity(_opacity); } float ScrollViewBar::getWidth() const @@ -202,7 +203,7 @@ void ScrollViewBar::update(float deltaTime) if(_autoHideRemainingTime <= _autoHideTime) { _autoHideRemainingTime = MAX(0, _autoHideRemainingTime); - this->setOpacity(255 * (_autoHideRemainingTime / _autoHideTime)); + ProtectedNode::setOpacity(_opacity * (_autoHideRemainingTime / _autoHideTime)); } } @@ -236,7 +237,7 @@ void ScrollViewBar::onScrolled(const Vec2& outOfBoundary) if(_autoHideEnabled) { _autoHideRemainingTime = _autoHideTime; - setOpacity(255); + ProtectedNode::setOpacity(_opacity); } Layout* innerContainer = _parent->getInnerContainer(); diff --git a/cocos/ui/UIScrollViewBar.h b/cocos/ui/UIScrollViewBar.h index 8503c6344d..2331720c8b 100644 --- a/cocos/ui/UIScrollViewBar.h +++ b/cocos/ui/UIScrollViewBar.h @@ -130,6 +130,8 @@ public: /** * @lua NA */ + virtual void setOpacity(GLubyte opacity) override { _opacity = opacity; } + virtual GLubyte getOpacity() const override { return _opacity; } virtual void onEnter() override; virtual void update(float deltaTime) override; @@ -158,6 +160,8 @@ private: Sprite* _upperHalfCircle; Sprite* _lowerHalfCircle; Sprite* _body; + + GLubyte _opacity; float _marginFromBoundary; float _marginForLength; From 9757ee4ea8d3c69e63b80f83ec383d6bd7bb8490 Mon Sep 17 00:00:00 2001 From: Neo Kim Date: Wed, 8 Jul 2015 20:23:16 +0900 Subject: [PATCH 56/93] Refine scroll event dispatching. And add an event to track every move including jump and so on. --- cocos/ui/UIScrollView.cpp | 73 ++++++++++++++++++++++++++++++--------- cocos/ui/UIScrollView.h | 17 ++++++++- 2 files changed, 72 insertions(+), 18 deletions(-) diff --git a/cocos/ui/UIScrollView.cpp b/cocos/ui/UIScrollView.cpp index 0cd8587b10..7a54a80847 100644 --- a/cocos/ui/UIScrollView.cpp +++ b/cocos/ui/UIScrollView.cpp @@ -149,7 +149,7 @@ void ScrollView::onSizeChanged() float innerSizeWidth = MAX(orginInnerSizeWidth, _contentSize.width); float innerSizeHeight = MAX(orginInnerSizeHeight, _contentSize.height); _innerContainer->setContentSize(Size(innerSizeWidth, innerSizeHeight)); - _innerContainer->setPosition(Vec2(0, _contentSize.height - _innerContainer->getContentSize().height)); + setInnerContainerPosition(Vec2(0, _contentSize.height - _innerContainer->getContentSize().height)); } void ScrollView::setInnerContainerSize(const Size &size) @@ -193,7 +193,7 @@ void ScrollView::setInnerContainerSize(const Size &size) { pos.y = _contentSize.height - (1.0f - _innerContainer->getAnchorPoint().y) * _innerContainer->getContentSize().height; } - _innerContainer->setPosition(pos); + setInnerContainerPosition(pos); } const Size& ScrollView::getInnerContainerSize() const @@ -201,6 +201,27 @@ const Size& ScrollView::getInnerContainerSize() const return _innerContainer->getContentSize(); } +void ScrollView::setInnerContainerPosition(const Vec2 &position) +{ + _innerContainer->setPosition(position); + + this->retain(); + if (_eventCallback) + { + _eventCallback(this, EventType::CONTAINER_MOVED); + } + if (_ccEventCallback) + { + _ccEventCallback(this, static_cast(EventType::CONTAINER_MOVED)); + } + this->release(); +} + +const Vec2 ScrollView::getInnerContainerPosition() const +{ + return _innerContainer->getPosition(); +} + void ScrollView::addChild(Node* child) { ScrollView::addChild(child, child->getLocalZOrder(), child->getTag()); @@ -269,7 +290,7 @@ void ScrollView::moveChildren(float offsetX, float offsetY) void ScrollView::moveChildrenToPosition(const Vec2& position) { - _innerContainer->setPosition(position); + setInnerContainerPosition(position); Vec2 outOfBoundary = getHowMuchOutOfBoundary(Vec2::ZERO); updateScrollBar(outOfBoundary); @@ -345,6 +366,7 @@ void ScrollView::processAutoScrolling(float deltaTime) percentage = tweenfunc::quintEaseOut(percentage); } Vec2 moveDelta = _autoScrollTargetDelta * percentage; + moveChildrenToPosition(_autoScrollStartPosition + moveDelta); // Dispatch related events if bouncing if(_bouncingBack) @@ -366,7 +388,6 @@ void ScrollView::processAutoScrolling(float deltaTime) processScrollEvent(MoveDirection::BOTTOM, true); } } - moveChildrenToPosition(_autoScrollStartPosition + moveDelta); } } @@ -494,8 +515,6 @@ void ScrollView::processInertiaScrolling(float dt) bool ScrollView::scrollChildren(float touchOffsetX, float touchOffsetY) { - processScrollingEvent(); - touchOffsetX = (_direction == Direction::VERTICAL ? 0 : touchOffsetX); touchOffsetY = (_direction == Direction::HORIZONTAL ? 0 : touchOffsetY); if(_bounceEnabled) @@ -508,7 +527,10 @@ bool ScrollView::scrollChildren(float touchOffsetX, float touchOffsetY) float realOffsetX = touchOffsetX; float realOffsetY = touchOffsetY; - bool scrollEnabledUpDown = true; + bool scrolledToLeft = false; + bool scrolledToRight = false; + bool scrolledToTop = false; + bool scrolledToBottom = false; if (touchOffsetY > 0.0f) // up { float icBottomPos = _innerContainer->getBottomBoundary(); @@ -518,8 +540,7 @@ bool ScrollView::scrollChildren(float touchOffsetX, float touchOffsetY) { realOffsetY = _bottomBoundary - icBottomPos; } - processScrollEvent(MoveDirection::BOTTOM, false); - scrollEnabledUpDown = false; + scrolledToBottom = true; } } else if (touchOffsetY < 0.0f) // down @@ -531,12 +552,10 @@ bool ScrollView::scrollChildren(float touchOffsetX, float touchOffsetY) { realOffsetY = _topBoundary - icTopPos; } - processScrollEvent(MoveDirection::TOP, false); - scrollEnabledUpDown = false; + scrolledToTop = true; } } - bool scrollEnabledLeftRight = true; if (touchOffsetX < 0.0f) // left { float icRightPos = _innerContainer->getRightBoundary(); @@ -546,8 +565,7 @@ bool ScrollView::scrollChildren(float touchOffsetX, float touchOffsetY) { realOffsetX = _rightBoundary - icRightPos; } - processScrollEvent(MoveDirection::RIGHT, false); - scrollEnabledLeftRight = false; + scrolledToRight = true; } } else if (touchOffsetX > 0.0f) // right @@ -559,12 +577,33 @@ bool ScrollView::scrollChildren(float touchOffsetX, float touchOffsetY) { realOffsetX = _leftBoundary - icLeftPos; } - processScrollEvent(MoveDirection::LEFT, false); - scrollEnabledLeftRight = false; + scrolledToLeft = true; } } moveChildren(realOffsetX, realOffsetY); - return scrollEnabledUpDown || scrollEnabledLeftRight; + + if(realOffsetX != 0 || realOffsetY != 0) + { + processScrollingEvent(); + } + if(scrolledToBottom) + { + processScrollEvent(MoveDirection::BOTTOM, false); + } + if(scrolledToTop) + { + processScrollEvent(MoveDirection::TOP, false); + } + if(scrolledToLeft) + { + processScrollEvent(MoveDirection::LEFT, false); + } + if(scrolledToRight) + { + processScrollEvent(MoveDirection::RIGHT, false); + } + + return !scrolledToBottom && !scrolledToTop && !scrolledToLeft && !scrolledToRight; } void ScrollView::scrollToBottom(float second, bool attenuated) diff --git a/cocos/ui/UIScrollView.h b/cocos/ui/UIScrollView.h index 741e1528ee..e510d62c00 100644 --- a/cocos/ui/UIScrollView.h +++ b/cocos/ui/UIScrollView.h @@ -99,7 +99,8 @@ public: BOUNCE_TOP, BOUNCE_BOTTOM, BOUNCE_LEFT, - BOUNCE_RIGHT + BOUNCE_RIGHT, + CONTAINER_MOVED }; /** @@ -308,6 +309,20 @@ public: * @return The inner container size. */ const Size& getInnerContainerSize() const; + + /** + * Set inner container position + * + * @param position Inner container position. + */ + void setInnerContainerPosition(const Vec2 &pos); + + /** + * Get inner container position + * + * @return The inner container position. + */ + const Vec2 getInnerContainerPosition() const; /** * Add callback function which will be called when scrollview event triggered. From 300da3e3fcbb3b0a2fd05e2b40ee3acef85008cf Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Mon, 13 Jul 2015 12:57:03 +0000 Subject: [PATCH 57/93] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../auto/api/jsb_cocos2dx_auto_api.js | 22 ++++-- .../js-bindings/auto/jsb_cocos2dx_auto.cpp | 57 ++++++++++----- .../js-bindings/auto/jsb_cocos2dx_auto.hpp | 3 +- .../lua-bindings/auto/api/Animate.lua | 15 ++-- .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 72 +++++++++++++++---- .../lua-bindings/auto/lua_cocos2dx_auto.hpp | 1 + 6 files changed, 128 insertions(+), 42 deletions(-) diff --git a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js index af7782712e..a085541140 100644 --- a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js +++ b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js @@ -5173,6 +5173,18 @@ ReverseTime : function ( */ cc.Animate = { +/** + * @method initWithAnimation + * @param {cc.Animation} arg0 + * @return {bool} + */ +initWithAnimation : function ( +animation +) +{ + return false; +}, + /** * @method getAnimation * @return {cc.Animation|cc.Animation} @@ -5184,15 +5196,13 @@ getAnimation : function( }, /** - * @method initWithAnimation - * @param {cc.Animation} arg0 - * @return {bool} + * @method getCurrentFrameIndex + * @return {int} */ -initWithAnimation : function ( -animation +getCurrentFrameIndex : function ( ) { - return false; + return 0; }, /** diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp index b0a958349e..8d90583f52 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp @@ -14715,6 +14715,36 @@ void js_register_cocos2dx_ReverseTime(JSContext *cx, JS::HandleObject global) { JSClass *jsb_cocos2d_Animate_class; JSObject *jsb_cocos2d_Animate_prototype; +bool js_cocos2dx_Animate_initWithAnimation(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + bool ok = true; + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::Animate* cobj = (cocos2d::Animate *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Animate_initWithAnimation : Invalid Native Object"); + if (argc == 1) { + cocos2d::Animation* arg0; + do { + if (args.get(0).isNull()) { arg0 = nullptr; break; } + if (!args.get(0).isObject()) { ok = false; break; } + js_proxy_t *jsProxy; + JSObject *tmpObj = args.get(0).toObjectOrNull(); + jsProxy = jsb_get_js_proxy(tmpObj); + arg0 = (cocos2d::Animation*)(jsProxy ? jsProxy->ptr : NULL); + JSB_PRECONDITION2( arg0, cx, false, "Invalid Native Object"); + } while (0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_Animate_initWithAnimation : Error processing arguments"); + bool ret = cobj->initWithAnimation(arg0); + jsval jsret = JSVAL_NULL; + jsret = BOOLEAN_TO_JSVAL(ret); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_Animate_initWithAnimation : wrong number of arguments: %d, was expecting %d", argc, 1); + return false; +} bool js_cocos2dx_Animate_getAnimation(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -14763,34 +14793,22 @@ bool js_cocos2dx_Animate_getAnimation(JSContext *cx, uint32_t argc, jsval *vp) JS_ReportError(cx, "js_cocos2dx_Animate_getAnimation : wrong number of arguments"); return false; } -bool js_cocos2dx_Animate_initWithAnimation(JSContext *cx, uint32_t argc, jsval *vp) +bool js_cocos2dx_Animate_getCurrentFrameIndex(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); - bool ok = true; JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); js_proxy_t *proxy = jsb_get_js_proxy(obj); cocos2d::Animate* cobj = (cocos2d::Animate *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Animate_initWithAnimation : Invalid Native Object"); - if (argc == 1) { - cocos2d::Animation* arg0; - do { - if (args.get(0).isNull()) { arg0 = nullptr; break; } - if (!args.get(0).isObject()) { ok = false; break; } - js_proxy_t *jsProxy; - JSObject *tmpObj = args.get(0).toObjectOrNull(); - jsProxy = jsb_get_js_proxy(tmpObj); - arg0 = (cocos2d::Animation*)(jsProxy ? jsProxy->ptr : NULL); - JSB_PRECONDITION2( arg0, cx, false, "Invalid Native Object"); - } while (0); - JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_Animate_initWithAnimation : Error processing arguments"); - bool ret = cobj->initWithAnimation(arg0); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Animate_getCurrentFrameIndex : Invalid Native Object"); + if (argc == 0) { + int ret = cobj->getCurrentFrameIndex(); jsval jsret = JSVAL_NULL; - jsret = BOOLEAN_TO_JSVAL(ret); + jsret = int32_to_jsval(cx, ret); args.rval().set(jsret); return true; } - JS_ReportError(cx, "js_cocos2dx_Animate_initWithAnimation : wrong number of arguments: %d, was expecting %d", argc, 1); + JS_ReportError(cx, "js_cocos2dx_Animate_getCurrentFrameIndex : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } bool js_cocos2dx_Animate_setAnimation(JSContext *cx, uint32_t argc, jsval *vp) @@ -14909,8 +14927,9 @@ void js_register_cocos2dx_Animate(JSContext *cx, JS::HandleObject global) { }; static JSFunctionSpec funcs[] = { - JS_FN("getAnimation", js_cocos2dx_Animate_getAnimation, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("initWithAnimation", js_cocos2dx_Animate_initWithAnimation, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getAnimation", js_cocos2dx_Animate_getAnimation, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getCurrentFrameIndex", js_cocos2dx_Animate_getCurrentFrameIndex, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setAnimation", js_cocos2dx_Animate_setAnimation, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FS_END }; diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp index bc50f1abfd..0f53c73edd 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp @@ -810,8 +810,9 @@ bool js_cocos2dx_Animate_constructor(JSContext *cx, uint32_t argc, jsval *vp); void js_cocos2dx_Animate_finalize(JSContext *cx, JSObject *obj); void js_register_cocos2dx_Animate(JSContext *cx, JS::HandleObject global); void register_all_cocos2dx(JSContext* cx, JS::HandleObject obj); -bool js_cocos2dx_Animate_getAnimation(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Animate_initWithAnimation(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_Animate_getAnimation(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_Animate_getCurrentFrameIndex(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Animate_setAnimation(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Animate_create(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Animate_Animate(JSContext *cx, uint32_t argc, jsval *vp); diff --git a/cocos/scripting/lua-bindings/auto/api/Animate.lua b/cocos/scripting/lua-bindings/auto/api/Animate.lua index 219d5cfe36..a7bc3bba4a 100644 --- a/cocos/scripting/lua-bindings/auto/api/Animate.lua +++ b/cocos/scripting/lua-bindings/auto/api/Animate.lua @@ -4,6 +4,13 @@ -- @extend ActionInterval -- @parent_module cc +-------------------------------- +-- initializes the action with an Animation and will restore the original frame when the animation is over +-- @function [parent=#Animate] initWithAnimation +-- @param self +-- @param #cc.Animation animation +-- @return bool#bool ret (return value: bool) + -------------------------------- -- @overload self -- @overload self @@ -12,11 +19,11 @@ -- @return Animation#Animation ret (return value: cc.Animation) -------------------------------- --- initializes the action with an Animation and will restore the original frame when the animation is over --- @function [parent=#Animate] initWithAnimation +-- Gets the index of sprite frame currently displayed.
+-- return int the index of sprite frame currently displayed. +-- @function [parent=#Animate] getCurrentFrameIndex -- @param self --- @param #cc.Animation animation --- @return bool#bool ret (return value: bool) +-- @return int#int ret (return value: int) -------------------------------- -- Sets the Animation object to be animated
diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index 2425ad5cfb..702fbaf34c 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -23618,6 +23618,56 @@ int lua_register_cocos2dx_DelayTime(lua_State* tolua_S) return 1; } +int lua_cocos2dx_Animate_initWithAnimation(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Animate* 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.Animate",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Animate*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Animate_initWithAnimation'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Animation* arg0; + + ok &= luaval_to_object(tolua_S, 2, "cc.Animation",&arg0, "cc.Animate:initWithAnimation"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Animate_initWithAnimation'", nullptr); + return 0; + } + bool ret = cobj->initWithAnimation(arg0); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Animate:initWithAnimation",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animate_initWithAnimation'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Animate_getAnimation(lua_State* tolua_S) { int argc = 0; @@ -23665,7 +23715,7 @@ int lua_cocos2dx_Animate_getAnimation(lua_State* tolua_S) return 0; } -int lua_cocos2dx_Animate_initWithAnimation(lua_State* tolua_S) +int lua_cocos2dx_Animate_getCurrentFrameIndex(lua_State* tolua_S) { int argc = 0; cocos2d::Animate* cobj = nullptr; @@ -23685,32 +23735,29 @@ int lua_cocos2dx_Animate_initWithAnimation(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Animate_initWithAnimation'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Animate_getCurrentFrameIndex'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; - if (argc == 1) + if (argc == 0) { - cocos2d::Animation* arg0; - - ok &= luaval_to_object(tolua_S, 2, "cc.Animation",&arg0, "cc.Animate:initWithAnimation"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Animate_initWithAnimation'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Animate_getCurrentFrameIndex'", nullptr); return 0; } - bool ret = cobj->initWithAnimation(arg0); - tolua_pushboolean(tolua_S,(bool)ret); + int ret = cobj->getCurrentFrameIndex(); + tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Animate:initWithAnimation",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Animate:getCurrentFrameIndex",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animate_initWithAnimation'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Animate_getCurrentFrameIndex'.",&tolua_err); #endif return 0; @@ -23851,8 +23898,9 @@ int lua_register_cocos2dx_Animate(lua_State* tolua_S) tolua_beginmodule(tolua_S,"Animate"); tolua_function(tolua_S,"new",lua_cocos2dx_Animate_constructor); - tolua_function(tolua_S,"getAnimation",lua_cocos2dx_Animate_getAnimation); tolua_function(tolua_S,"initWithAnimation",lua_cocos2dx_Animate_initWithAnimation); + tolua_function(tolua_S,"getAnimation",lua_cocos2dx_Animate_getAnimation); + tolua_function(tolua_S,"getCurrentFrameIndex",lua_cocos2dx_Animate_getCurrentFrameIndex); tolua_function(tolua_S,"setAnimation",lua_cocos2dx_Animate_setAnimation); tolua_function(tolua_S,"create", lua_cocos2dx_Animate_create); tolua_endmodule(tolua_S); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp index ccd7196432..5fd92fbc15 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -2069,6 +2069,7 @@ int register_all_cocos2dx(lua_State* tolua_S); + #endif // __cocos2dx_h__ From 9e607133228b8aab83f815b8fd90c9d0ef5edc43 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Mon, 13 Jul 2015 14:41:58 +0000 Subject: [PATCH 58/93] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../auto/api/jsb_cocos2dx_auto_api.js | 42 ++++ .../js-bindings/auto/jsb_cocos2dx_auto.cpp | 92 ++++++++ .../js-bindings/auto/jsb_cocos2dx_auto.hpp | 4 + .../lua-bindings/auto/api/Action.lua | 15 ++ .../lua-bindings/auto/api/ActionManager.lua | 11 + .../scripting/lua-bindings/auto/api/Node.lua | 8 + .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 204 ++++++++++++++++++ .../lua-bindings/auto/lua_cocos2dx_auto.hpp | 4 + 8 files changed, 380 insertions(+) diff --git a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js index a085541140..ad5cd9dd0e 100644 --- a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js +++ b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_auto_api.js @@ -896,6 +896,16 @@ func { }, +/** + * @method stopActionsByFlags + * @param {unsigned int} arg0 + */ +stopActionsByFlags : function ( +int +) +{ +}, + /** * @method setNormalizedPosition * @param {vec2_object} arg0 @@ -3244,6 +3254,16 @@ getTarget : function ( return cc.Node; }, +/** + * @method getFlags + * @return {unsigned int} + */ +getFlags : function ( +) +{ + return 0; +}, + /** * @method step * @param {float} arg0 @@ -3264,6 +3284,16 @@ int { }, +/** + * @method setFlags + * @param {unsigned int} arg0 + */ +setFlags : function ( +int +) +{ +}, + /** * @method getTag * @return {int} @@ -9543,6 +9573,18 @@ node { }, +/** + * @method removeActionsByFlags + * @param {unsigned int} arg0 + * @param {cc.Node} arg1 + */ +removeActionsByFlags : function ( +int, +node +) +{ +}, + /** * @method removeAllActions */ diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp index 8d90583f52..57a218c4b4 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp @@ -2385,6 +2385,26 @@ bool js_cocos2dx_Node_setOnEnterCallback(JSContext *cx, uint32_t argc, jsval *vp JS_ReportError(cx, "js_cocos2dx_Node_setOnEnterCallback : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_Node_stopActionsByFlags(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + bool ok = true; + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::Node* cobj = (cocos2d::Node *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Node_stopActionsByFlags : Invalid Native Object"); + if (argc == 1) { + unsigned int arg0; + ok &= jsval_to_uint32(cx, args.get(0), &arg0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_Node_stopActionsByFlags : Error processing arguments"); + cobj->stopActionsByFlags(arg0); + args.rval().setUndefined(); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_Node_stopActionsByFlags : wrong number of arguments: %d, was expecting %d", argc, 1); + return false; +} bool js_cocos2dx_Node_setNormalizedPosition(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -4909,6 +4929,7 @@ void js_register_cocos2dx_Node(JSContext *cx, JS::HandleObject global) { JS_FN("setSkewX", js_cocos2dx_Node_setSkewX, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setGLProgramState", js_cocos2dx_Node_setGLProgramState, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setOnEnterCallback", js_cocos2dx_Node_setOnEnterCallback, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("stopActionsByFlags", js_cocos2dx_Node_stopActionsByFlags, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setNormalizedPosition", js_cocos2dx_Node_setNormalizedPosition, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setonExitTransitionDidStartCallback", js_cocos2dx_Node_setonExitTransitionDidStartCallback, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("convertTouchToNodeSpace", js_cocos2dx_Node_convertTouchToNodeSpace, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), @@ -8088,6 +8109,24 @@ bool js_cocos2dx_Action_getTarget(JSContext *cx, uint32_t argc, jsval *vp) JS_ReportError(cx, "js_cocos2dx_Action_getTarget : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } +bool js_cocos2dx_Action_getFlags(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::Action* cobj = (cocos2d::Action *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Action_getFlags : Invalid Native Object"); + if (argc == 0) { + unsigned int ret = cobj->getFlags(); + jsval jsret = JSVAL_NULL; + jsret = uint32_to_jsval(cx, ret); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_Action_getFlags : wrong number of arguments: %d, was expecting %d", argc, 0); + return false; +} bool js_cocos2dx_Action_step(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -8128,6 +8167,26 @@ bool js_cocos2dx_Action_setTag(JSContext *cx, uint32_t argc, jsval *vp) JS_ReportError(cx, "js_cocos2dx_Action_setTag : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_Action_setFlags(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + bool ok = true; + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::Action* cobj = (cocos2d::Action *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Action_setFlags : Invalid Native Object"); + if (argc == 1) { + unsigned int arg0; + ok &= jsval_to_uint32(cx, args.get(0), &arg0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_Action_setFlags : Error processing arguments"); + cobj->setFlags(arg0); + args.rval().setUndefined(); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_Action_setFlags : wrong number of arguments: %d, was expecting %d", argc, 1); + return false; +} bool js_cocos2dx_Action_getTag(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -8249,8 +8308,10 @@ void js_register_cocos2dx_Action(JSContext *cx, JS::HandleObject global) { JS_FN("stop", js_cocos2dx_Action_stop, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("update", js_cocos2dx_Action_update, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getTarget", js_cocos2dx_Action_getTarget, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getFlags", js_cocos2dx_Action_getFlags, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("step", js_cocos2dx_Action_step, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setTag", js_cocos2dx_Action_setTag, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("setFlags", js_cocos2dx_Action_setFlags, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getTag", js_cocos2dx_Action_getTag, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setTarget", js_cocos2dx_Action_setTarget, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("isDone", js_cocos2dx_Action_isDone, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), @@ -29919,6 +29980,36 @@ bool js_cocos2dx_ActionManager_removeActionByTag(JSContext *cx, uint32_t argc, j JS_ReportError(cx, "js_cocos2dx_ActionManager_removeActionByTag : wrong number of arguments: %d, was expecting %d", argc, 2); return false; } +bool js_cocos2dx_ActionManager_removeActionsByFlags(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + bool ok = true; + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::ActionManager* cobj = (cocos2d::ActionManager *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ActionManager_removeActionsByFlags : Invalid Native Object"); + if (argc == 2) { + unsigned int arg0; + cocos2d::Node* arg1; + ok &= jsval_to_uint32(cx, args.get(0), &arg0); + do { + if (args.get(1).isNull()) { arg1 = nullptr; break; } + if (!args.get(1).isObject()) { ok = false; break; } + js_proxy_t *jsProxy; + JSObject *tmpObj = args.get(1).toObjectOrNull(); + jsProxy = jsb_get_js_proxy(tmpObj); + arg1 = (cocos2d::Node*)(jsProxy ? jsProxy->ptr : NULL); + JSB_PRECONDITION2( arg1, cx, false, "Invalid Native Object"); + } while (0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_ActionManager_removeActionsByFlags : Error processing arguments"); + cobj->removeActionsByFlags(arg0, arg1); + args.rval().setUndefined(); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_ActionManager_removeActionsByFlags : wrong number of arguments: %d, was expecting %d", argc, 2); + return false; +} bool js_cocos2dx_ActionManager_removeAllActions(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -30277,6 +30368,7 @@ void js_register_cocos2dx_ActionManager(JSContext *cx, JS::HandleObject global) static JSFunctionSpec funcs[] = { JS_FN("getActionByTag", js_cocos2dx_ActionManager_getActionByTag, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("removeActionByTag", js_cocos2dx_ActionManager_removeActionByTag, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("removeActionsByFlags", js_cocos2dx_ActionManager_removeActionsByFlags, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("removeAllActions", js_cocos2dx_ActionManager_removeAllActions, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("addAction", js_cocos2dx_ActionManager_addAction, 3, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("resumeTarget", js_cocos2dx_ActionManager_resumeTarget, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp index 0f53c73edd..e4359a14ec 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp @@ -127,6 +127,7 @@ bool js_cocos2dx_Node_getEventDispatcher(JSContext *cx, uint32_t argc, jsval *vp bool js_cocos2dx_Node_setSkewX(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Node_setGLProgramState(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Node_setOnEnterCallback(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_Node_stopActionsByFlags(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Node_setNormalizedPosition(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Node_setonExitTransitionDidStartCallback(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Node_convertTouchToNodeSpace(JSContext *cx, uint32_t argc, jsval *vp); @@ -410,8 +411,10 @@ bool js_cocos2dx_Action_getOriginalTarget(JSContext *cx, uint32_t argc, jsval *v bool js_cocos2dx_Action_stop(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_update(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_getTarget(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_Action_getFlags(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_step(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_setTag(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_Action_setFlags(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_getTag(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_setTarget(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_Action_isDone(JSContext *cx, uint32_t argc, jsval *vp); @@ -1840,6 +1843,7 @@ void js_register_cocos2dx_ActionManager(JSContext *cx, JS::HandleObject global); void register_all_cocos2dx(JSContext* cx, JS::HandleObject obj); bool js_cocos2dx_ActionManager_getActionByTag(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ActionManager_removeActionByTag(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_ActionManager_removeActionsByFlags(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ActionManager_removeAllActions(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ActionManager_addAction(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ActionManager_resumeTarget(JSContext *cx, uint32_t argc, jsval *vp); diff --git a/cocos/scripting/lua-bindings/auto/api/Action.lua b/cocos/scripting/lua-bindings/auto/api/Action.lua index 135b42c4c7..db72692665 100644 --- a/cocos/scripting/lua-bindings/auto/api/Action.lua +++ b/cocos/scripting/lua-bindings/auto/api/Action.lua @@ -63,6 +63,13 @@ -- @param self -- @return Node#Node ret (return value: cc.Node) +-------------------------------- +-- Returns a flag field that is used to group the actions easily.
+-- return A tag. +-- @function [parent=#Action] getFlags +-- @param self +-- @return unsigned int#unsigned int ret (return value: unsigned int) + -------------------------------- -- Called every frame with it's delta time, dt in seconds. DON'T override unless you know what you are doing.
-- param dt In seconds. @@ -79,6 +86,14 @@ -- @param #int tag -- @return Action#Action self (return value: cc.Action) +-------------------------------- +-- Changes the flag field that is used to group the actions easily.
+-- param tag Used to identify the action easily. +-- @function [parent=#Action] setFlags +-- @param self +-- @param #unsigned int flags +-- @return Action#Action self (return value: cc.Action) + -------------------------------- -- Returns a tag that is used to identify the action easily.
-- return A tag. diff --git a/cocos/scripting/lua-bindings/auto/api/ActionManager.lua b/cocos/scripting/lua-bindings/auto/api/ActionManager.lua index 60770f450f..7fa1fe9771 100644 --- a/cocos/scripting/lua-bindings/auto/api/ActionManager.lua +++ b/cocos/scripting/lua-bindings/auto/api/ActionManager.lua @@ -25,6 +25,17 @@ -- @param #cc.Node target -- @return ActionManager#ActionManager self (return value: cc.ActionManager) +-------------------------------- +-- Removes all actions matching at least one bit in flags and the target.
+-- param flags The flag field to match the actions' flags based on bitwise AND.
+-- param target A certain target.
+-- js NA +-- @function [parent=#ActionManager] removeActionsByFlags +-- @param self +-- @param #unsigned int flags +-- @param #cc.Node target +-- @return ActionManager#ActionManager self (return value: cc.ActionManager) + -------------------------------- -- Removes all actions from all the targets. -- @function [parent=#ActionManager] removeAllActions diff --git a/cocos/scripting/lua-bindings/auto/api/Node.lua b/cocos/scripting/lua-bindings/auto/api/Node.lua index 7fd90a8953..cafaffb4fb 100644 --- a/cocos/scripting/lua-bindings/auto/api/Node.lua +++ b/cocos/scripting/lua-bindings/auto/api/Node.lua @@ -305,6 +305,14 @@ -- @param #function callback -- @return Node#Node self (return value: cc.Node) +-------------------------------- +-- Removes all actions from the running action list by its flags.
+-- param flags A flag field that removes actions based on bitwise AND. +-- @function [parent=#Node] stopActionsByFlags +-- @param self +-- @param #unsigned int flags +-- @return Node#Node self (return value: cc.Node) + -------------------------------- -- Sets the position (x,y) using values between 0 and 1.
-- The positions in pixels is calculated like the following:
diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index 702fbaf34c..57906b2b58 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -4681,6 +4681,56 @@ int lua_cocos2dx_Node_setOnEnterCallback(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Node_stopActionsByFlags(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_stopActionsByFlags'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + unsigned int arg0; + + ok &= luaval_to_uint32(tolua_S, 2,&arg0, "cc.Node:stopActionsByFlags"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Node_stopActionsByFlags'", nullptr); + return 0; + } + cobj->stopActionsByFlags(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:stopActionsByFlags",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_stopActionsByFlags'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Node_setNormalizedPosition(lua_State* tolua_S) { int argc = 0; @@ -9585,6 +9635,7 @@ int lua_register_cocos2dx_Node(lua_State* tolua_S) tolua_function(tolua_S,"setSkewX",lua_cocos2dx_Node_setSkewX); tolua_function(tolua_S,"setGLProgramState",lua_cocos2dx_Node_setGLProgramState); tolua_function(tolua_S,"setOnEnterCallback",lua_cocos2dx_Node_setOnEnterCallback); + tolua_function(tolua_S,"stopActionsByFlags",lua_cocos2dx_Node_stopActionsByFlags); tolua_function(tolua_S,"setNormalizedPosition",lua_cocos2dx_Node_setNormalizedPosition); tolua_function(tolua_S,"setonExitTransitionDidStartCallback",lua_cocos2dx_Node_setonExitTransitionDidStartCallback); tolua_function(tolua_S,"convertTouchToNodeSpace",lua_cocos2dx_Node_convertTouchToNodeSpace); @@ -15853,6 +15904,53 @@ int lua_cocos2dx_Action_getTarget(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Action_getFlags(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Action* 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.Action",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Action*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Action_getFlags'", 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_Action_getFlags'", nullptr); + return 0; + } + unsigned int ret = cobj->getFlags(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Action:getFlags",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Action_getFlags'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Action_step(lua_State* tolua_S) { int argc = 0; @@ -15953,6 +16051,56 @@ int lua_cocos2dx_Action_setTag(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Action_setFlags(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Action* 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.Action",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Action*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Action_setFlags'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + unsigned int arg0; + + ok &= luaval_to_uint32(tolua_S, 2,&arg0, "cc.Action:setFlags"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Action_setFlags'", nullptr); + return 0; + } + cobj->setFlags(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Action:setFlags",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Action_setFlags'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Action_getTag(lua_State* tolua_S) { int argc = 0; @@ -16163,8 +16311,10 @@ int lua_register_cocos2dx_Action(lua_State* tolua_S) tolua_function(tolua_S,"stop",lua_cocos2dx_Action_stop); tolua_function(tolua_S,"update",lua_cocos2dx_Action_update); tolua_function(tolua_S,"getTarget",lua_cocos2dx_Action_getTarget); + tolua_function(tolua_S,"getFlags",lua_cocos2dx_Action_getFlags); tolua_function(tolua_S,"step",lua_cocos2dx_Action_step); tolua_function(tolua_S,"setTag",lua_cocos2dx_Action_setTag); + tolua_function(tolua_S,"setFlags",lua_cocos2dx_Action_setFlags); tolua_function(tolua_S,"getTag",lua_cocos2dx_Action_getTag); tolua_function(tolua_S,"setTarget",lua_cocos2dx_Action_setTarget); tolua_function(tolua_S,"isDone",lua_cocos2dx_Action_isDone); @@ -40557,6 +40707,59 @@ int lua_cocos2dx_ActionManager_removeActionByTag(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ActionManager_removeActionsByFlags(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ActionManager* 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.ActionManager",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ActionManager*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ActionManager_removeActionsByFlags'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 2) + { + unsigned int arg0; + cocos2d::Node* arg1; + + ok &= luaval_to_uint32(tolua_S, 2,&arg0, "cc.ActionManager:removeActionsByFlags"); + + ok &= luaval_to_object(tolua_S, 3, "cc.Node",&arg1, "cc.ActionManager:removeActionsByFlags"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ActionManager_removeActionsByFlags'", nullptr); + return 0; + } + cobj->removeActionsByFlags(arg0, arg1); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.ActionManager:removeActionsByFlags",argc, 2); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ActionManager_removeActionsByFlags'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ActionManager_removeAllActions(lua_State* tolua_S) { int argc = 0; @@ -41162,6 +41365,7 @@ int lua_register_cocos2dx_ActionManager(lua_State* tolua_S) tolua_function(tolua_S,"new",lua_cocos2dx_ActionManager_constructor); tolua_function(tolua_S,"getActionByTag",lua_cocos2dx_ActionManager_getActionByTag); tolua_function(tolua_S,"removeActionByTag",lua_cocos2dx_ActionManager_removeActionByTag); + tolua_function(tolua_S,"removeActionsByFlags",lua_cocos2dx_ActionManager_removeActionsByFlags); tolua_function(tolua_S,"removeAllActions",lua_cocos2dx_ActionManager_removeAllActions); tolua_function(tolua_S,"addAction",lua_cocos2dx_ActionManager_addAction); tolua_function(tolua_S,"resumeTarget",lua_cocos2dx_ActionManager_resumeTarget); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp index 5fd92fbc15..aa18db277a 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -2067,6 +2067,10 @@ int register_all_cocos2dx(lua_State* tolua_S); + + + + From 74227eaf16940b27205948214d65cdfbd1b3ab89 Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Mon, 13 Jul 2015 22:44:40 +0800 Subject: [PATCH 59/93] Add TestIsDirectoryExist and TestUnicodePath in cpp-tests FileUtil test. --- cocos/platform/CCFileUtils.cpp | 4 +- .../Classes/FileUtilsTest/FileUtilsTest.cpp | 157 +++++++++++++++++- .../Classes/FileUtilsTest/FileUtilsTest.h | 23 +++ 3 files changed, 182 insertions(+), 2 deletions(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index bd7803cafb..29aa995398 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -1059,7 +1059,7 @@ bool FileUtils::isDirectoryExist(const std::string& dirPath) const } #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) - +// windows os implement should override in platform specific FileUtiles class bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const { CCASSERT(false, "FileUtils not support isDirectoryExistInternal"); @@ -1097,6 +1097,7 @@ std::string FileUtils::getSuitableFOpen(const std::string& filenameUtf8) const } #else +// default implements for unix like os #include #include #include @@ -1222,6 +1223,7 @@ std::string FileUtils::getSuitableFOpen(const std::string& filenameUtf8) const } #endif + long FileUtils::getFileSize(const std::string &filepath) { CCASSERT(!filepath.empty(), "Invalid path"); diff --git a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp index b21c4c7ad9..41865bd86b 100644 --- a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp +++ b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp @@ -8,6 +8,7 @@ FileUtilsTests::FileUtilsTests() ADD_TEST_CASE(TestSearchPath); ADD_TEST_CASE(TestFilenameLookup); ADD_TEST_CASE(TestIsFileExist); + ADD_TEST_CASE(TestIsDirectoryExist); ADD_TEST_CASE(TestFileFuncs); ADD_TEST_CASE(TestDirectoryFuncs); ADD_TEST_CASE(TextWritePlist); @@ -15,6 +16,7 @@ FileUtilsTests::FileUtilsTests() ADD_TEST_CASE(TestWriteData); ADD_TEST_CASE(TestWriteValueMap); ADD_TEST_CASE(TestWriteValueVector); + ADD_TEST_CASE(TestUnicodePath); } // TestResolutionDirectories @@ -122,7 +124,7 @@ void TestSearchPath::onEnter() if (fp) { char szReadBuf[100] = {0}; - size_t read = fread(szReadBuf, 1, strlen(szBuf), fp); + size_t read = fread(szReadBuf, 1, strlen(szReadBuf), fp); if (read > 0) log("The content of file from writable path: %s", szReadBuf); fclose(fp); @@ -232,6 +234,61 @@ std::string TestIsFileExist::subtitle() const return ""; } +// TestIsDirectoryExist + +void TestIsDirectoryExist::onEnter() +{ + FileUtilsDemo::onEnter(); + auto s = Director::getInstance()->getWinSize(); + auto util = FileUtils::getInstance(); + int x = s.width/2, y = s.height/3; + + Label* label = nullptr; + std::string dir; + char msg[512]; + auto getMsg = [&dir, &msg](bool b)->const char * + { + snprintf((char *)msg, 512, "%s for dir: \"%s\"", b ? "success" : "failed", dir.c_str()); + return msg; + }; + + dir = "Images"; + label = Label::createWithSystemFont(getMsg(util->isDirectoryExist(dir)), "", 20); + label->setPosition(x, y * 2); + this->addChild(label); + + dir = util->getWritablePath(); + label = Label::createWithSystemFont(getMsg(util->isDirectoryExist(dir)), "", 20); + label->setPosition(x, y * 1); + this->addChild(label); + + dir = util->getWritablePath(); + label = Label::createWithSystemFont(getMsg(util->isDirectoryExist(dir)), "", 20); + label->setPosition(x, y * 1); + this->addChild(label); +} + +void TestIsDirectoryExist::onExit() +{ + + FileUtils *sharedFileUtils = FileUtils::getInstance(); + + // reset filename lookup + sharedFileUtils->purgeCachedEntries(); + + FileUtilsDemo::onExit(); +} + +std::string TestIsDirectoryExist::title() const +{ + return "FileUtils: check whether the directory exists"; +} + +std::string TestIsDirectoryExist::subtitle() const +{ + return ""; +} + // TestFileFuncs void TestFileFuncs::onEnter() @@ -801,3 +858,101 @@ std::string TestWriteValueVector::subtitle() const { return ""; } + +// TestUnicodePath + +void TestUnicodePath::onEnter() +{ + FileUtilsDemo::onEnter(); + auto s = Director::getInstance()->getWinSize(); + auto util = FileUtils::getInstance(); + + int x = s.width/2, + y = s.height/5; + Label* label = nullptr; + + std::string dir = "中文路径/"; + std::string filename = "测试文件.test"; + + std::string act; + char msg[512]; + auto getMsg = [&act, &msg](bool b, const std::string& path)->const char * + { + snprintf((char *)msg, 512, "%s for %s path: \"%s\"", b ? "success" : "failed", act.c_str(), path.c_str()); + return msg; + }; + + // Check whether unicode dir should be create or not + std::string dirPath = util->getWritablePath() + dir; + if (!util->isDirectoryExist(dirPath)) + { + util->createDirectory(dirPath); + } + + act = "create"; + bool isExist = util->isDirectoryExist(dirPath); + label = Label::createWithSystemFont(getMsg(isExist, dirPath), "", 12, Size(s.width, 0)); + label->setPosition(x, y * 4); + this->addChild(label); + + if (isExist) + { + // Check whether unicode file should be create or not + std::string filePath = dirPath + filename; + if (! util->isFileExist(filePath)) + { + std::string writeDataStr = " 测试字符串."; + Data writeData; + writeData.copy((unsigned char *)writeDataStr.c_str(), writeDataStr.size()); + util->writeDataToFile(writeData, filePath); + } + + isExist = util->isFileExist(filePath); + label = Label::createWithSystemFont(getMsg(isExist, filePath), "", 12, Size(s.width, 0)); + label->setPosition(x, y * 3); + this->addChild(label); + + act = "remove"; + if (isExist) + { + // read file content and log it + unsigned char* buffer = nullptr; + Data readData = util->getDataFromFile(filePath); + buffer = (unsigned char*)malloc(sizeof(unsigned char) * (readData.getSize() + 1)); + memcpy(buffer, readData.getBytes(), readData.getSize()); + buffer[readData.getSize()] = '\0'; + // vc can't treat unicode string correctly, don't use unicode string in code + log("The content of file from writable path: %s", buffer); + free(buffer); + + // remove test file + label = Label::createWithSystemFont(getMsg(util->removeFile(filePath), filePath), "", 12, Size(s.width, 0)); + label->setPosition(x, y * 2); + this->addChild(label); + } + + // remove test dir + label = Label::createWithSystemFont(getMsg(util->removeDirectory(dirPath), dirPath), "", 12, Size(s.width, 0)); + label->setPosition(x, y * 1); + this->addChild(label); + } +} + +void TestUnicodePath::onExit() +{ + + FileUtils *sharedFileUtils = FileUtils::getInstance(); + sharedFileUtils->purgeCachedEntries(); + sharedFileUtils->setFilenameLookupDictionary(ValueMap()); + FileUtilsDemo::onExit(); +} + +std::string TestUnicodePath::title() const +{ + return "FileUtils: check unicode path"; +} + +std::string TestUnicodePath::subtitle() const +{ + return ""; +} diff --git a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.h b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.h index b177ed0755..e8f6856fd5 100644 --- a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.h +++ b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.h @@ -60,6 +60,17 @@ public: virtual std::string subtitle() const override; }; +class TestIsDirectoryExist : public FileUtilsDemo +{ +public: + CREATE_FUNC(TestIsDirectoryExist); + + virtual void onEnter() override; + virtual void onExit() override; + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; + class TestFileFuncs : public FileUtilsDemo { public: @@ -134,4 +145,16 @@ public: virtual std::string title() const override; virtual std::string subtitle() const override; }; + +class TestUnicodePath : public FileUtilsDemo +{ +public: + CREATE_FUNC(TestUnicodePath); + + virtual void onEnter() override; + virtual void onExit() override; + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; + #endif /* __FILEUTILSTEST_H__ */ From 5631fa33e012ded184e3f1478e4311be461c63ba Mon Sep 17 00:00:00 2001 From: Nite Luo Date: Mon, 13 Jul 2015 17:44:44 -0700 Subject: [PATCH 60/93] update release notes for sdkbox --- docs/RELEASE_NOTES.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 15ee6023a7..796ab78e82 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -27,6 +27,7 @@ - [Nine Patch format support](#nine-patch-format-support) - [Android Studio support](#android-studio-support) - [Samsung Enhanced API support](#samsung-enhanced-api-support) + - [SDKBOX](#sdkbox) - [The Next Step](#the-next-step) @@ -65,9 +66,9 @@ You can use [Cocos Console](www.cocos2d-x.org/wiki/Cocos2d-console) command line In console application: ``` // Enter cpp test folder -cd tests/cpp-tests +cd tests/cpp-tests // Or enter js test folder -cd tests/js-tests +cd tests/js-tests // Or enter lua test folder cd tests/lua-tests @@ -168,6 +169,7 @@ cocos new -l cpp|js|lua MyGame * JS: Merged JSB and web engine into Cocos2d-x for a All-in-one engine * JS: Added `ccui.VideoPlayer` and `ccui.WebView` for iOS/Android/Web * console: Supported build & run Android Studio project with cocos console +* sdkbox: super EASY way to integrate 3rd party SDKs into cocos2d-x ## Download @@ -234,10 +236,30 @@ Samsung have provided a series of Enhanced API to optimize Cocos2d-x games for S In the previous versions, the resources file name's case is ignored on win32 platform, but not ignored in other platforms. This will lead to some unexpected issues, especially when user develop with win32 platform and pulish to other platforms like Android. In win32, the file name may be found without matching the case, but on other platforms it won't be found. So we decided to make win32 platform's resources case sensitive. Please make sure you are using the correct file name for your resources. +### SDKBOX +SDKBOX is a project that's built by part of the cocos2d-x team, in order to makes integrating 3rd party SDKs super EASY. +With SDKBOX you can integrate services like In App Purchase with one command +``` +sdkbox import -b iap +``` +Currently supported service including + +* [Tune](http://cocos2d-x.org/sdkbox/tune) +* [In App Purchase](http://cocos2d-x.org/sdkbox/iap) +* [AdColony](http://cocos2d-x.org/sdkbox/adcolony) +* [Vungle](http://cocos2d-x.org/sdkbox/vungle) +* [Chartboost](http://cocos2d-x.org/sdkbox/chartboost) +* [Kochava](http://cocos2d-x.org/sdkbox/kochava) +* [Google Analytics](http://cocos2d-x.org/sdkbox/googleanalytics) +* [Flurry Analytics](http://cocos2d-x.org/sdkbox/flurryanalytics) + + + + ## The Next Step As you can see, in v3.7, we have enhanced our 2d rendering with material system and integrated polygon sprite. More importantly, our 3d features become more and more complete, 3d Physics and Navigation Mesh with the previous Camera, 3d Sprite, 3d Particle System, 3d Light, 3d Terrain, Skybox, now you can really start to use Cocos to make a 3d game. In v3.8, we won't do much more features, but we'd like to slow down and refine our current 3D and 2D modules. -[The v3.8 milestone tasks](https://github.com/cocos2d/cocos2d-x/milestones/v3.8) \ No newline at end of file +[The v3.8 milestone tasks](https://github.com/cocos2d/cocos2d-x/milestones/v3.8) From 863c3a0a2a62b42e7689c7b43924c3cfbe4ae0be Mon Sep 17 00:00:00 2001 From: Neo Kim Date: Tue, 14 Jul 2015 10:17:05 +0900 Subject: [PATCH 61/93] Correct a typo --- cocos/ui/UIScrollView.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/ui/UIScrollView.h b/cocos/ui/UIScrollView.h index e510d62c00..8f311ee458 100644 --- a/cocos/ui/UIScrollView.h +++ b/cocos/ui/UIScrollView.h @@ -313,7 +313,7 @@ public: /** * Set inner container position * - * @param position Inner container position. + * @param pos Inner container position. */ void setInnerContainerPosition(const Vec2 &pos); From 569695d844379478f31ef8d9f2debf7807ce3837 Mon Sep 17 00:00:00 2001 From: Bin Zhang Date: Tue, 14 Jul 2015 09:40:42 +0800 Subject: [PATCH 62/93] 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 2c32cadbf9..84620bef69 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 2c32cadbf9aea2a18ccd3ee43e81635f0b492886 +Subproject commit 84620bef6981ab8641b4bc7a755f75c4a83a3436 From 55037345a41facc0a04ecd3b5c88e5f905b5e77b Mon Sep 17 00:00:00 2001 From: Nite Luo Date: Mon, 13 Jul 2015 17:44:44 -0700 Subject: [PATCH 63/93] update release notes for sdkbox --- docs/RELEASE_NOTES.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 15ee6023a7..796ab78e82 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -27,6 +27,7 @@ - [Nine Patch format support](#nine-patch-format-support) - [Android Studio support](#android-studio-support) - [Samsung Enhanced API support](#samsung-enhanced-api-support) + - [SDKBOX](#sdkbox) - [The Next Step](#the-next-step) @@ -65,9 +66,9 @@ You can use [Cocos Console](www.cocos2d-x.org/wiki/Cocos2d-console) command line In console application: ``` // Enter cpp test folder -cd tests/cpp-tests +cd tests/cpp-tests // Or enter js test folder -cd tests/js-tests +cd tests/js-tests // Or enter lua test folder cd tests/lua-tests @@ -168,6 +169,7 @@ cocos new -l cpp|js|lua MyGame * JS: Merged JSB and web engine into Cocos2d-x for a All-in-one engine * JS: Added `ccui.VideoPlayer` and `ccui.WebView` for iOS/Android/Web * console: Supported build & run Android Studio project with cocos console +* sdkbox: super EASY way to integrate 3rd party SDKs into cocos2d-x ## Download @@ -234,10 +236,30 @@ Samsung have provided a series of Enhanced API to optimize Cocos2d-x games for S In the previous versions, the resources file name's case is ignored on win32 platform, but not ignored in other platforms. This will lead to some unexpected issues, especially when user develop with win32 platform and pulish to other platforms like Android. In win32, the file name may be found without matching the case, but on other platforms it won't be found. So we decided to make win32 platform's resources case sensitive. Please make sure you are using the correct file name for your resources. +### SDKBOX +SDKBOX is a project that's built by part of the cocos2d-x team, in order to makes integrating 3rd party SDKs super EASY. +With SDKBOX you can integrate services like In App Purchase with one command +``` +sdkbox import -b iap +``` +Currently supported service including + +* [Tune](http://cocos2d-x.org/sdkbox/tune) +* [In App Purchase](http://cocos2d-x.org/sdkbox/iap) +* [AdColony](http://cocos2d-x.org/sdkbox/adcolony) +* [Vungle](http://cocos2d-x.org/sdkbox/vungle) +* [Chartboost](http://cocos2d-x.org/sdkbox/chartboost) +* [Kochava](http://cocos2d-x.org/sdkbox/kochava) +* [Google Analytics](http://cocos2d-x.org/sdkbox/googleanalytics) +* [Flurry Analytics](http://cocos2d-x.org/sdkbox/flurryanalytics) + + + + ## The Next Step As you can see, in v3.7, we have enhanced our 2d rendering with material system and integrated polygon sprite. More importantly, our 3d features become more and more complete, 3d Physics and Navigation Mesh with the previous Camera, 3d Sprite, 3d Particle System, 3d Light, 3d Terrain, Skybox, now you can really start to use Cocos to make a 3d game. In v3.8, we won't do much more features, but we'd like to slow down and refine our current 3D and 2D modules. -[The v3.8 milestone tasks](https://github.com/cocos2d/cocos2d-x/milestones/v3.8) \ No newline at end of file +[The v3.8 milestone tasks](https://github.com/cocos2d/cocos2d-x/milestones/v3.8) From ac1bf362083607df7d89268a9f35b1b7247578c8 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 14 Jul 2015 10:10:20 +0800 Subject: [PATCH 64/93] update submodule --- tools/bindings-generator | 2 +- tools/cocos2d-console | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/bindings-generator b/tools/bindings-generator index 618fce7b25..c3528c216b 160000 --- a/tools/bindings-generator +++ b/tools/bindings-generator @@ -1 +1 @@ -Subproject commit 618fce7b257aa5d3c68c5671a9368a4685a6b823 +Subproject commit c3528c216ba106d0c596740e98f7829ac2b5026f diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 2ef9289c0f..69f709f86f 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 2ef9289c0f9e365d4c0aa11989508607f7dada17 +Subproject commit 69f709f86f2507e45563e3ae474299541b3cc387 From 0a6933cc8cf114d701796cc860262483ed3f78ca Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Tue, 14 Jul 2015 10:46:17 +0800 Subject: [PATCH 65/93] Fixed #12668 : Lua-bindings-manual-network--LuaMinXmlHttpRequest have a memory leak. --- .../lua-bindings/manual/network/lua_xml_http_request.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 3862c9fd0c..df1514c1c5 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 @@ -59,6 +59,7 @@ LuaMinXmlHttpRequest::~LuaMinXmlHttpRequest() { _httpHeader.clear(); _requestHeader.clear(); + CC_SAFE_RELEASE_NULL(_httpRequest); } /** @@ -268,7 +269,7 @@ void LuaMinXmlHttpRequest::_sendRequest() release(); }); network::HttpClient::getInstance()->sendImmediate(_httpRequest); - _httpRequest->release(); + CC_SAFE_RELEASE_NULL(_httpRequest); retain(); } From 7882a534c17dbc0d4002651eee1f8d3e21ab95d3 Mon Sep 17 00:00:00 2001 From: Neo Kim Date: Tue, 14 Jul 2015 11:58:44 +0900 Subject: [PATCH 66/93] Correct the wrong boolean statement and make it easy to read --- cocos/ui/UIScrollView.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cocos/ui/UIScrollView.cpp b/cocos/ui/UIScrollView.cpp index 7a54a80847..51b9d1f5f5 100644 --- a/cocos/ui/UIScrollView.cpp +++ b/cocos/ui/UIScrollView.cpp @@ -603,7 +603,9 @@ bool ScrollView::scrollChildren(float touchOffsetX, float touchOffsetY) processScrollEvent(MoveDirection::RIGHT, false); } - return !scrolledToBottom && !scrolledToTop && !scrolledToLeft && !scrolledToRight; + bool scrollEnabledUpDown = (!scrolledToBottom && !scrolledToTop); + bool scrollEnabledLeftRight = (!scrolledToLeft && !scrolledToRight); + return scrollEnabledUpDown || scrollEnabledLeftRight; } void ScrollView::scrollToBottom(float second, bool attenuated) From d4f62a8063b320cd87fa388ac9674e159d0e38b5 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Tue, 14 Jul 2015 11:30:56 +0800 Subject: [PATCH 67/93] Label:improving the code readability. --- cocos/2d/CCLabel.cpp | 295 +++++++++++++++++++++------------------- cocos/2d/CCLabel.h | 141 +++++++++---------- cocos/2d/CCLabelTTF.cpp | 6 +- cocos/2d/CCLabelTTF.h | 3 +- 4 files changed, 228 insertions(+), 217 deletions(-) diff --git a/cocos/2d/CCLabel.cpp b/cocos/2d/CCLabel.cpp index a52080e421..182de4619a 100644 --- a/cocos/2d/CCLabel.cpp +++ b/cocos/2d/CCLabel.cpp @@ -162,7 +162,7 @@ Label* Label::create(const std::string& text, const std::string& font, float fon Label* Label::createWithSystemFont(const std::string& text, const std::string& font, float fontSize, const Size& dimensions /* = Size::ZERO */, TextHAlignment hAlignment /* = TextHAlignment::LEFT */, TextVAlignment vAlignment /* = TextVAlignment::TOP */) { - auto ret = new (std::nothrow) Label(nullptr,hAlignment,vAlignment); + auto ret = new (std::nothrow) Label(hAlignment,vAlignment); if (ret) { @@ -182,7 +182,7 @@ Label* Label::createWithSystemFont(const std::string& text, const std::string& f Label* Label::createWithTTF(const std::string& text, const std::string& fontFile, float fontSize, const Size& dimensions /* = Size::ZERO */, TextHAlignment hAlignment /* = TextHAlignment::LEFT */, TextVAlignment vAlignment /* = TextVAlignment::TOP */) { - auto ret = new (std::nothrow) Label(nullptr,hAlignment,vAlignment); + auto ret = new (std::nothrow) Label(hAlignment,vAlignment); if (ret && FileUtils::getInstance()->isFileExist(fontFile)) { @@ -202,9 +202,9 @@ Label* Label::createWithTTF(const std::string& text, const std::string& fontFile return nullptr; } -Label* Label::createWithTTF(const TTFConfig& ttfConfig, const std::string& text, TextHAlignment alignment /* = TextHAlignment::CENTER */, int maxLineWidth /* = 0 */) +Label* Label::createWithTTF(const TTFConfig& ttfConfig, const std::string& text, TextHAlignment hAlignment /* = TextHAlignment::CENTER */, int maxLineWidth /* = 0 */) { - auto ret = new (std::nothrow) Label(nullptr,alignment); + auto ret = new (std::nothrow) Label(hAlignment); if (ret && FileUtils::getInstance()->isFileExist(ttfConfig.fontFilePath) && ret->setTTFConfig(ttfConfig)) { @@ -219,9 +219,9 @@ Label* Label::createWithTTF(const TTFConfig& ttfConfig, const std::string& text, return nullptr; } -Label* Label::createWithBMFont(const std::string& bmfontFilePath, const std::string& text,const TextHAlignment& alignment /* = TextHAlignment::LEFT */, int maxLineWidth /* = 0 */, const Vec2& imageOffset /* = Vec2::ZERO */) +Label* Label::createWithBMFont(const std::string& bmfontFilePath, const std::string& text,const TextHAlignment& hAlignment /* = TextHAlignment::LEFT */, int maxLineWidth /* = 0 */, const Vec2& imageOffset /* = Vec2::ZERO */) { - auto ret = new (std::nothrow) Label(nullptr,alignment); + auto ret = new (std::nothrow) Label(hAlignment); if (ret && ret->setBMFontFilePath(bmfontFilePath,imageOffset)) { @@ -326,36 +326,18 @@ bool Label::setCharMap(const std::string& charMapFile, int itemWidth, int itemHe return true; } -Label::Label(FontAtlas *atlas /* = nullptr */, TextHAlignment hAlignment /* = TextHAlignment::LEFT */, - TextVAlignment vAlignment /* = TextVAlignment::TOP */,bool useDistanceField /* = false */,bool useA8Shader /* = false */) -: _isOpacityModifyRGB(false) -, _contentDirty(false) -, _fontAtlas(atlas) -, _textSprite(nullptr) -, _compatibleMode(false) +Label::Label(TextHAlignment hAlignment /* = TextHAlignment::LEFT */, + TextVAlignment vAlignment /* = TextVAlignment::TOP */) +: _textSprite(nullptr) +, _shadowNode(nullptr) +, _fontAtlas(nullptr) , _reusedLetter(nullptr) -, _additionalKerning(0.0f) -, _commonLineHeight(0.0f) -, _lineBreakWithoutSpaces(false) , _horizontalKernings(nullptr) -, _maxLineWidth(0.0f) -, _labelDimensions(Size::ZERO) -, _labelWidth(0.0f) -, _labelHeight(0.0f) -, _hAlignment(hAlignment) -, _vAlignment(vAlignment) -, _currNumLines(-1) -, _fontScale(1.0f) -, _useDistanceField(useDistanceField) -, _useA8Shader(useA8Shader) -, _effectColorF(Color4F::BLACK) -, _uniformEffectColor(0) -, _shadowDirty(false) -, _blendFunc(BlendFunc::ALPHA_PREMULTIPLIED) -, _insideBounds(true) { setAnchorPoint(Vec2::ANCHOR_MIDDLE); reset(); + _hAlignment = hAlignment; + _vAlignment = vAlignment; _purgeTextureListener = EventListenerCustom::create(FontAtlas::CMD_PURGE_FONTATLAS, [this](EventCustom* event){ if (_fontAtlas && _currentLabelType == LabelType::TTF && event->getUserData() == _fontAtlas) @@ -394,27 +376,27 @@ Label::~Label() if (_fontAtlas) { + Node::removeAllChildrenWithCleanup(true); + CC_SAFE_RELEASE_NULL(_reusedLetter); + _batchNodes.clear(); FontAtlasCache::releaseFontAtlas(_fontAtlas); } _eventDispatcher->removeEventListener(_purgeTextureListener); _eventDispatcher->removeEventListener(_resetTextureListener); - CC_SAFE_RELEASE_NULL(_reusedLetter); CC_SAFE_RELEASE_NULL(_textSprite); CC_SAFE_RELEASE_NULL(_shadowNode); } void Label::reset() { - TTFConfig temp; - _fontConfig = temp; - - _systemFontDirty = false; - _systemFont = "Helvetica"; - _systemFontSize = 12; - + CC_SAFE_RELEASE_NULL(_textSprite); + CC_SAFE_RELEASE_NULL(_shadowNode); + Node::removeAllChildrenWithCleanup(true); + CC_SAFE_RELEASE_NULL(_reusedLetter); + _letters.clear(); _batchNodes.clear(); - + _lettersInfo.clear(); if (_fontAtlas) { FontAtlasCache::releaseFontAtlas(_fontAtlas); @@ -423,21 +405,53 @@ void Label::reset() _currentLabelType = LabelType::STRING_TEXTURE; _currLabelEffect = LabelEffect::NORMAL; - _shadowBlurRadius = 0; + _contentDirty = false; + _currNumLines = 0; + _limitShowCount = 0; + _currentUTF16String.clear(); + _originalUTF8String.clear(); - Node::removeAllChildrenWithCleanup(true); - _textSprite = nullptr; - _shadowNode = nullptr; + TTFConfig temp; + _fontConfig = temp; + _outlineSize = 0.f; + _bmFontPath = ""; + _systemFontDirty = false; + _systemFont = "Helvetica"; + _systemFontSize = 12; - CC_SAFE_RELEASE_NULL(_reusedLetter); + if (_horizontalKernings) + { + delete[] _horizontalKernings; + _horizontalKernings = nullptr; + } + _additionalKerning = 0.f; + _commonLineHeight = 0.f; + _maxLineWidth = 0.f; + _labelDimensions.width = 0.f; + _labelDimensions.height = 0.f; + _labelWidth = 0.f; + _labelHeight = 0.f; + _lineBreakWithoutSpaces = false; + _hAlignment = TextHAlignment::LEFT; + _vAlignment = TextVAlignment::TOP; + _effectColorF = Color4F::BLACK; _textColor = Color4B::WHITE; _textColorF = Color4F::WHITE; setColor(Color3B::WHITE); + _shadowDirty = false; _shadowEnabled = false; + _shadowBlurRadius = 0.f; + + _correctionScale = 1.f; + _useDistanceField = false; + _useA8Shader = false; _clipEnabled = false; _blendFuncDirty = false; + _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED; + _isOpacityModifyRGB = false; + _insideBounds = true; } void Label::updateShaderProgram() @@ -539,7 +553,7 @@ bool Label::setTTFConfig(const TTFConfig& ttfConfig) updateShaderProgram(); if(ttfConfig.distanceFieldEnabled) { - this->setFontScale(1.0f * ttfConfig.fontSize / DistanceFieldFontSize); + this->setCorrectionScale(1.0f * ttfConfig.fontSize / DistanceFieldFontSize); } } @@ -624,7 +638,7 @@ void Label::setScale(float scale) { if (_useDistanceField) { - scale *= _fontScale; + scale *= _correctionScale; } Node::setScale(scale); } @@ -633,7 +647,7 @@ void Label::setScaleX(float scaleX) { if (_useDistanceField) { - scaleX *= _fontScale; + scaleX *= _correctionScale; } Node::setScaleX(scaleX); } @@ -642,7 +656,7 @@ void Label::setScaleY(float scaleY) { if (_useDistanceField) { - scaleY *= _fontScale; + scaleY *= _correctionScale; } Node::setScaleY(scaleY); } @@ -651,7 +665,7 @@ float Label::getScaleY() const { if (_useDistanceField) { - return _scaleY / _fontScale; + return _scaleY / _correctionScale; } else { @@ -663,7 +677,7 @@ float Label::getScaleX() const { if (_useDistanceField) { - return _scaleX / _fontScale; + return _scaleX / _correctionScale; } else { @@ -849,11 +863,10 @@ void Label::enableGlow(const Color4B& glowColor) _contentDirty = true; } _currLabelEffect = LabelEffect::GLOW; - _effectColor = glowColor; - _effectColorF.r = _effectColor.r / 255.0f; - _effectColorF.g = _effectColor.g / 255.0f; - _effectColorF.b = _effectColor.b / 255.0f; - _effectColorF.a = _effectColor.a / 255.0f; + _effectColorF.r = glowColor.r / 255.0f; + _effectColorF.g = glowColor.g / 255.0f; + _effectColorF.b = glowColor.b / 255.0f; + _effectColorF.a = glowColor.a / 255.0f; updateShaderProgram(); } } @@ -877,9 +890,12 @@ void Label::enableOutline(const Color4B& outlineColor,int outlineSize /* = -1 */ setTTFConfig(_fontConfig); } } - else if (_effectColor != outlineColor || _outlineSize != outlineSize) + else if (_effectColorF != outlineColor || _outlineSize != outlineSize) { - _effectColor = outlineColor; + _effectColorF.r = outlineColor.r / 255.f; + _effectColorF.g = outlineColor.g / 255.f; + _effectColorF.b = outlineColor.b / 255.f; + _effectColorF.a = outlineColor.a / 255.f; _outlineSize = outlineSize; _currLabelEffect = LabelEffect::OUTLINE; _contentDirty = true; @@ -896,7 +912,6 @@ void Label::enableShadow(const Color4B& shadowColor /* = Color4B::BLACK */,const _shadowOffset.width = offset.width * contentScaleFactor; _shadowOffset.height = offset.height * contentScaleFactor; //TODO: support blur for shadow - _shadowBlurRadius = 0; _shadowColor3B.r = shadowColor.r; _shadowColor3B.g = shadowColor.g; @@ -905,13 +920,14 @@ void Label::enableShadow(const Color4B& shadowColor /* = Color4B::BLACK */,const if (!_systemFontDirty && !_contentDirty && _textSprite) { + auto& fontDef = _getFontDefinition(); if (_shadowNode) { if (shadowColor != _shadowColor4F) { _shadowNode->release(); _shadowNode = nullptr; - createShadowSpriteForSystemFont(); + createShadowSpriteForSystemFont(fontDef); } else { @@ -920,7 +936,7 @@ void Label::enableShadow(const Color4B& shadowColor /* = Color4B::BLACK */,const } else { - createShadowSpriteForSystemFont(); + createShadowSpriteForSystemFont(fontDef); } } @@ -982,59 +998,18 @@ void Label::disableEffect(LabelEffect effect) } } -void Label::setFontScale(float fontScale) +void Label::setCorrectionScale(float correctionScale) { - _fontScale = fontScale * CC_CONTENT_SCALE_FACTOR(); - Node::setScale(_fontScale); + _correctionScale = correctionScale * CC_CONTENT_SCALE_FACTOR(); + Node::setScale(_correctionScale); } -void Label::createSpriteForSystemFont() +void Label::createSpriteForSystemFont(const FontDefinition& fontDef) { _currentLabelType = LabelType::STRING_TEXTURE; - if (!_compatibleMode) - { - _fontDefinition._fontName = _systemFont; - _fontDefinition._fontSize = _systemFontSize; - - _fontDefinition._alignment = _hAlignment; - _fontDefinition._vertAlignment = _vAlignment; - - _fontDefinition._dimensions.width = _labelWidth; - _fontDefinition._dimensions.height = _labelHeight; - - _fontDefinition._fontFillColor.r = _textColor.r; - _fontDefinition._fontFillColor.g = _textColor.g; - _fontDefinition._fontFillColor.b = _textColor.b; - _fontDefinition._fontAlpha = _textColor.a; - - _fontDefinition._shadow._shadowEnabled = false; - - if (_currLabelEffect == LabelEffect::OUTLINE && _outlineSize > 0) - { - _fontDefinition._stroke._strokeEnabled = true; - _fontDefinition._stroke._strokeSize = _outlineSize; - _fontDefinition._stroke._strokeColor.r = _effectColor.r; - _fontDefinition._stroke._strokeColor.g = _effectColor.g; - _fontDefinition._stroke._strokeColor.b = _effectColor.b; - _fontDefinition._stroke._strokeAlpha = _effectColor.a; - } - else - { - _fontDefinition._stroke._strokeEnabled = false; - } - -#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) && (CC_TARGET_PLATFORM != CC_PLATFORM_IOS) - if (_fontDefinition._stroke._strokeEnabled) - { - CCLOGERROR("Currently only supported on iOS and Android!"); - } - _fontDefinition._stroke._strokeEnabled = false; -#endif - } - auto texture = new (std::nothrow) Texture2D; - texture->initWithString(_originalUTF8String.c_str(), _fontDefinition); + texture->initWithString(_originalUTF8String.c_str(), fontDef); _textSprite = Sprite::createWithTexture(texture); //set camera mask using label's camera mask, because _textSprite may be null when setting camera mask to label @@ -1052,16 +1027,16 @@ void Label::createSpriteForSystemFont() _textSprite->updateDisplayedOpacity(_displayedOpacity); } -void Label::createShadowSpriteForSystemFont() +void Label::createShadowSpriteForSystemFont(const FontDefinition& fontDef) { - if (!_fontDefinition._stroke._strokeEnabled && _fontDefinition._fontFillColor == _shadowColor3B - && (_fontDefinition._fontAlpha == _shadowOpacity)) + if (!fontDef._stroke._strokeEnabled && fontDef._fontFillColor == _shadowColor3B + && (fontDef._fontAlpha == _shadowOpacity)) { _shadowNode = Sprite::createWithTexture(_textSprite->getTexture()); } else { - auto shadowFontDefinition = _fontDefinition; + FontDefinition shadowFontDefinition = fontDef; shadowFontDefinition._fontFillColor.r = _shadowColor3B.r; shadowFontDefinition._fontFillColor.g = _shadowColor3B.g; shadowFontDefinition._fontFillColor.b = _shadowColor3B.b; @@ -1108,20 +1083,35 @@ void Label::setCameraMask(unsigned short mask, bool applyChildren) void Label::setFontDefinition(const FontDefinition& textDefinition) { - _fontDefinition = textDefinition; + _systemFont = textDefinition._fontName; + _systemFontSize = textDefinition._fontSize; + _hAlignment = textDefinition._alignment; + _vAlignment = textDefinition._vertAlignment; + setDimensions(textDefinition._dimensions.width, textDefinition._dimensions.height); + Color4B textColor = Color4B(textDefinition._fontFillColor); + textColor.a = textDefinition._fontAlpha; + setTextColor(textColor); + #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) && (CC_TARGET_PLATFORM != CC_PLATFORM_IOS) - if (_fontDefinition._stroke._strokeEnabled) + if (textDefinition._stroke._strokeEnabled) { CCLOGERROR("Currently only supported on iOS and Android!"); } - _fontDefinition._stroke._strokeEnabled = false; -#endif - if (_fontDefinition._shadow._shadowEnabled) + _outlineSize = 0.f; +#else + if (textDefinition._stroke._strokeEnabled && textDefinition._stroke._strokeSize > 0.f) { - _fontDefinition._shadow._shadowEnabled = false; - enableShadow(Color4B(0,0,0,255 * _fontDefinition._shadow._shadowOpacity),_fontDefinition._shadow._shadowOffset,_fontDefinition._shadow._shadowBlur); + Color4B outlineColor = Color4B(textDefinition._stroke._strokeColor); + outlineColor.a = textDefinition._stroke._strokeAlpha; + enableOutline(outlineColor, textDefinition._stroke._strokeSize); + } +#endif + + if (textDefinition._shadow._shadowEnabled) + { + enableShadow(Color4B(0, 0, 0, 255 * textDefinition._shadow._shadowOpacity), + textDefinition._shadow._shadowOffset, textDefinition._shadow._shadowBlur); } - _compatibleMode = true; } void Label::updateContent() @@ -1156,10 +1146,11 @@ void Label::updateContent() } else { - createSpriteForSystemFont(); + auto& fontDef = _getFontDefinition(); + createSpriteForSystemFont(fontDef); if (_shadowEnabled) { - createShadowSpriteForSystemFont(); + createShadowSpriteForSystemFont(fontDef); } } _contentDirty = false; @@ -1297,8 +1288,7 @@ void Label::visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t pare uint32_t flags = processParentFlags(parentTransform, parentFlags); - if (!_originalUTF8String.empty() && _shadowEnabled && _shadowBlurRadius <= 0 - && (_shadowDirty || (flags & FLAGS_DIRTY_MASK))) + if (!_originalUTF8String.empty() && _shadowEnabled && (_shadowDirty || (flags & FLAGS_DIRTY_MASK))) { _position.x += _shadowOffset.width; _position.y += _shadowOffset.height; @@ -1526,11 +1516,6 @@ int Label::getStringLength() const } // RGBA protocol -bool Label::isOpacityModifyRGB() const -{ - return _isOpacityModifyRGB; -} - void Label::setOpacityModifyRGB(bool isOpacityModifyRGB) { if (isOpacityModifyRGB != _isOpacityModifyRGB) @@ -1572,20 +1557,16 @@ void Label::setTextColor(const Color4B &color) { CCASSERT(_currentLabelType == LabelType::TTF || _currentLabelType == LabelType::STRING_TEXTURE, "Only supported system font and ttf!"); + if (_currentLabelType == LabelType::STRING_TEXTURE && _textColor != color) + { + _contentDirty = true; + } + _textColor = color; _textColorF.r = _textColor.r / 255.0f; _textColorF.g = _textColor.g / 255.0f; _textColorF.b = _textColor.b / 255.0f; _textColorF.a = _textColor.a / 255.0f; - - if (_currentLabelType == LabelType::STRING_TEXTURE) - { - if (_fontDefinition._fontFillColor.r != _textColor.r || _fontDefinition._fontFillColor.g != _textColor.g - || _fontDefinition._fontFillColor.b != _textColor.b || _fontDefinition._fontAlpha != _textColor.a) - { - _contentDirty = true; - } - } } void Label::updateColor() @@ -1680,4 +1661,44 @@ void Label::removeChild(Node* child, bool cleanup /* = true */) } } +FontDefinition Label::_getFontDefinition() const +{ + FontDefinition systemFontDef; + systemFontDef._fontName = _systemFont; + systemFontDef._fontSize = _systemFontSize; + systemFontDef._alignment = _hAlignment; + systemFontDef._vertAlignment = _vAlignment; + systemFontDef._dimensions.width = _labelWidth; + systemFontDef._dimensions.height = _labelHeight; + systemFontDef._fontFillColor.r = _textColor.r; + systemFontDef._fontFillColor.g = _textColor.g; + systemFontDef._fontFillColor.b = _textColor.b; + systemFontDef._fontAlpha = _textColor.a; + systemFontDef._shadow._shadowEnabled = false; + + if (_currLabelEffect == LabelEffect::OUTLINE && _outlineSize > 0.f) + { + systemFontDef._stroke._strokeEnabled = true; + systemFontDef._stroke._strokeSize = _outlineSize; + systemFontDef._stroke._strokeColor.r = _effectColorF.r * 255; + systemFontDef._stroke._strokeColor.g = _effectColorF.g * 255; + systemFontDef._stroke._strokeColor.b = _effectColorF.b * 255; + systemFontDef._stroke._strokeAlpha = _effectColorF.a * 255; + } + else + { + systemFontDef._stroke._strokeEnabled = false; + } + +#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) && (CC_TARGET_PLATFORM != CC_PLATFORM_IOS) + if (systemFontDef._stroke._strokeEnabled) + { + CCLOGERROR("Currently only supported on iOS and Android!"); + } + systemFontDef._stroke._strokeEnabled = false; +#endif + + return systemFontDef; +} + NS_CC_END diff --git a/cocos/2d/CCLabel.h b/cocos/2d/CCLabel.h index db9f19fafa..f7389f55ab 100644 --- a/cocos/2d/CCLabel.h +++ b/cocos/2d/CCLabel.h @@ -162,7 +162,8 @@ public: * @return An automatically released Label object. * @see TTFConfig setTTFConfig setMaxLineWidth */ - static Label* createWithTTF(const TTFConfig& ttfConfig, const std::string& text, TextHAlignment hAlignment = TextHAlignment::LEFT, int maxLineWidth = 0); + static Label* createWithTTF(const TTFConfig& ttfConfig, const std::string& text, + TextHAlignment hAlignment = TextHAlignment::LEFT, int maxLineWidth = 0); /** * Allocates and initializes a Label, with a bitmap font file. @@ -441,7 +442,7 @@ public: virtual const BlendFunc& getBlendFunc() const override { return _blendFunc; } virtual void setBlendFunc(const BlendFunc &blendFunc) override; - virtual bool isOpacityModifyRGB() const override; + virtual bool isOpacityModifyRGB() const override { return _isOpacityModifyRGB; } virtual void setOpacityModifyRGB(bool isOpacityModifyRGB) override; virtual void updateDisplayedColor(const Color3B& parentColor) override; virtual void updateDisplayedOpacity(GLubyte parentOpacity) override; @@ -455,7 +456,6 @@ public: virtual std::string getDescription() const override; virtual const Size& getContentSize() const override; - virtual Rect getBoundingBox() const override; virtual void visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t parentFlags) override; @@ -469,13 +469,8 @@ public: CC_DEPRECATED_ATTRIBUTE static Label* create(const std::string& text, const std::string& font, float fontSize, const Size& dimensions = Size::ZERO, TextHAlignment hAlignment = TextHAlignment::LEFT, TextVAlignment vAlignment = TextVAlignment::TOP); - CC_DEPRECATED_ATTRIBUTE virtual void setFontDefinition(const FontDefinition& textDefinition); - CC_DEPRECATED_ATTRIBUTE const FontDefinition& getFontDefinition() const { return _fontDefinition; } - - /** - * @deprecated Use `getLineHeight` instead. - */ + CC_DEPRECATED_ATTRIBUTE FontDefinition getFontDefinition() const { return _getFontDefinition(); } CC_DEPRECATED_ATTRIBUTE int getCommonLineHeight() const { return (int)getLineHeight();} CC_CONSTRUCTOR_ACCESS: @@ -483,8 +478,8 @@ CC_CONSTRUCTOR_ACCESS: * Constructor of Label. * @js NA */ - Label(FontAtlas *atlas = nullptr, TextHAlignment hAlignment = TextHAlignment::LEFT, - TextVAlignment vAlignment = TextVAlignment::TOP,bool useDistanceField = false,bool useA8Shader = false); + Label(TextHAlignment hAlignment = TextHAlignment::LEFT, + TextVAlignment vAlignment = TextVAlignment::TOP); /** * Destructor of Label. @@ -494,132 +489,124 @@ CC_CONSTRUCTOR_ACCESS: virtual ~Label(); protected: - void onDraw(const Mat4& transform, bool transformUpdated); - void onDrawShadow(GLProgram* glProgram); - struct LetterInfo { FontLetterDefinition def; - Vec2 position; Size contentSize; int atlasIndex; }; - enum class LabelType { + enum class LabelType { TTF, BMFONT, CHARMAP, STRING_TEXTURE }; - virtual void setFontAtlas(FontAtlas* atlas,bool distanceFieldEnabled = false, bool useA8Shader = false); + virtual void setFontAtlas(FontAtlas* atlas, bool distanceFieldEnabled = false, bool useA8Shader = false); - bool recordLetterInfo(const cocos2d::Vec2& point,const FontLetterDefinition& letterDef, int spriteIndex); - bool recordPlaceholderInfo(int spriteIndex); - - void setFontScale(float fontScale); - - virtual void alignText(); - - bool computeHorizontalKernings(const std::u16string& stringToRender); + void setCorrectionScale(float fontScale); void computeStringNumLines(); + void onDraw(const Mat4& transform, bool transformUpdated); + void onDrawShadow(GLProgram* glProgram); + void drawSelf(Renderer* renderer, uint32_t flags); + + virtual void alignText(); + bool computeHorizontalKernings(const std::u16string& stringToRender); + bool recordLetterInfo(const cocos2d::Vec2& point,const FontLetterDefinition& letterDef, int spriteIndex); + bool recordPlaceholderInfo(int spriteIndex); + void updateQuads(); - virtual void updateColor() override; + void createSpriteForSystemFont(const FontDefinition& fontDef); + void createShadowSpriteForSystemFont(const FontDefinition& fontDef); virtual void updateShaderProgram(); - void createSpriteForSystemFont(); - - void createShadowSpriteForSystemFont(); - void reset(); - void drawSelf(Renderer* renderer, uint32_t flags); + FontDefinition _getFontDefinition() const; + + virtual void updateColor() override; + + LabelType _currentLabelType; + bool _contentDirty; + std::u16string _currentUTF16String; + std::string _originalUTF8String; + int _currNumLines; std::string _bmFontPath; - - bool _isOpacityModifyRGB; - bool _contentDirty; + TTFConfig _fontConfig; + float _outlineSize; bool _systemFontDirty; std::string _systemFont; - float _systemFontSize; - LabelType _currentLabelType; - - Vector _batchNodes; - FontAtlas * _fontAtlas; - std::vector _lettersInfo; - EventListenerCustom* _purgeTextureListener; - EventListenerCustom* _resetTextureListener; - - TTFConfig _fontConfig; - - //compatibility with older LabelTTF + float _systemFontSize; Sprite* _textSprite; - FontDefinition _fontDefinition; - bool _compatibleMode; + Sprite* _shadowNode; + + FontAtlas* _fontAtlas; + Vector _batchNodes; + std::vector _lettersInfo; //! used for optimization Sprite *_reusedLetter; Rect _reusedRect; int _limitShowCount; - float _additionalKerning; + //layout relevant properties. float _commonLineHeight; - bool _lineBreakWithoutSpaces; - int * _horizontalKernings; - + float _additionalKerning; + int* _horizontalKernings; + bool _lineBreakWithoutSpaces; float _maxLineWidth; - Size _labelDimensions; + Size _labelDimensions; float _labelWidth; float _labelHeight; TextHAlignment _hAlignment; TextVAlignment _vAlignment; - int _currNumLines; - std::u16string _currentUTF16String; - std::string _originalUTF8String; + //the correction scale for distance field. + float _correctionScale; - float _fontScale; + LabelEffect _currLabelEffect; + Color4F _effectColorF; + Color4B _textColor; + Color4F _textColorF; + CustomCommand _customCommand; + Mat4 _shadowTransform; + GLuint _uniformEffectColor; + GLuint _uniformTextColor; bool _useDistanceField; bool _useA8Shader; - LabelEffect _currLabelEffect; - Color4B _effectColor; - Color4F _effectColorF; - - GLuint _uniformEffectColor; - GLuint _uniformTextColor; - CustomCommand _customCommand; - - bool _shadowDirty; - bool _shadowEnabled; - Size _shadowOffset; - int _shadowBlurRadius; - Mat4 _shadowTransform; + bool _shadowDirty; + bool _shadowEnabled; + Size _shadowOffset; + Color4F _shadowColor4F; Color3B _shadowColor3B; GLubyte _shadowOpacity; - Sprite* _shadowNode; - - int _outlineSize; - - Color4B _textColor; - Color4F _textColorF; + float _shadowBlurRadius; bool _clipEnabled; bool _blendFuncDirty; BlendFunc _blendFunc; - /// whether or not the sprite was inside bounds the previous frame + + /// whether or not the label was inside bounds the previous frame bool _insideBounds; + bool _isOpacityModifyRGB; + std::unordered_map _letters; + EventListenerCustom* _purgeTextureListener; + EventListenerCustom* _resetTextureListener; + private: CC_DISALLOW_COPY_AND_ASSIGN(Label); diff --git a/cocos/2d/CCLabelTTF.cpp b/cocos/2d/CCLabelTTF.cpp index 205cce2c3e..c19c037fc5 100644 --- a/cocos/2d/CCLabelTTF.cpp +++ b/cocos/2d/CCLabelTTF.cpp @@ -223,9 +223,11 @@ void LabelTTF::setTextDefinition(const FontDefinition& theDefinition) _contentDirty = true; } -const FontDefinition& LabelTTF::getTextDefinition() const +const FontDefinition& LabelTTF::getTextDefinition() { - return _renderLabel->getFontDefinition(); + auto fontDef = _renderLabel->getFontDefinition(); + memcpy(&_fontDef, &fontDef, sizeof(FontDefinition)); + return _fontDef; } void LabelTTF::setBlendFunc(const BlendFunc &blendFunc) diff --git a/cocos/2d/CCLabelTTF.h b/cocos/2d/CCLabelTTF.h index c4313a961f..cae01b65c1 100644 --- a/cocos/2d/CCLabelTTF.h +++ b/cocos/2d/CCLabelTTF.h @@ -100,7 +100,7 @@ public: void setTextDefinition(const FontDefinition& theDefinition); /** get the text definition used by this label */ - const FontDefinition& getTextDefinition() const; + const FontDefinition& getTextDefinition(); @@ -163,6 +163,7 @@ public: protected: Label* _renderLabel; bool _contentDirty; + FontDefinition _fontDef; }; From 43a5b6f0206fa3be079f8f3a7abab525ed49cbb3 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 14 Jul 2015 13:40:09 +0800 Subject: [PATCH 68/93] Fix jsb loaders issues --- .../scripting/js-bindings/script/jsb_boot.js | 30 ++++++++++++------- .../js-bindings/script/jsb_loaders.js | 29 +++++++++--------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/cocos/scripting/js-bindings/script/jsb_boot.js b/cocos/scripting/js-bindings/script/jsb_boot.js index 09b4123a9c..7f3eaaf814 100644 --- a/cocos/scripting/js-bindings/script/jsb_boot.js +++ b/cocos/scripting/js-bindings/script/jsb_boot.js @@ -625,15 +625,18 @@ cc.loader = { } var basePath = loader.getBasePath ? loader.getBasePath() : self.resPath; var realUrl = self.getUrl(basePath, url); - var data = loader.load(realUrl, url); - if (data) { - self.cache[url] = data; - cb(null, data); - } else { - self.cache[url] = null; - delete self.cache[url]; - cb(); - } + + loader.load(realUrl, url, item, function (err, data) { + if (err) { + cc.log(err); + self.cache[url] = null; + delete self.cache[url]; + cb(); + } else { + self.cache[url] = data; + cb(null, data); + } + }); }, /** @@ -776,13 +779,18 @@ cc.loader = { * Release the cache of resource by url. * @param url */ - release : function(url){//do nothing in jsb + release : function(url){ + var cache = this.cache; + delete cache[url]; }, /** * Resource cache of all resources. */ - releaseAll : function(){//do nothing in jsb + releaseAll : function(){ + var locCache = this.cache; + for (var key in locCache) + delete locCache[key]; } }; diff --git a/cocos/scripting/js-bindings/script/jsb_loaders.js b/cocos/scripting/js-bindings/script/jsb_loaders.js index 9ef7ec5900..2a1e23f7e1 100644 --- a/cocos/scripting/js-bindings/script/jsb_loaders.js +++ b/cocos/scripting/js-bindings/script/jsb_loaders.js @@ -27,8 +27,8 @@ // cc._emptyLoader = { - load : function(realUrl, url){ - return null; + load : function(realUrl, url, res, cb){ + cb && cb(null, null); } }; @@ -39,21 +39,22 @@ cc.loader.register([ cc._emptyLoader); cc._txtLoader = { - load : function(realUrl, url){ - return jsb.fileUtils.getStringFromFile(realUrl); + load : function(realUrl, url, res, cb){ + cb && cb(null, jsb.fileUtils.getStringFromFile(realUrl)); } }; cc.loader.register(["txt", "xml", "vsh", "fsh", "tmx", "tsx"], cc._txtLoader); cc._jsonLoader = { - load : function(realUrl, url){ - var data = jsb.fileUtils.getStringFromFile(realUrl); + load : function(realUrl, url, res, cb){ + var data = jsb.fileUtils.getStringFromFile(realUrl), result; try{ - return JSON.parse(data); + result = JSON.parse(data); }catch(e){ cc.error(e); - return null; + result = null; } + cb && cb(null, result); } }; cc.loader.register(["json", "ExportJson"], cc._jsonLoader); @@ -73,16 +74,16 @@ cc._imgLoader = { cc.loader.register(["png", "jpg", "bmp","jpeg","gif"], cc._imgLoader); cc._plistLoader = { - load : function(realUrl, url){ + load : function(realUrl, url, res, cb){ var content = jsb.fileUtils.getStringFromFile(realUrl); - return cc.plistParser.parse(content); + cb && cb(null, cc.plistParser.parse(content)); } }; cc.loader.register(["plist"], cc._plistLoader); cc._binaryLoader = { - load : function(realUrl, url){ - return cc.loader.loadBinarySync(realUrl); + load : function(realUrl, url, res, cb){ + cb && cb(null, cc.loader.loadBinarySync(realUrl)); } }; cc.loader.register(["ccbi"], cc._binaryLoader); @@ -166,9 +167,9 @@ cc._fntLoader = { return fnt; }, - load : function(realUrl, url){ + load : function(realUrl, url, res, cb){ var data = jsb.fileUtils.getStringFromFile(realUrl); - return this.parseFnt(data, url); + cb && cb(null, this.parseFnt(data, url)); } }; cc.loader.register(["fnt"], cc._fntLoader); From 6b9a5b8264ca99157279e4f3941a0b34c0ded08d Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 14 Jul 2015 05:41:48 +0000 Subject: [PATCH 69/93] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../auto/api/jsb_cocos2dx_ui_auto_api.js | 48 +++- .../js-bindings/auto/jsb_cocos2dx_3d_auto.cpp | 1 + .../js-bindings/auto/jsb_cocos2dx_auto.cpp | 61 +++++ .../auto/jsb_cocos2dx_extension_auto.cpp | 9 + .../auto/jsb_cocos2dx_spine_auto.cpp | 1 + .../auto/jsb_cocos2dx_studio_auto.cpp | 2 + .../js-bindings/auto/jsb_cocos2dx_ui_auto.cpp | 127 +++++++++- .../js-bindings/auto/jsb_cocos2dx_ui_auto.hpp | 6 +- .../lua-bindings/auto/api/ScrollView.lua | 40 +++- .../auto/lua_cocos2dx_ui_auto.cpp | 222 +++++++++++++++++- .../auto/lua_cocos2dx_ui_auto.hpp | 4 + 11 files changed, 488 insertions(+), 33 deletions(-) diff --git a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_ui_auto_api.js b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_ui_auto_api.js index fd20a292f2..c5dd20afa5 100644 --- a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_ui_auto_api.js +++ b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_ui_auto_api.js @@ -2683,6 +2683,16 @@ bool { }, +/** + * @method setScrollBarOpacity + * @param {unsigned char} arg0 + */ +setScrollBarOpacity : function ( +char +) +{ +}, + /** * @method setScrollBarEnabled * @param {bool} arg0 @@ -2767,6 +2777,16 @@ jumpToBottom : function ( { }, +/** + * @method setInnerContainerPosition + * @param {vec2_object} arg0 + */ +setInnerContainerPosition : function ( +vec2 +) +{ +}, + /** * @method setDirection * @param {ccui.ScrollView::Direction} arg0 @@ -2815,6 +2835,16 @@ size { }, +/** + * @method getInnerContainerPosition + * @return {vec2_object} + */ +getInnerContainerPosition : function ( +) +{ + return cc.Vec2; +}, + /** * @method getInnerContainerSize * @return {size_object} @@ -2875,6 +2905,16 @@ bool { }, +/** + * @method setScrollBarAutoHideEnabled + * @param {bool} arg0 + */ +setScrollBarAutoHideEnabled : function ( +bool +) +{ +}, + /** * @method getScrollBarColor * @return {color3b_object} @@ -3008,13 +3048,13 @@ bool }, /** - * @method setScrollBarAutoHideEnabled - * @param {bool} arg0 + * @method getScrollBarOpacity + * @return {unsigned char} */ -setScrollBarAutoHideEnabled : function ( -bool +getScrollBarOpacity : function ( ) { + return 0; }, /** diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_3d_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_3d_auto.cpp index b8f339ad41..5981ba627b 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_3d_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_3d_auto.cpp @@ -3532,6 +3532,7 @@ void js_register_cocos2dx_3d_Sprite3D(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { jsb.Sprite3D.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_Sprite3DCache_class; diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp index 57a218c4b4..86b3b6d09d 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp @@ -5068,6 +5068,7 @@ void js_register_cocos2dx_Node(JSContext *cx, JS::HandleObject global) { p->parentProto = NULL; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.Node.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d___NodeRGBA_class; @@ -5176,6 +5177,7 @@ void js_register_cocos2dx___NodeRGBA(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.NodeRGBA.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_Scene_class; @@ -5479,6 +5481,7 @@ void js_register_cocos2dx_Scene(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.Scene.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_GLView_class; @@ -9689,6 +9692,7 @@ void js_register_cocos2dx_SpriteFrame(JSContext *cx, JS::HandleObject global) { p->parentProto = NULL; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.SpriteFrame.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_AnimationFrame_class; @@ -15299,6 +15303,7 @@ void js_register_cocos2dx_TargetedAction(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_ActionInterval_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TargetedAction.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ActionFloat_class; @@ -15512,6 +15517,7 @@ void js_register_cocos2dx_ActionFloat(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ActionInterval_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ActionFloat.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_Configuration_class; @@ -20483,6 +20489,7 @@ void js_register_cocos2dx_ActionCamera(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ActionInterval_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ActionCamera.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_OrbitCamera_class; @@ -24099,6 +24106,7 @@ void js_register_cocos2dx_EaseBezierAction(JSContext *cx, JS::HandleObject globa p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseBezierAction.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseQuadraticActionIn_class; @@ -24243,6 +24251,7 @@ void js_register_cocos2dx_EaseQuadraticActionIn(JSContext *cx, JS::HandleObject p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseQuadraticActionIn.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseQuadraticActionOut_class; @@ -24387,6 +24396,7 @@ void js_register_cocos2dx_EaseQuadraticActionOut(JSContext *cx, JS::HandleObject p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseQuadraticActionOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseQuadraticActionInOut_class; @@ -24531,6 +24541,7 @@ void js_register_cocos2dx_EaseQuadraticActionInOut(JSContext *cx, JS::HandleObje p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseQuadraticActionInOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseQuarticActionIn_class; @@ -24675,6 +24686,7 @@ void js_register_cocos2dx_EaseQuarticActionIn(JSContext *cx, JS::HandleObject gl p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseQuarticActionIn.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseQuarticActionOut_class; @@ -24819,6 +24831,7 @@ void js_register_cocos2dx_EaseQuarticActionOut(JSContext *cx, JS::HandleObject g p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseQuarticActionOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseQuarticActionInOut_class; @@ -24963,6 +24976,7 @@ void js_register_cocos2dx_EaseQuarticActionInOut(JSContext *cx, JS::HandleObject p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseQuarticActionInOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseQuinticActionIn_class; @@ -25107,6 +25121,7 @@ void js_register_cocos2dx_EaseQuinticActionIn(JSContext *cx, JS::HandleObject gl p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseQuinticActionIn.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseQuinticActionOut_class; @@ -25251,6 +25266,7 @@ void js_register_cocos2dx_EaseQuinticActionOut(JSContext *cx, JS::HandleObject g p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseQuinticActionOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseQuinticActionInOut_class; @@ -25395,6 +25411,7 @@ void js_register_cocos2dx_EaseQuinticActionInOut(JSContext *cx, JS::HandleObject p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseQuinticActionInOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseCircleActionIn_class; @@ -25539,6 +25556,7 @@ void js_register_cocos2dx_EaseCircleActionIn(JSContext *cx, JS::HandleObject glo p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseCircleActionIn.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseCircleActionOut_class; @@ -25683,6 +25701,7 @@ void js_register_cocos2dx_EaseCircleActionOut(JSContext *cx, JS::HandleObject gl p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseCircleActionOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseCircleActionInOut_class; @@ -25827,6 +25846,7 @@ void js_register_cocos2dx_EaseCircleActionInOut(JSContext *cx, JS::HandleObject p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseCircleActionInOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseCubicActionIn_class; @@ -25971,6 +25991,7 @@ void js_register_cocos2dx_EaseCubicActionIn(JSContext *cx, JS::HandleObject glob p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseCubicActionIn.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseCubicActionOut_class; @@ -26115,6 +26136,7 @@ void js_register_cocos2dx_EaseCubicActionOut(JSContext *cx, JS::HandleObject glo p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseCubicActionOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_EaseCubicActionInOut_class; @@ -26259,6 +26281,7 @@ void js_register_cocos2dx_EaseCubicActionInOut(JSContext *cx, JS::HandleObject g p->parentProto = jsb_cocos2d_ActionEase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.EaseCubicActionInOut.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ActionInstant_class; @@ -30412,6 +30435,7 @@ void js_register_cocos2dx_ActionManager(JSContext *cx, JS::HandleObject global) p->parentProto = NULL; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ActionManager.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_PageTurn3D_class; @@ -33048,6 +33072,7 @@ void js_register_cocos2dx_ActionTween(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ActionInterval_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ActionTween.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_GLProgramState_class; @@ -35796,6 +35821,7 @@ void js_register_cocos2dx_DrawNode(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.DrawNode.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_Label_class; @@ -37276,6 +37302,7 @@ void js_register_cocos2dx_Label(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.Label.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_LabelAtlas_class; @@ -37595,6 +37622,7 @@ void js_register_cocos2dx_LabelAtlas(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_AtlasNode_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.LabelAtlas.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_LabelBMFont_class; @@ -38133,6 +38161,7 @@ void js_register_cocos2dx_LabelBMFont(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.LabelBMFont.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_LabelTTF_class; @@ -39040,6 +39069,7 @@ void js_register_cocos2dx_LabelTTF(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.LabelTTF.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_Layer_class; @@ -39172,6 +39202,7 @@ void js_register_cocos2dx_Layer(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.Layer.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d___LayerRGBA_class; @@ -39620,6 +39651,7 @@ void js_register_cocos2dx_LayerColor(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Layer_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.LayerColor.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_LayerGradient_class; @@ -40094,6 +40126,7 @@ void js_register_cocos2dx_LayerGradient(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_LayerColor_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.LayerGradient.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_LayerMultiplex_class; @@ -40296,6 +40329,7 @@ void js_register_cocos2dx_LayerMultiplex(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_Layer_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.LayerMultiplex.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_MenuItem_class; @@ -40584,6 +40618,7 @@ void js_register_cocos2dx_MenuItem(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.MenuItem.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_MenuItemLabel_class; @@ -40869,6 +40904,7 @@ void js_register_cocos2dx_MenuItemLabel(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_MenuItem_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.MenuItemLabel.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_MenuItemAtlasFont_class; @@ -41038,6 +41074,7 @@ void js_register_cocos2dx_MenuItemAtlasFont(JSContext *cx, JS::HandleObject glob p->parentProto = jsb_cocos2d_MenuItemLabel_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.MenuItemAtlasFont.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_MenuItemFont_class; @@ -41345,6 +41382,7 @@ void js_register_cocos2dx_MenuItemFont(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_MenuItemLabel_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.MenuItemFont.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_MenuItemSprite_class; @@ -41754,6 +41792,7 @@ void js_register_cocos2dx_MenuItemSprite(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_MenuItem_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.MenuItemSprite.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_MenuItemImage_class; @@ -42025,6 +42064,7 @@ void js_register_cocos2dx_MenuItemImage(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_MenuItemSprite_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.MenuItemImage.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_MenuItemToggle_class; @@ -42280,6 +42320,7 @@ void js_register_cocos2dx_MenuItemToggle(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_MenuItem_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.MenuItemToggle.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_Menu_class; @@ -42527,6 +42568,7 @@ void js_register_cocos2dx_Menu(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Layer_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.Menu.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_MotionStreak_class; @@ -43043,6 +43085,7 @@ void js_register_cocos2dx_MotionStreak(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.MotionStreak.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_NodeGrid_class; @@ -43756,6 +43799,7 @@ void js_register_cocos2dx_ParticleBatchNode(JSContext *cx, JS::HandleObject glob p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ParticleBatchNode.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ParticleSystem_class; @@ -45948,6 +45992,7 @@ void js_register_cocos2dx_ParticleSystem(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ParticleSystem.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ParticleSystemQuad_class; @@ -48636,6 +48681,7 @@ void js_register_cocos2dx_ProgressTimer(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ProgressTimer.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ProtectedNode_class; @@ -50510,6 +50556,7 @@ void js_register_cocos2dx_Sprite(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.Sprite.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_RenderTexture_class; @@ -51311,6 +51358,7 @@ void js_register_cocos2dx_RenderTexture(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.RenderTexture.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_TransitionEaseScene_class; @@ -51668,6 +51716,7 @@ void js_register_cocos2dx_TransitionScene(JSContext *cx, JS::HandleObject global p->parentProto = jsb_cocos2d_Scene_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TransitionScene.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_TransitionSceneOriented_class; @@ -58311,6 +58360,7 @@ void js_register_cocos2dx_GridBase(JSContext *cx, JS::HandleObject global) { p->parentProto = NULL; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.GridBase.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_Grid3D_class; @@ -58523,6 +58573,7 @@ void js_register_cocos2dx_Grid3D(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_GridBase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.Grid3D.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_TiledGrid3D_class; @@ -58695,6 +58746,7 @@ void js_register_cocos2dx_TiledGrid3D(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_GridBase_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TiledGrid3D.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_BaseLight_class; @@ -60515,6 +60567,7 @@ void js_register_cocos2dx_GLProgram(JSContext *cx, JS::HandleObject global) { p->parentProto = NULL; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.GLProgram.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_GLProgramCache_class; @@ -63887,6 +63940,7 @@ void js_register_cocos2dx_SpriteBatchNode(JSContext *cx, JS::HandleObject global p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.SpriteBatchNode.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_SpriteFrameCache_class; @@ -64735,6 +64789,7 @@ void js_register_cocos2dx_TextFieldTTF(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Label_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TextFieldTTF.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ParallaxNode_class; @@ -64980,6 +65035,7 @@ void js_register_cocos2dx_ParallaxNode(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ParallaxNode.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_TMXObjectGroup_class; @@ -66432,6 +66488,7 @@ void js_register_cocos2dx_TMXMapInfo(JSContext *cx, JS::HandleObject global) { p->parentProto = NULL; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TMXMapInfo.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_TMXLayer_class; @@ -67153,6 +67210,7 @@ void js_register_cocos2dx_TMXLayer(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_SpriteBatchNode_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TMXLayer.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_TMXTiledMap_class; @@ -67716,6 +67774,7 @@ void js_register_cocos2dx_TMXTiledMap(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TMXTiledMap.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_TileMapAtlas_class; @@ -67991,6 +68050,7 @@ void js_register_cocos2dx_TileMapAtlas(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_AtlasNode_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TileMapAtlas.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_Component_class; @@ -68276,6 +68336,7 @@ void js_register_cocos2dx_Component(JSContext *cx, JS::HandleObject global) { p->parentProto = NULL; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.Component.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ComponentContainer_class; diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_extension_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_extension_auto.cpp index a32be2994e..076a3a35e5 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_extension_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_extension_auto.cpp @@ -1566,6 +1566,7 @@ void js_register_cocos2dx_extension_ControlButton(JSContext *cx, JS::HandleObjec p->parentProto = jsb_cocos2d_extension_Control_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ControlButton.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_extension_ControlHuePicker_class; @@ -2619,6 +2620,7 @@ void js_register_cocos2dx_extension_ControlColourPicker(JSContext *cx, JS::Handl p->parentProto = jsb_cocos2d_extension_Control_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ControlColourPicker.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_extension_ControlPotentiometer_class; @@ -3197,6 +3199,7 @@ void js_register_cocos2dx_extension_ControlPotentiometer(JSContext *cx, JS::Hand p->parentProto = jsb_cocos2d_extension_Control_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ControlPotentiometer.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_extension_ControlSlider_class; @@ -4044,6 +4047,7 @@ void js_register_cocos2dx_extension_ControlSlider(JSContext *cx, JS::HandleObjec p->parentProto = jsb_cocos2d_extension_Control_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ControlSlider.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_extension_ControlStepper_class; @@ -4680,6 +4684,7 @@ void js_register_cocos2dx_extension_ControlStepper(JSContext *cx, JS::HandleObje p->parentProto = jsb_cocos2d_extension_Control_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ControlStepper.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_extension_ControlSwitch_class; @@ -5193,6 +5198,7 @@ void js_register_cocos2dx_extension_ControlSwitch(JSContext *cx, JS::HandleObjec p->parentProto = jsb_cocos2d_extension_Control_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ControlSwitch.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_extension_ScrollView_class; @@ -6096,6 +6102,7 @@ void js_register_cocos2dx_extension_ScrollView(JSContext *cx, JS::HandleObject g p->parentProto = jsb_cocos2d_Layer_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.ScrollView.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_extension_TableViewCell_class; @@ -6285,6 +6292,7 @@ void js_register_cocos2dx_extension_TableViewCell(JSContext *cx, JS::HandleObjec p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TableViewCell.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_extension_TableView_class; @@ -6687,6 +6695,7 @@ void js_register_cocos2dx_extension_TableView(JSContext *cx, JS::HandleObject gl p->parentProto = jsb_cocos2d_extension_ScrollView_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { cc.TableView.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_extension_EventAssetsManagerEx_class; diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.cpp index a61a06fbd6..91aaed3ae4 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.cpp @@ -1883,6 +1883,7 @@ void js_register_cocos2dx_spine_SkeletonAnimation(JSContext *cx, JS::HandleObjec p->parentProto = jsb_spine_SkeletonRenderer_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { sp.SkeletonAnimation.extend = cc.Class.extend; })()"); } void register_all_cocos2dx_spine(JSContext* cx, JS::HandleObject obj) { diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_studio_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_studio_auto.cpp index 442488d907..efdab06895 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_studio_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_studio_auto.cpp @@ -6670,6 +6670,7 @@ void js_register_cocos2dx_studio_Armature(JSContext *cx, JS::HandleObject global p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccs.Armature.extend = cc.Class.extend; })()"); } JSClass *jsb_cocostudio_Skin_class; @@ -8398,6 +8399,7 @@ void js_register_cocos2dx_studio_ComController(JSContext *cx, JS::HandleObject g p->parentProto = jsb_cocos2d_Component_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccs.ComController.extend = cc.Class.extend; })()"); } JSClass *jsb_cocostudio_ComRender_class; diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.cpp index 3440f30625..fec24aae75 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.cpp @@ -2390,6 +2390,7 @@ void js_register_cocos2dx_ui_Widget(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ProtectedNode_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.Widget.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_Layout_class; @@ -3222,6 +3223,7 @@ void js_register_cocos2dx_ui_Layout(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.Layout.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_Button_class; @@ -4168,6 +4170,7 @@ void js_register_cocos2dx_ui_Button(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.Button.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_AbstractCheckButton_class; @@ -4834,6 +4837,7 @@ void js_register_cocos2dx_ui_CheckBox(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_AbstractCheckButton_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.CheckBox.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_RadioButton_class; @@ -5780,6 +5784,7 @@ void js_register_cocos2dx_ui_ImageView(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.ImageView.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_Text_class; @@ -6501,6 +6506,7 @@ void js_register_cocos2dx_ui_Text(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.Text.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_TextAtlas_class; @@ -6795,6 +6801,7 @@ void js_register_cocos2dx_ui_TextAtlas(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.TextAtlas.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_LoadingBar_class; @@ -7233,6 +7240,7 @@ void js_register_cocos2dx_ui_LoadingBar(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.LoadingBar.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_ScrollView_class; @@ -7284,6 +7292,26 @@ bool js_cocos2dx_ui_ScrollView_scrollToPercentHorizontal(JSContext *cx, uint32_t JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_scrollToPercentHorizontal : wrong number of arguments: %d, was expecting %d", argc, 3); return false; } +bool js_cocos2dx_ui_ScrollView_setScrollBarOpacity(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + bool ok = true; + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::ui::ScrollView* cobj = (cocos2d::ui::ScrollView *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_ScrollView_setScrollBarOpacity : Invalid Native Object"); + if (argc == 1) { + uint16_t arg0; + ok &= jsval_to_uint16(cx, args.get(0), &arg0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_ui_ScrollView_setScrollBarOpacity : Error processing arguments"); + cobj->setScrollBarOpacity(arg0); + args.rval().setUndefined(); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_setScrollBarOpacity : wrong number of arguments: %d, was expecting %d", argc, 1); + return false; +} bool js_cocos2dx_ui_ScrollView_setScrollBarEnabled(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -7447,6 +7475,26 @@ bool js_cocos2dx_ui_ScrollView_jumpToBottom(JSContext *cx, uint32_t argc, jsval JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_jumpToBottom : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } +bool js_cocos2dx_ui_ScrollView_setInnerContainerPosition(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + bool ok = true; + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::ui::ScrollView* cobj = (cocos2d::ui::ScrollView *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_ScrollView_setInnerContainerPosition : Invalid Native Object"); + if (argc == 1) { + cocos2d::Vec2 arg0; + ok &= jsval_to_vector2(cx, args.get(0), &arg0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_ui_ScrollView_setInnerContainerPosition : Error processing arguments"); + cobj->setInnerContainerPosition(arg0); + args.rval().setUndefined(); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_setInnerContainerPosition : wrong number of arguments: %d, was expecting %d", argc, 1); + return false; +} bool js_cocos2dx_ui_ScrollView_setDirection(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -7541,6 +7589,24 @@ bool js_cocos2dx_ui_ScrollView_setInnerContainerSize(JSContext *cx, uint32_t arg JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_setInnerContainerSize : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_ui_ScrollView_getInnerContainerPosition(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::ui::ScrollView* cobj = (cocos2d::ui::ScrollView *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_ScrollView_getInnerContainerPosition : Invalid Native Object"); + if (argc == 0) { + cocos2d::Vec2 ret = cobj->getInnerContainerPosition(); + jsval jsret = JSVAL_NULL; + jsret = vector2_to_jsval(cx, ret); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_getInnerContainerPosition : wrong number of arguments: %d, was expecting %d", argc, 0); + return false; +} bool js_cocos2dx_ui_ScrollView_getInnerContainerSize(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -7657,6 +7723,26 @@ bool js_cocos2dx_ui_ScrollView_setInertiaScrollEnabled(JSContext *cx, uint32_t a JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_setInertiaScrollEnabled : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + bool ok = true; + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::ui::ScrollView* cobj = (cocos2d::ui::ScrollView *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled : Invalid Native Object"); + if (argc == 1) { + bool arg0; + arg0 = JS::ToBoolean(args.get(0)); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled : Error processing arguments"); + cobj->setScrollBarAutoHideEnabled(arg0); + args.rval().setUndefined(); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled : wrong number of arguments: %d, was expecting %d", argc, 1); + return false; +} bool js_cocos2dx_ui_ScrollView_getScrollBarColor(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -7907,24 +7993,22 @@ bool js_cocos2dx_ui_ScrollView_scrollToBottom(JSContext *cx, uint32_t argc, jsva JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_scrollToBottom : wrong number of arguments: %d, was expecting %d", argc, 2); return false; } -bool js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled(JSContext *cx, uint32_t argc, jsval *vp) +bool js_cocos2dx_ui_ScrollView_getScrollBarOpacity(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); - bool ok = true; JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); js_proxy_t *proxy = jsb_get_js_proxy(obj); cocos2d::ui::ScrollView* cobj = (cocos2d::ui::ScrollView *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled : Invalid Native Object"); - if (argc == 1) { - bool arg0; - arg0 = JS::ToBoolean(args.get(0)); - JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled : Error processing arguments"); - cobj->setScrollBarAutoHideEnabled(arg0); - args.rval().setUndefined(); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_ScrollView_getScrollBarOpacity : Invalid Native Object"); + if (argc == 0) { + uint16_t ret = cobj->getScrollBarOpacity(); + jsval jsret = JSVAL_NULL; + jsret = uint32_to_jsval(cx, ret); + args.rval().set(jsret); return true; } - JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled : wrong number of arguments: %d, was expecting %d", argc, 1); + JS_ReportError(cx, "js_cocos2dx_ui_ScrollView_getScrollBarOpacity : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } bool js_cocos2dx_ui_ScrollView_scrollToBottomRight(JSContext *cx, uint32_t argc, jsval *vp) @@ -8252,6 +8336,7 @@ void js_register_cocos2dx_ui_ScrollView(JSContext *cx, JS::HandleObject global) static JSFunctionSpec funcs[] = { JS_FN("scrollToTop", js_cocos2dx_ui_ScrollView_scrollToTop, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("scrollToPercentHorizontal", js_cocos2dx_ui_ScrollView_scrollToPercentHorizontal, 3, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("setScrollBarOpacity", js_cocos2dx_ui_ScrollView_setScrollBarOpacity, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setScrollBarEnabled", js_cocos2dx_ui_ScrollView_setScrollBarEnabled, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("isInertiaScrollEnabled", js_cocos2dx_ui_ScrollView_isInertiaScrollEnabled, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("scrollToPercentBothDirection", js_cocos2dx_ui_ScrollView_scrollToPercentBothDirection, 3, JSPROP_PERMANENT | JSPROP_ENUMERATE), @@ -8260,17 +8345,20 @@ void js_register_cocos2dx_ui_ScrollView(JSContext *cx, JS::HandleObject global) JS_FN("scrollToBottomLeft", js_cocos2dx_ui_ScrollView_scrollToBottomLeft, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getInnerContainer", js_cocos2dx_ui_ScrollView_getInnerContainer, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("jumpToBottom", js_cocos2dx_ui_ScrollView_jumpToBottom, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("setInnerContainerPosition", js_cocos2dx_ui_ScrollView_setInnerContainerPosition, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setDirection", js_cocos2dx_ui_ScrollView_setDirection, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("scrollToTopLeft", js_cocos2dx_ui_ScrollView_scrollToTopLeft, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("jumpToTopRight", js_cocos2dx_ui_ScrollView_jumpToTopRight, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("jumpToBottomLeft", js_cocos2dx_ui_ScrollView_jumpToBottomLeft, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setInnerContainerSize", js_cocos2dx_ui_ScrollView_setInnerContainerSize, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getInnerContainerPosition", js_cocos2dx_ui_ScrollView_getInnerContainerPosition, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getInnerContainerSize", js_cocos2dx_ui_ScrollView_getInnerContainerSize, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("isBounceEnabled", js_cocos2dx_ui_ScrollView_isBounceEnabled, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("jumpToPercentVertical", js_cocos2dx_ui_ScrollView_jumpToPercentVertical, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setScrollBarAutoHideTime", js_cocos2dx_ui_ScrollView_setScrollBarAutoHideTime, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setScrollBarPositionFromCornerForHorizontal", js_cocos2dx_ui_ScrollView_setScrollBarPositionFromCornerForHorizontal, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setInertiaScrollEnabled", js_cocos2dx_ui_ScrollView_setInertiaScrollEnabled, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("setScrollBarAutoHideEnabled", js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getScrollBarColor", js_cocos2dx_ui_ScrollView_getScrollBarColor, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("jumpToTopLeft", js_cocos2dx_ui_ScrollView_jumpToTopLeft, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("jumpToPercentHorizontal", js_cocos2dx_ui_ScrollView_jumpToPercentHorizontal, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), @@ -8284,7 +8372,7 @@ void js_register_cocos2dx_ui_ScrollView(JSContext *cx, JS::HandleObject global) JS_FN("getScrollBarPositionFromCornerForVertical", js_cocos2dx_ui_ScrollView_getScrollBarPositionFromCornerForVertical, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("scrollToPercentVertical", js_cocos2dx_ui_ScrollView_scrollToPercentVertical, 3, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("scrollToBottom", js_cocos2dx_ui_ScrollView_scrollToBottom, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("setScrollBarAutoHideEnabled", js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getScrollBarOpacity", js_cocos2dx_ui_ScrollView_getScrollBarOpacity, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("scrollToBottomRight", js_cocos2dx_ui_ScrollView_scrollToBottomRight, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setScrollBarPositionFromCorner", js_cocos2dx_ui_ScrollView_setScrollBarPositionFromCorner, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setScrollBarPositionFromCornerForVertical", js_cocos2dx_ui_ScrollView_setScrollBarPositionFromCornerForVertical, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), @@ -8332,6 +8420,7 @@ void js_register_cocos2dx_ui_ScrollView(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_ui_Layout_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.ScrollView.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_ListView_class; @@ -8879,6 +8968,7 @@ void js_register_cocos2dx_ui_ListView(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_ScrollView_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.ListView.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_Slider_class; @@ -9557,6 +9647,7 @@ void js_register_cocos2dx_ui_Slider(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.Slider.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_UICCTextField_class; @@ -11220,6 +11311,7 @@ void js_register_cocos2dx_ui_TextField(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.TextField.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_TextBMFont_class; @@ -11480,6 +11572,7 @@ void js_register_cocos2dx_ui_TextBMFont(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.TextBMFont.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_PageView_class; @@ -11963,6 +12056,7 @@ void js_register_cocos2dx_ui_PageView(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Layout_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.PageView.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_Helper_class; @@ -12354,6 +12448,7 @@ void js_register_cocos2dx_ui_RichElement(JSContext *cx, JS::HandleObject global) p->parentProto = NULL; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.RichElement.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_RichElementText_class; @@ -12533,6 +12628,7 @@ void js_register_cocos2dx_ui_RichElementText(JSContext *cx, JS::HandleObject glo p->parentProto = jsb_cocos2d_ui_RichElement_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.RichElementText.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_RichElementImage_class; @@ -12704,6 +12800,7 @@ void js_register_cocos2dx_ui_RichElementImage(JSContext *cx, JS::HandleObject gl p->parentProto = jsb_cocos2d_ui_RichElement_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.RichElementImage.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_RichElementCustomNode_class; @@ -12891,6 +12988,7 @@ void js_register_cocos2dx_ui_RichElementCustomNode(JSContext *cx, JS::HandleObje p->parentProto = jsb_cocos2d_ui_RichElement_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.RichElementCustomNode.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_RichText_class; @@ -13166,6 +13264,7 @@ void js_register_cocos2dx_ui_RichText(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.RichText.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_HBox_class; @@ -13344,6 +13443,7 @@ void js_register_cocos2dx_ui_HBox(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Layout_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.HBox.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_VBox_class; @@ -13522,6 +13622,7 @@ void js_register_cocos2dx_ui_VBox(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Layout_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.VBox.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_RelativeBox_class; @@ -13700,6 +13801,7 @@ void js_register_cocos2dx_ui_RelativeBox(JSContext *cx, JS::HandleObject global) p->parentProto = jsb_cocos2d_ui_Layout_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.RelativeBox.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_Scale9Sprite_class; @@ -14990,6 +15092,7 @@ void js_register_cocos2dx_ui_Scale9Sprite(JSContext *cx, JS::HandleObject global p->parentProto = jsb_cocos2d_Node_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.Scale9Sprite.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_EditBox_class; @@ -15741,6 +15844,7 @@ void js_register_cocos2dx_ui_EditBox(JSContext *cx, JS::HandleObject global) { p->parentProto = jsb_cocos2d_ui_Widget_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.EditBox.extend = cc.Class.extend; })()"); } JSClass *jsb_cocos2d_ui_LayoutComponent_class; @@ -16886,6 +16990,7 @@ void js_register_cocos2dx_ui_LayoutComponent(JSContext *cx, JS::HandleObject glo p->parentProto = jsb_cocos2d_Component_prototype; _js_global_type_map.insert(std::make_pair(typeName, p)); } + anonEvaluate(cx, global, "(function () { ccui.LayoutComponent.extend = cc.Class.extend; })()"); } void register_all_cocos2dx_ui(JSContext* cx, JS::HandleObject obj) { diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.hpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.hpp index 60f36ffb88..648e9811a8 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.hpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.hpp @@ -367,6 +367,7 @@ void js_register_cocos2dx_ui_ScrollView(JSContext *cx, JS::HandleObject global); void register_all_cocos2dx_ui(JSContext* cx, JS::HandleObject obj); bool js_cocos2dx_ui_ScrollView_scrollToTop(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_scrollToPercentHorizontal(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_ui_ScrollView_setScrollBarOpacity(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_setScrollBarEnabled(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_isInertiaScrollEnabled(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_scrollToPercentBothDirection(JSContext *cx, uint32_t argc, jsval *vp); @@ -375,17 +376,20 @@ bool js_cocos2dx_ui_ScrollView_setScrollBarColor(JSContext *cx, uint32_t argc, j bool js_cocos2dx_ui_ScrollView_scrollToBottomLeft(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_getInnerContainer(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_jumpToBottom(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_ui_ScrollView_setInnerContainerPosition(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_setDirection(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_scrollToTopLeft(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_jumpToTopRight(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_jumpToBottomLeft(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_setInnerContainerSize(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_ui_ScrollView_getInnerContainerPosition(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_getInnerContainerSize(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_isBounceEnabled(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_jumpToPercentVertical(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_setScrollBarAutoHideTime(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_setScrollBarPositionFromCornerForHorizontal(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_setInertiaScrollEnabled(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_getScrollBarColor(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_jumpToTopLeft(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_jumpToPercentHorizontal(JSContext *cx, uint32_t argc, jsval *vp); @@ -399,7 +403,7 @@ bool js_cocos2dx_ui_ScrollView_jumpToPercentBothDirection(JSContext *cx, uint32_ bool js_cocos2dx_ui_ScrollView_getScrollBarPositionFromCornerForVertical(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_scrollToPercentVertical(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_scrollToBottom(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_ui_ScrollView_getScrollBarOpacity(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_scrollToBottomRight(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_setScrollBarPositionFromCorner(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_ScrollView_setScrollBarPositionFromCornerForVertical(JSContext *cx, uint32_t argc, jsval *vp); diff --git a/cocos/scripting/lua-bindings/auto/api/ScrollView.lua b/cocos/scripting/lua-bindings/auto/api/ScrollView.lua index 9dbbcbbbaa..d73edbdb3d 100644 --- a/cocos/scripting/lua-bindings/auto/api/ScrollView.lua +++ b/cocos/scripting/lua-bindings/auto/api/ScrollView.lua @@ -26,6 +26,14 @@ -- @param #bool attenuated -- @return ScrollView#ScrollView self (return value: ccui.ScrollView) +-------------------------------- +-- brief Set the scroll bar's opacity
+-- param the scroll bar's opacity +-- @function [parent=#ScrollView] setScrollBarOpacity +-- @param self +-- @param #unsigned char opacity +-- @return ScrollView#ScrollView self (return value: ccui.ScrollView) + -------------------------------- -- brief Toggle scroll bar enabled.
-- param enabled True if enable scroll bar, false otherwise. @@ -93,6 +101,14 @@ -- @param self -- @return ScrollView#ScrollView self (return value: ccui.ScrollView) +-------------------------------- +-- Set inner container position
+-- param pos Inner container position. +-- @function [parent=#ScrollView] setInnerContainerPosition +-- @param self +-- @param #vec2_table pos +-- @return ScrollView#ScrollView self (return value: ccui.ScrollView) + -------------------------------- -- Changes scroll direction of scrollview.
-- see `Direction`
@@ -133,6 +149,13 @@ -- @param #size_table size -- @return ScrollView#ScrollView self (return value: ccui.ScrollView) +-------------------------------- +-- Get inner container position
+-- return The inner container position. +-- @function [parent=#ScrollView] getInnerContainerPosition +-- @param self +-- @return vec2_table#vec2_table ret (return value: vec2_table) + -------------------------------- -- Get inner container size of scrollview.
-- Inner container size must be larger than or equal scrollview's size.
@@ -188,6 +211,14 @@ -- @param #bool enabled -- @return ScrollView#ScrollView self (return value: ccui.ScrollView) +-------------------------------- +-- brief Set scroll bar auto hide state
+-- param scroll bar auto hide state +-- @function [parent=#ScrollView] setScrollBarAutoHideEnabled +-- @param self +-- @param #bool autoHideEnabled +-- @return ScrollView#ScrollView self (return value: ccui.ScrollView) + -------------------------------- -- brief Get the scroll bar's color
-- return the scroll bar's color @@ -292,12 +323,11 @@ -- @return ScrollView#ScrollView self (return value: ccui.ScrollView) -------------------------------- --- brief Set scroll bar auto hide state
--- param scroll bar auto hide state --- @function [parent=#ScrollView] setScrollBarAutoHideEnabled +-- brief Get the scroll bar's opacity
+-- return the scroll bar's opacity +-- @function [parent=#ScrollView] getScrollBarOpacity -- @param self --- @param #bool autoHideEnabled --- @return ScrollView#ScrollView self (return value: ccui.ScrollView) +-- @return unsigned char#unsigned char ret (return value: unsigned char) -------------------------------- -- Scroll inner container to bottom and right boundary of scrollview.
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 c67cf3c661..664d0a9fcf 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp @@ -11205,6 +11205,56 @@ int lua_cocos2dx_ui_ScrollView_scrollToPercentHorizontal(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_ScrollView_setScrollBarOpacity(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::ScrollView* 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.ScrollView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::ScrollView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_ScrollView_setScrollBarOpacity'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + uint16_t arg0; + + ok &= luaval_to_uint16(tolua_S, 2,&arg0, "ccui.ScrollView:setScrollBarOpacity"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_ScrollView_setScrollBarOpacity'", nullptr); + return 0; + } + cobj->setScrollBarOpacity(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.ScrollView:setScrollBarOpacity",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_ScrollView_setScrollBarOpacity'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_ScrollView_setScrollBarEnabled(lua_State* tolua_S) { int argc = 0; @@ -11602,6 +11652,56 @@ int lua_cocos2dx_ui_ScrollView_jumpToBottom(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_ScrollView_setInnerContainerPosition(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::ScrollView* 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.ScrollView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::ScrollView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_ScrollView_setInnerContainerPosition'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Vec2 arg0; + + ok &= luaval_to_vec2(tolua_S, 2, &arg0, "ccui.ScrollView:setInnerContainerPosition"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_ScrollView_setInnerContainerPosition'", nullptr); + return 0; + } + cobj->setInnerContainerPosition(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.ScrollView:setInnerContainerPosition",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_ScrollView_setInnerContainerPosition'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_ScrollView_setDirection(lua_State* tolua_S) { int argc = 0; @@ -11849,6 +11949,53 @@ int lua_cocos2dx_ui_ScrollView_setInnerContainerSize(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_ScrollView_getInnerContainerPosition(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::ScrollView* 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.ScrollView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::ScrollView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_ScrollView_getInnerContainerPosition'", 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_ScrollView_getInnerContainerPosition'", nullptr); + return 0; + } + cocos2d::Vec2 ret = cobj->getInnerContainerPosition(); + vec2_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.ScrollView:getInnerContainerPosition",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_ScrollView_getInnerContainerPosition'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_ScrollView_getInnerContainerSize(lua_State* tolua_S) { int argc = 0; @@ -12197,6 +12344,56 @@ int lua_cocos2dx_ui_ScrollView_setInertiaScrollEnabled(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::ScrollView* 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.ScrollView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::ScrollView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.ScrollView:setScrollBarAutoHideEnabled"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled'", nullptr); + return 0; + } + cobj->setScrollBarAutoHideEnabled(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.ScrollView:setScrollBarAutoHideEnabled",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_ScrollView_getScrollBarColor(lua_State* tolua_S) { int argc = 0; @@ -12841,7 +13038,7 @@ int lua_cocos2dx_ui_ScrollView_scrollToBottom(lua_State* tolua_S) return 0; } -int lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled(lua_State* tolua_S) +int lua_cocos2dx_ui_ScrollView_getScrollBarOpacity(lua_State* tolua_S) { int argc = 0; cocos2d::ui::ScrollView* cobj = nullptr; @@ -12861,32 +13058,29 @@ int lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_ScrollView_getScrollBarOpacity'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; - if (argc == 1) + if (argc == 0) { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.ScrollView:setScrollBarAutoHideEnabled"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_ScrollView_getScrollBarOpacity'", nullptr); return 0; } - cobj->setScrollBarAutoHideEnabled(arg0); - lua_settop(tolua_S, 1); + uint16_t ret = cobj->getScrollBarOpacity(); + tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.ScrollView:setScrollBarAutoHideEnabled",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.ScrollView:getScrollBarOpacity",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_ScrollView_getScrollBarOpacity'.",&tolua_err); #endif return 0; @@ -13552,6 +13746,7 @@ int lua_register_cocos2dx_ui_ScrollView(lua_State* tolua_S) tolua_function(tolua_S,"new",lua_cocos2dx_ui_ScrollView_constructor); tolua_function(tolua_S,"scrollToTop",lua_cocos2dx_ui_ScrollView_scrollToTop); tolua_function(tolua_S,"scrollToPercentHorizontal",lua_cocos2dx_ui_ScrollView_scrollToPercentHorizontal); + tolua_function(tolua_S,"setScrollBarOpacity",lua_cocos2dx_ui_ScrollView_setScrollBarOpacity); tolua_function(tolua_S,"setScrollBarEnabled",lua_cocos2dx_ui_ScrollView_setScrollBarEnabled); tolua_function(tolua_S,"isInertiaScrollEnabled",lua_cocos2dx_ui_ScrollView_isInertiaScrollEnabled); tolua_function(tolua_S,"scrollToPercentBothDirection",lua_cocos2dx_ui_ScrollView_scrollToPercentBothDirection); @@ -13560,11 +13755,13 @@ int lua_register_cocos2dx_ui_ScrollView(lua_State* tolua_S) tolua_function(tolua_S,"scrollToBottomLeft",lua_cocos2dx_ui_ScrollView_scrollToBottomLeft); tolua_function(tolua_S,"getInnerContainer",lua_cocos2dx_ui_ScrollView_getInnerContainer); tolua_function(tolua_S,"jumpToBottom",lua_cocos2dx_ui_ScrollView_jumpToBottom); + tolua_function(tolua_S,"setInnerContainerPosition",lua_cocos2dx_ui_ScrollView_setInnerContainerPosition); tolua_function(tolua_S,"setDirection",lua_cocos2dx_ui_ScrollView_setDirection); tolua_function(tolua_S,"scrollToTopLeft",lua_cocos2dx_ui_ScrollView_scrollToTopLeft); tolua_function(tolua_S,"jumpToTopRight",lua_cocos2dx_ui_ScrollView_jumpToTopRight); tolua_function(tolua_S,"jumpToBottomLeft",lua_cocos2dx_ui_ScrollView_jumpToBottomLeft); tolua_function(tolua_S,"setInnerContainerSize",lua_cocos2dx_ui_ScrollView_setInnerContainerSize); + tolua_function(tolua_S,"getInnerContainerPosition",lua_cocos2dx_ui_ScrollView_getInnerContainerPosition); tolua_function(tolua_S,"getInnerContainerSize",lua_cocos2dx_ui_ScrollView_getInnerContainerSize); tolua_function(tolua_S,"isBounceEnabled",lua_cocos2dx_ui_ScrollView_isBounceEnabled); tolua_function(tolua_S,"jumpToPercentVertical",lua_cocos2dx_ui_ScrollView_jumpToPercentVertical); @@ -13572,6 +13769,7 @@ int lua_register_cocos2dx_ui_ScrollView(lua_State* tolua_S) tolua_function(tolua_S,"setScrollBarAutoHideTime",lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideTime); tolua_function(tolua_S,"setScrollBarPositionFromCornerForHorizontal",lua_cocos2dx_ui_ScrollView_setScrollBarPositionFromCornerForHorizontal); tolua_function(tolua_S,"setInertiaScrollEnabled",lua_cocos2dx_ui_ScrollView_setInertiaScrollEnabled); + tolua_function(tolua_S,"setScrollBarAutoHideEnabled",lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled); tolua_function(tolua_S,"getScrollBarColor",lua_cocos2dx_ui_ScrollView_getScrollBarColor); tolua_function(tolua_S,"jumpToTopLeft",lua_cocos2dx_ui_ScrollView_jumpToTopLeft); tolua_function(tolua_S,"jumpToPercentHorizontal",lua_cocos2dx_ui_ScrollView_jumpToPercentHorizontal); @@ -13585,7 +13783,7 @@ int lua_register_cocos2dx_ui_ScrollView(lua_State* tolua_S) tolua_function(tolua_S,"getScrollBarPositionFromCornerForVertical",lua_cocos2dx_ui_ScrollView_getScrollBarPositionFromCornerForVertical); tolua_function(tolua_S,"scrollToPercentVertical",lua_cocos2dx_ui_ScrollView_scrollToPercentVertical); tolua_function(tolua_S,"scrollToBottom",lua_cocos2dx_ui_ScrollView_scrollToBottom); - tolua_function(tolua_S,"setScrollBarAutoHideEnabled",lua_cocos2dx_ui_ScrollView_setScrollBarAutoHideEnabled); + tolua_function(tolua_S,"getScrollBarOpacity",lua_cocos2dx_ui_ScrollView_getScrollBarOpacity); tolua_function(tolua_S,"scrollToBottomRight",lua_cocos2dx_ui_ScrollView_scrollToBottomRight); tolua_function(tolua_S,"setScrollBarPositionFromCorner",lua_cocos2dx_ui_ScrollView_setScrollBarPositionFromCorner); tolua_function(tolua_S,"setScrollBarPositionFromCornerForVertical",lua_cocos2dx_ui_ScrollView_setScrollBarPositionFromCornerForVertical); 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 a450edd5dc..04b1db2753 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp @@ -565,6 +565,10 @@ int register_all_cocos2dx_ui(lua_State* tolua_S); + + + + From b701fd9e73b5b98faacd76b3a011fe8861b1981f Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Tue, 14 Jul 2015 13:47:35 +0800 Subject: [PATCH 70/93] Fixed compile error --- cocos/2d/CCLabel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/2d/CCLabel.cpp b/cocos/2d/CCLabel.cpp index 0ff8eecc2c..287011a9c7 100644 --- a/cocos/2d/CCLabel.cpp +++ b/cocos/2d/CCLabel.cpp @@ -908,7 +908,7 @@ void Label::enableShadow(const Color4B& shadowColor /* = Color4B::BLACK */,const if (!_systemFontDirty && !_contentDirty && _textSprite) { - auto& fontDef = _getFontDefinition(); + auto fontDef = _getFontDefinition(); if (_shadowNode) { if (shadowColor != _shadowColor4F) @@ -1134,7 +1134,7 @@ void Label::updateContent() } else { - auto& fontDef = _getFontDefinition(); + auto fontDef = _getFontDefinition(); createSpriteForSystemFont(fontDef); if (_shadowEnabled) { From 09775d6f2af4aa56e1d705e39a79abec7d0866f3 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 14 Jul 2015 14:14:36 +0800 Subject: [PATCH 71/93] Ensure backward compatibility --- .../js-bindings/script/jsb_loaders.js | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/cocos/scripting/js-bindings/script/jsb_loaders.js b/cocos/scripting/js-bindings/script/jsb_loaders.js index 2a1e23f7e1..1259e1a6c6 100644 --- a/cocos/scripting/js-bindings/script/jsb_loaders.js +++ b/cocos/scripting/js-bindings/script/jsb_loaders.js @@ -29,6 +29,7 @@ cc._emptyLoader = { load : function(realUrl, url, res, cb){ cb && cb(null, null); + return null; } }; @@ -40,7 +41,9 @@ cc.loader.register([ cc._txtLoader = { load : function(realUrl, url, res, cb){ - cb && cb(null, jsb.fileUtils.getStringFromFile(realUrl)); + var result = jsb.fileUtils.getStringFromFile(realUrl); + cb && cb(null, result); + return result; } }; cc.loader.register(["txt", "xml", "vsh", "fsh", "tmx", "tsx"], cc._txtLoader); @@ -55,6 +58,7 @@ cc._jsonLoader = { result = null; } cb && cb(null, result); + return result; } }; cc.loader.register(["json", "ExportJson"], cc._jsonLoader); @@ -76,14 +80,18 @@ cc.loader.register(["png", "jpg", "bmp","jpeg","gif"], cc._imgLoader); cc._plistLoader = { load : function(realUrl, url, res, cb){ var content = jsb.fileUtils.getStringFromFile(realUrl); - cb && cb(null, cc.plistParser.parse(content)); + var result = cc.plistParser.parse(content); + cb && cb(null, result); + return result; } }; cc.loader.register(["plist"], cc._plistLoader); cc._binaryLoader = { load : function(realUrl, url, res, cb){ - cb && cb(null, cc.loader.loadBinarySync(realUrl)); + var result = cc.loader.loadBinarySync(realUrl); + cb && cb(null, result); + return result; } }; cc.loader.register(["ccbi"], cc._binaryLoader); @@ -168,8 +176,11 @@ cc._fntLoader = { }, load : function(realUrl, url, res, cb){ - var data = jsb.fileUtils.getStringFromFile(realUrl); - cb && cb(null, this.parseFnt(data, url)); + var data = jsb.fileUtils.getStringFromFile(realUrl), result = null; + if (data) + result = this.parseFnt(data, url); + cb && cb(null, result); + return result; } }; cc.loader.register(["fnt"], cc._fntLoader); From ea773cac203ed44463ab6bf275ddcb881a5b1946 Mon Sep 17 00:00:00 2001 From: Jacky Date: Tue, 14 Jul 2015 15:11:35 +0800 Subject: [PATCH 72/93] Fixed setAnimationInterval JNI bug. --- cocos/platform/android/CCApplication-android.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/platform/android/CCApplication-android.cpp b/cocos/platform/android/CCApplication-android.cpp index 1b5b5c8829..8d802a1814 100644 --- a/cocos/platform/android/CCApplication-android.cpp +++ b/cocos/platform/android/CCApplication-android.cpp @@ -77,7 +77,7 @@ void Application::setAnimationInterval(float interval) { JniMethodInfo methodInfo; if (! JniHelper::getStaticMethodInfo(methodInfo, "org/cocos2dx/lib/Cocos2dxRenderer", "setAnimationInterval", - "(D)V")) + "(F)V")) { CCLOG("%s %d: error to get methodInfo", __FILE__, __LINE__); } From a9deb6dda54238862694df22f1b13c82712b0a51 Mon Sep 17 00:00:00 2001 From: VisualSj Date: Tue, 14 Jul 2015 15:26:13 +0800 Subject: [PATCH 73/93] Remove getRes (parser) --- .../script/studio/parsers/timelineParser-2.x.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/cocos/scripting/js-bindings/script/studio/parsers/timelineParser-2.x.js b/cocos/scripting/js-bindings/script/studio/parsers/timelineParser-2.x.js index eb3f478280..c0e4f7ecfa 100644 --- a/cocos/scripting/js-bindings/script/studio/parsers/timelineParser-2.x.js +++ b/cocos/scripting/js-bindings/script/studio/parsers/timelineParser-2.x.js @@ -220,8 +220,6 @@ var node, self = this; loadTexture(json["FileData"], resourcePath, function(path, type){ - if(!cc.loader.getRes(path)) - cc.log("%s need to be preloaded", path); node = new cc.ParticleSystem(path); self.generalAttributes(node, json); node.setPositionType(cc.ParticleSystem.TYPE_GROUPED); @@ -859,8 +857,6 @@ ]; textureList.forEach(function(item){ loadTexture(json[item.name], resourcePath, function(path, type){ - if(type === 0 && !loader.getRes(path)) - cc.log("%s need to be preloaded", path); item.handle.call(widget, path, type); }); }); @@ -1025,8 +1021,6 @@ var startCharMap = json["StartChar"]; loadTexture(json["LabelAtlasFileImage_CNB"], resourcePath, function(path, type){ - if(!cc.loader.getRes(path)) - cc.log("%s need to be preloaded", path); if(type === 0){ widget.setProperty(stringValue, path, itemWidth, itemHeight, startCharMap); } @@ -1051,8 +1045,6 @@ widget.setString(text); loadTexture(json["LabelBMFontFile_CNB"], resourcePath, function(path, type){ - if(!cc.loader.getRes(path)) - cc.log("%s need to be pre loaded", path); widget.setFntFile(path); }); widget.ignoreContentAdaptWithSize(true); From 91dfb07a8c7e299e336e5486a8b3f6110cdd44b0 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 14 Jul 2015 15:28:36 +0800 Subject: [PATCH 74/93] add more descriptive message to ASSET macro. --- cocos/2d/CCActionEase.cpp | 2 +- cocos/2d/CCActionGrid.cpp | 6 +- cocos/2d/CCActionInterval.cpp | 18 +- cocos/2d/CCActionManager.cpp | 18 +- cocos/2d/CCCamera.cpp | 4 +- cocos/2d/CCGrid.cpp | 6 +- cocos/2d/CCMenu.cpp | 12 +- cocos/2d/CCParticleSystem.cpp | 2 +- cocos/2d/CCSprite.cpp | 7 +- cocos/2d/CCTMXXMLParser.cpp | 2 +- cocos/base/CCEventDispatcher.cpp | 3 +- cocos/base/CCEventListenerAcceleration.cpp | 2 +- cocos/base/CCScheduler.cpp | 12 +- cocos/base/ZipUtils.cpp | 4 +- .../editor-support/cocosbuilder/CCBReader.cpp | 2 +- .../cocosbuilder/CCNodeLoader.cpp | 6 +- .../editor-support/cocostudio/CCArmature.cpp | 2 +- .../editor-support/cocostudio/TriggerObj.cpp | 6 +- cocos/renderer/CCGLProgramState.cpp | 2 +- cocos/renderer/CCTexture2D.cpp | 2 +- cocos/renderer/CCTextureAtlas.cpp | 2 +- .../js-bindings/manual/cocos2d_specifics.cpp | 7 +- cocos/ui/UIWidget.cpp | 2 +- .../UISliderTest/UISliderTest.cpp | 1 + tests/cpp-tests/Classes/UnitTest/UnitTest.cpp | 242 +++++++++--------- 25 files changed, 189 insertions(+), 183 deletions(-) diff --git a/cocos/2d/CCActionEase.cpp b/cocos/2d/CCActionEase.cpp index 46335fd0aa..fff07e2c2b 100644 --- a/cocos/2d/CCActionEase.cpp +++ b/cocos/2d/CCActionEase.cpp @@ -46,7 +46,7 @@ NS_CC_BEGIN bool ActionEase::initWithAction(ActionInterval *action) { - CCASSERT(action != nullptr, ""); + CCASSERT(action != nullptr, "action couldn't be nullptr!"); if (ActionInterval::initWithDuration(action->getDuration())) { diff --git a/cocos/2d/CCActionGrid.cpp b/cocos/2d/CCActionGrid.cpp index 0c42ef8cfb..d00e8b50e9 100644 --- a/cocos/2d/CCActionGrid.cpp +++ b/cocos/2d/CCActionGrid.cpp @@ -57,13 +57,13 @@ void GridAction::startWithTarget(Node *target) if (targetGrid && targetGrid->getReuseGrid() > 0) { if (targetGrid->isActive() && targetGrid->getGridSize().width == _gridSize.width - && targetGrid->getGridSize().height == _gridSize.height /*&& dynamic_cast(targetGrid) != nullptr*/) + && targetGrid->getGridSize().height == _gridSize.height) { targetGrid->reuse(); } else { - CCASSERT(0, ""); + CCASSERT(0, "Invalid grid parameters!"); } } else @@ -93,7 +93,7 @@ GridAction* GridAction::reverse() const GridBase* GridAction::getGrid() { // Abstract class needs implementation - CCASSERT(0, ""); + CCASSERT(0, "Subclass should implement this method!"); return nullptr; } diff --git a/cocos/2d/CCActionInterval.cpp b/cocos/2d/CCActionInterval.cpp index 2ac44d820b..9c9eec5bc8 100644 --- a/cocos/2d/CCActionInterval.cpp +++ b/cocos/2d/CCActionInterval.cpp @@ -134,13 +134,13 @@ void ActionInterval::setAmplitudeRate(float amp) { CC_UNUSED_PARAM(amp); // Abstract class needs implementation - CCASSERT(0, ""); + CCASSERT(0, "Subclass should implement this method!"); } float ActionInterval::getAmplitudeRate() { // Abstract class needs implementation - CCASSERT(0, ""); + CCASSERT(0, "Subclass should implement this method!"); return 0; } @@ -248,8 +248,8 @@ Sequence* Sequence::create(const Vector& arrayOfActions) bool Sequence::initWithTwoActions(FiniteTimeAction *actionOne, FiniteTimeAction *actionTwo) { - CCASSERT(actionOne != nullptr, ""); - CCASSERT(actionTwo != nullptr, ""); + CCASSERT(actionOne != nullptr, "actionOne can't be nullptr!"); + CCASSERT(actionTwo != nullptr, "actionTwo can't be nullptr!"); float d = actionOne->getDuration() + actionTwo->getDuration(); ActionInterval::initWithDuration(d); @@ -504,7 +504,7 @@ RepeatForever *RepeatForever::create(ActionInterval *action) bool RepeatForever::initWithAction(ActionInterval *action) { - CCASSERT(action != nullptr, ""); + CCASSERT(action != nullptr, "action can't be nullptr!"); action->retain(); _innerAction = action; return true; @@ -645,8 +645,8 @@ Spawn* Spawn::createWithTwoActions(FiniteTimeAction *action1, FiniteTimeAction * bool Spawn::initWithTwoActions(FiniteTimeAction *action1, FiniteTimeAction *action2) { - CCASSERT(action1 != nullptr, ""); - CCASSERT(action2 != nullptr, ""); + CCASSERT(action1 != nullptr, "action1 can't be nullptr!"); + CCASSERT(action2 != nullptr, "action2 can't be nullptr!"); bool ret = false; @@ -2189,8 +2189,8 @@ ReverseTime* ReverseTime::create(FiniteTimeAction *action) bool ReverseTime::initWithAction(FiniteTimeAction *action) { - CCASSERT(action != nullptr, ""); - CCASSERT(action != _other, ""); + CCASSERT(action != nullptr, "action can't be nullptr!"); + CCASSERT(action != _other, "action doesn't equal to _other!"); if (ActionInterval::initWithDuration(action->getDuration())) { diff --git a/cocos/2d/CCActionManager.cpp b/cocos/2d/CCActionManager.cpp index df7f082e99..3fc938cc29 100644 --- a/cocos/2d/CCActionManager.cpp +++ b/cocos/2d/CCActionManager.cpp @@ -168,8 +168,8 @@ void ActionManager::resumeTargets(const Vector& targetsToResume) void ActionManager::addAction(Action *action, Node *target, bool paused) { - CCASSERT(action != nullptr, ""); - CCASSERT(target != nullptr, ""); + CCASSERT(action != nullptr, "action can't be nullptr!"); + CCASSERT(target != nullptr, "target can't be nullptr!"); tHashElement *element = nullptr; // we should convert it to Ref*, because we save it as Ref* @@ -186,7 +186,7 @@ void ActionManager::addAction(Action *action, Node *target, bool paused) actionAllocWithHashElement(element); - CCASSERT(! ccArrayContainsObject(element->actions, action), ""); + CCASSERT(! ccArrayContainsObject(element->actions, action), "action already be added!"); ccArrayAppendObject(element->actions, action); action->startWithTarget(target); @@ -265,8 +265,8 @@ void ActionManager::removeAction(Action *action) void ActionManager::removeActionByTag(int tag, Node *target) { - CCASSERT(tag != Action::INVALID_TAG, ""); - CCASSERT(target != nullptr, ""); + CCASSERT(tag != Action::INVALID_TAG, "Invalid tag value!"); + CCASSERT(target != nullptr, "target can't be nullptr!"); tHashElement *element = nullptr; HASH_FIND_PTR(_targets, &target, element); @@ -289,8 +289,8 @@ void ActionManager::removeActionByTag(int tag, Node *target) void ActionManager::removeAllActionsByTag(int tag, Node *target) { - CCASSERT(tag != Action::INVALID_TAG, ""); - CCASSERT(target != nullptr, ""); + CCASSERT(tag != Action::INVALID_TAG, "Invalid tag value!"); + CCASSERT(target != nullptr, "target can't be nullptr!"); tHashElement *element = nullptr; HASH_FIND_PTR(_targets, &target, element); @@ -321,7 +321,7 @@ void ActionManager::removeActionsByFlags(unsigned int flags, Node *target) { return; } - CCASSERT(target != nullptr, ""); + CCASSERT(target != nullptr, "target can't be nullptr!"); tHashElement *element = nullptr; HASH_FIND_PTR(_targets, &target, element); @@ -352,7 +352,7 @@ void ActionManager::removeActionsByFlags(unsigned int flags, Node *target) // and, it is not possible to get the address of a reference Action* ActionManager::getActionByTag(int tag, const Node *target) const { - CCASSERT(tag != Action::INVALID_TAG, ""); + CCASSERT(tag != Action::INVALID_TAG, "Invalid tag value!"); tHashElement *element = nullptr; HASH_FIND_PTR(_targets, &target, element); diff --git a/cocos/2d/CCCamera.cpp b/cocos/2d/CCCamera.cpp index 880d3ee3d7..c62171c54c 100644 --- a/cocos/2d/CCCamera.cpp +++ b/cocos/2d/CCCamera.cpp @@ -238,7 +238,7 @@ Vec2 Camera::project(const Vec3& src) const Vec4 clipPos; getViewProjectionMatrix().transformVector(Vec4(src.x, src.y, src.z, 1.0f), &clipPos); - CCASSERT(clipPos.w != 0.0f, ""); + CCASSERT(clipPos.w != 0.0f, "clipPos.w can't be 0.0f!"); float ndcX = clipPos.x / clipPos.w; float ndcY = clipPos.y / clipPos.w; @@ -255,7 +255,7 @@ Vec2 Camera::projectGL(const Vec3& src) const Vec4 clipPos; getViewProjectionMatrix().transformVector(Vec4(src.x, src.y, src.z, 1.0f), &clipPos); - CCASSERT(clipPos.w != 0.0f, ""); + CCASSERT(clipPos.w != 0.0f, "clipPos.w can't be 0.0f!"); float ndcX = clipPos.x / clipPos.w; float ndcY = clipPos.y / clipPos.w; diff --git a/cocos/2d/CCGrid.cpp b/cocos/2d/CCGrid.cpp index 9ccbd06b90..5426ad3bd1 100644 --- a/cocos/2d/CCGrid.cpp +++ b/cocos/2d/CCGrid.cpp @@ -245,17 +245,17 @@ void GridBase::afterDraw(cocos2d::Node *target) void GridBase::blit(void) { - CCASSERT(0, ""); + CCASSERT(0, "Subclass should implement it."); } void GridBase::reuse(void) { - CCASSERT(0, ""); + CCASSERT(0, "Subclass should implement it!"); } void GridBase::calculateVertexPoints(void) { - CCASSERT(0, ""); + CCASSERT(0, "Subclass should implement it."); } // implementation of Grid3D diff --git a/cocos/2d/CCMenu.cpp b/cocos/2d/CCMenu.cpp index 2b8ceea7d5..2a17e75578 100644 --- a/cocos/2d/CCMenu.cpp +++ b/cocos/2d/CCMenu.cpp @@ -376,11 +376,11 @@ void Menu::alignItemsInColumnsWithArray(const ValueVector& rows) int rowColumns = 0; for(const auto &child : _children) { - CCASSERT(row < rows.size(), ""); + CCASSERT(row < rows.size(), "row should less than rows.size()!"); rowColumns = rows[row].asInt(); // can not have zero columns on a row - CCASSERT(rowColumns, ""); + CCASSERT(rowColumns, "rowColumns can't be 0."); float tmp = child->getContentSize().height; rowHeight = (unsigned int)((rowHeight >= tmp || isnan(tmp)) ? rowHeight : tmp); @@ -397,7 +397,7 @@ void Menu::alignItemsInColumnsWithArray(const ValueVector& rows) } // check if too many rows/columns for available menu items - CCASSERT(! columnsOccupied, ""); + CCASSERT(! columnsOccupied, "columnsOccupied should be 0."); Size winSize = Director::getInstance()->getWinSize(); @@ -472,11 +472,11 @@ void Menu::alignItemsInRowsWithArray(const ValueVector& columns) for(const auto &child : _children) { // check if too many menu items for the amount of rows/columns - CCASSERT(column < columns.size(), ""); + CCASSERT(column < columns.size(), "column should be less than columns.size()."); columnRows = columns[column].asInt(); // can't have zero rows on a column - CCASSERT(columnRows, ""); + CCASSERT(columnRows, "columnRows can't be 0."); // columnWidth = fmaxf(columnWidth, [item contentSize].width); float tmp = child->getContentSize().width; @@ -499,7 +499,7 @@ void Menu::alignItemsInRowsWithArray(const ValueVector& columns) } // check if too many rows/columns for available menu items. - CCASSERT(! rowsOccupied, ""); + CCASSERT(! rowsOccupied, "rowsOccupied should be 0."); Size winSize = Director::getInstance()->getWinSize(); diff --git a/cocos/2d/CCParticleSystem.cpp b/cocos/2d/CCParticleSystem.cpp index 170c8231a0..92d485d1e3 100644 --- a/cocos/2d/CCParticleSystem.cpp +++ b/cocos/2d/CCParticleSystem.cpp @@ -384,7 +384,7 @@ bool ParticleSystem::initWithDictionary(ValueMap& dictionary, const std::string& else if( dictionary.find("textureImageData") != dictionary.end() ) { std::string textureData = dictionary.at("textureImageData").asString(); - CCASSERT(!textureData.empty(), ""); + CCASSERT(!textureData.empty(), "textureData can't be empty!"); auto dataLen = textureData.size(); if (dataLen != 0) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index faa5b61e79..7f02f088d0 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -205,7 +205,7 @@ bool Sprite::initWithSpriteFrameName(const std::string& spriteFrameName) bool Sprite::initWithSpriteFrame(SpriteFrame *spriteFrame) { - CCASSERT(spriteFrame != nullptr, ""); + CCASSERT(spriteFrame != nullptr, "spriteFrame can't be nullptr!"); bool bRet = initWithTexture(spriteFrame->getTexture(), spriteFrame->getRect()); setSpriteFrame(spriteFrame); @@ -673,7 +673,7 @@ void Sprite::addChild(Node *child, int zOrder, int tag) { Sprite* childSprite = dynamic_cast(child); CCASSERT( childSprite, "CCSprite only supports Sprites as children when using SpriteBatchNode"); - CCASSERT(childSprite->getTexture()->getName() == _textureAtlas->getTexture()->getName(), ""); + CCASSERT(childSprite->getTexture()->getName() == _textureAtlas->getTexture()->getName(), "childSprite's texture name should be equal to _textureAtlas's texture name!"); //put it in descendants array of batch node _batchNode->appendChild(childSprite); @@ -694,7 +694,8 @@ void Sprite::addChild(Node *child, int zOrder, const std::string &name) { Sprite* childSprite = dynamic_cast(child); CCASSERT( childSprite, "CCSprite only supports Sprites as children when using SpriteBatchNode"); - CCASSERT(childSprite->getTexture()->getName() == _textureAtlas->getTexture()->getName(), ""); + CCASSERT(childSprite->getTexture()->getName() == _textureAtlas->getTexture()->getName(), + "childSprite's texture name should be equal to _textureAtlas's texture name."); //put it in descendants array of batch node _batchNode->appendChild(childSprite); diff --git a/cocos/2d/CCTMXXMLParser.cpp b/cocos/2d/CCTMXXMLParser.cpp index e559550a58..a6b318f741 100644 --- a/cocos/2d/CCTMXXMLParser.cpp +++ b/cocos/2d/CCTMXXMLParser.cpp @@ -643,7 +643,7 @@ void TMXMapInfo::endElement(void *ctx, const char *name) ssize_t sizeHint = s.width * s.height * sizeof(unsigned int); ssize_t CC_UNUSED inflatedLen = ZipUtils::inflateMemoryWithHint(buffer, len, &deflated, sizeHint); - CCASSERT(inflatedLen == sizeHint, ""); + CCASSERT(inflatedLen == sizeHint, "inflatedLen should be equal to sizeHint!"); free(buffer); buffer = nullptr; diff --git a/cocos/base/CCEventDispatcher.cpp b/cocos/base/CCEventDispatcher.cpp index 914a8d34d6..8b5428d4af 100644 --- a/cocos/base/CCEventDispatcher.cpp +++ b/cocos/base/CCEventDispatcher.cpp @@ -1027,7 +1027,8 @@ void EventDispatcher::dispatchTouchEvent(EventTouch* event) return true; } - CCASSERT((*touchesIter)->getID() == (*mutableTouchesIter)->getID(), ""); + CCASSERT((*touchesIter)->getID() == (*mutableTouchesIter)->getID(), + "touchesIter ID should be equal to mutableTouchesIter's ID."); if (isClaimed && listener->_isRegistered && listener->_needSwallow) { diff --git a/cocos/base/CCEventListenerAcceleration.cpp b/cocos/base/CCEventListenerAcceleration.cpp index 099919be97..4bcdb6ce08 100644 --- a/cocos/base/CCEventListenerAcceleration.cpp +++ b/cocos/base/CCEventListenerAcceleration.cpp @@ -89,7 +89,7 @@ EventListenerAcceleration* EventListenerAcceleration::clone() bool EventListenerAcceleration::checkAvailable() { - CCASSERT(onAccelerationEvent, ""); + CCASSERT(onAccelerationEvent, "onAccelerationEvent can't be nullptr!"); return true; } diff --git a/cocos/base/CCScheduler.cpp b/cocos/base/CCScheduler.cpp index 8ed57ecab6..63fb852354 100644 --- a/cocos/base/CCScheduler.cpp +++ b/cocos/base/CCScheduler.cpp @@ -300,7 +300,7 @@ void Scheduler::schedule(const ccSchedulerFunc& callback, void *target, float in } else { - CCASSERT(element->paused == paused, ""); + CCASSERT(element->paused == paused, "element's paused should be paused!"); } if (element->timers == nullptr) @@ -694,7 +694,7 @@ void Scheduler::unscheduleScriptEntry(unsigned int scheduleScriptEntryID) void Scheduler::resumeTarget(void *target) { - CCASSERT(target != nullptr, ""); + CCASSERT(target != nullptr, "target can't be nullptr!"); // custom selectors tHashTimerEntry *element = nullptr; @@ -709,14 +709,14 @@ void Scheduler::resumeTarget(void *target) HASH_FIND_PTR(_hashForUpdates, &target, elementUpdate); if (elementUpdate) { - CCASSERT(elementUpdate->entry != nullptr, ""); + CCASSERT(elementUpdate->entry != nullptr, "elementUpdate's entry can't be nullptr!"); elementUpdate->entry->paused = false; } } void Scheduler::pauseTarget(void *target) { - CCASSERT(target != nullptr, ""); + CCASSERT(target != nullptr, "target can't be nullptr!"); // custom selectors tHashTimerEntry *element = nullptr; @@ -731,7 +731,7 @@ void Scheduler::pauseTarget(void *target) HASH_FIND_PTR(_hashForUpdates, &target, elementUpdate); if (elementUpdate) { - CCASSERT(elementUpdate->entry != nullptr, ""); + CCASSERT(elementUpdate->entry != nullptr, "elementUpdate's entry can't be nullptr!"); elementUpdate->entry->paused = true; } } @@ -1001,7 +1001,7 @@ void Scheduler::schedule(SEL_SCHEDULE selector, Ref *target, float interval, uns } else { - CCASSERT(element->paused == paused, ""); + CCASSERT(element->paused == paused, "element's paused should be paused."); } if (element->timers == nullptr) diff --git a/cocos/base/ZipUtils.cpp b/cocos/base/ZipUtils.cpp index 2110643d41..30ac76fd94 100644 --- a/cocos/base/ZipUtils.cpp +++ b/cocos/base/ZipUtils.cpp @@ -252,8 +252,8 @@ int ZipUtils::inflateGZipFile(const char *path, unsigned char **out) int len; unsigned int offset = 0; - CCASSERT(out, ""); - CCASSERT(&*out, ""); + CCASSERT(out, "out can't be nullptr."); + CCASSERT(&*out, "&*out can't be nullptr."); gzFile inFile = gzopen(path, "rb"); if( inFile == nullptr ) { diff --git a/cocos/editor-support/cocosbuilder/CCBReader.cpp b/cocos/editor-support/cocosbuilder/CCBReader.cpp index c0a408bb20..6b7d9c8f8a 100644 --- a/cocos/editor-support/cocosbuilder/CCBReader.cpp +++ b/cocos/editor-support/cocosbuilder/CCBReader.cpp @@ -128,7 +128,7 @@ CCBReader::~CCBReader() void CCBReader::setCCBRootPath(const char* ccbRootPath) { - CCASSERT(ccbRootPath != nullptr, ""); + CCASSERT(ccbRootPath != nullptr, "ccbRootPath can't be nullptr!"); _CCBRootPath = ccbRootPath; } diff --git a/cocos/editor-support/cocosbuilder/CCNodeLoader.cpp b/cocos/editor-support/cocosbuilder/CCNodeLoader.cpp index 071f3e3e68..cc375f129e 100644 --- a/cocos/editor-support/cocosbuilder/CCNodeLoader.cpp +++ b/cocos/editor-support/cocosbuilder/CCNodeLoader.cpp @@ -968,7 +968,8 @@ Node * NodeLoader::parsePropTypeCCBFile(Node * pNode, Node * pParent, CCBReader auto& ownerCallbackNodes = reader->getOwnerCallbackNodes(); if (!ownerCallbackNames.empty() && !ownerCallbackNodes.empty()) { - CCASSERT(ownerCallbackNames.size() == ownerCallbackNodes.size(), ""); + CCASSERT(ownerCallbackNames.size() == ownerCallbackNodes.size(), + "ownerCallbackNames size should equal to ownerCallbackNodes size."); ssize_t nCount = ownerCallbackNames.size(); for (ssize_t i = 0 ; i < nCount; i++) @@ -982,7 +983,8 @@ Node * NodeLoader::parsePropTypeCCBFile(Node * pNode, Node * pParent, CCBReader auto ownerOutletNodes = reader->getOwnerOutletNodes(); if (!ownerOutletNames.empty() && !ownerOutletNodes.empty()) { - CCASSERT(ownerOutletNames.size() == ownerOutletNodes.size(), ""); + CCASSERT(ownerOutletNames.size() == ownerOutletNodes.size(), + "ownerOutletNames size should be equal to ownerOutletNodes's size."); ssize_t nCount = ownerOutletNames.size(); for (ssize_t i = 0 ; i < nCount; i++) diff --git a/cocos/editor-support/cocostudio/CCArmature.cpp b/cocos/editor-support/cocostudio/CCArmature.cpp index c0b9cf4853..396f7bf30a 100644 --- a/cocos/editor-support/cocostudio/CCArmature.cpp +++ b/cocos/editor-support/cocostudio/CCArmature.cpp @@ -137,7 +137,7 @@ bool Armature::init(const std::string& name) ArmatureData *armatureData = armatureDataManager->getArmatureData(name); - CCASSERT(armatureData, ""); + CCASSERT(armatureData, "armatureData doesn't exists!"); _armatureData = armatureData; diff --git a/cocos/editor-support/cocostudio/TriggerObj.cpp b/cocos/editor-support/cocostudio/TriggerObj.cpp index f2316466d0..018c4b468c 100755 --- a/cocos/editor-support/cocostudio/TriggerObj.cpp +++ b/cocos/editor-support/cocostudio/TriggerObj.cpp @@ -185,10 +185,10 @@ void TriggerObj::serialize(const rapidjson::Value &val) if(con == nullptr) { CCLOG("class %s can not be implemented!", classname); - CCASSERT(con != nullptr, ""); + CCASSERT(con != nullptr, "con can't be nullptr!"); } - CCASSERT(con != nullptr, ""); + CCASSERT(con != nullptr, "con can't be nullptr!"); con->serialize(subDict); con->init(); _cons.pushBack(con); @@ -207,7 +207,7 @@ void TriggerObj::serialize(const rapidjson::Value &val) if(act == nullptr) { CCLOG("class %s can not be implemented!", classname); - CCASSERT(act != nullptr, ""); + CCASSERT(act != nullptr, "act can't be nullptr!"); } act->serialize(subDict); act->init(); diff --git a/cocos/renderer/CCGLProgramState.cpp b/cocos/renderer/CCGLProgramState.cpp index 616e5b2d92..b5728c6a17 100644 --- a/cocos/renderer/CCGLProgramState.cpp +++ b/cocos/renderer/CCGLProgramState.cpp @@ -239,7 +239,7 @@ void UniformValue::setVec4v(ssize_t size, const Vec4* pointer) void UniformValue::setMat4(const Mat4& value) { - CCASSERT(_uniform->type == GL_FLOAT_MAT4, ""); + CCASSERT(_uniform->type == GL_FLOAT_MAT4, "_uniform's type should be equal GL_FLOAT_MAT4."); memcpy(_value.matrixValue, &value, sizeof(_value.matrixValue)); _type = Type::VALUE; } diff --git a/cocos/renderer/CCTexture2D.cpp b/cocos/renderer/CCTexture2D.cpp index 634c7c0f1c..b9e0a581ae 100644 --- a/cocos/renderer/CCTexture2D.cpp +++ b/cocos/renderer/CCTexture2D.cpp @@ -670,7 +670,7 @@ bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, PixelFormat CCLOG("cocos2d: Texture2D. WARNING. Mipmap level %u is not squared. Texture won't render correctly. width=%d != height=%d", i, width, height); } - GLenum err = glGetError(); + err = glGetError(); if (err != GL_NO_ERROR) { CCLOG("cocos2d: Texture2D: Error uploading compressed texture level: %u . glError: 0x%04X", i, err); diff --git a/cocos/renderer/CCTextureAtlas.cpp b/cocos/renderer/CCTextureAtlas.cpp index 630236c571..fde935cac5 100644 --- a/cocos/renderer/CCTextureAtlas.cpp +++ b/cocos/renderer/CCTextureAtlas.cpp @@ -171,7 +171,7 @@ bool TextureAtlas::initWithTexture(Texture2D *texture, ssize_t capacity) CC_SAFE_RETAIN(_texture); // Re-initialization is not allowed - CCASSERT(_quads == nullptr && _indices == nullptr, ""); + CCASSERT(_quads == nullptr && _indices == nullptr, "_quads and _indices should be nullptr."); _quads = (V3F_C4B_T2F_Quad*)malloc( _capacity * sizeof(V3F_C4B_T2F_Quad) ); _indices = (GLushort *)malloc( _capacity * 6 * sizeof(GLushort) ); diff --git a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp index 87603e33ed..1eb050e935 100644 --- a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp +++ b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp @@ -50,7 +50,8 @@ JSTouchDelegate::~JSTouchDelegate() void JSTouchDelegate::setDelegateForJSObject(JSObject* pJSObj, JSTouchDelegate* pDelegate) { - CCASSERT(sTouchDelegateMap.find(pJSObj) == sTouchDelegateMap.end(), ""); + CCASSERT(sTouchDelegateMap.find(pJSObj) == sTouchDelegateMap.end(), + "pJSObj can't be found in sTouchDelegateMap."); sTouchDelegateMap.insert(TouchDelegatePair(pJSObj, pDelegate)); } @@ -68,7 +69,7 @@ JSTouchDelegate* JSTouchDelegate::getDelegateForJSObject(JSObject* pJSObj) void JSTouchDelegate::removeDelegateForJSObject(JSObject* pJSObj) { TouchDelegateMap::iterator iter = sTouchDelegateMap.find(pJSObj); - CCASSERT(iter != sTouchDelegateMap.end(), ""); + CCASSERT(iter != sTouchDelegateMap.end(), "pJSObj can't be found in sTouchDelegateMap!"); sTouchDelegateMap.erase(pJSObj); } @@ -1386,7 +1387,7 @@ void JSScheduleWrapper::dump() jsfuncTargetCount++; } } - CCASSERT(nativeTargetsCount == jsfuncTargetCount, ""); + CCASSERT(nativeTargetsCount == jsfuncTargetCount, "nativeTargetsCount should be equal to jsfuncTargetCount."); CCLOG("\n---------JSScheduleWrapper dump end--------------\n"); #endif } diff --git a/cocos/ui/UIWidget.cpp b/cocos/ui/UIWidget.cpp index 54c16e0f16..86bd7c5387 100644 --- a/cocos/ui/UIWidget.cpp +++ b/cocos/ui/UIWidget.cpp @@ -1296,7 +1296,7 @@ void Widget::copyProperties(Widget *widget) float Widget::getScale()const { - CCASSERT(this->getScaleX() == this->getScaleY(), ""); + CCASSERT(this->getScaleX() == this->getScaleY(), "scaleX should be equal to scaleY."); return this->getScaleX(); } diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp index 3dd0e3ff93..6083704502 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp @@ -349,6 +349,7 @@ bool UISliderNewEventCallbackTest::init() slider->addEventListener([=](Ref* widget,Slider::EventType type) { Slider* slider = (Slider*)widget; + CC_UNUSED_PARAM(slider); if(type == Slider::EventType::ON_SLIDEBALL_DOWN) { CCLOG("slider button pressed!"); diff --git a/tests/cpp-tests/Classes/UnitTest/UnitTest.cpp b/tests/cpp-tests/Classes/UnitTest/UnitTest.cpp index 4bf497f369..33d11f9507 100644 --- a/tests/cpp-tests/Classes/UnitTest/UnitTest.cpp +++ b/tests/cpp-tests/Classes/UnitTest/UnitTest.cpp @@ -60,51 +60,51 @@ void TemplateVectorTest::onEnter() UnitTestDemo::onEnter(); Vector vec; - CCASSERT(vec.empty(), ""); - CCASSERT(vec.capacity() == 0, ""); - CCASSERT(vec.size() == 0, ""); - CCASSERT(vec.max_size() > 0, ""); + CCASSERT(vec.empty(), "vec should be empty."); + CCASSERT(vec.capacity() == 0, "vec.capacity should be 0."); + CCASSERT(vec.size() == 0, "vec.size should be 0."); + CCASSERT(vec.max_size() > 0, "vec.max_size should > 0."); auto node1 = Node::create(); node1->setTag(1); vec.pushBack(node1); - CCASSERT(node1->getReferenceCount() == 2, ""); + CCASSERT(node1->getReferenceCount() == 2, "node1->getReferenceCount should be 2."); auto node2 = Node::create(); node2->setTag(2); vec.pushBack(node2); - CCASSERT(vec.getIndex(node1) == 0, ""); - CCASSERT(vec.getIndex(node2) == 1, ""); + CCASSERT(vec.getIndex(node1) == 0, "node1 should at index 0 in vec."); + CCASSERT(vec.getIndex(node2) == 1, "node2 should at index 1 in vec."); auto node3 = Node::create(); node3->setTag(3); vec.insert(1, node3); - CCASSERT(vec.at(0)->getTag() == 1, ""); - CCASSERT(vec.at(1)->getTag() == 3, ""); - CCASSERT(vec.at(2)->getTag() == 2, ""); + CCASSERT(vec.at(0)->getTag() == 1, "The element at 0, tag should be 1."); + CCASSERT(vec.at(1)->getTag() == 3, "The element at 1, tag should be 3."); + CCASSERT(vec.at(2)->getTag() == 2, "The element at 2, tag should be 2."); // Test copy constructor Vector vec2(vec); - CCASSERT(vec2.size() == vec.size(), ""); + CCASSERT(vec2.size() == vec.size(), "vec2 and vec should have equal size."); ssize_t size = vec.size(); for (ssize_t i = 0; i < size; ++i) { - CCASSERT(vec2.at(i) == vec.at(i), ""); - CCASSERT(vec.at(i)->getReferenceCount() == 3, ""); - CCASSERT(vec2.at(i)->getReferenceCount() == 3, ""); + CCASSERT(vec2.at(i) == vec.at(i), "The element at the same index in vec2 and vec2 should be equal."); + CCASSERT(vec.at(i)->getReferenceCount() == 3, "The reference cound of element in vec is 3. "); + CCASSERT(vec2.at(i)->getReferenceCount() == 3, "The reference cound of element in vec2 is 3. "); } // Test copy assignment operator Vector vec3; vec3 = vec2; - CCASSERT(vec3.size() == vec2.size(), ""); + CCASSERT(vec3.size() == vec2.size(), "vec3 and vec2 should have equal size."); size = vec3.size(); for (ssize_t i = 0; i < size; ++i) { - CCASSERT(vec3.at(i) == vec2.at(i), ""); - CCASSERT(vec3.at(i)->getReferenceCount() == 4, ""); - CCASSERT(vec2.at(i)->getReferenceCount() == 4, ""); - CCASSERT(vec.at(i)->getReferenceCount() == 4, ""); + CCASSERT(vec3.at(i) == vec2.at(i), "The element at the same index in vec3 and vec2 should be equal."); + CCASSERT(vec3.at(i)->getReferenceCount() == 4, "The reference cound of element in vec3 is 4. "); + CCASSERT(vec2.at(i)->getReferenceCount() == 4, "The reference cound of element in vec2 is 4. "); + CCASSERT(vec.at(i)->getReferenceCount() == 4, "The reference cound of element in vec is 4. "); } // Test move constructor @@ -130,75 +130,75 @@ void TemplateVectorTest::onEnter() for (const auto& child : vec4) { CC_UNUSED_PARAM(child); - CCASSERT(child->getReferenceCount() == 2, ""); + CCASSERT(child->getReferenceCount() == 2, "child's reference count should be 2."); } // Test init Vector with capacity Vector vec5(10); - CCASSERT(vec5.capacity() == 10, ""); + CCASSERT(vec5.capacity() == 10, "vec5's capacity should be 10."); vec5.reserve(20); - CCASSERT(vec5.capacity() == 20, ""); + CCASSERT(vec5.capacity() == 20, "vec5's capacity should be 20."); - CCASSERT(vec5.size() == 0, ""); - CCASSERT(vec5.empty(), ""); + CCASSERT(vec5.size() == 0, "vec5's size should be 0."); + CCASSERT(vec5.empty(), "vec5 is empty now."); auto toRemovedNode = Node::create(); vec5.pushBack(toRemovedNode); - CCASSERT(toRemovedNode->getReferenceCount() == 2, ""); + CCASSERT(toRemovedNode->getReferenceCount() == 2, "toRemovedNode's reference count is 2."); // Test move assignment operator vec5 = createVector(); - CCASSERT(toRemovedNode->getReferenceCount() == 1, ""); + CCASSERT(toRemovedNode->getReferenceCount() == 1, "toRemovedNode's reference count is 1."); CCASSERT(vec5.size() == 20, "size should be 20"); for (const auto& child : vec5) { CC_UNUSED_PARAM(child); - CCASSERT(child->getReferenceCount() == 2, ""); + CCASSERT(child->getReferenceCount() == 2, "child's reference count is 2."); } // Test Vector::find - CCASSERT(vec.find(node3) == (vec.begin() + 1), ""); - CCASSERT(std::find(std::begin(vec), std::end(vec), node2) == (vec.begin() + 2), ""); + CCASSERT(vec.find(node3) == (vec.begin() + 1), "node3 is the 2nd element in vec."); + CCASSERT(std::find(std::begin(vec), std::end(vec), node2) == (vec.begin() + 2), "node2 is the 3rd element in vec."); - CCASSERT(vec.front()->getTag() == 1, ""); - CCASSERT(vec.back()->getTag() == 2, ""); + CCASSERT(vec.front()->getTag() == 1, "vec's front element's tag is 1."); + CCASSERT(vec.back()->getTag() == 2, "vec's back element's tag is 2."); - CCASSERT(vec.getRandomObject(), ""); - CCASSERT(!vec.contains(Node::create()), ""); - CCASSERT(vec.contains(node1), ""); - CCASSERT(vec.contains(node2), ""); - CCASSERT(vec.contains(node3), ""); - CCASSERT(vec.equals(vec2), ""); - CCASSERT(vec.equals(vec3), ""); + CCASSERT(vec.getRandomObject(), "vec getRandomObject should return true."); + CCASSERT(!vec.contains(Node::create()), "vec doesn't contain a empty Node instance."); + CCASSERT(vec.contains(node1), "vec contains node1."); + CCASSERT(vec.contains(node2), "vec contains node2."); + CCASSERT(vec.contains(node3), "vec contains node3."); + CCASSERT(vec.equals(vec2), "vec is equal to vec2."); + CCASSERT(vec.equals(vec3), "vec is equal to vec3."); // Insert vec5.insert(2, node1); - CCASSERT(vec5.at(2)->getTag() == 1, ""); - CCASSERT(vec5.size() == 21, ""); + CCASSERT(vec5.at(2)->getTag() == 1, "vec5's 3rd element's tag is 1."); + CCASSERT(vec5.size() == 21, "vec5's size is 21."); vec5.back()->setTag(100); vec5.popBack(); - CCASSERT(vec5.size() == 20, ""); - CCASSERT(vec5.back()->getTag() != 100, ""); + CCASSERT(vec5.size() == 20, "vec5's size is 20."); + CCASSERT(vec5.back()->getTag() != 100, "the back element of vec5's tag is 100."); // Erase and clear Vector vec6 = createVector(); Vector vec7 = vec6; // Copy for check - CCASSERT(vec6.size() == 20, ""); + CCASSERT(vec6.size() == 20, "vec6's size is 20."); vec6.erase(vec6.begin() + 1); // - CCASSERT(vec6.size() == 19, ""); - CCASSERT((*(vec6.begin() + 1))->getTag() == 1002, ""); + CCASSERT(vec6.size() == 19, "vec6's size is 19."); + CCASSERT((*(vec6.begin() + 1))->getTag() == 1002, "The 2rd element in vec6's tag is 1002."); vec6.erase(vec6.begin() + 2, vec6.begin() + 10); - CCASSERT(vec6.size() == 11, ""); - CCASSERT(vec6.at(0)->getTag() == 1000, ""); - CCASSERT(vec6.at(1)->getTag() == 1002, ""); - CCASSERT(vec6.at(2)->getTag() == 1011, ""); - CCASSERT(vec6.at(3)->getTag() == 1012, ""); + CCASSERT(vec6.size() == 11, "vec6's size is 11."); + CCASSERT(vec6.at(0)->getTag() == 1000, "vec6's first element's tag is 1000."); + CCASSERT(vec6.at(1)->getTag() == 1002, "vec6's second element's tag is 1002."); + CCASSERT(vec6.at(2)->getTag() == 1011, "vec6's third element's tag is 1011."); + CCASSERT(vec6.at(3)->getTag() == 1012, "vec6's fouth element's tag is 1012."); vec6.erase(3); - CCASSERT(vec6.at(3)->getTag() == 1013, ""); + CCASSERT(vec6.at(3)->getTag() == 1013, "vec6's 4th elemetn's tag is 1013."); vec6.eraseObject(vec6.at(2)); - CCASSERT(vec6.at(2)->getTag() == 1013, ""); + CCASSERT(vec6.at(2)->getTag() == 1013, "vec6's 3rd element's tag is 1013."); vec6.clear(); auto objA = Node::create(); // retain count is 1 @@ -220,9 +220,9 @@ void TemplateVectorTest::onEnter() for (auto obj : array1) { array2.eraseObject(obj); } - CCASSERT(objA->getReferenceCount() == 4, ""); + CCASSERT(objA->getReferenceCount() == 4, "objA's reference count is 4."); } - CCASSERT(objA->getReferenceCount() == 1, ""); + CCASSERT(objA->getReferenceCount() == 1, "objA's reference count is 1."); { Vector array1; @@ -230,24 +230,24 @@ void TemplateVectorTest::onEnter() array1.pushBack(objA); // retain count is 2 array1.pushBack(objA); // retain count is 3 array1.pushBack(objA); // retain count is 4 - CCASSERT(objA->getReferenceCount() == 4, ""); + CCASSERT(objA->getReferenceCount() == 4, "objA's reference count is 4."); array1.eraseObject(objA, true); // Remove all occurrences in the Vector. - CCASSERT(objA->getReferenceCount() == 1, ""); + CCASSERT(objA->getReferenceCount() == 1, "objA's reference count is 1."); array1.pushBack(objA); // retain count is 2 array1.pushBack(objA); // retain count is 3 array1.pushBack(objA); // retain count is 4 array1.eraseObject(objA, false); - CCASSERT(objA->getReferenceCount() == 3, ""); // Only remove the first occurrence in the Vector. + CCASSERT(objA->getReferenceCount() == 3, "objA's reference count is 3."); // Only remove the first occurrence in the Vector. } // Check the retain count in vec7 - CCASSERT(vec7.size() == 20, ""); + CCASSERT(vec7.size() == 20, "vec7's size is 20."); for (const auto& child : vec7) { CC_UNUSED_PARAM(child); - CCASSERT(child->getReferenceCount() == 2, ""); + CCASSERT(child->getReferenceCount() == 2, "child's reference count is 2."); } // Sort @@ -258,32 +258,32 @@ void TemplateVectorTest::onEnter() for (int i = 0; i < 20; ++i) { - CCASSERT(vecForSort.at(i)->getTag() - 1000 == (19 - i), ""); + CCASSERT(vecForSort.at(i)->getTag() - 1000 == (19 - i), "vecForSort's element's tag is invalid."); } // Reverse vecForSort.reverse(); for (int i = 0; i < 20; ++i) { - CCASSERT(vecForSort.at(i)->getTag() - 1000 == i, ""); + CCASSERT(vecForSort.at(i)->getTag() - 1000 == i, "vecForSort's element's tag is invalid."); } // Swap Vector vecForSwap = createVector(); vecForSwap.swap(2, 4); - CCASSERT(vecForSwap.at(2)->getTag() == 1004, ""); - CCASSERT(vecForSwap.at(4)->getTag() == 1002, ""); + CCASSERT(vecForSwap.at(2)->getTag() == 1004, "vecForSwap's 3nd element's tag is 1004."); + CCASSERT(vecForSwap.at(4)->getTag() == 1002, "vecForSwap's 5rd element's tag is 1002."); vecForSwap.swap(vecForSwap.at(2), vecForSwap.at(4)); - CCASSERT(vecForSwap.at(2)->getTag() == 1002, ""); - CCASSERT(vecForSwap.at(4)->getTag() == 1004, ""); + CCASSERT(vecForSwap.at(2)->getTag() == 1002, "vecForSwap's 3rd element's tag is 1002."); + CCASSERT(vecForSwap.at(4)->getTag() == 1004, "vecForSwap's 5rd element's tag is 1004."); // shrinkToFit Vector vecForShrink = createVector(); vecForShrink.reserve(100); - CCASSERT(vecForShrink.capacity() == 100, ""); + CCASSERT(vecForShrink.capacity() == 100, "vecForShrink's capacity is 100."); vecForShrink.pushBack(Node::create()); vecForShrink.shrinkToFit(); - CCASSERT(vecForShrink.capacity() == 21, ""); + CCASSERT(vecForShrink.capacity() == 21, "vecForShrink's capacity is 21."); // get random object // Set the seed by time @@ -299,21 +299,21 @@ void TemplateVectorTest::onEnter() // Self assignment Vector vecSelfAssign = createVector(); vecSelfAssign = vecSelfAssign; - CCASSERT(vecSelfAssign.size() == 20, ""); + CCASSERT(vecSelfAssign.size() == 20, "vecSelfAssign's size is 20."); for (const auto& child : vecSelfAssign) { CC_UNUSED_PARAM(child); - CCASSERT(child->getReferenceCount() == 2, ""); + CCASSERT(child->getReferenceCount() == 2, "child's reference count is 2."); } vecSelfAssign = std::move(vecSelfAssign); - CCASSERT(vecSelfAssign.size() == 20, ""); + CCASSERT(vecSelfAssign.size() == 20, "vecSelfAssign's size is 20."); for (const auto& child : vecSelfAssign) { CC_UNUSED_PARAM(child); - CCASSERT(child->getReferenceCount() == 2, ""); + CCASSERT(child->getReferenceCount() == 2, "child's reference count is 2."); } // const at @@ -352,17 +352,17 @@ void TemplateMapTest::onEnter() // Default constructor Map map1; - CCASSERT(map1.empty(), ""); - CCASSERT(map1.size() == 0, ""); - CCASSERT(map1.keys().empty(), ""); - CCASSERT(map1.keys(Node::create()).empty(), ""); + CCASSERT(map1.empty(), "map1 is empty."); + CCASSERT(map1.size() == 0, "map1's size is 0."); + CCASSERT(map1.keys().empty(), "map1's keys are empty."); + CCASSERT(map1.keys(Node::create()).empty(), "map1's keys don't contain a empty Node."); // Move constructor Map map2 = createMap(); for (const auto& e : map2) { CC_UNUSED_PARAM(e); - CCASSERT(e.second->getReferenceCount() == 2, ""); + CCASSERT(e.second->getReferenceCount() == 2, "e.second element's reference count is 2."); } // Copy constructor @@ -370,7 +370,7 @@ void TemplateMapTest::onEnter() for (const auto& e : map3) { CC_UNUSED_PARAM(e); - CCASSERT(e.second->getReferenceCount() == 3, ""); + CCASSERT(e.second->getReferenceCount() == 3, "e.second's reference count is 3."); } // Move assignment operator @@ -378,11 +378,11 @@ void TemplateMapTest::onEnter() auto unusedNode = Node::create(); map4.insert("unused",unusedNode); map4 = createMap(); - CCASSERT(unusedNode->getReferenceCount() == 1, ""); + CCASSERT(unusedNode->getReferenceCount() == 1, "unusedNode's reference count is 1."); for (const auto& e : map4) { CC_UNUSED_PARAM(e); - CCASSERT(e.second->getReferenceCount() == 2, ""); + CCASSERT(e.second->getReferenceCount() == 2, "e.second's reference count is 2."); } // Copy assignment operator @@ -391,16 +391,16 @@ void TemplateMapTest::onEnter() for (const auto& e : map5) { CC_UNUSED_PARAM(e); - CCASSERT(e.second->getReferenceCount() == 3, ""); + CCASSERT(e.second->getReferenceCount() == 3, "e.second's reference count is 3."); } // Check size - CCASSERT(map4.size() == map5.size(), ""); + CCASSERT(map4.size() == map5.size(), "map4's size is equal to map5.size."); for (const auto& e : map4) { CC_UNUSED_PARAM(e); - CCASSERT(e.second == map5.find(e.first)->second, ""); + CCASSERT(e.second == map5.find(e.first)->second, "e.second can't be found in map5."); } // bucket_count, bucket_size(n), bucket @@ -444,7 +444,7 @@ void TemplateMapTest::onEnter() // find auto nodeToFind = map4.find("10"); CC_UNUSED_PARAM(nodeToFind); - CCASSERT(nodeToFind->second->getTag() == 1010, ""); + CCASSERT(nodeToFind->second->getTag() == 1010, "nodeToFind's tag value is 1010."); // insert Map map6; @@ -458,29 +458,29 @@ void TemplateMapTest::onEnter() map6.insert("insert02", node2); map6.insert("insert03", node3); - CCASSERT(node1->getReferenceCount() == 2, ""); - CCASSERT(node2->getReferenceCount() == 2, ""); - CCASSERT(node3->getReferenceCount() == 2, ""); - CCASSERT(map6.at("insert01") == node1, ""); - CCASSERT(map6.at("insert02") == node2, ""); - CCASSERT(map6.at("insert03") == node3, ""); + CCASSERT(node1->getReferenceCount() == 2, "node1's reference count is 2."); + CCASSERT(node2->getReferenceCount() == 2, "node2's reference count is 2."); + CCASSERT(node3->getReferenceCount() == 2, "node3's reference count is 2."); + CCASSERT(map6.at("insert01") == node1, "The element at insert01 is equal to node1."); + CCASSERT(map6.at("insert02") == node2, "The element at insert02 is equal to node2."); + CCASSERT(map6.at("insert03") == node3, "The element at insert03 is equal to node3."); // erase Map mapForErase = createMap(); mapForErase.erase(mapForErase.find("9")); - CCASSERT(mapForErase.find("9") == mapForErase.end(), ""); - CCASSERT(mapForErase.size() == 19, ""); + CCASSERT(mapForErase.find("9") == mapForErase.end(), "9 is already removed."); + CCASSERT(mapForErase.size() == 19, "mapForErase's size is 19."); mapForErase.erase("7"); - CCASSERT(mapForErase.find("7") == mapForErase.end(), ""); - CCASSERT(mapForErase.size() == 18, ""); + CCASSERT(mapForErase.find("7") == mapForErase.end(), "7 is already removed."); + CCASSERT(mapForErase.size() == 18, "mapForErase's size is 18."); std::vector itemsToRemove; itemsToRemove.push_back("2"); itemsToRemove.push_back("3"); itemsToRemove.push_back("4"); mapForErase.erase(itemsToRemove); - CCASSERT(mapForErase.size() == 15, ""); + CCASSERT(mapForErase.size() == 15, "mapForErase's size is 15."); // clear Map mapForClear = createMap(); @@ -490,7 +490,7 @@ void TemplateMapTest::onEnter() for (const auto& e : mapForClearCopy) { CC_UNUSED_PARAM(e); - CCASSERT(e.second->getReferenceCount() == 2, ""); + CCASSERT(e.second->getReferenceCount() == 2, "e.second's reference count is 2."); } // get random object @@ -507,21 +507,21 @@ void TemplateMapTest::onEnter() // Self assignment Map mapForSelfAssign = createMap(); mapForSelfAssign = mapForSelfAssign; - CCASSERT(mapForSelfAssign.size() == 20, ""); + CCASSERT(mapForSelfAssign.size() == 20, "mapForSelfAssign's size is 20."); for (const auto& e : mapForSelfAssign) { CC_UNUSED_PARAM(e); - CCASSERT(e.second->getReferenceCount() == 2, ""); + CCASSERT(e.second->getReferenceCount() == 2, "e.second's reference count is 2."); } mapForSelfAssign = std::move(mapForSelfAssign); - CCASSERT(mapForSelfAssign.size() == 20, ""); + CCASSERT(mapForSelfAssign.size() == 20, "mapForSelfAssign's size is 20."); for (const auto& e : mapForSelfAssign) { CC_UNUSED_PARAM(e); - CCASSERT(e.second->getReferenceCount() == 2, ""); + CCASSERT(e.second->getReferenceCount() == 2, "e.second's reference's count is 2."); } } @@ -543,37 +543,37 @@ void ValueTest::onEnter() UnitTestDemo::onEnter(); Value v1; - CCASSERT(v1.getType() == Value::Type::NONE, ""); - CCASSERT(v1.isNull(), ""); + CCASSERT(v1.getType() == Value::Type::NONE, "v1's value type should be VALUE::Type::NONE."); + CCASSERT(v1.isNull(), "v1 is null."); Value v2(100); - CCASSERT(v2.getType() == Value::Type::INTEGER, ""); - CCASSERT(!v2.isNull(), ""); + CCASSERT(v2.getType() == Value::Type::INTEGER, "v2's value type should be VALUE::Type::INTEGER."); + CCASSERT(!v2.isNull(), "v2 is not null."); Value v3(101.4f); - CCASSERT(v3.getType() == Value::Type::FLOAT, ""); - CCASSERT(!v3.isNull(), ""); + CCASSERT(v3.getType() == Value::Type::FLOAT, "v3's value type should be VALUE::Type::FLOAT."); + CCASSERT(!v3.isNull(), "v3 is not null."); Value v4(106.1); - CCASSERT(v4.getType() == Value::Type::DOUBLE, ""); - CCASSERT(!v4.isNull(), ""); + CCASSERT(v4.getType() == Value::Type::DOUBLE, "v4's value type should be VALUE::Type::DOUBLE."); + CCASSERT(!v4.isNull(), "v4 is not null."); unsigned char byte = 50; Value v5(byte); - CCASSERT(v5.getType() == Value::Type::BYTE, ""); - CCASSERT(!v5.isNull(), ""); + CCASSERT(v5.getType() == Value::Type::BYTE, "v5's value type should be Value::Type::BTYE."); + CCASSERT(!v5.isNull(), "v5 is not null."); Value v6(true); - CCASSERT(v6.getType() == Value::Type::BOOLEAN, ""); - CCASSERT(!v6.isNull(), ""); + CCASSERT(v6.getType() == Value::Type::BOOLEAN, "v6's value type is Value::Type::BOOLEAN."); + CCASSERT(!v6.isNull(), "v6 is not null."); Value v7("string"); - CCASSERT(v7.getType() == Value::Type::STRING, ""); - CCASSERT(!v7.isNull(), ""); + CCASSERT(v7.getType() == Value::Type::STRING, "v7's value type is Value::type::STRING."); + CCASSERT(!v7.isNull(), "v7 is not null."); Value v8(std::string("string2")); - CCASSERT(v8.getType() == Value::Type::STRING, ""); - CCASSERT(!v8.isNull(), ""); + CCASSERT(v8.getType() == Value::Type::STRING, "v8's value type is Value::Type::STRING."); + CCASSERT(!v8.isNull(), "v8 is not null."); auto createValueVector = [&](){ ValueVector ret; @@ -585,8 +585,8 @@ void ValueTest::onEnter() Value v9(createValueVector()); - CCASSERT(v9.getType() == Value::Type::VECTOR, ""); - CCASSERT(!v9.isNull(), ""); + CCASSERT(v9.getType() == Value::Type::VECTOR, "v9's value type is Value::Type::VECTOR."); + CCASSERT(!v9.isNull(), "v9 is not null."); auto createValueMap = [&](){ ValueMap ret; @@ -597,8 +597,8 @@ void ValueTest::onEnter() }; Value v10(createValueMap()); - CCASSERT(v10.getType() == Value::Type::MAP, ""); - CCASSERT(!v10.isNull(), ""); + CCASSERT(v10.getType() == Value::Type::MAP, "v10's value type is Value::Type::MAP."); + CCASSERT(!v10.isNull(), "v10 is not null."); auto createValueMapIntKey = [&](){ ValueMapIntKey ret; @@ -609,8 +609,8 @@ void ValueTest::onEnter() }; Value v11(createValueMapIntKey()); - CCASSERT(v11.getType() == Value::Type::INT_KEY_MAP, ""); - CCASSERT(!v11.isNull(), ""); + CCASSERT(v11.getType() == Value::Type::INT_KEY_MAP, "v11's value type is Value::Type::INT_KEY_MAP."); + CCASSERT(!v11.isNull(), "v11 is not null."); } std::string ValueTest::subtitle() const From efffea5b91cd45a7edba316d08711662d8c1ad51 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 14 Jul 2015 15:35:29 +0800 Subject: [PATCH 75/93] Fixed #12834 Invoke cleanup function when override in JS --- cocos/scripting/js-bindings/manual/ScriptingCore.cpp | 5 +++++ tests/js-tests/src/tests-main.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp index 6125f8551d..5b9c7a4ac7 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.cpp +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.cpp @@ -1034,6 +1034,11 @@ int ScriptingCore::handleNodeEvent(void* data) } else if (action == kNodeOnCleanup) { cleanupSchedulesAndActions(p); + + if (isFunctionOverridedInJS(JS::RootedObject(_cx, p->obj.get()), "cleanup", js_cocos2dx_Node_cleanup)) + { + ret = executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), "cleanup", 1, &dataVal, &retval); + } } return ret; diff --git a/tests/js-tests/src/tests-main.js b/tests/js-tests/src/tests-main.js index ea968c6b46..cec384a357 100644 --- a/tests/js-tests/src/tests-main.js +++ b/tests/js-tests/src/tests-main.js @@ -176,7 +176,7 @@ var TestController = cc.LayerGradient.extend({ return true; } }, this); - } + } }, onEnter:function(){ this._super(); From 97168fa139072226ea36a450a859ae14c955cf66 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 14 Jul 2015 15:43:14 +0800 Subject: [PATCH 76/93] add cocos framework build on linux platform. --- tools/framework-compile/bin/gen_cocos_libs.py | 4 +++- tools/framework-compile/bin/utils_cocos.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/framework-compile/bin/gen_cocos_libs.py b/tools/framework-compile/bin/gen_cocos_libs.py index a461c89feb..91975b471b 100755 --- a/tools/framework-compile/bin/gen_cocos_libs.py +++ b/tools/framework-compile/bin/gen_cocos_libs.py @@ -1,5 +1,5 @@ #!/usr/bin/python -#-*- coding: UTF-8 -*- +#-*- coding: utf-8 -*- import os import sys @@ -321,6 +321,8 @@ class CocosLibsCompiler(object): sys_folder_name = "windows%s" % bit_str elif utils_cocos.os_is_mac(): sys_folder_name = "darwin-x86_64" + elif utils_cocos.os_is_linux: + sys_folder_name = "linux-x86_64" # set strip execute file name if utils_cocos.os_is_win32(): diff --git a/tools/framework-compile/bin/utils_cocos.py b/tools/framework-compile/bin/utils_cocos.py index 9aac523c9b..e5b9505efb 100755 --- a/tools/framework-compile/bin/utils_cocos.py +++ b/tools/framework-compile/bin/utils_cocos.py @@ -1,5 +1,5 @@ #!/usr/bin/python -#-*- coding: UTF-8 -*- +#-*- coding: utf-8 -*- import os import sys @@ -19,6 +19,9 @@ def is_32bit_windows(): def os_is_mac(): return sys.platform == 'darwin' +def os_is_linux(): + return sys.platform == "linux" or sys.platform == "linux2" + def convert_to_python_path(path): return path.replace("\\","/") From 41778f35fb5ca3e9d49be3288ae92f036879bfc7 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 14 Jul 2015 16:33:38 +0800 Subject: [PATCH 77/93] Add cc.path.mainFileName --- cocos/scripting/js-bindings/script/jsb_boot.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cocos/scripting/js-bindings/script/jsb_boot.js b/cocos/scripting/js-bindings/script/jsb_boot.js index 09b4123a9c..ddd2066895 100644 --- a/cocos/scripting/js-bindings/script/jsb_boot.js +++ b/cocos/scripting/js-bindings/script/jsb_boot.js @@ -367,6 +367,20 @@ cc.path = { if(index < 0) return null; return pathStr.substring(index, pathStr.length); }, + + /** + * Get the main name of a file name + * @param {string} fileName + * @returns {string} + */ + mainFileName: function(fileName){ + if(fileName){ + var idx = fileName.lastIndexOf("."); + if(idx !== -1) + return fileName.substring(0,idx); + } + return fileName; + }, /** * Get the file name of a file path. From 55890f6206613674e86e180d30ecd057fb932fd7 Mon Sep 17 00:00:00 2001 From: Bin Zhang Date: Tue, 14 Jul 2015 18:07:17 +0800 Subject: [PATCH 78/93] Update the JS templates to keep the directory structure is same with before. --- .../cocos-project-template.json | 6 + templates/js-template-default/project.json | 2 +- .../cocos-project-template.json | 128 +----------------- templates/js-template-runtime/index.html | 28 ++++ .../js-template-runtime/runtime/config.json | 6 - tools/travis-scripts/config.gitingore | 3 + .../travis-scripts/generate-template-files.py | 2 +- 7 files changed, 41 insertions(+), 134 deletions(-) create mode 100644 templates/js-template-runtime/index.html delete mode 100644 templates/js-template-runtime/runtime/config.json diff --git a/templates/js-template-default/cocos-project-template.json b/templates/js-template-default/cocos-project-template.json index a19eb38efc..11f9116ab0 100644 --- a/templates/js-template-default/cocos-project-template.json +++ b/templates/js-template-default/cocos-project-template.json @@ -2,6 +2,12 @@ "do_default":{ "exclude_from_template":[ "frameworks/runtime-src" + ], + "append_dir": [ + { + "from": "web", + "to": "frameworks/cocos2d-html5" + } ] }, "do_add_native_support":{ diff --git a/templates/js-template-default/project.json b/templates/js-template-default/project.json index 6a7f37a61e..e54f870660 100644 --- a/templates/js-template-default/project.json +++ b/templates/js-template-default/project.json @@ -6,7 +6,7 @@ "frameRate" : 60, "id" : "gameCanvas", "renderMode" : 0, - "engineDir":"frameworks/cocos2d-x/web", + "engineDir":"frameworks/cocos2d-html5", "modules" : ["cocos2d"], diff --git a/templates/js-template-runtime/cocos-project-template.json b/templates/js-template-runtime/cocos-project-template.json index bd0493afb6..133594b49c 100644 --- a/templates/js-template-runtime/cocos-project-template.json +++ b/templates/js-template-runtime/cocos-project-template.json @@ -12,132 +12,8 @@ }, "append_dir":[ { - "from":"plugin/plugins/facebook/proj.android/DependProject/src", - "to":"frameworks/cocos2d-x/plugin/plugins/facebook/proj.android/DependProject/src" - }, - { - "from":"cocos/scripting/js-bindings/script", - "to":"runtime/mac/PrebuiltRuntimeJs.app/Contents/Resources/script", - "exclude":[] - }, - { - "from":"cocos/scripting/js-bindings/script", - "to":"runtime/ios/PrebuiltRuntimeJs.app/script", - "exclude":[] - }, - { - "from":"cocos/scripting/js-bindings/script", - "to":"runtime/win32/script", - "exclude":[] - }, - { - "from":"templates/js-template-runtime/src", - "to":"runtime/win32/src", - "exclude":[] - }, - { - "from":"templates/js-template-runtime/res", - "to":"runtime/win32/res", - "exclude":[] - }, - { - "from":"external/win32-specific/gles/prebuilt", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/win32-specific/icon/prebuilt", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/win32-specific/MP3Decoder/prebuilt", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/win32-specific/OggDecoder/prebuilt", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/win32-specific/OpenalSoft/prebuilt", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/win32-specific/zlib/prebuilt", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/curl/prebuilt/win32", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/sqlite3/libraries/win32", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/websockets/prebuilt/win32", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/tiff/prebuilt/win32", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - }, - { - "from":"external/spidermonkey/prebuilt/win32", - "to":"runtime/win32", - "include": [ - "*.dll" - ] - } - ], - "append_file":[ - { - "from":"tools/simulator/frameworks/runtime-src/Classes/ide-support/lang", - "to":"runtime/win32/lang" - }, - { - "from":"templates/js-template-runtime/project.json", - "to":"runtime/ios/PrebuiltRuntimeJs.app/project.json" - }, - { - "from":"templates/js-template-runtime/project.json", - "to":"runtime/win32/project.json" - }, - { - "from":"templates/js-template-runtime/config.json", - "to":"runtime/win32/config.json" - }, - { - "from":"templates/js-template-runtime/main.js", - "to":"runtime/win32/main.js" + "from": "web", + "to": "frameworks/cocos2d-html5" } ] }, diff --git a/templates/js-template-runtime/index.html b/templates/js-template-runtime/index.html new file mode 100644 index 0000000000..42074ad179 --- /dev/null +++ b/templates/js-template-runtime/index.html @@ -0,0 +1,28 @@ + + + + + Cocos2d-html5 Hello World test + + + + + + + + + + + + + + + diff --git a/templates/js-template-runtime/runtime/config.json b/templates/js-template-runtime/runtime/config.json deleted file mode 100644 index 1449e545c1..0000000000 --- a/templates/js-template-runtime/runtime/config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version":"v4-js-runtime-1.0", - "zip_file_size":"43441816", - "repo_name":"cocos-runtime-bin", - "repo_parent":"https://github.com/natural-law/" -} diff --git a/tools/travis-scripts/config.gitingore b/tools/travis-scripts/config.gitingore index 353a34f319..0bdd37991a 100644 --- a/tools/travis-scripts/config.gitingore +++ b/tools/travis-scripts/config.gitingore @@ -109,6 +109,9 @@ Device-Release/ # CTags tags +# Ignore web dir +/web + #include !/tools/cocos2d-console/console/bin/ !/plugin-x/plugin-x_ios.xcworkspace/ diff --git a/tools/travis-scripts/generate-template-files.py b/tools/travis-scripts/generate-template-files.py index 43df0dfc87..29aea90a17 100755 --- a/tools/travis-scripts/generate-template-files.py +++ b/tools/travis-scripts/generate-template-files.py @@ -45,7 +45,7 @@ class CocosFileList: self.fileList_js=[] self.luaPath = ["cocos/scripting/lua-bindings", "external/lua", "tools/bindings-generator", "tools/tolua"] - self.jsPath = ["cocos/scripting/js-bindings", "external/spidermonkey", "tools/bindings-generator", "tools/tojs", "web"] + self.jsPath = ["cocos/scripting/js-bindings", "external/spidermonkey", "tools/bindings-generator", "tools/tojs" ] def readIngoreFile(self, fileName): """ From 3ba4d7230e51b4ec4541c5653f42438c212f3e7a Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 14 Jul 2015 10:15:18 +0000 Subject: [PATCH 79/93] [AUTO][ci skip]: updating cocos2dx_files.json --- templates/cocos2dx_files.json | 362 +--------------------------------- 1 file changed, 1 insertion(+), 361 deletions(-) diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 61eaec237c..3b1f9847f8 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -6450,367 +6450,7 @@ "tools/tojs/cocos2dx_spine.ini", "tools/tojs/cocos2dx_studio.ini", "tools/tojs/cocos2dx_ui.ini", - "tools/tojs/genbindings.py", - "web/AUTHORS.txt", - "web/Base64Images.js", - "web/CCBoot.js", - "web/CCDebugger.js", - "web/CHANGELOG.txt", - "web/README.mdown", - "web/bower.json", - "web/cocos2d/actions/CCAction.js", - "web/cocos2d/actions/CCActionCamera.js", - "web/cocos2d/actions/CCActionCatmullRom.js", - "web/cocos2d/actions/CCActionEase.js", - "web/cocos2d/actions/CCActionInstant.js", - "web/cocos2d/actions/CCActionInterval.js", - "web/cocos2d/actions/CCActionTween.js", - "web/cocos2d/actions3d/CCActionGrid.js", - "web/cocos2d/actions3d/CCActionGrid3D.js", - "web/cocos2d/actions3d/CCActionPageTurn3D.js", - "web/cocos2d/actions3d/CCActionTiledGrid.js", - "web/cocos2d/audio/CCAudio.js", - "web/cocos2d/clipping-nodes/CCClippingNode.js", - "web/cocos2d/clipping-nodes/CCClippingNodeCanvasRenderCmd.js", - "web/cocos2d/clipping-nodes/CCClippingNodeWebGLRenderCmd.js", - "web/cocos2d/compression/ZipUtils.js", - "web/cocos2d/compression/base64.js", - "web/cocos2d/compression/gzip.js", - "web/cocos2d/compression/zlib.min.js", - "web/cocos2d/core/CCActionManager.js", - "web/cocos2d/core/CCCamera.js", - "web/cocos2d/core/CCConfiguration.js", - "web/cocos2d/core/CCDirector.js", - "web/cocos2d/core/CCDirectorWebGL.js", - "web/cocos2d/core/CCDrawingPrimitivesCanvas.js", - "web/cocos2d/core/CCDrawingPrimitivesWebGL.js", - "web/cocos2d/core/CCScheduler.js", - "web/cocos2d/core/base-nodes/BaseNodesPropertyDefine.js", - "web/cocos2d/core/base-nodes/CCAtlasNode.js", - "web/cocos2d/core/base-nodes/CCAtlasNodeCanvasRenderCmd.js", - "web/cocos2d/core/base-nodes/CCAtlasNodeWebGLRenderCmd.js", - "web/cocos2d/core/base-nodes/CCNode.js", - "web/cocos2d/core/base-nodes/CCNodeCanvasRenderCmd.js", - "web/cocos2d/core/base-nodes/CCNodeWebGLRenderCmd.js", - "web/cocos2d/core/cocoa/CCAffineTransform.js", - "web/cocos2d/core/cocoa/CCGeometry.js", - "web/cocos2d/core/cocos2d_externs.js", - "web/cocos2d/core/event-manager/CCEvent.js", - "web/cocos2d/core/event-manager/CCEventExtension.js", - "web/cocos2d/core/event-manager/CCEventListener.js", - "web/cocos2d/core/event-manager/CCEventManager.js", - "web/cocos2d/core/event-manager/CCTouch.js", - "web/cocos2d/core/labelttf/CCLabelTTF.js", - "web/cocos2d/core/labelttf/CCLabelTTFCanvasRenderCmd.js", - "web/cocos2d/core/labelttf/CCLabelTTFWebGLRenderCmd.js", - "web/cocos2d/core/labelttf/LabelTTFPropertyDefine.js", - "web/cocos2d/core/layers/CCLayer.js", - "web/cocos2d/core/layers/CCLayerCanvasRenderCmd.js", - "web/cocos2d/core/layers/CCLayerWebGLRenderCmd.js", - "web/cocos2d/core/platform/CCClass.js", - "web/cocos2d/core/platform/CCCommon.js", - "web/cocos2d/core/platform/CCConfig.js", - "web/cocos2d/core/platform/CCEGLView.js", - "web/cocos2d/core/platform/CCInputExtension.js", - "web/cocos2d/core/platform/CCInputManager.js", - "web/cocos2d/core/platform/CCLoaders.js", - "web/cocos2d/core/platform/CCMacro.js", - "web/cocos2d/core/platform/CCSAXParser.js", - "web/cocos2d/core/platform/CCScreen.js", - "web/cocos2d/core/platform/CCTypes.js", - "web/cocos2d/core/platform/CCTypesPropertyDefine.js", - "web/cocos2d/core/platform/CCTypesWebGL.js", - "web/cocos2d/core/platform/CCVisibleRect.js", - "web/cocos2d/core/platform/miniFramework.js", - "web/cocos2d/core/renderer/RendererCanvas.js", - "web/cocos2d/core/renderer/RendererWebGL.js", - "web/cocos2d/core/scenes/CCLoaderScene.js", - "web/cocos2d/core/scenes/CCScene.js", - "web/cocos2d/core/sprites/CCAnimation.js", - "web/cocos2d/core/sprites/CCAnimationCache.js", - "web/cocos2d/core/sprites/CCBakeSprite.js", - "web/cocos2d/core/sprites/CCSprite.js", - "web/cocos2d/core/sprites/CCSpriteBatchNode.js", - "web/cocos2d/core/sprites/CCSpriteBatchNodeCanvasRenderCmd.js", - "web/cocos2d/core/sprites/CCSpriteBatchNodeWebGLRenderCmd.js", - "web/cocos2d/core/sprites/CCSpriteCanvasRenderCmd.js", - "web/cocos2d/core/sprites/CCSpriteFrame.js", - "web/cocos2d/core/sprites/CCSpriteFrameCache.js", - "web/cocos2d/core/sprites/CCSpriteWebGLRenderCmd.js", - "web/cocos2d/core/sprites/SpritesPropertyDefine.js", - "web/cocos2d/core/support/CCPointExtension.js", - "web/cocos2d/core/support/CCVertex.js", - "web/cocos2d/core/support/TransformUtils.js", - "web/cocos2d/core/textures/CCTexture2D.js", - "web/cocos2d/core/textures/CCTextureAtlas.js", - "web/cocos2d/core/textures/CCTextureCache.js", - "web/cocos2d/core/textures/TexturesPropertyDefine.js", - "web/cocos2d/core/textures/TexturesWebGL.js", - "web/cocos2d/core/utils/BinaryLoader.js", - "web/cocos2d/effects/CCGrabber.js", - "web/cocos2d/effects/CCGrid.js", - "web/cocos2d/kazmath/SIMDPolyfill.js", - "web/cocos2d/kazmath/aabb.js", - "web/cocos2d/kazmath/gl/mat4stack.js", - "web/cocos2d/kazmath/gl/matrix.js", - "web/cocos2d/kazmath/mat3.js", - "web/cocos2d/kazmath/mat4.js", - "web/cocos2d/kazmath/mat4SIMD.js", - "web/cocos2d/kazmath/plane.js", - "web/cocos2d/kazmath/quaternion.js", - "web/cocos2d/kazmath/ray2.js", - "web/cocos2d/kazmath/simd_benchmark/base.js", - "web/cocos2d/kazmath/simd_benchmark/index.html", - "web/cocos2d/kazmath/simd_benchmark/kernel-template.js", - "web/cocos2d/kazmath/simd_benchmark/kmMat4AreEqual.js", - "web/cocos2d/kazmath/simd_benchmark/kmMat4Assign.js", - "web/cocos2d/kazmath/simd_benchmark/kmMat4Inverse.js", - "web/cocos2d/kazmath/simd_benchmark/kmMat4IsIdentity.js", - "web/cocos2d/kazmath/simd_benchmark/kmMat4LookAt.js", - "web/cocos2d/kazmath/simd_benchmark/kmMat4Multiply.js", - "web/cocos2d/kazmath/simd_benchmark/kmMat4Transpose.js", - "web/cocos2d/kazmath/simd_benchmark/kmVec3TransformCoord.js", - "web/cocos2d/kazmath/simd_benchmark/run.js", - "web/cocos2d/kazmath/simd_benchmark/run_browser.js", - "web/cocos2d/kazmath/utility.js", - "web/cocos2d/kazmath/vec2.js", - "web/cocos2d/kazmath/vec3.js", - "web/cocos2d/kazmath/vec3SIMD.js", - "web/cocos2d/kazmath/vec4.js", - "web/cocos2d/labels/CCLabelAtlas.js", - "web/cocos2d/labels/CCLabelAtlasCanvasRenderCmd.js", - "web/cocos2d/labels/CCLabelAtlasWebGLRenderCmd.js", - "web/cocos2d/labels/CCLabelBMFont.js", - "web/cocos2d/labels/CCLabelBMFontCanvasRenderCmd.js", - "web/cocos2d/labels/CCLabelBMFontWebGLRenderCmd.js", - "web/cocos2d/menus/CCMenu.js", - "web/cocos2d/menus/CCMenuItem.js", - "web/cocos2d/motion-streak/CCMotionStreak.js", - "web/cocos2d/motion-streak/CCMotionStreakWebGLRenderCmd.js", - "web/cocos2d/node-grid/CCNodeGrid.js", - "web/cocos2d/node-grid/CCNodeGridWebGLRenderCmd.js", - "web/cocos2d/parallax/CCParallaxNode.js", - "web/cocos2d/parallax/CCParallaxNodeRenderCmd.js", - "web/cocos2d/particle/CCPNGReader.js", - "web/cocos2d/particle/CCParticleBatchNode.js", - "web/cocos2d/particle/CCParticleBatchNodeCanvasRenderCmd.js", - "web/cocos2d/particle/CCParticleBatchNodeWebGLRenderCmd.js", - "web/cocos2d/particle/CCParticleExamples.js", - "web/cocos2d/particle/CCParticleSystem.js", - "web/cocos2d/particle/CCParticleSystemCanvasRenderCmd.js", - "web/cocos2d/particle/CCParticleSystemWebGLRenderCmd.js", - "web/cocos2d/particle/CCTIFFReader.js", - "web/cocos2d/physics/CCPhysicsDebugNode.js", - "web/cocos2d/physics/CCPhysicsDebugNodeCanvasRenderCmd.js", - "web/cocos2d/physics/CCPhysicsDebugNodeWebGLRenderCmd.js", - "web/cocos2d/physics/CCPhysicsSprite.js", - "web/cocos2d/physics/CCPhysicsSpriteCanvasRenderCmd.js", - "web/cocos2d/physics/CCPhysicsSpriteWebGLRenderCmd.js", - "web/cocos2d/progress-timer/CCActionProgressTimer.js", - "web/cocos2d/progress-timer/CCProgressTimer.js", - "web/cocos2d/progress-timer/CCProgressTimerCanvasRenderCmd.js", - "web/cocos2d/progress-timer/CCProgressTimerWebGLRenderCmd.js", - "web/cocos2d/render-texture/CCRenderTexture.js", - "web/cocos2d/render-texture/CCRenderTextureCanvasRenderCmd.js", - "web/cocos2d/render-texture/CCRenderTextureWebGLRenderCmd.js", - "web/cocos2d/shaders/CCGLProgram.js", - "web/cocos2d/shaders/CCGLStateCache.js", - "web/cocos2d/shaders/CCShaderCache.js", - "web/cocos2d/shaders/CCShaders.js", - "web/cocos2d/shape-nodes/CCDrawNode.js", - "web/cocos2d/shape-nodes/CCDrawNodeCanvasRenderCmd.js", - "web/cocos2d/shape-nodes/CCDrawNodeWebGLRenderCmd.js", - "web/cocos2d/text-input/CCIMEDispatcher.js", - "web/cocos2d/text-input/CCTextFieldTTF.js", - "web/cocos2d/tilemap/CCTGAlib.js", - "web/cocos2d/tilemap/CCTMXLayer.js", - "web/cocos2d/tilemap/CCTMXLayerCanvasRenderCmd.js", - "web/cocos2d/tilemap/CCTMXLayerWebGLRenderCmd.js", - "web/cocos2d/tilemap/CCTMXObjectGroup.js", - "web/cocos2d/tilemap/CCTMXTiledMap.js", - "web/cocos2d/tilemap/CCTMXXMLParser.js", - "web/cocos2d/transitions/CCTransition.js", - "web/cocos2d/transitions/CCTransitionPageTurn.js", - "web/cocos2d/transitions/CCTransitionProgress.js", - "web/extensions/ccb-reader/CCBAnimationManager.js", - "web/extensions/ccb-reader/CCBKeyframe.js", - "web/extensions/ccb-reader/CCBReader.js", - "web/extensions/ccb-reader/CCBReaderUtil.js", - "web/extensions/ccb-reader/CCBRelativePositioning.js", - "web/extensions/ccb-reader/CCBSequence.js", - "web/extensions/ccb-reader/CCBValue.js", - "web/extensions/ccb-reader/CCControlLoader.js", - "web/extensions/ccb-reader/CCNodeLoader.js", - "web/extensions/ccb-reader/CCNodeLoaderLibrary.js", - "web/extensions/ccb-reader/CCSpriteLoader.js", - "web/extensions/ccpool/CCPool.js", - "web/extensions/ccui/base-classes/CCProtectedNode.js", - "web/extensions/ccui/base-classes/CCProtectedNodeCanvasRenderCmd.js", - "web/extensions/ccui/base-classes/CCProtectedNodeWebGLRenderCmd.js", - "web/extensions/ccui/base-classes/UIScale9Sprite.js", - "web/extensions/ccui/base-classes/UIScale9SpriteCanvasRenderCmd.js", - "web/extensions/ccui/base-classes/UIScale9SpriteWebGLRenderCmd.js", - "web/extensions/ccui/base-classes/UIWidget.js", - "web/extensions/ccui/base-classes/UIWidgetRenderCmd.js", - "web/extensions/ccui/layouts/UIHBox.js", - "web/extensions/ccui/layouts/UILayout.js", - "web/extensions/ccui/layouts/UILayoutCanvasRenderCmd.js", - "web/extensions/ccui/layouts/UILayoutComponent.js", - "web/extensions/ccui/layouts/UILayoutManager.js", - "web/extensions/ccui/layouts/UILayoutParameter.js", - "web/extensions/ccui/layouts/UILayoutWebGLRenderCmd.js", - "web/extensions/ccui/layouts/UIRelativeBox.js", - "web/extensions/ccui/layouts/UIVBox.js", - "web/extensions/ccui/system/CocosGUI.js", - "web/extensions/ccui/system/UIHelper.js", - "web/extensions/ccui/uiwidgets/UIButton.js", - "web/extensions/ccui/uiwidgets/UICheckBox.js", - "web/extensions/ccui/uiwidgets/UIImageView.js", - "web/extensions/ccui/uiwidgets/UILoadingBar.js", - "web/extensions/ccui/uiwidgets/UIRichText.js", - "web/extensions/ccui/uiwidgets/UISlider.js", - "web/extensions/ccui/uiwidgets/UIText.js", - "web/extensions/ccui/uiwidgets/UITextAtlas.js", - "web/extensions/ccui/uiwidgets/UITextBMFont.js", - "web/extensions/ccui/uiwidgets/UITextField.js", - "web/extensions/ccui/uiwidgets/UIVideoPlayer.js", - "web/extensions/ccui/uiwidgets/UIWebView.js", - "web/extensions/ccui/uiwidgets/scroll-widget/UIListView.js", - "web/extensions/ccui/uiwidgets/scroll-widget/UIPageView.js", - "web/extensions/ccui/uiwidgets/scroll-widget/UIScrollView.js", - "web/extensions/cocostudio/CocoStudio.js", - "web/extensions/cocostudio/action/CCActionFrame.js", - "web/extensions/cocostudio/action/CCActionManager.js", - "web/extensions/cocostudio/action/CCActionNode.js", - "web/extensions/cocostudio/action/CCActionObject.js", - "web/extensions/cocostudio/armature/CCArmature.js", - "web/extensions/cocostudio/armature/CCArmatureCanvasRenderCmd.js", - "web/extensions/cocostudio/armature/CCArmatureWebGLRenderCmd.js", - "web/extensions/cocostudio/armature/CCBone.js", - "web/extensions/cocostudio/armature/animation/CCArmatureAnimation.js", - "web/extensions/cocostudio/armature/animation/CCProcessBase.js", - "web/extensions/cocostudio/armature/animation/CCTween.js", - "web/extensions/cocostudio/armature/datas/CCDatas.js", - "web/extensions/cocostudio/armature/display/CCBatchNode.js", - "web/extensions/cocostudio/armature/display/CCDecorativeDisplay.js", - "web/extensions/cocostudio/armature/display/CCDisplayFactory.js", - "web/extensions/cocostudio/armature/display/CCDisplayManager.js", - "web/extensions/cocostudio/armature/display/CCSkin.js", - "web/extensions/cocostudio/armature/display/CCSkinCanvasRenderCmd.js", - "web/extensions/cocostudio/armature/display/CCSkinWebGLRenderCmd.js", - "web/extensions/cocostudio/armature/physics/CCColliderDetector.js", - "web/extensions/cocostudio/armature/utils/CCArmatureDataManager.js", - "web/extensions/cocostudio/armature/utils/CCArmatureDefine.js", - "web/extensions/cocostudio/armature/utils/CCDataReaderHelper.js", - "web/extensions/cocostudio/armature/utils/CCSpriteFrameCacheHelper.js", - "web/extensions/cocostudio/armature/utils/CCTransformHelp.js", - "web/extensions/cocostudio/armature/utils/CCTweenFunction.js", - "web/extensions/cocostudio/armature/utils/CCUtilMath.js", - "web/extensions/cocostudio/components/CCComAttribute.js", - "web/extensions/cocostudio/components/CCComAudio.js", - "web/extensions/cocostudio/components/CCComController.js", - "web/extensions/cocostudio/components/CCComRender.js", - "web/extensions/cocostudio/components/CCComponent.js", - "web/extensions/cocostudio/components/CCComponentContainer.js", - "web/extensions/cocostudio/loader/load.js", - "web/extensions/cocostudio/loader/parsers/action-1.x.js", - "web/extensions/cocostudio/loader/parsers/action-2.x.js", - "web/extensions/cocostudio/loader/parsers/compatible.js", - "web/extensions/cocostudio/loader/parsers/scene-1.x.js", - "web/extensions/cocostudio/loader/parsers/timelineParser-1.x.js", - "web/extensions/cocostudio/loader/parsers/timelineParser-2.x.js", - "web/extensions/cocostudio/loader/parsers/uiParser-1.x.js", - "web/extensions/cocostudio/timeline/ActionTimeline.js", - "web/extensions/cocostudio/timeline/Frame.js", - "web/extensions/cocostudio/timeline/Timeline.js", - "web/extensions/cocostudio/trigger/ObjectFactory.js", - "web/extensions/cocostudio/trigger/TriggerBase.js", - "web/extensions/cocostudio/trigger/TriggerMng.js", - "web/extensions/cocostudio/trigger/TriggerObj.js", - "web/extensions/editbox/CCEditBox.js", - "web/extensions/editbox/CCdomNode.js", - "web/extensions/gui/control-extension/CCControl.js", - "web/extensions/gui/control-extension/CCControlButton.js", - "web/extensions/gui/control-extension/CCControlColourPicker.js", - "web/extensions/gui/control-extension/CCControlHuePicker.js", - "web/extensions/gui/control-extension/CCControlPotentiometer.js", - "web/extensions/gui/control-extension/CCControlSaturationBrightnessPicker.js", - "web/extensions/gui/control-extension/CCControlSlider.js", - "web/extensions/gui/control-extension/CCControlStepper.js", - "web/extensions/gui/control-extension/CCControlSwitch.js", - "web/extensions/gui/control-extension/CCControlUtils.js", - "web/extensions/gui/control-extension/CCInvocation.js", - "web/extensions/gui/control-extension/CCMenuPassive.js", - "web/extensions/gui/control-extension/CCScale9Sprite.js", - "web/extensions/gui/control-extension/CCScale9SpriteCanvasRenderCmd.js", - "web/extensions/gui/control-extension/CCScale9SpriteWebGLRenderCmd.js", - "web/extensions/gui/scrollview/CCScrollView.js", - "web/extensions/gui/scrollview/CCScrollViewCanvasRenderCmd.js", - "web/extensions/gui/scrollview/CCScrollViewWebGLRenderCmd.js", - "web/extensions/gui/scrollview/CCSorting.js", - "web/extensions/gui/scrollview/CCTableView.js", - "web/extensions/spine/CCSkeleton.js", - "web/extensions/spine/CCSkeletonAnimation.js", - "web/extensions/spine/CCSkeletonCanvasRenderCmd.js", - "web/extensions/spine/CCSkeletonWebGLRenderCmd.js", - "web/extensions/spine/Spine.js", - "web/external/box2d/box2d.js", - "web/external/chipmunk/chipmunk.js", - "web/external/gaf/GAFBoot.js", - "web/external/gaf/GAFMacros.js", - "web/external/gaf/Library/GAFAsset.js", - "web/external/gaf/Library/GAFAssetPreload.js", - "web/external/gaf/Library/GAFAtlasLoader.js", - "web/external/gaf/Library/GAFDataReader.js", - "web/external/gaf/Library/GAFLoader.js", - "web/external/gaf/Library/GAFMask.js", - "web/external/gaf/Library/GAFMaskProto.js", - "web/external/gaf/Library/GAFObject.js", - "web/external/gaf/Library/GAFShaderManager.js", - "web/external/gaf/Library/GAFShaders.js", - "web/external/gaf/Library/GAFSprite.js", - "web/external/gaf/Library/GAFSpriteCanvasRenderCmd.js", - "web/external/gaf/Library/GAFSpriteProto.js", - "web/external/gaf/Library/GAFSpriteWebGLRenderCmd.js", - "web/external/gaf/Library/GAFTags.js", - "web/external/gaf/Library/GAFTextField.js", - "web/external/gaf/Library/GAFTimeLine.js", - "web/external/gaf/Library/GAFTimeLineProto.js", - "web/external/gaf/gaf_viewer.css", - "web/external/gaf/gaf_viewer.html", - "web/external/gaf/gaf_viewer.js", - "web/external/pluginx/Plugin.js", - "web/external/pluginx/platform/facebook.js", - "web/external/pluginx/platform/facebook_sdk.js", - "web/external/socketio/socket.io.js", - "web/external/socketio/socket.io.min.js", - "web/jsb_apis.js", - "web/licenses/LICENSE_cocos2d-html5.txt", - "web/licenses/LICENSE_cocos2d-x.txt", - "web/licenses/LICENSE_zlib.js.txt", - "web/moduleConfig.json", - "web/template/index.html", - "web/template/main.js", - "web/template/project.json", - "web/template/res/HD/CloseNormal.png", - "web/template/res/HD/CloseSelected.png", - "web/template/res/HD/HelloWorld.jpg", - "web/template/res/Normal/CloseNormal.png", - "web/template/res/Normal/CloseSelected.png", - "web/template/res/Normal/HelloWorld.jpg", - "web/template/res/favicon.ico", - "web/template/res/loading.js", - "web/template/src/myApp.js", - "web/template/src/resource.js", - "web/tools/XmlCheck.js", - "web/tools/build.xml", - "web/tools/compiler/compiler.jar", - "web/tools/core4cc.js", - "web/tools/genBuildXml.js", - "web/tools/jsdoc_toolkit/build.xml", - "web/tools/publish.js", - "web/tools/readme for tools.txt", - "web/tools/template/build.xml" + "tools/tojs/genbindings.py" ], "lua": [ "cocos/scripting/lua-bindings/CMakeLists.txt", From 909ff572314af6d55448ab16655dee05ac01623c Mon Sep 17 00:00:00 2001 From: VisualSj Date: Tue, 14 Jul 2015 18:21:03 +0800 Subject: [PATCH 80/93] update we index --- web | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web b/web index 04de1400b6..4ba369df8d 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 04de1400b6032ef15c9e9bd53548720ff82e3c5f +Subproject commit 4ba369df8d4298a7d0da64c094a596a97a747c1d From c126aac35f0775f856a605cbe6e6322a966a40cf Mon Sep 17 00:00:00 2001 From: pandamicro Date: Tue, 14 Jul 2015 23:21:34 +0800 Subject: [PATCH 81/93] v3.7 rc1 release doc --- CHANGELOG | 29 +++++++++++++++++++ cocos/cocos2d.cpp | 2 +- .../js-bindings/manual/ScriptingCore.h | 2 +- .../js-bindings/script/jsb_cocos2d.js | 2 +- docs/RELEASE_NOTES.md | 14 ++++----- web | 2 +- 6 files changed, 40 insertions(+), 11 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index fee44d0878..7fb3782b9c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,35 @@ cocos2d-x-3.8 ?? [FIX] renderer: UI component can't click correctly by moving UI and camera far away of origin. [FIX] JS: Fixed issue of iOS/JS reflection `callStaticMethod` with bool arg +cocos2d-x-3.7rc1 July.14 2015 + [REFINE] framework: Used msbuild to generating engine prebuilt libs on win32. + [REFINE] 3d: Used shader with normal while creating mesh with normals + [REFINE] 3d: Set default 3d animation quality to low + [REFINE] web: Improved localStorage warning when disabled + + [FIX] studio: Fixed percentage setting won't take effect when UISlider's background resource set to null + [FIX] studio: Fixed a bug that SingleNode's color isn't set + [FIX] studio: Fixed child nodes can't be rendered when particle and TiledMap as parent and their resource have been removed from disk + [FIX] studio: Fixed a bug of JSON parser that texture address is wrong + [FIX] studio: Fixed a bug that drawLine & drawPoints don't apply blend function in parser + [FIX] studio: Fixed a bug that check box front cross texture will expand to normal size when change status between normal and disable frequently + [FIX] studio: Fixed a bug that normal texture won't show when slider set to disable mode then clean slider ball disable texture + [FIX] 3d: Fixed obj loading failed on windows + [FIX] 3d: Fixed clipping node does not work for Sprite3D + [FIX] platform: Fixed js template run error on linux + [FIX] Tilemap: Fixed CCTMXXMLParser code negligence + [FIX] JS: Fixed constant value error for ccui.Layout.BACKGROUND_IMAGE_ZORDER + [FIX] JS: Fixed XMLHttpRequest can't be retain in JSB + [FIX] JS: Added cc.path.mainFileName + [FIX] JS: Fixed issue that override cleanup function in JS can't get invoked during node detaching + [FIX] JS: Fixed cc.loader notification issue with image asynchonous loading + [FIX] web: Fixed MenuItems' color/opacity setter issue with child nodes + [FIX] web: Fixed page view's layout issue for JSON parser + [FIX] web: Add ttc loader and prevent the pure digital fonts is invalid + [FIX] web: Fixed Float32Array initialization + [FIX] web: Fixed a bug that layout background is missing + [FIX] web: Fixed a bug that ObjectExtensionData miss setCustomProperty and getCustomProperty function + cocos2d-x-3.7rc0 July.1 2015 [HIGHLIGHT] core: Added Material system (JS/Lua ready) [HIGHLIGHT] 3d: Added Physics3d support (JS/Lua ready) diff --git a/cocos/cocos2d.cpp b/cocos/cocos2d.cpp index 70620fcb79..6025f37084 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.7rc0"; + return "cocos2d-x-3.7rc1"; } NS_CC_END diff --git a/cocos/scripting/js-bindings/manual/ScriptingCore.h b/cocos/scripting/js-bindings/manual/ScriptingCore.h index 5a3ddacdd9..bbd324032e 100644 --- a/cocos/scripting/js-bindings/manual/ScriptingCore.h +++ b/cocos/scripting/js-bindings/manual/ScriptingCore.h @@ -39,7 +39,7 @@ #include #include -#define ENGINE_VERSION "Cocos2d-JS v3.7 RC0" +#define ENGINE_VERSION "Cocos2d-JS v3.7 RC1" void js_log(const char *format, ...); diff --git a/cocos/scripting/js-bindings/script/jsb_cocos2d.js b/cocos/scripting/js-bindings/script/jsb_cocos2d.js index 9d4e2aa266..3cd454e0fb 100644 --- a/cocos/scripting/js-bindings/script/jsb_cocos2d.js +++ b/cocos/scripting/js-bindings/script/jsb_cocos2d.js @@ -26,7 +26,7 @@ // CCConfig.js // -cc.ENGINE_VERSION = "Cocos2d-JS v3.7 RC0"; +cc.ENGINE_VERSION = "Cocos2d-JS v3.7 RC1"; cc.FIX_ARTIFACTS_BY_STRECHING_TEXEL = 0; cc.DIRECTOR_STATS_POSITION = {x: 0, y: 0}; diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 796ab78e82..afebd694fb 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -2,7 +2,7 @@ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* -- [Cocos2d-x v3.7 RC0 Release Notes](#cocos2d-x-v37-rc0-release-notes) +- [Cocos2d-x v3.7 RC1 Release Notes](#cocos2d-x-v37-rc0-release-notes) - [Misc Information](#misc-information) - [Requirements](#requirements) - [Runtime Requirements](#runtime-requirements) @@ -32,7 +32,7 @@ -# Cocos2d-x v3.7 RC0 Release Notes # +# Cocos2d-x v3.7 RC1 Release Notes # # Misc Information @@ -169,11 +169,11 @@ cocos new -l cpp|js|lua MyGame * JS: Merged JSB and web engine into Cocos2d-x for a All-in-one engine * JS: Added `ccui.VideoPlayer` and `ccui.WebView` for iOS/Android/Web * console: Supported build & run Android Studio project with cocos console -* sdkbox: super EASY way to integrate 3rd party SDKs into cocos2d-x +* SDKBOX: super EASY way to integrate 3rd party SDKs into cocos2d-x ## Download -[Cocos2d-x v3.7 RC0](http://www.cocos2d-x.org/filedown/cocos2d-x-3.7rc0.zip) including : C++, Lua & JS +[Cocos2d-x v3.7 RC1](http://www.cocos2d-x.org/filedown/cocos2d-x-3.7rc1.zip) including : C++, Lua & JS ## The main features in detail: @@ -237,11 +237,14 @@ Samsung have provided a series of Enhanced API to optimize Cocos2d-x games for S In the previous versions, the resources file name's case is ignored on win32 platform, but not ignored in other platforms. This will lead to some unexpected issues, especially when user develop with win32 platform and pulish to other platforms like Android. In win32, the file name may be found without matching the case, but on other platforms it won't be found. So we decided to make win32 platform's resources case sensitive. Please make sure you are using the correct file name for your resources. ### SDKBOX + SDKBOX is a project that's built by part of the cocos2d-x team, in order to makes integrating 3rd party SDKs super EASY. With SDKBOX you can integrate services like In App Purchase with one command + ``` sdkbox import -b iap ``` + Currently supported service including * [Tune](http://cocos2d-x.org/sdkbox/tune) @@ -253,9 +256,6 @@ Currently supported service including * [Google Analytics](http://cocos2d-x.org/sdkbox/googleanalytics) * [Flurry Analytics](http://cocos2d-x.org/sdkbox/flurryanalytics) - - - ## The Next Step As you can see, in v3.7, we have enhanced our 2d rendering with material system and integrated polygon sprite. More importantly, our 3d features become more and more complete, 3d Physics and Navigation Mesh with the previous Camera, 3d Sprite, 3d Particle System, 3d Light, 3d Terrain, Skybox, now you can really start to use Cocos to make a 3d game. diff --git a/web b/web index 04de1400b6..dd8735056c 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit 04de1400b6032ef15c9e9bd53548720ff82e3c5f +Subproject commit dd8735056c87ffb22502e7178c01d92d9b8cdc65 From 15b0fea530cbd9273fdc2cafcf0114599da20d90 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 14 Jul 2015 16:51:36 +0800 Subject: [PATCH 82/93] fix win32&win8.1 template compile --- tools/jenkins-scripts/daily-build.py | 18 +++++++++++++++--- .../slave-scripts/runtime/win32-build.bat | 15 --------------- .../slave-scripts/runtime/win32-cpp.bat | 2 ++ .../slave-scripts/runtime/win32-js.bat | 2 ++ .../slave-scripts/runtime/win32-lua.bat | 2 ++ .../runtime/windows-universal-cpp.bat | 2 ++ .../runtime/windows-universal-js.bat | 2 ++ .../runtime/windows-universal-lua.bat | 2 ++ .../runtime/windows-universal.bat | 15 --------------- .../slave-scripts/templates/win32-build.bat | 15 --------------- .../slave-scripts/templates/win32-cpp.bat | 2 ++ .../slave-scripts/templates/win32-js.bat | 2 ++ .../slave-scripts/templates/win32-lua.bat | 2 ++ .../templates/windows-universal-cpp.bat | 2 ++ .../templates/windows-universal-js.bat | 2 ++ .../templates/windows-universal-lua.bat | 2 ++ .../templates/windows-universal.bat | 16 ---------------- 17 files changed, 39 insertions(+), 64 deletions(-) delete mode 100644 tools/jenkins-scripts/slave-scripts/runtime/win32-build.bat create mode 100644 tools/jenkins-scripts/slave-scripts/runtime/win32-cpp.bat create mode 100644 tools/jenkins-scripts/slave-scripts/runtime/win32-js.bat create mode 100644 tools/jenkins-scripts/slave-scripts/runtime/win32-lua.bat create mode 100755 tools/jenkins-scripts/slave-scripts/runtime/windows-universal-cpp.bat create mode 100755 tools/jenkins-scripts/slave-scripts/runtime/windows-universal-js.bat create mode 100755 tools/jenkins-scripts/slave-scripts/runtime/windows-universal-lua.bat delete mode 100755 tools/jenkins-scripts/slave-scripts/runtime/windows-universal.bat delete mode 100644 tools/jenkins-scripts/slave-scripts/templates/win32-build.bat create mode 100644 tools/jenkins-scripts/slave-scripts/templates/win32-cpp.bat create mode 100644 tools/jenkins-scripts/slave-scripts/templates/win32-js.bat create mode 100644 tools/jenkins-scripts/slave-scripts/templates/win32-lua.bat create mode 100755 tools/jenkins-scripts/slave-scripts/templates/windows-universal-cpp.bat create mode 100755 tools/jenkins-scripts/slave-scripts/templates/windows-universal-js.bat create mode 100755 tools/jenkins-scripts/slave-scripts/templates/windows-universal-lua.bat delete mode 100755 tools/jenkins-scripts/slave-scripts/templates/windows-universal.bat diff --git a/tools/jenkins-scripts/daily-build.py b/tools/jenkins-scripts/daily-build.py index 8ef6db9f1e..5f427f9ca9 100644 --- a/tools/jenkins-scripts/daily-build.py +++ b/tools/jenkins-scripts/daily-build.py @@ -73,9 +73,15 @@ def do_build_slaves(): if(node_name == 'android') or (node_name == 'android_bak'): slave_build_scripts = jenkins_script_path + "android-build.sh " elif(node_name == 'win32' or node_name == 'win32_win7' or node_name == 'win32_bak'): - slave_build_scripts = jenkins_script_path + "win32-build.bat " + if daily_build_type == "runtime" or daily_build_type == "templates": + slave_build_scripts = jenkins_script_path + "win32-" + language + ".bat " + else: + slave_build_scripts = jenkins_script_path + "win32-build.bat " elif(node_name == 'windows-universal' or node_name == 'windows-universal_bak'): - slave_build_scripts = jenkins_script_path + "windows-universal.bat " + if daily_build_type == "runtime" or daily_build_type == "templates": + slave_build_scripts = jenkins_script_path + "windows-universal-" + language + ".bat " + else: + slave_build_scripts = jenkins_script_path + "windows-universal.bat " elif(node_name == 'ios_mac' or node_name == 'ios' or node_name == 'ios_bak'): slave_build_scripts = jenkins_script_path + "ios-build.sh " elif(node_name == 'mac' or node_name == 'mac_bak'): @@ -86,8 +92,14 @@ def do_build_slaves(): if(branch != 'v4'): slave_build_scripts = jenkins_script_path + "wp8-v3.bat " + if daily_build_type == 'templates': + ret = os.system("python tools/cocos2d-console/bin/cocos.py new -l " + language) + elif daily_build_type == 'runtime': + ret = os.system("python tools/cocos2d-console/bin/cocos.py new -l " + language + " -t runtime") + else: + ret = 0 slave_build_scripts += language - ret = os.system(slave_build_scripts) + ret = ret + os.system(slave_build_scripts) #get build result print "build finished and return " + str(ret) diff --git a/tools/jenkins-scripts/slave-scripts/runtime/win32-build.bat b/tools/jenkins-scripts/slave-scripts/runtime/win32-build.bat deleted file mode 100644 index 2e3480dc5d..0000000000 --- a/tools/jenkins-scripts/slave-scripts/runtime/win32-build.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo on - -set mycocos=tools/cocos2d-console/bin/cocos.bat -set language=%1 -rmdir /s /q .git -call %mycocos% new -l %language% -t runtime - -set projectname= -if "%language%"=="cpp" set projectname=MyCppGame/proj.win32/MyCppGame.sln -if "%language%"=="lua" set projectname=MyLuaGame/frameworks/runtime-src/proj.win32/MyLuaGame.sln -if "%language%"=="js" set projectname=MyJSGame/frameworks/runtime-src/proj.win32/MyJSGame.sln - -echo %projectname% -call "%VS120COMNTOOLS%vsvars32.bat" -msbuild %projectname% /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/runtime/win32-cpp.bat b/tools/jenkins-scripts/slave-scripts/runtime/win32-cpp.bat new file mode 100644 index 0000000000..907dbbd197 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/runtime/win32-cpp.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyCppGame/proj.win32/MyCppGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/runtime/win32-js.bat b/tools/jenkins-scripts/slave-scripts/runtime/win32-js.bat new file mode 100644 index 0000000000..c3aae60233 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/runtime/win32-js.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyJSGame/frameworks/runtime-src/proj.win32/MyJSGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/runtime/win32-lua.bat b/tools/jenkins-scripts/slave-scripts/runtime/win32-lua.bat new file mode 100644 index 0000000000..23865fe3c0 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/runtime/win32-lua.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyLuaGame/frameworks/runtime-src/proj.win32/MyLuaGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/runtime/windows-universal-cpp.bat b/tools/jenkins-scripts/slave-scripts/runtime/windows-universal-cpp.bat new file mode 100755 index 0000000000..b477e661b3 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/runtime/windows-universal-cpp.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyCppGame/proj.win8.1-universal/MyCppGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/runtime/windows-universal-js.bat b/tools/jenkins-scripts/slave-scripts/runtime/windows-universal-js.bat new file mode 100755 index 0000000000..5007d23d13 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/runtime/windows-universal-js.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyJSGame/frameworks/runtime-src/proj.win8.1-universal/MyJSGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/runtime/windows-universal-lua.bat b/tools/jenkins-scripts/slave-scripts/runtime/windows-universal-lua.bat new file mode 100755 index 0000000000..bcc1fab254 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/runtime/windows-universal-lua.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyLuaGame/frameworks/runtime-src/proj.win8.1-universal/MyLuaGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/runtime/windows-universal.bat b/tools/jenkins-scripts/slave-scripts/runtime/windows-universal.bat deleted file mode 100755 index 0e35da089b..0000000000 --- a/tools/jenkins-scripts/slave-scripts/runtime/windows-universal.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo on - -set mycocos=tools/cocos2d-console/bin/cocos.bat -set language=%1 -rmdir /s /q .git -call %mycocos% new -l %language% - -set projectname= -if "%language%"=="cpp" set projectname=MyCppGame/proj.win8.1-universal/MyCppGame.sln -if "%language%"=="lua" set projectname=MyLuaGame/frameworks/runtime-src/proj.win8.1-universal/MyLuaGame.sln -if "%language%"=="js" set projectname=MyJSGame/frameworks/runtime-src/proj.win8.1-universal/MyJSGame.sln - -echo %projectname% -call "%VS120COMNTOOLS%vsvars32.bat" -msbuild %projectname% /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/templates/win32-build.bat b/tools/jenkins-scripts/slave-scripts/templates/win32-build.bat deleted file mode 100644 index 54fc6ee0a7..0000000000 --- a/tools/jenkins-scripts/slave-scripts/templates/win32-build.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo on - -set mycocos=tools/cocos2d-console/bin/cocos.bat -set language=%1 -rmdir /s /q .git -call %mycocos% new -l %language% - -set projectname= -if "%language%"=="cpp" set projectname=MyCppGame/proj.win32/MyCppGame.sln -if "%language%"=="lua" set projectname=MyLuaGame/frameworks/runtime-src/proj.win32/MyLuaGame.sln -if "%language%"=="js" set projectname=MyJSGame/frameworks/runtime-src/proj.win32/MyJSGame.sln - -echo %projectname% -call "%VS120COMNTOOLS%vsvars32.bat" -msbuild %projectname% /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/templates/win32-cpp.bat b/tools/jenkins-scripts/slave-scripts/templates/win32-cpp.bat new file mode 100644 index 0000000000..907dbbd197 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/templates/win32-cpp.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyCppGame/proj.win32/MyCppGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/templates/win32-js.bat b/tools/jenkins-scripts/slave-scripts/templates/win32-js.bat new file mode 100644 index 0000000000..c3aae60233 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/templates/win32-js.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyJSGame/frameworks/runtime-src/proj.win32/MyJSGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/templates/win32-lua.bat b/tools/jenkins-scripts/slave-scripts/templates/win32-lua.bat new file mode 100644 index 0000000000..23865fe3c0 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/templates/win32-lua.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyLuaGame/frameworks/runtime-src/proj.win32/MyLuaGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/templates/windows-universal-cpp.bat b/tools/jenkins-scripts/slave-scripts/templates/windows-universal-cpp.bat new file mode 100755 index 0000000000..b477e661b3 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/templates/windows-universal-cpp.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyCppGame/proj.win8.1-universal/MyCppGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/templates/windows-universal-js.bat b/tools/jenkins-scripts/slave-scripts/templates/windows-universal-js.bat new file mode 100755 index 0000000000..5007d23d13 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/templates/windows-universal-js.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyJSGame/frameworks/runtime-src/proj.win8.1-universal/MyJSGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/templates/windows-universal-lua.bat b/tools/jenkins-scripts/slave-scripts/templates/windows-universal-lua.bat new file mode 100755 index 0000000000..bcc1fab254 --- /dev/null +++ b/tools/jenkins-scripts/slave-scripts/templates/windows-universal-lua.bat @@ -0,0 +1,2 @@ +call "%VS120COMNTOOLS%vsvars32.bat" +msbuild MyLuaGame/frameworks/runtime-src/proj.win8.1-universal/MyLuaGame.sln /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m diff --git a/tools/jenkins-scripts/slave-scripts/templates/windows-universal.bat b/tools/jenkins-scripts/slave-scripts/templates/windows-universal.bat deleted file mode 100755 index 42b964aa6c..0000000000 --- a/tools/jenkins-scripts/slave-scripts/templates/windows-universal.bat +++ /dev/null @@ -1,16 +0,0 @@ -@echo on - -set mycocos=tools/cocos2d-console/bin/cocos.bat -set language=%1 - -rmdir /s /q .git -call %mycocos% new -l %language% - -set projectname= -if "%language%"=="cpp" set projectname=MyCppGame/proj.win8.1-universal/MyCppGame.sln -if "%language%"=="lua" set projectname=MyLuaGame/frameworks/runtime-src/proj.win8.1-universal/MyLuaGame.sln -if "%language%"=="js" set projectname=MyJSGame/frameworks/runtime-src/proj.win8.1-universal/MyJSGame.sln - -echo %projectname% -call "%VS120COMNTOOLS%vsvars32.bat" -msbuild %projectname% /t:Build /p:VisualStudioVersion=12.0 /p:Platform="Win32" /p:Configuration="Release" /m From e4cad50c2f41b7f36bef4e408bc0ef4822094d28 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 15 Jul 2015 12:04:48 +0800 Subject: [PATCH 83/93] fix tons of warnings --- .gitignore | 1 + cocos/2d/CCFontAtlas.cpp | 2 +- .../cocosbuilder/CCNodeLoader.cpp | 4 +- .../cocostudio/ActionTimeline/CSLoader.cpp | 6 +- .../cocostudio/CCDisplayManager.cpp | 2 +- .../cocostudio/CCSGUIReader.cpp | 26 ++--- .../cocostudio/CCSSceneReader.cpp | 4 +- cocos/editor-support/spine/SkeletonRenderer.h | 8 +- cocos/navmesh/CCNavMeshDebugDraw.h | 4 +- cocos/platform/apple/CCFileUtils-apple.h | 2 +- cocos/ui/UIVideoPlayer.h | 4 +- .../Classes/Box2DTestBed/Box2dView.h | 10 +- .../Classes/Camera3DTest/Camera3DTest.cpp | 4 +- .../DataVisitorTest/DataVisitorTest.cpp | 4 +- .../Classes/DataVisitorTest/DataVisitorTest.h | 4 +- .../AssetsManagerExTest/AssetsManagerExTest.h | 2 +- .../ActionTimelineTestScene.cpp | 2 +- .../ActionTimelineTestScene.h | 2 +- .../CocoStudioArmatureTest/ArmatureScene.cpp | 10 +- .../CocoStudioArmatureTest/ArmatureScene.h | 8 +- .../CocoStudioSceneTest/SceneEditorTest.cpp | 34 +++---- .../CocoStudioSceneTest/SceneEditorTest.h | 20 ++-- .../CocoStudioSceneTest/TriggerCode/acts.cpp | 2 +- .../CocoStudioSceneTest/TriggerCode/acts.h | 88 ++++++++--------- .../CocoStudioSceneTest/TriggerCode/cons.h | 32 +++---- .../CCControlButtonTest.cpp | 38 ++++---- .../CCControlColourPickerTest.cpp | 4 +- .../CCControlPotentiometerTest.cpp | 4 +- .../ControlExtensionTest/CCControlScene.cpp | 2 +- .../CCControlSliderTest.cpp | 4 +- .../CCControlStepperTest.cpp | 4 +- .../CCControlSwitchTest.cpp | 2 +- .../ExtensionsTest/NetworkTest/SocketIOTest.h | 4 +- .../NetworkTest/WebSocketTest.h | 8 +- .../NotificationCenterTest.cpp | 18 ++-- .../TableViewTest/TableViewTestScene.cpp | 6 +- .../TableViewTest/TableViewTestScene.h | 12 +-- .../Classes/FileUtilsTest/FileUtilsTest.cpp | 44 ++++----- .../Classes/LabelTest/LabelTestNew.cpp | 2 +- .../Classes/NavMeshTest/NavMeshTest.h | 12 +-- .../Classes/ParticleTest/ParticleTest.cpp | 2 +- .../Classes/ParticleTest/ParticleTest.h | 2 +- .../PerformanceTest/PerformanceAllocTest.h | 4 +- .../PerformanceTest/PerformanceCallbackTest.h | 4 +- .../PerformanceContainerTest.cpp | 14 +-- .../PerformanceContainerTest.h | 4 +- .../PerformanceEventDispatcherTest.h | 4 +- .../PerformanceTest/PerformanceLabelTest.h | 2 +- .../PerformanceTest/PerformanceMathTest.h | 8 +- .../PerformanceNodeChildrenTest.h | 30 +++--- .../PerformanceParticle3DTest.h | 2 +- .../PerformanceTest/PerformanceParticleTest.h | 8 +- .../PerformanceTest/PerformanceSpriteTest.h | 4 +- .../PerformanceTest/PerformanceTouchesTest.h | 2 +- .../RenderTextureTest/RenderTextureTest.h | 2 +- .../Classes/Scene3DTest/Scene3DTest.cpp | 2 +- .../Classes/ShaderTest/ShaderTest.cpp | 6 +- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 8 +- .../SpritePolygonTest/SpritePolygonTest.h | 2 +- .../Classes/SpriteTest/SpriteTest.cpp | 2 +- .../Classes/TextInputTest/TextInputTest.h | 2 +- .../TextureAtlasEncryptionTest.h | 2 +- .../Classes/TileMapTest/TileMapTest.cpp | 2 +- .../Classes/TileMapTest/TileMapTest.h | 2 +- .../Classes/TileMapTest/TileMapTest2.cpp | 2 +- .../Classes/TileMapTest/TileMapTest2.h | 2 +- .../CustomWidget/CustomParticleWidget.h | 4 +- .../UIButtonTest/UIButtonTest.cpp | 58 +++++------ .../UICheckBoxTest/UICheckBoxTest.cpp | 4 +- .../UITest/CocoStudioGUITest/UIEditBoxTest.h | 8 +- .../UILayoutTest/UILayoutTest.cpp | 8 +- .../UILayoutTest/UILayoutTest_Editor.cpp | 2 +- .../UIListViewTest/UIListViewTest_Editor.cpp | 2 +- .../UILoadingBarTest/UILoadingBarTest.h | 8 +- .../UILoadingBarTest_Editor.h | 2 +- .../UIPageViewTest/UIPageViewTest.cpp | 16 ++-- .../UIRadioButtonTest/UIRadioButtonTest.cpp | 28 +++--- .../UITest/CocoStudioGUITest/UIScene.cpp | 2 +- .../CocoStudioGUITest/UIScene_Editor.cpp | 2 +- .../UIScrollViewTest_Editor.cpp | 4 +- .../UISliderTest/UISliderTest_Editor.cpp | 2 +- .../UITextFieldTest/UITextFieldTest.cpp | 96 +++++++++---------- .../Classes/VibrateTest/VibrateTest.cpp | 8 +- .../Classes/VibrateTest/VibrateTest.h | 2 +- 84 files changed, 415 insertions(+), 414 deletions(-) diff --git a/.gitignore b/.gitignore index 7682ccb859..8ab3121379 100644 --- a/.gitignore +++ b/.gitignore @@ -146,3 +146,4 @@ tests/cpp-tests/Resources/audio /*/*/prebuilt-mk/Android.mk /*/*/*/prebuilt-mk/Android.mk /*/*/*/*/prebuilt-mk/Android.mk +*.xcscmblueprint diff --git a/cocos/2d/CCFontAtlas.cpp b/cocos/2d/CCFontAtlas.cpp index a2d2d2942e..b30309037e 100644 --- a/cocos/2d/CCFontAtlas.cpp +++ b/cocos/2d/CCFontAtlas.cpp @@ -204,7 +204,7 @@ bool FontAtlas::prepareLetterDefinitions(const std::u16string& utf16String) if (bitmapHeight > _currLineHeight) { - _currLineHeight = bitmapHeight + 1; + _currLineHeight = static_cast(bitmapHeight) + 1; } if (_currentPageOrigX + tempDef.width > CacheTextureWidth) { diff --git a/cocos/editor-support/cocosbuilder/CCNodeLoader.cpp b/cocos/editor-support/cocosbuilder/CCNodeLoader.cpp index cc375f129e..d1febae816 100644 --- a/cocos/editor-support/cocosbuilder/CCNodeLoader.cpp +++ b/cocos/editor-support/cocosbuilder/CCNodeLoader.cpp @@ -99,11 +99,11 @@ void NodeLoader::parseProperties(Node * pNode, Node * pParent, CCBReader * ccbRe __Array *extraPropsNames = static_cast<__Array*>(pNode->getUserObject()); if (! extraPropsNames) { - extraPropsNames = Array::create(); + extraPropsNames = __Array::create(); pNode->setUserObject(extraPropsNames); } - extraPropsNames->addObject(String::create(propertyName)); + extraPropsNames->addObject(__String::create(propertyName)); } switch(type) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp index 11b19c115d..bc25b17887 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp @@ -611,7 +611,7 @@ Node* CSLoader::loadSprite(const rapidjson::Value& json) if(!sprite) { - sprite = CCSprite::create(); + sprite = Sprite::create(); CCLOG("filePath is empty. Create a sprite with no texture"); } } @@ -844,7 +844,7 @@ Node* CSLoader::nodeWithFlatBuffersFile(const std::string &fileName, const ccNod if (csBuildId) { CCASSERT(strcmp(_csBuildID.c_str(), csBuildId->c_str()) == 0, - String::createWithFormat("%s%s%s%s%s%s%s%s%s%s", + StringUtils::format("%s%s%s%s%s%s%s%s%s%s", "The reader build id of your Cocos exported file(", csBuildId->c_str(), ") and the reader build id in your Cocos2d-x(", @@ -854,7 +854,7 @@ Node* CSLoader::nodeWithFlatBuffersFile(const std::string &fileName, const ccNod csBuildId->c_str(), ")from ", "http://www.cocos2d-x.org/filedown/cocos-reader", - " and replace it in your Cocos2d-x")->getCString()); + " and replace it in your Cocos2d-x").c_str()); } // decode plist diff --git a/cocos/editor-support/cocostudio/CCDisplayManager.cpp b/cocos/editor-support/cocostudio/CCDisplayManager.cpp index 1843c6450e..b294572549 100644 --- a/cocos/editor-support/cocostudio/CCDisplayManager.cpp +++ b/cocos/editor-support/cocostudio/CCDisplayManager.cpp @@ -246,7 +246,7 @@ void DisplayManager::changeDisplayWithIndex(int index, bool force) setCurrentDecorativeDisplay(decoDisplay); } -void CCDisplayManager::changeDisplayWithName(const std::string& name, bool force) +void DisplayManager::changeDisplayWithName(const std::string& name, bool force) { for (int i = 0; i<_decoDisplayList.size(); i++) { diff --git a/cocos/editor-support/cocostudio/CCSGUIReader.cpp b/cocos/editor-support/cocostudio/CCSGUIReader.cpp index 34cc2ee17a..e7701289f8 100644 --- a/cocos/editor-support/cocostudio/CCSGUIReader.cpp +++ b/cocos/editor-support/cocostudio/CCSGUIReader.cpp @@ -493,7 +493,7 @@ Widget* WidgetPropertiesReader0250::createWidget(const rapidjson::Value& data, c const char* file = DICTOOL->getStringValueFromArray_json(data, "textures", i); std::string tp = fullPath; tp.append(file); - CCSpriteFrameCache::getInstance()->addSpriteFramesWithFile(tp.c_str()); + SpriteFrameCache::getInstance()->addSpriteFramesWithFile(tp.c_str()); } float fileDesignWidth = DICTOOL->getFloatValue_json(data, "designWidth"); float fileDesignHeight = DICTOOL->getFloatValue_json(data, "designHeight"); @@ -713,7 +713,7 @@ void WidgetPropertiesReader0250::setPropsForButtonFromJsonDictionary(Widget*widg if (useMergedTexture) { - button->loadTextures(normalFileName, pressedFileName, disabledFileName,TextureResType::PLIST); + button->loadTextures(normalFileName, pressedFileName, disabledFileName,Widget::TextureResType::PLIST); } else { @@ -733,7 +733,7 @@ void WidgetPropertiesReader0250::setPropsForButtonFromJsonDictionary(Widget*widg { if (useMergedTexture) { - button->loadTextures(normalFileName, pressedFileName, disabledFileName,TextureResType::PLIST); + button->loadTextures(normalFileName, pressedFileName, disabledFileName,Widget::TextureResType::PLIST); } else { @@ -794,7 +794,7 @@ void WidgetPropertiesReader0250::setPropsForCheckBoxFromJsonDictionary(Widget*wi if (useMergedTexture) { - checkBox->loadTextures(backGroundFileName, backGroundSelectedFileName, frontCrossFileName,backGroundDisabledFileName,frontCrossDisabledFileName,TextureResType::PLIST); + checkBox->loadTextures(backGroundFileName, backGroundSelectedFileName, frontCrossFileName,backGroundDisabledFileName,frontCrossDisabledFileName,Widget::TextureResType::PLIST); } else { @@ -829,7 +829,7 @@ void WidgetPropertiesReader0250::setPropsForImageViewFromJsonDictionary(Widget*w { if (useMergedTexture) { - imageView->loadTexture(imageFileName,TextureResType::PLIST); + imageView->loadTexture(imageFileName,Widget::TextureResType::PLIST); } else { @@ -856,7 +856,7 @@ void WidgetPropertiesReader0250::setPropsForImageViewFromJsonDictionary(Widget*w { if (useMergedTexture) { - imageView->loadTexture(imageFileName,TextureResType::PLIST); + imageView->loadTexture(imageFileName,Widget::TextureResType::PLIST); } else { @@ -974,7 +974,7 @@ void WidgetPropertiesReader0250::setPropsForLayoutFromJsonDictionary(Widget*widg float ch = DICTOOL->getFloatValue_json(options, "capInsetsHeight"); if (useMergedTexture) { - panel->setBackGroundImage(imageFileName,TextureResType::PLIST); + panel->setBackGroundImage(imageFileName,Widget::TextureResType::PLIST); } else { @@ -987,7 +987,7 @@ void WidgetPropertiesReader0250::setPropsForLayoutFromJsonDictionary(Widget*widg if (useMergedTexture) { - panel->setBackGroundImage(imageFileName,TextureResType::PLIST); + panel->setBackGroundImage(imageFileName,Widget::TextureResType::PLIST); } else { @@ -1029,7 +1029,7 @@ void WidgetPropertiesReader0250::setPropsForSliderFromJsonDictionary(Widget*widg const char* imageFileName_tp = (imageFileName && (strcmp(imageFileName, "") != 0))?tp_b.append(imageFileName).c_str():nullptr; if (useMergedTexture) { - slider->loadBarTexture(imageFileName,TextureResType::PLIST); + slider->loadBarTexture(imageFileName,Widget::TextureResType::PLIST); } else { @@ -1044,7 +1044,7 @@ void WidgetPropertiesReader0250::setPropsForSliderFromJsonDictionary(Widget*widg const char* imageFileName_tp = (imageFileName && (strcmp(imageFileName, "") != 0))?tp_b.append(imageFileName).c_str():nullptr; if (useMergedTexture) { - slider->loadBarTexture(imageFileName,TextureResType::PLIST); + slider->loadBarTexture(imageFileName,Widget::TextureResType::PLIST); } else { @@ -1065,7 +1065,7 @@ void WidgetPropertiesReader0250::setPropsForSliderFromJsonDictionary(Widget*widg const char* disabledFileName_tp = (disabledFileName && (strcmp(disabledFileName, "") != 0))?tp_d.append(disabledFileName).c_str():nullptr; if (useMergedTexture) { - slider->loadSlidBallTextures(normalFileName,pressedFileName,disabledFileName,TextureResType::PLIST); + slider->loadSlidBallTextures(normalFileName,pressedFileName,disabledFileName,Widget::TextureResType::PLIST); } else { @@ -1078,7 +1078,7 @@ void WidgetPropertiesReader0250::setPropsForSliderFromJsonDictionary(Widget*widg const char* imageFileName_tp = (imageFileName && (strcmp(imageFileName, "") != 0))?tp_b.append(imageFileName).c_str():nullptr; if (useMergedTexture) { - slider->loadProgressBarTexture(imageFileName, TextureResType::PLIST); + slider->loadProgressBarTexture(imageFileName, Widget::TextureResType::PLIST); } else { @@ -1147,7 +1147,7 @@ void WidgetPropertiesReader0250::setPropsForLoadingBarFromJsonDictionary(Widget const char* imageFileName_tp = (imageFileName && (strcmp(imageFileName, "") != 0))?tp_b.append(imageFileName).c_str():nullptr; if (useMergedTexture) { - loadingBar->loadTexture(imageFileName,TextureResType::PLIST); + loadingBar->loadTexture(imageFileName,Widget::TextureResType::PLIST); } else { diff --git a/cocos/editor-support/cocostudio/CCSSceneReader.cpp b/cocos/editor-support/cocostudio/CCSSceneReader.cpp index 593eaeba32..66c92706a6 100644 --- a/cocos/editor-support/cocostudio/CCSSceneReader.cpp +++ b/cocos/editor-support/cocostudio/CCSSceneReader.cpp @@ -79,7 +79,7 @@ cocos2d::Node* SceneReader::createNodeWithSceneFile(const std::string &fileName, else if(file_extension == ".CSB") { do { - std::string binaryFilePath = CCFileUtils::getInstance()->fullPathForFilename(fileName); + std::string binaryFilePath = FileUtils::getInstance()->fullPathForFilename(fileName); auto fileData = FileUtils::getInstance()->getDataFromFile(binaryFilePath); auto fileDataBytes = fileData.getBytes(); CC_BREAK_IF(fileData.isNull()); @@ -429,7 +429,7 @@ cocos2d::Node* SceneReader::createObject(CocoLoader *cocoLoader, stExpCocoNode * { if (pRender == nullptr || attachComponent == AttachComponentType::EMPTY_NODE) { - gb = CCNode::create(); + gb = Node::create(); if (pRender != nullptr) { _vecComs.push_back(pRender); diff --git a/cocos/editor-support/spine/SkeletonRenderer.h b/cocos/editor-support/spine/SkeletonRenderer.h index 7d6055d7bb..e39cd9b266 100644 --- a/cocos/editor-support/spine/SkeletonRenderer.h +++ b/cocos/editor-support/spine/SkeletonRenderer.h @@ -91,10 +91,10 @@ public: bool setAttachment (const std::string& slotName, const char* attachmentName); // --- BlendProtocol - virtual void setBlendFunc (const cocos2d::BlendFunc& blendFunc); - virtual const cocos2d::BlendFunc& getBlendFunc () const; - virtual void setOpacityModifyRGB (bool value); - virtual bool isOpacityModifyRGB () const; + virtual void setBlendFunc (const cocos2d::BlendFunc& blendFunc)override; + virtual const cocos2d::BlendFunc& getBlendFunc () const override; + virtual void setOpacityModifyRGB (bool value)override; + virtual bool isOpacityModifyRGB () const override; CC_CONSTRUCTOR_ACCESS: SkeletonRenderer (); diff --git a/cocos/navmesh/CCNavMeshDebugDraw.h b/cocos/navmesh/CCNavMeshDebugDraw.h index 528737806d..cf116d2778 100644 --- a/cocos/navmesh/CCNavMeshDebugDraw.h +++ b/cocos/navmesh/CCNavMeshDebugDraw.h @@ -49,8 +49,8 @@ public: NavMeshDebugDraw(); virtual ~NavMeshDebugDraw(); - virtual void depthMask(bool state); - virtual void texture(bool state){}; + virtual void depthMask(bool state)override; + virtual void texture(bool state)override{}; virtual void begin(duDebugDrawPrimitives prim, float size = 1.0f) override; virtual void vertex(const float* pos, unsigned int color) override; diff --git a/cocos/platform/apple/CCFileUtils-apple.h b/cocos/platform/apple/CCFileUtils-apple.h index add8109323..dd1fc94bcc 100644 --- a/cocos/platform/apple/CCFileUtils-apple.h +++ b/cocos/platform/apple/CCFileUtils-apple.h @@ -50,7 +50,7 @@ public: virtual std::string getFullPathForDirectoryAndFilename(const std::string& directory, const std::string& filename) const override; virtual ValueMap getValueMapFromFile(const std::string& filename) override; - virtual ValueMap getValueMapFromData(const char* filedata, int filesize); + virtual ValueMap getValueMapFromData(const char* filedata, int filesize)override; virtual bool writeToFile(ValueMap& dict, const std::string& fullPath) override; virtual ValueVector getValueVectorFromFile(const std::string& filename) override; diff --git a/cocos/ui/UIVideoPlayer.h b/cocos/ui/UIVideoPlayer.h index 81b688a22a..45950edb98 100644 --- a/cocos/ui/UIVideoPlayer.h +++ b/cocos/ui/UIVideoPlayer.h @@ -103,12 +103,12 @@ namespace experimental{ /** * Pauses playback. */ - virtual void pause(); + virtual void pause()override; /** * Resumes playback. */ - virtual void resume(); + virtual void resume()override; /** * Stops playback. diff --git a/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.h b/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.h index 2eae062302..a3a3dbf266 100644 --- a/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.h +++ b/tests/cpp-tests/Classes/Box2DTestBed/Box2dView.h @@ -41,12 +41,12 @@ public: virtual void draw(cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t flags) override; // virtual void registerWithTouchDispatcher(); - bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event); - void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event); - void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event); + bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event)override; + void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event)override; + void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event)override; - void onKeyPressed(cocos2d::EventKeyboard::KeyCode code, cocos2d::Event* event); - void onKeyReleased(cocos2d::EventKeyboard::KeyCode code, cocos2d::Event* event); + void onKeyPressed(cocos2d::EventKeyboard::KeyCode code, cocos2d::Event* event)override; + void onKeyReleased(cocos2d::EventKeyboard::KeyCode code, cocos2d::Event* event)override; //virtual void accelerometer(UIAccelerometer* accelerometer, cocos2d::Acceleration* acceleration); static Box2DView* viewWithEntryID(int entryId); diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index c9115dcf43..05c4476313 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -87,7 +87,7 @@ CameraRotationTest::CameraRotationTest() l1->setScale(3); bill1->addChild(l1); - auto p1 = CCParticleSystemQuad::create("Particles/SmallSun.plist"); + auto p1 = ParticleSystemQuad::create("Particles/SmallSun.plist"); p1->setPosition(30,80); bill1->addChild(p1); @@ -103,7 +103,7 @@ CameraRotationTest::CameraRotationTest() l2->setScale(3); bill2->addChild(l2); - auto p2 = CCParticleSystemQuad::create("Particles/SmallSun.plist"); + auto p2 = ParticleSystemQuad::create("Particles/SmallSun.plist"); p2->setPosition(30,80); bill2->addChild(p2); diff --git a/tests/cpp-tests/Classes/DataVisitorTest/DataVisitorTest.cpp b/tests/cpp-tests/Classes/DataVisitorTest/DataVisitorTest.cpp index 8bdee03d44..ee2e636d61 100644 --- a/tests/cpp-tests/Classes/DataVisitorTest/DataVisitorTest.cpp +++ b/tests/cpp-tests/Classes/DataVisitorTest/DataVisitorTest.cpp @@ -61,14 +61,14 @@ void PrettyPrinterDemo::onEnter() PrettyPrinter vistor; // print dictionary - auto dict = Dictionary::createWithContentsOfFile("animations/animations.plist"); + auto dict = __Dictionary::createWithContentsOfFile("animations/animations.plist"); dict->acceptVisitor(vistor); log("%s", vistor.getResult().c_str()); log("-------------------------------"); __Set myset; for (int i = 0; i < 30; ++i) { - myset.addObject(String::createWithFormat("str: %d", i)); + myset.addObject(__String::createWithFormat("str: %d", i)); } vistor.clear(); myset.acceptVisitor(vistor); diff --git a/tests/cpp-tests/Classes/DataVisitorTest/DataVisitorTest.h b/tests/cpp-tests/Classes/DataVisitorTest/DataVisitorTest.h index a1ed575cd2..be38403486 100644 --- a/tests/cpp-tests/Classes/DataVisitorTest/DataVisitorTest.h +++ b/tests/cpp-tests/Classes/DataVisitorTest/DataVisitorTest.h @@ -11,8 +11,8 @@ class PrettyPrinterDemo : public TestCase { public: CREATE_FUNC(PrettyPrinterDemo); - virtual std::string title() const; - virtual std::string subtitle() const; + virtual std::string title() const override; + virtual std::string subtitle() const override; virtual void onEnter() override; void addSprite(); protected: diff --git a/tests/cpp-tests/Classes/ExtensionsTest/AssetsManagerExTest/AssetsManagerExTest.h b/tests/cpp-tests/Classes/ExtensionsTest/AssetsManagerExTest/AssetsManagerExTest.h index f9d8bffbd5..72aad734dc 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/AssetsManagerExTest/AssetsManagerExTest.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/AssetsManagerExTest/AssetsManagerExTest.h @@ -15,7 +15,7 @@ public: void startDownloadCallback(cocos2d::Ref* sender); - virtual std::string title() const; + virtual std::string title() const override; virtual bool init() override; virtual void onExit() override; diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.cpp b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.cpp index 5810de2f67..592387ccc5 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.cpp @@ -42,7 +42,7 @@ bool ActionTimelineBaseTest::init() addChild(bg); - setGLProgram(ShaderCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR)); + setGLProgram(GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR)); return true; } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.h b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.h index 38a23ceb01..270409db0d 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioActionTimelineTest/ActionTimelineTestScene.h @@ -15,7 +15,7 @@ public: class ActionTimelineBaseTest : public TestCase { public: - virtual std::string title() const; + virtual std::string title() const override; virtual bool init() override; diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp index a7950f977c..1bd5418de1 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.cpp @@ -446,8 +446,8 @@ void TestParticleDisplay::onEnter() addChild(armature); - ParticleSystem *p1 = CCParticleSystemQuad::create("Particles/SmallSun.plist"); - ParticleSystem *p2 = CCParticleSystemQuad::create("Particles/SmallSun.plist"); + ParticleSystem *p1 = ParticleSystemQuad::create("Particles/SmallSun.plist"); + ParticleSystem *p2 = ParticleSystemQuad::create("Particles/SmallSun.plist"); cocostudio::Bone *bone = cocostudio::Bone::create("p1"); bone->addDisplay(p1, 0); @@ -607,7 +607,7 @@ void TestColliderDetector::onFrameEvent(cocostudio::Bone *bone, const std::strin bullet->setPosition(p.x + 60, p.y); bullet->stopAllActions(); - bullet->runAction(CCMoveBy::create(1.5f, Vec2(350, 0))); + bullet->runAction(MoveBy::create(1.5f, Vec2(350, 0))); } @@ -1102,7 +1102,7 @@ void TestArmatureNesting2::onEnter() touchedMenu = false; auto label = Label::createWithTTF("Change Mount", "fonts/arial.ttf", 20); - MenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, CC_CALLBACK_1(TestArmatureNesting2::changeMountCallback, this)); + MenuItemLabel* pMenuItem = MenuItemLabel::create(label, CC_CALLBACK_1(TestArmatureNesting2::changeMountCallback, this)); Menu* pMenu =Menu::create(pMenuItem, nullptr); @@ -1154,7 +1154,7 @@ void TestArmatureNesting2::onTouchesEnded(const std::vector& touches, Ev armature->setScaleX(1); } - ActionInterval *move = CCMoveTo::create(2, point); + ActionInterval *move = MoveTo::create(2, point); armature->stopAllActions(); armature->runAction(Sequence::create(move, nullptr)); } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h index d5e0a44846..c9ed316f1c 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioArmatureTest/ArmatureScene.h @@ -26,7 +26,7 @@ private: class ArmatureBaseTest : public TestCase { public: - virtual std::string title() const; + virtual std::string title() const override; virtual bool init() override; protected: @@ -105,8 +105,8 @@ public: virtual void onEnter() override; virtual std::string title() const override; - virtual void addArmatureToParent(cocostudio::Armature *armature); - virtual void removeArmatureFromParent(int tag); + virtual void addArmatureToParent(cocostudio::Armature *armature)override; + virtual void removeArmatureFromParent(int tag)override; cocostudio::BatchNode *batchNode; }; @@ -260,7 +260,7 @@ public: virtual void onEnter() override; virtual std::string title() const override; - virtual void update(float delta); + virtual void update(float delta)override; virtual void draw(cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t flags) override; void onFrameEvent(cocostudio::Bone *bone, const std::string& evt, int originFrameIndex, int currentFrameIndex); diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.cpp index 5dfdccba32..816eeb4ab0 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.cpp @@ -32,8 +32,8 @@ bool SceneEditorTestBase::init() _isCsbLoad = false; _loadtypelb = cocos2d::Label::createWithSystemFont(_loadtypeStr[0], "Arial", 12); // #endif - MenuItemLabel* itemlb = CCMenuItemLabel::create(_loadtypelb, CC_CALLBACK_1(SceneEditorTestBase::changeLoadTypeCallback, this)); - Menu* loadtypemenu = CCMenu::create(itemlb, nullptr); + MenuItemLabel* itemlb = MenuItemLabel::create(_loadtypelb, CC_CALLBACK_1(SceneEditorTestBase::changeLoadTypeCallback, this)); + Menu* loadtypemenu = Menu::create(itemlb, nullptr); loadtypemenu->setPosition(Point(VisibleRect::rightTop().x - 50, VisibleRect::rightTop().y - 20)); addChild(loadtypemenu, 100); @@ -188,8 +188,8 @@ cocos2d::Node* SpriteComponentTest::createGameScene() void SpriteComponentTest::defaultPlay() { - ActionInterval* action1 = CCBlink::create(2, 10); - ActionInterval* action2 = CCBlink::create(2, 5); + ActionInterval* action1 = Blink::create(2, 10); + ActionInterval* action2 = Blink::create(2, 5); ComRender *pSister1 = static_cast(_rootNode->getChildByTag(10003)->getComponent("CCSprite")); pSister1->getNode()->runAction(action1); @@ -309,10 +309,10 @@ void UIComponentTest::touchEvent(Ref *pSender, ui::Widget::TouchEventType type) case ui::Widget::TouchEventType::BEGAN: { ComRender *pBlowFish = static_cast(_rootNode->getChildByTag(10010)->getComponent("CCArmature")); - pBlowFish->getNode()->runAction(CCMoveBy::create(10.0f, Vec2(-1000.0f, 0))); + pBlowFish->getNode()->runAction(MoveBy::create(10.0f, Vec2(-1000.0f, 0))); ComRender *pButterflyfish = static_cast(_rootNode->getChildByTag(10011)->getComponent("CCArmature")); - pButterflyfish->getNode()->runAction(CCMoveBy::create(10.0f, Vec2(-1000.0f, 0))); + pButterflyfish->getNode()->runAction(MoveBy::create(10.0f, Vec2(-1000.0f, 0))); } break; default: @@ -379,17 +379,17 @@ cocos2d::Node* TmxMapComponentTest::createGameScene() void TmxMapComponentTest::defaultPlay() { ComRender *tmxMap = static_cast(_rootNode->getChildByTag(10015)->getComponent("CCTMXTiledMap")); - ActionInterval *actionTo = CCSkewTo::create(2, 0.f, 2.f); - ActionInterval *rotateTo = CCRotateTo::create(2, 61.0f); - ActionInterval *actionScaleTo = CCScaleTo::create(2, -0.44f, 0.47f); + ActionInterval *actionTo = SkewTo::create(2, 0.f, 2.f); + ActionInterval *rotateTo = RotateTo::create(2, 61.0f); + ActionInterval *actionScaleTo = ScaleTo::create(2, -0.44f, 0.47f); - ActionInterval *actionScaleToBack = CCScaleTo::create(2, 1.0f, 1.0f); - ActionInterval *rotateToBack = CCRotateTo::create(2, 0); - ActionInterval *actionToBack = CCSkewTo::create(2, 0, 0); + ActionInterval *actionScaleToBack = ScaleTo::create(2, 1.0f, 1.0f); + ActionInterval *rotateToBack = RotateTo::create(2, 0); + ActionInterval *actionToBack = SkewTo::create(2, 0, 0); - tmxMap->getNode()->runAction(CCSequence::create(actionTo, actionToBack, nullptr)); - tmxMap->getNode()->runAction(CCSequence::create(rotateTo, rotateToBack, nullptr)); - tmxMap->getNode()->runAction(CCSequence::create(actionScaleTo, actionScaleToBack, nullptr)); + tmxMap->getNode()->runAction(Sequence::create(actionTo, actionToBack, nullptr)); + tmxMap->getNode()->runAction(Sequence::create(rotateTo, rotateToBack, nullptr)); + tmxMap->getNode()->runAction(Sequence::create(actionScaleTo, actionScaleToBack, nullptr)); } ParticleComponentTest::ParticleComponentTest() @@ -441,8 +441,8 @@ cocos2d::Node* ParticleComponentTest::createGameScene() void ParticleComponentTest::defaultPlay() { ComRender* Particle = static_cast(_rootNode->getChildByTag(10020)->getComponent("CCParticleSystemQuad")); - ActionInterval* jump = CCJumpBy::create(5, Point(-500,0), 50, 4); - FiniteTimeAction* action = CCSequence::create( jump, jump->reverse(), nullptr); + ActionInterval* jump = JumpBy::create(5, Point(-500,0), 50, 4); + FiniteTimeAction* action = Sequence::create( jump, jump->reverse(), nullptr); Particle->getNode()->runAction(action); } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.h b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.h index 9b08e2c83d..8fecd7bad6 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/SceneEditorTest.h @@ -48,7 +48,7 @@ public: virtual void onExit() override; cocos2d::Node* createGameScene(); private: - void defaultPlay(); + void defaultPlay()override; }; @@ -66,7 +66,7 @@ public: cocos2d::Node* createGameScene(); private: - void defaultPlay(); + void defaultPlay()override; }; class ArmatureComponentTest : public SceneEditorTestBase @@ -83,7 +83,7 @@ public: cocos2d::Node* createGameScene(); private: - void defaultPlay(); + void defaultPlay()override; }; class UIComponentTest : public SceneEditorTestBase @@ -100,7 +100,7 @@ public: cocos2d::Node* createGameScene(); void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type); private: - void defaultPlay(); + void defaultPlay()override; }; class TmxMapComponentTest : public SceneEditorTestBase @@ -116,7 +116,7 @@ public: virtual void onExit() override; cocos2d::Node* createGameScene(); private: - void defaultPlay(); + void defaultPlay()override; }; @@ -133,7 +133,7 @@ public: virtual void onExit() override; cocos2d::Node* createGameScene(); protected: - void defaultPlay(); + void defaultPlay()override; }; class EffectComponentTest : public SceneEditorTestBase @@ -150,7 +150,7 @@ public: cocos2d::Node* createGameScene(); void animationEvent(cocostudio::Armature *armature, cocostudio::MovementEventType movementType, const std::string& movementID); private: - void defaultPlay(); + void defaultPlay()override; }; @@ -167,7 +167,7 @@ public: virtual void onExit() override; cocos2d::Node* createGameScene(); private: - void defaultPlay(); + void defaultPlay()override; }; class AttributeComponentTest : public SceneEditorTestBase @@ -185,7 +185,7 @@ public: cocos2d::Node* createGameScene(); private: - void defaultPlay(); + void defaultPlay()override; }; class TriggerTest : public SceneEditorTestBase @@ -213,7 +213,7 @@ public: cocos2d::Node* createGameScene(); private: - void defaultPlay(); + void defaultPlay()override; cocos2d::EventListener* _touchListener; }; diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/acts.cpp b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/acts.cpp index 28eb7a08a3..8f010bed89 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/acts.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/acts.cpp @@ -243,7 +243,7 @@ void TMoveBy::done() if (_reverse == true) { ActionInterval* actionByBack = actionBy->reverse(); - node->runAction( CCSequence::create(actionBy, actionByBack, nullptr)); + node->runAction( Sequence::create(actionBy, actionByBack, nullptr)); } else { diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/acts.h b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/acts.h index 97b8aaebb4..124eea3c6d 100755 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/acts.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/acts.h @@ -13,10 +13,10 @@ public: virtual ~PlayMusic(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; std::string _comName; @@ -31,10 +31,10 @@ public: virtual ~TMoveTo(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; float _duration; @@ -50,10 +50,10 @@ public: virtual ~TMoveBy(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; float _duration; @@ -70,10 +70,10 @@ public: virtual ~TRotateTo(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; float _duration; @@ -89,10 +89,10 @@ public: virtual ~TRotateBy(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; float _duration; @@ -109,10 +109,10 @@ public: virtual ~TScaleTo(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; float _duration; @@ -128,10 +128,10 @@ public: virtual ~TScaleBy(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; float _duration; @@ -149,10 +149,10 @@ public: virtual ~TSkewTo(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; float _duration; @@ -168,10 +168,10 @@ public: virtual ~TSkewBy(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; float _duration; @@ -188,10 +188,10 @@ public: virtual ~TriggerState(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _id; int _state; @@ -205,10 +205,10 @@ public: virtual ~ArmaturePlayAction(void); virtual bool init() override; - virtual void done(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual void done()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; std::string _comName; diff --git a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/cons.h b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/cons.h index a8648bd519..068f955f87 100755 --- a/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/cons.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/CocoStudioSceneTest/TriggerCode/cons.h @@ -13,10 +13,10 @@ public: virtual ~TimeElapsed(void); virtual bool init() override; - virtual bool detect(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual bool detect()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; virtual void update(float dt); private: float _totalTime; @@ -34,10 +34,10 @@ public: virtual ~ArmatureActionState(void); virtual bool init() override; - virtual bool detect(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual bool detect()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; void animationEvent(cocostudio::Armature *armature, cocostudio::MovementEventType movementType, const std::string& movementID); private: int _tag; @@ -56,10 +56,10 @@ public: virtual ~NodeInRect(void); virtual bool init() override; - virtual bool detect(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual bool detect()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; cocos2d::Vec2 _origin; @@ -74,10 +74,10 @@ public: virtual ~NodeVisible(void); virtual bool init() override; - virtual bool detect(); - virtual void serialize(const rapidjson::Value &val); - virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode); - virtual void removeAll(); + virtual bool detect()override; + virtual void serialize(const rapidjson::Value &val)override; + virtual void serialize(cocostudio::CocoLoader *pCocoLoader, cocostudio::stExpCocoNode *pCocoNode)override; + virtual void removeAll()override; private: int _tag; bool _visible; diff --git a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlButtonTest/CCControlButtonTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlButtonTest/CCControlButtonTest.cpp index 9ecb163a1e..9c8ccae21e 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlButtonTest/CCControlButtonTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlButtonTest/CCControlButtonTest.cpp @@ -82,7 +82,7 @@ bool ControlButtonTest_HelloVariableSize::init() layer->setPosition(screenSize.width / 2.0f, screenSize.height / 2.0f); // Add the black background - auto background = Scale9Sprite::create("extensions/buttonBackground.png"); + auto background = ui::Scale9Sprite::create("extensions/buttonBackground.png"); background->setContentSize(Size(total_width + 14, height + 14)); background->setPosition(screenSize.width / 2.0f, screenSize.height / 2.0f); addChild(background); @@ -94,8 +94,8 @@ bool ControlButtonTest_HelloVariableSize::init() ControlButton *ControlButtonTest_HelloVariableSize::standardButtonWithTitle(const char * title) { /** Creates and return a button with a default background and title color. */ - auto backgroundButton = cocos2d::extension::Scale9Sprite::create("extensions/button.png"); - auto backgroundHighlightedButton = cocos2d::extension::Scale9Sprite::create("extensions/buttonHighlighted.png"); + auto backgroundButton = ui::Scale9Sprite::create("extensions/button.png"); + auto backgroundHighlightedButton = ui::Scale9Sprite::create("extensions/buttonHighlighted.png"); auto titleButton = Label::createWithTTF(title, "fonts/Marker Felt.ttf", 30); @@ -140,8 +140,8 @@ bool ControlButtonTest_Event::init() addChild(_displayBitmaskLabel, 1); // Add the button - auto backgroundButton = Scale9Sprite::create("extensions/button.png"); - auto backgroundHighlightedButton = Scale9Sprite::create("extensions/buttonHighlighted.png"); + auto backgroundButton = ui::Scale9Sprite::create("extensions/button.png"); + auto backgroundHighlightedButton = ui::Scale9Sprite::create("extensions/buttonHighlighted.png"); auto titleButton = Label::createWithTTF("Touch Me!", "fonts/Marker Felt.ttf", 30); @@ -156,7 +156,7 @@ bool ControlButtonTest_Event::init() addChild(controlButton, 1); // Add the black background - auto background = Scale9Sprite::create("extensions/buttonBackground.png"); + auto background = ui::Scale9Sprite::create("extensions/buttonBackground.png"); background->setContentSize(Size(300, 170)); background->setPosition(screenSize.width / 2.0f, screenSize.height / 2.0f); addChild(background); @@ -181,47 +181,47 @@ bool ControlButtonTest_Event::init() void ControlButtonTest_Event::touchBitmaskAction(Ref *senderz, Control::EventType controlEvent) { - _displayBitmaskLabel->setString(String::createWithFormat("using bitmask (%d)", controlEvent)->getCString()); + _displayBitmaskLabel->setString(StringUtils::format("using bitmask (%d)", controlEvent)); } void ControlButtonTest_Event::touchDownAction(Ref *senderz, Control::EventType controlEvent) { - _displayValueLabel->setString(String::createWithFormat("Touch Down")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Down")); } void ControlButtonTest_Event::touchDragInsideAction(Ref *sender, Control::EventType controlEvent) { - _displayValueLabel->setString(String::createWithFormat("Drag Inside")->getCString()); + _displayValueLabel->setString(StringUtils::format("Drag Inside")); } void ControlButtonTest_Event::touchDragOutsideAction(Ref *sender, Control::EventType controlEvent) { - _displayValueLabel->setString(String::createWithFormat("Drag Outside")->getCString()); + _displayValueLabel->setString(StringUtils::format("Drag Outside")); } void ControlButtonTest_Event::touchDragEnterAction(Ref *sender, Control::EventType controlEvent) { - _displayValueLabel->setString(String::createWithFormat("Drag Enter")->getCString()); + _displayValueLabel->setString(StringUtils::format("Drag Enter")); } void ControlButtonTest_Event::touchDragExitAction(Ref *sender, Control::EventType controlEvent) { - _displayValueLabel->setString(String::createWithFormat("Drag Exit")->getCString()); + _displayValueLabel->setString(StringUtils::format("Drag Exit")); } void ControlButtonTest_Event::touchUpInsideAction(Ref *sender, Control::EventType controlEvent) { - _displayValueLabel->setString(String::createWithFormat("Touch Up Inside.")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Up Inside.")); } void ControlButtonTest_Event::touchUpOutsideAction(Ref *sender, Control::EventType controlEvent) { - _displayValueLabel->setString(String::createWithFormat("Touch Up Outside.")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Up Outside.")); } void ControlButtonTest_Event::touchCancelAction(Ref *sender, Control::EventType controlEvent) { - _displayValueLabel->setString(String::createWithFormat("Touch Cancel")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Cancel")); } @@ -244,7 +244,7 @@ bool ControlButtonTest_Styling::init() for (int j = 0; j < 3; j++) { // Add the buttons - ControlButton *button = standardButtonWithTitle(String::createWithFormat("%d",rand() % 30)->getCString()); + ControlButton *button = standardButtonWithTitle(StringUtils::format("%d",rand() % 30).c_str()); button->setAdjustBackgroundImage(false); // Tells the button that the background image must not be adjust // It'll use the prefered size of the background image button->setPosition(button->getContentSize().width / 2 + (button->getContentSize().width + space) * i, @@ -261,7 +261,7 @@ bool ControlButtonTest_Styling::init() layer->setPosition(screenSize.width / 2.0f, screenSize.height / 2.0f); // Add the black background - auto backgroundButton = cocos2d::extension::Scale9Sprite::create("extensions/buttonBackground.png"); + auto backgroundButton = ui::Scale9Sprite::create("extensions/buttonBackground.png"); backgroundButton->setContentSize(Size(max_w + 14, max_h + 14)); backgroundButton->setPosition(screenSize.width / 2.0f, screenSize.height / 2.0f); addChild(backgroundButton); @@ -276,9 +276,9 @@ bool ControlButtonTest_Styling::init() ControlButton *ControlButtonTest_Styling::standardButtonWithTitle(const char *title) { /** Creates and return a button with a default background and title color. */ - auto backgroundButton = Scale9Sprite::create("extensions/button.png"); + auto backgroundButton = ui::Scale9Sprite::create("extensions/button.png"); backgroundButton->setPreferredSize(Size(45, 45)); // Set the prefered size - auto backgroundHighlightedButton = Scale9Sprite::create("extensions/buttonHighlighted.png"); + auto backgroundHighlightedButton = ui::Scale9Sprite::create("extensions/buttonHighlighted.png"); backgroundHighlightedButton->setPreferredSize(Size(45, 45)); // Set the prefered size auto titleButton = Label::createWithTTF(title, "fonts/Marker Felt.ttf", 30); diff --git a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlColourPicker/CCControlColourPickerTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlColourPicker/CCControlColourPickerTest.cpp index 084a4fab86..ab0de6f4f3 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlColourPicker/CCControlColourPickerTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlColourPicker/CCControlColourPickerTest.cpp @@ -35,7 +35,7 @@ bool ControlColourPickerTest::init() layer_width += colourPicker->getContentSize().width; // Add the black background for the text - auto background = Scale9Sprite::create("extensions/buttonBackground.png"); + auto background = ui::Scale9Sprite::create("extensions/buttonBackground.png"); background->setContentSize(Size(150, 50)); background->setPosition(layer_width + background->getContentSize().width / 2.0f, 0); layer->addChild(background); @@ -68,7 +68,7 @@ ControlColourPickerTest::~ControlColourPickerTest() void ControlColourPickerTest::colourValueChanged(Ref *sender, Control::EventType controlEvent) { ControlColourPicker* pPicker = (ControlColourPicker*)sender; - _colorLabel->setString(String::createWithFormat("#%02X%02X%02X",pPicker->getColor().r, pPicker->getColor().g, pPicker->getColor().b)->getCString()); + _colorLabel->setString(StringUtils::format("#%02X%02X%02X",pPicker->getColor().r, pPicker->getColor().g, pPicker->getColor().b)); } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlPotentiometerTest/CCControlPotentiometerTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlPotentiometerTest/CCControlPotentiometerTest.cpp index 0eae3a8229..06a714144e 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlPotentiometerTest/CCControlPotentiometerTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlPotentiometerTest/CCControlPotentiometerTest.cpp @@ -51,7 +51,7 @@ bool ControlPotentiometerTest::init() double layer_width = 0; // Add the black background for the text - auto background = Scale9Sprite::create("extensions/buttonBackground.png"); + auto background = ui::Scale9Sprite::create("extensions/buttonBackground.png"); background->setContentSize(Size(80, 50)); background->setPosition(layer_width + background->getContentSize().width / 2.0f, 0); layer->addChild(background); @@ -91,6 +91,6 @@ void ControlPotentiometerTest::valueChanged(Ref *sender, Control::EventType cont { ControlPotentiometer* pControl = (ControlPotentiometer*)sender; // Change value of label. - _displayValueLabel->setString(String::createWithFormat("%.02f", pControl->getValue())->getCString()); + _displayValueLabel->setString(StringUtils::format("%.02f", pControl->getValue())); } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlScene.cpp b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlScene.cpp index 7e4b4daa24..ed6049b8f1 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlScene.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlScene.cpp @@ -40,7 +40,7 @@ bool ControlScene::init() addChild(background); // Add the ribbon - auto ribbon = Scale9Sprite::create("extensions/ribbon.png", Rect(1, 1, 48, 55)); + auto ribbon = ui::Scale9Sprite::create("extensions/ribbon.png", Rect(1, 1, 48, 55)); ribbon->setContentSize(Size(VisibleRect::getVisibleRect().size.width, 57)); ribbon->setPosition(VisibleRect::center().x, VisibleRect::top().y - ribbon->getContentSize().height / 2.0f); addChild(ribbon); diff --git a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlSliderTest/CCControlSliderTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlSliderTest/CCControlSliderTest.cpp index 6d8d46daf6..2d1d25af59 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlSliderTest/CCControlSliderTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlSliderTest/CCControlSliderTest.cpp @@ -85,8 +85,8 @@ void ControlSliderTest::valueChanged(Ref *sender, Control::EventType controlEven ControlSlider* pSlider = (ControlSlider*)sender; // Change value of label. if(pSlider->getTag() == 1) - _displayValueLabel->setString(String::createWithFormat("Upper slider value = %.02f", pSlider->getValue())->getCString()); + _displayValueLabel->setString(StringUtils::format("Upper slider value = %.02f", pSlider->getValue())); if(pSlider->getTag() == 2) - _displayValueLabel->setString(String::createWithFormat("Lower slider value = %.02f", pSlider->getValue())->getCString()); + _displayValueLabel->setString(StringUtils::format("Lower slider value = %.02f", pSlider->getValue())); } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlStepperTest/CCControlStepperTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlStepperTest/CCControlStepperTest.cpp index 8f20a9810d..1d4db3a814 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlStepperTest/CCControlStepperTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlStepperTest/CCControlStepperTest.cpp @@ -52,7 +52,7 @@ bool ControlStepperTest::init() double layer_width = 0; // Add the black background for the text - auto background = Scale9Sprite::create("extensions/buttonBackground.png"); + auto background = ui::Scale9Sprite::create("extensions/buttonBackground.png"); background->setContentSize(Size(100, 50)); background->setPosition(layer_width + background->getContentSize().width / 2.0f, 0); layer->addChild(background); @@ -94,6 +94,6 @@ void ControlStepperTest::valueChanged(Ref *sender, Control::EventType controlEve { ControlStepper* pControl = (ControlStepper*)sender; // Change value of label. - _displayValueLabel->setString(String::createWithFormat("%0.02f", (float)pControl->getValue())->getCString()); + _displayValueLabel->setString(StringUtils::format("%0.02f", (float)pControl->getValue())); } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlSwitchTest/CCControlSwitchTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlSwitchTest/CCControlSwitchTest.cpp index 25b09bb9e5..e922ae0e23 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlSwitchTest/CCControlSwitchTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/ControlExtensionTest/CCControlSwitchTest/CCControlSwitchTest.cpp @@ -47,7 +47,7 @@ bool ControlSwitchTest::init() double layer_width = 0; // Add the black background for the text - auto background = Scale9Sprite::create("extensions/buttonBackground.png"); + auto background = ui::Scale9Sprite::create("extensions/buttonBackground.png"); background->setContentSize(Size(80, 50)); background->setPosition(layer_width + background->getContentSize().width / 2.0f, 0); layer->addChild(background); diff --git a/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/SocketIOTest.h b/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/SocketIOTest.h index 9b0d770199..9923e4a69b 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/SocketIOTest.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/SocketIOTest.h @@ -46,11 +46,11 @@ public: /** * @brief Used for network level socket close (not for disconnect from the socket.io server) */ - virtual void onClose(cocos2d::network::SIOClient* client); + virtual void onClose(cocos2d::network::SIOClient* client)override; /** * @brief Used for network level socket error (not for disconnect from the socket.io server) **/ - virtual void onError(cocos2d::network::SIOClient* client, const std::string& data); + virtual void onError(cocos2d::network::SIOClient* client, const std::string& data)override; /** * @brief Common function to call on both socket.io disconnect and websocket close **/ diff --git a/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.h b/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.h index b5dc73a723..5385337cf0 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/NetworkTest/WebSocketTest.h @@ -25,10 +25,10 @@ public: WebSocketTest(); virtual ~WebSocketTest(); - virtual void onOpen(cocos2d::network::WebSocket* ws); - virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data); - virtual void onClose(cocos2d::network::WebSocket* ws); - virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error); + virtual void onOpen(cocos2d::network::WebSocket* ws)override; + virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data)override; + virtual void onClose(cocos2d::network::WebSocket* ws)override; + virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error)override; // Menu Callbacks void onMenuSendTextClicked(cocos2d::Ref *sender); diff --git a/tests/cpp-tests/Classes/ExtensionsTest/NotificationCenterTest/NotificationCenterTest.cpp b/tests/cpp-tests/Classes/ExtensionsTest/NotificationCenterTest/NotificationCenterTest.cpp index 22e9ab4bc5..6765d6dd0b 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/NotificationCenterTest/NotificationCenterTest.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/NotificationCenterTest/NotificationCenterTest.cpp @@ -38,7 +38,7 @@ Light::Light() Light::~Light() { - NotificationCenter::getInstance()->removeObserver(this, MSG_SWITCH_STATE); + __NotificationCenter::getInstance()->removeObserver(this, MSG_SWITCH_STATE); } Light* Light::lightWithFile(const char* name) @@ -54,11 +54,11 @@ void Light::setIsConnectToSwitch(bool bConnectToSwitch) _connected = bConnectToSwitch; if (_connected) { - NotificationCenter::getInstance()->addObserver(this, CC_CALLFUNCO_SELECTOR(Light::switchStateChanged), MSG_SWITCH_STATE, nullptr); + __NotificationCenter::getInstance()->addObserver(this, CC_CALLFUNCO_SELECTOR(Light::switchStateChanged), MSG_SWITCH_STATE, nullptr); } else { - NotificationCenter::getInstance()->removeObserver(this, MSG_SWITCH_STATE); + __NotificationCenter::getInstance()->removeObserver(this, MSG_SWITCH_STATE); } updateLightState(); } @@ -123,18 +123,18 @@ NotificationCenterTest::NotificationCenterTest() light->setIsConnectToSwitch(bConnected); } - NotificationCenter::getInstance()->postNotification(MSG_SWITCH_STATE, (Ref*)(intptr_t)item->getSelectedIndex()); + __NotificationCenter::getInstance()->postNotification(MSG_SWITCH_STATE, (Ref*)(intptr_t)item->getSelectedIndex()); /* for testing removeAllObservers */ - NotificationCenter::getInstance()->addObserver(this, CC_CALLFUNCO_SELECTOR(NotificationCenterTest::doNothing), "random-observer1", nullptr); - NotificationCenter::getInstance()->addObserver(this, CC_CALLFUNCO_SELECTOR(NotificationCenterTest::doNothing), "random-observer2", nullptr); - NotificationCenter::getInstance()->addObserver(this, CC_CALLFUNCO_SELECTOR(NotificationCenterTest::doNothing), "random-observer3", nullptr); + __NotificationCenter::getInstance()->addObserver(this, CC_CALLFUNCO_SELECTOR(NotificationCenterTest::doNothing), "random-observer1", nullptr); + __NotificationCenter::getInstance()->addObserver(this, CC_CALLFUNCO_SELECTOR(NotificationCenterTest::doNothing), "random-observer2", nullptr); + __NotificationCenter::getInstance()->addObserver(this, CC_CALLFUNCO_SELECTOR(NotificationCenterTest::doNothing), "random-observer3", nullptr); } NotificationCenterTest::~NotificationCenterTest() { /* for testing removeAllObservers */ - int CC_UNUSED numObserversRemoved = NotificationCenter::getInstance()->removeAllObservers(this); + int CC_UNUSED numObserversRemoved = __NotificationCenter::getInstance()->removeAllObservers(this); CCASSERT(numObserversRemoved >= 3, "All observers were not removed!"); } @@ -142,7 +142,7 @@ void NotificationCenterTest::toggleSwitch(Ref *sender) { auto item = (MenuItemToggle*)sender; int index = item->getSelectedIndex(); - NotificationCenter::getInstance()->postNotification(MSG_SWITCH_STATE, (Ref*)(intptr_t)index); + __NotificationCenter::getInstance()->postNotification(MSG_SWITCH_STATE, (Ref*)(intptr_t)index); } void NotificationCenterTest::connectToSwitch(Ref *sender) diff --git a/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.cpp b/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.cpp index 77c1d6e34e..2d74de23f5 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.cpp +++ b/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.cpp @@ -53,7 +53,7 @@ Size TableViewTest::tableCellSizeForIndex(TableView *table, ssize_t idx) TableViewCell* TableViewTest::tableCellAtIndex(TableView *table, ssize_t idx) { - auto string = String::createWithFormat("%ld", idx); + auto string = StringUtils::format("%ld", idx); TableViewCell *cell = table->dequeueCell(); if (!cell) { cell = new (std::nothrow) CustomTableViewCell(); @@ -63,7 +63,7 @@ TableViewCell* TableViewTest::tableCellAtIndex(TableView *table, ssize_t idx) sprite->setPosition(Vec2(0, 0)); cell->addChild(sprite); - auto label = Label::createWithSystemFont(string->getCString(), "Helvetica", 20.0); + auto label = Label::createWithSystemFont(string, "Helvetica", 20.0); label->setPosition(Vec2::ZERO); label->setAnchorPoint(Vec2::ZERO); label->setTag(123); @@ -72,7 +72,7 @@ TableViewCell* TableViewTest::tableCellAtIndex(TableView *table, ssize_t idx) else { auto label = (Label*)cell->getChildByTag(123); - label->setString(string->getCString()); + label->setString(string); } diff --git a/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.h b/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.h index 286c185a51..48f081be94 100644 --- a/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.h +++ b/tests/cpp-tests/Classes/ExtensionsTest/TableViewTest/TableViewTestScene.h @@ -14,12 +14,12 @@ public: virtual bool init() override; - virtual void scrollViewDidScroll(cocos2d::extension::ScrollView* view) {}; - virtual void scrollViewDidZoom(cocos2d::extension::ScrollView* view) {} - virtual void tableCellTouched(cocos2d::extension::TableView* table, cocos2d::extension::TableViewCell* cell); - virtual cocos2d::Size tableCellSizeForIndex(cocos2d::extension::TableView *table, ssize_t idx); - virtual cocos2d::extension::TableViewCell* tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx); - virtual ssize_t numberOfCellsInTableView(cocos2d::extension::TableView *table); + virtual void scrollViewDidScroll(cocos2d::extension::ScrollView* view)override {}; + virtual void scrollViewDidZoom(cocos2d::extension::ScrollView* view)override {} + virtual void tableCellTouched(cocos2d::extension::TableView* table, cocos2d::extension::TableViewCell* cell)override; + virtual cocos2d::Size tableCellSizeForIndex(cocos2d::extension::TableView *table, ssize_t idx)override; + virtual cocos2d::extension::TableViewCell* tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx)override; + virtual ssize_t numberOfCellsInTableView(cocos2d::extension::TableView *table)override; }; #endif // __TABLEVIEWTESTSCENE_H__ diff --git a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp index 41865bd86b..c6df43d6c0 100644 --- a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp +++ b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp @@ -47,9 +47,9 @@ void TestResolutionDirectories::onEnter() sharedFileUtils->setSearchResolutionsOrder(resolutionsOrder); for( int i=1; i<7; i++) { - auto filename = String::createWithFormat("test%d.txt", i); - ret = sharedFileUtils->fullPathForFilename(filename->getCString()); - log("%s -> %s", filename->getCString(), ret.c_str()); + auto filename = StringUtils::format("test%d.txt", i); + ret = sharedFileUtils->fullPathForFilename(filename); + log("%s -> %s", filename.c_str(), ret.c_str()); } } @@ -110,9 +110,9 @@ void TestSearchPath::onEnter() sharedFileUtils->setSearchResolutionsOrder(resolutionsOrder); for( int i=1; i<3; i++) { - auto filename = String::createWithFormat("file%d.txt", i); - ret = sharedFileUtils->fullPathForFilename(filename->getCString()); - log("%s -> %s", filename->getCString(), ret.c_str()); + auto filename = StringUtils::format("file%d.txt", i); + ret = sharedFileUtils->fullPathForFilename(filename); + log("%s -> %s", filename.c_str(), ret.c_str()); } // Gets external.txt from writable path @@ -456,43 +456,43 @@ std::string TestDirectoryFuncs::subtitle() const void TextWritePlist::onEnter() { FileUtilsDemo::onEnter(); - auto root = Dictionary::create(); - auto string = String::create("string element value"); + auto root = __Dictionary::create(); + auto string = __String::create("string element value"); root->setObject(string, "string element key"); - auto array = Array::create(); + auto array = __Array::create(); - auto dictInArray = Dictionary::create(); - dictInArray->setObject(String::create("string in dictInArray value 0"), "string in dictInArray key 0"); - dictInArray->setObject(String::create("string in dictInArray value 1"), "string in dictInArray key 1"); + auto dictInArray = __Dictionary::create(); + dictInArray->setObject(__String::create("string in dictInArray value 0"), "string in dictInArray key 0"); + dictInArray->setObject(__String::create("string in dictInArray value 1"), "string in dictInArray key 1"); array->addObject(dictInArray); - array->addObject(String::create("string in array")); + array->addObject(__String::create("string in array")); - auto arrayInArray = Array::create(); - arrayInArray->addObject(String::create("string 0 in arrayInArray")); - arrayInArray->addObject(String::create("string 1 in arrayInArray")); + auto arrayInArray = __Array::create(); + arrayInArray->addObject(__String::create("string 0 in arrayInArray")); + arrayInArray->addObject(__String::create("string 1 in arrayInArray")); array->addObject(arrayInArray); root->setObject(array, "array"); - auto dictInDict = Dictionary::create(); - dictInDict->setObject(String::create("string in dictInDict value"), "string in dictInDict key"); + auto dictInDict = __Dictionary::create(); + dictInDict->setObject(__String::create("string in dictInDict value"), "string in dictInDict key"); //add boolean to the plist - auto booleanObject = Bool::create(true); + auto booleanObject = __Bool::create(true); dictInDict->setObject(booleanObject, "bool"); //add interger to the plist - auto intObject = Integer::create(1024); + auto intObject = __Integer::create(1024); dictInDict->setObject(intObject, "integer"); //add float to the plist - auto floatObject = Float::create(1024.1024f); + auto floatObject = __Float::create(1024.1024f); dictInDict->setObject(floatObject, "float"); //add double to the plist - auto doubleObject = Double::create(1024.123); + auto doubleObject = __Double::create(1024.123); dictInDict->setObject(doubleObject, "double"); diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp index d907b824f5..0b79bd2f12 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp @@ -1581,7 +1581,7 @@ const char* LabelAlignmentTest::getCurrentAlignment() break; } - return String::createWithFormat("Alignment %s %s", vertical, horizontal)->getCString(); + return StringUtils::format("Alignment %s %s", vertical, horizontal).c_str(); } std::string LabelAlignmentTest::title() const diff --git a/tests/cpp-tests/Classes/NavMeshTest/NavMeshTest.h b/tests/cpp-tests/Classes/NavMeshTest/NavMeshTest.h index 146ca249ec..d83edd2cc0 100644 --- a/tests/cpp-tests/Classes/NavMeshTest/NavMeshTest.h +++ b/tests/cpp-tests/Classes/NavMeshTest/NavMeshTest.h @@ -88,9 +88,9 @@ public: protected: - virtual void touchesBegan(const std::vector& touches, cocos2d::Event *event){}; - virtual void touchesMoved(const std::vector& touches, cocos2d::Event *event){}; - virtual void touchesEnded(const std::vector& touches, cocos2d::Event *event); + virtual void touchesBegan(const std::vector& touches, cocos2d::Event *event)override{}; + virtual void touchesMoved(const std::vector& touches, cocos2d::Event *event)override{}; + virtual void touchesEnded(const std::vector& touches, cocos2d::Event *event)override; protected: cocos2d::Label *_debugLabel; @@ -112,9 +112,9 @@ public: protected: - virtual void touchesBegan(const std::vector& touches, cocos2d::Event *event){}; - virtual void touchesMoved(const std::vector& touches, cocos2d::Event *event){}; - virtual void touchesEnded(const std::vector& touches, cocos2d::Event *event); + virtual void touchesBegan(const std::vector& touches, cocos2d::Event *event)override{}; + virtual void touchesMoved(const std::vector& touches, cocos2d::Event *event)override{}; + virtual void touchesEnded(const std::vector& touches, cocos2d::Event *event)override; protected: cocos2d::Label *_obstacleLabel; diff --git a/tests/cpp-tests/Classes/ParticleTest/ParticleTest.cpp b/tests/cpp-tests/Classes/ParticleTest/ParticleTest.cpp index ecaa86d5e4..d43e3ad46c 100644 --- a/tests/cpp-tests/Classes/ParticleTest/ParticleTest.cpp +++ b/tests/cpp-tests/Classes/ParticleTest/ParticleTest.cpp @@ -1316,7 +1316,7 @@ void ParticleReorder::reorderParticles(float dt) class RainbowEffect : public ParticleSystemQuad { public: - bool init(); + bool init()override; virtual bool initWithTotalParticles(int numberOfParticles) override; virtual void update(float dt) override; }; diff --git a/tests/cpp-tests/Classes/ParticleTest/ParticleTest.h b/tests/cpp-tests/Classes/ParticleTest/ParticleTest.h index 56d4220c8f..a7c5a8cbba 100644 --- a/tests/cpp-tests/Classes/ParticleTest/ParticleTest.h +++ b/tests/cpp-tests/Classes/ParticleTest/ParticleTest.h @@ -15,7 +15,7 @@ protected: public: ~ParticleDemo(); - virtual void onEnter(); + virtual void onEnter()override; virtual std::string title() const override; virtual std::string subtitle() const override; diff --git a/tests/cpp-tests/Classes/PerformanceTest/PerformanceAllocTest.h b/tests/cpp-tests/Classes/PerformanceTest/PerformanceAllocTest.h index fd70b950df..6221a6a7eb 100644 --- a/tests/cpp-tests/Classes/PerformanceTest/PerformanceAllocTest.h +++ b/tests/cpp-tests/Classes/PerformanceTest/PerformanceAllocTest.h @@ -13,8 +13,8 @@ class PerformceAllocScene : public TestCase public: virtual bool init() override; virtual void initWithQuantityOfNodes(unsigned int nNodes); - virtual std::string title() const; - virtual std::string subtitle() const; + virtual std::string title() const override; + virtual std::string subtitle() const override; virtual void updateQuantityOfNodes() = 0; const char* profilerName(); diff --git a/tests/cpp-tests/Classes/PerformanceTest/PerformanceCallbackTest.h b/tests/cpp-tests/Classes/PerformanceTest/PerformanceCallbackTest.h index bed606e66f..cce620f34d 100644 --- a/tests/cpp-tests/Classes/PerformanceTest/PerformanceCallbackTest.h +++ b/tests/cpp-tests/Classes/PerformanceTest/PerformanceCallbackTest.h @@ -12,8 +12,8 @@ class PerformanceCallbackScene : public TestCase { public: virtual void onEnter() override; - virtual std::string title() const; - virtual std::string subtitle() const; + virtual std::string title() const override; + virtual std::string subtitle() const override; virtual void onUpdate(float dt) {}; void dumpProfilerInfo(float dt); diff --git a/tests/cpp-tests/Classes/PerformanceTest/PerformanceContainerTest.cpp b/tests/cpp-tests/Classes/PerformanceTest/PerformanceContainerTest.cpp index 5cd1753122..853e151e95 100644 --- a/tests/cpp-tests/Classes/PerformanceTest/PerformanceContainerTest.cpp +++ b/tests/cpp-tests/Classes/PerformanceTest/PerformanceContainerTest.cpp @@ -482,7 +482,7 @@ std::string ArrayPerfTest::subtitle() const void ArrayPerfTest::generateTestFunctions() { auto createArray = [this](){ - __Array* ret = Array::create(); + __Array* ret = __Array::create(); for( int i=0; iprofilerName()); for( int i=0; iprofilerName()); } } , { "insertObject", [=](){ - __Array* nodeVector = Array::create(); + __Array* nodeVector = __Array::create(); CC_PROFILER_START(this->profilerName()); for( int i=0; iprofilerName()); for( int i=0; isetPosition(itemPos); _playerDlg->addChild(itemBg); - auto item = ui::Button::create("crystal.png", "", "", ui::TextureResType::PLIST); + auto item = ui::Button::create("crystal.png", "", "", ui::Widget::TextureResType::PLIST); item->setTitleText("Crystal"); item->setScale(1.5); item->setAnchorPoint(itemAnchor); diff --git a/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp b/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp index 46a6ee9c8d..4a73940f36 100644 --- a/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp +++ b/tests/cpp-tests/Classes/ShaderTest/ShaderTest.cpp @@ -401,8 +401,8 @@ bool SpriteBlur::initWithTexture(Texture2D* texture, const Rect& rect) void SpriteBlur::initGLProgram() { - GLchar * fragSource = (GLchar*) String::createWithContentsOfFile( - FileUtils::getInstance()->fullPathForFilename("Shaders/example_Blur.fsh").c_str())->getCString(); + GLchar * fragSource = (GLchar*) FileUtils::getInstance()->getStringFromFile( + FileUtils::getInstance()->fullPathForFilename("Shaders/example_Blur.fsh")).c_str(); auto program = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert, fragSource); auto glProgramState = GLProgramState::getOrCreateWithGLProgram(program); @@ -530,7 +530,7 @@ bool ShaderRetroEffect::init() { if( ShaderTestDemo::init() ) { - GLchar * fragSource = (GLchar*) String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename("Shaders/example_HorizontalColor.fsh"))->getCString(); + GLchar * fragSource = (GLchar*) FileUtils::getInstance()->getStringFromFile(FileUtils::getInstance()->fullPathForFilename("Shaders/example_HorizontalColor.fsh")).c_str(); auto p = GLProgram::createWithByteArrays(ccPositionTexture_vert, fragSource); auto director = Director::getInstance(); diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 6613cb3819..b66d1af49a 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -1186,7 +1186,7 @@ AsyncLoadSprite3DTest::AsyncLoadSprite3DTest() auto s = Director::getInstance()->getWinSize(); item1->setPosition( s.width * .5f, s.height * .8f); - auto pMenu1 = CCMenu::create(item1, nullptr); + auto pMenu1 = Menu::create(item1, nullptr); pMenu1->setPosition(Vec2(0,0)); this->addChild(pMenu1, 10); @@ -1638,7 +1638,7 @@ Sprite3DReskinTest::Sprite3DReskinTest() item3->setUserData((void*)SkinType::UPPER_BODY); item4->setUserData((void*)SkinType::PANTS); item5->setUserData((void*)SkinType::SHOES); - auto pMenu1 = CCMenu::create(item1, item2, item3, item4, item5, nullptr); + auto pMenu1 = Menu::create(item1, item2, item3, item4, item5, nullptr); pMenu1->setPosition(Vec2(0,0)); this->addChild(pMenu1, 10); @@ -2231,7 +2231,7 @@ void UseCaseSprite3D::switchCase() item1->setPosition( Vec2(s.width * 0.5f - item1->getContentSize().width * 0.5f, s.height * 0.5f - item1->getContentSize().height ) ); item2->setPosition( Vec2(s.width * 0.5f - item1->getContentSize().width * 0.5f, s.height * 0.5f - item1->getContentSize().height * 2.f ) ); - auto pMenu1 = CCMenu::create(item1, item2, nullptr); + auto pMenu1 = Menu::create(item1, item2, nullptr); pMenu1->setPosition(Vec2(0,0)); layer->addChild(pMenu1); @@ -2543,7 +2543,7 @@ Issue9767::Issue9767() item1->setPosition( Vec2(s.width * 0.9f - item1->getContentSize().width * 0.5f, s.height * 0.5f - item1->getContentSize().height ) ); - auto pMenu1 = CCMenu::create(item1, nullptr); + auto pMenu1 = Menu::create(item1, nullptr); pMenu1->setPosition(Vec2(0,0)); addChild(pMenu1); } diff --git a/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.h b/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.h index 13f8a93868..72373fbf8d 100644 --- a/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.h +++ b/tests/cpp-tests/Classes/SpritePolygonTest/SpritePolygonTest.h @@ -8,7 +8,7 @@ DEFINE_TEST_SUITE(SpritePolygonTest); class SpritePolygonTestCase : public TestCase { protected: - virtual void onBackCallback(Ref* sender); + virtual void onBackCallback(Ref* sender)override; std::string _title; std::string _subtitle; virtual std::string title() const override {return _title;}; diff --git a/tests/cpp-tests/Classes/SpriteTest/SpriteTest.cpp b/tests/cpp-tests/Classes/SpriteTest/SpriteTest.cpp index 7454a02903..dbfeedd6af 100644 --- a/tests/cpp-tests/Classes/SpriteTest/SpriteTest.cpp +++ b/tests/cpp-tests/Classes/SpriteTest/SpriteTest.cpp @@ -584,7 +584,7 @@ std::string SpriteBatchNodeZOrder::subtitle() const SpriteBatchNodeReorder::SpriteBatchNodeReorder() { - auto a = Array::createWithCapacity(10); + auto a = __Array::createWithCapacity(10); auto asmtest = SpriteBatchNode::create("animations/ghosts.png"); for(int i=0; i<10; i++) diff --git a/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h b/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h index 5e6668ae7f..0ea4f15dbe 100644 --- a/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h +++ b/tests/cpp-tests/Classes/TextInputTest/TextInputTest.h @@ -18,7 +18,7 @@ public: virtual std::string title() const override; virtual void onClickTrackNode(bool bClicked) = 0; - virtual void keyboardWillShow(cocos2d::IMEKeyboardNotificationInfo& info); + virtual void keyboardWillShow(cocos2d::IMEKeyboardNotificationInfo& info)override; bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event); void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event); diff --git a/tests/cpp-tests/Classes/TexturePackerEncryptionTest/TextureAtlasEncryptionTest.h b/tests/cpp-tests/Classes/TexturePackerEncryptionTest/TextureAtlasEncryptionTest.h index c525cf53c5..a87ef01770 100644 --- a/tests/cpp-tests/Classes/TexturePackerEncryptionTest/TextureAtlasEncryptionTest.h +++ b/tests/cpp-tests/Classes/TexturePackerEncryptionTest/TextureAtlasEncryptionTest.h @@ -12,7 +12,7 @@ class TextureAtlasEncryptionDemo : public TestCase public: CREATE_FUNC(TextureAtlasEncryptionDemo); - virtual std::string title() const; + virtual std::string title() const override; virtual void onEnter() override; protected: diff --git a/tests/cpp-tests/Classes/TileMapTest/TileMapTest.cpp b/tests/cpp-tests/Classes/TileMapTest/TileMapTest.cpp index 62480a131a..676df1d2f9 100644 --- a/tests/cpp-tests/Classes/TileMapTest/TileMapTest.cpp +++ b/tests/cpp-tests/Classes/TileMapTest/TileMapTest.cpp @@ -1294,7 +1294,7 @@ TMXOrthoFromXMLTest::TMXOrthoFromXMLTest() std::string resources = "TileMaps"; // partial paths are OK as resource paths. std::string file = resources + "/orthogonal-test1.tmx"; - auto str = String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename(file.c_str()).c_str()); + auto str = __String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename(file.c_str()).c_str()); CCASSERT(str != nullptr, "Unable to open file"); auto map = TMXTiledMap::createWithXML(str->getCString() ,resources.c_str()); diff --git a/tests/cpp-tests/Classes/TileMapTest/TileMapTest.h b/tests/cpp-tests/Classes/TileMapTest/TileMapTest.h index 72f4bacdfe..831aa18610 100644 --- a/tests/cpp-tests/Classes/TileMapTest/TileMapTest.h +++ b/tests/cpp-tests/Classes/TileMapTest/TileMapTest.h @@ -186,7 +186,7 @@ public: TMXIsoZorder(); virtual std::string title() const override; virtual std::string subtitle() const override; - virtual void onExit(); + virtual void onExit()override; ~TMXIsoZorder(); void repositionSprite(float dt); diff --git a/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp b/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp index 8468e44720..83d4f5ab55 100644 --- a/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp +++ b/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.cpp @@ -1211,7 +1211,7 @@ TMXOrthoFromXMLTestNew::TMXOrthoFromXMLTestNew() std::string resources = "TileMaps"; // partial paths are OK as resource paths. std::string file = resources + "/orthogonal-test1.tmx"; - auto str = String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename(file.c_str()).c_str()); + auto str = __String::createWithContentsOfFile(FileUtils::getInstance()->fullPathForFilename(file.c_str()).c_str()); CCASSERT(str != nullptr, "Unable to open file"); auto map = cocos2d::experimental::TMXTiledMap::createWithXML(str->getCString() ,resources.c_str()); diff --git a/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.h b/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.h index b88b76f60b..181586439d 100644 --- a/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.h +++ b/tests/cpp-tests/Classes/TileMapTest/TileMapTest2.h @@ -173,7 +173,7 @@ public: TMXIsoZorderNew(); virtual std::string title() const override; virtual std::string subtitle() const override; - virtual void onExit(); + virtual void onExit()override; ~TMXIsoZorderNew(); void repositionSprite(float dt); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CustomWidget/CustomParticleWidget.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CustomWidget/CustomParticleWidget.h index 51ea40700f..61c049096a 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CustomWidget/CustomParticleWidget.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CustomWidget/CustomParticleWidget.h @@ -37,9 +37,9 @@ public: protected: virtual bool init() override; - virtual void initRenderer(); + virtual void initRenderer()override; - virtual void removeAllChildren(); + virtual void removeAllChildren()override; protected: cocos2d::ParticleSystem* _emitter; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp index 3db6191344..6d64f1e43b 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp @@ -86,16 +86,16 @@ void UIButtonTest::touchEvent(Ref *pSender, Widget::TouchEventType type) switch (type) { case Widget::TouchEventType::BEGAN: - _displayValueLabel->setString(String::createWithFormat("Touch Down")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Down")); break; case Widget::TouchEventType::MOVED: - _displayValueLabel->setString(String::createWithFormat("Touch Move")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Move")); break; case Widget::TouchEventType::ENDED: { - _displayValueLabel->setString(String::createWithFormat("Touch Up")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Up")); ImageView* imageView = (ImageView*)_uiLayer->getChildByTag(12); imageView->setVisible(false); imageView->loadTexture("cocosui/ccicon.png"); @@ -108,7 +108,7 @@ void UIButtonTest::touchEvent(Ref *pSender, Widget::TouchEventType type) break; case Widget::TouchEventType::CANCELED: - _displayValueLabel->setString(String::createWithFormat("Touch Cancelled")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Cancelled")); break; default: @@ -177,16 +177,16 @@ void UIButtonTest_Scale9::touchEvent(Ref *pSender, Widget::TouchEventType type) switch (type) { case Widget::TouchEventType::BEGAN: - _displayValueLabel->setString(String::createWithFormat("Touch Down")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Down")); break; case Widget::TouchEventType::MOVED: - _displayValueLabel->setString(String::createWithFormat("Touch Move")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Move")); break; case Widget::TouchEventType::ENDED: { - _displayValueLabel->setString(String::createWithFormat("Touch Up")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Up")); Button *btn = (Button*)_uiLayer->getChildByName("normal"); btn->loadTextureNormal("cocosui/animationbuttonnormal.png"); btn->loadTexturePressed("cocosui/animationbuttonpressed.png"); @@ -195,7 +195,7 @@ void UIButtonTest_Scale9::touchEvent(Ref *pSender, Widget::TouchEventType type) break; case Widget::TouchEventType::CANCELED: - _displayValueLabel->setString(String::createWithFormat("Touch Cancelled")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Cancelled")); break; default: @@ -266,16 +266,16 @@ void UIButtonTest_Scale9_State_Change::touchEvent(Ref *pSender, Widget::TouchEve switch (type) { case Widget::TouchEventType::BEGAN: - _displayValueLabel->setString(String::createWithFormat("Touch Down")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Down")); break; case Widget::TouchEventType::MOVED: - _displayValueLabel->setString(String::createWithFormat("Touch Move")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Move")); break; case Widget::TouchEventType::ENDED: { - _displayValueLabel->setString(String::createWithFormat("Touch Up")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Up")); Button *btn = (Button*)pSender; if (btn->isScale9Enabled()) { @@ -287,7 +287,7 @@ void UIButtonTest_Scale9_State_Change::touchEvent(Ref *pSender, Widget::TouchEve break; case Widget::TouchEventType::CANCELED: - _displayValueLabel->setString(String::createWithFormat("Touch Cancelled")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Cancelled")); break; default: @@ -351,16 +351,16 @@ void UIButtonTest_PressedAction::touchEvent(Ref *pSender, Widget::TouchEventType switch (type) { case Widget::TouchEventType::BEGAN: - _displayValueLabel->setString(String::createWithFormat("Touch Down")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Down")); break; case Widget::TouchEventType::MOVED: - _displayValueLabel->setString(String::createWithFormat("Touch Move")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Move")); break; case Widget::TouchEventType::ENDED: { - _displayValueLabel->setString(String::createWithFormat("Touch Up")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Up")); Button* btn = (Button*)_uiLayer->getChildByName("button"); btn->loadTextureNormal("cocosui/animationbuttonnormal.png"); @@ -370,7 +370,7 @@ void UIButtonTest_PressedAction::touchEvent(Ref *pSender, Widget::TouchEventType break; case Widget::TouchEventType::CANCELED: - _displayValueLabel->setString(String::createWithFormat("Touch Cancelled")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Cancelled")); break; default: @@ -451,16 +451,16 @@ void UIButtonTest_Title::touchEvent(Ref *pSender, Widget::TouchEventType type) switch (type) { case Widget::TouchEventType::BEGAN: - _displayValueLabel->setString(String::createWithFormat("Touch Down")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Down")); break; case Widget::TouchEventType::MOVED: - _displayValueLabel->setString(String::createWithFormat("Touch Move")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Move")); break; case Widget::TouchEventType::ENDED: { - _displayValueLabel->setString(String::createWithFormat("Touch Up")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Up")); TextBMFont *text = (TextBMFont*)_uiLayer->getChildByName("text"); text->setFntFile("cocosui/bitmapFontTest2.fnt"); if (text->getString() == "BMFont") { @@ -473,7 +473,7 @@ void UIButtonTest_Title::touchEvent(Ref *pSender, Widget::TouchEventType type) break; case Widget::TouchEventType::CANCELED: - _displayValueLabel->setString(String::createWithFormat("Touch Cancelled")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Cancelled")); break; default: @@ -544,23 +544,23 @@ void UIButtonTestRemoveSelf::touchEvent(Ref *pSender, Widget::TouchEventType typ switch (type) { case Widget::TouchEventType::BEGAN: - _displayValueLabel->setString(String::createWithFormat("Touch Down")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Down")); break; case Widget::TouchEventType::MOVED: - _displayValueLabel->setString(String::createWithFormat("Touch Move")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Move")); break; case Widget::TouchEventType::ENDED: { - _displayValueLabel->setString(String::createWithFormat("Touch Up")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Up")); auto layout = _uiLayer->getChildByTag(12); layout->removeFromParentAndCleanup(true); } break; case Widget::TouchEventType::CANCELED: - _displayValueLabel->setString(String::createWithFormat("Touch Cancelled")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Cancelled")); break; default: @@ -614,16 +614,16 @@ void UIButtonTestSwitchScale9::touchEvent(Ref *pSender, Widget::TouchEventType t switch (type) { case Widget::TouchEventType::BEGAN: - _displayValueLabel->setString(String::createWithFormat("Touch Down")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Down")); break; case Widget::TouchEventType::MOVED: - _displayValueLabel->setString(String::createWithFormat("Touch Move")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Move")); break; case Widget::TouchEventType::ENDED: { - _displayValueLabel->setString(String::createWithFormat("Touch Up")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Up")); auto btn = ((Button*)pSender); btn->setScale9Enabled(!btn->isScale9Enabled()); btn->setContentSize(Size(200,100)); @@ -631,7 +631,7 @@ void UIButtonTestSwitchScale9::touchEvent(Ref *pSender, Widget::TouchEventType t break; case Widget::TouchEventType::CANCELED: - _displayValueLabel->setString(String::createWithFormat("Touch Cancelled")->getCString()); + _displayValueLabel->setString(StringUtils::format("Touch Cancelled")); break; default: @@ -700,7 +700,7 @@ void UIButtonTestZoomScale::sliderEvent(Ref *pSender, Slider::EventType type) Button* btn = (Button*)_uiLayer->getChildByName("button"); float zoomScale = percent * 0.01; btn->setZoomScale(zoomScale); - _displayValueLabel->setString(String::createWithFormat("Zoom Scale: %f", zoomScale)->getCString()); + _displayValueLabel->setString(StringUtils::format("Zoom Scale: %f", zoomScale)); } } diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp index f073d331bc..746705dc41 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp @@ -60,11 +60,11 @@ void UICheckBoxTest::selectedEvent(Ref* pSender,CheckBox::EventType type) switch (type) { case CheckBox::EventType::SELECTED: - _displayValueLabel->setString(String::createWithFormat("Selected")->getCString()); + _displayValueLabel->setString(StringUtils::format("Selected")); break; case CheckBox::EventType::UNSELECTED: - _displayValueLabel->setString(String::createWithFormat("Unselected")->getCString()); + _displayValueLabel->setString(StringUtils::format("Unselected")); break; default: diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIEditBoxTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIEditBoxTest.h index 11b60eabbb..c4680c30c6 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIEditBoxTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIEditBoxTest.h @@ -36,10 +36,10 @@ public: virtual bool init() override; - virtual void editBoxEditingDidBegin(cocos2d::ui::EditBox* editBox); - virtual void editBoxEditingDidEnd(cocos2d::ui::EditBox* editBox); - virtual void editBoxTextChanged(cocos2d::ui::EditBox* editBox, const std::string& text); - virtual void editBoxReturn(cocos2d::ui::EditBox* editBox); + virtual void editBoxEditingDidBegin(cocos2d::ui::EditBox* editBox)override; + virtual void editBoxEditingDidEnd(cocos2d::ui::EditBox* editBox)override; + virtual void editBoxTextChanged(cocos2d::ui::EditBox* editBox, const std::string& text)override; + virtual void editBoxReturn(cocos2d::ui::EditBox* editBox)override; protected: diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp index b38944ac00..02cdb5d4d5 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp @@ -361,7 +361,7 @@ bool UILayoutTest_Layout_Linear_Vertical::init() // Create the layout Layout* layout = Layout::create(); - layout->setLayoutType(LayoutType::VERTICAL); + layout->setLayoutType(Layout::Type::VERTICAL); layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + @@ -435,7 +435,7 @@ bool UILayoutTest_Layout_Linear_Horizontal::init() // Create the layout Layout* layout = Layout::create(); - layout->setLayoutType(LayoutType::HORIZONTAL); + layout->setLayoutType(Layout::Type::HORIZONTAL); layout->setClippingEnabled(true); layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); @@ -509,7 +509,7 @@ bool UILayoutTest_Layout_Relative_Align_Parent::init() // Create the layout Layout* layout = Layout::create(); - layout->setLayoutType(LayoutType::RELATIVE); + layout->setLayoutType(Layout::Type::RELATIVE); layout->setContentSize(Size(280, 150)); layout->setBackGroundColorType(Layout::BackGroundColorType::SOLID); layout->setBackGroundColor(Color3B::GREEN); @@ -644,7 +644,7 @@ bool UILayoutTest_Layout_Relative_Location::init() // Create the layout Layout* layout = Layout::create(); - layout->setLayoutType(LayoutType::RELATIVE); + layout->setLayoutType(Layout::Type::RELATIVE); layout->setContentSize(Size(280, 150)); Size backgroundSize = background->getContentSize(); layout->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp index ba91c867db..a5501f5f59 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp @@ -457,7 +457,7 @@ void UILayoutComponentTest_Editor::onChangeLayoutComponent(Ref* sender) } } - statusPin = String::createWithFormat("Pin:%s%s", hPinStatus.c_str(), vPinStatus.c_str())->getCString(); + statusPin = StringUtils::format("Pin:%s%s", hPinStatus.c_str(), vPinStatus.c_str()); _textPin->setString(statusPin); auto layoutComponent = ui::LayoutComponent::bindLayoutComponent(_widget); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp index db674baa1d..e147286811 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest_Editor.cpp @@ -52,7 +52,7 @@ void UIListViewTest_Vertical_Editor::setupListView(ListView* listView) float itemMargin = listView->getItemsMargin(); auto item0 = Text::create(); - item0->setString(String::createWithFormat("Item margin: %d", static_cast(itemMargin))->getCString()); + item0->setString(StringUtils::format("Item margin: %d", static_cast(itemMargin))); listView->addChild(item0); auto item1 = Layout::create(); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.h index c5a2e58865..d70d73c8d4 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.h @@ -37,7 +37,7 @@ public: UILoadingBarTest_Left(); ~UILoadingBarTest_Left(); virtual bool init() override; - void update(float delta); + void update(float delta)override; protected: int _count; @@ -51,7 +51,7 @@ public: UILoadingBarTest_Right(); ~UILoadingBarTest_Right(); virtual bool init() override; - void update(float delta); + void update(float delta)override; protected: int _count; @@ -65,7 +65,7 @@ public: UILoadingBarTest_Left_Scale9(); ~UILoadingBarTest_Left_Scale9(); virtual bool init() override; - void update(float delta); + void update(float delta)override; protected: int _count; @@ -79,7 +79,7 @@ public: UILoadingBarTest_Right_Scale9(); ~UILoadingBarTest_Right_Scale9(); virtual bool init() override; - void update(float delta); + void update(float delta)override; protected: int _count; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.h index 5d12bb196a..60b4d4a9ab 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest_Editor.h @@ -15,7 +15,7 @@ public: UILoadingBarTest_Editor(); ~UILoadingBarTest_Editor(); virtual bool init() override; - void update(float delta); + void update(float delta)override; virtual void configureGUIScene() override; protected: diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp index cb31870d94..fac654eb94 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp @@ -99,7 +99,7 @@ void UIPageViewTest::pageViewEvent(Ref *pSender, PageView::EventType type) { PageView* pageView = dynamic_cast(pSender); - _displayValueLabel->setString(CCString::createWithFormat("page = %ld", pageView->getCurPageIndex() + 1)->getCString()); + _displayValueLabel->setString(StringUtils::format("page = %ld", pageView->getCurPageIndex() + 1)); } break; @@ -209,7 +209,7 @@ void UIPageViewButtonTest::pageViewEvent(Ref *pSender, PageView::EventType type) { PageView* pageView = dynamic_cast(pSender); - _displayValueLabel->setString(CCString::createWithFormat("page = %ld", pageView->getCurPageIndex() + 1)->getCString()); + _displayValueLabel->setString(StringUtils::format("page = %ld", pageView->getCurPageIndex() + 1)); } break; @@ -314,7 +314,7 @@ void UIPageViewCustomScrollThreshold::sliderEvent(Ref *pSender, Slider::EventTyp } pageView->setCustomScrollThreshold(percent * 0.01 * pageView->getContentSize().width); - _displayValueLabel->setString(String::createWithFormat("Scroll Threshold: %f", pageView->getCustomScrollThreshold())->getCString()); + _displayValueLabel->setString(StringUtils::format("Scroll Threshold: %f", pageView->getCustomScrollThreshold())); } } @@ -505,7 +505,7 @@ void UIPageViewTouchPropagationTest::pageViewEvent(Ref *pSender, PageView::Event { PageView* pageView = dynamic_cast(pSender); - _displayValueLabel->setString(CCString::createWithFormat("page = %ld", pageView->getCurPageIndex() + 1)->getCString()); + _displayValueLabel->setString(StringUtils::format("page = %ld", pageView->getCurPageIndex() + 1)); } break; @@ -626,7 +626,7 @@ bool UIPageViewDynamicAddAndRemoveTest::init() } pageView->addPage(outerBox); - _displayValueLabel->setString(CCString::createWithFormat("page count = %ld", pageView->getPages().size())->getCString()); + _displayValueLabel->setString(StringUtils::format("page count = %ld", pageView->getPages().size())); }); _uiLayer->addChild(button); @@ -647,7 +647,7 @@ bool UIPageViewDynamicAddAndRemoveTest::init() { CCLOG("There is no page to remove!"); } - _displayValueLabel->setString(CCString::createWithFormat("page count = %ld", pageView->getPages().size())->getCString()); + _displayValueLabel->setString(StringUtils::format("page count = %ld", pageView->getPages().size())); }); _uiLayer->addChild(button2); @@ -661,7 +661,7 @@ bool UIPageViewDynamicAddAndRemoveTest::init() button3->addClickEventListener([=](Ref* sender) { pageView->removeAllPages(); - _displayValueLabel->setString(CCString::createWithFormat("page count = %ld", pageView->getPages().size())->getCString()); + _displayValueLabel->setString(StringUtils::format("page count = %ld", pageView->getPages().size())); }); _uiLayer->addChild(button3); @@ -682,7 +682,7 @@ void UIPageViewDynamicAddAndRemoveTest::pageViewEvent(Ref *pSender, PageView::Ev { PageView* pageView = dynamic_cast(pSender); - _displayValueLabel->setString(CCString::createWithFormat("page = %ld", pageView->getCurPageIndex() + 1)->getCString()); + _displayValueLabel->setString(StringUtils::format("page = %ld", pageView->getCurPageIndex() + 1)); } break; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRadioButtonTest/UIRadioButtonTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRadioButtonTest/UIRadioButtonTest.cpp index 00d46b8ea5..0b2c83d554 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRadioButtonTest/UIRadioButtonTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIRadioButtonTest/UIRadioButtonTest.cpp @@ -220,17 +220,17 @@ bool UIRadioButtonTwoGroupsTest::init() void UIRadioButtonTwoGroupsTest::onChangedRadioButtonGroup1(RadioButton* radioButton, int index, cocos2d::ui::RadioButtonGroup::EventType type) { CCASSERT(index == _radioButtonGroups[0]->getSelectedButtonIndex(), "The two indexes must match!"); - __String* text = String::createWithFormat("RadioButtonGroup1 : %d", index); - _groupEventLabel->setString(text->getCString()); - addLog(text->getCString()); + auto text = StringUtils::format("RadioButtonGroup1 : %d", index); + _groupEventLabel->setString(text); + addLog(text); } void UIRadioButtonTwoGroupsTest::onChangedRadioButtonGroup2(RadioButton* radioButton, int index, cocos2d::ui::RadioButtonGroup::EventType type) { CCASSERT(index == _radioButtonGroups[1]->getSelectedButtonIndex(), "The two indexes must match!"); - __String* text = String::createWithFormat("RadioButtonGroup2 : %d", index); - _groupEventLabel->setString(text->getCString()); - addLog(text->getCString()); + auto text = StringUtils::format("RadioButtonGroup2 : %d", index); + _groupEventLabel->setString(text); + addLog(text); } void UIRadioButtonTwoGroupsTest::onChangedRadioButtonSelect(RadioButton* radioButton, RadioButton::EventType type) @@ -239,25 +239,25 @@ void UIRadioButtonTwoGroupsTest::onChangedRadioButtonSelect(RadioButton* radioBu { return; } - __String* text = String::createWithFormat("RadioButton %d : ", radioButton->getTag()); + auto text = StringUtils::format("RadioButton %d : ", radioButton->getTag()); switch (type) { case RadioButton::EventType::SELECTED: { - text->append("Selected"); + text.append("Selected"); break; } case RadioButton::EventType::UNSELECTED: { - text->append("Unselected"); + text.append("Unselected"); break; } default: break; } - _buttonEventLabel->setString(text->getCString()); - addLog(text->getCString()); + _buttonEventLabel->setString(text); + addLog(text); } void UIRadioButtonTwoGroupsTest::clearRadioButtonGroup(Ref* sender) @@ -317,9 +317,9 @@ bool UIRadioButtonTabTest::init() float startPosX = widgetSize.width / 2.0f - ((NUMBER_OF_BUTTONS - 1) / 2.0f) * buttonWidth; for(int i = 0; i < NUMBER_OF_BUTTONS; ++i) { - __String* filePathNormal = String::createWithFormat("cocosui/btn_exercise%02d_n.png", i + 1); - __String* filePathSelected = String::createWithFormat("cocosui/btn_exercise%02d_p.png", i + 1); - RadioButton* radioButton = RadioButton::create(filePathNormal->getCString(), filePathSelected->getCString()); + auto filePathNormal = StringUtils::format("cocosui/btn_exercise%02d_n.png", i + 1); + auto filePathSelected = StringUtils::format("cocosui/btn_exercise%02d_p.png", i + 1); + RadioButton* radioButton = RadioButton::create(filePathNormal, filePathSelected); float posX = startPosX + buttonWidth * i; radioButton->setPosition(Vec2(posX, widgetSize.height / 2.0f)); radioButton->setScale(BUTTON_SCALE); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene.cpp index 90b86c1d22..339b993bf7 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene.cpp @@ -29,7 +29,7 @@ bool UIScene::init() _widget = dynamic_cast(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("cocosui/UITest/UITest.json")); _uiLayer->addChild(_widget); - Size screenSize = CCDirector::getInstance()->getWinSize(); + Size screenSize = Director::getInstance()->getWinSize(); Size rootSize = _widget->getContentSize(); _uiLayer->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene_Editor.cpp index 300650cb2a..3aafb8d758 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScene_Editor.cpp @@ -53,7 +53,7 @@ void UIScene_Editor::configureGUIScene() { if (_touchGroup) { - Size screenSize = CCDirector::getInstance()->getWinSize(); + Size screenSize = Director::getInstance()->getWinSize(); Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp index 37c7ba913e..bf9780efe6 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest_Editor.cpp @@ -125,7 +125,7 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Editor::init() { _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UITest/UITest.csb")); _touchGroup->addChild(_layout); - Size screenSize = CCDirector::getInstance()->getWinSize(); + Size screenSize = Director::getInstance()->getWinSize(); Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); @@ -154,7 +154,7 @@ bool UIScrollViewTest_ScrollToPercentBothDirection_Bounce_Editor::init() { _layout = static_cast(cocostudio::GUIReader::getInstance()->widgetFromBinaryFile("cocosui/UITest/UITest.csb")); _touchGroup->addChild(_layout); - Size screenSize = CCDirector::getInstance()->getWinSize(); + Size screenSize = Director::getInstance()->getWinSize(); Size rootSize = _layout->getContentSize(); _touchGroup->setPosition(Vec2((screenSize.width - rootSize.width) / 2, (screenSize.height - rootSize.height) / 2)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp index ac2ad352b9..83e5c2cff2 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp @@ -64,7 +64,7 @@ void UISliderTest_Editor::sliderEvent(Ref *pSender, Slider::EventType type) case Slider::EventType::ON_PERCENTAGE_CHANGED: { Slider* slider = static_cast(pSender); - _displayValueLabel->setString(CCString::createWithFormat("percent %d", slider->getPercent())->getCString()); + _displayValueLabel->setString(StringUtils::format("percent %d", slider->getPercent())); } break; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp index f8f8476124..f05513dfa0 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp @@ -62,28 +62,28 @@ void UITextFieldTest::textFieldEvent(Ref *pSender, TextField::EventType type) case TextField::EventType::ATTACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.225f, + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.225f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + textField->getContentSize().height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("attach with IME")->getCString()); + _displayValueLabel->setString(StringUtils::format("attach with IME")); } break; case TextField::EventType::DETACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("detach with IME")->getCString()); + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); + _displayValueLabel->setString(StringUtils::format("detach with IME")); } break; case TextField::EventType::INSERT_TEXT: - _displayValueLabel->setString(String::createWithFormat("insert words")->getCString()); + _displayValueLabel->setString(StringUtils::format("insert words")); break; case TextField::EventType::DELETE_BACKWARD: - _displayValueLabel->setString(String::createWithFormat("delete word")->getCString()); + _displayValueLabel->setString(StringUtils::format("delete word")); break; default: @@ -106,7 +106,7 @@ bool UITextFieldTest_MaxLength::init() { if (UIScene::init()) { - Size screenSize = CCDirector::getInstance()->getWinSize(); + Size screenSize = Director::getInstance()->getWinSize(); // Add a label in which the textfield events will be displayed _displayValueLabel = Text::create("No Event","fonts/Marker Felt.ttf",32); @@ -140,33 +140,33 @@ void UITextFieldTest_MaxLength::textFieldEvent(Ref *pSender, TextField::EventTyp case TextField::EventType::ATTACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.225f, + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.225f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + textField->getContentSize().height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("attach with IME max length %d", textField->getMaxLength())->getCString()); + _displayValueLabel->setString(StringUtils::format("attach with IME max length %d", textField->getMaxLength())); } break; case TextField::EventType::DETACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("detach with IME max length %d", textField->getMaxLength())->getCString()); + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); + _displayValueLabel->setString(StringUtils::format("detach with IME max length %d", textField->getMaxLength())); } break; case TextField::EventType::INSERT_TEXT: { TextField* textField = dynamic_cast(pSender); - _displayValueLabel->setString(String::createWithFormat("insert words max length %d", textField->getMaxLength())->getCString()); + _displayValueLabel->setString(StringUtils::format("insert words max length %d", textField->getMaxLength())); } break; case TextField::EventType::DELETE_BACKWARD: { TextField* textField = dynamic_cast(pSender); - _displayValueLabel->setString(String::createWithFormat("delete word max length %d", textField->getMaxLength())->getCString()); + _displayValueLabel->setString(StringUtils::format("delete word max length %d", textField->getMaxLength())); } break; @@ -190,7 +190,7 @@ bool UITextFieldTest_Password::init() { if (UIScene::init()) { - Size screenSize = CCDirector::getInstance()->getWinSize(); + Size screenSize = Director::getInstance()->getWinSize(); // Add a label in which the textfield events will be displayed _displayValueLabel = Text::create("No Event","fonts/Marker Felt.ttf",32); @@ -224,28 +224,28 @@ void UITextFieldTest_Password::textFieldEvent(Ref *pSender, TextField::EventType case TextField::EventType::ATTACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.225f, + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.225f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + textField->getContentSize().height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("attach with IME password")->getCString()); + _displayValueLabel->setString(StringUtils::format("attach with IME password")); } break; case TextField::EventType::DETACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("detach with IME password")->getCString()); + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); + _displayValueLabel->setString(StringUtils::format("detach with IME password")); } break; case TextField::EventType::INSERT_TEXT: - _displayValueLabel->setString(String::createWithFormat("insert words password")->getCString()); + _displayValueLabel->setString(StringUtils::format("insert words password")); break; case TextField::EventType::DELETE_BACKWARD: - _displayValueLabel->setString(String::createWithFormat("delete word password")->getCString()); + _displayValueLabel->setString(StringUtils::format("delete word password")); break; default: @@ -308,12 +308,12 @@ void UITextFieldTest_LineWrap::textFieldEvent(Ref *pSender, TextField::EventType { TextField* textField = dynamic_cast(pSender); Size widgetSize = _widget->getContentSize(); - textField->runAction(CCMoveTo::create(0.225f, + textField->runAction(MoveTo::create(0.225f, Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + 30))); textField->setTextHorizontalAlignment(TextHAlignment::LEFT); textField->setTextVerticalAlignment(TextVAlignment::TOP); - _displayValueLabel->setString(CCString::createWithFormat("attach with IME")->getCString()); + _displayValueLabel->setString(StringUtils::format("attach with IME")); } break; @@ -321,20 +321,20 @@ void UITextFieldTest_LineWrap::textFieldEvent(Ref *pSender, TextField::EventType { TextField* textField = dynamic_cast(pSender); Size widgetSize = _widget->getContentSize(); - textField->runAction(CCMoveTo::create(0.175f, Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f))); + textField->runAction(MoveTo::create(0.175f, Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f))); textField->setTextHorizontalAlignment(TextHAlignment::CENTER); textField->setTextVerticalAlignment(TextVAlignment::CENTER); - _displayValueLabel->setString(CCString::createWithFormat("detach with IME")->getCString()); + _displayValueLabel->setString(StringUtils::format("detach with IME")); } break; case TextField::EventType::INSERT_TEXT: - _displayValueLabel->setString(CCString::createWithFormat("insert words")->getCString()); + _displayValueLabel->setString(StringUtils::format("insert words")); break; case TextField::EventType::DELETE_BACKWARD: - _displayValueLabel->setString(CCString::createWithFormat("delete word")->getCString()); + _displayValueLabel->setString(StringUtils::format("delete word")); break; default: @@ -390,28 +390,28 @@ void UITextFieldTest_TrueTypeFont::textFieldEvent(Ref *pSender, TextField::Event case TextField::EventType::ATTACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.225f, + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.225f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + textField->getContentSize().height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("attach with IME")->getCString()); + _displayValueLabel->setString(StringUtils::format("attach with IME")); } break; case TextField::EventType::DETACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("detach with IME")->getCString()); + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); + _displayValueLabel->setString(StringUtils::format("detach with IME")); } break; case TextField::EventType::INSERT_TEXT: - _displayValueLabel->setString(String::createWithFormat("insert words")->getCString()); + _displayValueLabel->setString(StringUtils::format("insert words")); break; case TextField::EventType::DELETE_BACKWARD: - _displayValueLabel->setString(String::createWithFormat("delete word")->getCString()); + _displayValueLabel->setString(StringUtils::format("delete word")); break; default: @@ -467,31 +467,31 @@ void UITextFieldTest_PlaceHolderColor::textFieldEvent(Ref *pSender, TextField::E case TextField::EventType::ATTACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.225f, + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.225f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + textField->getContentSize().height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("attach with IME")->getCString()); + _displayValueLabel->setString(StringUtils::format("attach with IME")); } break; case TextField::EventType::DETACH_WITH_IME: { TextField* textField = dynamic_cast(pSender); - Size screenSize = CCDirector::getInstance()->getWinSize(); - textField->runAction(CCMoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); - _displayValueLabel->setString(String::createWithFormat("detach with IME")->getCString()); + Size screenSize = Director::getInstance()->getWinSize(); + textField->runAction(MoveTo::create(0.175f, Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f))); + _displayValueLabel->setString(StringUtils::format("detach with IME")); } break; case TextField::EventType::INSERT_TEXT: { - _displayValueLabel->setString(String::createWithFormat("insert words")->getCString()); + _displayValueLabel->setString(StringUtils::format("insert words")); CCLOG("%f, %f", dynamic_cast(pSender)->getContentSize().width, dynamic_cast(pSender)->getContentSize().height); } break; case TextField::EventType::DELETE_BACKWARD: - _displayValueLabel->setString(String::createWithFormat("delete word")->getCString()); + _displayValueLabel->setString(StringUtils::format("delete word")); break; default: diff --git a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp index 6ec2a23c1f..aaddebc3e9 100644 --- a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp +++ b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.cpp @@ -278,9 +278,9 @@ bool VibrateControlTest::init() vibrateItem->setPosition(layerSize.width * 0.5f, layerSize.height * 0.7f); addChild(vibrateItem); - auto durationLabelValue = CCString::createWithFormat("duration: %.3fs", _duration); + auto durationLabelValue = StringUtils::format("duration: %.3fs", _duration); - auto durationLabel = Label::createWithTTF(durationLabelValue->getCString(), fontFilePath, 20); + auto durationLabel = Label::createWithTTF(durationLabelValue, fontFilePath, 20); durationLabel->setAnchorPoint(Vec2::ANCHOR_MIDDLE); durationLabel->setPosition(layerSize.width * 0.5f, layerSize.height * 0.5f); addChild(durationLabel); @@ -290,8 +290,8 @@ bool VibrateControlTest::init() durationSlider->setPercent(0); durationSlider->setCallBack([&](SliderEx* sender, float ratio, SliderEx::TouchEvent event){ _duration = ratio * 1.9f + 0.1f; // From 0.1s to 2s - auto durationLabelValue = CCString::createWithFormat("duration: %.3fs", _duration); - (static_cast(_durationLabel))->setString(durationLabelValue->getCString()); + auto durationLabelValue = StringUtils::format("duration: %.3fs", _duration); + (static_cast(_durationLabel))->setString(durationLabelValue); }); durationSlider->setPosition(Vec2(layerSize.width * 0.5f, layerSize.height * 0.35f)); addChild(durationSlider); diff --git a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.h b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.h index d5899abae3..e5d52a4ff4 100644 --- a/tests/cpp-tests/Classes/VibrateTest/VibrateTest.h +++ b/tests/cpp-tests/Classes/VibrateTest/VibrateTest.h @@ -46,7 +46,7 @@ public: CREATE_FUNC(VibrateControlTest); virtual ~VibrateControlTest(); - virtual bool init(); + virtual bool init()override; virtual std::string title() const override; private: From 7a105ce1e19e5dc704d9e15bdf294977db59823c Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Wed, 15 Jul 2015 12:09:08 +0800 Subject: [PATCH 84/93] fixed #11310 : multiple camera case utils::captureScreen bug. --- cocos/base/ccUtils.cpp | 23 ++++++-- .../Classes/Scene3DTest/Scene3DTest.cpp | 52 ++++++++++++++++++- 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/cocos/base/ccUtils.cpp b/cocos/base/ccUtils.cpp index 078739e6a9..fa17247f84 100644 --- a/cocos/base/ccUtils.cpp +++ b/cocos/base/ccUtils.cpp @@ -29,6 +29,7 @@ THE SOFTWARE. #include "base/CCDirector.h" #include "base/CCAsyncTaskPool.h" +#include "base/CCEventDispatcher.h" #include "renderer/CCCustomCommand.h" #include "renderer/CCRenderer.h" #include "platform/CCImage.h" @@ -151,14 +152,26 @@ void onCaptureScreen(const std::function& afterC /* * Capture screen interface */ +static EventListenerCustom* s_captureScreenListener; +static CustomCommand s_captureScreenCommand; void captureScreen(const std::function& afterCaptured, const std::string& filename) { - static CustomCommand captureScreenCommand; - captureScreenCommand.init(std::numeric_limits::max()); - captureScreenCommand.func = std::bind(onCaptureScreen, afterCaptured, filename); - Director::getInstance()->getRenderer()->addCommand(&captureScreenCommand); + if (s_captureScreenListener) + { + CCLOG("Warning: CaptureScreen has been caled yet, don't call more than once in one frame."); + return; + } + s_captureScreenCommand.init(std::numeric_limits::max()); + s_captureScreenCommand.func = std::bind(onCaptureScreen, afterCaptured, filename); + s_captureScreenListener = Director::getInstance()->getEventDispatcher()->addCustomEventListener(Director::EVENT_AFTER_DRAW, [](EventCustom *event) { + auto director = Director::getInstance(); + director->getEventDispatcher()->removeEventListener((EventListener*)(s_captureScreenListener)); + s_captureScreenListener = nullptr; + director->getRenderer()->addCommand(&s_captureScreenCommand); + director->getRenderer()->render(); + }); } - + std::vector findChildren(const Node &node, const std::string &name) { std::vector vec; diff --git a/tests/cpp-tests/Classes/Scene3DTest/Scene3DTest.cpp b/tests/cpp-tests/Classes/Scene3DTest/Scene3DTest.cpp index a1c13be83a..83bd663d5c 100644 --- a/tests/cpp-tests/Classes/Scene3DTest/Scene3DTest.cpp +++ b/tests/cpp-tests/Classes/Scene3DTest/Scene3DTest.cpp @@ -105,6 +105,10 @@ private: std::vector _skins[(int)SkinType::MAX_TYPE]; //all skins int _curSkin[(int)SkinType::MAX_TYPE]; //current skin index cocos2d::Sprite3D* _reskinGirl; + + // for capture screen + static const int SNAPSHOT_TAG = 119; + std::string _snapshotFile; }; /** Define the sub scenes in test. */ @@ -651,6 +655,50 @@ void Scene3DTestScene::createDetailDlg() auto title = Label::createWithTTF("Detail Dialog","fonts/arial.ttf",16); title->setPosition(dlgSize.width / 2, dlgSize.height - margin * 2); _detailDlg->addChild(title); + + + // add capture screen buttons + ui::Button* capture = ui::Button::create("cocosui/animationbuttonnormal.png", + "cocosui/animationbuttonpressed.png"); + capture->setScale(0.5); + capture->setAnchorPoint(Vec2(0.5, 0)); + capture->setPosition(Vec2(dlgSize.width / 3, margin)); + capture->addClickEventListener([this](Ref* sender) + { + Director::getInstance()->getTextureCache()->removeTextureForKey(_snapshotFile); + _osdScene->removeChildByTag(SNAPSHOT_TAG); + _snapshotFile = "CaptureScreenTest.png"; + utils::captureScreen([this](bool succeed, const std::string& outputFile) + { + if (!succeed) + { + log("Capture screen failed."); + return; + } + auto sp = Sprite::create(outputFile); + _osdScene->addChild(sp, 0, SNAPSHOT_TAG); + Size s = Director::getInstance()->getWinSize(); + sp->setPosition(s.width / 2, s.height / 2); + sp->setScale(0.25); + _snapshotFile = outputFile; + }, _snapshotFile); + }); + capture->setTitleText("Take Snapshot"); + capture->setName("Take Snapshot"); + _detailDlg->addChild(capture); + + ui::Button* remove = ui::Button::create("cocosui/animationbuttonnormal.png", + "cocosui/animationbuttonpressed.png"); + remove->setScale(0.5); + remove->setAnchorPoint(Vec2(0.5, 0)); + remove->setPosition(Vec2(dlgSize.width * 2 / 3, margin)); + remove->addClickEventListener([this](Ref* sender) + { + _osdScene->removeChildByTag(SNAPSHOT_TAG); + }); + remove->setTitleText("Del Snapshot"); + remove->setName("Del Snapshot"); + _detailDlg->addChild(remove); // add a spine ffd animation on it auto skeletonNode = @@ -662,7 +710,7 @@ void Scene3DTestScene::createDetailDlg() skeletonNode->setScale(0.25); Size windowSize = Director::getInstance()->getWinSize(); - skeletonNode->setPosition(Vec2(dlgSize.width / 2, 20)); + skeletonNode->setPosition(Vec2(dlgSize.width / 2, remove->getContentSize().height / 2 + 2 * margin)); _detailDlg->addChild(skeletonNode); } @@ -706,7 +754,7 @@ void Scene3DTestScene::createDescDlg() "- OSD scene contains description dialog.\n" "\n" "Click \"Description\" button to hide this dialog.\n"); - auto text = Label::createWithSystemFont(desc, "Helvetica", 9, textSize); + auto text = Label::createWithSystemFont(desc, "", 9, textSize); text->setAnchorPoint(Vec2(0, 1)); text->setPosition(textPos); _descDlg->addChild(text); From 4b418fe8233c83f4de3ebf372b7236516bb4ae92 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 15 Jul 2015 05:46:42 +0000 Subject: [PATCH 85/93] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- ...sb_cocos2dx_experimental_video_auto_api.js | 16 --- .../auto/api/jsb_cocos2dx_spine_auto_api.js | 20 ---- .../jsb_cocos2dx_experimental_video_auto.cpp | 34 ------- .../jsb_cocos2dx_experimental_video_auto.hpp | 2 - .../auto/jsb_cocos2dx_spine_auto.cpp | 40 -------- .../auto/jsb_cocos2dx_spine_auto.hpp | 2 - .../auto/api/SkeletonRenderer.lua | 38 +++---- .../lua-bindings/auto/api/VideoPlayer.lua | 24 ++--- .../lua_cocos2dx_experimental_video_auto.cpp | 96 ------------------ .../lua_cocos2dx_experimental_video_auto.hpp | 2 - .../auto/lua_cocos2dx_spine_auto.cpp | 99 ------------------- .../auto/lua_cocos2dx_spine_auto.hpp | 2 - 12 files changed, 31 insertions(+), 344 deletions(-) diff --git a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_experimental_video_auto_api.js b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_experimental_video_auto_api.js index 56ed6cefae..1751546076 100644 --- a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_experimental_video_auto_api.js +++ b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_experimental_video_auto_api.js @@ -36,14 +36,6 @@ play : function ( { }, -/** - * @method pause - */ -pause : function ( -) -{ -}, - /** * @method setKeepAspectRatioEnabled * @param {bool} arg0 @@ -54,14 +46,6 @@ bool { }, -/** - * @method resume - */ -resume : function ( -) -{ -}, - /** * @method stop */ diff --git a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_spine_auto_api.js b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_spine_auto_api.js index 6bb5bad6f6..750786bfd7 100644 --- a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_spine_auto_api.js +++ b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_spine_auto_api.js @@ -50,16 +50,6 @@ setBonesToSetupPose : function ( { }, -/** - * @method isOpacityModifyRGB - * @return {bool} - */ -isOpacityModifyRGB : function ( -) -{ - return false; -}, - /** * @method initWithData * @param {spSkeletonData} arg0 @@ -90,16 +80,6 @@ setSlotsToSetupPose : function ( { }, -/** - * @method setOpacityModifyRGB - * @param {bool} arg0 - */ -setOpacityModifyRGB : function ( -bool -) -{ -}, - /** * @method setToSetupPose */ diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_experimental_video_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_experimental_video_auto.cpp index 421cdde6f8..27619f14e3 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_experimental_video_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_experimental_video_auto.cpp @@ -97,22 +97,6 @@ bool js_cocos2dx_experimental_video_VideoPlayer_play(JSContext *cx, uint32_t arg JS_ReportError(cx, "js_cocos2dx_experimental_video_VideoPlayer_play : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } -bool js_cocos2dx_experimental_video_VideoPlayer_pause(JSContext *cx, uint32_t argc, jsval *vp) -{ - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); - JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); - js_proxy_t *proxy = jsb_get_js_proxy(obj); - cocos2d::experimental::ui::VideoPlayer* cobj = (cocos2d::experimental::ui::VideoPlayer *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_experimental_video_VideoPlayer_pause : Invalid Native Object"); - if (argc == 0) { - cobj->pause(); - args.rval().setUndefined(); - return true; - } - - JS_ReportError(cx, "js_cocos2dx_experimental_video_VideoPlayer_pause : wrong number of arguments: %d, was expecting %d", argc, 0); - return false; -} bool js_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -133,22 +117,6 @@ bool js_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled(JSCont JS_ReportError(cx, "js_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } -bool js_cocos2dx_experimental_video_VideoPlayer_resume(JSContext *cx, uint32_t argc, jsval *vp) -{ - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); - JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); - js_proxy_t *proxy = jsb_get_js_proxy(obj); - cocos2d::experimental::ui::VideoPlayer* cobj = (cocos2d::experimental::ui::VideoPlayer *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_experimental_video_VideoPlayer_resume : Invalid Native Object"); - if (argc == 0) { - cobj->resume(); - args.rval().setUndefined(); - return true; - } - - JS_ReportError(cx, "js_cocos2dx_experimental_video_VideoPlayer_resume : wrong number of arguments: %d, was expecting %d", argc, 0); - return false; -} bool js_cocos2dx_experimental_video_VideoPlayer_stop(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -398,9 +366,7 @@ void js_register_cocos2dx_experimental_video_VideoPlayer(JSContext *cx, JS::Hand JS_FN("getFileName", js_cocos2dx_experimental_video_VideoPlayer_getFileName, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getURL", js_cocos2dx_experimental_video_VideoPlayer_getURL, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("play", js_cocos2dx_experimental_video_VideoPlayer_play, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("pause", js_cocos2dx_experimental_video_VideoPlayer_pause, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setKeepAspectRatioEnabled", js_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("resume", js_cocos2dx_experimental_video_VideoPlayer_resume, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("stop", js_cocos2dx_experimental_video_VideoPlayer_stop, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setFullScreenEnabled", js_cocos2dx_experimental_video_VideoPlayer_setFullScreenEnabled, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setFileName", js_cocos2dx_experimental_video_VideoPlayer_setFileName, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_experimental_video_auto.hpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_experimental_video_auto.hpp index e5360f8545..4c1419a759 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_experimental_video_auto.hpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_experimental_video_auto.hpp @@ -16,9 +16,7 @@ void register_all_cocos2dx_experimental_video(JSContext* cx, JS::HandleObject ob bool js_cocos2dx_experimental_video_VideoPlayer_getFileName(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_experimental_video_VideoPlayer_getURL(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_experimental_video_VideoPlayer_play(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_experimental_video_VideoPlayer_pause(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_experimental_video_VideoPlayer_resume(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_experimental_video_VideoPlayer_stop(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_experimental_video_VideoPlayer_setFullScreenEnabled(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_experimental_video_VideoPlayer_setFileName(JSContext *cx, uint32_t argc, jsval *vp); diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.cpp index 91aaed3ae4..9635a4f260 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.cpp @@ -145,24 +145,6 @@ bool js_cocos2dx_spine_SkeletonRenderer_setBonesToSetupPose(JSContext *cx, uint3 JS_ReportError(cx, "js_cocos2dx_spine_SkeletonRenderer_setBonesToSetupPose : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } -bool js_cocos2dx_spine_SkeletonRenderer_isOpacityModifyRGB(JSContext *cx, uint32_t argc, jsval *vp) -{ - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); - JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); - js_proxy_t *proxy = jsb_get_js_proxy(obj); - spine::SkeletonRenderer* cobj = (spine::SkeletonRenderer *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_spine_SkeletonRenderer_isOpacityModifyRGB : Invalid Native Object"); - if (argc == 0) { - bool ret = cobj->isOpacityModifyRGB(); - jsval jsret = JSVAL_NULL; - jsret = BOOLEAN_TO_JSVAL(ret); - args.rval().set(jsret); - return true; - } - - JS_ReportError(cx, "js_cocos2dx_spine_SkeletonRenderer_isOpacityModifyRGB : wrong number of arguments: %d, was expecting %d", argc, 0); - return false; -} bool js_cocos2dx_spine_SkeletonRenderer_initWithData(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -231,26 +213,6 @@ bool js_cocos2dx_spine_SkeletonRenderer_setSlotsToSetupPose(JSContext *cx, uint3 JS_ReportError(cx, "js_cocos2dx_spine_SkeletonRenderer_setSlotsToSetupPose : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } -bool js_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB(JSContext *cx, uint32_t argc, jsval *vp) -{ - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); - bool ok = true; - JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); - js_proxy_t *proxy = jsb_get_js_proxy(obj); - spine::SkeletonRenderer* cobj = (spine::SkeletonRenderer *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB : Invalid Native Object"); - if (argc == 1) { - bool arg0; - arg0 = JS::ToBoolean(args.get(0)); - JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB : Error processing arguments"); - cobj->setOpacityModifyRGB(arg0); - args.rval().setUndefined(); - return true; - } - - JS_ReportError(cx, "js_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB : wrong number of arguments: %d, was expecting %d", argc, 1); - return false; -} bool js_cocos2dx_spine_SkeletonRenderer_setToSetupPose(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -914,11 +876,9 @@ void js_register_cocos2dx_spine_SkeletonRenderer(JSContext *cx, JS::HandleObject JS_FN("getDebugSlotsEnabled", js_cocos2dx_spine_SkeletonRenderer_getDebugSlotsEnabled, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setAttachment", js_cocos2dx_spine_SkeletonRenderer_setAttachment, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setBonesToSetupPose", js_cocos2dx_spine_SkeletonRenderer_setBonesToSetupPose, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("isOpacityModifyRGB", js_cocos2dx_spine_SkeletonRenderer_isOpacityModifyRGB, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("initWithData", js_cocos2dx_spine_SkeletonRenderer_initWithData, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setDebugSlotsEnabled", js_cocos2dx_spine_SkeletonRenderer_setDebugSlotsEnabled, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setSlotsToSetupPose", js_cocos2dx_spine_SkeletonRenderer_setSlotsToSetupPose, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("setOpacityModifyRGB", js_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setToSetupPose", js_cocos2dx_spine_SkeletonRenderer_setToSetupPose, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getBlendFunc", js_cocos2dx_spine_SkeletonRenderer_getBlendFunc, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("drawSkeleton", js_cocos2dx_spine_SkeletonRenderer_drawSkeleton, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.hpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.hpp index fa5f388102..cde2a264c7 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.hpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_spine_auto.hpp @@ -16,11 +16,9 @@ bool js_cocos2dx_spine_SkeletonRenderer_setTimeScale(JSContext *cx, uint32_t arg bool js_cocos2dx_spine_SkeletonRenderer_getDebugSlotsEnabled(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_spine_SkeletonRenderer_setAttachment(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_spine_SkeletonRenderer_setBonesToSetupPose(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_spine_SkeletonRenderer_isOpacityModifyRGB(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_spine_SkeletonRenderer_initWithData(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_spine_SkeletonRenderer_setDebugSlotsEnabled(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_spine_SkeletonRenderer_setSlotsToSetupPose(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_spine_SkeletonRenderer_setToSetupPose(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_spine_SkeletonRenderer_getBlendFunc(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_spine_SkeletonRenderer_drawSkeleton(JSContext *cx, uint32_t argc, jsval *vp); diff --git a/cocos/scripting/lua-bindings/auto/api/SkeletonRenderer.lua b/cocos/scripting/lua-bindings/auto/api/SkeletonRenderer.lua index 02c244ef49..bbf8e93347 100644 --- a/cocos/scripting/lua-bindings/auto/api/SkeletonRenderer.lua +++ b/cocos/scripting/lua-bindings/auto/api/SkeletonRenderer.lua @@ -23,12 +23,6 @@ -- @param self -- @return SkeletonRenderer#SkeletonRenderer self (return value: sp.SkeletonRenderer) --------------------------------- --- --- @function [parent=#SkeletonRenderer] isOpacityModifyRGB --- @param self --- @return bool#bool ret (return value: bool) - -------------------------------- -- -- @function [parent=#SkeletonRenderer] initWithData @@ -50,13 +44,6 @@ -- @param self -- @return SkeletonRenderer#SkeletonRenderer self (return value: sp.SkeletonRenderer) --------------------------------- --- --- @function [parent=#SkeletonRenderer] setOpacityModifyRGB --- @param self --- @param #bool value --- @return SkeletonRenderer#SkeletonRenderer self (return value: sp.SkeletonRenderer) - -------------------------------- -- -- @function [parent=#SkeletonRenderer] setToSetupPose @@ -135,12 +122,6 @@ -- @param #float scale -- @return SkeletonRenderer#SkeletonRenderer ret (return value: sp.SkeletonRenderer) --------------------------------- --- --- @function [parent=#SkeletonRenderer] getBoundingBox --- @param self --- @return rect_table#rect_table ret (return value: rect_table) - -------------------------------- -- -- @function [parent=#SkeletonRenderer] onEnter @@ -153,6 +134,25 @@ -- @param self -- @return SkeletonRenderer#SkeletonRenderer self (return value: sp.SkeletonRenderer) +-------------------------------- +-- +-- @function [parent=#SkeletonRenderer] setOpacityModifyRGB +-- @param self +-- @param #bool value +-- @return SkeletonRenderer#SkeletonRenderer self (return value: sp.SkeletonRenderer) + +-------------------------------- +-- +-- @function [parent=#SkeletonRenderer] getBoundingBox +-- @param self +-- @return rect_table#rect_table ret (return value: rect_table) + +-------------------------------- +-- +-- @function [parent=#SkeletonRenderer] isOpacityModifyRGB +-- @param self +-- @return bool#bool ret (return value: bool) + -------------------------------- -- @overload self, spSkeletonData, bool -- @overload self diff --git a/cocos/scripting/lua-bindings/auto/api/VideoPlayer.lua b/cocos/scripting/lua-bindings/auto/api/VideoPlayer.lua index b216cd5054..f70018cab4 100644 --- a/cocos/scripting/lua-bindings/auto/api/VideoPlayer.lua +++ b/cocos/scripting/lua-bindings/auto/api/VideoPlayer.lua @@ -24,12 +24,6 @@ -- @param self -- @return experimental::ui::VideoPlayer#experimental::ui::VideoPlayer self (return value: cc.experimental::ui::VideoPlayer) --------------------------------- --- Pauses playback. --- @function [parent=#VideoPlayer] pause --- @param self --- @return experimental::ui::VideoPlayer#experimental::ui::VideoPlayer self (return value: cc.experimental::ui::VideoPlayer) - -------------------------------- -- Causes the video player to keep aspect ratio or no when displaying the video.
-- param enable Specify true to keep aspect ratio or false to scale the video until
@@ -39,12 +33,6 @@ -- @param #bool enable -- @return experimental::ui::VideoPlayer#experimental::ui::VideoPlayer self (return value: cc.experimental::ui::VideoPlayer) --------------------------------- --- Resumes playback. --- @function [parent=#VideoPlayer] resume --- @param self --- @return experimental::ui::VideoPlayer#experimental::ui::VideoPlayer self (return value: cc.experimental::ui::VideoPlayer) - -------------------------------- -- Stops playback. -- @function [parent=#VideoPlayer] stop @@ -124,6 +112,12 @@ -- @param #unsigned int flags -- @return experimental::ui::VideoPlayer#experimental::ui::VideoPlayer self (return value: cc.experimental::ui::VideoPlayer) +-------------------------------- +-- Pauses playback. +-- @function [parent=#VideoPlayer] pause +-- @param self +-- @return experimental::ui::VideoPlayer#experimental::ui::VideoPlayer self (return value: cc.experimental::ui::VideoPlayer) + -------------------------------- -- -- @function [parent=#VideoPlayer] setVisible @@ -131,6 +125,12 @@ -- @param #bool visible -- @return experimental::ui::VideoPlayer#experimental::ui::VideoPlayer self (return value: cc.experimental::ui::VideoPlayer) +-------------------------------- +-- Resumes playback. +-- @function [parent=#VideoPlayer] resume +-- @param self +-- @return experimental::ui::VideoPlayer#experimental::ui::VideoPlayer self (return value: cc.experimental::ui::VideoPlayer) + -------------------------------- -- -- @function [parent=#VideoPlayer] VideoPlayer diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.cpp index 64d3c0f76d..159182cde6 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.cpp @@ -146,53 +146,6 @@ int lua_cocos2dx_experimental_video_VideoPlayer_play(lua_State* tolua_S) return 0; } -int lua_cocos2dx_experimental_video_VideoPlayer_pause(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_pause'", 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_experimental_video_VideoPlayer_pause'", nullptr); - return 0; - } - cobj->pause(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:pause",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_pause'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled(lua_State* tolua_S) { int argc = 0; @@ -243,53 +196,6 @@ int lua_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled(lua_St return 0; } -int lua_cocos2dx_experimental_video_VideoPlayer_resume(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::experimental::ui::VideoPlayer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccexp.VideoPlayer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::experimental::ui::VideoPlayer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_experimental_video_VideoPlayer_resume'", 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_experimental_video_VideoPlayer_resume'", nullptr); - return 0; - } - cobj->resume(); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccexp.VideoPlayer:resume",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_experimental_video_VideoPlayer_resume'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_experimental_video_VideoPlayer_stop(lua_State* tolua_S) { int argc = 0; @@ -815,9 +721,7 @@ int lua_register_cocos2dx_experimental_video_VideoPlayer(lua_State* tolua_S) tolua_function(tolua_S,"getFileName",lua_cocos2dx_experimental_video_VideoPlayer_getFileName); tolua_function(tolua_S,"getURL",lua_cocos2dx_experimental_video_VideoPlayer_getURL); tolua_function(tolua_S,"play",lua_cocos2dx_experimental_video_VideoPlayer_play); - tolua_function(tolua_S,"pause",lua_cocos2dx_experimental_video_VideoPlayer_pause); tolua_function(tolua_S,"setKeepAspectRatioEnabled",lua_cocos2dx_experimental_video_VideoPlayer_setKeepAspectRatioEnabled); - tolua_function(tolua_S,"resume",lua_cocos2dx_experimental_video_VideoPlayer_resume); tolua_function(tolua_S,"stop",lua_cocos2dx_experimental_video_VideoPlayer_stop); tolua_function(tolua_S,"setFullScreenEnabled",lua_cocos2dx_experimental_video_VideoPlayer_setFullScreenEnabled); tolua_function(tolua_S,"setFileName",lua_cocos2dx_experimental_video_VideoPlayer_setFileName); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp index 44597483da..5f9cf0537b 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_experimental_video_auto.hpp @@ -29,7 +29,5 @@ int register_all_cocos2dx_experimental_video(lua_State* tolua_S); - - #endif // __cocos2dx_experimental_video_h__ #endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_spine_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_spine_auto.cpp index 00a9ed6e1b..63214e30e2 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_spine_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_spine_auto.cpp @@ -148,53 +148,6 @@ int lua_cocos2dx_spine_SkeletonRenderer_setBonesToSetupPose(lua_State* tolua_S) return 0; } -int lua_cocos2dx_spine_SkeletonRenderer_isOpacityModifyRGB(lua_State* tolua_S) -{ - int argc = 0; - spine::SkeletonRenderer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"sp.SkeletonRenderer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (spine::SkeletonRenderer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_spine_SkeletonRenderer_isOpacityModifyRGB'", 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_spine_SkeletonRenderer_isOpacityModifyRGB'", nullptr); - return 0; - } - bool ret = cobj->isOpacityModifyRGB(); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "sp.SkeletonRenderer:isOpacityModifyRGB",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_spine_SkeletonRenderer_isOpacityModifyRGB'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_spine_SkeletonRenderer_initWithData(lua_State* tolua_S) { int argc = 0; @@ -361,56 +314,6 @@ int lua_cocos2dx_spine_SkeletonRenderer_setSlotsToSetupPose(lua_State* tolua_S) return 0; } -int lua_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB(lua_State* tolua_S) -{ - int argc = 0; - spine::SkeletonRenderer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"sp.SkeletonRenderer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (spine::SkeletonRenderer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - bool arg0; - - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "sp.SkeletonRenderer:setOpacityModifyRGB"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB'", nullptr); - return 0; - } - cobj->setOpacityModifyRGB(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "sp.SkeletonRenderer:setOpacityModifyRGB",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_spine_SkeletonRenderer_setToSetupPose(lua_State* tolua_S) { int argc = 0; @@ -1216,11 +1119,9 @@ int lua_register_cocos2dx_spine_SkeletonRenderer(lua_State* tolua_S) tolua_function(tolua_S,"setTimeScale",lua_cocos2dx_spine_SkeletonRenderer_setTimeScale); tolua_function(tolua_S,"getDebugSlotsEnabled",lua_cocos2dx_spine_SkeletonRenderer_getDebugSlotsEnabled); tolua_function(tolua_S,"setBonesToSetupPose",lua_cocos2dx_spine_SkeletonRenderer_setBonesToSetupPose); - tolua_function(tolua_S,"isOpacityModifyRGB",lua_cocos2dx_spine_SkeletonRenderer_isOpacityModifyRGB); tolua_function(tolua_S,"initWithData",lua_cocos2dx_spine_SkeletonRenderer_initWithData); tolua_function(tolua_S,"setDebugSlotsEnabled",lua_cocos2dx_spine_SkeletonRenderer_setDebugSlotsEnabled); tolua_function(tolua_S,"setSlotsToSetupPose",lua_cocos2dx_spine_SkeletonRenderer_setSlotsToSetupPose); - tolua_function(tolua_S,"setOpacityModifyRGB",lua_cocos2dx_spine_SkeletonRenderer_setOpacityModifyRGB); tolua_function(tolua_S,"setToSetupPose",lua_cocos2dx_spine_SkeletonRenderer_setToSetupPose); tolua_function(tolua_S,"getBlendFunc",lua_cocos2dx_spine_SkeletonRenderer_getBlendFunc); tolua_function(tolua_S,"initialize",lua_cocos2dx_spine_SkeletonRenderer_initialize); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_spine_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_spine_auto.hpp index 553ec82c5b..f9bcf11d4f 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_spine_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_spine_auto.hpp @@ -41,8 +41,6 @@ int register_all_cocos2dx_spine(lua_State* tolua_S); - - From a204b02668f329ce9e4ea99869645da659ab6827 Mon Sep 17 00:00:00 2001 From: Jacky Date: Wed, 15 Jul 2015 13:47:10 +0800 Subject: [PATCH 86/93] fixed renderTexture switch foreground to background issue. --- cocos/2d/CCRenderTexture.cpp | 5 +---- .../android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java | 6 ++---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/cocos/2d/CCRenderTexture.cpp b/cocos/2d/CCRenderTexture.cpp index e1b9edb1d4..1589a7ce04 100644 --- a/cocos/2d/CCRenderTexture.cpp +++ b/cocos/2d/CCRenderTexture.cpp @@ -35,6 +35,7 @@ THE SOFTWARE. #include "base/CCEventDispatcher.h" #include "renderer/CCRenderer.h" #include "2d/CCCamera.h" +#include "renderer/CCTextureCache.h" NS_CC_BEGIN @@ -87,7 +88,6 @@ void RenderTexture::listenToBackground(EventCustom *event) { // We have not found a way to dispatch the enter background message before the texture data are destroyed. // So we disable this pair of message handler at present. -#if 0 #if CC_ENABLE_CACHE_TEXTURE_DATA CC_SAFE_DELETE(_UITextureImage); @@ -112,12 +112,10 @@ void RenderTexture::listenToBackground(EventCustom *event) glDeleteFramebuffers(1, &_FBO); _FBO = 0; #endif -#endif } void RenderTexture::listenToForeground(EventCustom *event) { -#if 0 #if CC_ENABLE_CACHE_TEXTURE_DATA // -- regenerate frame buffer object and attach the texture glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_oldFBO); @@ -135,7 +133,6 @@ void RenderTexture::listenToForeground(EventCustom *event) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texture->getName(), 0); glBindFramebuffer(GL_FRAMEBUFFER, _oldFBO); #endif -#endif } RenderTexture * RenderTexture::create(int w, int h, Texture2D::PixelFormat eFormat) 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 5e27b4c0c6..522f65e7e9 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java @@ -261,15 +261,13 @@ public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelpe Cocos2dxHelper.onResume(); mGLSurfaceView.onResume(); } - else { - Cocos2dxHelper.onPause(); - mGLSurfaceView.onPause(); - } } @Override protected void onPause() { super.onPause(); + Cocos2dxHelper.onPause(); + mGLSurfaceView.onPause(); } @Override From 0064dfbc7124cfb484f4cd6056d5bf54d440c2e4 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 15 Jul 2015 14:11:59 +0800 Subject: [PATCH 87/93] Update requirements info --- docs/RELEASE_NOTES.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index afebd694fb..8d1a3d3549 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -54,8 +54,8 @@ * Xcode 5.1 or newer for iOS or Mac * gcc 4.9 or newer for Linux * ndk-r10c for Android -* Visual Studio 2013 or newer for Windows (win32) -* Visual Studio 2013 or newer for Windows Phone 8 +* Visual Studio 2013 or newer for Windows (win32) +* Visual Studio 2013 update4 or newer for Windows Phone 8 ## How to run tests @@ -120,7 +120,6 @@ Then * For win32 project, enter `cocos2d-x/build`, and open `cocos2d-win32.sln` or `cocos2d-js-win32.sln` * For win 8.1 project, enter `cocos2d-x/build`, and open `cocos2d-win8.1-universal.sln` or `cocos2d-js-win8.1-universal.sln` -* For win 10 project, enter `cocos2d-x/build`, and open `cocos2d-win10.sln` * Select running target * Click run button From 7f7cf92da3edd44d598c6388e62da66a90d0ad50 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Wed, 15 Jul 2015 14:21:47 +0800 Subject: [PATCH 88/93] Update bindings-generator --- tools/bindings-generator | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bindings-generator b/tools/bindings-generator index 618fce7b25..c3b5130e3b 160000 --- a/tools/bindings-generator +++ b/tools/bindings-generator @@ -1 +1 @@ -Subproject commit 618fce7b257aa5d3c68c5671a9368a4685a6b823 +Subproject commit c3b5130e3b35723d5fb8844373c277e2a3e5115e From e4b392d4c8e09bd2ebcef62532c53632a5854d6f Mon Sep 17 00:00:00 2001 From: Jacky Date: Wed, 15 Jul 2015 16:27:29 +0800 Subject: [PATCH 89/93] fix polygon sprite setColor, setOpacity, setTexture, setTextureRect. --- cocos/2d/CCSprite.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index faa5b61e79..b02872baf5 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -265,7 +265,6 @@ bool Sprite::initWithTexture(Texture2D *texture, const Rect& rect, bool rotated) setTexture(texture); setTextureRect(rect, rotated, rect.size); - _polyInfo.setQuad(&_quad); // by default use "Self Render". // if the sprite is added to a batchnode, then it will automatically switch to "batchnode Render" setBatchNode(nullptr); @@ -424,6 +423,8 @@ void Sprite::setTextureRect(const Rect& rect, bool rotated, const Size& untrimme _quad.tl.vertices.set(x1, y2, 0.0f); _quad.tr.vertices.set(x2, y2, 0.0f); } + + _polyInfo.setQuad(&_quad); } void Sprite::debugDraw(bool on) @@ -942,10 +943,9 @@ void Sprite::updateColor(void) color4.b *= _displayedOpacity/255.0f; } - _quad.bl.colors = color4; - _quad.br.colors = color4; - _quad.tl.colors = color4; - _quad.tr.colors = color4; + for (ssize_t i = 0; i < _polyInfo.triangles.vertCount; i++) { + _polyInfo.triangles.verts[i].colors = color4; + } // renders using batch node if (_batchNode) From 517221a0dfcc120c3acd3038d2c2a9bfe6b93a77 Mon Sep 17 00:00:00 2001 From: andyque Date: Wed, 15 Jul 2015 17:02:02 +0800 Subject: [PATCH 90/93] add jumpToPage API to PageView. 1. This commit also fix the default font size issue in ui::Button. --- cocos/ui/UIButton.cpp | 1 + cocos/ui/UIPageView.cpp | 9 ++ cocos/ui/UIPageView.h | 14 ++- .../UIPageViewTest/UIPageViewTest.cpp | 112 ++++++++++++++++++ .../UIPageViewTest/UIPageViewTest.h | 14 +++ 5 files changed, 147 insertions(+), 3 deletions(-) diff --git a/cocos/ui/UIButton.cpp b/cocos/ui/UIButton.cpp index b8bcdf5834..8f0935edca 100644 --- a/cocos/ui/UIButton.cpp +++ b/cocos/ui/UIButton.cpp @@ -767,6 +767,7 @@ void Button::setTitleText(const std::string& text) this->createTitleRenderer(); } _titleRenderer->setString(text); + this->setTitleFontSize(_fontSize); updateContentSize(); } diff --git a/cocos/ui/UIPageView.cpp b/cocos/ui/UIPageView.cpp index 477c10e661..c227a4c824 100644 --- a/cocos/ui/UIPageView.cpp +++ b/cocos/ui/UIPageView.cpp @@ -259,6 +259,15 @@ void PageView::updateAllPagesPosition() } } +void PageView::setCurPageIndex( ssize_t index ) +{ + if (index < 0 || index >= this->getPageCount()) + { + return; + } + _curPageIdx = index; + _doLayoutDirty = true; +} void PageView::scrollToPage(ssize_t idx) { diff --git a/cocos/ui/UIPageView.h b/cocos/ui/UIPageView.h index 8a1278b1bd..a894595462 100644 --- a/cocos/ui/UIPageView.h +++ b/cocos/ui/UIPageView.h @@ -151,16 +151,24 @@ public: /** * Scroll to a page with a given index. * - * @param idx A given index in the PageView. + * @param idx A given index in the PageView. Index start from 0 to pageCount -1. */ void scrollToPage(ssize_t idx); - + + /** * Gets current displayed page index. * @return current page index. */ ssize_t getCurPageIndex() const; - + + /** + * Jump to a page with a given index without scrolling. + * This is the different between scrollToPage. + * + * @param index A given index in PageView. Index start from 0 to pageCount -1. + */ + void setCurPageIndex(ssize_t index); /** * @brief Get all the pages in the PageView. diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp index fac654eb94..ead889f28d 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.cpp @@ -11,6 +11,7 @@ UIPageViewTests::UIPageViewTests() ADD_TEST_CASE(UIPageViewCustomScrollThreshold); ADD_TEST_CASE(UIPageViewTouchPropagationTest); ADD_TEST_CASE(UIPageViewDynamicAddAndRemoveTest); + ADD_TEST_CASE(UIPageViewJumpToPageTest); } // UIPageViewTest @@ -691,3 +692,114 @@ void UIPageViewDynamicAddAndRemoveTest::pageViewEvent(Ref *pSender, PageView::Ev } } + +// UIPageViewJumpToPageTest +UIPageViewJumpToPageTest::UIPageViewJumpToPageTest() +: _displayValueLabel(nullptr) +{ + +} + +UIPageViewJumpToPageTest::~UIPageViewJumpToPageTest() +{ +} + +bool UIPageViewJumpToPageTest::init() +{ + if (UIScene::init()) + { + Size widgetSize = _widget->getContentSize(); + + // Add a label in which the dragpanel events will be displayed + _displayValueLabel = Text::create("setCurPageIndex API Test", "fonts/Marker Felt.ttf", 32); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, + widgetSize.height / 2.0f + + _displayValueLabel->getContentSize().height * 1.5)); + _uiLayer->addChild(_displayValueLabel); + + // Add the black background + Text* alert = Text::create("PageView", "fonts/Marker Felt.ttf", 30); + alert->setColor(Color3B(159, 168, 176)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - alert->getContentSize().height * 3.075f)); + _uiLayer->addChild(alert); + + Layout* root = static_cast(_uiLayer->getChildByTag(81)); + + Layout* background = dynamic_cast(root->getChildByName("background_Panel")); + + // Create the page view + PageView* pageView = PageView::create(); + pageView->setContentSize(Size(240.0f, 130.0f)); + Size backgroundSize = background->getContentSize(); + pageView->setPosition(Vec2((widgetSize.width - backgroundSize.width) / 2.0f + + (backgroundSize.width - pageView->getContentSize().width) / 2.0f, + (widgetSize.height - backgroundSize.height) / 2.0f + + (backgroundSize.height - pageView->getContentSize().height) / 2.0f)); + + pageView->removeAllPages(); + + int pageCount = 4; + for (int i = 0; i < pageCount; ++i) + { + Layout* layout = Layout::create(); + layout->setContentSize(Size(240.0f, 130.0f)); + + ImageView* imageView = ImageView::create("cocosui/scrollviewbg.png"); + imageView->setScale9Enabled(true); + imageView->setContentSize(Size(240, 130)); + imageView->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); + layout->addChild(imageView); + + Text* label = Text::create(StringUtils::format("page %d",(i+1)), "fonts/Marker Felt.ttf", 30); + label->setColor(Color3B(192, 192, 192)); + label->setPosition(Vec2(layout->getContentSize().width / 2.0f, layout->getContentSize().height / 2.0f)); + layout->addChild(label); + + pageView->insertPage(layout,i); + } + + pageView->setCurPageIndex(1); + + //add buttons to jump to specific page + auto button1 = ui::Button::create(); + button1->setNormalizedPosition(Vec2(0.1, 0.75)); + button1->setTitleText("Jump to Page1"); + CCLOG("button1 content Size = %f, %f", button1->getContentSize().width, + button1->getContentSize().height); + button1->addClickEventListener([=](Ref*){ + pageView->setCurPageIndex(0); + }); + _uiLayer->addChild(button1); + + auto button2 = static_cast(button1->clone()); + button2->setTitleText("Jump to Page2"); + button2->setNormalizedPosition(Vec2(0.1, 0.65)); + CCLOG("button2 content Size = %f, %f", button2->getContentSize().width, + button2->getContentSize().height); + button2->addClickEventListener([=](Ref*){ + pageView->setCurPageIndex(1); + }); + _uiLayer->addChild(button2); + + auto button3 = static_cast(button2->clone()); + button3->setTitleText("Jump to Page3"); + button3->setNormalizedPosition(Vec2(0.9, 0.75)); + button3->addClickEventListener([=](Ref*){ + pageView->setCurPageIndex(2); + }); + _uiLayer->addChild(button3); + + auto button4 = static_cast(button2->clone()); + button4->setTitleText("Jump to Page4"); + button4->setNormalizedPosition(Vec2(0.9, 0.65)); + button4->addClickEventListener([=](Ref*){ + pageView->setCurPageIndex(3); + }); + _uiLayer->addChild(button4); + _uiLayer->addChild(pageView); + + return true; + } + return false; +} diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.h index ac3b337134..c3555efcea 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.h @@ -112,4 +112,18 @@ protected: cocos2d::ui::Text* _displayValueLabel; }; +class UIPageViewJumpToPageTest : public UIScene +{ +public: + CREATE_FUNC(UIPageViewJumpToPageTest); + + UIPageViewJumpToPageTest(); + ~UIPageViewJumpToPageTest(); + virtual bool init() override; + +protected: + + cocos2d::ui::Text* _displayValueLabel; +}; + #endif /* defined(__TestCpp__UIPageViewTest__) */ From 8442fe5f89e37c6deccdeb52fc86b3d42fe1961e Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Thu, 16 Jul 2015 06:04:17 +0000 Subject: [PATCH 91/93] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../auto/api/jsb_cocos2dx_ui_auto_api.js | 18 +++-- .../js-bindings/auto/jsb_cocos2dx_ui_auto.cpp | 53 +++++++++----- .../js-bindings/auto/jsb_cocos2dx_ui_auto.hpp | 3 +- .../lua-bindings/auto/api/PageView.lua | 21 ++++-- .../auto/lua_cocos2dx_ui_auto.cpp | 69 ++++++++++++++++--- .../auto/lua_cocos2dx_ui_auto.hpp | 1 + 6 files changed, 129 insertions(+), 36 deletions(-) diff --git a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_ui_auto_api.js b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_ui_auto_api.js index c5dd20afa5..a5b7ea9b7f 100644 --- a/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_ui_auto_api.js +++ b/cocos/scripting/js-bindings/auto/api/jsb_cocos2dx_ui_auto_api.js @@ -4520,15 +4520,13 @@ isUsingCustomScrollThreshold : function ( }, /** - * @method getPage + * @method setCurPageIndex * @param {long} arg0 - * @return {ccui.Layout} */ -getPage : function ( +setCurPageIndex : function ( long ) { - return ccui.Layout; }, /** @@ -4583,6 +4581,18 @@ long { }, +/** + * @method getPage + * @param {long} arg0 + * @return {ccui.Layout} + */ +getPage : function ( +long +) +{ + return ccui.Layout; +}, + /** * @method removePageAtIndex * @param {long} arg0 diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.cpp index fec24aae75..0fc2dfcc0f 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.cpp @@ -11664,33 +11664,24 @@ bool js_cocos2dx_ui_PageView_isUsingCustomScrollThreshold(JSContext *cx, uint32_ JS_ReportError(cx, "js_cocos2dx_ui_PageView_isUsingCustomScrollThreshold : wrong number of arguments: %d, was expecting %d", argc, 0); return false; } -bool js_cocos2dx_ui_PageView_getPage(JSContext *cx, uint32_t argc, jsval *vp) +bool js_cocos2dx_ui_PageView_setCurPageIndex(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); js_proxy_t *proxy = jsb_get_js_proxy(obj); cocos2d::ui::PageView* cobj = (cocos2d::ui::PageView *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_PageView_getPage : Invalid Native Object"); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_PageView_setCurPageIndex : Invalid Native Object"); if (argc == 1) { ssize_t arg0; ok &= jsval_to_ssize(cx, args.get(0), &arg0); - JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_ui_PageView_getPage : Error processing arguments"); - cocos2d::ui::Layout* ret = cobj->getPage(arg0); - jsval jsret = JSVAL_NULL; - do { - if (ret) { - js_proxy_t *jsProxy = js_get_or_create_proxy(cx, (cocos2d::ui::Layout*)ret); - jsret = OBJECT_TO_JSVAL(jsProxy->obj); - } else { - jsret = JSVAL_NULL; - } - } while (0); - args.rval().set(jsret); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_ui_PageView_setCurPageIndex : Error processing arguments"); + cobj->setCurPageIndex(arg0); + args.rval().setUndefined(); return true; } - JS_ReportError(cx, "js_cocos2dx_ui_PageView_getPage : wrong number of arguments: %d, was expecting %d", argc, 1); + JS_ReportError(cx, "js_cocos2dx_ui_PageView_setCurPageIndex : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } bool js_cocos2dx_ui_PageView_removePage(JSContext *cx, uint32_t argc, jsval *vp) @@ -11811,6 +11802,35 @@ bool js_cocos2dx_ui_PageView_scrollToPage(JSContext *cx, uint32_t argc, jsval *v JS_ReportError(cx, "js_cocos2dx_ui_PageView_scrollToPage : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_ui_PageView_getPage(JSContext *cx, uint32_t argc, jsval *vp) +{ + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + bool ok = true; + JS::RootedObject obj(cx, args.thisv().toObjectOrNull()); + js_proxy_t *proxy = jsb_get_js_proxy(obj); + cocos2d::ui::PageView* cobj = (cocos2d::ui::PageView *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_PageView_getPage : Invalid Native Object"); + if (argc == 1) { + ssize_t arg0; + ok &= jsval_to_ssize(cx, args.get(0), &arg0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_ui_PageView_getPage : Error processing arguments"); + cocos2d::ui::Layout* ret = cobj->getPage(arg0); + jsval jsret = JSVAL_NULL; + do { + if (ret) { + js_proxy_t *jsProxy = js_get_or_create_proxy(cx, (cocos2d::ui::Layout*)ret); + jsret = OBJECT_TO_JSVAL(jsProxy->obj); + } else { + jsret = JSVAL_NULL; + } + } while (0); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_ui_PageView_getPage : wrong number of arguments: %d, was expecting %d", argc, 1); + return false; +} bool js_cocos2dx_ui_PageView_removePageAtIndex(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -12010,12 +12030,13 @@ void js_register_cocos2dx_ui_PageView(JSContext *cx, JS::HandleObject global) { JS_FN("getCurPageIndex", js_cocos2dx_ui_PageView_getCurPageIndex, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("addWidgetToPage", js_cocos2dx_ui_PageView_addWidgetToPage, 3, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("isUsingCustomScrollThreshold", js_cocos2dx_ui_PageView_isUsingCustomScrollThreshold, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("getPage", js_cocos2dx_ui_PageView_getPage, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("setCurPageIndex", js_cocos2dx_ui_PageView_setCurPageIndex, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("removePage", js_cocos2dx_ui_PageView_removePage, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setUsingCustomScrollThreshold", js_cocos2dx_ui_PageView_setUsingCustomScrollThreshold, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setCustomScrollThreshold", js_cocos2dx_ui_PageView_setCustomScrollThreshold, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("insertPage", js_cocos2dx_ui_PageView_insertPage, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("scrollToPage", js_cocos2dx_ui_PageView_scrollToPage, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getPage", js_cocos2dx_ui_PageView_getPage, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("removePageAtIndex", js_cocos2dx_ui_PageView_removePageAtIndex, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getPages", js_cocos2dx_ui_PageView_getPages, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("removeAllPages", js_cocos2dx_ui_PageView_removeAllPages, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.hpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.hpp index 648e9811a8..ab7848bdc2 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.hpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_ui_auto.hpp @@ -590,12 +590,13 @@ bool js_cocos2dx_ui_PageView_getCustomScrollThreshold(JSContext *cx, uint32_t ar bool js_cocos2dx_ui_PageView_getCurPageIndex(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_addWidgetToPage(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_isUsingCustomScrollThreshold(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_ui_PageView_getPage(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_ui_PageView_setCurPageIndex(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_removePage(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_setUsingCustomScrollThreshold(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_setCustomScrollThreshold(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_insertPage(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_scrollToPage(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_ui_PageView_getPage(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_removePageAtIndex(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_getPages(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_ui_PageView_removeAllPages(JSContext *cx, uint32_t argc, jsval *vp); diff --git a/cocos/scripting/lua-bindings/auto/api/PageView.lua b/cocos/scripting/lua-bindings/auto/api/PageView.lua index 534b9a6096..8fd48fef04 100644 --- a/cocos/scripting/lua-bindings/auto/api/PageView.lua +++ b/cocos/scripting/lua-bindings/auto/api/PageView.lua @@ -38,13 +38,13 @@ -- @return bool#bool ret (return value: bool) -------------------------------- --- brief Get a page at a given index
--- param index A given index.
--- return A layout pointer in PageView container. --- @function [parent=#PageView] getPage +-- Jump to a page with a given index without scrolling.
+-- This is the different between scrollToPage.
+-- param index A given index in PageView. Index start from 0 to pageCount -1. +-- @function [parent=#PageView] setCurPageIndex -- @param self -- @param #long index --- @return Layout#Layout ret (return value: ccui.Layout) +-- @return PageView#PageView self (return value: ccui.PageView) -------------------------------- -- Remove a page of PageView.
@@ -91,12 +91,21 @@ -------------------------------- -- Scroll to a page with a given index.
--- param idx A given index in the PageView. +-- param idx A given index in the PageView. Index start from 0 to pageCount -1. -- @function [parent=#PageView] scrollToPage -- @param self -- @param #long idx -- @return PageView#PageView self (return value: ccui.PageView) +-------------------------------- +-- brief Get a page at a given index
+-- param index A given index.
+-- return A layout pointer in PageView container. +-- @function [parent=#PageView] getPage +-- @param self +-- @param #long index +-- @return Layout#Layout ret (return value: ccui.Layout) + -------------------------------- -- Remove a page at a given index of PageView.
-- param index A given index. 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 664d0a9fcf..ba6d69831e 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp @@ -18908,7 +18908,7 @@ int lua_cocos2dx_ui_PageView_isUsingCustomScrollThreshold(lua_State* tolua_S) return 0; } -int lua_cocos2dx_ui_PageView_getPage(lua_State* tolua_S) +int lua_cocos2dx_ui_PageView_setCurPageIndex(lua_State* tolua_S) { int argc = 0; cocos2d::ui::PageView* cobj = nullptr; @@ -18928,7 +18928,7 @@ int lua_cocos2dx_ui_PageView_getPage(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_PageView_getPage'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_PageView_setCurPageIndex'", nullptr); return 0; } #endif @@ -18938,22 +18938,22 @@ int lua_cocos2dx_ui_PageView_getPage(lua_State* tolua_S) { ssize_t arg0; - ok &= luaval_to_ssize(tolua_S, 2, &arg0, "ccui.PageView:getPage"); + ok &= luaval_to_ssize(tolua_S, 2, &arg0, "ccui.PageView:setCurPageIndex"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_PageView_getPage'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_PageView_setCurPageIndex'", nullptr); return 0; } - cocos2d::ui::Layout* ret = cobj->getPage(arg0); - object_to_luaval(tolua_S, "ccui.Layout",(cocos2d::ui::Layout*)ret); + cobj->setCurPageIndex(arg0); + lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.PageView:getPage",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.PageView:setCurPageIndex",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_PageView_getPage'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_PageView_setCurPageIndex'.",&tolua_err); #endif return 0; @@ -19265,6 +19265,56 @@ int lua_cocos2dx_ui_PageView_scrollToPage(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_PageView_getPage(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::PageView* 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.PageView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::PageView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_PageView_getPage'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + ssize_t arg0; + + ok &= luaval_to_ssize(tolua_S, 2, &arg0, "ccui.PageView:getPage"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_PageView_getPage'", nullptr); + return 0; + } + cocos2d::ui::Layout* ret = cobj->getPage(arg0); + object_to_luaval(tolua_S, "ccui.Layout",(cocos2d::ui::Layout*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.PageView:getPage",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_PageView_getPage'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_PageView_removePageAtIndex(lua_State* tolua_S) { int argc = 0; @@ -19581,13 +19631,14 @@ int lua_register_cocos2dx_ui_PageView(lua_State* tolua_S) tolua_function(tolua_S,"getCurPageIndex",lua_cocos2dx_ui_PageView_getCurPageIndex); tolua_function(tolua_S,"addWidgetToPage",lua_cocos2dx_ui_PageView_addWidgetToPage); tolua_function(tolua_S,"isUsingCustomScrollThreshold",lua_cocos2dx_ui_PageView_isUsingCustomScrollThreshold); - tolua_function(tolua_S,"getPage",lua_cocos2dx_ui_PageView_getPage); + tolua_function(tolua_S,"setCurPageIndex",lua_cocos2dx_ui_PageView_setCurPageIndex); tolua_function(tolua_S,"removePage",lua_cocos2dx_ui_PageView_removePage); tolua_function(tolua_S,"addEventListener",lua_cocos2dx_ui_PageView_addEventListener); tolua_function(tolua_S,"setUsingCustomScrollThreshold",lua_cocos2dx_ui_PageView_setUsingCustomScrollThreshold); tolua_function(tolua_S,"setCustomScrollThreshold",lua_cocos2dx_ui_PageView_setCustomScrollThreshold); tolua_function(tolua_S,"insertPage",lua_cocos2dx_ui_PageView_insertPage); tolua_function(tolua_S,"scrollToPage",lua_cocos2dx_ui_PageView_scrollToPage); + tolua_function(tolua_S,"getPage",lua_cocos2dx_ui_PageView_getPage); tolua_function(tolua_S,"removePageAtIndex",lua_cocos2dx_ui_PageView_removePageAtIndex); tolua_function(tolua_S,"getPages",lua_cocos2dx_ui_PageView_getPages); tolua_function(tolua_S,"removeAllPages",lua_cocos2dx_ui_PageView_removeAllPages); 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 04b1db2753..2cfe8e498a 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp @@ -572,6 +572,7 @@ int register_all_cocos2dx_ui(lua_State* tolua_S); + #endif // __cocos2dx_ui_h__ From 7c665e64470dc34adbc4a81a6449096e519a9072 Mon Sep 17 00:00:00 2001 From: andyque Date: Thu, 16 Jul 2015 14:15:41 +0800 Subject: [PATCH 92/93] remove EMSCRIPTEN related code --- cocos/2d/CCDrawingPrimitives.cpp | 97 +------------------------------ cocos/2d/CCLayer.cpp | 10 +--- cocos/2d/CCMotionStreak.cpp | 12 ---- cocos/base/CCDirector.cpp | 4 -- cocos/platform/CCImage.cpp | 21 ------- cocos/renderer/CCTexture2D.cpp | 16 ----- cocos/renderer/CCTexture2D.h | 6 -- cocos/renderer/CCTextureCache.cpp | 4 -- 8 files changed, 3 insertions(+), 167 deletions(-) diff --git a/cocos/2d/CCDrawingPrimitives.cpp b/cocos/2d/CCDrawingPrimitives.cpp index 929c5c9986..f3dbd9f93a 100644 --- a/cocos/2d/CCDrawingPrimitives.cpp +++ b/cocos/2d/CCDrawingPrimitives.cpp @@ -70,32 +70,6 @@ static Color4F s_color(1.0f,1.0f,1.0f,1.0f); static int s_pointSizeLocation = -1; static GLfloat s_pointSize = 1.0f; -#ifdef EMSCRIPTEN -static GLuint s_bufferObject = 0; -static GLuint s_bufferSize = 0; - -static void setGLBufferData(void *buf, GLuint bufSize) -{ - if(s_bufferSize < bufSize) - { - if(s_bufferObject) - { - glDeleteBuffers(1, &s_bufferObject); - } - glGenBuffers(1, &s_bufferObject); - s_bufferSize = bufSize; - - glBindBuffer(GL_ARRAY_BUFFER, s_bufferObject); - glBufferData(GL_ARRAY_BUFFER, bufSize, buf, GL_DYNAMIC_DRAW); - } - else - { - glBindBuffer(GL_ARRAY_BUFFER, s_bufferObject); - glBufferSubData(GL_ARRAY_BUFFER, 0, bufSize, buf); - } -} - -#endif // EMSCRIPTEN static void lazy_init() { @@ -143,12 +117,7 @@ void drawPoint(const Vec2& point) s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1); s_shader->setUniformLocationWith1f(s_pointSizeLocation, s_pointSize); -#ifdef EMSCRIPTEN - setGLBufferData(&p, 8); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, &p); -#endif // EMSCRIPTEN glDrawArrays(GL_POINTS, 0, 1); @@ -171,12 +140,7 @@ void drawPoints( const Vec2 *points, unsigned int numberOfPoints ) // iPhone and 32-bit machines optimization if( sizeof(Vec2) == sizeof(Vec2) ) { -#ifdef EMSCRIPTEN - setGLBufferData((void*) points, numberOfPoints * sizeof(Vec2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, points); -#endif // EMSCRIPTEN } else { @@ -185,14 +149,7 @@ void drawPoints( const Vec2 *points, unsigned int numberOfPoints ) newPoints[i].x = points[i].x; newPoints[i].y = points[i].y; } -#ifdef EMSCRIPTEN - // Suspect Emscripten won't be emitting 64-bit code for a while yet, - // but want to make sure this continues to work even if they do. - setGLBufferData(newPoints, numberOfPoints * sizeof(Vec2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, newPoints); -#endif // EMSCRIPTEN } glDrawArrays(GL_POINTS, 0, (GLsizei) numberOfPoints); @@ -217,12 +174,7 @@ void drawLine(const Vec2& origin, const Vec2& destination) s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &s_color.r, 1); GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); -#ifdef EMSCRIPTEN - setGLBufferData(vertices, 16); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); -#endif // EMSCRIPTEN glDrawArrays(GL_LINES, 0, 2); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,2); @@ -261,12 +213,7 @@ void drawPoly(const Vec2 *poli, unsigned int numberOfPoints, bool closePolygon) // iPhone and 32-bit machines optimization if( sizeof(Vec2) == sizeof(Vec2) ) { -#ifdef EMSCRIPTEN - setGLBufferData((void*) poli, numberOfPoints * sizeof(Vec2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, poli); -#endif // EMSCRIPTEN if( closePolygon ) glDrawArrays(GL_LINE_LOOP, 0, (GLsizei) numberOfPoints); @@ -282,12 +229,7 @@ void drawPoly(const Vec2 *poli, unsigned int numberOfPoints, bool closePolygon) newPoli[i].x = poli[i].x; newPoli[i].y = poli[i].y; } -#ifdef EMSCRIPTEN - setGLBufferData(newPoli, numberOfPoints * sizeof(Vec2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, newPoli); -#endif // EMSCRIPTEN if( closePolygon ) glDrawArrays(GL_LINE_LOOP, 0, (GLsizei) numberOfPoints); @@ -316,12 +258,7 @@ void drawSolidPoly(const Vec2 *poli, unsigned int numberOfPoints, Color4F color) // iPhone and 32-bit machines optimization if (sizeof(Vec2) == sizeof(Vec2)) { -#ifdef EMSCRIPTEN - setGLBufferData((void*) poli, numberOfPoints * sizeof(Vec2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, poli); -#endif // EMSCRIPTEN } else { @@ -330,13 +267,8 @@ void drawSolidPoly(const Vec2 *poli, unsigned int numberOfPoints, Color4F color) { newPoli[i].set(poli[i].x, poli[i].y); } -#ifdef EMSCRIPTEN - setGLBufferData(newPoli, numberOfPoints * sizeof(Vec2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, newPoli); -#endif // EMSCRIPTEN - } + } glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei) numberOfPoints); @@ -375,12 +307,7 @@ void drawCircle( const Vec2& center, float radius, float angle, unsigned int seg GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); -#ifdef EMSCRIPTEN - setGLBufferData(vertices, sizeof(GLfloat)*2*(segments+2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); -#endif // EMSCRIPTEN glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments+additionalSegment); ::free( vertices ); @@ -420,13 +347,8 @@ void drawSolidCircle( const Vec2& center, float radius, float angle, unsigned in GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); -#ifdef EMSCRIPTEN - setGLBufferData(vertices, sizeof(GLfloat)*2*(segments+2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); -#endif // EMSCRIPTEN - + glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei) segments+1); ::free( vertices ); @@ -461,12 +383,7 @@ void drawQuadBezier(const Vec2& origin, const Vec2& control, const Vec2& destina GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); -#ifdef EMSCRIPTEN - setGLBufferData(vertices, (segments + 1) * sizeof(Vec2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); -#endif // EMSCRIPTEN glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments + 1); CC_SAFE_DELETE_ARRAY(vertices); @@ -518,12 +435,7 @@ void drawCardinalSpline( PointArray *config, float tension, unsigned int segmen GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); -#ifdef EMSCRIPTEN - setGLBufferData(vertices, (segments + 1) * sizeof(Vec2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); -#endif // EMSCRIPTEN glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments + 1); CC_SAFE_DELETE_ARRAY(vertices); @@ -552,12 +464,7 @@ void drawCubicBezier(const Vec2& origin, const Vec2& control1, const Vec2& contr GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION ); -#ifdef EMSCRIPTEN - setGLBufferData(vertices, (segments + 1) * sizeof(Vec2)); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); -#endif // EMSCRIPTEN glDrawArrays(GL_LINE_STRIP, 0, (GLsizei) segments + 1); CC_SAFE_DELETE_ARRAY(vertices); diff --git a/cocos/2d/CCLayer.cpp b/cocos/2d/CCLayer.cpp index 72861dac23..8eaf23c10c 100644 --- a/cocos/2d/CCLayer.cpp +++ b/cocos/2d/CCLayer.cpp @@ -600,18 +600,10 @@ void LayerColor::onDraw(const Mat4& transform, uint32_t flags) // // Attributes // -#ifdef EMSCRIPTEN - setGLBufferData(_noMVPVertices, 4 * sizeof(Vec3), 0); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, 0, 0); - - setGLBufferData(_squareColors, 4 * sizeof(Color4F), 1); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE, 0, 0); -#else glBindBuffer(GL_ARRAY_BUFFER, 0); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, 0, _noMVPVertices); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE, 0, _squareColors); -#endif // EMSCRIPTEN - + GL::blendFunc( _blendFunc.src, _blendFunc.dst ); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); diff --git a/cocos/2d/CCMotionStreak.cpp b/cocos/2d/CCMotionStreak.cpp index ade1cd542c..c270fa3bdc 100644 --- a/cocos/2d/CCMotionStreak.cpp +++ b/cocos/2d/CCMotionStreak.cpp @@ -386,21 +386,9 @@ void MotionStreak::onDraw(const Mat4 &transform, uint32_t flags) GL::bindTexture2D( _texture->getName() ); -#ifdef EMSCRIPTEN - // Size calculations from ::initWithFade - setGLBufferData(_vertices, (sizeof(Vec2) * _maxPoints * 2), 0); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); - - setGLBufferData(_texCoords, (sizeof(Tex2F) * _maxPoints * 2), 1); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, 0, 0); - - setGLBufferData(_colorPointer, (sizeof(GLubyte) * _maxPoints * 2 * 4), 2); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, _vertices); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, 0, _texCoords); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, _colorPointer); -#endif // EMSCRIPTEN glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)_nuPoints*2); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, _nuPoints*2); diff --git a/cocos/base/CCDirector.cpp b/cocos/base/CCDirector.cpp index 87b95d2b82..32adff7276 100644 --- a/cocos/base/CCDirector.cpp +++ b/cocos/base/CCDirector.cpp @@ -410,11 +410,7 @@ TextureCache* Director::getTextureCache() const void Director::initTextureCache() { -#ifdef EMSCRIPTEN - _textureCache = new (std::nothrow) TextureCacheEmscripten(); -#else _textureCache = new (std::nothrow) TextureCache(); -#endif // EMSCRIPTEN } void Director::destroyTextureCache() diff --git a/cocos/platform/CCImage.cpp b/cocos/platform/CCImage.cpp index ad85ccb88f..6a3fa96e7e 100644 --- a/cocos/platform/CCImage.cpp +++ b/cocos/platform/CCImage.cpp @@ -486,33 +486,12 @@ bool Image::initWithImageFile(const std::string& path) bool ret = false; _filePath = FileUtils::getInstance()->fullPathForFilename(path); -#ifdef EMSCRIPTEN - // Emscripten includes a re-implementation of SDL that uses HTML5 canvas - // operations underneath. Consequently, loading images via IMG_Load (an SDL - // API) will be a lot faster than running libpng et al as compiled with - // Emscripten. - SDL_Surface *iSurf = IMG_Load(fullPath.c_str()); - - int size = 4 * (iSurf->w * iSurf->h); - ret = initWithRawData((const unsigned char*)iSurf->pixels, size, iSurf->w, iSurf->h, 8, true); - - unsigned int *tmp = (unsigned int *)_data; - int nrPixels = iSurf->w * iSurf->h; - for(int i = 0; i < nrPixels; i++) - { - unsigned char *p = _data + i * 4; - tmp[i] = CC_RGB_PREMULTIPLY_ALPHA( p[0], p[1], p[2], p[3] ); - } - - SDL_FreeSurface(iSurf); -#else Data data = FileUtils::getInstance()->getDataFromFile(_filePath); if (!data.isNull()) { ret = initWithImageData(data.getBytes(), data.getSize()); } -#endif // EMSCRIPTEN return ret; } diff --git a/cocos/renderer/CCTexture2D.cpp b/cocos/renderer/CCTexture2D.cpp index b9e0a581ae..e22691a291 100644 --- a/cocos/renderer/CCTexture2D.cpp +++ b/cocos/renderer/CCTexture2D.cpp @@ -1164,16 +1164,8 @@ void Texture2D::drawAtPoint(const Vec2& point) GL::bindTexture2D( _name ); -#ifdef EMSCRIPTEN - setGLBufferData(vertices, 8 * sizeof(GLfloat), 0); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); - - setGLBufferData(coordinates, 8 * sizeof(GLfloat), 1); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, 0, coordinates); -#endif // EMSCRIPTEN glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @@ -1197,16 +1189,8 @@ void Texture2D::drawInRect(const Rect& rect) GL::bindTexture2D( _name ); -#ifdef EMSCRIPTEN - setGLBufferData(vertices, 8 * sizeof(GLfloat), 0); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0); - - setGLBufferData(coordinates, 8 * sizeof(GLfloat), 1); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, 0, 0); -#else glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, 0, coordinates); -#endif // EMSCRIPTEN glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } diff --git a/cocos/renderer/CCTexture2D.h b/cocos/renderer/CCTexture2D.h index 0da5bc2b81..5a9bbd010b 100644 --- a/cocos/renderer/CCTexture2D.h +++ b/cocos/renderer/CCTexture2D.h @@ -34,9 +34,6 @@ THE SOFTWARE. #include "base/CCRef.h" #include "math/CCGeometry.h" #include "base/ccTypes.h" -#ifdef EMSCRIPTEN -#include "CCGLBufferedNode.h" -#endif // EMSCRIPTEN NS_CC_BEGIN @@ -68,9 +65,6 @@ class GLProgram; * Be aware that the content of the generated textures will be upside-down! */ class CC_DLL Texture2D : public Ref -#ifdef EMSCRIPTEN -, public GLBufferedNode -#endif // EMSCRIPTEN { public: /** @typedef Texture2D::PixelFormat diff --git a/cocos/renderer/CCTextureCache.cpp b/cocos/renderer/CCTextureCache.cpp index d93be8473f..06e628496d 100644 --- a/cocos/renderer/CCTextureCache.cpp +++ b/cocos/renderer/CCTextureCache.cpp @@ -43,10 +43,6 @@ THE SOFTWARE. #include "base/CCNinePatchImageParser.h" -#ifdef EMSCRIPTEN -#include -#include "platform/emscripten/CCTextureCacheEmscripten.h" -#endif // EMSCRIPTEN using namespace std; From 042a3dc2ec700601ac6bd235e6238f7cde297663 Mon Sep 17 00:00:00 2001 From: andyque Date: Fri, 17 Jul 2015 10:48:05 +0800 Subject: [PATCH 93/93] add xcpretty to framework mac build --- tools/jenkins-scripts/slave-scripts/framework/mac-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/jenkins-scripts/slave-scripts/framework/mac-build.sh b/tools/jenkins-scripts/slave-scripts/framework/mac-build.sh index 79c17f0bd9..09de45511e 100755 --- a/tools/jenkins-scripts/slave-scripts/framework/mac-build.sh +++ b/tools/jenkins-scripts/slave-scripts/framework/mac-build.sh @@ -2,4 +2,4 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" COCOS2DX_ROOT="$DIR"/../../../.. cd ${COCOS2DX_ROOT} -python tools/framework-compile/bin/gen_cocos_libs.py -c --mac +python tools/framework-compile/bin/gen_cocos_libs.py -c --mac | xcpretty