diff --git a/CHANGELOG b/CHANGELOG index 7388b04c32..6279801fd9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,6 @@ cocos2d-x-3.4rc0 Jan.9 2015 + [FIX] GLProgram: when there is a shader compile error in shader, it will crash on windows + [FIX] HttpClient: http requests will be lost in immediately mode on iOS [FIX] WP8: compiling error on ARM architecture cocos2d-x-3.4beta0 Dec.31 2014 diff --git a/cocos/audio/AudioEngine.cpp b/cocos/audio/AudioEngine.cpp index 0c5b93c2a2..cbfc5ed08b 100644 --- a/cocos/audio/AudioEngine.cpp +++ b/cocos/audio/AudioEngine.cpp @@ -47,7 +47,7 @@ using namespace cocos2d; using namespace cocos2d::experimental; -const int AudioEngine::INVAILD_AUDIO_ID = -1; +const int AudioEngine::INVALID_AUDIO_ID = -1; const float AudioEngine::TIME_UNKNOWN = -1.0f; //audio file path,audio IDs @@ -85,7 +85,7 @@ bool AudioEngine::lazyInit() int AudioEngine::play2d(const std::string& filePath, bool loop, float volume, const AudioProfile *profile) { - int ret = AudioEngine::INVAILD_AUDIO_ID; + int ret = AudioEngine::INVALID_AUDIO_ID; do { if ( !lazyInit() ){ @@ -130,7 +130,7 @@ int AudioEngine::play2d(const std::string& filePath, bool loop, float volume, co } ret = _audioEngineImpl->play2d(filePath, loop, volume); - if (ret != INVAILD_AUDIO_ID) + if (ret != INVALID_AUDIO_ID) { _audioPathIDMap[filePath].push_back(ret); auto it = _audioPathIDMap.find(filePath); diff --git a/cocos/audio/android/AudioEngine-inl.cpp b/cocos/audio/android/AudioEngine-inl.cpp index 7860aedc18..a84fa071e7 100644 --- a/cocos/audio/android/AudioEngine-inl.cpp +++ b/cocos/audio/android/AudioEngine-inl.cpp @@ -229,7 +229,7 @@ bool AudioEngineImpl::init() int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume) { - auto audioId = AudioEngine::INVAILD_AUDIO_ID; + auto audioId = AudioEngine::INVALID_AUDIO_ID; do { diff --git a/cocos/audio/apple/AudioEngine-inl.mm b/cocos/audio/apple/AudioEngine-inl.mm index e6a90d8f68..900ac702ea 100644 --- a/cocos/audio/apple/AudioEngine-inl.mm +++ b/cocos/audio/apple/AudioEngine-inl.mm @@ -187,7 +187,7 @@ bool AudioEngineImpl::init() int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume) { if (s_ALDevice == nullptr) { - return AudioEngine::INVAILD_AUDIO_ID; + return AudioEngine::INVALID_AUDIO_ID; } bool sourceFlag = false; @@ -201,7 +201,7 @@ int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume } } if(!sourceFlag){ - return AudioEngine::INVAILD_AUDIO_ID; + return AudioEngine::INVALID_AUDIO_ID; } AudioCache* audioCache = nullptr; diff --git a/cocos/audio/include/AudioEngine.h b/cocos/audio/include/AudioEngine.h index 51e7540347..721c3287a8 100644 --- a/cocos/audio/include/AudioEngine.h +++ b/cocos/audio/include/AudioEngine.h @@ -81,7 +81,7 @@ public: PAUSED }; - static const int INVAILD_AUDIO_ID; + static const int INVALID_AUDIO_ID; static const float TIME_UNKNOWN; diff --git a/cocos/audio/win32/AudioEngine-win32.cpp b/cocos/audio/win32/AudioEngine-win32.cpp index 44757db2cd..f131f7ed2c 100644 --- a/cocos/audio/win32/AudioEngine-win32.cpp +++ b/cocos/audio/win32/AudioEngine-win32.cpp @@ -205,7 +205,7 @@ int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume } } if(!availableSourceExist){ - return AudioEngine::INVAILD_AUDIO_ID; + return AudioEngine::INVALID_AUDIO_ID; } AudioCache* audioCache = nullptr; @@ -244,7 +244,7 @@ int AudioEngineImpl::play2d(const std::string &filePath ,bool loop ,float volume if (eraseCache){ _audioCaches.erase(filePath); - return AudioEngine::INVAILD_AUDIO_ID; + return AudioEngine::INVALID_AUDIO_ID; } audioCache->_fileFullPath = FileUtils::getInstance()->fullPathForFilename(filePath); diff --git a/cocos/network/HttpClient-ios.mm b/cocos/network/HttpClient-ios.mm index ea56d4af16..26acc8d999 100644 --- a/cocos/network/HttpClient-ios.mm +++ b/cocos/network/HttpClient-ios.mm @@ -43,8 +43,6 @@ NS_CC_BEGIN -#define ERROR_SIZE 256 - namespace network { static std::mutex s_requestQueueMutex; @@ -55,10 +53,11 @@ static std::condition_variable_any s_SleepCondition; static Vector* s_requestQueue = nullptr; static Vector* s_responseQueue = nullptr; -static HttpClient *s_pHttpClient = nullptr; // pointer to singleton +static HttpClient *s_HttpClient = nullptr; // pointer to singleton -static HttpAsynConnection *httpAsynConn = nullptr; static HttpCookie *s_cookie = nullptr; + +static const int ERROR_SIZE = 256; static char s_errorBuffer[ERROR_SIZE] = {0}; @@ -106,7 +105,7 @@ void HttpClient::networkThread() s_responseQueue->pushBack(response); s_responseQueueMutex.unlock(); - if (nullptr != s_pHttpClient) { + if (nullptr != s_HttpClient) { scheduler->performFunctionInCocosThread(CC_CALLBACK_0(HttpClient::dispatchResponseCallbacks, this)); } } @@ -142,11 +141,11 @@ void HttpClient::networkThreadAlone(HttpRequest* request) if (callback != nullptr) { - callback(s_pHttpClient, response); + callback(s_HttpClient, response); } else if (pTarget && pSelector) { - (pTarget->*pSelector)(s_pHttpClient, response); + (pTarget->*pSelector)(s_HttpClient, response); } response->release(); // do not release in other thread @@ -218,7 +217,7 @@ static int processTask(HttpRequest *request, NSString* requestType, void *stream } } - httpAsynConn = [HttpAsynConnection new]; + HttpAsynConnection *httpAsynConn = [HttpAsynConnection new]; httpAsynConn.srcURL = urlstring; httpAsynConn.sslFile = nil; NSString *sslFile = nil; @@ -256,7 +255,7 @@ static int processTask(HttpRequest *request, NSString* requestType, void *stream NSString *domain = cookie.domain; //BOOL session = cookie.sessionOnly; NSString *path = cookie.path; - BOOL secure = cookie.secure; + BOOL secure = cookie.isSecure; NSDate *date = cookie.expiresDate; NSString *name = cookie.name; NSString *value = cookie.value; @@ -356,16 +355,16 @@ static void processResponse(HttpResponse* response, char* errorBuffer) // HttpClient implementation HttpClient* HttpClient::getInstance() { - if (s_pHttpClient == nullptr) { - s_pHttpClient = new (std::nothrow) HttpClient(); + if (s_HttpClient == nullptr) { + s_HttpClient = new (std::nothrow) HttpClient(); } - return s_pHttpClient; + return s_HttpClient; } void HttpClient::destroyInstance() { - CC_SAFE_DELETE(s_pHttpClient); + CC_SAFE_DELETE(s_HttpClient); } void HttpClient::enableCookies(const char* cookieFile) { @@ -403,7 +402,7 @@ HttpClient::~HttpClient() s_SleepCondition.notify_one(); } - s_pHttpClient = nullptr; + s_HttpClient = nullptr; if(!s_cookieFilename.empty()) { diff --git a/cocos/platform/linux/CCApplication-linux.cpp b/cocos/platform/linux/CCApplication-linux.cpp index 28fcbe5405..34062995ad 100644 --- a/cocos/platform/linux/CCApplication-linux.cpp +++ b/cocos/platform/linux/CCApplication-linux.cpp @@ -104,7 +104,7 @@ int Application::run() director = nullptr; } glview->release(); - return -1; + return EXIT_SUCCESS; } void Application::setAnimationInterval(double interval) diff --git a/cocos/renderer/CCGLProgram.cpp b/cocos/renderer/CCGLProgram.cpp index b776a8958a..b80e40d6ae 100644 --- a/cocos/renderer/CCGLProgram.cpp +++ b/cocos/renderer/CCGLProgram.cpp @@ -595,18 +595,36 @@ void GLProgram::use() GL::useProgram(_program); } -std::string GLProgram::logForOpenGLObject(GLuint object, GLInfoFunction infoFunc, GLLogFunction logFunc) const +static std::string logForOpenGLShader(GLuint shader) { std::string ret; GLint logLength = 0, charsWritten = 0; - infoFunc(object, GL_INFO_LOG_LENGTH, &logLength); + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength); if (logLength < 1) return ""; - char *logBytes = (char*)malloc(logLength); - logFunc(object, logLength, &charsWritten, logBytes); + char *logBytes = (char*)malloc(logLength + 1); + glGetShaderInfoLog(shader, logLength, &charsWritten, logBytes); + logBytes[logLength] = '\0'; + ret = logBytes; + free(logBytes); + return ret; +} + +static std::string logForOpenGLProgram(GLuint program) +{ + std::string ret; + GLint logLength = 0, charsWritten = 0; + + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); + if (logLength < 1) + return ""; + + char *logBytes = (char*)malloc(logLength + 1); + glGetProgramInfoLog(program, logLength, &charsWritten, logBytes); + logBytes[logLength] = '\0'; ret = logBytes; free(logBytes); @@ -615,17 +633,17 @@ std::string GLProgram::logForOpenGLObject(GLuint object, GLInfoFunction infoFunc std::string GLProgram::getVertexShaderLog() const { - return this->logForOpenGLObject(_vertShader, (GLInfoFunction)&glGetShaderiv, (GLLogFunction)&glGetShaderInfoLog); + return cocos2d::logForOpenGLShader(_vertShader); } std::string GLProgram::getFragmentShaderLog() const { - return this->logForOpenGLObject(_fragShader, (GLInfoFunction)&glGetShaderiv, (GLLogFunction)&glGetShaderInfoLog); + return cocos2d::logForOpenGLShader(_fragShader); } std::string GLProgram::getProgramLog() const { - return this->logForOpenGLObject(_program, (GLInfoFunction)&glGetProgramiv, (GLLogFunction)&glGetProgramInfoLog); + return logForOpenGLProgram(_program); } // Uniform cache diff --git a/cocos/renderer/CCGLProgram.h b/cocos/renderer/CCGLProgram.h index f7323eb66d..4577311262 100644 --- a/cocos/renderer/CCGLProgram.h +++ b/cocos/renderer/CCGLProgram.h @@ -47,10 +47,10 @@ NS_CC_BEGIN class GLProgram; class Director; +//FIXME: these two typedefs would be deprecated or removed in version 4.0 typedef void (*GLInfoFunction)(GLuint program, GLenum pname, GLint* params); typedef void (*GLLogFunction) (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog); - struct VertexAttrib { GLuint index; @@ -333,8 +333,7 @@ protected: void parseUniforms(); bool compileShader(GLuint * shader, GLenum type, const GLchar* source); - std::string logForOpenGLObject(GLuint object, GLInfoFunction infoFunc, GLLogFunction logFunc) const; - + GLuint _program; GLuint _vertShader; GLuint _fragShader; diff --git a/extensions/assets-manager/Downloader.cpp b/extensions/assets-manager/Downloader.cpp index 0426543e9b..e76b140e64 100644 --- a/extensions/assets-manager/Downloader.cpp +++ b/extensions/assets-manager/Downloader.cpp @@ -627,7 +627,13 @@ void Downloader::groupBatchDownload(const DownloadUnits &units) FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); +// FIXME: when jenkins migrate to ubuntu, we should remove this hack code +#if (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX) + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &select_tv); +#else rc = curl_multi_wait(multi_handle,nullptr, 0, MAX_WAIT_MSECS, &maxfd); +#endif switch(rc) { diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp index ad3ccbe940..9450522f13 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp @@ -213,6 +213,7 @@ void StartupCall::startup() trackLaunchEvent(); } +// // *NOTE* // track event on windows / mac platform // @@ -232,7 +233,7 @@ void StartupCall::trackEvent(const char *eventName) "http://www.google-analytics.com/collect", kCCHTTPRequestMethodPOST); request->addPOSTValue("v", "1"); - request->addPOSTValue("tid", "UA-55061270-1"); + request->addPOSTValue("tid", "UA-58200293-1"); request->addPOSTValue("cid", player::DeviceEx::getInstance()->getUserGUID().c_str()); request->addPOSTValue("t", "event"); diff --git a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp index d80eb27eb0..fb7ba66912 100644 --- a/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp +++ b/tests/cpp-tests/Classes/NewAudioEngineTest/NewAudioEngineTest.cpp @@ -347,7 +347,7 @@ std::string AudioEngineTestDemo::title() const bool AudioControlTest::init() { auto ret = AudioEngineTestDemo::init(); - _audioID = AudioEngine::INVAILD_AUDIO_ID; + _audioID = AudioEngine::INVALID_AUDIO_ID; _loopEnabled = false; _volume = 1.0f; _duration = AudioEngine::TIME_UNKNOWN; @@ -359,13 +359,13 @@ bool AudioControlTest::init() auto& layerSize = this->getContentSize(); auto playItem = TextButton::create("play", [&](TextButton* button){ - if (_audioID == AudioEngine::INVAILD_AUDIO_ID) { + if (_audioID == AudioEngine::INVALID_AUDIO_ID) { _audioID = AudioEngine::play2d("background.mp3", _loopEnabled, _volume); - if(_audioID != AudioEngine::INVAILD_AUDIO_ID) { + if(_audioID != AudioEngine::INVALID_AUDIO_ID) { button->setEnabled(false); AudioEngine::setFinishCallback(_audioID, [&](int id, const std::string& filePath){ - _audioID = AudioEngine::INVAILD_AUDIO_ID; + _audioID = AudioEngine::INVALID_AUDIO_ID; ((TextButton*)_playItem)->setEnabled(true); _timeRatio = 0.0f; @@ -379,10 +379,10 @@ bool AudioControlTest::init() addChild(playItem); auto stopItem = TextButton::create("stop", [&](TextButton* button){ - if (_audioID != AudioEngine::INVAILD_AUDIO_ID ) { + if (_audioID != AudioEngine::INVALID_AUDIO_ID ) { AudioEngine::stop(_audioID); - _audioID = AudioEngine::INVAILD_AUDIO_ID; + _audioID = AudioEngine::INVALID_AUDIO_ID; ((TextButton*)_playItem)->setEnabled(true); } }); @@ -390,7 +390,7 @@ bool AudioControlTest::init() addChild(stopItem); auto pauseItem = TextButton::create("pause", [&](TextButton* button){ - if (_audioID != AudioEngine::INVAILD_AUDIO_ID ) { + if (_audioID != AudioEngine::INVALID_AUDIO_ID ) { AudioEngine::pause(_audioID); } }); @@ -398,7 +398,7 @@ bool AudioControlTest::init() addChild(pauseItem); auto resumeItem = TextButton::create("resume", [&](TextButton* button){ - if (_audioID != AudioEngine::INVAILD_AUDIO_ID ) { + if (_audioID != AudioEngine::INVALID_AUDIO_ID ) { AudioEngine::resume(_audioID); } }); @@ -408,7 +408,7 @@ bool AudioControlTest::init() auto loopItem = TextButton::create("enable-loop", [&](TextButton* button){ _loopEnabled = !_loopEnabled; - if (_audioID != AudioEngine::INVAILD_AUDIO_ID ) { + if (_audioID != AudioEngine::INVALID_AUDIO_ID ) { AudioEngine::setLoop(_audioID, _loopEnabled); } if(_loopEnabled){ @@ -424,7 +424,7 @@ bool AudioControlTest::init() auto uncacheItem = TextButton::create("uncache", [&](TextButton* button){ AudioEngine::uncache("background.mp3"); - _audioID = AudioEngine::INVAILD_AUDIO_ID; + _audioID = AudioEngine::INVALID_AUDIO_ID; ((TextButton*)_playItem)->setEnabled(true); }); uncacheItem->setPosition(layerSize.width * 0.7f,layerSize.height * 0.5f); @@ -434,7 +434,7 @@ bool AudioControlTest::init() volumeSlider->setPercent(100); volumeSlider->setCallBack([&](SliderEx* sender,float ratio,SliderEx::TouchEvent event){ _volume = ratio; - if (_audioID != AudioEngine::INVAILD_AUDIO_ID ) { + if (_audioID != AudioEngine::INVALID_AUDIO_ID ) { AudioEngine::setVolume(_audioID, _volume); } }); @@ -449,7 +449,7 @@ bool AudioControlTest::init() _updateTimeSlider = false; break; case SliderEx::TouchEvent::UP: - if (_audioID != AudioEngine::INVAILD_AUDIO_ID && _duration != AudioEngine::TIME_UNKNOWN) { + if (_audioID != AudioEngine::INVALID_AUDIO_ID && _duration != AudioEngine::TIME_UNKNOWN) { AudioEngine::setCurrentTime(_audioID,_duration * ratio); } case SliderEx::TouchEvent::CANCEL: @@ -481,7 +481,7 @@ bool AudioControlTest::init() void AudioControlTest::update(float dt) { - if (_audioID != AudioEngine::INVAILD_AUDIO_ID ) { + if (_audioID != AudioEngine::INVALID_AUDIO_ID ) { if(_duration == AudioEngine::TIME_UNKNOWN){ _duration = AudioEngine::getDuration(_audioID); } @@ -524,7 +524,7 @@ bool PlaySimultaneouslyTest::init() auto startTime = utils::gettime(); for(int index = 0; index < TEST_COUNT; ++index){ audioId = AudioEngine::play2d(_files[index]); - if(audioId != AudioEngine::INVAILD_AUDIO_ID){ + if(audioId != AudioEngine::INVALID_AUDIO_ID){ _playingcount += 1; AudioEngine::setFinishCallback(audioId, [&](int id, const std::string& filePath){ @@ -584,7 +584,7 @@ bool AudioProfileTest::init() auto playItem = TextButton::create(text, [&](TextButton* button){ int index = button->getTag(); auto id = AudioEngine::play2d(_files[index], false, 1.0f, &_audioProfile); - if(id != AudioEngine::INVAILD_AUDIO_ID){ + if(id != AudioEngine::INVALID_AUDIO_ID){ _time = _minDelay; _audioCount += 1; char show[30];