mirror of https://github.com/axmolengine/axmol.git
Linux: added SDL2 backend as replacement for GLFW.
Initially planned as alternative, made replacement after discussion with minggo. Summary: GLFW v.3 released in June. New version breaks API without real need: http://cocos2d-x.org/boards/6/topics/31277 Meanwhile SDL2 is very stable. SDL2 used in Steam Runtime and will be part of Ubuntu SDK, it's supported by other distributions. Completed: - OpenGL initialization and window handling with SDL - Keyboard, IME emulation, mouse and touches support with SDL - Window title now contains app name on Linux - Backspace correctly handled with new backend Note: - SDL on X11 have no proper multitouch, but backend handles multitouch events to support future Linux graphics.
This commit is contained in:
parent
df33991a38
commit
d23d486720
|
@ -106,7 +106,7 @@ Director::Director(void)
|
||||||
|
|
||||||
bool Director::init(void)
|
bool Director::init(void)
|
||||||
{
|
{
|
||||||
setDefaultValues();
|
setDefaultValues();
|
||||||
|
|
||||||
// scenes
|
// scenes
|
||||||
_runningScene = NULL;
|
_runningScene = NULL;
|
||||||
|
@ -253,6 +253,11 @@ void Director::drawScene(void)
|
||||||
// calculate "global" dt
|
// calculate "global" dt
|
||||||
calculateDeltaTime();
|
calculateDeltaTime();
|
||||||
|
|
||||||
|
if (_openGLView)
|
||||||
|
{
|
||||||
|
_openGLView->pollInputEvents();
|
||||||
|
}
|
||||||
|
|
||||||
//tick before glClear: issue #533
|
//tick before glClear: issue #533
|
||||||
if (! _paused)
|
if (! _paused)
|
||||||
{
|
{
|
||||||
|
@ -645,7 +650,7 @@ void Director::popToSceneStackLevel(int level)
|
||||||
// pop stack until reaching desired level
|
// pop stack until reaching desired level
|
||||||
while (c > level)
|
while (c > level)
|
||||||
{
|
{
|
||||||
Scene *current = (Scene*)_scenesStack->lastObject();
|
Scene *current = (Scene*)_scenesStack->lastObject();
|
||||||
|
|
||||||
if (current->isRunning())
|
if (current->isRunning())
|
||||||
{
|
{
|
||||||
|
@ -658,7 +663,7 @@ void Director::popToSceneStackLevel(int level)
|
||||||
c--;
|
c--;
|
||||||
}
|
}
|
||||||
|
|
||||||
_nextScene = (Scene*)_scenesStack->lastObject();
|
_nextScene = (Scene*)_scenesStack->lastObject();
|
||||||
_sendCleanupToScene = false;
|
_sendCleanupToScene = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,10 @@ EGLViewProtocol::~EGLViewProtocol()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EGLViewProtocol::pollInputEvents()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void EGLViewProtocol::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)
|
void EGLViewProtocol::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)
|
||||||
{
|
{
|
||||||
CCASSERT(resolutionPolicy != ResolutionPolicy::UNKNOWN, "should set resolutionPolicy");
|
CCASSERT(resolutionPolicy != ResolutionPolicy::UNKNOWN, "should set resolutionPolicy");
|
||||||
|
|
|
@ -58,6 +58,12 @@ public:
|
||||||
/** Open or close IME keyboard , subclass must implement this method. */
|
/** Open or close IME keyboard , subclass must implement this method. */
|
||||||
virtual void setIMEKeyboardState(bool bOpen) = 0;
|
virtual void setIMEKeyboardState(bool bOpen) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Polls input events. Subclass must implement methods if platform
|
||||||
|
* does not provide event callbacks.
|
||||||
|
*/
|
||||||
|
virtual void pollInputEvents();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the frame size of EGL view.
|
* Get the frame size of EGL view.
|
||||||
* In general, it returns the screen size since the EGL view is a fullscreen view.
|
* In general, it returns the screen size since the EGL view is a fullscreen view.
|
||||||
|
|
|
@ -7,78 +7,26 @@
|
||||||
|
|
||||||
#include "CCEGLView.h"
|
#include "CCEGLView.h"
|
||||||
#include "CCGL.h"
|
#include "CCGL.h"
|
||||||
#include "GL/glfw.h"
|
|
||||||
#include "ccMacros.h"
|
#include "ccMacros.h"
|
||||||
#include "CCDirector.h"
|
#include "CCDirector.h"
|
||||||
#include "touch_dispatcher/CCTouch.h"
|
#include "touch_dispatcher/CCTouch.h"
|
||||||
#include "touch_dispatcher/CCTouchDispatcher.h"
|
#include "touch_dispatcher/CCTouchDispatcher.h"
|
||||||
#include "text_input_node/CCIMEDispatcher.h"
|
#include "text_input_node/CCIMEDispatcher.h"
|
||||||
#include "keyboard_dispatcher/CCKeyboardDispatcher.h"
|
#include "keyboard_dispatcher/CCKeyboardDispatcher.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL;
|
bool initExtensions()
|
||||||
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = NULL;
|
{
|
||||||
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = NULL;
|
// Do nothing, on Linux we use GLEW.
|
||||||
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = NULL;
|
|
||||||
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = NULL;
|
|
||||||
PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT = NULL;
|
|
||||||
|
|
||||||
PFNGLGENBUFFERSARBPROC glGenBuffersARB = NULL;
|
|
||||||
PFNGLBINDBUFFERARBPROC glBindBufferARB = NULL;
|
|
||||||
PFNGLBUFFERDATAARBPROC glBufferDataARB = NULL;
|
|
||||||
PFNGLBUFFERSUBDATAARBPROC glBufferSubDataARB = NULL;
|
|
||||||
PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = NULL;
|
|
||||||
|
|
||||||
bool initExtensions() {
|
|
||||||
#define LOAD_EXTENSION_FUNCTION(TYPE, FN) FN = (TYPE)glfwGetProcAddress(#FN);
|
|
||||||
bool bRet = false;
|
|
||||||
do {
|
|
||||||
|
|
||||||
// char* p = (char*) glGetString(GL_EXTENSIONS);
|
|
||||||
// printf(p);
|
|
||||||
|
|
||||||
/* Supports frame buffer? */
|
|
||||||
if (glfwExtensionSupported("GL_EXT_framebuffer_object") != GL_FALSE)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Loads frame buffer extension functions */
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLGENERATEMIPMAPEXTPROC,
|
|
||||||
glGenerateMipmapEXT);
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLGENFRAMEBUFFERSEXTPROC,
|
|
||||||
glGenFramebuffersEXT);
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLDELETEFRAMEBUFFERSEXTPROC,
|
|
||||||
glDeleteFramebuffersEXT);
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLBINDFRAMEBUFFEREXTPROC,
|
|
||||||
glBindFramebufferEXT);
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC,
|
|
||||||
glCheckFramebufferStatusEXT);
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC,
|
|
||||||
glFramebufferTexture2DEXT);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (glfwExtensionSupported("GL_ARB_vertex_buffer_object") != GL_FALSE) {
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLGENBUFFERSARBPROC, glGenBuffersARB);
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLBINDBUFFERARBPROC, glBindBufferARB);
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLBUFFERDATAARBPROC, glBufferDataARB);
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLBUFFERSUBDATAARBPROC,
|
|
||||||
glBufferSubDataARB);
|
|
||||||
LOAD_EXTENSION_FUNCTION(PFNGLDELETEBUFFERSARBPROC,
|
|
||||||
glDeleteBuffersARB);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
bRet = true;
|
|
||||||
} while (0);
|
|
||||||
return bRet;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
EGLView::EGLView()
|
EGLView::EGLView()
|
||||||
: bIsInit(false)
|
: _wasInit(false)
|
||||||
, _frameZoomFactor(1.0f)
|
, _frameZoomFactor(1.0f)
|
||||||
|
,_window(nullptr)
|
||||||
|
,_context(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,185 +34,83 @@ EGLView::~EGLView()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void keyEventHandle(int iKeyID,int iKeyState) {
|
static std::string getApplicationName()
|
||||||
if (iKeyState ==GLFW_RELEASE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (iKeyID == GLFW_KEY_DEL) {
|
|
||||||
IMEDispatcher::sharedDispatcher()->dispatchDeleteBackward();
|
|
||||||
} else if (iKeyID == GLFW_KEY_ENTER) {
|
|
||||||
IMEDispatcher::sharedDispatcher()->dispatchInsertText("\n", 1);
|
|
||||||
} else if (iKeyID == GLFW_KEY_TAB) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void charEventHandle(int iCharID,int iCharState) {
|
|
||||||
if (iCharState ==GLFW_RELEASE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ascii char
|
|
||||||
IMEDispatcher::sharedDispatcher()->dispatchInsertText((const char *)&iCharID, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mouseButtonEventHandle(int iMouseID,int iMouseState) {
|
|
||||||
if (iMouseID == GLFW_MOUSE_BUTTON_LEFT) {
|
|
||||||
EGLView* pEGLView = EGLView::getInstance();
|
|
||||||
//get current mouse pos
|
|
||||||
int x,y;
|
|
||||||
glfwGetMousePos(&x, &y);
|
|
||||||
Point oPoint((float)x,(float)y);
|
|
||||||
/*
|
|
||||||
if (!Rect::RectContainsPoint(s_pMainWindow->_rcViewPort,oPoint))
|
|
||||||
{
|
|
||||||
CCLOG("not in the viewport");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
oPoint.x /= pEGLView->_frameZoomFactor;
|
|
||||||
oPoint.y /= pEGLView->_frameZoomFactor;
|
|
||||||
int id = 0;
|
|
||||||
if (iMouseState == GLFW_PRESS) {
|
|
||||||
pEGLView->handleTouchesBegin(1, &id, &oPoint.x, &oPoint.y);
|
|
||||||
|
|
||||||
} else if (iMouseState == GLFW_RELEASE) {
|
|
||||||
pEGLView->handleTouchesEnd(1, &id, &oPoint.x, &oPoint.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void mousePosEventHandle(int iPosX,int iPosY) {
|
|
||||||
int iButtonState = glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT);
|
|
||||||
|
|
||||||
//to test move
|
|
||||||
if (iButtonState == GLFW_PRESS) {
|
|
||||||
EGLView* pEGLView = EGLView::getInstance();
|
|
||||||
int id = 0;
|
|
||||||
float x = (float)iPosX;
|
|
||||||
float y = (float)iPosY;
|
|
||||||
x /= pEGLView->_frameZoomFactor;
|
|
||||||
y /= pEGLView->_frameZoomFactor;
|
|
||||||
pEGLView->handleTouchesMove(1, &id, &x, &y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int closeEventHandle() {
|
|
||||||
Director::getInstance()->end();
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLFWCALL keyboardEventHandle(int keyCode, int action)
|
|
||||||
{
|
{
|
||||||
KeyboardDispatcher *kbDisp = Director::getInstance()->getKeyboardDispatcher();
|
char fullpath[256] = {0};
|
||||||
|
ssize_t length = readlink("/proc/self/exe", fullpath, sizeof(fullpath)-1);
|
||||||
|
|
||||||
switch (action)
|
if (length <= 0) {
|
||||||
{
|
return "Cocos2dx-Linux";
|
||||||
case GLFW_PRESS:
|
}
|
||||||
kbDisp->dispatchKeyboardEvent(keyCode, true);
|
|
||||||
break;
|
fullpath[length] = '\0';
|
||||||
case GLFW_RELEASE:
|
const std::string appPath = fullpath;
|
||||||
kbDisp->dispatchKeyboardEvent(keyCode, false);
|
return appPath.substr(appPath.find_last_of('/') + 1);
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
void checkSDLError(int line)
|
||||||
|
{
|
||||||
|
#if COCOS2D_DEBUG > 0
|
||||||
|
const char *error = SDL_GetError();
|
||||||
|
if (*error != '\0')
|
||||||
|
{
|
||||||
|
if (line != -1)
|
||||||
|
CCLOG("SDL Error: %s, line: %i", error, line);
|
||||||
|
else
|
||||||
|
CCLOG("SDL Error: %s", error);
|
||||||
|
SDL_ClearError();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void EGLView::setFrameSize(float width, float height)
|
void EGLView::setFrameSize(float width, float height)
|
||||||
{
|
{
|
||||||
bool eResult = false;
|
bool eResult = false;
|
||||||
int u32GLFWFlags = GLFW_WINDOW;
|
//create the window by SDL2.
|
||||||
//create the window by glfw.
|
|
||||||
|
|
||||||
//check
|
//check
|
||||||
CCAssert(width!=0&&height!=0, "invalid window's size equal 0");
|
CCAssert(width!=0&&height!=0, "invalid window's size equal 0");
|
||||||
|
|
||||||
//Inits GLFW
|
//Inits SDL2
|
||||||
eResult = glfwInit() != GL_FALSE;
|
eResult = SDL_Init(SDL_INIT_VIDEO) == 0;
|
||||||
|
if (!eResult) {
|
||||||
|
CCAssert(0, "fail to init the SDL");
|
||||||
|
}
|
||||||
|
|
||||||
if (!eResult) {
|
const std::string appName = getApplicationName();
|
||||||
CCAssert(0, "fail to init the glfw");
|
const int iDepth = 16; // set default value
|
||||||
}
|
|
||||||
|
|
||||||
/* Updates window hint */
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
|
||||||
glfwOpenWindowHint(GLFW_WINDOW_NO_RESIZE, GL_TRUE);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
|
||||||
|
|
||||||
int iDepth = 16; // set default value
|
_window = SDL_CreateWindow(appName.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
||||||
/* Depending on video depth */
|
width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
|
||||||
switch(iDepth)
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
{
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, iDepth);
|
||||||
/* 16-bit */
|
checkSDLError(__LINE__);
|
||||||
case 16:
|
|
||||||
{
|
|
||||||
/* Updates video mode */
|
|
||||||
eResult = (glfwOpenWindow(width, height, 5, 6, 5, 0, 16, 8, (int)u32GLFWFlags) != false) ? true : false;
|
|
||||||
|
|
||||||
break;
|
_context = SDL_GL_CreateContext(_window);
|
||||||
}
|
|
||||||
|
|
||||||
/* 24-bit */
|
if (!_window || !_context) {
|
||||||
case 24:
|
CCAssert(0, "Failed to initialize OpenGL context");
|
||||||
{
|
} else {
|
||||||
/* Updates video mode */
|
SDL_GL_SetSwapInterval(1);
|
||||||
eResult = (glfwOpenWindow(width, height, 8, 8, 8, 0, 16, 8, (int)u32GLFWFlags) != false) ? true : false;
|
checkSDLError(__LINE__);
|
||||||
|
_wasInit = true;
|
||||||
|
|
||||||
break;
|
EGLViewProtocol::setFrameSize(width, height);
|
||||||
}
|
initGL();
|
||||||
|
if (!GLEW_ARB_framebuffer_object)
|
||||||
/* 32-bit */
|
CCAssert(0, "fail to init OpenGL extension ARB_framebuffer_object");
|
||||||
default:
|
if (!GLEW_ARB_vertex_buffer_object)
|
||||||
case 32:
|
CCAssert(0, "fail to init OpenGL extension ARB_vertex_buffer_object");
|
||||||
{
|
}
|
||||||
/* Updates video mode */
|
|
||||||
eResult = (glfwOpenWindow(width, height, 8, 8, 8, 8, 16, 8, (int)u32GLFWFlags) != GL_FALSE) ? true :false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Success? */
|
|
||||||
if(eResult)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Updates actual size */
|
|
||||||
// glfwGetWindowSize(&width, &height);
|
|
||||||
|
|
||||||
EGLViewProtocol::setFrameSize(width, height);
|
|
||||||
|
|
||||||
/* Updates its title */
|
|
||||||
glfwSetWindowTitle("Cocos2dx-Linux");
|
|
||||||
|
|
||||||
//set the init flag
|
|
||||||
bIsInit = true;
|
|
||||||
|
|
||||||
//register the glfw key event
|
|
||||||
glfwSetKeyCallback(keyEventHandle);
|
|
||||||
//register the glfw char event
|
|
||||||
glfwSetCharCallback(charEventHandle);
|
|
||||||
//register the glfw mouse event
|
|
||||||
glfwSetMouseButtonCallback(mouseButtonEventHandle);
|
|
||||||
//register the glfw mouse pos event
|
|
||||||
glfwSetMousePosCallback(mousePosEventHandle);
|
|
||||||
#ifdef CC_KEYBOARD_SUPPORT
|
|
||||||
//register the glfw keyboard event
|
|
||||||
glfwSetKeyCallback(keyboardEventHandle);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
glfwSetWindowCloseCallback(closeEventHandle);
|
|
||||||
|
|
||||||
//Inits extensions
|
|
||||||
eResult = initExtensions();
|
|
||||||
|
|
||||||
if (!eResult) {
|
|
||||||
CCAssert(0, "fail to init the extensions of opengl");
|
|
||||||
}
|
|
||||||
initGL();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EGLView::setFrameZoomFactor(float fZoomFactor)
|
void EGLView::setFrameZoomFactor(float fZoomFactor)
|
||||||
{
|
{
|
||||||
_frameZoomFactor = fZoomFactor;
|
_frameZoomFactor = fZoomFactor;
|
||||||
glfwSetWindowSize(_screenSize.width * fZoomFactor, _screenSize.height * fZoomFactor);
|
SDL_SetWindowSize(_window, _screenSize.width * fZoomFactor, _screenSize.height * fZoomFactor);
|
||||||
Director::getInstance()->setProjection(Director::getInstance()->getProjection());
|
Director::getInstance()->setProjection(Director::getInstance()->getProjection());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,26 +138,130 @@ void EGLView::setScissorInPoints(float x , float y , float w , float h)
|
||||||
|
|
||||||
bool EGLView::isOpenGLReady()
|
bool EGLView::isOpenGLReady()
|
||||||
{
|
{
|
||||||
return bIsInit;
|
return _wasInit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EGLView::end()
|
void EGLView::end()
|
||||||
{
|
{
|
||||||
/* Exits from GLFW */
|
SDL_GL_DeleteContext(_context);
|
||||||
glfwTerminate();
|
SDL_DestroyWindow(_window);
|
||||||
delete this;
|
SDL_Quit();
|
||||||
exit(0);
|
|
||||||
|
delete this;
|
||||||
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EGLView::swapBuffers() {
|
void EGLView::swapBuffers() {
|
||||||
if (bIsInit) {
|
if (_wasInit) {
|
||||||
/* Swap buffers */
|
/* Swap buffers */
|
||||||
glfwSwapBuffers();
|
SDL_GL_SwapWindow(_window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EGLView::setIMEKeyboardState(bool bOpen) {
|
// Polls events if SDL backend is on.
|
||||||
|
// Note that finger events allow multi-touch on Linux, but libsdl with X11
|
||||||
|
// backend does not support multitouch. However multitouch should work
|
||||||
|
// out of the box on upcoming Weston and Mir display servers.
|
||||||
|
// Also supports mouse touches emulation, keyboard events, text events.
|
||||||
|
void EGLView::pollInputEvents()
|
||||||
|
{
|
||||||
|
SDL_Event event;
|
||||||
|
while (SDL_PollEvent(&event)) {
|
||||||
|
switch (event.type) {
|
||||||
|
case SDL_QUIT:
|
||||||
|
Director::sharedDirector()->end();
|
||||||
|
break;
|
||||||
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
if (event.button.button == SDL_BUTTON_LEFT) {
|
||||||
|
int id = event.button.which;
|
||||||
|
_pressedMouseInstances.insert(id);
|
||||||
|
Point oPoint((float)event.button.x, (float)event.button.y);
|
||||||
|
oPoint.x /= _frameZoomFactor;
|
||||||
|
oPoint.y /= _frameZoomFactor;
|
||||||
|
handleTouchesBegin(1, &id, &oPoint.x, &oPoint.y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_MOUSEBUTTONUP:
|
||||||
|
if (event.button.button == SDL_BUTTON_LEFT) {
|
||||||
|
int id = event.button.which;
|
||||||
|
_pressedMouseInstances.erase(id);
|
||||||
|
Point oPoint((float)event.button.x, (float)event.button.y);
|
||||||
|
oPoint.x /= _frameZoomFactor;
|
||||||
|
oPoint.y /= _frameZoomFactor;
|
||||||
|
handleTouchesEnd(1, &id, &oPoint.x, &oPoint.y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_MOUSEMOTION:
|
||||||
|
if (_pressedMouseInstances.count(event.motion.which)) {
|
||||||
|
int id = event.motion.which;
|
||||||
|
Point oPoint((float)event.motion.x, (float)event.motion.y);
|
||||||
|
oPoint.x /= _frameZoomFactor;
|
||||||
|
oPoint.y /= _frameZoomFactor;
|
||||||
|
handleTouchesMove(1, &id, &oPoint.x, &oPoint.y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_FINGERDOWN: {
|
||||||
|
int fingerId = event.tfinger.fingerId;
|
||||||
|
Point oPoint((float)event.tfinger.x, (float)event.tfinger.y);
|
||||||
|
oPoint.x /= _frameZoomFactor;
|
||||||
|
oPoint.y /= _frameZoomFactor;
|
||||||
|
handleTouchesBegin(1, &fingerId, &oPoint.x, &oPoint.y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_FINGERUP: {
|
||||||
|
int fingerId = event.tfinger.fingerId;
|
||||||
|
Point oPoint((float)event.tfinger.x, (float)event.tfinger.y);
|
||||||
|
oPoint.x /= _frameZoomFactor;
|
||||||
|
oPoint.y /= _frameZoomFactor;
|
||||||
|
handleTouchesEnd(1, &fingerId, &oPoint.x, &oPoint.y);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SDL_FINGERMOTION: {
|
||||||
|
int fingerId = event.tfinger.fingerId;
|
||||||
|
Point oPoint((float)event.tfinger.x, (float)event.tfinger.y);
|
||||||
|
oPoint.x /= _frameZoomFactor;
|
||||||
|
oPoint.y /= _frameZoomFactor;
|
||||||
|
handleTouchesMove(1, &fingerId, &oPoint.x, &oPoint.y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_TEXTINPUT: {
|
||||||
|
const std::string text = event.text.text;
|
||||||
|
IMEDispatcher::sharedDispatcher()->dispatchInsertText(text.c_str(), text.size());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_TEXTEDITING:
|
||||||
|
// TODO: not implemented.
|
||||||
|
// In SDL text editing is similar to patching. Each patch consists of
|
||||||
|
// selected text range and string that replaces selected text.
|
||||||
|
break;
|
||||||
|
case SDL_KEYDOWN: {
|
||||||
|
if (event.key.keysym.sym == SDLK_BACKSPACE)
|
||||||
|
IMEDispatcher::sharedDispatcher()->dispatchDeleteBackward();
|
||||||
|
Director::sharedDirector()->getKeyboardDispatcher()->dispatchKeyboardEvent(event.key.keysym.sym, true);
|
||||||
|
break;
|
||||||
|
case SDL_KEYUP:
|
||||||
|
Director::sharedDirector()->getKeyboardDispatcher()->dispatchKeyboardEvent(event.key.keysym.sym, false);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EGLView::setIMEKeyboardState(bool bOpen)
|
||||||
|
{
|
||||||
|
_IMEKeyboardOpened = bOpen;
|
||||||
|
Rect zeroRect(0, 0, 0, 0);
|
||||||
|
IMEKeyboardNotificationInfo info;
|
||||||
|
info.begin = zeroRect;
|
||||||
|
info.end = zeroRect;
|
||||||
|
info.duration = 0;
|
||||||
|
if (bOpen) {
|
||||||
|
IMEDispatcher::sharedDispatcher()->dispatchKeyboardWillShow(info);
|
||||||
|
IMEDispatcher::sharedDispatcher()->dispatchKeyboardDidShow(info);
|
||||||
|
} else {
|
||||||
|
IMEDispatcher::sharedDispatcher()->dispatchKeyboardWillHide(info);
|
||||||
|
IMEDispatcher::sharedDispatcher()->dispatchKeyboardDidHide(info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EGLView::initGL()
|
bool EGLView::initGL()
|
||||||
|
@ -349,14 +299,6 @@ bool EGLView::initGL()
|
||||||
|
|
||||||
void EGLView::destroyGL()
|
void EGLView::destroyGL()
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
if (_DC != NULL && _RC != NULL)
|
|
||||||
{
|
|
||||||
// deselect rendering context and delete it
|
|
||||||
wglMakeCurrent(_DC, NULL);
|
|
||||||
wglDeleteContext(_RC);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLView* EGLView::getInstance()
|
EGLView* EGLView::getInstance()
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
#include "platform/CCCommon.h"
|
#include "platform/CCCommon.h"
|
||||||
#include "cocoa/CCGeometry.h"
|
#include "cocoa/CCGeometry.h"
|
||||||
#include "platform/CCEGLViewProtocol.h"
|
#include "platform/CCEGLViewProtocol.h"
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
bool initExtensions();
|
bool initExtensions();
|
||||||
|
|
||||||
|
@ -18,32 +20,33 @@ NS_CC_BEGIN
|
||||||
|
|
||||||
class EGLView : public EGLViewProtocol{
|
class EGLView : public EGLViewProtocol{
|
||||||
public:
|
public:
|
||||||
EGLView();
|
EGLView();
|
||||||
virtual ~EGLView();
|
virtual ~EGLView();
|
||||||
|
|
||||||
friend void keyEventHandle(int,int);
|
friend void keyEventHandle(int,int);
|
||||||
friend void mouseButtonEventHandle(int,int);
|
friend void mouseButtonEventHandle(int,int);
|
||||||
friend void mousePosEventHandle(int,int);
|
friend void mousePosEventHandle(int,int);
|
||||||
friend void charEventHandle(int,int);
|
friend void charEventHandle(int,int);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iPixelWidth, height: the window's size
|
* iPixelWidth, height: the window's size
|
||||||
* iWidth ,height: the point size, which may scale.
|
* iWidth ,height: the point size, which may scale.
|
||||||
* iDepth is not the buffer depth of opengl, it indicate how may bits for a pixel
|
* iDepth is not the buffer depth of opengl, it indicate how may bits for a pixel
|
||||||
*/
|
*/
|
||||||
virtual void setFrameSize(float width, float height);
|
virtual void setFrameSize(float width, float height);
|
||||||
virtual void setViewPortInPoints(float x , float y , float w , float h);
|
virtual void setViewPortInPoints(float x , float y , float w , float h);
|
||||||
virtual void setScissorInPoints(float x , float y , float w , float h);
|
virtual void setScissorInPoints(float x , float y , float w , float h);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set zoom factor for frame. This method is for debugging big resolution (e.g.new ipad) app on desktop.
|
* Set zoom factor for frame. This method is for debugging big resolution (e.g.new ipad) app on desktop.
|
||||||
*/
|
*/
|
||||||
void setFrameZoomFactor(float fZoomFactor);
|
void setFrameZoomFactor(float fZoomFactor);
|
||||||
float getFrameZoomFactor();
|
float getFrameZoomFactor();
|
||||||
virtual bool isOpenGLReady();
|
virtual bool isOpenGLReady();
|
||||||
virtual void end();
|
virtual void end();
|
||||||
virtual void swapBuffers();
|
virtual void swapBuffers();
|
||||||
virtual void setIMEKeyboardState(bool bOpen);
|
virtual void pollInputEvents();
|
||||||
|
virtual void setIMEKeyboardState(bool bOpen);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief get the shared main open gl window
|
@brief get the shared main open gl window
|
||||||
|
@ -54,13 +57,19 @@ public:
|
||||||
CC_DEPRECATED_ATTRIBUTE static EGLView* sharedOpenGLView();
|
CC_DEPRECATED_ATTRIBUTE static EGLView* sharedOpenGLView();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool initGL();
|
bool initGL();
|
||||||
void destroyGL();
|
void destroyGL();
|
||||||
private:
|
|
||||||
//store current mouse point for moving, valid if and only if the mouse pressed
|
//store current mouse point for moving, valid if and only if the mouse pressed
|
||||||
Point _mousePoint;
|
Point _mousePoint;
|
||||||
bool bIsInit;
|
bool _wasInit;
|
||||||
float _frameZoomFactor;
|
float _frameZoomFactor;
|
||||||
|
|
||||||
|
SDL_Window *_window;
|
||||||
|
SDL_GLContext _context;
|
||||||
|
// Several mouse instances are possible.
|
||||||
|
std::set<int> _pressedMouseInstances;
|
||||||
|
bool _IMEKeyboardOpened;
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
|
@ -100,7 +100,7 @@ SHAREDLIBS += -lfmodex
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SHAREDLIBS += -lglfw -lGLEW -lfontconfig -lpthread -lGL
|
SHAREDLIBS += -lSDL2 -lGLEW -lfontconfig -lpthread -lGL
|
||||||
SHAREDLIBS += -L$(FMOD_LIBDIR) -Wl,-rpath,$(abspath $(FMOD_LIBDIR))
|
SHAREDLIBS += -L$(FMOD_LIBDIR) -Wl,-rpath,$(abspath $(FMOD_LIBDIR))
|
||||||
SHAREDLIBS += -L$(LIB_DIR) -Wl,-rpath,$(abspath $(LIB_DIR))
|
SHAREDLIBS += -L$(LIB_DIR) -Wl,-rpath,$(abspath $(LIB_DIR))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue