From 4a218ea3e21f308ab8bd4a93ceff7bc31b937598 Mon Sep 17 00:00:00 2001 From: Wenhai Lin Date: Wed, 28 Jan 2015 15:30:52 +0800 Subject: [PATCH 01/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] [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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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 52293ad451c937c74de0135fe258b216ff90d8e9 Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Fri, 10 Jul 2015 14:37:42 +0800 Subject: [PATCH 39/81] Fixed #9586 : FileUtils::isDirectoryExist not correct on Android when using relative path in 'assets'. --- cocos/platform/CCFileUtils.cpp | 31 ----------- cocos/platform/CCFileUtils.h | 2 +- .../platform/android/CCFileUtils-android.cpp | 54 +++++++++++++++++++ cocos/platform/android/CCFileUtils-android.h | 3 +- .../org/cocos2dx/lib/Cocos2dxActivity.java | 2 +- cocos/platform/apple/CCFileUtils-apple.h | 1 + cocos/platform/apple/CCFileUtils-apple.mm | 12 +++++ cocos/platform/linux/CCFileUtils-linux.cpp | 11 ++++ cocos/platform/linux/CCFileUtils-linux.h | 3 +- cocos/platform/win32/CCFileUtils-win32.cpp | 11 ++++ cocos/platform/win32/CCFileUtils-win32.h | 4 +- cocos/platform/winrt/CCFileUtilsWinRT.cpp | 11 ++++ cocos/platform/winrt/CCFileUtilsWinRT.h | 3 +- 13 files changed, 110 insertions(+), 38 deletions(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index b5b502decd..068e454fc8 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -962,36 +962,6 @@ bool FileUtils::isAbsolutePath(const std::string& path) const return (path[0] == '/'); } -bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const -{ -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) - WIN32_FILE_ATTRIBUTE_DATA wfad; - std::wstring wdirPath(dirPath.begin(), dirPath.end()); - if (GetFileAttributesEx(wdirPath.c_str(), GetFileExInfoStandard, &wfad)) - { - 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 - struct stat st; - if (stat(dirPath.c_str(), &st) == 0) - { - return S_ISDIR(st.st_mode); - } - return false; -#endif - - -} - bool FileUtils::isDirectoryExist(const std::string& dirPath) const { CCASSERT(!dirPath.empty(), "Invalid path"); @@ -1022,7 +992,6 @@ bool FileUtils::isDirectoryExist(const std::string& dirPath) const } } } - return false; } diff --git a/cocos/platform/CCFileUtils.h b/cocos/platform/CCFileUtils.h index 9766478566..153c0795c1 100644 --- a/cocos/platform/CCFileUtils.h +++ b/cocos/platform/CCFileUtils.h @@ -454,7 +454,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; + virtual bool isDirectoryExistInternal(const std::string& dirPath) const = 0; /** * Gets full path for filename, resolution directory and search path. diff --git a/cocos/platform/android/CCFileUtils-android.cpp b/cocos/platform/android/CCFileUtils-android.cpp index dc35d757aa..1147de6b16 100644 --- a/cocos/platform/android/CCFileUtils-android.cpp +++ b/cocos/platform/android/CCFileUtils-android.cpp @@ -33,6 +33,7 @@ THE SOFTWARE. #include "android/asset_manager_jni.h" #include "jni/CocosPlayClient.h" #include +#include #define LOG_TAG "CCFileUtils-android.cpp" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) @@ -187,6 +188,59 @@ bool FileUtilsAndroid::isFileExistInternal(const std::string& strFilePath) const return bFound; } +bool FileUtilsAndroid::isDirectoryExistInternal(const std::string& dirPath) const +{ + if (dirPath.empty()) + { + return false; + } + + const char* s = dirPath.c_str(); + bool startWithAssets = (dirPath.find("assets/") == 0); + int lenOfAssets = 7; + + std::string tmpStr; + if (cocosplay::isEnabled() && !cocosplay::isDemo()) + { + // redirect assets/*** path to cocosplay resource dir + tmpStr.append(_defaultResRootPath); + if ('/' != tmpStr[tmpStr.length() - 1]) + { + tmpStr += '/'; + } + tmpStr.append(s + lenOfAssets); + } + + // find absolute path in flash memory + if (s[0] == '/') + { + CCLOG("find in flash memory dirPath(%s)", s); + struct stat st; + if (stat(s, &st) == 0) + { + return S_ISDIR(st.st_mode); + } + } + + // find it in apk's assets dir + // Found "assets/" at the beginning of the path and we don't want it + CCLOG("find in apk dirPath(%s)", s); + if (startWithAssets) + { + s += lenOfAssets; + } + if (FileUtilsAndroid::assetmanager) + { + AAssetDir* aa = AAssetManager_openDir(FileUtilsAndroid::assetmanager, s); + if (aa && AAssetDir_getNextFileName(aa)) + { + AAssetDir_close(aa); + return true; + } + } + return false; +} + bool FileUtilsAndroid::isAbsolutePath(const std::string& strPath) const { // On Android, there are two situations for full path. diff --git a/cocos/platform/android/CCFileUtils-android.h b/cocos/platform/android/CCFileUtils-android.h index 7f65d4aa8e..edea6fbc47 100644 --- a/cocos/platform/android/CCFileUtils-android.h +++ b/cocos/platform/android/CCFileUtils-android.h @@ -81,7 +81,8 @@ public: virtual bool isAbsolutePath(const std::string& strPath) const; private: - virtual bool isFileExistInternal(const std::string& strFilePath) const; + virtual bool isFileExistInternal(const std::string& strFilePath) const override; + virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; Data getData(const std::string& filename, bool forString); static AAssetManager* assetmanager; 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..92b1e3b5c6 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java @@ -213,7 +213,7 @@ public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelpe // =========================================================== // Constructors // =========================================================== - + @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/cocos/platform/apple/CCFileUtils-apple.h b/cocos/platform/apple/CCFileUtils-apple.h index 9838947bfc..8d23520e74 100644 --- a/cocos/platform/apple/CCFileUtils-apple.h +++ b/cocos/platform/apple/CCFileUtils-apple.h @@ -57,6 +57,7 @@ public: void setBundle(NSBundle* bundle); private: virtual bool isFileExistInternal(const std::string& filePath) const override; + virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; NSBundle* getBundle() const; NSBundle* _bundle; }; diff --git a/cocos/platform/apple/CCFileUtils-apple.mm b/cocos/platform/apple/CCFileUtils-apple.mm index a12f4f7966..4755db6c0f 100644 --- a/cocos/platform/apple/CCFileUtils-apple.mm +++ b/cocos/platform/apple/CCFileUtils-apple.mm @@ -27,6 +27,8 @@ THE SOFTWARE. #include "CCFileUtils-apple.h" +#include + #include #include @@ -392,6 +394,16 @@ bool FileUtilsApple::isFileExistInternal(const std::string& filePath) const return ret; } +bool FileUtilsApple::isDirectoryExistInternal(const std::string& dirPath) const +{ + struct stat st; + if (stat(dirPath.c_str(), &st) == 0) + { + return S_ISDIR(st.st_mode); + } + return false; +} + std::string FileUtilsApple::getFullPathForDirectoryAndFilename(const std::string& directory, const std::string& filename) const { if (directory[0] != '/') diff --git a/cocos/platform/linux/CCFileUtils-linux.cpp b/cocos/platform/linux/CCFileUtils-linux.cpp index 70136decd9..388a7d377e 100644 --- a/cocos/platform/linux/CCFileUtils-linux.cpp +++ b/cocos/platform/linux/CCFileUtils-linux.cpp @@ -35,6 +35,7 @@ THE SOFTWARE. #include #include #include +#include #ifndef CC_RESOURCE_FOLDER_LINUX #define CC_RESOURCE_FOLDER_LINUX ("/Resources/") @@ -121,6 +122,16 @@ 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 89b38d5702..1605e8289f 100644 --- a/cocos/platform/linux/CCFileUtils-linux.h +++ b/cocos/platform/linux/CCFileUtils-linux.h @@ -52,7 +52,8 @@ public: bool init(); virtual std::string getWritablePath() const; private: - virtual bool isFileExistInternal(const std::string& strFilePath) const; + 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 c14c748563..19e8a27f98 100644 --- a/cocos/platform/win32/CCFileUtils-win32.cpp +++ b/cocos/platform/win32/CCFileUtils-win32.cpp @@ -121,6 +121,17 @@ bool FileUtilsWin32::isFileExistInternal(const std::string& strFilePath) const 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 diff --git a/cocos/platform/win32/CCFileUtils-win32.h b/cocos/platform/win32/CCFileUtils-win32.h index 17f6c1ec01..b9d4d0d7e1 100644 --- a/cocos/platform/win32/CCFileUtils-win32.h +++ b/cocos/platform/win32/CCFileUtils-win32.h @@ -53,8 +53,8 @@ public: virtual bool isAbsolutePath(const std::string& strPath) const; protected: - virtual bool isFileExistInternal(const std::string& strFilePath) const; - + virtual bool isFileExistInternal(const std::string& strFilePath) const override; + virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; /** * Gets resource file data * diff --git a/cocos/platform/winrt/CCFileUtilsWinRT.cpp b/cocos/platform/winrt/CCFileUtilsWinRT.cpp index 897d999f86..bac3d0713f 100644 --- a/cocos/platform/winrt/CCFileUtilsWinRT.cpp +++ b/cocos/platform/winrt/CCFileUtilsWinRT.cpp @@ -121,6 +121,17 @@ bool CCFileUtilsWinRT::isFileExistInternal(const std::string& strFilePath) const return ret; } +bool CCFileUtilsWinRT::isDirectoryExistInternal(const std::string& dirPath) const +{ + WIN32_FILE_ATTRIBUTE_DATA wfad; + std::wstring wdirPath(dirPath.begin(), dirPath.end()); + if (GetFileAttributesEx(wdirPath.c_str(), GetFileExInfoStandard, &wfad)) + { + return true; + } + return false; +} + bool CCFileUtilsWinRT::isAbsolutePath(const std::string& strPath) const { if ( strPath.length() > 2 diff --git a/cocos/platform/winrt/CCFileUtilsWinRT.h b/cocos/platform/winrt/CCFileUtilsWinRT.h index 90b450a084..999574069d 100644 --- a/cocos/platform/winrt/CCFileUtilsWinRT.h +++ b/cocos/platform/winrt/CCFileUtilsWinRT.h @@ -55,7 +55,8 @@ public: static std::string getAppPath(); private: - virtual bool isFileExistInternal(const std::string& strFilePath) const; + virtual bool isFileExistInternal(const std::string& strFilePath) const override; + virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; }; // end of platform group From 81bc0b09da6ba48e5575d39d3582afe26252e2ce Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 10 Jul 2015 14:39:21 +0800 Subject: [PATCH 40/81] 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 41/81] 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 16:17:34 +0800 Subject: [PATCH 42/81] [ci skip] replace tab with 4 space. --- cocos/platform/win32/CCFileUtils-win32.cpp | 14 +++++++------- cocos/platform/win32/CCFileUtils-win32.h | 4 ++-- cocos/platform/winrt/CCFileUtilsWinRT.cpp | 14 +++++++------- cocos/platform/winrt/CCFileUtilsWinRT.h | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/cocos/platform/win32/CCFileUtils-win32.cpp b/cocos/platform/win32/CCFileUtils-win32.cpp index 19e8a27f98..bb966563b2 100644 --- a/cocos/platform/win32/CCFileUtils-win32.cpp +++ b/cocos/platform/win32/CCFileUtils-win32.cpp @@ -123,13 +123,13 @@ bool FileUtilsWin32::isFileExistInternal(const std::string& strFilePath) const 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; + 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 diff --git a/cocos/platform/win32/CCFileUtils-win32.h b/cocos/platform/win32/CCFileUtils-win32.h index b9d4d0d7e1..86e0f9d4d9 100644 --- a/cocos/platform/win32/CCFileUtils-win32.h +++ b/cocos/platform/win32/CCFileUtils-win32.h @@ -53,8 +53,8 @@ public: virtual bool isAbsolutePath(const std::string& strPath) const; protected: - virtual bool isFileExistInternal(const std::string& strFilePath) const override; - virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; + virtual bool isFileExistInternal(const std::string& strFilePath) const override; + virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; /** * Gets resource file data * diff --git a/cocos/platform/winrt/CCFileUtilsWinRT.cpp b/cocos/platform/winrt/CCFileUtilsWinRT.cpp index bac3d0713f..0ff79eca03 100644 --- a/cocos/platform/winrt/CCFileUtilsWinRT.cpp +++ b/cocos/platform/winrt/CCFileUtilsWinRT.cpp @@ -123,13 +123,13 @@ bool CCFileUtilsWinRT::isFileExistInternal(const std::string& strFilePath) const bool CCFileUtilsWinRT::isDirectoryExistInternal(const std::string& dirPath) const { - WIN32_FILE_ATTRIBUTE_DATA wfad; - std::wstring wdirPath(dirPath.begin(), dirPath.end()); - if (GetFileAttributesEx(wdirPath.c_str(), GetFileExInfoStandard, &wfad)) - { - return true; - } - return false; + WIN32_FILE_ATTRIBUTE_DATA wfad; + std::wstring wdirPath(dirPath.begin(), dirPath.end()); + if (GetFileAttributesEx(wdirPath.c_str(), GetFileExInfoStandard, &wfad)) + { + return true; + } + return false; } bool CCFileUtilsWinRT::isAbsolutePath(const std::string& strPath) const diff --git a/cocos/platform/winrt/CCFileUtilsWinRT.h b/cocos/platform/winrt/CCFileUtilsWinRT.h index 999574069d..9cbd6a70a6 100644 --- a/cocos/platform/winrt/CCFileUtilsWinRT.h +++ b/cocos/platform/winrt/CCFileUtilsWinRT.h @@ -56,7 +56,7 @@ public: private: virtual bool isFileExistInternal(const std::string& strFilePath) const override; - virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; + virtual bool isDirectoryExistInternal(const std::string& dirPath) const override; }; // end of platform group From 34aa7a0bb1172d80b8c90689b05210e914aba92e Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Fri, 10 Jul 2015 16:40:02 +0800 Subject: [PATCH 43/81] Remove unused variable. --- cocos/platform/CCFileUtils.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index d5d306ae4b..c554be52a0 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -584,7 +584,6 @@ bool FileUtils::writeStringToFile(std::string dataStr, const std::string& fullPa bool FileUtils::writeDataToFile(Data retData, const std::string& fullPath) { - unsigned char* buffer = nullptr; size_t size = 0; const char* mode = "wb"; From 92d78efce0b76ee6bfe10f190476735c671ab4f5 Mon Sep 17 00:00:00 2001 From: XiaoFeng Date: Fri, 10 Jul 2015 17:00:16 +0800 Subject: [PATCH 44/81] 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 45/81] 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 c68469a611ea6965daf9a9dfa48cf37addf2f827 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 10 Jul 2015 20:42:05 +0800 Subject: [PATCH 46/81] Update Nibiru SDK. --- .../libs/nibiru_lib.jar | Bin 0 -> 442809 bytes .../libs/nibiru_lib_2_1_8.jar | Bin 205879 -> 0 bytes .../org/cocos2dx/lib/GameControllerNibiru.java | 8 ++++---- .../game_controller_test/AppActivity.java | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 cocos/platform/android/ControllerManualAdapter/libs/nibiru_lib.jar delete mode 100644 cocos/platform/android/ControllerManualAdapter/libs/nibiru_lib_2_1_8.jar diff --git a/cocos/platform/android/ControllerManualAdapter/libs/nibiru_lib.jar b/cocos/platform/android/ControllerManualAdapter/libs/nibiru_lib.jar new file mode 100644 index 0000000000000000000000000000000000000000..5b4dc2f919a2e4c74cfde545e0865d405a5c25c2 GIT binary patch literal 442809 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�JXsUCdG7L_;@=NX-g4e<(29%K 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

qZ0DKKEp+t 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

QvgLsx(_+V!+s~+8GWpz0uVwX;EI+ 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 {i5Lr(w$Oz6TiSFgScxn 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

gOi?$!_uZOuYXdQ%>+-S65*Na~Bf_VH4AT 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%0D6Buhm&(nJba^dYSD&0({dAbiU#VBF+6u zL0l5sa1!~mz=KZ#4~F_zW)CVE_K0!i8pM6w0CxhcML`WCK7b0hZ5U-oN0_-YYA@Tu zz5iMT7{wX%h)|^+hEYjDGQa&c7GQB6)Fym&6xxdMCQ;$E++gs1LceDyzgGc}MDCkc zocN!Eu)>RMce85-sc+;pxmN;Wv!5CbJqBNTg-@=aUEJCND!!bXGklA{&TocxPcf}1 z1kS;m61+BvwAL(30+=j#p{t=9%c!8+Zt{1NB|`jBo(^*v zfR+a@G%{KIm-wB{6QKwuqt8R)01uz;fl+VA6TO0}1pi;UL`a=9{XF#oc;cfy^>|_x z6;<)qb+-Q>tKgp`>^8Y5gVDtUAi8~kyL*XCW&NMge_aF-S-t%Iq7*QIGxGQQ$RcDnf-+_rFhVDj>`n#gfCX6Oy&=@gke;rM$msiwKH*{-vi zcRNg*ysxJ+X!}=z?#BUt`-wWahYgP#WQ|=wCfdRgv8o5Jgz}vRICOwJw#@=Ru`}<% zopy%ju}_;LT|`?)qjq2gBq7i-(LrdBS&-8ZYnB%!bt(=ps=y1H-;RfmeGhBFphJLx2dezU4gwllpY$FEIN|vB_DJNrTijG6_|E|z3E)A42qD=$ zyx*{2kul1x6&Mz0mcYM8GXg$&5~AdQ+&@AQ*Gvk_W$#Wxa8fxK(m^fncx>eNApacf z4E$2g(ahWhF;OU4n_3Q(9Q66ST6M7Y9^x5iXGdq0W$xiUjB^&CGC-N>cc=%x6$B~9 zT|T~zL#$hQYvHRG0747&gO;}N{2tifN=BLPJVXE01zuV-pdwVg=lV#A$fiF|7ea}= z!07e~q`PS$WxaF(DGYH*6Mbs?;LD8gLwce8HnRl+)Q$tYwXnA*+|+UX_H;lB(P=bp0R8aOjdSPH{_u49eN{41%za?Egb~i*-wt$0pT&1f6GQ} zZM@^lSZcu9#9)kvwstRn1mwT%-P+U^WbKfdS-(GGeHwUyB5*G#^my<;Ly_2b^KlYG z1@MWpU|t68LN4C?M=0XLXUj7A1%twif;b!6s7#}gBT>!3a9X@IzW^sV0zxwAcqsus z^V;JCzsVrLr=X70R)!LYSihZDEgVW7CBX1BR^-mC&0*SKpCaQ`}=+`rjdu=B Date: Fri, 10 Jul 2015 20:47:21 +0800 Subject: [PATCH 47/81] [ci skip]Replace tab with spaces. --- .../cocos2dx/lib/GameControllerActivity.java | 518 +++++++++--------- .../cocos2dx/lib/GameControllerHelper.java | 480 ++++++++-------- .../org/cocos2dx/lib/GameControllerMoga.java | 368 ++++++------- .../cocos2dx/lib/GameControllerNibiru.java | 370 ++++++------- .../org/cocos2dx/lib/GameControllerOuya.java | 260 +++++---- 5 files changed, 994 insertions(+), 1002 deletions(-) diff --git a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerActivity.java b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerActivity.java index b527751778..ba58296795 100644 --- a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerActivity.java +++ b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerActivity.java @@ -36,271 +36,271 @@ import android.view.MotionEvent; import android.util.Log; public abstract class GameControllerActivity extends Cocos2dxActivity implements InputDeviceListener { - // =========================================================== - // Constants - // =========================================================== + // =========================================================== + // Constants + // =========================================================== - private final static String TAG = GameControllerActivity.class.getSimpleName(); + private final static String TAG = GameControllerActivity.class.getSimpleName(); - public static final int DRIVERTYPE_NIBIRU = 0; - public static final int DRIVERTYPE_MOGA = 1; - public static final int DRIVERTYPE_OUYA = 2; - public static final int DRIVERTYPE_STANDARD = 3; - public static final int DRIVERTYPE_UNKNOWN = 4; - - // =========================================================== - // Fields - // =========================================================== - private static GameControllerActivity sGameControllerActivity; - private InputManagerCompat mInputManager = null; - - protected GameControllerHelper mControllerHelper = null; - - protected GameControllerDelegate mControllerNibiru = null; - protected GameControllerDelegate mControllerMoga = null; - protected GameControllerDelegate mControllerOuya = null; - - public void connectController(int driveType){ - try { - - ClassLoader loader = sGameControllerActivity.getClassLoader(); - Class controllerDelegate = null; - if (driveType == DRIVERTYPE_MOGA) { - if (mControllerMoga != null) { - return; - } - controllerDelegate = loader.loadClass("org.cocos2dx.lib.GameControllerMoga"); - } else if (driveType == DRIVERTYPE_NIBIRU) { - if (mControllerNibiru != null) { - mControllerNibiru.onCreate(sGameControllerActivity); - mControllerNibiru.onResume(); - return; - } - controllerDelegate = loader.loadClass("org.cocos2dx.lib.GameControllerNibiru"); - } else if (driveType == DRIVERTYPE_OUYA) { - if (mControllerOuya != null) { - return; - } - controllerDelegate = loader.loadClass("org.cocos2dx.lib.GameControllerOuya"); - } - - GameControllerDelegate instance = (GameControllerDelegate)controllerDelegate.newInstance(); - sGameControllerActivity.setGameControllerInstance(instance, driveType); - - if (driveType == DRIVERTYPE_NIBIRU) { - Method method = controllerDelegate.getDeclaredMethod("onResume"); - method.invoke(instance); - } - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public void setGameControllerInstance(GameControllerDelegate controllerDelegate, int driveType) { - if (driveType == DRIVERTYPE_NIBIRU) { - mControllerNibiru = controllerDelegate; - }else if (driveType == DRIVERTYPE_MOGA) { - mControllerMoga = controllerDelegate; - } - else if (driveType == DRIVERTYPE_OUYA) { - mControllerOuya = controllerDelegate; - } - controllerDelegate.setControllerEventListener(mControllerEventListener); - controllerDelegate.onCreate(sGameControllerActivity); - } - - public GameControllerDelegate getGameControllerDelegate(int driveType){ - if (driveType == DRIVERTYPE_NIBIRU) { - return mControllerNibiru; - }else if (driveType == DRIVERTYPE_MOGA) { - return mControllerMoga; - } - else if (driveType == DRIVERTYPE_OUYA) { - return mControllerOuya; - } - - return null; - } - - ControllerEventListener mControllerEventListener = new ControllerEventListener() { - - @Override - public void onButtonEvent(String vendorName, int controller, int button, - boolean isPressed, float value, boolean isAnalog) { - GameControllerAdapter.onButtonEvent(vendorName, controller, button, isPressed, value, isAnalog); - } - - @Override - public void onAxisEvent(String vendorName, int controller, int axisID, - float value, boolean isAnalog) { - GameControllerAdapter.onAxisEvent(vendorName, controller, axisID, value, isAnalog); - } + public static final int DRIVERTYPE_NIBIRU = 0; + public static final int DRIVERTYPE_MOGA = 1; + public static final int DRIVERTYPE_OUYA = 2; + public static final int DRIVERTYPE_STANDARD = 3; + public static final int DRIVERTYPE_UNKNOWN = 4; + + // =========================================================== + // Fields + // =========================================================== + private static GameControllerActivity sGameControllerActivity; + private InputManagerCompat mInputManager = null; + + protected GameControllerHelper mControllerHelper = null; + + protected GameControllerDelegate mControllerNibiru = null; + protected GameControllerDelegate mControllerMoga = null; + protected GameControllerDelegate mControllerOuya = null; + + public void connectController(int driveType){ + try { + + ClassLoader loader = sGameControllerActivity.getClassLoader(); + Class controllerDelegate = null; + if (driveType == DRIVERTYPE_MOGA) { + if (mControllerMoga != null) { + return; + } + controllerDelegate = loader.loadClass("org.cocos2dx.lib.GameControllerMoga"); + } else if (driveType == DRIVERTYPE_NIBIRU) { + if (mControllerNibiru != null) { + mControllerNibiru.onCreate(sGameControllerActivity); + mControllerNibiru.onResume(); + return; + } + controllerDelegate = loader.loadClass("org.cocos2dx.lib.GameControllerNibiru"); + } else if (driveType == DRIVERTYPE_OUYA) { + if (mControllerOuya != null) { + return; + } + controllerDelegate = loader.loadClass("org.cocos2dx.lib.GameControllerOuya"); + } + + GameControllerDelegate instance = (GameControllerDelegate)controllerDelegate.newInstance(); + sGameControllerActivity.setGameControllerInstance(instance, driveType); + + if (driveType == DRIVERTYPE_NIBIRU) { + Method method = controllerDelegate.getDeclaredMethod("onResume"); + method.invoke(instance); + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public void setGameControllerInstance(GameControllerDelegate controllerDelegate, int driveType) { + if (driveType == DRIVERTYPE_NIBIRU) { + mControllerNibiru = controllerDelegate; + }else if (driveType == DRIVERTYPE_MOGA) { + mControllerMoga = controllerDelegate; + } + else if (driveType == DRIVERTYPE_OUYA) { + mControllerOuya = controllerDelegate; + } + controllerDelegate.setControllerEventListener(mControllerEventListener); + controllerDelegate.onCreate(sGameControllerActivity); + } + + public GameControllerDelegate getGameControllerDelegate(int driveType){ + if (driveType == DRIVERTYPE_NIBIRU) { + return mControllerNibiru; + }else if (driveType == DRIVERTYPE_MOGA) { + return mControllerMoga; + } + else if (driveType == DRIVERTYPE_OUYA) { + return mControllerOuya; + } + + return null; + } + + ControllerEventListener mControllerEventListener = new ControllerEventListener() { + + @Override + public void onButtonEvent(String vendorName, int controller, int button, + boolean isPressed, float value, boolean isAnalog) { + GameControllerAdapter.onButtonEvent(vendorName, controller, button, isPressed, value, isAnalog); + } + + @Override + public void onAxisEvent(String vendorName, int controller, int axisID, + float value, boolean isAnalog) { + GameControllerAdapter.onAxisEvent(vendorName, controller, axisID, value, isAnalog); + } - @Override - public void onConnected(String vendorName, int controller) { - GameControllerAdapter.onConnected(vendorName, controller); - } + @Override + public void onConnected(String vendorName, int controller) { + GameControllerAdapter.onConnected(vendorName, controller); + } - @Override - public void onDisconnected(String vendorName, int controller) { - GameControllerAdapter.onDisconnected(vendorName, controller); - } - }; - - // =========================================================== - // Constructors - // =========================================================== - - @Override - protected void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - sGameControllerActivity = this; - mInputManager = InputManagerCompat.Factory.getInputManager(this); - mInputManager.registerInputDeviceListener(this, null); - - if (mControllerNibiru != null) { - mControllerNibiru.onCreate(this); - } - if (mControllerMoga != null) { - mControllerMoga.onCreate(this); - } - if (mControllerOuya != null) { - mControllerOuya.onCreate(this); - } - if (mControllerHelper == null) { - mControllerHelper = new GameControllerHelper(this); - } - } - - // =========================================================== - // Getter & Setter - // =========================================================== + @Override + public void onDisconnected(String vendorName, int controller) { + GameControllerAdapter.onDisconnected(vendorName, controller); + } + }; + + // =========================================================== + // Constructors + // =========================================================== + + @Override + protected void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + sGameControllerActivity = this; + mInputManager = InputManagerCompat.Factory.getInputManager(this); + mInputManager.registerInputDeviceListener(this, null); + + if (mControllerNibiru != null) { + mControllerNibiru.onCreate(this); + } + if (mControllerMoga != null) { + mControllerMoga.onCreate(this); + } + if (mControllerOuya != null) { + mControllerOuya.onCreate(this); + } + if (mControllerHelper == null) { + mControllerHelper = new GameControllerHelper(this); + } + } + + // =========================================================== + // Getter & Setter + // =========================================================== - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - boolean handled = false; - if (mControllerNibiru != null) { - handled |= mControllerNibiru.dispatchKeyEvent(event); - } - if (handled == false && mControllerMoga != null) { - handled |= mControllerMoga.dispatchKeyEvent(event); - } - if (handled == false && mControllerOuya != null) { - handled |= mControllerOuya.dispatchKeyEvent(event); - } - - if (handled == false) { - handled |= mControllerHelper.dispatchKeyEvent(event); - } - - return handled || super.dispatchKeyEvent(event); - } - - @Override - public boolean dispatchGenericMotionEvent(MotionEvent event) { - boolean handled = false; - if (mControllerNibiru != null) { - handled |= mControllerNibiru.dispatchGenericMotionEvent(event); - } - if (handled == false && mControllerMoga != null) { - handled |= mControllerMoga.dispatchGenericMotionEvent(event); - } - if (handled == false && mControllerOuya != null) { - handled |= mControllerOuya.dispatchGenericMotionEvent(event); - } - - if (handled == false) { - handled |= mControllerHelper.dispatchGenericMotionEvent(event); - } - - return handled || super.dispatchGenericMotionEvent(event); - } - - @Override - public void onInputDeviceAdded(int deviceId) { - Log.d(TAG,"onInputDeviceAdded:" + deviceId); - - mControllerHelper.onInputDeviceAdded(deviceId); - } - /* - * This is an unusual case. Input devices don't typically change, but they - * certainly can --- for example a device may have different modes. We use - * this to make sure that the ship has an up-to-date InputDevice. - * - * @see - * com.example.inputmanagercompat.InputManagerCompat.InputDeviceListener - * #onInputDeviceChanged(int) - */ - @Override - public void onInputDeviceChanged(int deviceId) { - Log.w(TAG,"onInputDeviceChanged:" + deviceId); - } - - /* - * Remove any ship associated with the ID. - * - * @see - * com.example.inputmanagercompat.InputManagerCompat.InputDeviceListener - * #onInputDeviceRemoved(int) - */ - @Override - public void onInputDeviceRemoved(int deviceId) { - Log.d(TAG,"onInputDeviceRemoved:" + deviceId); - - mControllerHelper.onInputDeviceRemoved(deviceId); - } + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + boolean handled = false; + if (mControllerNibiru != null) { + handled |= mControllerNibiru.dispatchKeyEvent(event); + } + if (handled == false && mControllerMoga != null) { + handled |= mControllerMoga.dispatchKeyEvent(event); + } + if (handled == false && mControllerOuya != null) { + handled |= mControllerOuya.dispatchKeyEvent(event); + } + + if (handled == false) { + handled |= mControllerHelper.dispatchKeyEvent(event); + } + + return handled || super.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) { + boolean handled = false; + if (mControllerNibiru != null) { + handled |= mControllerNibiru.dispatchGenericMotionEvent(event); + } + if (handled == false && mControllerMoga != null) { + handled |= mControllerMoga.dispatchGenericMotionEvent(event); + } + if (handled == false && mControllerOuya != null) { + handled |= mControllerOuya.dispatchGenericMotionEvent(event); + } + + if (handled == false) { + handled |= mControllerHelper.dispatchGenericMotionEvent(event); + } + + return handled || super.dispatchGenericMotionEvent(event); + } + + @Override + public void onInputDeviceAdded(int deviceId) { + Log.d(TAG,"onInputDeviceAdded:" + deviceId); + + mControllerHelper.onInputDeviceAdded(deviceId); + } + /* + * This is an unusual case. Input devices don't typically change, but they + * certainly can --- for example a device may have different modes. We use + * this to make sure that the ship has an up-to-date InputDevice. + * + * @see + * com.example.inputmanagercompat.InputManagerCompat.InputDeviceListener + * #onInputDeviceChanged(int) + */ + @Override + public void onInputDeviceChanged(int deviceId) { + Log.w(TAG,"onInputDeviceChanged:" + deviceId); + } + + /* + * Remove any ship associated with the ID. + * + * @see + * com.example.inputmanagercompat.InputManagerCompat.InputDeviceListener + * #onInputDeviceRemoved(int) + */ + @Override + public void onInputDeviceRemoved(int deviceId) { + Log.d(TAG,"onInputDeviceRemoved:" + deviceId); + + mControllerHelper.onInputDeviceRemoved(deviceId); + } - @Override - protected void onResume() { - super.onResume(); - - if (mControllerNibiru != null) { - mControllerNibiru.onResume(); - } - if (mControllerMoga != null) { - mControllerMoga.onResume(); - } - if (mControllerOuya != null) { - mControllerOuya.onResume(); - } - - GameControllerHelper.gatherControllers(mControllerHelper.mGameController); - } - - @Override - protected void onPause() { - if (mControllerNibiru != null) { - mControllerNibiru.onPause(); - } - if (mControllerMoga != null) { - mControllerMoga.onPause(); - } - if (mControllerOuya != null) { - mControllerOuya.onPause(); - } - - super.onPause(); - } - - @Override - protected void onDestroy() { - if (mControllerNibiru != null) { - mControllerNibiru.onDestroy(); - } - if (mControllerMoga != null) { - mControllerMoga.onDestroy(); - } - if (mControllerOuya != null) { - mControllerOuya.onDestroy(); - } - - super.onDestroy(); - } + @Override + protected void onResume() { + super.onResume(); + + if (mControllerNibiru != null) { + mControllerNibiru.onResume(); + } + if (mControllerMoga != null) { + mControllerMoga.onResume(); + } + if (mControllerOuya != null) { + mControllerOuya.onResume(); + } + + GameControllerHelper.gatherControllers(mControllerHelper.mGameController); + } + + @Override + protected void onPause() { + if (mControllerNibiru != null) { + mControllerNibiru.onPause(); + } + if (mControllerMoga != null) { + mControllerMoga.onPause(); + } + if (mControllerOuya != null) { + mControllerOuya.onPause(); + } + + super.onPause(); + } + + @Override + protected void onDestroy() { + if (mControllerNibiru != null) { + mControllerNibiru.onDestroy(); + } + if (mControllerMoga != null) { + mControllerMoga.onDestroy(); + } + if (mControllerOuya != null) { + mControllerOuya.onDestroy(); + } + + super.onDestroy(); + } } \ No newline at end of file diff --git a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerHelper.java b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerHelper.java index f1cec07d11..0a4ce8b822 100644 --- a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerHelper.java +++ b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerHelper.java @@ -10,248 +10,248 @@ import android.view.MotionEvent; public class GameControllerHelper { - public static final String StandardControllerName = "Standard"; - - SparseIntArray ControllerKeyMap; - - private static final int AXIS_X = 0; - private static final int AXIS_Y = 1; - private static final int AXIS_Z = 11; - private static final int AXIS_RZ = 14; - private static final int AXIS_LTRIGGER = 17; - private static final int AXIS_RTRIGGER = 18; - public static final int AXIS_GAS = 22; - private static final int AXIS_BRAKE = 23; - private static final int AXIS_THROTTLE = 19; - - public GameControllerHelper(GameControllerActivity activity){ - - ControllerKeyMap = new SparseIntArray(25); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_A, GameControllerDelegate.BUTTON_A); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_B, GameControllerDelegate.BUTTON_B); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_C, GameControllerDelegate.BUTTON_C); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_X, GameControllerDelegate.BUTTON_X); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_Y, GameControllerDelegate.BUTTON_Y); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_Z, GameControllerDelegate.BUTTON_Z); - - ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_UP, GameControllerDelegate.BUTTON_DPAD_UP); - ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_DOWN, GameControllerDelegate.BUTTON_DPAD_DOWN); - ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_LEFT, GameControllerDelegate.BUTTON_DPAD_LEFT); - ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, GameControllerDelegate.BUTTON_DPAD_RIGHT); - ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_CENTER, GameControllerDelegate.BUTTON_DPAD_CENTER); - - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_THUMBL, GameControllerDelegate.BUTTON_LEFT_THUMBSTICK); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_THUMBR, GameControllerDelegate.BUTTON_RIGHT_THUMBSTICK); - - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_L1, GameControllerDelegate.BUTTON_LEFT_SHOULDER); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_R1, GameControllerDelegate.BUTTON_RIGHT_SHOULDER); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_L2, GameControllerDelegate.BUTTON_LEFT_TRIGGER); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_R2, GameControllerDelegate.BUTTON_RIGHT_TRIGGER); - - ControllerKeyMap.put(AXIS_X, GameControllerDelegate.THUMBSTICK_LEFT_X); - ControllerKeyMap.put(AXIS_Y, GameControllerDelegate.THUMBSTICK_LEFT_Y); - ControllerKeyMap.put(AXIS_Z, GameControllerDelegate.THUMBSTICK_RIGHT_X); - ControllerKeyMap.put(AXIS_RZ, GameControllerDelegate.THUMBSTICK_RIGHT_Y); - - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_START, GameControllerDelegate.BUTTON_START); - ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_SELECT, GameControllerDelegate.BUTTON_SELECT); - } - - private float mOldLeftThumbstickX = 0.0f; - private float mOldLeftThumbstickY = 0.0f; - private float mOldRightThumbstickX = 0.0f; - private float mOldRightThumbstickY = 0.0f; - - private float mOldLeftTrigger = 0.0f; - private float mOldRightTrigger = 0.0f; - private float mOldThrottle = 0.0f; - private float mOldBrake = 0.0f; - private float mOldGas = 0.0f; - - public boolean dispatchGenericMotionEvent(MotionEvent event) { - boolean handled = false; - - int eventSource = event.getSource(); - + public static final String StandardControllerName = "Standard"; + + SparseIntArray ControllerKeyMap; + + private static final int AXIS_X = 0; + private static final int AXIS_Y = 1; + private static final int AXIS_Z = 11; + private static final int AXIS_RZ = 14; + private static final int AXIS_LTRIGGER = 17; + private static final int AXIS_RTRIGGER = 18; + public static final int AXIS_GAS = 22; + private static final int AXIS_BRAKE = 23; + private static final int AXIS_THROTTLE = 19; + + public GameControllerHelper(GameControllerActivity activity){ + + ControllerKeyMap = new SparseIntArray(25); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_A, GameControllerDelegate.BUTTON_A); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_B, GameControllerDelegate.BUTTON_B); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_C, GameControllerDelegate.BUTTON_C); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_X, GameControllerDelegate.BUTTON_X); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_Y, GameControllerDelegate.BUTTON_Y); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_Z, GameControllerDelegate.BUTTON_Z); + + ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_UP, GameControllerDelegate.BUTTON_DPAD_UP); + ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_DOWN, GameControllerDelegate.BUTTON_DPAD_DOWN); + ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_LEFT, GameControllerDelegate.BUTTON_DPAD_LEFT); + ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, GameControllerDelegate.BUTTON_DPAD_RIGHT); + ControllerKeyMap.put(KeyEvent.KEYCODE_DPAD_CENTER, GameControllerDelegate.BUTTON_DPAD_CENTER); + + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_THUMBL, GameControllerDelegate.BUTTON_LEFT_THUMBSTICK); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_THUMBR, GameControllerDelegate.BUTTON_RIGHT_THUMBSTICK); + + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_L1, GameControllerDelegate.BUTTON_LEFT_SHOULDER); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_R1, GameControllerDelegate.BUTTON_RIGHT_SHOULDER); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_L2, GameControllerDelegate.BUTTON_LEFT_TRIGGER); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_R2, GameControllerDelegate.BUTTON_RIGHT_TRIGGER); + + ControllerKeyMap.put(AXIS_X, GameControllerDelegate.THUMBSTICK_LEFT_X); + ControllerKeyMap.put(AXIS_Y, GameControllerDelegate.THUMBSTICK_LEFT_Y); + ControllerKeyMap.put(AXIS_Z, GameControllerDelegate.THUMBSTICK_RIGHT_X); + ControllerKeyMap.put(AXIS_RZ, GameControllerDelegate.THUMBSTICK_RIGHT_Y); + + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_START, GameControllerDelegate.BUTTON_START); + ControllerKeyMap.put(KeyEvent.KEYCODE_BUTTON_SELECT, GameControllerDelegate.BUTTON_SELECT); + } + + private float mOldLeftThumbstickX = 0.0f; + private float mOldLeftThumbstickY = 0.0f; + private float mOldRightThumbstickX = 0.0f; + private float mOldRightThumbstickY = 0.0f; + + private float mOldLeftTrigger = 0.0f; + private float mOldRightTrigger = 0.0f; + private float mOldThrottle = 0.0f; + private float mOldBrake = 0.0f; + private float mOldGas = 0.0f; + + public boolean dispatchGenericMotionEvent(MotionEvent event) { + boolean handled = false; + + int eventSource = event.getSource(); + if ( ((eventSource & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) - || ((eventSource & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) ) - { - if (event.getAction() == MotionEvent.ACTION_MOVE) { - int deviceId = event.getDeviceId(); - String deviceName = event.getDevice().getName(); - if(mGameController.get(deviceId) == null){ - gatherControllers(mGameController); - mGameController.append(deviceId, deviceName); - } - - float newAXIS_LX = event.getAxisValue(AXIS_X); - if (Float.compare(newAXIS_LX , mOldLeftThumbstickX) != 0) { - GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_X, newAXIS_LX, true); - mOldLeftThumbstickX = newAXIS_LX; - handled = true; - } - - float newAXIS_LY = event.getAxisValue(AXIS_Y); - if (Float.compare(newAXIS_LY , mOldLeftThumbstickY) != 0) { - GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_Y, newAXIS_LY, true); - mOldLeftThumbstickY = newAXIS_LY; - handled = true; - } - - float newAXIS_RX = event.getAxisValue(AXIS_Z); - if (Float.compare(newAXIS_RX , mOldRightThumbstickX) != 0) { - GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_X, newAXIS_RX, true); - mOldRightThumbstickX = newAXIS_RX; - handled = true; - } - - float newAXIS_RY = event.getAxisValue(AXIS_RZ); - if (Float.compare(newAXIS_RY , mOldRightThumbstickY) != 0) { - GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_Y, newAXIS_RY, true); - mOldRightThumbstickY = newAXIS_RY; - handled = true; - } - - float newAXIS_LTRIGGER = event.getAxisValue(AXIS_LTRIGGER); - if (Float.compare(newAXIS_LTRIGGER , mOldLeftTrigger) != 0) { - GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_LEFT_TRIGGER, newAXIS_LTRIGGER, true); - mOldLeftTrigger = newAXIS_LTRIGGER; - handled = true; - } - - float newAXIS_RTRIGGER = event.getAxisValue(AXIS_RTRIGGER); - if (Float.compare(newAXIS_RTRIGGER , mOldRightTrigger) != 0) { - GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_RIGHT_TRIGGER, newAXIS_RTRIGGER, true); - mOldRightTrigger = newAXIS_RTRIGGER; - handled = true; - } - - float newAXIS_BRAKE = event.getAxisValue(AXIS_BRAKE); - if (Float.compare(newAXIS_BRAKE , mOldBrake) != 0) { - GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_LEFT_TRIGGER, newAXIS_BRAKE, true); - mOldBrake = newAXIS_BRAKE; - handled = true; - } - - float newAXIS_THROTTLE = event.getAxisValue(AXIS_THROTTLE); - if (Float.compare(newAXIS_THROTTLE , mOldThrottle) != 0) { - GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_RIGHT_TRIGGER, newAXIS_THROTTLE, true); - mOldThrottle = newAXIS_THROTTLE; - handled = true; - } - - float newAXIS_GAS = event.getAxisValue(AXIS_GAS); - if (Float.compare(newAXIS_GAS , mOldGas) != 0) { - GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_RIGHT_TRIGGER, newAXIS_GAS, true); - mOldGas = newAXIS_GAS; - handled = true; - } - } + || ((eventSource & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) ) + { + if (event.getAction() == MotionEvent.ACTION_MOVE) { + int deviceId = event.getDeviceId(); + String deviceName = event.getDevice().getName(); + if(mGameController.get(deviceId) == null){ + gatherControllers(mGameController); + mGameController.append(deviceId, deviceName); + } + + float newAXIS_LX = event.getAxisValue(AXIS_X); + if (Float.compare(newAXIS_LX , mOldLeftThumbstickX) != 0) { + GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_X, newAXIS_LX, true); + mOldLeftThumbstickX = newAXIS_LX; + handled = true; + } + + float newAXIS_LY = event.getAxisValue(AXIS_Y); + if (Float.compare(newAXIS_LY , mOldLeftThumbstickY) != 0) { + GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_Y, newAXIS_LY, true); + mOldLeftThumbstickY = newAXIS_LY; + handled = true; + } + + float newAXIS_RX = event.getAxisValue(AXIS_Z); + if (Float.compare(newAXIS_RX , mOldRightThumbstickX) != 0) { + GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_X, newAXIS_RX, true); + mOldRightThumbstickX = newAXIS_RX; + handled = true; + } + + float newAXIS_RY = event.getAxisValue(AXIS_RZ); + if (Float.compare(newAXIS_RY , mOldRightThumbstickY) != 0) { + GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_Y, newAXIS_RY, true); + mOldRightThumbstickY = newAXIS_RY; + handled = true; + } + + float newAXIS_LTRIGGER = event.getAxisValue(AXIS_LTRIGGER); + if (Float.compare(newAXIS_LTRIGGER , mOldLeftTrigger) != 0) { + GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_LEFT_TRIGGER, newAXIS_LTRIGGER, true); + mOldLeftTrigger = newAXIS_LTRIGGER; + handled = true; + } + + float newAXIS_RTRIGGER = event.getAxisValue(AXIS_RTRIGGER); + if (Float.compare(newAXIS_RTRIGGER , mOldRightTrigger) != 0) { + GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_RIGHT_TRIGGER, newAXIS_RTRIGGER, true); + mOldRightTrigger = newAXIS_RTRIGGER; + handled = true; + } + + float newAXIS_BRAKE = event.getAxisValue(AXIS_BRAKE); + if (Float.compare(newAXIS_BRAKE , mOldBrake) != 0) { + GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_LEFT_TRIGGER, newAXIS_BRAKE, true); + mOldBrake = newAXIS_BRAKE; + handled = true; + } + + float newAXIS_THROTTLE = event.getAxisValue(AXIS_THROTTLE); + if (Float.compare(newAXIS_THROTTLE , mOldThrottle) != 0) { + GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_RIGHT_TRIGGER, newAXIS_THROTTLE, true); + mOldThrottle = newAXIS_THROTTLE; + handled = true; + } + + float newAXIS_GAS = event.getAxisValue(AXIS_GAS); + if (Float.compare(newAXIS_GAS , mOldGas) != 0) { + GameControllerAdapter.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_RIGHT_TRIGGER, newAXIS_GAS, true); + mOldGas = newAXIS_GAS; + handled = true; + } + } } - return handled; - } - - private static SparseArray> mControllerExtendKey = new SparseArray>(); - - public boolean dispatchKeyEvent(KeyEvent event) { - boolean handled = false; - - int eventSource = event.getSource(); - int keyCode = event.getKeyCode(); - int controllerKey = ControllerKeyMap.get(keyCode); - - if (((eventSource & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) - || ((eventSource & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) ) - { - int deviceId = event.getDeviceId(); - String deviceName = event.getDevice().getName(); - - if(mGameController.get(deviceId) == null){ - gatherControllers(mGameController); - mGameController.append(deviceId, deviceName); - } - - if (controllerKey == 0) { - if (mControllerExtendKey.get(deviceId) != null && mControllerExtendKey.get(deviceId).contains(keyCode)) { - controllerKey = keyCode; - }else { - return false; - } - } - - int action = event.getAction(); - if (action == KeyEvent.ACTION_DOWN) { - handled = true; - GameControllerAdapter.onButtonEvent(deviceName, deviceId, controllerKey,true, 1.0f, false); - }else if (action == KeyEvent.ACTION_UP) { - handled = true; - GameControllerAdapter.onButtonEvent(deviceName, deviceId, controllerKey,false, 0.0f, false); - } - } - - return handled; + return handled; + } + + private static SparseArray> mControllerExtendKey = new SparseArray>(); + + public boolean dispatchKeyEvent(KeyEvent event) { + boolean handled = false; + + int eventSource = event.getSource(); + int keyCode = event.getKeyCode(); + int controllerKey = ControllerKeyMap.get(keyCode); + + if (((eventSource & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) + || ((eventSource & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) ) + { + int deviceId = event.getDeviceId(); + String deviceName = event.getDevice().getName(); + + if(mGameController.get(deviceId) == null){ + gatherControllers(mGameController); + mGameController.append(deviceId, deviceName); + } + + if (controllerKey == 0) { + if (mControllerExtendKey.get(deviceId) != null && mControllerExtendKey.get(deviceId).contains(keyCode)) { + controllerKey = keyCode; + }else { + return false; + } + } + + int action = event.getAction(); + if (action == KeyEvent.ACTION_DOWN) { + handled = true; + GameControllerAdapter.onButtonEvent(deviceName, deviceId, controllerKey,true, 1.0f, false); + }else if (action == KeyEvent.ACTION_UP) { + handled = true; + GameControllerAdapter.onButtonEvent(deviceName, deviceId, controllerKey,false, 0.0f, false); + } + } + + return handled; + } + + public static void receiveExternalKeyEvent(int deviceId,int externalKeyCode,boolean receive) { + if (receive) { + if (mControllerExtendKey.get(deviceId) == null) { + mControllerExtendKey.put(deviceId, new ArrayList()); + } + mControllerExtendKey.get(deviceId).add(externalKeyCode); + } else { + if (mControllerExtendKey.get(deviceId) != null) { + mControllerExtendKey.get(deviceId).remove(Integer.valueOf(externalKeyCode)); + } + } + } + + SparseArray mGameController = new SparseArray(); + + void onInputDeviceAdded(int deviceId){ + try { + InputDevice device = InputDevice.getDevice(deviceId); + int deviceSource = device.getSources(); + + if ( ((deviceSource & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) + || ((deviceSource & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) ) + { + String deviceName = device.getName(); + mGameController.append(deviceId, deviceName); + GameControllerAdapter.onConnected(deviceName, deviceId); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + void onInputDeviceChanged(int deviceId){ + gatherControllers(mGameController); + } + + void onInputDeviceRemoved(int deviceId) { + if (mGameController.get(deviceId) != null) { + GameControllerAdapter.onDisconnected(mGameController.get(deviceId), deviceId); + mGameController.delete(deviceId); + } + } + + static void gatherControllers(SparseArray controllers){ + int controllerCount = controllers.size(); + for (int i = 0; i < controllerCount; i++) { + try { + int controllerDeveceId = controllers.keyAt(i); + InputDevice device = InputDevice.getDevice(controllerDeveceId); + if (device == null) { + GameControllerAdapter.onDisconnected(controllers.get(controllerDeveceId), controllerDeveceId); + controllers.delete(controllerDeveceId); + } + } catch (Exception e) { + int controllerDeveceId = controllers.keyAt(i); + GameControllerAdapter.onDisconnected(controllers.get(controllerDeveceId), controllerDeveceId); + controllers.delete(controllerDeveceId); + e.printStackTrace(); + } + } } - - public static void receiveExternalKeyEvent(int deviceId,int externalKeyCode,boolean receive) { - if (receive) { - if (mControllerExtendKey.get(deviceId) == null) { - mControllerExtendKey.put(deviceId, new ArrayList()); - } - mControllerExtendKey.get(deviceId).add(externalKeyCode); - } else { - if (mControllerExtendKey.get(deviceId) != null) { - mControllerExtendKey.get(deviceId).remove(Integer.valueOf(externalKeyCode)); - } - } - } - - SparseArray mGameController = new SparseArray(); - - void onInputDeviceAdded(int deviceId){ - try { - InputDevice device = InputDevice.getDevice(deviceId); - int deviceSource = device.getSources(); - - if ( ((deviceSource & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) - || ((deviceSource & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) ) - { - String deviceName = device.getName(); - mGameController.append(deviceId, deviceName); - GameControllerAdapter.onConnected(deviceName, deviceId); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - void onInputDeviceChanged(int deviceId){ - gatherControllers(mGameController); - } - - void onInputDeviceRemoved(int deviceId) { - if (mGameController.get(deviceId) != null) { - GameControllerAdapter.onDisconnected(mGameController.get(deviceId), deviceId); - mGameController.delete(deviceId); - } - } - - static void gatherControllers(SparseArray controllers){ - int controllerCount = controllers.size(); - for (int i = 0; i < controllerCount; i++) { - try { - int controllerDeveceId = controllers.keyAt(i); - InputDevice device = InputDevice.getDevice(controllerDeveceId); - if (device == null) { - GameControllerAdapter.onDisconnected(controllers.get(controllerDeveceId), controllerDeveceId); - controllers.delete(controllerDeveceId); - } - } catch (Exception e) { - int controllerDeveceId = controllers.keyAt(i); - GameControllerAdapter.onDisconnected(controllers.get(controllerDeveceId), controllerDeveceId); - controllers.delete(controllerDeveceId); - e.printStackTrace(); - } - } - } } diff --git a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerMoga.java b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerMoga.java index 2fe73a642b..fc11024bbc 100644 --- a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerMoga.java +++ b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerMoga.java @@ -14,205 +14,205 @@ import com.bda.controller.StateEvent; public class GameControllerMoga implements ControllerListener, GameControllerDelegate { - private static final String mVendorName = "Moga"; - - private float mOldLeftThumbstickX = 0.0f; - private float mOldLeftThumbstickY = 0.0f; - private float mOldRightThumbstickX = 0.0f; - private float mOldRightThumbstickY = 0.0f; - - private float mOldLeftTrigger = 0.0f; - private float mOldRightTrigger = 0.0f; + private static final String mVendorName = "Moga"; + + private float mOldLeftThumbstickX = 0.0f; + private float mOldLeftThumbstickY = 0.0f; + private float mOldRightThumbstickX = 0.0f; + private float mOldRightThumbstickY = 0.0f; + + private float mOldLeftTrigger = 0.0f; + private float mOldRightTrigger = 0.0f; - private SparseIntArray mKeyMap = null; + private SparseIntArray mKeyMap = null; - public GameControllerMoga() { - mKeyMap = new SparseIntArray(20); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_A, GameControllerDelegate.BUTTON_A); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_B, GameControllerDelegate.BUTTON_B); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_X, GameControllerDelegate.BUTTON_X); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_Y, GameControllerDelegate.BUTTON_Y); - - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_L1, - GameControllerDelegate.BUTTON_LEFT_SHOULDER); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_R1, - GameControllerDelegate.BUTTON_RIGHT_SHOULDER); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_L2, - GameControllerDelegate.BUTTON_LEFT_TRIGGER); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_R2, - GameControllerDelegate.BUTTON_RIGHT_TRIGGER); - - mKeyMap.put(KeyEvent.KEYCODE_DPAD_UP, - GameControllerDelegate.BUTTON_DPAD_UP); - mKeyMap.put(KeyEvent.KEYCODE_DPAD_DOWN, - GameControllerDelegate.BUTTON_DPAD_DOWN); - mKeyMap.put(KeyEvent.KEYCODE_DPAD_LEFT, - GameControllerDelegate.BUTTON_DPAD_LEFT); - mKeyMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, - GameControllerDelegate.BUTTON_DPAD_RIGHT); - - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_START, - GameControllerDelegate.BUTTON_START); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_SELECT, - GameControllerDelegate.BUTTON_SELECT); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_START, - GameControllerDelegate.BUTTON_START); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_THUMBL, - GameControllerDelegate.BUTTON_LEFT_THUMBSTICK); - mKeyMap.put(KeyEvent.KEYCODE_BUTTON_THUMBR, - GameControllerDelegate.BUTTON_RIGHT_THUMBSTICK); - } - - public void onKeyEvent(KeyEvent event) { - int keycode = event.getKeyCode(); - if (keycode == KeyEvent.KEYCODE_BUTTON_L2 - || keycode == KeyEvent.KEYCODE_BUTTON_R2) { - return; - } - boolean isPressed = event.getAction() == KeyEvent.ACTION_DOWN; - boolean isAnalog = false; + public GameControllerMoga() { + mKeyMap = new SparseIntArray(20); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_A, GameControllerDelegate.BUTTON_A); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_B, GameControllerDelegate.BUTTON_B); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_X, GameControllerDelegate.BUTTON_X); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_Y, GameControllerDelegate.BUTTON_Y); + + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_L1, + GameControllerDelegate.BUTTON_LEFT_SHOULDER); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_R1, + GameControllerDelegate.BUTTON_RIGHT_SHOULDER); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_L2, + GameControllerDelegate.BUTTON_LEFT_TRIGGER); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_R2, + GameControllerDelegate.BUTTON_RIGHT_TRIGGER); + + mKeyMap.put(KeyEvent.KEYCODE_DPAD_UP, + GameControllerDelegate.BUTTON_DPAD_UP); + mKeyMap.put(KeyEvent.KEYCODE_DPAD_DOWN, + GameControllerDelegate.BUTTON_DPAD_DOWN); + mKeyMap.put(KeyEvent.KEYCODE_DPAD_LEFT, + GameControllerDelegate.BUTTON_DPAD_LEFT); + mKeyMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, + GameControllerDelegate.BUTTON_DPAD_RIGHT); + + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_START, + GameControllerDelegate.BUTTON_START); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_SELECT, + GameControllerDelegate.BUTTON_SELECT); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_START, + GameControllerDelegate.BUTTON_START); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_THUMBL, + GameControllerDelegate.BUTTON_LEFT_THUMBSTICK); + mKeyMap.put(KeyEvent.KEYCODE_BUTTON_THUMBR, + GameControllerDelegate.BUTTON_RIGHT_THUMBSTICK); + } + + public void onKeyEvent(KeyEvent event) { + int keycode = event.getKeyCode(); + if (keycode == KeyEvent.KEYCODE_BUTTON_L2 + || keycode == KeyEvent.KEYCODE_BUTTON_R2) { + return; + } + boolean isPressed = event.getAction() == KeyEvent.ACTION_DOWN; + boolean isAnalog = false; - if (keycode == KeyEvent.KEYCODE_BUTTON_THUMBL - || keycode == KeyEvent.KEYCODE_BUTTON_THUMBR) { - isAnalog = true; - } + if (keycode == KeyEvent.KEYCODE_BUTTON_THUMBL + || keycode == KeyEvent.KEYCODE_BUTTON_THUMBR) { + isAnalog = true; + } - if (mKeyMap.get(keycode, Integer.MIN_VALUE) != Integer.MIN_VALUE && mControllerEventListener != null) { - mControllerEventListener.onButtonEvent(mVendorName, - event.getControllerId(), mKeyMap.get(keycode), isPressed, - isPressed ? 1.0f : 0.0f, isAnalog); - } - } + if (mKeyMap.get(keycode, Integer.MIN_VALUE) != Integer.MIN_VALUE && mControllerEventListener != null) { + mControllerEventListener.onButtonEvent(mVendorName, + event.getControllerId(), mKeyMap.get(keycode), isPressed, + isPressed ? 1.0f : 0.0f, isAnalog); + } + } - @Override - public void onMotionEvent(MotionEvent event) { - if (mControllerEventListener == null) { - return; - } - int controllerId = event.getControllerId(); - - float newLeftThumbstickX = event.getAxisValue(MotionEvent.AXIS_X); - if (newLeftThumbstickX != mOldLeftThumbstickX) { - mControllerEventListener.onAxisEvent(mVendorName, - controllerId, - GameControllerDelegate.THUMBSTICK_LEFT_X, - newLeftThumbstickX, true); - mOldLeftThumbstickX = newLeftThumbstickX; - } + @Override + public void onMotionEvent(MotionEvent event) { + if (mControllerEventListener == null) { + return; + } + int controllerId = event.getControllerId(); + + float newLeftThumbstickX = event.getAxisValue(MotionEvent.AXIS_X); + if (newLeftThumbstickX != mOldLeftThumbstickX) { + mControllerEventListener.onAxisEvent(mVendorName, + controllerId, + GameControllerDelegate.THUMBSTICK_LEFT_X, + newLeftThumbstickX, true); + mOldLeftThumbstickX = newLeftThumbstickX; + } - float newLeftThumbstickY = event.getAxisValue(MotionEvent.AXIS_Y); - if (newLeftThumbstickY != mOldLeftThumbstickY) { - mControllerEventListener.onAxisEvent(mVendorName, - controllerId, - GameControllerDelegate.THUMBSTICK_LEFT_Y, - newLeftThumbstickY, true); - mOldLeftThumbstickY = newLeftThumbstickY; - } + float newLeftThumbstickY = event.getAxisValue(MotionEvent.AXIS_Y); + if (newLeftThumbstickY != mOldLeftThumbstickY) { + mControllerEventListener.onAxisEvent(mVendorName, + controllerId, + GameControllerDelegate.THUMBSTICK_LEFT_Y, + newLeftThumbstickY, true); + mOldLeftThumbstickY = newLeftThumbstickY; + } - float newRightThumbstickX = event.getAxisValue(MotionEvent.AXIS_Z); - if (newRightThumbstickX != mOldRightThumbstickX) { - mControllerEventListener.onAxisEvent(mVendorName, - controllerId, - GameControllerDelegate.THUMBSTICK_RIGHT_X, - newRightThumbstickX, true); - mOldRightThumbstickX = newRightThumbstickX; - } + float newRightThumbstickX = event.getAxisValue(MotionEvent.AXIS_Z); + if (newRightThumbstickX != mOldRightThumbstickX) { + mControllerEventListener.onAxisEvent(mVendorName, + controllerId, + GameControllerDelegate.THUMBSTICK_RIGHT_X, + newRightThumbstickX, true); + mOldRightThumbstickX = newRightThumbstickX; + } - float newRightThumbstickY = event.getAxisValue(MotionEvent.AXIS_RZ); - if (newRightThumbstickY != mOldRightThumbstickY) { - mControllerEventListener.onAxisEvent(mVendorName, - controllerId, - GameControllerDelegate.THUMBSTICK_RIGHT_Y, - newRightThumbstickY, true); - mOldRightThumbstickY = newRightThumbstickY; - } - - float newLeftTrigger = event.getAxisValue(MotionEvent.AXIS_LTRIGGER); - if (newLeftTrigger != mOldLeftTrigger) { - mControllerEventListener.onAxisEvent(mVendorName, - controllerId, - GameControllerDelegate.BUTTON_LEFT_TRIGGER, - newLeftTrigger, true); - mOldLeftTrigger = newLeftTrigger; - } - - float newRightTrigger = event.getAxisValue(MotionEvent.AXIS_RTRIGGER); - if (newRightTrigger != mOldRightTrigger) { - mControllerEventListener.onAxisEvent(mVendorName, - controllerId, - GameControllerDelegate.BUTTON_RIGHT_TRIGGER, - newRightTrigger, true); - mOldRightTrigger = newRightTrigger; - } - } + float newRightThumbstickY = event.getAxisValue(MotionEvent.AXIS_RZ); + if (newRightThumbstickY != mOldRightThumbstickY) { + mControllerEventListener.onAxisEvent(mVendorName, + controllerId, + GameControllerDelegate.THUMBSTICK_RIGHT_Y, + newRightThumbstickY, true); + mOldRightThumbstickY = newRightThumbstickY; + } + + float newLeftTrigger = event.getAxisValue(MotionEvent.AXIS_LTRIGGER); + if (newLeftTrigger != mOldLeftTrigger) { + mControllerEventListener.onAxisEvent(mVendorName, + controllerId, + GameControllerDelegate.BUTTON_LEFT_TRIGGER, + newLeftTrigger, true); + mOldLeftTrigger = newLeftTrigger; + } + + float newRightTrigger = event.getAxisValue(MotionEvent.AXIS_RTRIGGER); + if (newRightTrigger != mOldRightTrigger) { + mControllerEventListener.onAxisEvent(mVendorName, + controllerId, + GameControllerDelegate.BUTTON_RIGHT_TRIGGER, + newRightTrigger, true); + mOldRightTrigger = newRightTrigger; + } + } - @Override - public void onStateEvent(StateEvent event) { - if (mControllerEventListener != null) { - switch (event.getState()) { - case StateEvent.STATE_CONNECTION: - switch (event.getAction()) { - case StateEvent.ACTION_DISCONNECTED: - // disconnected from controller - mControllerEventListener.onDisconnected(mVendorName, - event.getControllerId()); - break; - case StateEvent.ACTION_CONNECTED: - // connected to controller - mControllerEventListener.onConnected(mVendorName, - event.getControllerId()); - break; - case StateEvent.ACTION_CONNECTING: - // attempting to connect to controller - break; - } - break; - case StateEvent.STATE_POWER_LOW: - if (event.getAction() == StateEvent.ACTION_TRUE) { - // controller has entered low power state - } else { - // controller has entered normal power state - } - break; - } - } - } + @Override + public void onStateEvent(StateEvent event) { + if (mControllerEventListener != null) { + switch (event.getState()) { + case StateEvent.STATE_CONNECTION: + switch (event.getAction()) { + case StateEvent.ACTION_DISCONNECTED: + // disconnected from controller + mControllerEventListener.onDisconnected(mVendorName, + event.getControllerId()); + break; + case StateEvent.ACTION_CONNECTED: + // connected to controller + mControllerEventListener.onConnected(mVendorName, + event.getControllerId()); + break; + case StateEvent.ACTION_CONNECTING: + // attempting to connect to controller + break; + } + break; + case StateEvent.STATE_POWER_LOW: + if (event.getAction() == StateEvent.ACTION_TRUE) { + // controller has entered low power state + } else { + // controller has entered normal power state + } + break; + } + } + } - private Controller mController = null; + private Controller mController = null; - public void onCreate(Context context) { - mController = Controller.getInstance(context); - - mController.init(); - mController.setListener(this, new Handler()); - } + public void onCreate(Context context) { + mController = Controller.getInstance(context); + + mController.init(); + mController.setListener(this, new Handler()); + } - public void onPause() { - mController.onPause(); - } + public void onPause() { + mController.onPause(); + } - public void onResume() { - mController.onResume(); - } + public void onResume() { + mController.onResume(); + } - public void onDestroy() { - mController.exit(); - } - - private ControllerEventListener mControllerEventListener; - @Override - public void setControllerEventListener(ControllerEventListener listener) { - mControllerEventListener = listener; - } + public void onDestroy() { + mController.exit(); + } + + private ControllerEventListener mControllerEventListener; + @Override + public void setControllerEventListener(ControllerEventListener listener) { + mControllerEventListener = listener; + } - @Override - public boolean dispatchKeyEvent(android.view.KeyEvent event) { - return false; - } + @Override + public boolean dispatchKeyEvent(android.view.KeyEvent event) { + return false; + } - @Override - public boolean dispatchGenericMotionEvent(android.view.MotionEvent event) { - return false; - } + @Override + public boolean dispatchGenericMotionEvent(android.view.MotionEvent event) { + return false; + } } diff --git a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerNibiru.java b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerNibiru.java index fda6eec8e4..a1e60a5d21 100644 --- a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerNibiru.java +++ b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerNibiru.java @@ -26,16 +26,16 @@ import android.view.MotionEvent; public class GameControllerNibiru implements OnControllerSeviceListener, OnKeyListener, OnSimpleStickListener, OnAccListener, OnGyroListener, OnStateListener, GameControllerDelegate { - private static final String TAG = "NibiruTag"; - - private Context mContext; - private SparseIntArray mKeyMap; - private ControllerEventListener mControllerEventListener = null; - private ControllerService mControllerService = null; - - public GameControllerNibiru() { - mKeyMap = new SparseIntArray(20); - + private static final String TAG = "NibiruTag"; + + private Context mContext; + private SparseIntArray mKeyMap; + private ControllerEventListener mControllerEventListener = null; + private ControllerService mControllerService = null; + + public GameControllerNibiru() { + mKeyMap = new SparseIntArray(20); + mKeyMap.put(ControllerKeyEvent.KEYCODE_BUTTON_A , GameControllerDelegate.BUTTON_A); mKeyMap.put(ControllerKeyEvent.KEYCODE_BUTTON_B , GameControllerDelegate.BUTTON_B); mKeyMap.put(ControllerKeyEvent.KEYCODE_BUTTON_X , GameControllerDelegate.BUTTON_X); @@ -52,188 +52,188 @@ OnSimpleStickListener, OnAccListener, OnGyroListener, OnStateListener, GameContr mKeyMap.put(ControllerKeyEvent.KEYCODE_BUTTON_SELECT , GameControllerDelegate.BUTTON_SELECT); mKeyMap.put(ControllerKeyEvent.KEYCODE_BUTTON_THUMBL , GameControllerDelegate.BUTTON_LEFT_THUMBSTICK); mKeyMap.put(ControllerKeyEvent.KEYCODE_BUTTON_THUMBR , GameControllerDelegate.BUTTON_RIGHT_THUMBSTICK); - } - - @Override - public void setControllerEventListener(ControllerEventListener listener) { - mControllerEventListener = listener; - } - - public void onCreate(Context context) { - mContext = context; - - mControllerService = Controller.getControllerService(context); - if (mControllerService != null) { - mControllerService.setControllerServiceListener(this); - mControllerService.setStateListener(this); - mControllerService.setKeyListener(this); - mControllerService.setSimpleStickListener(this); - //mControllerService.setAccListener(this); - //mControllerService.setGyroListener(this); - mControllerService.setEnableL2R2(true); - mControllerService.setAutoKeyUpMode(false); - - mControllerService.checkNibiruInstall(mContext, false); - } - } - - public void onPause() { - if (mControllerService != null) { - mControllerService.setEnable(false); - } - } - - public void onResume() { - if (mControllerService != null) { - if (mControllerService.isServiceEnable()) { - //onControllerServiceReady(true); - } else { - if (mControllerService.checkNibiruInstall(mContext, false)) { - try { - mControllerService.register(mContext); - } catch (ControllerServiceException e) { - e.printStackTrace(); - } - } - } - - mControllerService.setEnable(true); - } - } - - public void onDestroy() { - if( mControllerService != null ){ - mControllerService.unregister(); - } - } + } + + @Override + public void setControllerEventListener(ControllerEventListener listener) { + mControllerEventListener = listener; + } + + public void onCreate(Context context) { + mContext = context; + + mControllerService = Controller.getControllerService(context); + if (mControllerService != null) { + mControllerService.setControllerServiceListener(this); + mControllerService.setStateListener(this); + mControllerService.setKeyListener(this); + mControllerService.setSimpleStickListener(this); + //mControllerService.setAccListener(this); + //mControllerService.setGyroListener(this); + mControllerService.setEnableL2R2(true); + mControllerService.setAutoKeyUpMode(false); + + mControllerService.checkNibiruInstall(mContext, false); + } + } + + public void onPause() { + if (mControllerService != null) { + mControllerService.setEnable(false); + } + } + + public void onResume() { + if (mControllerService != null) { + if (mControllerService.isServiceEnable()) { + //onControllerServiceReady(true); + } else { + if (mControllerService.checkNibiruInstall(mContext, false)) { + try { + mControllerService.register(mContext); + } catch (ControllerServiceException e) { + e.printStackTrace(); + } + } + } + + mControllerService.setEnable(true); + } + } + + public void onDestroy() { + if( mControllerService != null ){ + mControllerService.unregister(); + } + } - @Override - public void onControllerServiceReady(boolean isSucc) { - if( isSucc ) - { - if( !mControllerService.hasDeviceConnected() ){ - Bundle bun = new Bundle(); - bun.putBoolean(ControllerService.FLAG_IS_SHOW_GAMEPAD_TIP, false); - /*try { - mControllerService.showDeviceManagerUI(mContext, bun); - } catch (ControllerServiceException e) { - e.printStackTrace(); - }*/ - } - } - } + @Override + public void onControllerServiceReady(boolean isSucc) { + if( isSucc ) + { + if( !mControllerService.hasDeviceConnected() ){ + Bundle bun = new Bundle(); + bun.putBoolean(ControllerService.FLAG_IS_SHOW_GAMEPAD_TIP, false); + /*try { + mControllerService.showDeviceManagerUI(mContext, bun); + } catch (ControllerServiceException e) { + e.printStackTrace(); + }*/ + } + } + } - @Override - public void onControllerKeyDown(int playerOrder, int keyCode, ControllerKeyEvent event) { - if (mKeyMap.get(keyCode) == 0) { - Log.e(TAG, "Didn't map the key: " + keyCode); - return; - } - - if (mControllerEventListener != null) { - try { - ControllerDevice controllerDevice = mControllerService.getDeviceByPlayerOrder(playerOrder); - - mControllerEventListener.onButtonEvent(controllerDevice.getDeviceName(), controllerDevice.getDeviceId(), - mKeyMap.get(keyCode), true, 1.0f, false); - } catch (ControllerServiceException e) { - e.printStackTrace(); - } - } - } + @Override + public void onControllerKeyDown(int playerOrder, int keyCode, ControllerKeyEvent event) { + if (mKeyMap.get(keyCode) == 0) { + Log.e(TAG, "Didn't map the key: " + keyCode); + return; + } + + if (mControllerEventListener != null) { + try { + ControllerDevice controllerDevice = mControllerService.getDeviceByPlayerOrder(playerOrder); + + mControllerEventListener.onButtonEvent(controllerDevice.getDeviceName(), controllerDevice.getDeviceId(), + mKeyMap.get(keyCode), true, 1.0f, false); + } catch (ControllerServiceException e) { + e.printStackTrace(); + } + } + } - @Override - public void onControllerKeyUp(int playerOrder, int keyCode, ControllerKeyEvent event) { - if (mKeyMap.get(keyCode) == 0) { - Log.e(TAG, "Didn't map the key: " + keyCode); - return; - } - - if (mControllerEventListener != null) { - try { - ControllerDevice controllerDevice = mControllerService.getDeviceByPlayerOrder(playerOrder); - - mControllerEventListener.onButtonEvent(controllerDevice.getDeviceName(), controllerDevice.getDeviceId(), - mKeyMap.get(keyCode), false, 0.0f, false); - } catch (ControllerServiceException e) { - e.printStackTrace(); - } - } - } + @Override + public void onControllerKeyUp(int playerOrder, int keyCode, ControllerKeyEvent event) { + if (mKeyMap.get(keyCode) == 0) { + Log.e(TAG, "Didn't map the key: " + keyCode); + return; + } + + if (mControllerEventListener != null) { + try { + ControllerDevice controllerDevice = mControllerService.getDeviceByPlayerOrder(playerOrder); + + mControllerEventListener.onButtonEvent(controllerDevice.getDeviceName(), controllerDevice.getDeviceId(), + mKeyMap.get(keyCode), false, 0.0f, false); + } catch (ControllerServiceException e) { + e.printStackTrace(); + } + } + } - @Override - public void onLeftStickChanged(int playerOrder, float x, float y) { - if (mControllerEventListener != null) { - try { - ControllerDevice controllerDevice = mControllerService.getDeviceByPlayerOrder(playerOrder); - - String deviceName = controllerDevice.getDeviceName(); - int deviceId = controllerDevice.getDeviceId(); - - mControllerEventListener.onAxisEvent(deviceName, deviceId, - GameControllerDelegate.THUMBSTICK_LEFT_X, x, true); - mControllerEventListener.onAxisEvent(deviceName, deviceId, - GameControllerDelegate.THUMBSTICK_LEFT_Y, y, true); - } catch (ControllerServiceException e) { - e.printStackTrace(); - } - } - } + @Override + public void onLeftStickChanged(int playerOrder, float x, float y) { + if (mControllerEventListener != null) { + try { + ControllerDevice controllerDevice = mControllerService.getDeviceByPlayerOrder(playerOrder); + + String deviceName = controllerDevice.getDeviceName(); + int deviceId = controllerDevice.getDeviceId(); + + mControllerEventListener.onAxisEvent(deviceName, deviceId, + GameControllerDelegate.THUMBSTICK_LEFT_X, x, true); + mControllerEventListener.onAxisEvent(deviceName, deviceId, + GameControllerDelegate.THUMBSTICK_LEFT_Y, y, true); + } catch (ControllerServiceException e) { + e.printStackTrace(); + } + } + } - @Override - public void onRightStickChanged(int playerOrder, float x, float y) { - if (mControllerEventListener != null) { - try { - ControllerDevice controllerDevice = mControllerService.getDeviceByPlayerOrder(playerOrder); - - String deviceName = controllerDevice.getDeviceName(); - int deviceId = controllerDevice.getDeviceId(); - - mControllerEventListener.onAxisEvent(deviceName, deviceId, - GameControllerDelegate.THUMBSTICK_RIGHT_X, x, true); - mControllerEventListener.onAxisEvent(deviceName, deviceId, - GameControllerDelegate.THUMBSTICK_RIGHT_Y, y, true); - } catch (ControllerServiceException e) { - e.printStackTrace(); - } - } - } - - @Override - public void onControllerStateChanged(int playerOrder, int state, ControllerDevice device) { - if (mControllerEventListener != null) { - if (state == ControllerDevice.STATE_CONN) - { - mControllerEventListener.onConnected(device.getDeviceName(), device.getDeviceId()); - } - else if (state == ControllerDevice.STATE_DISCONN) - { - mControllerEventListener.onDisconnected(device.getDeviceName(), device.getDeviceId()); - } - } - } + @Override + public void onRightStickChanged(int playerOrder, float x, float y) { + if (mControllerEventListener != null) { + try { + ControllerDevice controllerDevice = mControllerService.getDeviceByPlayerOrder(playerOrder); + + String deviceName = controllerDevice.getDeviceName(); + int deviceId = controllerDevice.getDeviceId(); + + mControllerEventListener.onAxisEvent(deviceName, deviceId, + GameControllerDelegate.THUMBSTICK_RIGHT_X, x, true); + mControllerEventListener.onAxisEvent(deviceName, deviceId, + GameControllerDelegate.THUMBSTICK_RIGHT_Y, y, true); + } catch (ControllerServiceException e) { + e.printStackTrace(); + } + } + } + + @Override + public void onControllerStateChanged(int playerOrder, int state, ControllerDevice device) { + if (mControllerEventListener != null) { + if (state == ControllerDevice.STATE_CONN) + { + mControllerEventListener.onConnected(device.getDeviceName(), device.getDeviceId()); + } + else if (state == ControllerDevice.STATE_DISCONN) + { + mControllerEventListener.onDisconnected(device.getDeviceName(), device.getDeviceId()); + } + } + } - public boolean dispatchGenericMotionEvent(MotionEvent event){ - return mControllerService.handleExternalInput(event); - } - - public boolean dispatchKeyEvent(KeyEvent event){ - return mControllerService.handleExternalInput(event); - } - - @Override - public void onControllerAccEvent(int playerOrder, AccEvent event) { - - } + public boolean dispatchGenericMotionEvent(MotionEvent event){ + return mControllerService.handleExternalInput(event); + } + + public boolean dispatchKeyEvent(KeyEvent event){ + return mControllerService.handleExternalInput(event); + } + + @Override + public void onControllerAccEvent(int playerOrder, AccEvent event) { + + } - @Override - public void onControllerGyroEvent(int playerOrder, GyroEvent event) { - - } + @Override + public void onControllerGyroEvent(int playerOrder, GyroEvent event) { + + } - @Override - public void onBluetoothStateChanged(int state) { - Log.d(TAG, "onBluetoothStateChanged:"+state); - } + @Override + public void onBluetoothStateChanged(int state) { + Log.d(TAG, "onBluetoothStateChanged:"+state); + } } diff --git a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerOuya.java b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerOuya.java index fab0fdc80a..a750b58351 100644 --- a/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerOuya.java +++ b/cocos/platform/android/ControllerManualAdapter/src/org/cocos2dx/lib/GameControllerOuya.java @@ -11,17 +11,17 @@ import android.view.KeyEvent; import android.view.MotionEvent; public class GameControllerOuya implements GameControllerDelegate{ - - private SparseIntArray mKeyMap; - private SparseArray mGameController = new SparseArray(); - - public GameControllerOuya(){ - mKeyMap = new SparseIntArray(20); - mKeyMap.put(OuyaController.BUTTON_A, GameControllerDelegate.BUTTON_B); - mKeyMap.put(OuyaController.BUTTON_O, GameControllerDelegate.BUTTON_A); - mKeyMap.put(OuyaController.BUTTON_U, GameControllerDelegate.BUTTON_X); - mKeyMap.put(OuyaController.BUTTON_Y, GameControllerDelegate.BUTTON_Y); + private SparseIntArray mKeyMap; + + private SparseArray mGameController = new SparseArray(); + + public GameControllerOuya(){ + mKeyMap = new SparseIntArray(20); + mKeyMap.put(OuyaController.BUTTON_A, GameControllerDelegate.BUTTON_B); + mKeyMap.put(OuyaController.BUTTON_O, GameControllerDelegate.BUTTON_A); + mKeyMap.put(OuyaController.BUTTON_U, GameControllerDelegate.BUTTON_X); + mKeyMap.put(OuyaController.BUTTON_Y, GameControllerDelegate.BUTTON_Y); mKeyMap.put(OuyaController.BUTTON_DPAD_DOWN, GameControllerDelegate.BUTTON_DPAD_DOWN); mKeyMap.put(OuyaController.BUTTON_DPAD_LEFT, GameControllerDelegate.BUTTON_DPAD_LEFT); mKeyMap.put(OuyaController.BUTTON_DPAD_RIGHT, GameControllerDelegate.BUTTON_DPAD_RIGHT); @@ -34,150 +34,142 @@ public class GameControllerOuya implements GameControllerDelegate{ } public void onCreate(Context context) { - OuyaController.init(context); - /*GameControllerAdapter.addRunnableToFrameStartList(new Runnable() { - - @Override - public void run() { - OuyaController.startOfFrame(); - } - - });*/ + OuyaController.init(context); } private float mOldLeftThumbstickX = 0.0f; - private float mOldLeftThumbstickY = 0.0f; - private float mOldRightThumbstickX = 0.0f; - private float mOldRightThumbstickY = 0.0f; - + private float mOldLeftThumbstickY = 0.0f; + private float mOldRightThumbstickX = 0.0f; + private float mOldRightThumbstickY = 0.0f; + private float mOldLeftTrigger = 0.0f; - private float mOldRightTrigger = 0.0f; - + private float mOldRightTrigger = 0.0f; + public boolean dispatchGenericMotionEvent(MotionEvent event) { boolean handled = OuyaController.onGenericMotionEvent(event); if (handled && mControllerEventListener != null) { - int deviceId = event.getDeviceId(); - String deviceName = event.getDevice().getName(); - OuyaController c = OuyaController.getControllerByDeviceId(deviceId); - if (mGameController.get(deviceId) == null) { - GameControllerHelper.gatherControllers(mGameController); - mGameController.append(deviceId, deviceName); - } - - float newLeftTrigger = c.getAxisValue(OuyaController.AXIS_L2); - if (Float.compare(newLeftTrigger, mOldLeftTrigger) != 0) { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_LEFT_TRIGGER, newLeftTrigger, true); - mOldLeftTrigger = newLeftTrigger; - } - - float newRightTrigger = c.getAxisValue(OuyaController.AXIS_R2); - if (Float.compare(newRightTrigger, mOldRightTrigger) != 0) { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_RIGHT_TRIGGER, newRightTrigger, true); - mOldRightTrigger = newRightTrigger; - } - - float newLeftThumbstickX = c.getAxisValue(OuyaController.AXIS_LS_X); - if (Float.compare(newLeftThumbstickX, mOldLeftThumbstickX) != 0) { - if (Float.compare(newLeftThumbstickX, 0.0f) == 0) { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_X, 0.0f, true); - }else { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_X, newLeftThumbstickX, true); - } - mOldLeftThumbstickX = newLeftThumbstickX; - } - - float newLeftThumbstickY = c.getAxisValue(OuyaController.AXIS_LS_Y); - if (Float.compare(newLeftThumbstickY, mOldLeftThumbstickY) != 0) { - if (Float.compare(newLeftThumbstickY, 0.0f) == 0) { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_Y, 0.0f, true); - }else { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_Y, newLeftThumbstickY, true); - } - mOldLeftThumbstickY = newLeftThumbstickY; - } - - float newRightThumbstickX = c.getAxisValue(OuyaController.AXIS_RS_X); - if (Float.compare(newRightThumbstickX, mOldRightThumbstickX) != 0) { - if (Float.compare(newRightThumbstickX, 0.0f) == 0) { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_X, 0.0f, true); - }else { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_X, newRightThumbstickX, true); - } - mOldRightThumbstickX = newRightThumbstickX; - } - - float newRightThumbstickY = c.getAxisValue(OuyaController.AXIS_RS_Y); - if (Float.compare(newRightThumbstickY, mOldRightThumbstickY) != 0) { - if (Float.compare(newRightThumbstickY, 0.0f) == 0) { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_Y, 0.0f, true); - }else { - mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_Y, newRightThumbstickY, true); - } - mOldRightThumbstickY = newRightThumbstickY; - } + int deviceId = event.getDeviceId(); + String deviceName = event.getDevice().getName(); + OuyaController c = OuyaController.getControllerByDeviceId(deviceId); + if (mGameController.get(deviceId) == null) { + GameControllerHelper.gatherControllers(mGameController); + mGameController.append(deviceId, deviceName); + } + + float newLeftTrigger = c.getAxisValue(OuyaController.AXIS_L2); + if (Float.compare(newLeftTrigger, mOldLeftTrigger) != 0) { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_LEFT_TRIGGER, newLeftTrigger, true); + mOldLeftTrigger = newLeftTrigger; + } + + float newRightTrigger = c.getAxisValue(OuyaController.AXIS_R2); + if (Float.compare(newRightTrigger, mOldRightTrigger) != 0) { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.BUTTON_RIGHT_TRIGGER, newRightTrigger, true); + mOldRightTrigger = newRightTrigger; + } + + float newLeftThumbstickX = c.getAxisValue(OuyaController.AXIS_LS_X); + if (Float.compare(newLeftThumbstickX, mOldLeftThumbstickX) != 0) { + if (Float.compare(newLeftThumbstickX, 0.0f) == 0) { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_X, 0.0f, true); + }else { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_X, newLeftThumbstickX, true); + } + mOldLeftThumbstickX = newLeftThumbstickX; + } + + float newLeftThumbstickY = c.getAxisValue(OuyaController.AXIS_LS_Y); + if (Float.compare(newLeftThumbstickY, mOldLeftThumbstickY) != 0) { + if (Float.compare(newLeftThumbstickY, 0.0f) == 0) { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_Y, 0.0f, true); + }else { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_LEFT_Y, newLeftThumbstickY, true); + } + mOldLeftThumbstickY = newLeftThumbstickY; + } + + float newRightThumbstickX = c.getAxisValue(OuyaController.AXIS_RS_X); + if (Float.compare(newRightThumbstickX, mOldRightThumbstickX) != 0) { + if (Float.compare(newRightThumbstickX, 0.0f) == 0) { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_X, 0.0f, true); + }else { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_X, newRightThumbstickX, true); + } + mOldRightThumbstickX = newRightThumbstickX; + } + + float newRightThumbstickY = c.getAxisValue(OuyaController.AXIS_RS_Y); + if (Float.compare(newRightThumbstickY, mOldRightThumbstickY) != 0) { + if (Float.compare(newRightThumbstickY, 0.0f) == 0) { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_Y, 0.0f, true); + }else { + mControllerEventListener.onAxisEvent(deviceName, deviceId, GameControllerDelegate.THUMBSTICK_RIGHT_Y, newRightThumbstickY, true); + } + mOldRightThumbstickY = newRightThumbstickY; + } } return handled; } public boolean dispatchKeyEvent(KeyEvent event) { - boolean handled = false; - - int action = event.getAction(); - int keyCode = event.getKeyCode(); - - if (action == KeyEvent.ACTION_DOWN) { - handled = OuyaController.onKeyDown(keyCode, event); - } - else if (action == KeyEvent.ACTION_UP) { - handled = OuyaController.onKeyUp(keyCode, event); - } - - if (handled && mControllerEventListener != null) { - boolean isAnalog = false; - - if (keyCode == KeyEvent.KEYCODE_BUTTON_THUMBL || keyCode == KeyEvent.KEYCODE_BUTTON_THUMBR){ - isAnalog = true; - } - - int deviceId = event.getDeviceId(); - String deviceName = event.getDevice().getName(); - - if (mGameController.get(deviceId) == null) { - GameControllerHelper.gatherControllers(mGameController); - mGameController.append(deviceId, deviceName); - } - if (action == KeyEvent.ACTION_DOWN) { - mControllerEventListener.onButtonEvent(deviceName, deviceId, mKeyMap.get(keyCode), true, 1.0f, isAnalog); - }else { - mControllerEventListener.onButtonEvent(deviceName, deviceId, mKeyMap.get(keyCode), false, 0.0f, isAnalog); - } - } - - return handled; + boolean handled = false; + + int action = event.getAction(); + int keyCode = event.getKeyCode(); + + if (action == KeyEvent.ACTION_DOWN) { + handled = OuyaController.onKeyDown(keyCode, event); + } + else if (action == KeyEvent.ACTION_UP) { + handled = OuyaController.onKeyUp(keyCode, event); + } + + if (handled && mControllerEventListener != null) { + boolean isAnalog = false; + + if (keyCode == KeyEvent.KEYCODE_BUTTON_THUMBL || keyCode == KeyEvent.KEYCODE_BUTTON_THUMBR){ + isAnalog = true; + } + + int deviceId = event.getDeviceId(); + String deviceName = event.getDevice().getName(); + + if (mGameController.get(deviceId) == null) { + GameControllerHelper.gatherControllers(mGameController); + mGameController.append(deviceId, deviceName); + } + if (action == KeyEvent.ACTION_DOWN) { + mControllerEventListener.onButtonEvent(deviceName, deviceId, mKeyMap.get(keyCode), true, 1.0f, isAnalog); + }else { + mControllerEventListener.onButtonEvent(deviceName, deviceId, mKeyMap.get(keyCode), false, 0.0f, isAnalog); + } + } + + return handled; } - public void onPause() { + public void onPause() { // show the mouse cursor OuyaController.showCursor(true); - } - - public void onResume() { + } + + public void onResume() { // hide the mouse cursor OuyaController.showCursor(false); - } - - public void onDestroy() { - - } + } + + public void onDestroy() { + + } - private ControllerEventListener mControllerEventListener; - - @Override - public void setControllerEventListener(ControllerEventListener listener) { - mControllerEventListener = listener; - } - + private ControllerEventListener mControllerEventListener; + + @Override + public void setControllerEventListener(ControllerEventListener listener) { + mControllerEventListener = listener; + } + } From 7f3e0b2a8c0f3d6b0940f9ce764c0a0e2bbde637 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 10 Jul 2015 20:56:21 +0800 Subject: [PATCH 48/81] [ci skip]Replace tab with spaces. --- .../game_controller_test/AppActivity.java | 25 +++++++++--------- .../proj.android/jni/list.sh | 23 ---------------- .../game_controller_test/AppActivity.java | 26 +++++++++---------- 3 files changed, 26 insertions(+), 48 deletions(-) delete mode 100644 tests/game-controller-test/proj.android/jni/list.sh diff --git a/tests/game-controller-test/proj.android-studio/app/src/org/cocos2dx/game_controller_test/AppActivity.java b/tests/game-controller-test/proj.android-studio/app/src/org/cocos2dx/game_controller_test/AppActivity.java index 97b31b36d4..58936a5293 100644 --- a/tests/game-controller-test/proj.android-studio/app/src/org/cocos2dx/game_controller_test/AppActivity.java +++ b/tests/game-controller-test/proj.android-studio/app/src/org/cocos2dx/game_controller_test/AppActivity.java @@ -29,16 +29,17 @@ import org.cocos2dx.lib.GameControllerActivity; import android.os.Bundle; public class AppActivity extends GameControllerActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - //The standard controller,without doing anything special. e.g: Amazon Fire TV - - //Manually specify an adapter. - this.connectController(DRIVERTYPE_NIBIRU); - this.connectController(DRIVERTYPE_MOGA); - this.connectController(DRIVERTYPE_OUYA); - } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + //The standard controller,without doing anything special. e.g: Amazon Fire TV + + //Manually specify an adapter. + this.connectController(DRIVERTYPE_NIBIRU); + //Nibiru SDK have already integrated with MOGA service. + //this.connectController(DRIVERTYPE_MOGA); + this.connectController(DRIVERTYPE_OUYA); + } } diff --git a/tests/game-controller-test/proj.android/jni/list.sh b/tests/game-controller-test/proj.android/jni/list.sh deleted file mode 100644 index b29f678cb8..0000000000 --- a/tests/game-controller-test/proj.android/jni/list.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -append_str=' \' - -list_alldir() -{ - for file in $1/* - do - if [ -f $file ]; then - echo $file$append_str | grep .cpp - fi - - if [ -d $file ]; then - list_alldir $file - fi - done -} - -if [ $# -gt 0 ]; then - list_alldir "$1" -else - list_alldir "." -fi diff --git a/tests/game-controller-test/proj.android/src/org/cocos2dx/game_controller_test/AppActivity.java b/tests/game-controller-test/proj.android/src/org/cocos2dx/game_controller_test/AppActivity.java index b197ca0fcc..6435e5864e 100644 --- a/tests/game-controller-test/proj.android/src/org/cocos2dx/game_controller_test/AppActivity.java +++ b/tests/game-controller-test/proj.android/src/org/cocos2dx/game_controller_test/AppActivity.java @@ -29,17 +29,17 @@ import org.cocos2dx.lib.GameControllerActivity; import android.os.Bundle; public class AppActivity extends GameControllerActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - //The standard controller,without doing anything special. e.g: Amazon Fire TV - - //Manually specify an adapter. - this.connectController(DRIVERTYPE_NIBIRU); - //Nibiru SDK have already integrated with MOGA service. - //this.connectController(DRIVERTYPE_MOGA); - this.connectController(DRIVERTYPE_OUYA); - } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + //The standard controller,without doing anything special. e.g: Amazon Fire TV + + //Manually specify an adapter. + this.connectController(DRIVERTYPE_NIBIRU); + //Nibiru SDK have already integrated with MOGA service. + //this.connectController(DRIVERTYPE_MOGA); + this.connectController(DRIVERTYPE_OUYA); + } } From 142d35448575f7c770b7542b2a35a30aed303670 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 10 Jul 2015 21:03:43 +0800 Subject: [PATCH 49/81] [ci skip]Replace tab with spaces. --- .../java/src/org/cocos2dx/lib/Cocos2dxHelper.java | 2 +- .../org/cocos2dx/lib/Cocos2dxHttpURLConnection.java | 4 ++-- .../cocos2dx/lib/Cocos2dxJavascriptJavaBridge.java | 2 +- .../java/src/org/cocos2dx/lib/Cocos2dxRenderer.java | 12 ++++++------ .../src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java index 6eefcd775a..867e942063 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java @@ -49,7 +49,7 @@ import android.util.DisplayMetrics; import android.util.Log; //Enhance API modification import android.view.Display; import android.view.WindowManager; -import android.content.ServiceConnection; //Enhance API modification +import android.content.ServiceConnection; //Enhance API modification import com.enhance.gameservice.IGameTuningService; //Enhance API modification diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHttpURLConnection.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHttpURLConnection.java index 00ddc97845..9c7a2a7a64 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHttpURLConnection.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHttpURLConnection.java @@ -144,7 +144,7 @@ public class Cocos2dxHttpURLConnection } } - //Add header + //Add header static void addRequestHeader(HttpURLConnection urlConnection, String key, String value) { urlConnection.setRequestProperty(key, value); } @@ -181,7 +181,7 @@ public class Cocos2dxHttpURLConnection } static String getResponseHeaders(HttpURLConnection http) { - Map> headers = http.getHeaderFields(); + Map> headers = http.getHeaderFields(); if (null == headers) { return null; } diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxJavascriptJavaBridge.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxJavascriptJavaBridge.java index 996bda03c2..9c7cf96359 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxJavascriptJavaBridge.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxJavascriptJavaBridge.java @@ -23,5 +23,5 @@ package org.cocos2dx.lib; public class Cocos2dxJavascriptJavaBridge { - public static native int evalString(String value); + public static native int evalString(String value); } diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxRenderer.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxRenderer.java index 70264590df..7a1b0d3204 100644 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxRenderer.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxRenderer.java @@ -147,12 +147,12 @@ public class Cocos2dxRenderer implements GLSurfaceView.Renderer { } public void handleOnPause() { - /** - * onPause may be invoked before onSurfaceCreated, - * and engine will be initialized correctly after - * onSurfaceCreated is invoked. Can not invoke any - * native method before onSurfaceCreated is invoked - */ + /** + * onPause may be invoked before onSurfaceCreated, + * and engine will be initialized correctly after + * onSurfaceCreated is invoked. Can not invoke any + * native method before onSurfaceCreated is invoked + */ if (! mNativeInitCompleted) return; diff --git a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java index 5160f680db..ff9105fdbb 100755 --- a/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java +++ b/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java @@ -126,7 +126,7 @@ public class Cocos2dxWebViewHelper { public void run() { Cocos2dxWebView webView = webViews.get(index); if (webView != null) { - webView.loadDataWithBaseURL(baseURL, data, mimeType, encoding, null); + webView.loadDataWithBaseURL(baseURL, data, mimeType, encoding, null); } } }); @@ -138,7 +138,7 @@ public class Cocos2dxWebViewHelper { public void run() { Cocos2dxWebView webView = webViews.get(index); if (webView != null) { - webView.loadDataWithBaseURL(baseUrl, data, null, null, null); + webView.loadDataWithBaseURL(baseUrl, data, null, null, null); } } }); From 205e77a4fbfba87cf916fdc47364831fb1a7a7d9 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 10 Jul 2015 21:09:15 +0800 Subject: [PATCH 50/81] Add missing configuration for Nibiru. --- tests/game-controller-test/Resources/nibirusdk.config | 2 ++ .../proj.android-studio/app/AndroidManifest.xml | 8 +++++--- .../proj.android/AndroidManifest.xml | 10 ++++++---- 3 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 tests/game-controller-test/Resources/nibirusdk.config diff --git a/tests/game-controller-test/Resources/nibirusdk.config b/tests/game-controller-test/Resources/nibirusdk.config new file mode 100644 index 0000000000..00e1a4d45c --- /dev/null +++ b/tests/game-controller-test/Resources/nibirusdk.config @@ -0,0 +1,2 @@ +support_lr2=1 +sdk=nibiru \ No newline at end of file diff --git a/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml b/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml index 12ce1f878c..1a103a5c48 100644 --- a/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml +++ b/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml @@ -9,15 +9,17 @@ + + - - + + + + + android:icon="@drawable/icon"> - - + + Date: Fri, 10 Jul 2015 21:16:21 +0800 Subject: [PATCH 51/81] [ci skip]Add missing configuration for Nibiru. --- .../proj.android-studio/app/AndroidManifest.xml | 10 ++++++++++ .../proj.android/AndroidManifest.xml | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml b/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml index 1a103a5c48..2bdd039e17 100644 --- a/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml +++ b/tests/game-controller-test/proj.android-studio/app/AndroidManifest.xml @@ -32,6 +32,16 @@ + + + + + + + + diff --git a/tests/game-controller-test/proj.android/AndroidManifest.xml b/tests/game-controller-test/proj.android/AndroidManifest.xml index 0475c2105b..5385ef9c4b 100644 --- a/tests/game-controller-test/proj.android/AndroidManifest.xml +++ b/tests/game-controller-test/proj.android/AndroidManifest.xml @@ -33,6 +33,16 @@ + + + + + + + + Date: Sun, 12 Jul 2015 11:33:22 +0800 Subject: [PATCH 52/81] 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 53/81] 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 54/81] 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 55/81] 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 56/81] 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 57/81] [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 58/81] 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 e65b01bdc035719fbeec87f2b3f8f67f35e4cdb1 Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Mon, 13 Jul 2015 17:06:01 +0800 Subject: [PATCH 59/81] 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 60/81] [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 61/81] [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 62/81] 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 63/81] 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 64/81] 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 65/81] [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 66/81] [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 67/81] 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 68/81] 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 69/81] 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 ac1bf362083607df7d89268a9f35b1b7247578c8 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 14 Jul 2015 10:10:20 +0800 Subject: [PATCH 70/81] 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 71/81] 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 72/81] 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 73/81] 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 6b9a5b8264ca99157279e4f3941a0b34c0ded08d Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Tue, 14 Jul 2015 05:41:48 +0000 Subject: [PATCH 74/81] [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 75/81] 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 ea773cac203ed44463ab6bf275ddcb881a5b1946 Mon Sep 17 00:00:00 2001 From: Jacky Date: Tue, 14 Jul 2015 15:11:35 +0800 Subject: [PATCH 76/81] 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 91dfb07a8c7e299e336e5486a8b3f6110cdd44b0 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 14 Jul 2015 15:28:36 +0800 Subject: [PATCH 77/81] 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 97168fa139072226ea36a450a859ae14c955cf66 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 14 Jul 2015 15:43:14 +0800 Subject: [PATCH 78/81] 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 15b0fea530cbd9273fdc2cafcf0114599da20d90 Mon Sep 17 00:00:00 2001 From: andyque Date: Tue, 14 Jul 2015 16:51:36 +0800 Subject: [PATCH 79/81] 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 80/81] 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 4b418fe8233c83f4de3ebf372b7236516bb4ae92 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Wed, 15 Jul 2015 05:46:42 +0000 Subject: [PATCH 81/81] [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); - -