From 4a218ea3e21f308ab8bd4a93ceff7bc31b937598 Mon Sep 17 00:00:00 2001 From: Wenhai Lin Date: Wed, 28 Jan 2015 15:30:52 +0800 Subject: [PATCH 01/83] 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/83] 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/83] 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 d2b58dd39be862951e43244e6aa598639dafe329 Mon Sep 17 00:00:00 2001 From: Vladimir Perminov Date: Sun, 17 May 2015 20:48:49 +0300 Subject: [PATCH 04/83] CaptureScreen save file in thread Check already working Start save file in AsyncTaskPool::TaskType::TASK_IO --- cocos/base/ccUtils.cpp | 61 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/cocos/base/ccUtils.cpp b/cocos/base/ccUtils.cpp index d57011c301..74d024b445 100644 --- a/cocos/base/ccUtils.cpp +++ b/cocos/base/ccUtils.cpp @@ -28,6 +28,7 @@ THE SOFTWARE. #include #include "base/CCDirector.h" +#include "base/CCAsyncTaskPool.h" #include "renderer/CCCustomCommand.h" #include "renderer/CCRenderer.h" #include "platform/CCImage.h" @@ -49,22 +50,39 @@ int ccNextPOT(int x) namespace utils { /** - * Capture screen implementation, don't use it directly. - */ +* Capture screen implementation, don't use it directly. +*/ void onCaptureScreen(const std::function& afterCaptured, const std::string& filename) { + static bool startedCapture = false; + + if (startedCapture) + { + CCLOG("Screen capture is already working"); + if (afterCaptured) + { + afterCaptured(false, filename); + } + return; + } + else + { + startedCapture = true; + } + + auto glView = Director::getInstance()->getOpenGLView(); auto frameSize = glView->getFrameSize(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) frameSize = frameSize * glView->getFrameZoomFactor() * glView->getRetinaFactor(); #endif - + int width = static_cast(frameSize.width); int height = static_cast(frameSize.height); - + bool succeed = false; std::string outputFile = ""; - + do { std::shared_ptr buffer(new GLubyte[width * height * 4], [](GLubyte* p){ CC_SAFE_DELETE_ARRAY(p); }); @@ -72,10 +90,10 @@ void onCaptureScreen(const std::function& afterC { break; } - + glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer.get()); - + std::shared_ptr flippedBuffer(new GLubyte[width * height * 4], [](GLubyte* p) { CC_SAFE_DELETE_ARRAY(p); }); if (!flippedBuffer) { @@ -87,7 +105,7 @@ void onCaptureScreen(const std::function& afterC memcpy(flippedBuffer.get() + (height - row - 1) * width * 4, buffer.get() + row * width * 4, width * 4); } - std::shared_ptr image(new Image); + Image* image = new (std::nothrow) Image; if (image) { image->initWithRawData(flippedBuffer.get(), width * height * 4, width, height, 8); @@ -100,15 +118,36 @@ void onCaptureScreen(const std::function& afterC CCASSERT(filename.find("/") == std::string::npos, "The existence of a relative path is not guaranteed!"); outputFile = FileUtils::getInstance()->getWritablePath() + filename; } - succeed = image->saveToFile(outputFile); + + // Save image in AsyncTaskPool::TaskType::TASK_IO thread, and call afterCaptured in mainThread + static bool succeedSaveToFile = false; + std::function mainThread = [afterCaptured, outputFile](void* param) + { + if (afterCaptured) + { + afterCaptured(succeedSaveToFile, outputFile); + } + startedCapture = false; + }; + + AsyncTaskPool::getInstance()->enqueue(AsyncTaskPool::TaskType::TASK_IO, mainThread, (void*)NULL, [image, outputFile]() + { + succeedSaveToFile = image->saveToFile(outputFile); + delete image; + }); + + // Don't call afterCaptured, call in mainThread function + return; } - }while(0); - + } while (0); + if (afterCaptured) { afterCaptured(succeed, outputFile); } + startedCapture = false; } + /* * Capture screen interface */ From 98c3ba6f4b1e94b6b5b27af0e4296141301fbb5b Mon Sep 17 00:00:00 2001 From: MAUSMAUSgames Date: Sun, 24 May 2015 17:30:26 +0200 Subject: [PATCH 05/83] 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 06/83] 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 07/83] 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 08/83] 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 09/83] 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 10/83] 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 11/83] 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 12/83] 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 13/83] 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 14/83] 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 15/83] 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 16/83] 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 17/83] 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 18/83] 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 abee4a376ab426cd76bb4e457a40d2069b0fa766 Mon Sep 17 00:00:00 2001 From: jianglong0156 Date: Tue, 7 Jul 2015 14:06:59 +0800 Subject: [PATCH 19/83] add write api in FileUtils bool writeStringToFile(std::string dataStr, const std::string& fullPath); bool writeDataToFile(Data retData, const std::string& fullPath); bool writeValueMapToFile(ValueMap& dict, const std::string& fullPath); bool writeValueVectorToFile(ValueVector vecData, const std::string& fullPath); and formate the FileUtils code --- cocos/platform/CCFileUtils.cpp | 437 ++++++++++------- cocos/platform/CCFileUtils.h | 207 ++++---- .../platform/android/CCFileUtils-android.cpp | 28 +- cocos/platform/apple/CCFileUtils-apple.mm | 30 +- cocos/platform/linux/CCFileUtils-linux.cpp | 2 +- cocos/platform/win32/CCFileUtils-win32.cpp | 34 +- cocos/platform/winrt/CCFileUtilsWinRT.cpp | 34 +- .../Classes/FileUtilsTest/FileUtilsTest.cpp | 450 +++++++++++++++--- .../Classes/FileUtilsTest/FileUtilsTest.h | 47 +- 9 files changed, 888 insertions(+), 381 deletions(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index b5b502decd..ed0960bf93 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -59,7 +59,7 @@ THE SOFTWARE. NS_CC_BEGIN -typedef enum +typedef enum { SAX_NONE = 0, SAX_KEY, @@ -81,22 +81,22 @@ class DictMaker : public SAXDelegator { public: SAXResult _resultType; - ValueMap _rootDict; - ValueVector _rootArray; + ValueMap _rootDict; + ValueVector _rootArray; std::string _curKey; ///< parsed key std::string _curValue; // parsed value SAXState _state; - ValueMap* _curDict; + ValueMap* _curDict; ValueVector* _curArray; - std::stack _dictStack; + std::stack _dictStack; std::stack _arrayStack; std::stack _stateStack; public: - DictMaker() + DictMaker() : _resultType(SAX_RESULT_NONE) { } @@ -114,20 +114,20 @@ public: parser.setDelegator(this); parser.parse(fileName); - return _rootDict; + return _rootDict; } - ValueMap dictionaryWithDataOfFile(const char* filedata, int filesize) - { - _resultType = SAX_RESULT_DICT; - SAXParser parser; + ValueMap dictionaryWithDataOfFile(const char* filedata, int filesize) + { + _resultType = SAX_RESULT_DICT; + SAXParser parser; - CCASSERT(parser.init("UTF-8"), "The file format isn't UTF-8"); - parser.setDelegator(this); + CCASSERT(parser.init("UTF-8"), "The file format isn't UTF-8"); + parser.setDelegator(this); - parser.parse(filedata, filesize); - return _rootDict; - } + parser.parse(filedata, filesize); + return _rootDict; + } ValueVector arrayWithContentsOfFile(const std::string& fileName) { @@ -138,7 +138,7 @@ public: parser.setDelegator(this); parser.parse(fileName); - return _rootArray; + return _rootArray; } void startElement(void *ctx, const char *name, const char **atts) @@ -148,7 +148,7 @@ public: const std::string sName(name); if( sName == "dict" ) { - if(_resultType == SAX_RESULT_DICT && _rootDict.empty()) + if(_resultType == SAX_RESULT_DICT && _rootDict.empty()) { _curDict = &_rootDict; } @@ -165,7 +165,7 @@ public: { // add a new dictionary into the array _curArray->push_back(Value(ValueMap())); - _curDict = &(_curArray->rbegin())->asValueMap(); + _curDict = &(_curArray->rbegin())->asValueMap(); } else if (SAX_DICT == preState) { @@ -173,7 +173,7 @@ public: CCASSERT(! _dictStack.empty(), "The state is wrong!"); ValueMap* preDict = _dictStack.top(); (*preDict)[_curKey] = Value(ValueMap()); - _curDict = &(*preDict)[_curKey].asValueMap(); + _curDict = &(*preDict)[_curKey].asValueMap(); } // record the dict state @@ -200,9 +200,9 @@ public: { _state = SAX_ARRAY; - if (_resultType == SAX_RESULT_ARRAY && _rootArray.empty()) + if (_resultType == SAX_RESULT_ARRAY && _rootArray.empty()) { - _curArray = &_rootArray; + _curArray = &_rootArray; } SAXState preState = SAX_NONE; if (! _stateStack.empty()) @@ -213,14 +213,14 @@ public: if (preState == SAX_DICT) { (*_curDict)[_curKey] = Value(ValueVector()); - _curArray = &(*_curDict)[_curKey].asValueVector(); + _curArray = &(*_curDict)[_curKey].asValueVector(); } else if (preState == SAX_ARRAY) { CCASSERT(! _arrayStack.empty(), "The state is wrong!"); ValueVector* preArray = _arrayStack.top(); preArray->push_back(Value(ValueVector())); - _curArray = &(_curArray->rbegin())->asValueVector(); + _curArray = &(_curArray->rbegin())->asValueVector(); } // record the array state _stateStack.push(_state); @@ -300,7 +300,7 @@ public: _curValue.clear(); } - + _state = SAX_NONE; } @@ -328,7 +328,7 @@ public: { CCASSERT(!_curKey.empty(), "key not found : "); } - + _curValue.append(text); } break; @@ -369,23 +369,28 @@ static tinyxml2::XMLElement* generateElementForDict(const ValueMap& dict, tinyxm * Use tinyxml2 to write plist files */ bool FileUtils::writeToFile(ValueMap& dict, const std::string &fullPath) +{ + return writeValueMapToFile(dict, fullPath); +} + +bool FileUtils::writeValueMapToFile(ValueMap& dict, const std::string& fullPath) { //CCLOG("tinyxml2 Dictionary %d writeToFile %s", dict->_ID, fullPath.c_str()); tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument(); if (nullptr == doc) return false; - + tinyxml2::XMLDeclaration *declaration = doc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\""); if (nullptr == declaration) { delete doc; return false; } - + doc->LinkEndChild(declaration); tinyxml2::XMLElement *docType = doc->NewElement("!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\""); doc->LinkEndChild(docType); - + tinyxml2::XMLElement *rootEle = doc->NewElement("plist"); rootEle->SetAttribute("version", "1.0"); if (nullptr == rootEle) @@ -394,17 +399,58 @@ bool FileUtils::writeToFile(ValueMap& dict, const std::string &fullPath) return false; } doc->LinkEndChild(rootEle); - + tinyxml2::XMLElement *innerDict = generateElementForDict(dict, doc); - if (nullptr == innerDict ) + if (nullptr == innerDict) { delete doc; return false; } rootEle->LinkEndChild(innerDict); - + bool ret = tinyxml2::XML_SUCCESS == doc->SaveFile(getSuitableFOpen(fullPath).c_str()); - + + delete doc; + return ret; +} + +bool FileUtils::writeValueVectorToFile(ValueVector vecData, const std::string& fullPath) +{ + //CCLOG("tinyxml2 Dictionary %d writeToFile %s", dict->_ID, fullPath.c_str()); + tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument(); + if (nullptr == doc) + return false; + + tinyxml2::XMLDeclaration *declaration = doc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\""); + if (nullptr == declaration) + { + delete doc; + return false; + } + + doc->LinkEndChild(declaration); + tinyxml2::XMLElement *docType = doc->NewElement("!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\""); + doc->LinkEndChild(docType); + + tinyxml2::XMLElement *rootEle = doc->NewElement("plist"); + rootEle->SetAttribute("version", "1.0"); + if (nullptr == rootEle) + { + delete doc; + return false; + } + doc->LinkEndChild(rootEle); + + tinyxml2::XMLElement *innerDict = generateElementForArray(vecData, doc); + if (nullptr == innerDict) + { + delete doc; + return false; + } + rootEle->LinkEndChild(innerDict); + + bool ret = tinyxml2::XML_SUCCESS == doc->SaveFile(getSuitableFOpen(fullPath).c_str()); + delete doc; return ret; } @@ -422,7 +468,7 @@ static tinyxml2::XMLElement* generateElementForObject(const Value& value, tinyxm node->LinkEndChild(content); return node; } - + // object is integer if (value.getType() == Value::Type::INTEGER) { @@ -440,21 +486,21 @@ static tinyxml2::XMLElement* generateElementForObject(const Value& value, tinyxm node->LinkEndChild(content); return node; } - + //object is bool if (value.getType() == Value::Type::BOOLEAN) { - tinyxml2::XMLElement* node = doc->NewElement(value.asString().c_str()); - return node; + tinyxml2::XMLElement* node = doc->NewElement(value.asString().c_str()); + return node; } // object is Array if (value.getType() == Value::Type::VECTOR) return generateElementForArray(value.asValueVector(), doc); - + // object is Dictionary if (value.getType() == Value::Type::MAP) return generateElementForDict(value.asValueMap(), doc); - + CCLOG("This type cannot appear in property list"); return nullptr; } @@ -465,14 +511,14 @@ static tinyxml2::XMLElement* generateElementForObject(const Value& value, tinyxm static tinyxml2::XMLElement* generateElementForDict(const ValueMap& dict, tinyxml2::XMLDocument *doc) { tinyxml2::XMLElement* rootNode = doc->NewElement("dict"); - + for (const auto &iter : dict) { tinyxml2::XMLElement* tmpNode = doc->NewElement("key"); rootNode->LinkEndChild(tmpNode); tinyxml2::XMLText* content = doc->NewText(iter.first.c_str()); tmpNode->LinkEndChild(content); - + tinyxml2::XMLElement *element = generateElementForObject(iter.second, doc); if (element) rootNode->LinkEndChild(element); @@ -517,7 +563,7 @@ void FileUtils::setDelegate(FileUtils *delegate) { if (s_sharedFileUtils) delete s_sharedFileUtils; - + s_sharedFileUtils = delegate; } @@ -530,7 +576,39 @@ FileUtils::~FileUtils() { } +bool FileUtils::writeStringToFile(std::string dataStr, const std::string& fullPath) +{ + Data retData; + retData.copy((unsigned char*)dataStr.c_str(), dataStr.size()); + return writeDataToFile(retData, fullPath); +} + +bool FileUtils::writeDataToFile(Data retData, const std::string& fullPath) +{ + unsigned char* buffer = nullptr; + size_t size = 0; + const char* mode = "wb"; + + CCASSERT(!fullPath.empty() && retData.getSize() != 0, "Invalid parameters."); + + auto fileutils = FileUtils::getInstance(); + do + { + // Read the file from hardware + FILE *fp = fopen(fileutils->getSuitableFOpen(fullPath).c_str(), mode); + CC_BREAK_IF(!fp); + size = retData.getSize(); + + fwrite(retData.getBytes(), size, 1, fp); + + fclose(fp); + + return true; + } while (0); + + return false; +} bool FileUtils::init() { @@ -550,13 +628,13 @@ static Data getData(const std::string& filename, bool forString) { return Data::Null; } - + Data ret; unsigned char* buffer = nullptr; size_t size = 0; size_t readsize; const char* mode = nullptr; - + if (forString) mode = "rt"; else @@ -572,7 +650,7 @@ static Data getData(const std::string& filename, bool forString) fseek(fp,0,SEEK_END); size = ftell(fp); fseek(fp,0,SEEK_SET); - + if (forString) { buffer = (unsigned char*)malloc(sizeof(unsigned char) * (size + 1)); @@ -582,16 +660,16 @@ static Data getData(const std::string& filename, bool forString) { buffer = (unsigned char*)malloc(sizeof(unsigned char) * size); } - + readsize = fread(buffer, sizeof(unsigned char), size, fp); fclose(fp); - + if (forString && readsize < size) { buffer[readsize] = '\0'; } } while (0); - + if (nullptr == buffer || 0 == readsize) { CCLOG("Get data from file %s failed", filename.c_str()); @@ -600,7 +678,7 @@ static Data getData(const std::string& filename, bool forString) { ret.fastSet(buffer, readsize); } - + return ret; } @@ -608,8 +686,8 @@ std::string FileUtils::getStringFromFile(const std::string& filename) { Data data = getData(filename, true); if (data.isNull()) - return ""; - + return ""; + std::string ret((const char*)data.getBytes()); return ret; } @@ -630,7 +708,7 @@ unsigned char* FileUtils::getFileData(const std::string& filename, const char* m const std::string fullPath = fullPathForFilename(filename); FILE *fp = fopen(getSuitableFOpen(fullPath).c_str(), mode); CC_BREAK_IF(!fp); - + fseek(fp,0,SEEK_END); *size = ftell(fp); fseek(fp,0,SEEK_SET); @@ -638,12 +716,12 @@ unsigned char* FileUtils::getFileData(const std::string& filename, const char* m *size = fread(buffer,sizeof(unsigned char), *size,fp); fclose(fp); } while (0); - + if (!buffer) { std::string msg = "Get data from file("; msg.append(filename).append(") failed!"); - + CCLOG("%s", msg.c_str()); } return buffer; @@ -655,14 +733,14 @@ unsigned char* FileUtils::getFileDataFromZip(const std::string& zipFilePath, con unzFile file = nullptr; *size = 0; - do + do { CC_BREAK_IF(zipFilePath.empty()); file = unzOpen(zipFilePath.c_str()); CC_BREAK_IF(!file); - // FIXME: Other platforms should use upstream minizip like mingw-w64 + // FIXME: Other platforms should use upstream minizip like mingw-w64 #ifdef MINIZIP_FROM_SYSTEM int ret = unzLocateFile(file, filename.c_str(), NULL); #else @@ -697,7 +775,7 @@ unsigned char* FileUtils::getFileDataFromZip(const std::string& zipFilePath, con std::string FileUtils::getNewFilename(const std::string &filename) const { std::string newFileName; - + // in Lookup Filename dictionary ? auto iter = _filenameLookupDict.find(filename); @@ -722,14 +800,14 @@ std::string FileUtils::getPathForFilename(const std::string& filename, const std file_path = filename.substr(0, pos+1); file = filename.substr(pos+1); } - + // searchPath + file_path + resourceDirectory std::string path = searchPath; path += file_path; path += resolutionDirectory; - + path = getFullPathForDirectoryAndFilename(path, file); - + //CCLOG("getPathForFilename, fullPath = %s", path.c_str()); return path; } @@ -740,7 +818,7 @@ std::string FileUtils::fullPathForFilename(const std::string &filename) const { return ""; } - + if (isAbsolutePath(filename)) { return filename; @@ -752,28 +830,28 @@ std::string FileUtils::fullPathForFilename(const std::string &filename) const { return cacheIter->second; } - + // Get the new file name. const std::string newFilename( getNewFilename(filename) ); - - std::string fullpath; - + + std::string fullpath; + for (const auto& searchIt : _searchPathArray) { for (const auto& resolutionIt : _searchResolutionsOrderArray) { fullpath = this->getPathForFilename(newFilename, resolutionIt, searchIt); - + if (fullpath.length() > 0) { // Using the filename passed in as key. _fullPathCache.insert(std::make_pair(filename, fullpath)); return fullpath; } - + } } - + if(isPopupNotify()){ CCLOG("cocos2d: fullPathForFilename: No file found at %s. Possible missing file.", filename.c_str()); } @@ -799,12 +877,12 @@ void FileUtils::setSearchResolutionsOrder(const std::vector& search { existDefault = true; } - + if (resolutionDirectory.length() > 0 && resolutionDirectory[resolutionDirectory.length()-1] != '/') { resolutionDirectory += "/"; } - + _searchResolutionsOrderArray.push_back(resolutionDirectory); } @@ -819,7 +897,7 @@ void FileUtils::addSearchResolutionsOrder(const std::string &order,const bool fr std::string resOrder = order; if (!resOrder.empty() && resOrder[resOrder.length()-1] != '/') resOrder.append("/"); - + if (front) { _searchResolutionsOrderArray.insert(_searchResolutionsOrderArray.begin(), resOrder); } else { @@ -850,14 +928,14 @@ void FileUtils::setDefaultResourceRootPath(const std::string& path) void FileUtils::setSearchPaths(const std::vector& searchPaths) { bool existDefaultRootPath = false; - + _fullPathCache.clear(); _searchPathArray.clear(); for (const auto& iter : searchPaths) { std::string prefix; std::string path; - + if (!isAbsolutePath(iter)) { // Not an absolute path prefix = _defaultResRootPath; @@ -873,7 +951,7 @@ void FileUtils::setSearchPaths(const std::vector& searchPaths) } _searchPathArray.push_back(path); } - + if (!existDefaultRootPath) { //CCLOG("Default root path doesn't exist, adding it."); @@ -901,7 +979,7 @@ void FileUtils::addSearchPath(const std::string &searchpath,const bool front) void FileUtils::setFilenameLookupDictionary(const ValueMap& filenameLookupDict) { - _fullPathCache.clear(); + _fullPathCache.clear(); _filenameLookupDict = filenameLookupDict; } @@ -927,13 +1005,13 @@ void FileUtils::loadFilenameLookupDictionaryFromFile(const std::string &filename std::string FileUtils::getFullPathForDirectoryAndFilename(const std::string& directory, const std::string& filename) const { - // get directory+filename, safely adding '/' as necessary + // get directory+filename, safely adding '/' as necessary std::string ret = directory; if (directory.size() && directory[directory.size()-1] != '/'){ ret += '/'; } ret += filename; - + // if the file doesn't exist, return an empty string if (!isFileExistInternal(ret)) { ret = ""; @@ -968,16 +1046,16 @@ bool FileUtils::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; + { + return true; + } + return false; #elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - unsigned long fAttrib = GetFileAttributesA(dirPath.c_str()); + unsigned long fAttrib = GetFileAttributesA(dirPath.c_str()); if (fAttrib != INVALID_FILE_ATTRIBUTES && (fAttrib & FILE_ATTRIBUTE_DIRECTORY)) { - return true; + return true; } return false; #else @@ -995,20 +1073,20 @@ bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const bool FileUtils::isDirectoryExist(const std::string& dirPath) const { CCASSERT(!dirPath.empty(), "Invalid path"); - + if (isAbsolutePath(dirPath)) { return isDirectoryExistInternal(dirPath); } - + // Already Cached ? auto cacheIter = _fullPathCache.find(dirPath); if( cacheIter != _fullPathCache.end() ) { return isDirectoryExistInternal(cacheIter->second); } - - std::string fullpath; + + std::string fullpath; for (const auto& searchIt : _searchPathArray) { for (const auto& resolutionIt : _searchResolutionsOrderArray) @@ -1022,23 +1100,23 @@ bool FileUtils::isDirectoryExist(const std::string& dirPath) const } } } - + return false; } bool FileUtils::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) @@ -1061,42 +1139,42 @@ bool FileUtils::createDirectory(const std::string& path) #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) - WIN32_FILE_ATTRIBUTE_DATA wfad; + 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)) - { + { + 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; + 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; - } - } - } + 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 @@ -1108,11 +1186,11 @@ bool FileUtils::createDirectory(const std::string& path) { subpath += dirs[i]; dir = opendir(subpath.c_str()); - + if (!dir) { // directory doesn't exist, should create a new one - + int ret = mkdir(subpath.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); if (ret != 0 && (errno != EEXIST)) { @@ -1139,7 +1217,7 @@ static int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, str { log("Fail to remove: %s ",fpath); } - + return ret; } #endif @@ -1151,53 +1229,53 @@ bool FileUtils::removeDirectory(const std::string& path) CCLOGERROR("Fail to remove directory, path must termniate with '/': %s", path.c_str()); 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]!='.') - { + 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) - { + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { temp += '/'; ret = ret && this->removeDirectory(std::string(temp.begin(), temp.end())); - } - else - { + } + else + { SetFileAttributes(temp.c_str(), FILE_ATTRIBUTE_NORMAL); ret = ret && DeleteFile(temp.c_str()); - } - } - find = FindNextFile(search, &wfd); - } - FindClose(search); - } + } + } + find = FindNextFile(search, &wfd); + } + FindClose(search); + } if (ret && RemoveDirectory(wpath.c_str())) { return true; } - return false; + return false; #elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - std::string command = "cmd /c rd /s /q "; - // Path may include space. - command += "\"" + path + "\""; + 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; + 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; @@ -1221,27 +1299,27 @@ bool FileUtils::removeFile(const std::string &path) #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) std::wstring wpath(path.begin(), path.end()); if (DeleteFile(wpath.c_str())) - { - return true; - } - return false; + { + 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; + 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; + if (WinExec(command.c_str(), SW_HIDE) > 31) + return true; + else + return false; #else if (remove(path.c_str())) { return false; @@ -1256,20 +1334,20 @@ bool FileUtils::renameFile(const std::string &path, const std::string &oldname, CCASSERT(!path.empty(), "Invalid path"); std::string oldPath = path + oldname; std::string newPath = path + name; - + // Rename a file #if (CC_TARGET_PLATFORM == CC_PLATFORM_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(), + 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) +#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, "\\"); @@ -1306,7 +1384,7 @@ bool FileUtils::renameFile(const std::string &path, const std::string &oldname, long FileUtils::getFileSize(const std::string &filepath) { CCASSERT(!filepath.empty(), "Invalid path"); - + std::string fullpath = filepath; if (!isAbsolutePath(filepath)) { @@ -1314,11 +1392,11 @@ long FileUtils::getFileSize(const std::string &filepath) if (fullpath.empty()) return 0; } - + struct stat info; // Get data associated with "crt_stat.c": int result = stat( fullpath.c_str(), &info ); - + // Check if statistics are valid: if( result != 0 ) { @@ -1406,6 +1484,7 @@ 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 9766478566..5b11a3c730 100644 --- a/cocos/platform/CCFileUtils.h +++ b/cocos/platform/CCFileUtils.h @@ -54,11 +54,11 @@ public: * Destroys the instance of FileUtils. */ static void destroyInstance(); - + /** * You can inherit from platform dependent implementation of FileUtils, such as FileUtilsAndroid, * and use this function to set delegate, then FileUtils will invoke delegate's implementation. - * Fox example, your resources are encrypted, so you need to decrypt it after reading data from + * Fox example, your resources are encrypted, so you need to decrypt it after reading data from * resources, then you can implement all getXXX functions, and engine will invoke your own getXX * functions when reading data of resources. * @@ -82,23 +82,23 @@ public: * @lua NA */ virtual ~FileUtils(); - + /** * Purges full path caches. */ virtual void purgeCachedEntries(); - + /** * Gets string from a file. */ virtual std::string getStringFromFile(const std::string& filename); - + /** * Creates binary data from a file. * @return A data object. */ virtual Data getDataFromFile(const std::string& filename); - + /** * Gets resource file data * @@ -120,59 +120,59 @@ public: */ virtual unsigned char* getFileDataFromZip(const std::string& zipFilePath, const std::string& filename, ssize_t *size); - + /** Returns the fullpath for a given filename. - + First it will try to get a new filename from the "filenameLookup" dictionary. If a new filename can't be found on the dictionary, it will use the original filename. Then it will try to obtain the full path of the filename using the FileUtils search rules: resolutions, and search paths. The file search is based on the array element order of search paths and resolution directories. - + For instance: - We set two elements("/mnt/sdcard/", "internal_dir/") to search paths vector by setSearchPaths, - and set three elements("resources-ipadhd/", "resources-ipad/", "resources-iphonehd") - to resolutions vector by setSearchResolutionsOrder. The "internal_dir" is relative to "Resources/". + We set two elements("/mnt/sdcard/", "internal_dir/") to search paths vector by setSearchPaths, + and set three elements("resources-ipadhd/", "resources-ipad/", "resources-iphonehd") + to resolutions vector by setSearchResolutionsOrder. The "internal_dir" is relative to "Resources/". - If we have a file named 'sprite.png', the mapping in fileLookup dictionary contains `key: sprite.png -> value: sprite.pvr.gz`. - Firstly, it will replace 'sprite.png' with 'sprite.pvr.gz', then searching the file sprite.pvr.gz as follows: + If we have a file named 'sprite.png', the mapping in fileLookup dictionary contains `key: sprite.png -> value: sprite.pvr.gz`. + Firstly, it will replace 'sprite.png' with 'sprite.pvr.gz', then searching the file sprite.pvr.gz as follows: - /mnt/sdcard/resources-ipadhd/sprite.pvr.gz (if not found, search next) - /mnt/sdcard/resources-ipad/sprite.pvr.gz (if not found, search next) - /mnt/sdcard/resources-iphonehd/sprite.pvr.gz (if not found, search next) - /mnt/sdcard/sprite.pvr.gz (if not found, search next) - internal_dir/resources-ipadhd/sprite.pvr.gz (if not found, search next) - internal_dir/resources-ipad/sprite.pvr.gz (if not found, search next) - internal_dir/resources-iphonehd/sprite.pvr.gz (if not found, search next) - internal_dir/sprite.pvr.gz (if not found, return "sprite.png") + /mnt/sdcard/resources-ipadhd/sprite.pvr.gz (if not found, search next) + /mnt/sdcard/resources-ipad/sprite.pvr.gz (if not found, search next) + /mnt/sdcard/resources-iphonehd/sprite.pvr.gz (if not found, search next) + /mnt/sdcard/sprite.pvr.gz (if not found, search next) + internal_dir/resources-ipadhd/sprite.pvr.gz (if not found, search next) + internal_dir/resources-ipad/sprite.pvr.gz (if not found, search next) + internal_dir/resources-iphonehd/sprite.pvr.gz (if not found, search next) + internal_dir/sprite.pvr.gz (if not found, return "sprite.png") If the filename contains relative path like "gamescene/uilayer/sprite.png", and the mapping in fileLookup dictionary contains `key: gamescene/uilayer/sprite.png -> value: gamescene/uilayer/sprite.pvr.gz`. The file search order will be: - /mnt/sdcard/gamescene/uilayer/resources-ipadhd/sprite.pvr.gz (if not found, search next) - /mnt/sdcard/gamescene/uilayer/resources-ipad/sprite.pvr.gz (if not found, search next) - /mnt/sdcard/gamescene/uilayer/resources-iphonehd/sprite.pvr.gz (if not found, search next) - /mnt/sdcard/gamescene/uilayer/sprite.pvr.gz (if not found, search next) - internal_dir/gamescene/uilayer/resources-ipadhd/sprite.pvr.gz (if not found, search next) - internal_dir/gamescene/uilayer/resources-ipad/sprite.pvr.gz (if not found, search next) - internal_dir/gamescene/uilayer/resources-iphonehd/sprite.pvr.gz (if not found, search next) - internal_dir/gamescene/uilayer/sprite.pvr.gz (if not found, return "gamescene/uilayer/sprite.png") + /mnt/sdcard/gamescene/uilayer/resources-ipadhd/sprite.pvr.gz (if not found, search next) + /mnt/sdcard/gamescene/uilayer/resources-ipad/sprite.pvr.gz (if not found, search next) + /mnt/sdcard/gamescene/uilayer/resources-iphonehd/sprite.pvr.gz (if not found, search next) + /mnt/sdcard/gamescene/uilayer/sprite.pvr.gz (if not found, search next) + internal_dir/gamescene/uilayer/resources-ipadhd/sprite.pvr.gz (if not found, search next) + internal_dir/gamescene/uilayer/resources-ipad/sprite.pvr.gz (if not found, search next) + internal_dir/gamescene/uilayer/resources-iphonehd/sprite.pvr.gz (if not found, search next) + internal_dir/gamescene/uilayer/sprite.pvr.gz (if not found, return "gamescene/uilayer/sprite.png") If the new file can't be found on the file system, it will return the parameter filename directly. - + This method was added to simplify multiplatform support. Whether you are using cocos2d-js or any cross-compilation toolchain like StellaSDK or Apportable, you might need to load different resources for a given file in the different platforms. @since v2.1 */ virtual std::string fullPathForFilename(const std::string &filename) const; - + /** * Loads the filenameLookup dictionary from the contents of a filename. - * + * * @note The plist file name should follow the format below: - * + * * @code * * @@ -202,15 +202,15 @@ public: * @lua loadFilenameLookup */ virtual void loadFilenameLookupDictionaryFromFile(const std::string &filename); - - /** + + /** * Sets the filenameLookup dictionary. * * @param pFilenameLookupDict The dictionary for replacing filename. * @since v2.1 */ virtual void setFilenameLookupDictionary(const ValueMap& filenameLookupDict); - + /** * Gets full path from a file name and the path of the relative file. * @param filename The file name. @@ -222,7 +222,7 @@ public: */ virtual std::string fullPathFromRelativeFile(const std::string &filename, const std::string &relativeFile); - /** + /** * Sets the array that contains the search order of the resources. * * @param searchResolutionsOrder The source array that contains the search order of the resources. @@ -240,7 +240,7 @@ public: * @since v2.1 */ virtual void addSearchResolutionsOrder(const std::string &order,const bool front=false); - + /** * Gets the array that contains the search order of the resources. * @@ -249,19 +249,19 @@ public: * @lua NA */ virtual const std::vector& getSearchResolutionsOrder() const; - - /** + + /** * Sets the array of search paths. - * + * * You can use this array to modify the search path of the resources. * If you want to use "themes" or search resources in the "cache", you can do it easily by adding new entries in this array. * * @note This method could access relative path and absolute path. * If the relative path was passed to the vector, FileUtils will add the default resource directory before the relative path. * For instance: - * On Android, the default resource root path is "assets/". - * If "/mnt/sdcard/" and "resources-large" were set to the search paths vector, - * "resources-large" will be converted to "assets/resources-large" since it was a relative path. + * On Android, the default resource root path is "assets/". + * If "/mnt/sdcard/" and "resources-large" were set to the search paths vector, + * "resources-large" will be converted to "assets/resources-large" since it was a relative path. * * @param searchPaths The array contains search paths. * @see fullPathForFilename(const char*) @@ -270,7 +270,7 @@ public: * @lua NA */ virtual void setSearchPaths(const std::vector& searchPaths); - + /** * Set default resource root path. */ @@ -282,10 +282,10 @@ public: * @since v2.1 */ void addSearchPath(const std::string & path, const bool front=false); - + /** * Gets the array of search paths. - * + * * @return The array of search paths. * @see fullPathForFilename(const char*). * @lua NA @@ -297,7 +297,7 @@ public: * @return The path that can be write/read a file in */ virtual std::string getWritablePath() const = 0; - + /** * Sets writable path. */ @@ -307,8 +307,8 @@ public: * Sets whether to pop-up a message box when failed to load an image. */ virtual void setPopupNotify(bool notify); - - /** Checks whether to pop up a message box when failed to load an image. + + /** Checks whether to pop up a message box when failed to load an image. * @return True if pop up a message box when failed to load an image, false if not. */ virtual bool isPopupNotify() const; @@ -321,15 +321,58 @@ public: */ virtual ValueMap getValueMapFromFile(const std::string& filename); - // Converts the contents of a file to a ValueMap. - // This method is used internally. - virtual ValueMap getValueMapFromData(const char* filedata, int filesize); - - // Write a ValueMap to a plist file. - // This method is used internally. + /** Converts the contents of a file to a ValueMap. + * This method is used internally. + */ + virtual ValueMap getValueMapFromData(const char* filedata, int filesize); + + /** + * write a ValueMap into a plist file + * + *@param dict the ValueMap want to save + *@param fullPath The full path to the file you want to save a string + *@return bool + */ virtual bool writeToFile(ValueMap& dict, const std::string& fullPath); - + + /** + * write a string into a file + * + * @param dataStr the string want to save + * @param fullPath The full path to the file you want to save a string + * @return bool True if write success + */ + virtual bool writeStringToFile(std::string dataStr, const std::string& fullPath); + + + /** + * write Data into a file + * + *@param retData the data want to save + *@param fullPath The full path to the file you want to save a string + *@return bool + */ + virtual bool writeDataToFile(Data retData, const std::string& fullPath); + + /** + * write ValueMap into a plist file + * + *@param dict the ValueMap want to save + *@param fullPath The full path to the file you want to save a string + *@return bool + */ + virtual bool writeValueMapToFile(ValueMap& dict, const std::string& fullPath); + + /** + * write ValueVector into a plist file + * + *@param vecData the ValueVector want to save + *@param fullPath The full path to the file you want to save a string + *@return bool + */ + virtual bool writeValueVectorToFile(ValueVector vecData, const std::string& fullPath); + /** * Windows fopen can't support UTF-8 filename * Need convert all parameters fopen and other 3rd-party libs @@ -338,11 +381,11 @@ public: * @return std::string ansi filename in current locale */ virtual std::string getSuitableFOpen(const std::string& filenameUtf8) const; - + // Converts the contents of a file to a ValueVector. // This method is used internally. virtual ValueVector getValueVectorFromFile(const std::string& filename); - + /** * Checks whether a file exists. * @@ -351,7 +394,7 @@ public: * @return True if the file exists, false if not. */ virtual bool isFileExist(const std::string& filename) const; - + /** * Checks whether the path is an absolute path. * @@ -362,7 +405,7 @@ public: * @return True if it's an absolute path, false if not. */ virtual bool isAbsolutePath(const std::string& path) const; - + /** * Checks whether the path is a directory. * @@ -370,7 +413,7 @@ public: * @return True if the directory exists, false if not. */ virtual bool isDirectoryExist(const std::string& dirPath) const; - + /** * Creates a directory. * @@ -378,7 +421,7 @@ public: * @return True if the directory have been created successfully, false if not. */ virtual bool createDirectory(const std::string& dirPath); - + /** * Removes a directory. * @@ -386,7 +429,7 @@ public: * @return True if the directory have been removed successfully, false if not. */ virtual bool removeDirectory(const std::string& dirPath); - + /** * Removes a file. * @@ -394,7 +437,7 @@ public: * @return True if the file have been removed successfully, false if not. */ virtual bool removeFile(const std::string &filepath); - + /** * Renames a file under the given directory. * @@ -404,7 +447,7 @@ public: * @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); - + /** * Retrieve the file size. * @@ -422,7 +465,7 @@ protected: * The default constructor. */ FileUtils(); - + /** * Initializes the instance of FileUtils. It will set _searchPathArray and _searchResolutionsOrderArray to default values. * @@ -432,7 +475,7 @@ protected: * */ virtual bool init(); - + /** * Gets the new filename from the filename lookup dictionary. * It is possible to have a override names. @@ -441,21 +484,21 @@ protected: * If the original filename wasn't in the dictionary, it will return the original filename. */ virtual std::string getNewFilename(const std::string &filename) const; - + /** * Checks whether a file exists without considering search paths and resolution orders. * @param filename The file (with absolute path) to look up for * @return Returns true if the file found at the given absolute path, otherwise returns false */ virtual bool isFileExistInternal(const std::string& filename) const = 0; - + /** * 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; - + /** * Gets full path for filename, resolution directory and search path. * @@ -465,7 +508,7 @@ protected: * @return The full path of the file. It will return an empty string if the full path of the file doesn't exist. */ virtual std::string getPathForFilename(const std::string& filename, const std::string& resolutionDirectory, const std::string& searchPath) const; - + /** * Gets full path for the directory and the filename. * @@ -477,7 +520,7 @@ protected: * @return The full path of the file, if the file can't be found, it will return an empty string. */ virtual std::string getFullPathForDirectoryAndFilename(const std::string& directory, const std::string& filename) const; - + /** Dictionary used to lookup filenames based on a key. * It is used internally by the following methods: * @@ -486,19 +529,19 @@ protected: * @since v2.1 */ ValueMap _filenameLookupDict; - - /** + + /** * The vector contains resolution folders. * The lower index of the element in this vector, the higher priority for this resolution directory. */ std::vector _searchResolutionsOrderArray; - + /** * The vector contains search paths. * The lower index of the element in this vector, the higher priority for this search path. */ std::vector _searchPathArray; - + /** * The default root path of resources. * If the default root path of resources needs to be changed, do it in the `init` method of FileUtils's subclass. @@ -507,13 +550,13 @@ protected: * Similarly on Blackberry, we assign "app/native/Resources/" to this variable in FileUtilsBlackberry::init(). */ std::string _defaultResRootPath; - + /** - * The full path cache. When a file is found, it will be added into this cache. + * The full path cache. When a file is found, it will be added into this cache. * This variable is used for improving the performance of file search. */ mutable std::unordered_map _fullPathCache; - + /** * Writable path. */ @@ -523,7 +566,7 @@ protected: * The singleton pointer of FileUtils. */ static FileUtils* s_sharedFileUtils; - + }; // end of support group diff --git a/cocos/platform/android/CCFileUtils-android.cpp b/cocos/platform/android/CCFileUtils-android.cpp index dc35d757aa..265380f3f2 100644 --- a/cocos/platform/android/CCFileUtils-android.cpp +++ b/cocos/platform/android/CCFileUtils-android.cpp @@ -86,7 +86,7 @@ bool FileUtilsAndroid::init() { _defaultResRootPath = "assets/"; } - + return FileUtils::init(); } @@ -130,7 +130,7 @@ std::string FileUtilsAndroid::getNewFilename(const std::string &filename) const } idx = pos + 1; } - + if (change) { newFileName.clear(); @@ -155,7 +155,7 @@ bool FileUtilsAndroid::isFileExistInternal(const std::string& strFilePath) const } bool bFound = false; - + // Check whether file exists in apk. if (strFilePath[0] != '/') { @@ -206,7 +206,7 @@ Data FileUtilsAndroid::getData(const std::string& filename, bool forString) { return Data::Null; } - + unsigned char* data = nullptr; ssize_t size = 0; string fullPath = fullPathForFilename(filename); @@ -271,7 +271,7 @@ Data FileUtilsAndroid::getData(const std::string& filename, bool forString) FILE *fp = fopen(fullPath.c_str(), mode); CC_BREAK_IF(!fp); - + long fileSize; fseek(fp,0,SEEK_END); fileSize = ftell(fp); @@ -287,11 +287,11 @@ Data FileUtilsAndroid::getData(const std::string& filename, bool forString) } fileSize = fread(data,sizeof(unsigned char), fileSize,fp); fclose(fp); - + size = fileSize; } while (0); } - + Data ret; if (data == nullptr || size == 0) { @@ -317,21 +317,21 @@ std::string FileUtilsAndroid::getStringFromFile(const std::string& filename) std::string ret((const char*)data.getBytes()); return ret; } - + Data FileUtilsAndroid::getDataFromFile(const std::string& filename) { return getData(filename, false); } unsigned char* FileUtilsAndroid::getFileData(const std::string& filename, const char* mode, ssize_t * size) -{ +{ unsigned char * data = 0; - + if ( filename.empty() || (! mode) ) { return 0; } - + string fullPath = fullPathForFilename(filename); cocosplay::updateAssets(fullPath); @@ -383,7 +383,7 @@ unsigned char* FileUtilsAndroid::getFileData(const std::string& filename, const //CCLOG("GETTING FILE ABSOLUTE DATA: %s", filename); FILE *fp = fopen(fullPath.c_str(), mode); CC_BREAK_IF(!fp); - + long fileSize; fseek(fp,0,SEEK_END); fileSize = ftell(fp); @@ -391,14 +391,14 @@ unsigned char* FileUtilsAndroid::getFileData(const std::string& filename, const data = (unsigned char*) malloc(fileSize); fileSize = fread(data,sizeof(unsigned char), fileSize,fp); fclose(fp); - + if (size) { *size = fileSize; } } while (0); } - + if (! data) { std::string msg = "Get data from file("; diff --git a/cocos/platform/apple/CCFileUtils-apple.mm b/cocos/platform/apple/CCFileUtils-apple.mm index a12f4f7966..e56b5a2e8b 100644 --- a/cocos/platform/apple/CCFileUtils-apple.mm +++ b/cocos/platform/apple/CCFileUtils-apple.mm @@ -439,9 +439,9 @@ ValueMap FileUtilsApple::getValueMapFromData(const char* filedata, int filesize) NSPropertyListFormat format; NSError* error; NSDictionary* dict = [NSPropertyListSerialization propertyListWithData:file options:NSPropertyListImmutable format:&format error:&error]; - + ValueMap ret; - + if (dict != nil) { for (id key in [dict allKeys]) @@ -455,21 +455,41 @@ ValueMap FileUtilsApple::getValueMapFromData(const char* filedata, int filesize) bool FileUtilsApple::writeToFile(ValueMap& dict, const std::string &fullPath) { + return writeValueMapToFile(dict, fullPath); +} + +bool FileUtils::writeValueMapToFile(ValueMap& dict, const std::string& fullPath) +{ + //CCLOG("iOS||Mac Dictionary %d write to file %s", dict->_ID, fullPath.c_str()); NSMutableDictionary *nsDict = [NSMutableDictionary dictionary]; - + for (auto iter = dict.begin(); iter != dict.end(); ++iter) { addObjectToNSDict(iter->first, iter->second, nsDict); } - + NSString *file = [NSString stringWithUTF8String:fullPath.c_str()]; // do it atomically [nsDict writeToFile:file atomically:YES]; - + return true; } +bool FileUtils::writeValueVectorToFile(ValueVector vecData, const std::string& fullPath) +{ + NSString* path = [NSString stringWithUTF8String:fullPath.c_str()]; + NSMutableArray* array = [NSMutableArray array]; + + for (const auto &e : vecData) + { + addObjectToNSArray(e, array); + } + + [array writeToFile:path atomically:YES]; + + return true; +} ValueVector FileUtilsApple::getValueVectorFromFile(const std::string& filename) { // NSString* pPath = [NSString stringWithUTF8String:pFileName]; diff --git a/cocos/platform/linux/CCFileUtils-linux.cpp b/cocos/platform/linux/CCFileUtils-linux.cpp index 70136decd9..f2d7335af2 100644 --- a/cocos/platform/linux/CCFileUtils-linux.cpp +++ b/cocos/platform/linux/CCFileUtils-linux.cpp @@ -116,7 +116,7 @@ bool FileUtilsLinux::isFileExistInternal(const std::string& strFilePath) const { // Not absolute path, add the default root path at the beginning. strPath.insert(0, _defaultResRootPath); } - + struct stat sts; return (stat(strPath.c_str(), &sts) != -1) ? true : false; } diff --git a/cocos/platform/win32/CCFileUtils-win32.cpp b/cocos/platform/win32/CCFileUtils-win32.cpp index c14c748563..31bccff666 100644 --- a/cocos/platform/win32/CCFileUtils-win32.cpp +++ b/cocos/platform/win32/CCFileUtils-win32.cpp @@ -105,7 +105,7 @@ bool FileUtilsWin32::isFileExistInternal(const std::string& strFilePath) const { return false; } - + std::string strPath = strFilePath; if (!isAbsolutePath(strPath)) { // Not absolute path, add the default root path at the beginning. @@ -123,7 +123,7 @@ bool FileUtilsWin32::isFileExistInternal(const std::string& strFilePath) const bool FileUtilsWin32::isAbsolutePath(const std::string& strPath) const { - if ( (strPath.length() > 2 + if ( (strPath.length() > 2 && ( (strPath[0] >= 'a' && strPath[0] <= 'z') || (strPath[0] >= 'A' && strPath[0] <= 'Z') ) && strPath[1] == ':') || (strPath[0] == '/' && strPath[1] == '/')) { @@ -139,9 +139,9 @@ static bool checkFileName(const std::string& fullPath, const std::string& filena size_t len = tmpPath.length(); size_t nl = filename.length(); std::string realName; - + while (tmpPath.length() >= len - nl && tmpPath.length()>2) - { + { //CCLOG("%s", tmpPath.c_str()); WIN32_FIND_DATAA data; HANDLE h = FindFirstFileA(tmpPath.c_str(), &data); @@ -158,7 +158,7 @@ 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()); return false; } @@ -174,7 +174,7 @@ static bool checkFileName(const std::string& fullPath, const std::string& filena tmpPath = tmpPath.substr(0, tmpPath.rfind("/")); } while (tmpPath.back() == '.'); } - return true; + return true; } static Data getData(const std::string& filename, bool forString) @@ -200,7 +200,7 @@ static Data getData(const std::string& filename, bool forString) HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE); - + size = ::GetFileSize(fileHandle, nullptr); if (forString) @@ -224,10 +224,10 @@ static Data getData(const std::string& filename, bool forString) { free(buffer); buffer = nullptr; - } + } } } while (0); - + Data ret; if (buffer == nullptr || size == 0) @@ -254,15 +254,15 @@ static Data getData(const std::string& filename, bool forString) std::string FileUtilsWin32::getStringFromFile(const std::string& filename) { Data data = getData(filename, true); - if (data.isNull()) - { - return ""; - } + if (data.isNull()) + { + return ""; + } std::string ret((const char*)data.getBytes()); return ret; } - + Data FileUtilsWin32::getDataFromFile(const std::string& filename) { return getData(filename, false); @@ -285,7 +285,7 @@ unsigned char* FileUtilsWin32::getFileData(const std::string& filename, const ch HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, nullptr); CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE); - + *size = ::GetFileSize(fileHandle, nullptr); pBuffer = (unsigned char*) malloc(*size); @@ -300,7 +300,7 @@ unsigned char* FileUtilsWin32::getFileData(const std::string& filename, const ch pBuffer = nullptr; } } while (0); - + if (! pBuffer) { std::string msg = "Get data from file("; @@ -328,7 +328,7 @@ std::string FileUtilsWin32::getFullPathForDirectoryAndFilename(const std::string { std::string unixDirectory = convertPathFormatToUnixStyle(strDirectory); std::string unixFilename = convertPathFormatToUnixStyle(strFilename); - + return FileUtils::getFullPathForDirectoryAndFilename(unixDirectory, unixFilename); } diff --git a/cocos/platform/winrt/CCFileUtilsWinRT.cpp b/cocos/platform/winrt/CCFileUtilsWinRT.cpp index 897d999f86..4b8c68a593 100644 --- a/cocos/platform/winrt/CCFileUtilsWinRT.cpp +++ b/cocos/platform/winrt/CCFileUtilsWinRT.cpp @@ -52,8 +52,8 @@ static void _checkPath() { if (s_pszResourcePath.empty()) { - // TODO: needs to be tested - s_pszResourcePath = convertPathFormatToUnixStyle(CCFileUtilsWinRT::getAppPath() + '\\' + "Assets\\Resources" + '\\'); + // TODO: needs to be tested + s_pszResourcePath = convertPathFormatToUnixStyle(CCFileUtilsWinRT::getAppPath() + '\\' + "Assets\\Resources" + '\\'); } } @@ -123,7 +123,7 @@ bool CCFileUtilsWinRT::isFileExistInternal(const std::string& strFilePath) const bool CCFileUtilsWinRT::isAbsolutePath(const std::string& strPath) const { - if ( strPath.length() > 2 + if ( strPath.length() > 2 && ( (strPath[0] >= 'a' && strPath[0] <= 'z') || (strPath[0] >= 'A' && strPath[0] <= 'Z') ) && strPath[1] == ':') { @@ -138,13 +138,13 @@ static Data getData(const std::string& filename, bool forString) { CCASSERT(!filename.empty(), "Invalid filename!"); } - + Data ret; unsigned char* buffer = nullptr; ssize_t size = 0; const char* mode = nullptr; mode = "rb"; - + do { // Read the file from hardware @@ -154,7 +154,7 @@ static Data getData(const std::string& filename, bool forString) fseek(fp,0,SEEK_END); size = ftell(fp); fseek(fp,0,SEEK_SET); - + if (forString) { buffer = (unsigned char*)malloc(sizeof(unsigned char) * (size + 1)); @@ -164,11 +164,11 @@ static Data getData(const std::string& filename, bool forString) { buffer = (unsigned char*)malloc(sizeof(unsigned char) * size); } - + size = fread(buffer, sizeof(unsigned char), size, fp); fclose(fp); } while (0); - + if (nullptr == buffer || 0 == size) { std::string msg = "Get data from file("; @@ -179,31 +179,31 @@ static Data getData(const std::string& filename, bool forString) { ret.fastSet(buffer, size); } - + return ret; } std::string CCFileUtilsWinRT::getStringFromFile(const std::string& filename) { Data data = getData(filename, true); - if (data.isNull()) - { - return ""; - } + if (data.isNull()) + { + return ""; + } std::string ret((const char*)data.getBytes()); return ret; } string CCFileUtilsWinRT::getWritablePath() const { - auto localFolderPath = Windows::Storage::ApplicationData::Current->LocalFolder->Path; - return convertPathFormatToUnixStyle(std::string(PlatformStringToString(localFolderPath)) + '\\'); + auto localFolderPath = Windows::Storage::ApplicationData::Current->LocalFolder->Path; + return convertPathFormatToUnixStyle(std::string(PlatformStringToString(localFolderPath)) + '\\'); } string CCFileUtilsWinRT::getAppPath() { - Windows::ApplicationModel::Package^ package = Windows::ApplicationModel::Package::Current; - return convertPathFormatToUnixStyle(std::string(PlatformStringToString(package->InstalledLocation->Path))); + Windows::ApplicationModel::Package^ package = Windows::ApplicationModel::Package::Current; + return convertPathFormatToUnixStyle(std::string(PlatformStringToString(package->InstalledLocation->Path))); } NS_CC_END diff --git a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp index c846ad92e6..b21c4c7ad9 100644 --- a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp +++ b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.cpp @@ -11,6 +11,10 @@ FileUtilsTests::FileUtilsTests() ADD_TEST_CASE(TestFileFuncs); ADD_TEST_CASE(TestDirectoryFuncs); ADD_TEST_CASE(TextWritePlist); + ADD_TEST_CASE(TestWriteString); + ADD_TEST_CASE(TestWriteData); + ADD_TEST_CASE(TestWriteValueMap); + ADD_TEST_CASE(TestWriteValueVector); } // TestResolutionDirectories @@ -21,13 +25,13 @@ void TestResolutionDirectories::onEnter() auto sharedFileUtils = FileUtils::getInstance(); std::string ret; - + sharedFileUtils->purgeCachedEntries(); _defaultSearchPathArray = sharedFileUtils->getSearchPaths(); std::vector searchPaths = _defaultSearchPathArray; searchPaths.insert(searchPaths.begin(), "Misc"); sharedFileUtils->setSearchPaths(searchPaths); - + _defaultResolutionsOrderArray = sharedFileUtils->getSearchResolutionsOrder(); std::vector resolutionsOrder = _defaultResolutionsOrderArray; @@ -37,9 +41,9 @@ void TestResolutionDirectories::onEnter() resolutionsOrder.insert(resolutionsOrder.begin()+3, "resources-wide"); resolutionsOrder.insert(resolutionsOrder.begin()+4, "resources-hd"); resolutionsOrder.insert(resolutionsOrder.begin()+5, "resources-iphone"); - + sharedFileUtils->setSearchResolutionsOrder(resolutionsOrder); - + for( int i=1; i<7; i++) { auto filename = String::createWithFormat("test%d.txt", i); ret = sharedFileUtils->fullPathForFilename(filename->getCString()); @@ -50,9 +54,9 @@ void TestResolutionDirectories::onEnter() void TestResolutionDirectories::onExit() { auto sharedFileUtils = FileUtils::getInstance(); - - // reset search path - sharedFileUtils->setSearchPaths(_defaultSearchPathArray); + + // reset search path + sharedFileUtils->setSearchPaths(_defaultSearchPathArray); sharedFileUtils->setSearchResolutionsOrder(_defaultResolutionsOrderArray); FileUtilsDemo::onExit(); } @@ -73,9 +77,9 @@ void TestSearchPath::onEnter() { FileUtilsDemo::onEnter(); auto sharedFileUtils = FileUtils::getInstance(); - + std::string ret; - + sharedFileUtils->purgeCachedEntries(); _defaultSearchPathArray = sharedFileUtils->getSearchPaths(); std::vector searchPaths = _defaultSearchPathArray; @@ -91,24 +95,24 @@ void TestSearchPath::onEnter() if (ret != 0) log("Writing file to writable path succeed."); } - + searchPaths.insert(searchPaths.begin(), writablePath); searchPaths.insert(searchPaths.begin()+1, "Misc/searchpath1"); searchPaths.insert(searchPaths.begin()+2, "Misc/searchpath2"); sharedFileUtils->setSearchPaths(searchPaths); - + _defaultResolutionsOrderArray = sharedFileUtils->getSearchResolutionsOrder(); std::vector resolutionsOrder = _defaultResolutionsOrderArray; - + resolutionsOrder.insert(resolutionsOrder.begin(), "resources-ipad"); 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()); } - + // Gets external.txt from writable path std::string fullPath = sharedFileUtils->fullPathForFilename("external.txt"); log("external file path = %s", fullPath.c_str()); @@ -128,10 +132,10 @@ void TestSearchPath::onEnter() void TestSearchPath::onExit() { - FileUtils *sharedFileUtils = FileUtils::getInstance(); + FileUtils *sharedFileUtils = FileUtils::getInstance(); - // reset search path - sharedFileUtils->setSearchPaths(_defaultSearchPathArray); + // reset search path + sharedFileUtils->setSearchPaths(_defaultSearchPathArray); sharedFileUtils->setSearchResolutionsOrder(_defaultResolutionsOrderArray); FileUtilsDemo::onExit(); } @@ -151,31 +155,31 @@ std::string TestSearchPath::subtitle() const void TestFilenameLookup::onEnter() { FileUtilsDemo::onEnter(); - + auto sharedFileUtils = FileUtils::getInstance(); ValueMap dict; dict["grossini.bmp"] = Value("Images/grossini.png"); dict["grossini.xcf"] = Value("Images/grossini.png"); - + sharedFileUtils->setFilenameLookupDictionary(dict); - + // Instead of loading carlitos.xcf, it will load grossini.png auto sprite = Sprite::create("grossini.xcf"); this->addChild(sprite); - + auto s = Director::getInstance()->getWinSize(); sprite->setPosition(s.width/2, s.height/2); } void TestFilenameLookup::onExit() { - - FileUtils *sharedFileUtils = FileUtils::getInstance(); - - // reset filename lookup + + FileUtils *sharedFileUtils = FileUtils::getInstance(); + + // reset filename lookup sharedFileUtils->setFilenameLookupDictionary(ValueMap()); - + FileUtilsDemo::onExit(); } @@ -191,16 +195,16 @@ void TestIsFileExist::onEnter() FileUtilsDemo::onEnter(); auto s = Director::getInstance()->getWinSize(); auto sharedFileUtils = FileUtils::getInstance(); - + Label* label = nullptr; bool isExist = false; - + isExist = sharedFileUtils->isFileExist("Images/grossini.png"); - + label = Label::createWithSystemFont(isExist ? "Images/grossini.png exists" : "Images/grossini.png doesn't exist", "", 20); label->setPosition(s.width/2, s.height/3); this->addChild(label); - + isExist = sharedFileUtils->isFileExist("Images/grossini.xcf"); label = Label::createWithSystemFont(isExist ? "Images/grossini.xcf exists" : "Images/grossini.xcf doesn't exist", "", 20); label->setPosition(s.width/2, s.height/3*2); @@ -209,12 +213,12 @@ void TestIsFileExist::onEnter() void TestIsFileExist::onExit() { - - FileUtils *sharedFileUtils = FileUtils::getInstance(); - - // reset filename lookup + + FileUtils *sharedFileUtils = FileUtils::getInstance(); + + // reset filename lookup sharedFileUtils->setFilenameLookupDictionary(ValueMap()); - + FileUtilsDemo::onExit(); } @@ -235,42 +239,42 @@ void TestFileFuncs::onEnter() FileUtilsDemo::onEnter(); auto s = Director::getInstance()->getWinSize(); auto sharedFileUtils = FileUtils::getInstance(); - + int x = s.width/2, y = s.height/5; Label* label = nullptr; - + std::string filename = "__test.test"; std::string filename2 = "__newtest.test"; std::string filepath = sharedFileUtils->getWritablePath() + filename; std::string content = "Test string content to put into created file"; std::string msg; - + FILE *out = fopen(filepath.c_str(), "w"); fputs(content.c_str(), out); fclose(out); - + // Check whether file can be created if (sharedFileUtils->isFileExist(filepath)) { label = Label::createWithSystemFont("Test file '__test.test' created", "", 20); label->setPosition(x, y * 4); this->addChild(label); - + // getFileSize Test long size = sharedFileUtils->getFileSize(filepath); msg = StringUtils::format("getFileSize: Test file size equals %ld", size); label = Label::createWithSystemFont(msg, "", 20); label->setPosition(x, y * 3); this->addChild(label); - + // renameFile Test if (sharedFileUtils->renameFile(sharedFileUtils->getWritablePath(), filename, filename2)) { label = Label::createWithSystemFont("renameFile: Test file renamed to '__newtest.test'", "", 20); label->setPosition(x, y * 2); this->addChild(label); - + // removeFile Test filepath = sharedFileUtils->getWritablePath() + filename2; if (sharedFileUtils->removeFile(filepath)) @@ -318,16 +322,16 @@ void TestDirectoryFuncs::onEnter() FileUtilsDemo::onEnter(); auto s = Director::getInstance()->getWinSize(); auto sharedFileUtils = FileUtils::getInstance(); - + int x = s.width/2, y = s.height/4; Label* label = nullptr; - + std::string dir = sharedFileUtils->getWritablePath() + "__test/"; std::string subDir = "dir1/dir2"; std::string msg; bool ok; - + // Check whether dir can be created ok = sharedFileUtils->createDirectory(dir); if (ok && sharedFileUtils->isDirectoryExist(dir)) @@ -336,7 +340,7 @@ void TestDirectoryFuncs::onEnter() label = Label::createWithSystemFont(msg, "", 20); label->setPosition(x, y * 3); this->addChild(label); - + // Create sub directories recursively ok = sharedFileUtils->createDirectory(dir + subDir); if (ok && sharedFileUtils->isDirectoryExist(dir + subDir)) @@ -353,7 +357,7 @@ void TestDirectoryFuncs::onEnter() label->setPosition(x, y * 2); this->addChild(label); } - + // Remove directory ok = sharedFileUtils->removeDirectory(dir); if (ok && !sharedFileUtils->isDirectoryExist(dir)) @@ -390,7 +394,7 @@ std::string TestDirectoryFuncs::subtitle() const return ""; } -// TestWritePlist +// TextWritePlist void TextWritePlist::onEnter() { @@ -398,46 +402,46 @@ void TextWritePlist::onEnter() auto root = Dictionary::create(); auto string = String::create("string element value"); root->setObject(string, "string element key"); - + 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"); array->addObject(dictInArray); - + 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")); array->addObject(arrayInArray); - + root->setObject(array, "array"); - + 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); dictInDict->setObject(booleanObject, "bool"); - + //add interger to the plist auto intObject = Integer::create(1024); dictInDict->setObject(intObject, "integer"); - + //add float to the plist auto floatObject = Float::create(1024.1024f); dictInDict->setObject(floatObject, "float"); - + //add double to the plist auto doubleObject = Double::create(1024.123); dictInDict->setObject(doubleObject, "double"); - - - + + + root->setObject(dictInDict, "dictInDict, Hello World"); - + // end with / std::string writablePath = FileUtils::getInstance()->getWritablePath(); std::string fullPath = writablePath + "text.plist"; @@ -445,12 +449,12 @@ void TextWritePlist::onEnter() log("see the plist file at %s", fullPath.c_str()); else log("write plist file failed"); - + auto label = Label::createWithTTF(fullPath.c_str(), "fonts/Thonburi.ttf", 6); this->addChild(label); auto winSize = Director::getInstance()->getWinSize(); label->setPosition(winSize.width/2, winSize.height/3); - + auto loadDict = __Dictionary::createWithContentsOfFile(fullPath.c_str()); auto loadDictInDict = (__Dictionary*)loadDict->objectForKey("dictInDict, Hello World"); auto boolValue = (__String*)loadDictInDict->objectForKey("bool"); @@ -479,3 +483,321 @@ std::string TextWritePlist::subtitle() const std::string writablePath = FileUtils::getInstance()->getWritablePath().c_str(); return ("See plist file at your writablePath"); } + +void TestWriteString::onEnter() +{ + FileUtilsDemo::onEnter(); + + auto winSize = Director::getInstance()->getWinSize(); + + auto writeResult = Label::createWithTTF("show writeResult", "fonts/Thonburi.ttf", 18); + this->addChild(writeResult); + writeResult->setPosition(winSize.width / 2, winSize.height * 3 / 4); + + auto readResult = Label::createWithTTF("show readResult", "fonts/Thonburi.ttf", 18); + this->addChild(readResult); + readResult->setPosition(winSize.width / 2, winSize.height / 3); + + std::string writablePath = FileUtils::getInstance()->getWritablePath(); + std::string fileName = "writeStringTest.txt"; + + // writeTest + std::string writeDataStr = "the string data will be write into a file"; + std::string fullPath = writablePath + fileName; + if (FileUtils::getInstance()->writeStringToFile(writeDataStr, fullPath.c_str())) + { + log("see the plist file at %s", fullPath.c_str()); + writeResult->setString("write success:" + writeDataStr); + } + else + { + log("write plist file failed"); + writeResult->setString("write fail"); + } + + // readTest + std::string readDataStr = FileUtils::getInstance()->getStringFromFile(fullPath); + readResult->setString("read success:" + readDataStr); +} + +void TestWriteString::onExit() +{ + FileUtilsDemo::onExit(); +} + +std::string TestWriteString::title() const +{ + return "FileUtils: TestWriteString to files"; +} + +std::string TestWriteString::subtitle() const +{ + return ""; +} + +void TestWriteData::onEnter() +{ + FileUtilsDemo::onEnter(); + + auto winSize = Director::getInstance()->getWinSize(); + + auto writeResult = Label::createWithTTF("show writeResult", "fonts/Thonburi.ttf", 18); + this->addChild(writeResult); + writeResult->setPosition(winSize.width / 2, winSize.height * 3 / 4); + + auto readResult = Label::createWithTTF("show readResult", "fonts/Thonburi.ttf", 18); + this->addChild(readResult); + readResult->setPosition(winSize.width / 2, winSize.height / 3); + + std::string writablePath = FileUtils::getInstance()->getWritablePath(); + std::string fileName = "writeDataTest.txt"; + + // writeTest + std::string writeDataStr = "the binary data will be write into a file"; + Data writeData; + writeData.copy((unsigned char *)writeDataStr.c_str(), writeDataStr.size()); + std::string fullPath = writablePath + fileName; + if (FileUtils::getInstance()->writeDataToFile(writeData, fullPath.c_str())) + { + log("see the plist file at %s", fullPath.c_str()); + writeResult->setString("write success:" + writeDataStr); + } + else + { + log("write plist file failed"); + writeResult->setString("write fail"); + } + + // readTest + unsigned char* buffer = nullptr; + Data readData = FileUtils::getInstance()->getDataFromFile(fullPath); + buffer = (unsigned char*)malloc(sizeof(unsigned char) * (readData.getSize() + 1)); + memcpy(buffer, readData.getBytes(), readData.getSize()); + buffer[readData.getSize()] = '\0'; + std::string readDataStr((const char*)buffer); + free(buffer); + + readResult->setString("read success:" + readDataStr); +} + +void TestWriteData::onExit() +{ + FileUtilsDemo::onExit(); +} + +std::string TestWriteData::title() const +{ + return "FileUtils: TestWriteData to files"; +} + +std::string TestWriteData::subtitle() const +{ + return ""; +} + +void TestWriteValueMap::onEnter() +{ + FileUtilsDemo::onEnter(); + + auto winSize = Director::getInstance()->getWinSize(); + + auto writeResult = Label::createWithTTF("show writeResult", "fonts/Thonburi.ttf", 18); + this->addChild(writeResult); + writeResult->setPosition(winSize.width / 2, winSize.height * 3 / 4); + + auto readResult = Label::createWithTTF("show readResult", "fonts/Thonburi.ttf", 18); + this->addChild(readResult); + readResult->setPosition(winSize.width / 2, winSize.height / 3); + + ValueMap valueMap; + + ValueMap mapInValueMap; + mapInValueMap["string1"] = "string in dictInMap key 0"; + mapInValueMap["string2"] = "string in dictInMap key 1"; + valueMap["data0"] = Value(mapInValueMap); + + valueMap["data1"] = Value("string in array"); + + ValueVector arrayInMap; + arrayInMap.push_back(Value("string 0 in arrayInMap")); + arrayInMap.push_back(Value("string 1 in arrayInMap")); + valueMap["data2"] = arrayInMap; + + //add boolean to the plist + auto booleanObject = Value(true); + valueMap["data3"] = booleanObject; + + //add interger to the plist + auto intObject = Value(1024); + valueMap["data4"] = intObject; + + //add float to the plist + auto floatObject = Value(1024.1024f); + valueMap["data5"] = floatObject; + + //add double to the plist + auto doubleObject = Value(1024.123); + valueMap["data6"] = doubleObject; + + + // end with / + std::string writablePath = FileUtils::getInstance()->getWritablePath(); + std::string fullPath = writablePath + "testWriteValueMap.plist"; + if (FileUtils::getInstance()->writeValueMapToFile(valueMap, fullPath.c_str())) + { + log("see the plist file at %s", fullPath.c_str()); + writeResult->setString("write success"); + } + else + { + log("write plist file failed"); + writeResult->setString("write failed"); + } + + ValueMap readValueMap = FileUtils::getInstance()->getValueMapFromFile(fullPath.c_str()); + std::string readDataStr = "read data:\n"; + // read value map data + ValueMap readMapInMap = readValueMap["data0"].asValueMap(); + readDataStr += " mapValue:[\"string1\"][" + readMapInMap["string1"].asString() + "]\n"; + readDataStr += " mapValue:[\"string2\"][" + readMapInMap["string2"].asString() + "]\n"; + + // read string data + readDataStr += " stringValue:" + readValueMap["data1"].asString() + "\n"; + + // read value vector data + ValueVector readVectorInMap = readValueMap["data2"].asValueVector(); + readDataStr += " vectorValue:[1]" + readVectorInMap.at(0).asString() + "\n"; + readDataStr += " vectorValue:[2]" + readVectorInMap.at(1).asString() + "\n"; + + // read bool data + readDataStr += " boolValue:" + StringUtils::format("%d", readValueMap["data3"].asBool()) + "\n"; + + // read int data + readDataStr += " intValue:" + StringUtils::format("%d", readValueMap["data4"].asInt()) + "\n"; + + // read float data + readDataStr += " floatValue:" + StringUtils::format("%f", readValueMap["data5"].asFloat()) + "\n"; + + // read double data + readDataStr += " doubleValue:" + StringUtils::format("%f", readValueMap["data6"].asDouble()) + "\n"; + + readResult->setString(readDataStr); +} +void TestWriteValueMap::onExit() +{ + FileUtilsDemo::onExit(); +} + +std::string TestWriteValueMap::title() const +{ + return "FileUtils: TestWriteValueMap to files"; +} + +std::string TestWriteValueMap::subtitle() const +{ + return ""; +} + +void TestWriteValueVector::onEnter() +{ + FileUtilsDemo::onEnter(); + + auto winSize = Director::getInstance()->getWinSize(); + + auto writeResult = Label::createWithTTF("show writeResult", "fonts/Thonburi.ttf", 18); + this->addChild(writeResult); + writeResult->setPosition(winSize.width / 2, winSize.height * 3 / 4); + + auto readResult = Label::createWithTTF("show readResult", "fonts/Thonburi.ttf", 18); + this->addChild(readResult); + readResult->setPosition(winSize.width / 2, winSize.height / 3); + + ValueVector array; + + ValueMap mapInArray; + mapInArray["string1"] = "string in dictInArray key 0"; + mapInArray["string2"] = "string in dictInArray key 1"; + array.push_back(Value(mapInArray)); + + array.push_back(Value("string in array")); + + ValueVector arrayInArray; + arrayInArray.push_back(Value("string 0 in arrayInArray")); + arrayInArray.push_back(Value("string 1 in arrayInArray")); + array.push_back(Value(arrayInArray)); + + //add boolean to the plist + auto booleanObject = Value(true); + array.push_back(booleanObject); + + //add interger to the plist + auto intObject = Value(1024); + array.push_back(intObject); + + //add float to the plist + auto floatObject = Value(1024.1024f); + array.push_back(floatObject); + + //add double to the plist + auto doubleObject = Value(1024.123); + array.push_back(doubleObject); + + + // end with / + std::string writablePath = FileUtils::getInstance()->getWritablePath(); + std::string fullPath = writablePath + "testWriteValueVector.plist"; + if (FileUtils::getInstance()->writeValueVectorToFile(array, fullPath.c_str())) + { + log("see the plist file at %s", fullPath.c_str()); + writeResult->setString("write success"); + } + else + { + log("write plist file failed"); + writeResult->setString("write failed"); + } + + ValueVector readArray = FileUtils::getInstance()->getValueVectorFromFile(fullPath.c_str()); + std::string readDataStr = "read data:\n"; + // read value map data + ValueMap readMapInArray = readArray.at(0).asValueMap(); + readDataStr += " mapValue:[\"string1\"][" + readMapInArray["string1"].asString() + "]\n"; + readDataStr += " mapValue:[\"string2\"][" + readMapInArray["string2"].asString() + "]\n"; + + // read string data + readDataStr += " stringValue:" + readArray.at(1).asString() + "\n"; + + // read value vector data + ValueVector readVectorInArray = readArray.at(2).asValueVector(); + readDataStr += " vectorValue:[1]" + readVectorInArray.at(0).asString() + "\n"; + readDataStr += " vectorValue:[2]" + readVectorInArray.at(1).asString() + "\n"; + + // read bool data + readDataStr += " boolValue:" + StringUtils::format("%d", readArray.at(3).asBool()) + "\n"; + + // read int data + readDataStr += " intValue:" + StringUtils::format("%d", readArray.at(4).asInt()) + "\n"; + + // read float data + readDataStr += " floatValue:" + StringUtils::format("%f", readArray.at(5).asFloat()) + "\n"; + + // read double data + readDataStr += " doubleValue:" + StringUtils::format("%f", readArray.at(6).asDouble()) + "\n"; + + readResult->setString(readDataStr); +} + +void TestWriteValueVector::onExit() +{ + FileUtilsDemo::onExit(); +} + +std::string TestWriteValueVector::title() const +{ + return "FileUtils: TestWriteValueVector to files"; +} + +std::string TestWriteValueVector::subtitle() const +{ + return ""; +} diff --git a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.h b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.h index 96e44bbecc..b177ed0755 100644 --- a/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.h +++ b/tests/cpp-tests/Classes/FileUtilsTest/FileUtilsTest.h @@ -64,7 +64,7 @@ class TestFileFuncs : public FileUtilsDemo { public: CREATE_FUNC(TestFileFuncs); - + virtual void onEnter() override; virtual std::string title() const override; virtual std::string subtitle() const override; @@ -74,7 +74,7 @@ class TestDirectoryFuncs : public FileUtilsDemo { public: CREATE_FUNC(TestDirectoryFuncs); - + virtual void onEnter() override; virtual std::string title() const override; virtual std::string subtitle() const override; @@ -91,4 +91,47 @@ public: virtual std::string subtitle() const override; }; +class TestWriteString : public FileUtilsDemo +{ +public: + CREATE_FUNC(TestWriteString); + + virtual void onEnter() override; + virtual void onExit() override; + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; + +class TestWriteData : public FileUtilsDemo +{ +public: + CREATE_FUNC(TestWriteData); + + virtual void onEnter() override; + virtual void onExit() override; + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; + +class TestWriteValueMap : public FileUtilsDemo +{ +public: + CREATE_FUNC(TestWriteValueMap); + + virtual void onEnter() override; + virtual void onExit() override; + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; + +class TestWriteValueVector : public FileUtilsDemo +{ +public: + CREATE_FUNC(TestWriteValueVector); + + virtual void onEnter() override; + virtual void onExit() override; + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; #endif /* __FILEUTILSTEST_H__ */ From 13d00d129d6a1420f350ca5492ae68a1865fe006 Mon Sep 17 00:00:00 2001 From: jianglong0156 Date: Tue, 7 Jul 2015 14:54:31 +0800 Subject: [PATCH 20/83] fix the jsb and lua ini error, ignore writeDataToFile --- tools/tojs/cocos2dx.ini | 2 +- tools/tolua/cocos2dx.ini | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/tojs/cocos2dx.ini b/tools/tojs/cocos2dx.ini index da1e96417d..11837162c1 100644 --- a/tools/tojs/cocos2dx.ini +++ b/tools/tojs/cocos2dx.ini @@ -104,7 +104,7 @@ skip = Node::[^setPosition$ setGLServerState description getUserObject .*UserDat Scheduler::[pause resume ^unschedule$ unscheduleUpdate unscheduleAllForTarget schedule isTargetPaused isScheduled], TextureCache::[addPVRTCImage], *::[copyWith.* onEnter.* onExit.* ^description$ getObjectType onTouch.* onAcc.* onKey.* onRegisterTouchListener operator.+], - FileUtils::[getFileData getDataFromFile setFilenameLookupDictionary destroyInstance getFullPathCache], + FileUtils::[getFileData getDataFromFile writeDataToFile setFilenameLookupDictionary destroyInstance getFullPathCache], Application::[^application.* ^run$ getCurrentLanguageCode setAnimationInterval], Camera::[getEyeXYZ getCenterXYZ getUpXYZ], ccFontDefinition::[*], diff --git a/tools/tolua/cocos2dx.ini b/tools/tolua/cocos2dx.ini index f17ad11f04..3bf6bb9d1c 100644 --- a/tools/tolua/cocos2dx.ini +++ b/tools/tolua/cocos2dx.ini @@ -8,18 +8,18 @@ prefix = cocos2dx target_namespace = cc android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/include -android_flags = -D_SIZE_T_DEFINED_ +android_flags = -D_SIZE_T_DEFINED_ -clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include +clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__ cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/platform/android -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s/external cocos_flags = -DANDROID -cxxgenerator_headers = +cxxgenerator_headers = # extra arguments for clang -extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s +extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s # what headers to parse headers = %(cocosdir)s/cocos/cocos2d.h %(cocosdir)s/cocos/2d/CCProtectedNode.h %(cocosdir)s/cocos/base/CCAsyncTaskPool.h @@ -99,7 +99,7 @@ skip = Node::[setGLServerState description getUserObject .*UserData getGLServerS TextureCache::[addPVRTCImage addImageAsync], Timer::[getSelector createWithScriptHandler], *::[copyWith.* onEnter.* onExit.* ^description$ getObjectType (g|s)etDelegate onTouch.* onAcc.* onKey.* onRegisterTouchListener], - FileUtils::[getFileData getDataFromFile getFullPathCache], + FileUtils::[getFileData getDataFromFile writeDataToFile getFullPathCache], Application::[^application.* ^run$], Camera::[getEyeXYZ getCenterXYZ getUpXYZ], ccFontDefinition::[*], @@ -158,7 +158,7 @@ rename_functions = SpriteFrameCache::[addSpriteFramesWithFile=addSpriteFrames ge rename_classes = ParticleSystemQuad::ParticleSystem # for all class names, should we remove something when registering in the target VM? -remove_prefix = +remove_prefix = # classes for which there will be no "parent" lookup classes_have_no_parents = Director FileUtils TMXMapInfo Application From 3ccfb2f3641daf1acad2512bb983fe885a8b14a2 Mon Sep 17 00:00:00 2001 From: VisualSj Date: Tue, 7 Jul 2015 15:44:42 +0800 Subject: [PATCH 21/83] 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 22/83] 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 23/83] 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 24/83] 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 25/83] 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 26/83] 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 27/83] 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 28/83] 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 7e26c381c6b7cee96287d0354d7bfd1f98ce0be8 Mon Sep 17 00:00:00 2001 From: jianglong0156 Date: Wed, 8 Jul 2015 14:36:37 +0800 Subject: [PATCH 29/83] remove invalid code --- cocos/platform/CCFileUtils.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index ed0960bf93..bef0943878 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -375,7 +375,6 @@ bool FileUtils::writeToFile(ValueMap& dict, const std::string &fullPath) bool FileUtils::writeValueMapToFile(ValueMap& dict, const std::string& fullPath) { - //CCLOG("tinyxml2 Dictionary %d writeToFile %s", dict->_ID, fullPath.c_str()); tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument(); if (nullptr == doc) return false; @@ -416,7 +415,6 @@ bool FileUtils::writeValueMapToFile(ValueMap& dict, const std::string& fullPath) bool FileUtils::writeValueVectorToFile(ValueVector vecData, const std::string& fullPath) { - //CCLOG("tinyxml2 Dictionary %d writeToFile %s", dict->_ID, fullPath.c_str()); tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument(); if (nullptr == doc) return false; From 1f8b46e911266f41f7fd28540142cb22986fb1ee Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Wed, 8 Jul 2015 15:13:48 +0800 Subject: [PATCH 30/83] Fixbug: Need to replace thread unsafe code from TextureCache::addImageAsync. --- cocos/renderer/CCTextureCache.cpp | 317 ++++++++++++++---------------- cocos/renderer/CCTextureCache.h | 27 +-- 2 files changed, 151 insertions(+), 193 deletions(-) diff --git a/cocos/renderer/CCTextureCache.cpp b/cocos/renderer/CCTextureCache.cpp index 446061784e..0146e64b08 100644 --- a/cocos/renderer/CCTextureCache.cpp +++ b/cocos/renderer/CCTextureCache.cpp @@ -61,8 +61,6 @@ TextureCache * TextureCache::getInstance() TextureCache::TextureCache() : _loadingThread(nullptr) -, _asyncStructQueue(nullptr) -, _imageInfoQueue(nullptr) , _needQuit(false) , _asyncRefCount(0) { @@ -96,6 +94,43 @@ std::string TextureCache::getDescription() const return StringUtils::format("", static_cast(_textures.size())); } +struct TextureCache::AsyncStruct +{ +public: + AsyncStruct(const std::string& fn, std::function f) : filename(fn), callback(f), loadSuccess(false) {} + + std::string filename; + std::function callback; + Image image; + bool loadSuccess; +}; + +/** + The addImageAsync logic follow the steps: + - find the image has been add or not, if not add an AsyncStruct to _requestQueue (GL thread) + - get AsyncStruct from _requestQueue, load res and fill image data to AsyncStruct.image, then add AsyncStruct to _responseQueue (Load thread) + - on schedule callback, get AsyncStruct from _responseQueue, convert image to texture, then delete AsyncStruct (GL thread) + + the Critical Area include these members: + - _requestQueue: locked by _requestMutex + - _responseQueue: locked by _responseMutex + + the object's life time: + - AsyncStruct: construct and destruct in GL thread + - image data: new in Load thread, delete in GL thread(by Image instance) + + Note: + - all AsyncStruct referenced in _asyncStructQueue, for unbind function use. + + How to deal add image many times? + - At first, this situation is abnormal, we only ensure the logic is correct. + - If the image has been loaded, the after load image call will return immediately. + - If the image request is in queue already, there will be have more than one request in queue, + - In addImageAsyncCallback, will deduplacated the request to ensure only create one texture. + + Does process all response in addImageAsyncCallback consume more time? + - Convert image to texture faster than load image from disk, so this isn't a problem. + */ void TextureCache::addImageAsync(const std::string &path, const std::function& callback) { Texture2D *texture = nullptr; @@ -119,14 +154,10 @@ void TextureCache::addImageAsync(const std::string &path, const std::function(); - _imageInfoQueue = new (std::nothrow) deque(); - + if (_loadingThread == nullptr) + { // create a new thread to load images _loadingThread = new std::thread(&TextureCache::loadImage, this); - _needQuit = false; } @@ -139,213 +170,151 @@ void TextureCache::addImageAsync(const std::string &path, const std::functionpush_back(data); - _asyncMutex.unlock(); + _asyncStructQueue.push_back(data); + _requestMutex.lock(); + _requestQueue.push_back(data); + _requestMutex.unlock(); _sleepCondition.notify_one(); } void TextureCache::unbindImageAsync(const std::string& filename) { + if (_asyncStructQueue.empty()) + { + return; + } std::string fullpath = FileUtils::getInstance()->fullPathForFilename(filename); - - _asyncMutex.lock(); - - if (_asyncStructQueue && !_asyncStructQueue->empty()) + for (auto it = _asyncStructQueue.begin(); it != _asyncStructQueue.end(); ++it) { - for (auto it = _asyncStructQueue->begin(); it != _asyncStructQueue->end(); ++it) - { - if ((*it)->filename == fullpath) - { - (*it)->callback = nullptr; - } - } - } - - if (_imageInfoQueue && !_imageInfoQueue->empty()) - { - for (auto it = _imageInfoQueue->begin(); it != _imageInfoQueue->end(); ++it) - { - if ((*it)->asyncStruct->filename == fullpath) - { - (*it)->asyncStruct->callback = nullptr; - } - } - } - - _asyncMutex.unlock(); -} - -void TextureCache::unbindAllImageAsync() -{ - _asyncMutex.lock(); - if (_asyncStructQueue && !_asyncStructQueue->empty()) - { - for (auto it = _asyncStructQueue->begin(); it != _asyncStructQueue->end(); ++it) + if ((*it)->filename == fullpath) { (*it)->callback = nullptr; } } - if (_imageInfoQueue && !_imageInfoQueue->empty()) +} + +void TextureCache::unbindAllImageAsync() +{ + if (_asyncStructQueue.empty()) { - for (auto it = _imageInfoQueue->begin(); it != _imageInfoQueue->end(); ++it) - { - (*it)->asyncStruct->callback = nullptr; - } + return; + + } + for (auto it = _asyncStructQueue.begin(); it != _asyncStructQueue.end(); ++it) + { + (*it)->callback = nullptr; } - _asyncMutex.unlock(); } void TextureCache::loadImage() { AsyncStruct *asyncStruct = nullptr; - - while (true) + std::unique_lock signal(_signalMutex); + while (!_needQuit) { - _asyncMutex.lock(); - if (_asyncStructQueue->empty()) + // pop an AsyncStruct from request queue + _requestMutex.lock(); + if(_requestQueue.empty()) { - _asyncMutex.unlock(); - if (_needQuit) { - break; - } - else { - std::unique_lock lk(_sleepMutex); - _sleepCondition.wait(lk); - continue; - } + asyncStruct = nullptr; + }else + { + asyncStruct = _requestQueue.front(); + _requestQueue.pop_front(); } - else - { - asyncStruct = _asyncStructQueue->front(); - _asyncMutex.unlock(); - } - - Image *image = nullptr; - bool generateImage = false; - - auto it = _textures.find(asyncStruct->filename); - if( it == _textures.end() ) - { - ImageInfo *imageInfo; - size_t pos = 0; - _asyncMutex.lock(); - size_t infoSize = _imageInfoQueue->size(); - for (; pos < infoSize; pos++) - { - imageInfo = (*_imageInfoQueue)[pos]; - if(imageInfo->asyncStruct->filename.compare(asyncStruct->filename) == 0) - break; - } - _asyncMutex.unlock(); - if(infoSize == 0 || pos == infoSize) - generateImage = true; + _requestMutex.unlock(); + + if (nullptr == asyncStruct) { + _sleepCondition.wait(signal); + continue; } + + // load image + asyncStruct->loadSuccess = asyncStruct->image.initWithImageFileThreadSafe(asyncStruct->filename); - if (generateImage) - { - const std::string& filename = asyncStruct->filename; - // generate image - image = new (std::nothrow) Image(); - if (image && !image->initWithImageFileThreadSafe(filename)) - { - CC_SAFE_RELEASE(image); - CCLOG("can not load %s", filename.c_str()); - _asyncMutex.lock(); - _asyncStructQueue->pop_front(); - _asyncMutex.unlock(); - continue; - } - } - - // generate image info - ImageInfo *imageInfo = new (std::nothrow) ImageInfo(); - imageInfo->asyncStruct = asyncStruct; - imageInfo->image = image; - - // put the image info into the queue - _asyncMutex.lock(); - _asyncStructQueue->pop_front(); - _imageInfoQueue->push_back(imageInfo); - _asyncMutex.unlock(); - } - - if(_asyncStructQueue != nullptr) - { - delete _asyncStructQueue; - _asyncStructQueue = nullptr; - delete _imageInfoQueue; - _imageInfoQueue = nullptr; + // push the asyncStruct to response queue + _responseMutex.lock(); + _responseQueue.push_back(asyncStruct); + _responseMutex.unlock(); } } void TextureCache::addImageAsyncCallBack(float dt) { - // the image is generated in loading thread - std::deque *imagesQueue = _imageInfoQueue; - - _asyncMutex.lock(); - if (imagesQueue->empty()) + Texture2D *texture = nullptr; + AsyncStruct *asyncStruct = nullptr; + while (true) { - _asyncMutex.unlock(); - } - else - { - ImageInfo *imageInfo = imagesQueue->front(); - imagesQueue->pop_front(); - _asyncMutex.unlock(); - - AsyncStruct *asyncStruct = imageInfo->asyncStruct; - Image *image = imageInfo->image; - - const std::string& filename = asyncStruct->filename; - - Texture2D *texture = nullptr; - if (image) + // pop an AsyncStruct from response queue + _responseMutex.lock(); + if(_responseQueue.empty()) { - // generate texture in render thread - texture = new (std::nothrow) Texture2D(); - - texture->initWithImage(image); - //parse 9-patch info - this->parseNinePatchImage(image, texture, filename); -#if CC_ENABLE_CACHE_TEXTURE_DATA - // cache the texture file name - VolatileTextureMgr::addImageTexture(texture, filename); -#endif - // cache the texture. retain it, since it is added in the map - _textures.insert( std::make_pair(filename, texture) ); - texture->retain(); - - texture->autorelease(); + asyncStruct = nullptr; + }else + { + asyncStruct = _responseQueue.front(); + _responseQueue.pop_front(); + + // the asyncStruct's sequence order in _asyncStructQueue must equal to the order in _responseQueue + CC_ASSERT(asyncStruct == _asyncStructQueue.front()); + _asyncStructQueue.pop_front(); + } + _responseMutex.unlock(); + + if (nullptr == asyncStruct) { + break; + } + + // check the image has been convert to texture or not + auto it = _textures.find(asyncStruct->filename); + if(it != _textures.end()) + { + texture = it->second; } else { - auto it = _textures.find(asyncStruct->filename); - if(it != _textures.end()) - texture = it->second; + // convert image to texture + if (asyncStruct->loadSuccess) + { + Image* image = &(asyncStruct->image); + // generate texture in render thread + texture = new (std::nothrow) Texture2D(); + + texture->initWithImage(image); + //parse 9-patch info + this->parseNinePatchImage(image, texture, asyncStruct->filename); +#if CC_ENABLE_CACHE_TEXTURE_DATA + // cache the texture file name + VolatileTextureMgr::addImageTexture(texture, asyncStruct->filename); +#endif + // cache the texture. retain it, since it is added in the map + _textures.insert( std::make_pair(asyncStruct->filename, texture) ); + texture->retain(); + + texture->autorelease(); + } else { + texture = nullptr; + CCLOG("cocos2d: failed to call TextureCache::addImageAsync(%s)", asyncStruct->filename.c_str()); + } } + // call callback function if (asyncStruct->callback) { - asyncStruct->callback(texture); + (asyncStruct->callback)(texture); } - - if(image) - { - image->release(); - } - delete asyncStruct; - delete imageInfo; - --_asyncRefCount; - if (0 == _asyncRefCount) - { - Director::getInstance()->getScheduler()->unschedule(CC_SCHEDULE_SELECTOR(TextureCache::addImageAsyncCallBack), this); - } + // release the asyncStruct + delete asyncStruct; + --asyncStruct; + } + + if (0 == _asyncRefCount) + { + Director::getInstance()->getScheduler()->unschedule(CC_SCHEDULE_SELECTOR(TextureCache::addImageAsyncCallBack), this); } } diff --git a/cocos/renderer/CCTextureCache.h b/cocos/renderer/CCTextureCache.h index e393c8593c..7d75be0a2d 100644 --- a/cocos/renderer/CCTextureCache.h +++ b/cocos/renderer/CCTextureCache.h @@ -209,30 +209,19 @@ private: void loadImage(); void parseNinePatchImage(Image* image, Texture2D* texture, const std::string& path); public: - struct AsyncStruct - { - public: - AsyncStruct(const std::string& fn, std::function f) : filename(fn), callback(f) {} - - std::string filename; - std::function callback; - }; - protected: - typedef struct _ImageInfo - { - AsyncStruct *asyncStruct; - Image *image; - } ImageInfo; + struct AsyncStruct; std::thread* _loadingThread; - std::deque* _asyncStructQueue; - std::deque* _imageInfoQueue; + std::deque _asyncStructQueue; + std::deque _requestQueue; + std::deque _responseQueue; - std::mutex _asyncMutex; - - std::mutex _sleepMutex; + std::mutex _requestMutex; + std::mutex _responseMutex; + + std::mutex _signalMutex; std::condition_variable _sleepCondition; bool _needQuit; From d55c0c64c5a67607078e37eb159c4de80354b382 Mon Sep 17 00:00:00 2001 From: jianglong0156 Date: Wed, 8 Jul 2015 15:19:17 +0800 Subject: [PATCH 31/83] add std::nothrow --- cocos/platform/CCFileUtils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index bef0943878..f3e2f1dbc1 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -375,7 +375,7 @@ bool FileUtils::writeToFile(ValueMap& dict, const std::string &fullPath) bool FileUtils::writeValueMapToFile(ValueMap& dict, const std::string& fullPath) { - tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument(); + tinyxml2::XMLDocument *doc = new (std::nothrow)tinyxml2::XMLDocument(); if (nullptr == doc) return false; @@ -415,7 +415,7 @@ bool FileUtils::writeValueMapToFile(ValueMap& dict, const std::string& fullPath) bool FileUtils::writeValueVectorToFile(ValueVector vecData, const std::string& fullPath) { - tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument(); + tinyxml2::XMLDocument *doc = new (std::nothrow)tinyxml2::XMLDocument(); if (nullptr == doc) return false; From f7cdd7162b84e40adffb919f41236b52b11faf34 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 8 Jul 2015 15:33:43 +0800 Subject: [PATCH 32/83] 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 33/83] 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 34/83] 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 35/83] 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 36/83] 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 37/83] 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 38/83] [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 39/83] 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 40/83] 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 41/83] 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 d9bc8b7c1ba1081dfd4c58e9202d1b0aa9cbd841 Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Thu, 9 Jul 2015 17:06:55 +0800 Subject: [PATCH 42/83] fix bug: don't decrease _asyncRefCount correct in addImageAsyncCallback. --- cocos/renderer/CCTextureCache.cpp | 5 +++-- cocos/renderer/CCTextureCache.h | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cocos/renderer/CCTextureCache.cpp b/cocos/renderer/CCTextureCache.cpp index 0146e64b08..d93be8473f 100644 --- a/cocos/renderer/CCTextureCache.cpp +++ b/cocos/renderer/CCTextureCache.cpp @@ -212,7 +212,8 @@ void TextureCache::unbindAllImageAsync() void TextureCache::loadImage() { AsyncStruct *asyncStruct = nullptr; - std::unique_lock signal(_signalMutex); + std::mutex signalMutex; + std::unique_lock signal(signalMutex); while (!_needQuit) { // pop an AsyncStruct from request queue @@ -309,7 +310,7 @@ void TextureCache::addImageAsyncCallBack(float dt) // release the asyncStruct delete asyncStruct; - --asyncStruct; + --_asyncRefCount; } if (0 == _asyncRefCount) diff --git a/cocos/renderer/CCTextureCache.h b/cocos/renderer/CCTextureCache.h index 7d75be0a2d..de28327ace 100644 --- a/cocos/renderer/CCTextureCache.h +++ b/cocos/renderer/CCTextureCache.h @@ -221,7 +221,6 @@ protected: std::mutex _requestMutex; std::mutex _responseMutex; - std::mutex _signalMutex; std::condition_variable _sleepCondition; bool _needQuit; From 10fe728eee729fd74c2345f0901350eb1c1ce8b1 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Thu, 9 Jul 2015 17:54:21 +0800 Subject: [PATCH 43/83] 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 44/83] 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 3911e1d696a1a7732654f638ff701aa15d0cd259 Mon Sep 17 00:00:00 2001 From: minggo Date: Fri, 10 Jul 2015 10:29:21 +0800 Subject: [PATCH 45/83] add lua-binding of EventDispacher::dispatchCustomEvent() --- tools/tolua/cocos2dx.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/tolua/cocos2dx.ini b/tools/tolua/cocos2dx.ini index f17ad11f04..4417ead1ae 100644 --- a/tools/tolua/cocos2dx.ini +++ b/tools/tolua/cocos2dx.ini @@ -111,7 +111,6 @@ skip = Node::[setGLServerState description getUserObject .*UserData getGLServerS DisplayLinkDirector::[mainLoop setAnimationInterval startAnimation stopAnimation], RenderTexture::[listenToBackground listenToForeground], TMXTiledMap::[getPropertiesForGID], - EventDispatcher::[dispatchCustomEvent], EventCustom::[getUserData setUserData], Component::[serialize], Console::[addCommand], From 9eb5a1833b63e6d46ce88742bd6715da65dbaf3b Mon Sep 17 00:00:00 2001 From: Jacky Date: Fri, 10 Jul 2015 11:21:03 +0800 Subject: [PATCH 46/83] fix malloc failed need to call afterCaptured callback. --- cocos/base/ccUtils.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cocos/base/ccUtils.cpp b/cocos/base/ccUtils.cpp index 74d024b445..e363092f6a 100644 --- a/cocos/base/ccUtils.cpp +++ b/cocos/base/ccUtils.cpp @@ -135,17 +135,17 @@ void onCaptureScreen(const std::function& afterC succeedSaveToFile = image->saveToFile(outputFile); delete image; }); - - // Don't call afterCaptured, call in mainThread function - return; + } + else + { + CCLOG("Malloc Image memory failed!"); + if (afterCaptured) + { + afterCaptured(succeed, outputFile); + } + startedCapture = false; } } while (0); - - if (afterCaptured) - { - afterCaptured(succeed, outputFile); - } - startedCapture = false; } /* From c4587ecda182f83fdb0494116a4d0e0590c2fc2d Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 10 Jul 2015 11:44:20 +0800 Subject: [PATCH 47/83] 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 48/83] 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 eca192f7a6cb266248fa2bf39507492643d7cb5e Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 10 Jul 2015 14:43:28 +0800 Subject: [PATCH 49/83] 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 07:21:50 +0000 Subject: [PATCH 50/83] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../auto/api/jsb_cocos2dx_auto_api.js | 50 ++++- .../js-bindings/auto/jsb_cocos2dx_auto.cpp | 91 ++++++++- .../js-bindings/auto/jsb_cocos2dx_auto.hpp | 5 +- .../lua-bindings/auto/api/FileUtils.lua | 57 +++++- .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 182 +++++++++++++++++- .../lua-bindings/auto/lua_cocos2dx_auto.hpp | 3 + 6 files changed, 355 insertions(+), 33 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 e9cf553a7b..af7782712e 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 @@ -6085,6 +6085,18 @@ str return map_object; }, +/** + * @method getFileSize + * @param {String} arg0 + * @return {long} + */ +getFileSize : function ( +str +) +{ + return 0; +}, + /** * @method getValueMapFromData * @param {char} arg0 @@ -6122,15 +6134,17 @@ array }, /** - * @method getFileSize + * @method writeStringToFile * @param {String} arg0 - * @return {long} + * @param {String} arg1 + * @return {bool} */ -getFileSize : function ( +writeStringToFile : function ( +str, str ) { - return 0; + return false; }, /** @@ -6167,6 +6181,20 @@ bool { }, +/** + * @method writeValueVectorToFile + * @param {Array} arg0 + * @param {String} arg1 + * @return {bool} + */ +writeValueVectorToFile : function ( +array, +str +) +{ + return false; +}, + /** * @method isFileExist * @param {String} arg0 @@ -6213,6 +6241,20 @@ str return ; }, +/** + * @method writeValueMapToFile + * @param {map_object} arg0 + * @param {String} arg1 + * @return {bool} + */ +writeValueMapToFile : function ( +map, +str +) +{ + return false; +}, + /** * @method setWritablePath * @param {String} arg0 diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp index e257969808..b0a958349e 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp @@ -17212,6 +17212,28 @@ bool js_cocos2dx_FileUtils_getValueMapFromFile(JSContext *cx, uint32_t argc, jsv JS_ReportError(cx, "js_cocos2dx_FileUtils_getValueMapFromFile : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_FileUtils_getFileSize(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::FileUtils* cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_getFileSize : Invalid Native Object"); + if (argc == 1) { + std::string arg0; + ok &= jsval_to_std_string(cx, args.get(0), &arg0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_getFileSize : Error processing arguments"); + long ret = cobj->getFileSize(arg0); + jsval jsret = JSVAL_NULL; + jsret = long_to_jsval(cx, ret); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_FileUtils_getFileSize : wrong number of arguments: %d, was expecting %d", argc, 1); + return false; +} bool js_cocos2dx_FileUtils_getValueMapFromData(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -17278,26 +17300,28 @@ bool js_cocos2dx_FileUtils_setSearchPaths(JSContext *cx, uint32_t argc, jsval *v JS_ReportError(cx, "js_cocos2dx_FileUtils_setSearchPaths : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } -bool js_cocos2dx_FileUtils_getFileSize(JSContext *cx, uint32_t argc, jsval *vp) +bool js_cocos2dx_FileUtils_writeStringToFile(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::FileUtils* cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_getFileSize : Invalid Native Object"); - if (argc == 1) { + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_writeStringToFile : Invalid Native Object"); + if (argc == 2) { std::string arg0; + std::string arg1; ok &= jsval_to_std_string(cx, args.get(0), &arg0); - JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_getFileSize : Error processing arguments"); - long ret = cobj->getFileSize(arg0); + ok &= jsval_to_std_string(cx, args.get(1), &arg1); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_writeStringToFile : Error processing arguments"); + bool ret = cobj->writeStringToFile(arg0, arg1); jsval jsret = JSVAL_NULL; - jsret = long_to_jsval(cx, ret); + jsret = BOOLEAN_TO_JSVAL(ret); args.rval().set(jsret); return true; } - JS_ReportError(cx, "js_cocos2dx_FileUtils_getFileSize : wrong number of arguments: %d, was expecting %d", argc, 1); + JS_ReportError(cx, "js_cocos2dx_FileUtils_writeStringToFile : wrong number of arguments: %d, was expecting %d", argc, 2); return false; } bool js_cocos2dx_FileUtils_setSearchResolutionsOrder(JSContext *cx, uint32_t argc, jsval *vp) @@ -17380,6 +17404,30 @@ bool js_cocos2dx_FileUtils_addSearchPath(JSContext *cx, uint32_t argc, jsval *vp JS_ReportError(cx, "js_cocos2dx_FileUtils_addSearchPath : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_FileUtils_writeValueVectorToFile(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::FileUtils* cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_writeValueVectorToFile : Invalid Native Object"); + if (argc == 2) { + cocos2d::ValueVector arg0; + std::string arg1; + ok &= jsval_to_ccvaluevector(cx, args.get(0), &arg0); + ok &= jsval_to_std_string(cx, args.get(1), &arg1); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_writeValueVectorToFile : Error processing arguments"); + bool ret = cobj->writeValueVectorToFile(arg0, arg1); + jsval jsret = JSVAL_NULL; + jsret = BOOLEAN_TO_JSVAL(ret); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_FileUtils_writeValueVectorToFile : wrong number of arguments: %d, was expecting %d", argc, 2); + return false; +} bool js_cocos2dx_FileUtils_isFileExist(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -17464,6 +17512,30 @@ bool js_cocos2dx_FileUtils_getSuitableFOpen(JSContext *cx, uint32_t argc, jsval JS_ReportError(cx, "js_cocos2dx_FileUtils_getSuitableFOpen : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_FileUtils_writeValueMapToFile(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::FileUtils* cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_writeValueMapToFile : Invalid Native Object"); + if (argc == 2) { + cocos2d::ValueMap arg0; + std::string arg1; + ok &= jsval_to_ccvaluemap(cx, args.get(0), &arg0); + ok &= jsval_to_std_string(cx, args.get(1), &arg1); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_writeValueMapToFile : Error processing arguments"); + bool ret = cobj->writeValueMapToFile(arg0, arg1); + jsval jsret = JSVAL_NULL; + jsret = BOOLEAN_TO_JSVAL(ret); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_FileUtils_writeValueMapToFile : wrong number of arguments: %d, was expecting %d", argc, 2); + return false; +} bool js_cocos2dx_FileUtils_setWritablePath(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -17685,17 +17757,20 @@ void js_register_cocos2dx_FileUtils(JSContext *cx, JS::HandleObject global) { JS_FN("getSearchPaths", js_cocos2dx_FileUtils_getSearchPaths, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("writeToFile", js_cocos2dx_FileUtils_writeToFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getValueMapFromFile", js_cocos2dx_FileUtils_getValueMapFromFile, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getFileSize", js_cocos2dx_FileUtils_getFileSize, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getValueMapFromData", js_cocos2dx_FileUtils_getValueMapFromData, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("removeDirectory", js_cocos2dx_FileUtils_removeDirectory, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setSearchPaths", js_cocos2dx_FileUtils_setSearchPaths, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("getFileSize", js_cocos2dx_FileUtils_getFileSize, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("writeStringToFile", js_cocos2dx_FileUtils_writeStringToFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setSearchResolutionsOrder", js_cocos2dx_FileUtils_setSearchResolutionsOrder, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("addSearchResolutionsOrder", js_cocos2dx_FileUtils_addSearchResolutionsOrder, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("addSearchPath", js_cocos2dx_FileUtils_addSearchPath, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("writeValueVectorToFile", js_cocos2dx_FileUtils_writeValueVectorToFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("isFileExist", js_cocos2dx_FileUtils_isFileExist, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("purgeCachedEntries", js_cocos2dx_FileUtils_purgeCachedEntries, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("fullPathFromRelativeFile", js_cocos2dx_FileUtils_fullPathFromRelativeFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getSuitableFOpen", js_cocos2dx_FileUtils_getSuitableFOpen, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("writeValueMapToFile", js_cocos2dx_FileUtils_writeValueMapToFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setWritablePath", js_cocos2dx_FileUtils_setWritablePath, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setPopupNotify", js_cocos2dx_FileUtils_setPopupNotify, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("isDirectoryExist", js_cocos2dx_FileUtils_isDirectoryExist, 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 0ca3e4563c..bc50f1abfd 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp @@ -926,17 +926,20 @@ bool js_cocos2dx_FileUtils_getValueVectorFromFile(JSContext *cx, uint32_t argc, bool js_cocos2dx_FileUtils_getSearchPaths(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_writeToFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_getValueMapFromFile(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_FileUtils_getFileSize(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_getValueMapFromData(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_removeDirectory(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_setSearchPaths(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_FileUtils_getFileSize(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_FileUtils_writeStringToFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_setSearchResolutionsOrder(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_addSearchResolutionsOrder(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_addSearchPath(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_FileUtils_writeValueVectorToFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_isFileExist(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_purgeCachedEntries(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_fullPathFromRelativeFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_getSuitableFOpen(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_FileUtils_writeValueMapToFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_setWritablePath(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_setPopupNotify(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_isDirectoryExist(JSContext *cx, uint32_t argc, jsval *vp); diff --git a/cocos/scripting/lua-bindings/auto/api/FileUtils.lua b/cocos/scripting/lua-bindings/auto/api/FileUtils.lua index d85eb6101d..9370f24869 100644 --- a/cocos/scripting/lua-bindings/auto/api/FileUtils.lua +++ b/cocos/scripting/lua-bindings/auto/api/FileUtils.lua @@ -127,7 +127,7 @@ -- @return FileUtils#FileUtils self (return value: cc.FileUtils) -------------------------------- --- Checks whether to pop up a message box when failed to load an image.
+-- Checks whether to pop up a message box when failed to load an image.
-- return True if pop up a message box when failed to load an image, false if not. -- @function [parent=#FileUtils] isPopupNotify -- @param self @@ -150,7 +150,10 @@ -- @return array_table#array_table ret (return value: array_table) -------------------------------- --- +-- write a ValueMap into a plist file
+-- param dict the ValueMap want to save
+-- param fullPath The full path to the file you want to save a string
+-- return bool -- @function [parent=#FileUtils] writeToFile -- @param self -- @param #map_table dict @@ -168,7 +171,18 @@ -- @return map_table#map_table ret (return value: map_table) -------------------------------- --- +-- Retrieve the file size.
+-- note If a relative path was passed in, it will be inserted a default root path at the beginning.
+-- param filepath The path of the file, it could be a relative or absolute path.
+-- return The file size. +-- @function [parent=#FileUtils] getFileSize +-- @param self +-- @param #string filepath +-- @return long#long ret (return value: long) + +-------------------------------- +-- Converts the contents of a file to a ValueMap.
+-- This method is used internally. -- @function [parent=#FileUtils] getValueMapFromData -- @param self -- @param #char filedata @@ -205,14 +219,15 @@ -- @return FileUtils#FileUtils self (return value: cc.FileUtils) -------------------------------- --- Retrieve the file size.
--- note If a relative path was passed in, it will be inserted a default root path at the beginning.
--- param filepath The path of the file, it could be a relative or absolute path.
--- return The file size. --- @function [parent=#FileUtils] getFileSize +-- write a string into a file
+-- param dataStr the string want to save
+-- param fullPath The full path to the file you want to save a string
+-- return bool True if write success +-- @function [parent=#FileUtils] writeStringToFile -- @param self --- @param #string filepath --- @return long#long ret (return value: long) +-- @param #string dataStr +-- @param #string fullPath +-- @return bool#bool ret (return value: bool) -------------------------------- -- Sets the array that contains the search order of the resources.
@@ -245,6 +260,17 @@ -- @param #bool front -- @return FileUtils#FileUtils self (return value: cc.FileUtils) +-------------------------------- +-- write ValueVector into a plist file
+-- param vecData the ValueVector want to save
+-- param fullPath The full path to the file you want to save a string
+-- return bool +-- @function [parent=#FileUtils] writeValueVectorToFile +-- @param self +-- @param #array_table vecData +-- @param #string fullPath +-- @return bool#bool ret (return value: bool) + -------------------------------- -- Checks whether a file exists.
-- note If a relative path was passed in, it will be inserted a default root path at the beginning.
@@ -284,6 +310,17 @@ -- @param #string filenameUtf8 -- @return string#string ret (return value: string) +-------------------------------- +-- write ValueMap into a plist file
+-- param dict the ValueMap want to save
+-- param fullPath The full path to the file you want to save a string
+-- return bool +-- @function [parent=#FileUtils] writeValueMapToFile +-- @param self +-- @param #map_table dict +-- @param #string fullPath +-- @return bool#bool ret (return value: bool) + -------------------------------- -- Sets writable path. -- @function [parent=#FileUtils] setWritablePath diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index b26072606f..2425ad5cfb 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -27207,6 +27207,56 @@ int lua_cocos2dx_FileUtils_getValueMapFromFile(lua_State* tolua_S) return 0; } +int lua_cocos2dx_FileUtils_getFileSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FileUtils* 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.FileUtils",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FileUtils*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_getFileSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FileUtils:getFileSize"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_getFileSize'", nullptr); + return 0; + } + long ret = cobj->getFileSize(arg0); + 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.FileUtils:getFileSize",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_getFileSize'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_FileUtils_getValueMapFromData(lua_State* tolua_S) { int argc = 0; @@ -27360,7 +27410,7 @@ int lua_cocos2dx_FileUtils_setSearchPaths(lua_State* tolua_S) return 0; } -int lua_cocos2dx_FileUtils_getFileSize(lua_State* tolua_S) +int lua_cocos2dx_FileUtils_writeStringToFile(lua_State* tolua_S) { int argc = 0; cocos2d::FileUtils* cobj = nullptr; @@ -27380,32 +27430,35 @@ int lua_cocos2dx_FileUtils_getFileSize(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_getFileSize'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_writeStringToFile'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; - if (argc == 1) + if (argc == 2) { std::string arg0; + std::string arg1; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FileUtils:getFileSize"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FileUtils:writeStringToFile"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.FileUtils:writeStringToFile"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_getFileSize'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_writeStringToFile'", nullptr); return 0; } - long ret = cobj->getFileSize(arg0); - tolua_pushnumber(tolua_S,(lua_Number)ret); + bool ret = cobj->writeStringToFile(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:getFileSize",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:writeStringToFile",argc, 2); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_getFileSize'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_writeStringToFile'.",&tolua_err); #endif return 0; @@ -27594,6 +27647,59 @@ int lua_cocos2dx_FileUtils_addSearchPath(lua_State* tolua_S) return 0; } +int lua_cocos2dx_FileUtils_writeValueVectorToFile(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FileUtils* 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.FileUtils",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FileUtils*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_writeValueVectorToFile'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 2) + { + cocos2d::ValueVector arg0; + std::string arg1; + + ok &= luaval_to_ccvaluevector(tolua_S, 2, &arg0, "cc.FileUtils:writeValueVectorToFile"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.FileUtils:writeValueVectorToFile"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_writeValueVectorToFile'", nullptr); + return 0; + } + bool ret = cobj->writeValueVectorToFile(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:writeValueVectorToFile",argc, 2); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_writeValueVectorToFile'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_FileUtils_isFileExist(lua_State* tolua_S) { int argc = 0; @@ -27794,6 +27900,59 @@ int lua_cocos2dx_FileUtils_getSuitableFOpen(lua_State* tolua_S) return 0; } +int lua_cocos2dx_FileUtils_writeValueMapToFile(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FileUtils* 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.FileUtils",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FileUtils*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_writeValueMapToFile'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 2) + { + cocos2d::ValueMap arg0; + std::string arg1; + + ok &= luaval_to_ccvaluemap(tolua_S, 2, &arg0, "cc.FileUtils:writeValueMapToFile"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.FileUtils:writeValueMapToFile"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_writeValueMapToFile'", nullptr); + return 0; + } + bool ret = cobj->writeValueMapToFile(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:writeValueMapToFile",argc, 2); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_writeValueMapToFile'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_FileUtils_setWritablePath(lua_State* tolua_S) { int argc = 0; @@ -28230,17 +28389,20 @@ int lua_register_cocos2dx_FileUtils(lua_State* tolua_S) tolua_function(tolua_S,"getSearchPaths",lua_cocos2dx_FileUtils_getSearchPaths); tolua_function(tolua_S,"writeToFile",lua_cocos2dx_FileUtils_writeToFile); tolua_function(tolua_S,"getValueMapFromFile",lua_cocos2dx_FileUtils_getValueMapFromFile); + tolua_function(tolua_S,"getFileSize",lua_cocos2dx_FileUtils_getFileSize); tolua_function(tolua_S,"getValueMapFromData",lua_cocos2dx_FileUtils_getValueMapFromData); tolua_function(tolua_S,"removeDirectory",lua_cocos2dx_FileUtils_removeDirectory); tolua_function(tolua_S,"setSearchPaths",lua_cocos2dx_FileUtils_setSearchPaths); - tolua_function(tolua_S,"getFileSize",lua_cocos2dx_FileUtils_getFileSize); + tolua_function(tolua_S,"writeStringToFile",lua_cocos2dx_FileUtils_writeStringToFile); tolua_function(tolua_S,"setSearchResolutionsOrder",lua_cocos2dx_FileUtils_setSearchResolutionsOrder); tolua_function(tolua_S,"addSearchResolutionsOrder",lua_cocos2dx_FileUtils_addSearchResolutionsOrder); tolua_function(tolua_S,"addSearchPath",lua_cocos2dx_FileUtils_addSearchPath); + tolua_function(tolua_S,"writeValueVectorToFile",lua_cocos2dx_FileUtils_writeValueVectorToFile); tolua_function(tolua_S,"isFileExist",lua_cocos2dx_FileUtils_isFileExist); tolua_function(tolua_S,"purgeCachedEntries",lua_cocos2dx_FileUtils_purgeCachedEntries); tolua_function(tolua_S,"fullPathFromRelativeFile",lua_cocos2dx_FileUtils_fullPathFromRelativeFile); tolua_function(tolua_S,"getSuitableFOpen",lua_cocos2dx_FileUtils_getSuitableFOpen); + tolua_function(tolua_S,"writeValueMapToFile",lua_cocos2dx_FileUtils_writeValueMapToFile); tolua_function(tolua_S,"setWritablePath",lua_cocos2dx_FileUtils_setWritablePath); tolua_function(tolua_S,"setPopupNotify",lua_cocos2dx_FileUtils_setPopupNotify); tolua_function(tolua_S,"isDirectoryExist",lua_cocos2dx_FileUtils_isDirectoryExist); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp index 48869a081d..ccd7196432 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -2064,6 +2064,9 @@ int register_all_cocos2dx(lua_State* tolua_S); + + + From 187c72e2b9d86544a13a8a8f4ff37ff9990cfca4 Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Fri, 10 Jul 2015 16:17:34 +0800 Subject: [PATCH 51/83] [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 52/83] 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 53/83] 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 54/83] 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 0e8a3f14f08f08c28ab9d68b1456c88f0f187558 Mon Sep 17 00:00:00 2001 From: CocosRobot Date: Fri, 10 Jul 2015 09:11:50 +0000 Subject: [PATCH 55/83] [ci skip][AUTO]: updating luabinding & jsbinding automatically --- .../auto/api/jsb_cocos2dx_auto_api.js | 50 ++++- .../js-bindings/auto/jsb_cocos2dx_auto.cpp | 91 ++++++++- .../js-bindings/auto/jsb_cocos2dx_auto.hpp | 5 +- .../lua-bindings/auto/api/FileUtils.lua | 57 +++++- .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 182 +++++++++++++++++- .../lua-bindings/auto/lua_cocos2dx_auto.hpp | 3 + 6 files changed, 355 insertions(+), 33 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 e9cf553a7b..af7782712e 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 @@ -6085,6 +6085,18 @@ str return map_object; }, +/** + * @method getFileSize + * @param {String} arg0 + * @return {long} + */ +getFileSize : function ( +str +) +{ + return 0; +}, + /** * @method getValueMapFromData * @param {char} arg0 @@ -6122,15 +6134,17 @@ array }, /** - * @method getFileSize + * @method writeStringToFile * @param {String} arg0 - * @return {long} + * @param {String} arg1 + * @return {bool} */ -getFileSize : function ( +writeStringToFile : function ( +str, str ) { - return 0; + return false; }, /** @@ -6167,6 +6181,20 @@ bool { }, +/** + * @method writeValueVectorToFile + * @param {Array} arg0 + * @param {String} arg1 + * @return {bool} + */ +writeValueVectorToFile : function ( +array, +str +) +{ + return false; +}, + /** * @method isFileExist * @param {String} arg0 @@ -6213,6 +6241,20 @@ str return ; }, +/** + * @method writeValueMapToFile + * @param {map_object} arg0 + * @param {String} arg1 + * @return {bool} + */ +writeValueMapToFile : function ( +map, +str +) +{ + return false; +}, + /** * @method setWritablePath * @param {String} arg0 diff --git a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp index e257969808..b0a958349e 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp @@ -17212,6 +17212,28 @@ bool js_cocos2dx_FileUtils_getValueMapFromFile(JSContext *cx, uint32_t argc, jsv JS_ReportError(cx, "js_cocos2dx_FileUtils_getValueMapFromFile : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_FileUtils_getFileSize(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::FileUtils* cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_getFileSize : Invalid Native Object"); + if (argc == 1) { + std::string arg0; + ok &= jsval_to_std_string(cx, args.get(0), &arg0); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_getFileSize : Error processing arguments"); + long ret = cobj->getFileSize(arg0); + jsval jsret = JSVAL_NULL; + jsret = long_to_jsval(cx, ret); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_FileUtils_getFileSize : wrong number of arguments: %d, was expecting %d", argc, 1); + return false; +} bool js_cocos2dx_FileUtils_getValueMapFromData(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -17278,26 +17300,28 @@ bool js_cocos2dx_FileUtils_setSearchPaths(JSContext *cx, uint32_t argc, jsval *v JS_ReportError(cx, "js_cocos2dx_FileUtils_setSearchPaths : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } -bool js_cocos2dx_FileUtils_getFileSize(JSContext *cx, uint32_t argc, jsval *vp) +bool js_cocos2dx_FileUtils_writeStringToFile(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::FileUtils* cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL); - JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_getFileSize : Invalid Native Object"); - if (argc == 1) { + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_writeStringToFile : Invalid Native Object"); + if (argc == 2) { std::string arg0; + std::string arg1; ok &= jsval_to_std_string(cx, args.get(0), &arg0); - JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_getFileSize : Error processing arguments"); - long ret = cobj->getFileSize(arg0); + ok &= jsval_to_std_string(cx, args.get(1), &arg1); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_writeStringToFile : Error processing arguments"); + bool ret = cobj->writeStringToFile(arg0, arg1); jsval jsret = JSVAL_NULL; - jsret = long_to_jsval(cx, ret); + jsret = BOOLEAN_TO_JSVAL(ret); args.rval().set(jsret); return true; } - JS_ReportError(cx, "js_cocos2dx_FileUtils_getFileSize : wrong number of arguments: %d, was expecting %d", argc, 1); + JS_ReportError(cx, "js_cocos2dx_FileUtils_writeStringToFile : wrong number of arguments: %d, was expecting %d", argc, 2); return false; } bool js_cocos2dx_FileUtils_setSearchResolutionsOrder(JSContext *cx, uint32_t argc, jsval *vp) @@ -17380,6 +17404,30 @@ bool js_cocos2dx_FileUtils_addSearchPath(JSContext *cx, uint32_t argc, jsval *vp JS_ReportError(cx, "js_cocos2dx_FileUtils_addSearchPath : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_FileUtils_writeValueVectorToFile(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::FileUtils* cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_writeValueVectorToFile : Invalid Native Object"); + if (argc == 2) { + cocos2d::ValueVector arg0; + std::string arg1; + ok &= jsval_to_ccvaluevector(cx, args.get(0), &arg0); + ok &= jsval_to_std_string(cx, args.get(1), &arg1); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_writeValueVectorToFile : Error processing arguments"); + bool ret = cobj->writeValueVectorToFile(arg0, arg1); + jsval jsret = JSVAL_NULL; + jsret = BOOLEAN_TO_JSVAL(ret); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_FileUtils_writeValueVectorToFile : wrong number of arguments: %d, was expecting %d", argc, 2); + return false; +} bool js_cocos2dx_FileUtils_isFileExist(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -17464,6 +17512,30 @@ bool js_cocos2dx_FileUtils_getSuitableFOpen(JSContext *cx, uint32_t argc, jsval JS_ReportError(cx, "js_cocos2dx_FileUtils_getSuitableFOpen : wrong number of arguments: %d, was expecting %d", argc, 1); return false; } +bool js_cocos2dx_FileUtils_writeValueMapToFile(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::FileUtils* cobj = (cocos2d::FileUtils *)(proxy ? proxy->ptr : NULL); + JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_FileUtils_writeValueMapToFile : Invalid Native Object"); + if (argc == 2) { + cocos2d::ValueMap arg0; + std::string arg1; + ok &= jsval_to_ccvaluemap(cx, args.get(0), &arg0); + ok &= jsval_to_std_string(cx, args.get(1), &arg1); + JSB_PRECONDITION2(ok, cx, false, "js_cocos2dx_FileUtils_writeValueMapToFile : Error processing arguments"); + bool ret = cobj->writeValueMapToFile(arg0, arg1); + jsval jsret = JSVAL_NULL; + jsret = BOOLEAN_TO_JSVAL(ret); + args.rval().set(jsret); + return true; + } + + JS_ReportError(cx, "js_cocos2dx_FileUtils_writeValueMapToFile : wrong number of arguments: %d, was expecting %d", argc, 2); + return false; +} bool js_cocos2dx_FileUtils_setWritablePath(JSContext *cx, uint32_t argc, jsval *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); @@ -17685,17 +17757,20 @@ void js_register_cocos2dx_FileUtils(JSContext *cx, JS::HandleObject global) { JS_FN("getSearchPaths", js_cocos2dx_FileUtils_getSearchPaths, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("writeToFile", js_cocos2dx_FileUtils_writeToFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getValueMapFromFile", js_cocos2dx_FileUtils_getValueMapFromFile, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("getFileSize", js_cocos2dx_FileUtils_getFileSize, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getValueMapFromData", js_cocos2dx_FileUtils_getValueMapFromData, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("removeDirectory", js_cocos2dx_FileUtils_removeDirectory, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setSearchPaths", js_cocos2dx_FileUtils_setSearchPaths, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), - JS_FN("getFileSize", js_cocos2dx_FileUtils_getFileSize, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("writeStringToFile", js_cocos2dx_FileUtils_writeStringToFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setSearchResolutionsOrder", js_cocos2dx_FileUtils_setSearchResolutionsOrder, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("addSearchResolutionsOrder", js_cocos2dx_FileUtils_addSearchResolutionsOrder, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("addSearchPath", js_cocos2dx_FileUtils_addSearchPath, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("writeValueVectorToFile", js_cocos2dx_FileUtils_writeValueVectorToFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("isFileExist", js_cocos2dx_FileUtils_isFileExist, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("purgeCachedEntries", js_cocos2dx_FileUtils_purgeCachedEntries, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("fullPathFromRelativeFile", js_cocos2dx_FileUtils_fullPathFromRelativeFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("getSuitableFOpen", js_cocos2dx_FileUtils_getSuitableFOpen, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), + JS_FN("writeValueMapToFile", js_cocos2dx_FileUtils_writeValueMapToFile, 2, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setWritablePath", js_cocos2dx_FileUtils_setWritablePath, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("setPopupNotify", js_cocos2dx_FileUtils_setPopupNotify, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE), JS_FN("isDirectoryExist", js_cocos2dx_FileUtils_isDirectoryExist, 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 0ca3e4563c..bc50f1abfd 100644 --- a/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp +++ b/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.hpp @@ -926,17 +926,20 @@ bool js_cocos2dx_FileUtils_getValueVectorFromFile(JSContext *cx, uint32_t argc, bool js_cocos2dx_FileUtils_getSearchPaths(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_writeToFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_getValueMapFromFile(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_FileUtils_getFileSize(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_getValueMapFromData(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_removeDirectory(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_setSearchPaths(JSContext *cx, uint32_t argc, jsval *vp); -bool js_cocos2dx_FileUtils_getFileSize(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_FileUtils_writeStringToFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_setSearchResolutionsOrder(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_addSearchResolutionsOrder(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_addSearchPath(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_FileUtils_writeValueVectorToFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_isFileExist(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_purgeCachedEntries(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_fullPathFromRelativeFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_getSuitableFOpen(JSContext *cx, uint32_t argc, jsval *vp); +bool js_cocos2dx_FileUtils_writeValueMapToFile(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_setWritablePath(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_setPopupNotify(JSContext *cx, uint32_t argc, jsval *vp); bool js_cocos2dx_FileUtils_isDirectoryExist(JSContext *cx, uint32_t argc, jsval *vp); diff --git a/cocos/scripting/lua-bindings/auto/api/FileUtils.lua b/cocos/scripting/lua-bindings/auto/api/FileUtils.lua index d85eb6101d..9370f24869 100644 --- a/cocos/scripting/lua-bindings/auto/api/FileUtils.lua +++ b/cocos/scripting/lua-bindings/auto/api/FileUtils.lua @@ -127,7 +127,7 @@ -- @return FileUtils#FileUtils self (return value: cc.FileUtils) -------------------------------- --- Checks whether to pop up a message box when failed to load an image.
+-- Checks whether to pop up a message box when failed to load an image.
-- return True if pop up a message box when failed to load an image, false if not. -- @function [parent=#FileUtils] isPopupNotify -- @param self @@ -150,7 +150,10 @@ -- @return array_table#array_table ret (return value: array_table) -------------------------------- --- +-- write a ValueMap into a plist file
+-- param dict the ValueMap want to save
+-- param fullPath The full path to the file you want to save a string
+-- return bool -- @function [parent=#FileUtils] writeToFile -- @param self -- @param #map_table dict @@ -168,7 +171,18 @@ -- @return map_table#map_table ret (return value: map_table) -------------------------------- --- +-- Retrieve the file size.
+-- note If a relative path was passed in, it will be inserted a default root path at the beginning.
+-- param filepath The path of the file, it could be a relative or absolute path.
+-- return The file size. +-- @function [parent=#FileUtils] getFileSize +-- @param self +-- @param #string filepath +-- @return long#long ret (return value: long) + +-------------------------------- +-- Converts the contents of a file to a ValueMap.
+-- This method is used internally. -- @function [parent=#FileUtils] getValueMapFromData -- @param self -- @param #char filedata @@ -205,14 +219,15 @@ -- @return FileUtils#FileUtils self (return value: cc.FileUtils) -------------------------------- --- Retrieve the file size.
--- note If a relative path was passed in, it will be inserted a default root path at the beginning.
--- param filepath The path of the file, it could be a relative or absolute path.
--- return The file size. --- @function [parent=#FileUtils] getFileSize +-- write a string into a file
+-- param dataStr the string want to save
+-- param fullPath The full path to the file you want to save a string
+-- return bool True if write success +-- @function [parent=#FileUtils] writeStringToFile -- @param self --- @param #string filepath --- @return long#long ret (return value: long) +-- @param #string dataStr +-- @param #string fullPath +-- @return bool#bool ret (return value: bool) -------------------------------- -- Sets the array that contains the search order of the resources.
@@ -245,6 +260,17 @@ -- @param #bool front -- @return FileUtils#FileUtils self (return value: cc.FileUtils) +-------------------------------- +-- write ValueVector into a plist file
+-- param vecData the ValueVector want to save
+-- param fullPath The full path to the file you want to save a string
+-- return bool +-- @function [parent=#FileUtils] writeValueVectorToFile +-- @param self +-- @param #array_table vecData +-- @param #string fullPath +-- @return bool#bool ret (return value: bool) + -------------------------------- -- Checks whether a file exists.
-- note If a relative path was passed in, it will be inserted a default root path at the beginning.
@@ -284,6 +310,17 @@ -- @param #string filenameUtf8 -- @return string#string ret (return value: string) +-------------------------------- +-- write ValueMap into a plist file
+-- param dict the ValueMap want to save
+-- param fullPath The full path to the file you want to save a string
+-- return bool +-- @function [parent=#FileUtils] writeValueMapToFile +-- @param self +-- @param #map_table dict +-- @param #string fullPath +-- @return bool#bool ret (return value: bool) + -------------------------------- -- Sets writable path. -- @function [parent=#FileUtils] setWritablePath diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index b26072606f..2425ad5cfb 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -27207,6 +27207,56 @@ int lua_cocos2dx_FileUtils_getValueMapFromFile(lua_State* tolua_S) return 0; } +int lua_cocos2dx_FileUtils_getFileSize(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FileUtils* 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.FileUtils",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FileUtils*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_getFileSize'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FileUtils:getFileSize"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_getFileSize'", nullptr); + return 0; + } + long ret = cobj->getFileSize(arg0); + 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.FileUtils:getFileSize",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_getFileSize'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_FileUtils_getValueMapFromData(lua_State* tolua_S) { int argc = 0; @@ -27360,7 +27410,7 @@ int lua_cocos2dx_FileUtils_setSearchPaths(lua_State* tolua_S) return 0; } -int lua_cocos2dx_FileUtils_getFileSize(lua_State* tolua_S) +int lua_cocos2dx_FileUtils_writeStringToFile(lua_State* tolua_S) { int argc = 0; cocos2d::FileUtils* cobj = nullptr; @@ -27380,32 +27430,35 @@ int lua_cocos2dx_FileUtils_getFileSize(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_getFileSize'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_writeStringToFile'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; - if (argc == 1) + if (argc == 2) { std::string arg0; + std::string arg1; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FileUtils:getFileSize"); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.FileUtils:writeStringToFile"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.FileUtils:writeStringToFile"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_getFileSize'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_writeStringToFile'", nullptr); return 0; } - long ret = cobj->getFileSize(arg0); - tolua_pushnumber(tolua_S,(lua_Number)ret); + bool ret = cobj->writeStringToFile(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:getFileSize",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:writeStringToFile",argc, 2); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_getFileSize'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_writeStringToFile'.",&tolua_err); #endif return 0; @@ -27594,6 +27647,59 @@ int lua_cocos2dx_FileUtils_addSearchPath(lua_State* tolua_S) return 0; } +int lua_cocos2dx_FileUtils_writeValueVectorToFile(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FileUtils* 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.FileUtils",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FileUtils*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_writeValueVectorToFile'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 2) + { + cocos2d::ValueVector arg0; + std::string arg1; + + ok &= luaval_to_ccvaluevector(tolua_S, 2, &arg0, "cc.FileUtils:writeValueVectorToFile"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.FileUtils:writeValueVectorToFile"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_writeValueVectorToFile'", nullptr); + return 0; + } + bool ret = cobj->writeValueVectorToFile(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:writeValueVectorToFile",argc, 2); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_writeValueVectorToFile'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_FileUtils_isFileExist(lua_State* tolua_S) { int argc = 0; @@ -27794,6 +27900,59 @@ int lua_cocos2dx_FileUtils_getSuitableFOpen(lua_State* tolua_S) return 0; } +int lua_cocos2dx_FileUtils_writeValueMapToFile(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FileUtils* 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.FileUtils",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FileUtils*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_writeValueMapToFile'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 2) + { + cocos2d::ValueMap arg0; + std::string arg1; + + ok &= luaval_to_ccvaluemap(tolua_S, 2, &arg0, "cc.FileUtils:writeValueMapToFile"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.FileUtils:writeValueMapToFile"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_writeValueMapToFile'", nullptr); + return 0; + } + bool ret = cobj->writeValueMapToFile(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:writeValueMapToFile",argc, 2); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_writeValueMapToFile'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_FileUtils_setWritablePath(lua_State* tolua_S) { int argc = 0; @@ -28230,17 +28389,20 @@ int lua_register_cocos2dx_FileUtils(lua_State* tolua_S) tolua_function(tolua_S,"getSearchPaths",lua_cocos2dx_FileUtils_getSearchPaths); tolua_function(tolua_S,"writeToFile",lua_cocos2dx_FileUtils_writeToFile); tolua_function(tolua_S,"getValueMapFromFile",lua_cocos2dx_FileUtils_getValueMapFromFile); + tolua_function(tolua_S,"getFileSize",lua_cocos2dx_FileUtils_getFileSize); tolua_function(tolua_S,"getValueMapFromData",lua_cocos2dx_FileUtils_getValueMapFromData); tolua_function(tolua_S,"removeDirectory",lua_cocos2dx_FileUtils_removeDirectory); tolua_function(tolua_S,"setSearchPaths",lua_cocos2dx_FileUtils_setSearchPaths); - tolua_function(tolua_S,"getFileSize",lua_cocos2dx_FileUtils_getFileSize); + tolua_function(tolua_S,"writeStringToFile",lua_cocos2dx_FileUtils_writeStringToFile); tolua_function(tolua_S,"setSearchResolutionsOrder",lua_cocos2dx_FileUtils_setSearchResolutionsOrder); tolua_function(tolua_S,"addSearchResolutionsOrder",lua_cocos2dx_FileUtils_addSearchResolutionsOrder); tolua_function(tolua_S,"addSearchPath",lua_cocos2dx_FileUtils_addSearchPath); + tolua_function(tolua_S,"writeValueVectorToFile",lua_cocos2dx_FileUtils_writeValueVectorToFile); tolua_function(tolua_S,"isFileExist",lua_cocos2dx_FileUtils_isFileExist); tolua_function(tolua_S,"purgeCachedEntries",lua_cocos2dx_FileUtils_purgeCachedEntries); tolua_function(tolua_S,"fullPathFromRelativeFile",lua_cocos2dx_FileUtils_fullPathFromRelativeFile); tolua_function(tolua_S,"getSuitableFOpen",lua_cocos2dx_FileUtils_getSuitableFOpen); + tolua_function(tolua_S,"writeValueMapToFile",lua_cocos2dx_FileUtils_writeValueMapToFile); tolua_function(tolua_S,"setWritablePath",lua_cocos2dx_FileUtils_setWritablePath); tolua_function(tolua_S,"setPopupNotify",lua_cocos2dx_FileUtils_setPopupNotify); tolua_function(tolua_S,"isDirectoryExist",lua_cocos2dx_FileUtils_isDirectoryExist); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp index 48869a081d..ccd7196432 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -2064,6 +2064,9 @@ int register_all_cocos2dx(lua_State* tolua_S); + + + From c68469a611ea6965daf9a9dfa48cf37addf2f827 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Fri, 10 Jul 2015 20:42:05 +0800 Subject: [PATCH 56/83] 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 57/83] [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 58/83] [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 59/83] [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 60/83] 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 61/83] [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 62/83] 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: Sun, 12 Jul 2015 20:19:52 +0800 Subject: [PATCH 63/83] Revert "add lua-binding of EventDispacher::dispatchCustomEvent()" --- tools/tolua/cocos2dx.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/tolua/cocos2dx.ini b/tools/tolua/cocos2dx.ini index 31edca5228..3bf6bb9d1c 100644 --- a/tools/tolua/cocos2dx.ini +++ b/tools/tolua/cocos2dx.ini @@ -111,6 +111,7 @@ skip = Node::[setGLServerState description getUserObject .*UserData getGLServerS DisplayLinkDirector::[mainLoop setAnimationInterval startAnimation stopAnimation], RenderTexture::[listenToBackground listenToForeground], TMXTiledMap::[getPropertiesForGID], + EventDispatcher::[dispatchCustomEvent], EventCustom::[getUserData setUserData], Component::[serialize], Console::[addCommand], From dee13756ec2e92aee7ce5d57489d21c3f554bca9 Mon Sep 17 00:00:00 2001 From: WenhaiLin Date: Mon, 13 Jul 2015 10:40:43 +0800 Subject: [PATCH 64/83] 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 65/83] 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 66/83] 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 67/83] 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 68/83] [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 36e1f26570a0a70ab00632f24b96412a32568665 Mon Sep 17 00:00:00 2001 From: pandamicro Date: Mon, 13 Jul 2015 16:44:33 +0800 Subject: [PATCH 69/83] Fix CCSprite ; missing --- cocos/2d/CCSprite.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index ef05ac3d8a..faa5b61e79 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -288,7 +288,7 @@ Sprite::Sprite(void) , _insideBounds(true) { #if CC_SPRITE_DEBUG_DRAW - debugDraw(true) + debugDraw(true); #endif //CC_SPRITE_DEBUG_DRAW } From e65b01bdc035719fbeec87f2b3f8f67f35e4cdb1 Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Mon, 13 Jul 2015 17:06:01 +0800 Subject: [PATCH 70/83] 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 71/83] [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 72/83] [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 73/83] 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 74/83] 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 75/83] 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 76/83] [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 77/83] [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 78/83] 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 79/83] 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 80/83] 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 81/83] 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 82/83] 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 83/83] 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)