mirror of https://github.com/axmolengine/axmol.git
Merge pull request #9201 from MSOpenTech/v3-win8.1-appstate
V3 win8.1 universal app pause and resume support
This commit is contained in:
commit
4cc59a9a0f
|
@ -471,7 +471,7 @@ Image::~Image()
|
|||
{
|
||||
if(_unpack)
|
||||
{
|
||||
for (unsigned int i = 0; i < _numberOfMipmaps; ++i)
|
||||
for (int i = 0; i < _numberOfMipmaps; ++i)
|
||||
CC_SAFE_DELETE_ARRAY(_mipmaps[i].address);
|
||||
}
|
||||
else
|
||||
|
@ -1727,14 +1727,17 @@ bool Image::initWithTGAData(tImageTGA* tgaData)
|
|||
|
||||
if (ret)
|
||||
{
|
||||
const unsigned char tgaSuffix[] = ".tga";
|
||||
for(int i = 0; i < 4; ++i)
|
||||
if (_filePath.length() > 0)
|
||||
{
|
||||
if (tolower(_filePath[_filePath.length() - i - 1]) != tgaSuffix[3 - i])
|
||||
const unsigned char tgaSuffix [] = ".tga";
|
||||
for (int i = 0; i < 4; ++i)
|
||||
{
|
||||
CCLOG("Image WARNING: the image file suffix is not tga, but parsed as a tga image file. FILE: %s", _filePath.c_str());
|
||||
break;
|
||||
};
|
||||
if (tolower(_filePath[_filePath.length() - i - 1]) != tgaSuffix[3 - i])
|
||||
{
|
||||
CCLOG("Image WARNING: the image file suffix is not tga, but parsed as a tga image file. FILE: %s", _filePath.c_str());
|
||||
break;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -82,7 +82,7 @@ to be different from other platforms unless there's a good reason.
|
|||
|
||||
It's new in cocos2d-x since v0.99.5
|
||||
*/
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
#define CC_ENABLE_CACHE_TEXTURE_DATA 1
|
||||
#else
|
||||
#define CC_ENABLE_CACHE_TEXTURE_DATA 0
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "CCGLViewImpl-winrt.h"
|
||||
#include "CCApplication.h"
|
||||
#include "cocos2d.h"
|
||||
#include "renderer/CCTextureCache.h"
|
||||
|
||||
// These are used by the shader compilation methods.
|
||||
#include <vector>
|
||||
|
@ -44,14 +45,6 @@ Cocos2dRenderer::Cocos2dRenderer(int width, int height, float dpi, CoreDispatche
|
|||
, m_panel(panel)
|
||||
{
|
||||
m_app = new AppDelegate();
|
||||
auto director = cocos2d::Director::getInstance();
|
||||
|
||||
GLViewImpl* glview = GLViewImpl::create("Test Cpp");
|
||||
glview->setDispatcher(dispatcher);
|
||||
glview->setPanel(panel);
|
||||
glview->Create(static_cast<float>(width), static_cast<float>(height), dpi, DisplayOrientations::Landscape);
|
||||
director->setOpenGLView(glview);
|
||||
CCApplication::getInstance()->run();
|
||||
}
|
||||
|
||||
Cocos2dRenderer::~Cocos2dRenderer()
|
||||
|
@ -59,7 +52,58 @@ Cocos2dRenderer::~Cocos2dRenderer()
|
|||
delete m_app;
|
||||
}
|
||||
|
||||
// Draws a basic triangle
|
||||
void Cocos2dRenderer::Resume()
|
||||
{
|
||||
auto director = cocos2d::Director::getInstance();
|
||||
auto glview = director->getOpenGLView();
|
||||
|
||||
if (!glview)
|
||||
{
|
||||
GLViewImpl* glview = GLViewImpl::create("Test Cpp");
|
||||
glview->setDispatcher(m_dispatcher.Get());
|
||||
glview->setPanel(m_panel.Get());
|
||||
glview->Create(static_cast<float>(m_width), static_cast<float>(m_height), m_dpi, DisplayOrientations::Landscape);
|
||||
director->setOpenGLView(glview);
|
||||
CCApplication::getInstance()->run();
|
||||
}
|
||||
else
|
||||
{
|
||||
Application::getInstance()->applicationWillEnterForeground();
|
||||
}
|
||||
}
|
||||
|
||||
void Cocos2dRenderer::Pause()
|
||||
{
|
||||
if (Director::getInstance()->getOpenGLView()) {
|
||||
Application::getInstance()->applicationDidEnterBackground();
|
||||
//cocos2d::EventCustom backgroundEvent(EVENT_COME_TO_BACKGROUND);
|
||||
//cocos2d::Director::getInstance()->getEventDispatcher()->dispatchEvent(&backgroundEvent);
|
||||
}
|
||||
}
|
||||
|
||||
void Cocos2dRenderer::DeviceLost()
|
||||
{
|
||||
Pause();
|
||||
|
||||
auto director = cocos2d::Director::getInstance();
|
||||
if (director->getOpenGLView()) {
|
||||
cocos2d::GL::invalidateStateCache();
|
||||
cocos2d::GLProgramCache::getInstance()->reloadDefaultGLPrograms();
|
||||
cocos2d::DrawPrimitives::init();
|
||||
cocos2d::VolatileTextureMgr::reloadAllTextures();
|
||||
|
||||
cocos2d::EventCustom recreatedEvent(EVENT_RENDERER_RECREATED);
|
||||
director->getEventDispatcher()->dispatchEvent(&recreatedEvent);
|
||||
director->setGLDefaultValues();
|
||||
|
||||
Application::getInstance()->applicationWillEnterForeground();
|
||||
cocos2d::EventCustom foregroundEvent(EVENT_COME_TO_FOREGROUND);
|
||||
cocos2d::Director::getInstance()->getEventDispatcher()->dispatchEvent(&foregroundEvent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Cocos2dRenderer::Draw(GLsizei width, GLsizei height, float dpi)
|
||||
{
|
||||
if (width != m_width || height != m_height)
|
||||
|
|
|
@ -34,7 +34,10 @@ namespace cocos2d
|
|||
void Draw(GLsizei width, GLsizei height, float dpi);
|
||||
void QueuePointerEvent(PointerEventType type, Windows::UI::Core::PointerEventArgs^ args);
|
||||
void QueueKeyBoardEvent(Cocos2dKeyEvent type, Windows::UI::Core::KeyEventArgs^ e);
|
||||
|
||||
void Pause();
|
||||
void Resume();
|
||||
void DeviceLost();
|
||||
|
||||
private:
|
||||
|
||||
int m_width;
|
||||
|
|
|
@ -48,7 +48,8 @@ OpenGLESPage::OpenGLESPage(OpenGLES* openGLES) :
|
|||
mCustomRenderSurfaceSize(0,0),
|
||||
mUseCustomRenderSurfaceSize(false),
|
||||
m_coreInput(nullptr),
|
||||
m_dpi(0.0f)
|
||||
m_dpi(0.0f),
|
||||
m_deviceLost(false)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
|
@ -209,7 +210,6 @@ void OpenGLESPage::RecoverFromLostDevice()
|
|||
|
||||
{
|
||||
critical_section::scoped_lock lock(mRenderSurfaceCriticalSection);
|
||||
|
||||
DestroyRenderSurface();
|
||||
mOpenGLES->Reset();
|
||||
CreateRenderSurface();
|
||||
|
@ -249,9 +249,19 @@ void OpenGLESPage::StartRenderLoop()
|
|||
m_renderer = std::make_shared<Cocos2dRenderer>(panelWidth, panelHeight, m_dpi, dispatcher, swapChainPanel);
|
||||
}
|
||||
|
||||
while (action->Status == Windows::Foundation::AsyncStatus::Started)
|
||||
if (m_deviceLost)
|
||||
{
|
||||
m_deviceLost = false;
|
||||
m_renderer->DeviceLost();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_renderer->Resume();
|
||||
}
|
||||
|
||||
|
||||
while (action->Status == Windows::Foundation::AsyncStatus::Started && !m_deviceLost)
|
||||
{
|
||||
|
||||
GetSwapChainPanelSize(&panelWidth, &panelHeight);
|
||||
m_renderer.get()->Draw(panelWidth, panelHeight, m_dpi);
|
||||
|
||||
|
@ -259,9 +269,10 @@ void OpenGLESPage::StartRenderLoop()
|
|||
// If the call fails, then we must reinitialize EGL and the GL resources.
|
||||
if (mOpenGLES->SwapBuffers(mRenderSurface) != GL_TRUE)
|
||||
{
|
||||
m_deviceLost = true;
|
||||
|
||||
// XAML objects like the SwapChainPanel must only be manipulated on the UI thread.
|
||||
swapChainPanel->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High, ref new Windows::UI::Core::DispatchedHandler([=]()
|
||||
//swapChainPanel->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High, ref new Windows::UI::Core::DispatchedHandler([=]()
|
||||
{
|
||||
RecoverFromLostDevice();
|
||||
}, CallbackContext::Any));
|
||||
|
@ -282,4 +293,9 @@ void OpenGLESPage::StopRenderLoop()
|
|||
mRenderLoopWorker->Cancel();
|
||||
mRenderLoopWorker = nullptr;
|
||||
}
|
||||
|
||||
if (m_renderer)
|
||||
{
|
||||
m_renderer->Pause();
|
||||
}
|
||||
}
|
|
@ -69,5 +69,7 @@ namespace cocos2d
|
|||
void OnPointerReleased(Platform::Object^ sender, Windows::UI::Core::PointerEventArgs^ e);
|
||||
|
||||
float m_dpi;
|
||||
bool m_deviceLost;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -25,6 +25,9 @@ THE SOFTWARE.
|
|||
#include "platform/CCPlatformConfig.h"
|
||||
#if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT
|
||||
#include "platform/winrt/CCGLViewImpl-winrt.h"
|
||||
using namespace Windows::UI::Core;
|
||||
using namespace Windows::Foundation;
|
||||
|
||||
#else
|
||||
#include "platform/wp8/CCGLViewImpl-wp8.h"
|
||||
#endif
|
||||
|
@ -98,19 +101,32 @@ Application* Application::getInstance()
|
|||
|
||||
const char * Application::getCurrentLanguageCode()
|
||||
{
|
||||
static std::string code = "";
|
||||
static std::string code = "en";
|
||||
|
||||
wchar_t localeName[LOCALE_NAME_MAX_LENGTH] = {0};
|
||||
if (GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH))
|
||||
{
|
||||
wchar_t* primary = wcstok(localeName, L"-");
|
||||
code = CCUnicodeToUtf8(primary);
|
||||
}
|
||||
else
|
||||
{
|
||||
code = "en";
|
||||
#if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT
|
||||
auto languages = Windows::System::UserProfile::GlobalizationPreferences::Languages;
|
||||
code = PlatformStringToString(languages->GetAt(0));
|
||||
#else
|
||||
ULONG numLanguages = 0;
|
||||
DWORD cchLanguagesBuffer = 0;
|
||||
BOOL result = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLanguages, NULL, &cchLanguagesBuffer);
|
||||
|
||||
if (result) {
|
||||
WCHAR* pwszLanguagesBuffer = new WCHAR[cchLanguagesBuffer];
|
||||
result = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLanguages, pwszLanguagesBuffer, &cchLanguagesBuffer);
|
||||
if (result) {
|
||||
|
||||
code = CCUnicodeToUtf8(pwszLanguagesBuffer);
|
||||
}
|
||||
|
||||
if (pwszLanguagesBuffer)
|
||||
{
|
||||
delete pwszLanguagesBuffer;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
return code.c_str();
|
||||
}
|
||||
|
||||
|
@ -121,51 +137,51 @@ LanguageType Application::getCurrentLanguage()
|
|||
|
||||
const char* code = getCurrentLanguageCode();
|
||||
|
||||
if (strcmp(code, "zh") == 0)
|
||||
if (strncmp(code, "zh", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::CHINESE;
|
||||
}
|
||||
else if (strcmp(code, "ja") == 0)
|
||||
else if (strncmp(code, "ja", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::JAPANESE;
|
||||
}
|
||||
else if (strcmp(code, "fr") == 0)
|
||||
else if (strncmp(code, "fr", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::FRENCH;
|
||||
}
|
||||
else if (strcmp(code, "it") == 0)
|
||||
else if (strncmp(code, "it", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::ITALIAN;
|
||||
}
|
||||
else if (strcmp(code, "de") == 0)
|
||||
else if (strncmp(code, "de", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::GERMAN;
|
||||
}
|
||||
else if (strcmp(code, "es") == 0)
|
||||
else if (strncmp(code, "es", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::SPANISH;
|
||||
}
|
||||
else if (strcmp(code, "nl") == 0)
|
||||
else if (strncmp(code, "nl", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::DUTCH;
|
||||
}
|
||||
else if (strcmp(code, "ru") == 0)
|
||||
else if (strncmp(code, "ru", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::RUSSIAN;
|
||||
}
|
||||
else if (strcmp(code, "hu") == 0)
|
||||
else if (strncmp(code, "hu", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::HUNGARIAN;
|
||||
}
|
||||
else if (strcmp(code, "pt") == 0)
|
||||
else if (strncmp(code, "pt", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::PORTUGUESE;
|
||||
}
|
||||
else if (strcmp(code, "ko") == 0)
|
||||
else if (strncmp(code, "ko", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::KOREAN;
|
||||
}
|
||||
else if (strcmp(code, "ar") == 0)
|
||||
else if (strncmp(code, "ar", 2) == 0)
|
||||
{
|
||||
ret = LanguageType::ARABIC;
|
||||
}
|
||||
|
@ -180,6 +196,14 @@ Application::Platform Application::getTargetPlatform()
|
|||
|
||||
bool Application::openURL(const std::string &url)
|
||||
{
|
||||
#if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT
|
||||
auto dispatcher = cocos2d::GLViewImpl::sharedOpenGLView()->getDispatcher();
|
||||
dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new DispatchedHandler([url]() {
|
||||
auto uri = ref new Windows::Foundation::Uri(PlatformStringFromString(url));
|
||||
concurrency::task<bool> launchUriOperation(Windows::System::Launcher::LaunchUriAsync(uri));
|
||||
}));
|
||||
return true;
|
||||
#else
|
||||
if (m_openURLDelegate)
|
||||
{
|
||||
m_openURLDelegate(PlatformStringFromString(url));
|
||||
|
@ -189,6 +213,7 @@ bool Application::openURL(const std::string &url)
|
|||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void Application::setResourceRootPath(const std::string& rootResDir)
|
||||
|
|
|
@ -279,7 +279,7 @@ GLProgramState::GLProgramState()
|
|||
, _vertexAttribsFlags(0)
|
||||
, _glprogram(nullptr)
|
||||
{
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
/** listen the event that renderer was recreated on Android/WP8 */
|
||||
CCLOG("create rendererRecreatedListener for GLProgramState");
|
||||
_backToForegroundlistener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, [this](EventCustom*) { _uniformAttributeValueDirty = true; });
|
||||
|
@ -289,7 +289,7 @@ GLProgramState::GLProgramState()
|
|||
|
||||
GLProgramState::~GLProgramState()
|
||||
{
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
Director::getInstance()->getEventDispatcher()->removeEventListener(_backToForegroundlistener);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -218,7 +218,7 @@ protected:
|
|||
uint32_t _vertexAttribsFlags;
|
||||
GLProgram *_glprogram;
|
||||
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
EventListenerCustom* _backToForegroundlistener;
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -92,7 +92,7 @@ MeshCommand::MeshCommand()
|
|||
, _lightMask(-1)
|
||||
{
|
||||
_type = RenderCommand::Type::MESH_COMMAND;
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
// listen the event that renderer was recreated on Android/WP8
|
||||
_rendererRecreatedListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, CC_CALLBACK_1(MeshCommand::listenRendererRecreated, this));
|
||||
Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_rendererRecreatedListener, -1);
|
||||
|
@ -154,7 +154,7 @@ void MeshCommand::setDisplayColor(const Vec4& color)
|
|||
MeshCommand::~MeshCommand()
|
||||
{
|
||||
releaseVAO();
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
Director::getInstance()->getEventDispatcher()->removeEventListener(_rendererRecreatedListener);
|
||||
#endif
|
||||
}
|
||||
|
@ -506,7 +506,7 @@ void MeshCommand::resetLightUniformValues()
|
|||
s_spotLightUniformRangeInverseValues.assign(maxSpotLight, 0.0f);
|
||||
}
|
||||
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
void MeshCommand::listenRendererRecreated(EventCustom* event)
|
||||
{
|
||||
_vao = 0;
|
||||
|
|
|
@ -75,7 +75,7 @@ public:
|
|||
|
||||
uint32_t getMaterialID() const { return _materialID; }
|
||||
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
void listenRendererRecreated(EventCustom* event);
|
||||
#endif
|
||||
|
||||
|
@ -129,7 +129,7 @@ protected:
|
|||
|
||||
unsigned int _lightMask;
|
||||
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
EventListenerCustom* _rendererRecreatedListener;
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -30,13 +30,13 @@
|
|||
|
||||
NS_CC_BEGIN
|
||||
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
bool VertexBuffer::_enableShadowCopy = true;
|
||||
#else
|
||||
bool VertexBuffer::_enableShadowCopy = false;
|
||||
#endif
|
||||
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
bool IndexBuffer::_enableShadowCopy = true;
|
||||
#else
|
||||
bool IndexBuffer::_enableShadowCopy = false;
|
||||
|
@ -62,7 +62,7 @@ VertexBuffer::VertexBuffer()
|
|||
, _vertexNumber(0)
|
||||
{
|
||||
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
auto callBack = [this](EventCustom* event)
|
||||
{
|
||||
this->recreateVBO();
|
||||
|
@ -80,7 +80,7 @@ VertexBuffer::~VertexBuffer()
|
|||
glDeleteBuffers(1, &_vbo);
|
||||
_vbo = 0;
|
||||
}
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
Director::getInstance()->getEventDispatcher()->removeEventListener(_recreateVBOEventListener);
|
||||
#endif
|
||||
}
|
||||
|
@ -189,7 +189,7 @@ IndexBuffer::IndexBuffer()
|
|||
, _indexNumber(0)
|
||||
, _recreateVBOEventListener(nullptr)
|
||||
{
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
auto callBack = [this](EventCustom* event)
|
||||
{
|
||||
this->recreateVBO();
|
||||
|
@ -206,7 +206,7 @@ IndexBuffer::~IndexBuffer()
|
|||
glDeleteBuffers(1, &_vbo);
|
||||
_vbo = 0;
|
||||
}
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
Director::getInstance()->getEventDispatcher()->removeEventListener(_recreateVBOEventListener);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "CCGLViewImpl-winrt.h"
|
||||
#include "CCApplication.h"
|
||||
#include "cocos2d.h"
|
||||
#include "renderer/CCTextureCache.h"
|
||||
|
||||
// These are used by the shader compilation methods.
|
||||
#include <vector>
|
||||
|
@ -44,14 +45,6 @@ Cocos2dRenderer::Cocos2dRenderer(int width, int height, float dpi, CoreDispatche
|
|||
, m_panel(panel)
|
||||
{
|
||||
m_app = new AppDelegate();
|
||||
auto director = cocos2d::Director::getInstance();
|
||||
|
||||
GLViewImpl* glview = GLViewImpl::create("Test Cpp");
|
||||
glview->setDispatcher(dispatcher);
|
||||
glview->setPanel(panel);
|
||||
glview->Create(static_cast<float>(width), static_cast<float>(height), dpi, DisplayOrientations::Landscape);
|
||||
director->setOpenGLView(glview);
|
||||
CCApplication::getInstance()->run();
|
||||
}
|
||||
|
||||
Cocos2dRenderer::~Cocos2dRenderer()
|
||||
|
@ -59,7 +52,58 @@ Cocos2dRenderer::~Cocos2dRenderer()
|
|||
delete m_app;
|
||||
}
|
||||
|
||||
// Draws a basic triangle
|
||||
void Cocos2dRenderer::Resume()
|
||||
{
|
||||
auto director = cocos2d::Director::getInstance();
|
||||
auto glview = director->getOpenGLView();
|
||||
|
||||
if (!glview)
|
||||
{
|
||||
GLViewImpl* glview = GLViewImpl::create("Test Cpp");
|
||||
glview->setDispatcher(m_dispatcher.Get());
|
||||
glview->setPanel(m_panel.Get());
|
||||
glview->Create(static_cast<float>(m_width), static_cast<float>(m_height), m_dpi, DisplayOrientations::Landscape);
|
||||
director->setOpenGLView(glview);
|
||||
CCApplication::getInstance()->run();
|
||||
}
|
||||
else
|
||||
{
|
||||
Application::getInstance()->applicationWillEnterForeground();
|
||||
}
|
||||
}
|
||||
|
||||
void Cocos2dRenderer::Pause()
|
||||
{
|
||||
if (Director::getInstance()->getOpenGLView()) {
|
||||
Application::getInstance()->applicationDidEnterBackground();
|
||||
//cocos2d::EventCustom backgroundEvent(EVENT_COME_TO_BACKGROUND);
|
||||
//cocos2d::Director::getInstance()->getEventDispatcher()->dispatchEvent(&backgroundEvent);
|
||||
}
|
||||
}
|
||||
|
||||
void Cocos2dRenderer::DeviceLost()
|
||||
{
|
||||
Pause();
|
||||
|
||||
auto director = cocos2d::Director::getInstance();
|
||||
if (director->getOpenGLView()) {
|
||||
cocos2d::GL::invalidateStateCache();
|
||||
cocos2d::GLProgramCache::getInstance()->reloadDefaultGLPrograms();
|
||||
cocos2d::DrawPrimitives::init();
|
||||
cocos2d::VolatileTextureMgr::reloadAllTextures();
|
||||
|
||||
cocos2d::EventCustom recreatedEvent(EVENT_RENDERER_RECREATED);
|
||||
director->getEventDispatcher()->dispatchEvent(&recreatedEvent);
|
||||
director->setGLDefaultValues();
|
||||
|
||||
Application::getInstance()->applicationWillEnterForeground();
|
||||
cocos2d::EventCustom foregroundEvent(EVENT_COME_TO_FOREGROUND);
|
||||
cocos2d::Director::getInstance()->getEventDispatcher()->dispatchEvent(&foregroundEvent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Cocos2dRenderer::Draw(GLsizei width, GLsizei height, float dpi)
|
||||
{
|
||||
if (width != m_width || height != m_height)
|
||||
|
|
|
@ -34,7 +34,10 @@ namespace cocos2d
|
|||
void Draw(GLsizei width, GLsizei height, float dpi);
|
||||
void QueuePointerEvent(PointerEventType type, Windows::UI::Core::PointerEventArgs^ args);
|
||||
void QueueKeyBoardEvent(Cocos2dKeyEvent type, Windows::UI::Core::KeyEventArgs^ e);
|
||||
|
||||
void Pause();
|
||||
void Resume();
|
||||
void DeviceLost();
|
||||
|
||||
private:
|
||||
|
||||
int m_width;
|
||||
|
|
|
@ -48,7 +48,8 @@ OpenGLESPage::OpenGLESPage(OpenGLES* openGLES) :
|
|||
mCustomRenderSurfaceSize(0,0),
|
||||
mUseCustomRenderSurfaceSize(false),
|
||||
m_coreInput(nullptr),
|
||||
m_dpi(0.0f)
|
||||
m_dpi(0.0f),
|
||||
m_deviceLost(false)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
|
@ -209,7 +210,6 @@ void OpenGLESPage::RecoverFromLostDevice()
|
|||
|
||||
{
|
||||
critical_section::scoped_lock lock(mRenderSurfaceCriticalSection);
|
||||
|
||||
DestroyRenderSurface();
|
||||
mOpenGLES->Reset();
|
||||
CreateRenderSurface();
|
||||
|
@ -249,9 +249,19 @@ void OpenGLESPage::StartRenderLoop()
|
|||
m_renderer = std::make_shared<Cocos2dRenderer>(panelWidth, panelHeight, m_dpi, dispatcher, swapChainPanel);
|
||||
}
|
||||
|
||||
while (action->Status == Windows::Foundation::AsyncStatus::Started)
|
||||
if (m_deviceLost)
|
||||
{
|
||||
m_deviceLost = false;
|
||||
m_renderer->DeviceLost();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_renderer->Resume();
|
||||
}
|
||||
|
||||
|
||||
while (action->Status == Windows::Foundation::AsyncStatus::Started && !m_deviceLost)
|
||||
{
|
||||
|
||||
GetSwapChainPanelSize(&panelWidth, &panelHeight);
|
||||
m_renderer.get()->Draw(panelWidth, panelHeight, m_dpi);
|
||||
|
||||
|
@ -259,9 +269,10 @@ void OpenGLESPage::StartRenderLoop()
|
|||
// If the call fails, then we must reinitialize EGL and the GL resources.
|
||||
if (mOpenGLES->SwapBuffers(mRenderSurface) != GL_TRUE)
|
||||
{
|
||||
m_deviceLost = true;
|
||||
|
||||
// XAML objects like the SwapChainPanel must only be manipulated on the UI thread.
|
||||
swapChainPanel->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High, ref new Windows::UI::Core::DispatchedHandler([=]()
|
||||
//swapChainPanel->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High, ref new Windows::UI::Core::DispatchedHandler([=]()
|
||||
{
|
||||
RecoverFromLostDevice();
|
||||
}, CallbackContext::Any));
|
||||
|
@ -282,4 +293,9 @@ void OpenGLESPage::StopRenderLoop()
|
|||
mRenderLoopWorker->Cancel();
|
||||
mRenderLoopWorker = nullptr;
|
||||
}
|
||||
|
||||
if (m_renderer)
|
||||
{
|
||||
m_renderer->Pause();
|
||||
}
|
||||
}
|
|
@ -69,5 +69,7 @@ namespace cocos2d
|
|||
void OnPointerReleased(Platform::Object^ sender, Windows::UI::Core::PointerEventArgs^ e);
|
||||
|
||||
float m_dpi;
|
||||
bool m_deviceLost;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -259,13 +259,14 @@ bool ShaderMandelbrot::init()
|
|||
{
|
||||
if (ShaderTestDemo::init())
|
||||
{
|
||||
#if CC_TARGET_PLATFORM != CC_PLATFORM_WINRT && CC_TARGET_PLATFORM != CC_PLATFORM_WP8
|
||||
auto sn = ShaderNode::shaderNodeWithVertex("", "Shaders/example_Mandelbrot.fsh");
|
||||
|
||||
auto s = Director::getInstance()->getWinSize();
|
||||
sn->setPosition(Vec2(s.width/2, s.height/2));
|
||||
|
||||
addChild(sn);
|
||||
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -292,13 +293,14 @@ bool ShaderJulia::init()
|
|||
{
|
||||
if (ShaderTestDemo::init())
|
||||
{
|
||||
#if CC_TARGET_PLATFORM != CC_PLATFORM_WINRT && CC_TARGET_PLATFORM != CC_PLATFORM_WP8
|
||||
auto sn = ShaderNode::shaderNodeWithVertex("", "Shaders/example_Julia.fsh");
|
||||
|
||||
auto s = Director::getInstance()->getWinSize();
|
||||
sn->setPosition(Vec2(s.width/2, s.height/2));
|
||||
|
||||
addChild(sn);
|
||||
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -562,6 +564,7 @@ bool ShaderBlur::init()
|
|||
{
|
||||
if( ShaderTestDemo::init() )
|
||||
{
|
||||
#if CC_TARGET_PLATFORM != CC_PLATFORM_WINRT && CC_TARGET_PLATFORM != CC_PLATFORM_WP8
|
||||
_blurSprite = SpriteBlur::create("Images/grossini.png");
|
||||
auto sprite = Sprite::create("Images/grossini.png");
|
||||
auto s = Director::getInstance()->getWinSize();
|
||||
|
@ -572,7 +575,7 @@ bool ShaderBlur::init()
|
|||
addChild(sprite);
|
||||
|
||||
createSliderCtls();
|
||||
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -209,7 +209,7 @@ bool Effect::initGLProgramState(const std::string &fragmentFilename)
|
|||
auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath);
|
||||
auto glprogram = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert, fragSource.c_str());
|
||||
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
_fragSource = fragSource;
|
||||
#endif
|
||||
|
||||
|
@ -222,7 +222,7 @@ bool Effect::initGLProgramState(const std::string &fragmentFilename)
|
|||
Effect::Effect()
|
||||
: _glprogramstate(nullptr)
|
||||
{
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
_backgroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED,
|
||||
[this](EventCustom*)
|
||||
{
|
||||
|
@ -240,7 +240,7 @@ Effect::Effect()
|
|||
Effect::~Effect()
|
||||
{
|
||||
CC_SAFE_RELEASE_NULL(_glprogramstate);
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
Director::getInstance()->getEventDispatcher()->removeEventListener(_backgroundListener);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ protected:
|
|||
Effect();
|
||||
virtual ~Effect();
|
||||
GLProgramState *_glprogramstate;
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
std::string _fragSource;
|
||||
EventListenerCustom* _backgroundListener;
|
||||
#endif
|
||||
|
|
|
@ -536,7 +536,7 @@ Effect3DOutline::Effect3DOutline()
|
|||
, _outlineColor(1, 1, 1)
|
||||
, _sprite(nullptr)
|
||||
{
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
_backToForegroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED,
|
||||
[this](EventCustom*)
|
||||
{
|
||||
|
@ -553,7 +553,7 @@ Effect3DOutline::Effect3DOutline()
|
|||
|
||||
Effect3DOutline::~Effect3DOutline()
|
||||
{
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
Director::getInstance()->getEventDispatcher()->removeEventListener(_backToForegroundListener);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@ protected:
|
|||
float _outlineWidth;
|
||||
//weak reference
|
||||
EffectSprite3D* _sprite;
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
|
||||
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
|
||||
EventListenerCustom* _backToForegroundListener;
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue