diff --git a/.gitmodules b/.gitmodules
index 7bcf600f8..eeae12e04 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -16,11 +16,11 @@
[submodule "project/toolkit/sdl/SDL"]
path = project/toolkit/sdl/SDL
url = https://github.com/libsdl-org/SDL.git
- branch = SDL2
+ branch = main
[submodule "project/toolkit/sdl-mixer/SDL_mixer"]
path = project/toolkit/sdl-mixer/SDL_mixer
url = https://github.com/libsdl-org/SDL_mixer.git
- branch = SDL2
+ branch = main
[submodule "project/toolkit/modplug/libmodplug"]
path = project/toolkit/modplug/libmodplug
url = https://github.com/Konstanty/libmodplug.git
diff --git a/project/ToolkitBuild.xml b/project/ToolkitBuild.xml
index de0fa45f2..6a1186bf3 100644
--- a/project/ToolkitBuild.xml
+++ b/project/ToolkitBuild.xml
@@ -25,7 +25,8 @@
-
+
+
@@ -77,6 +78,7 @@
+
@@ -84,7 +86,7 @@
-
+
@@ -176,8 +178,6 @@
-
-
@@ -267,6 +267,7 @@
+
@@ -355,6 +356,7 @@
+
@@ -394,9 +396,11 @@
@@ -523,6 +527,7 @@
+
@@ -683,7 +688,7 @@
-
+
@@ -728,7 +733,8 @@
-
+
+
diff --git a/project/src/audio/SDLSound.cpp b/project/src/audio/SDLSound.cpp
index 9653ac433..9ba0f896d 100644
--- a/project/src/audio/SDLSound.cpp
+++ b/project/src/audio/SDLSound.cpp
@@ -6,6 +6,12 @@
#include
#include
+#ifndef NME_SDL3
+ #define SDL_IOFromConstMem(data, len) SDL_RWFromConstMem(data, len)
+#else
+ #define Mix_LoadWAV_RW Mix_LoadWAV_IO
+ #define Mix_LoadMUS_RW Mix_LoadMUS_IO
+#endif
namespace nme
@@ -44,7 +50,7 @@ void onMusicDone()
#ifdef EMSCRIPTEN
namespace {
-void Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)
+void Mix_QuerySpec(int *frequency, SDL_AudioFormat *format, int *channels)
{
*frequency = 44100;
*format = 32784;
@@ -128,9 +134,9 @@ class SDLSoundChannel : public SoundChannel
{
enum { BUF_SIZE = (1<<17) };
- int mFrequency;
- Uint16 mFormat;
- int mChannels;
+ int mFrequency;
+ SDL_AudioFormat mFormat;
+ int mChannels;
int mAsyncFrequency;
@@ -342,7 +348,7 @@ class SDLSoundChannel : public SoundChannel
mDynamicDataDue = 0;
mDynamicRequestPending = 0;
mFrequency = 0;
- mFormat = 0;
+ mFormat = (SDL_AudioFormat)0;
mChannels = 0;
mBufferAheadSamples = 0;
@@ -361,10 +367,14 @@ class SDLSoundChannel : public SoundChannel
Mix_QuerySpec(&mFrequency, &mFormat, &mChannels);
if (mFrequency!=44100)
ELOG("Warning - Frequency mismatch %d",mFrequency);
+ #ifdef NME_SDL3
+ if (mFormat!=SDL_AUDIO_F32)
+ #else
if (mFormat!=32784)
- ELOG("Warning - Format mismatch %d",mFormat);
+ #endif
+ ELOG("Warning - Format mismatch %d",(int)mFormat);
if (mChannels!=2)
- ELOG("Warning - channe mismatch %d",mChannels);
+ ELOG("Warning - channel mismatch %d",mChannels);
if (sMusicFrequency==0)
sMusicFrequency = mFrequency;
@@ -651,7 +661,7 @@ class SDLSound : public Sound
std::string filename;
bool loaded;
int frequency;
- Uint16 format;
+ SDL_AudioFormat format;
int channels;
double duration;
INmeSoundData *soundData;
@@ -672,7 +682,7 @@ class SDLSound : public Sound
initSound();
if (Init())
{
- mChunk = Mix_LoadWAV_RW(SDL_RWFromConstMem(inData, len), 1);
+ mChunk = Mix_LoadWAV_RW(SDL_IOFromConstMem(inData, len), 1);
if (!mChunk)
{
@@ -701,7 +711,7 @@ class SDLSound : public Sound
mChunk = 0;
loaded = false;
frequency = 0;
- format = 0;
+ format = (SDL_AudioFormat)0;
channels = 0;
duration = 0.0;
soundData = 0;
@@ -730,6 +740,25 @@ class SDLSound : public Sound
int bytes = soundData->getDecodedByteCount();
if (soundData->getRate()!=frequency || !soundData->getIsStereo())
{
+ #ifdef NME_SDL3
+
+ Uint8 *dst_data = NULL;
+ int dst_len = 0;
+ const SDL_AudioSpec src_spec = { format,
+ soundData->getIsStereo() ? 2 : 1,
+ soundData->getRate() };
+ const SDL_AudioSpec dst_spec = { format, channels, frequency };
+ if (!SDL_ConvertAudioSamples(&src_spec, data, soundData->getDecodedByteCount(),
+ &dst_spec, &dst_data, &dst_len))
+ {
+ printf("Could not convert data?\n");
+ }
+ else
+ {
+ mChunk = Mix_QuickLoad_RAW(dst_data, dst_len);
+ SDL_free(dst_data);
+ }
+ #else
SDL_AudioCVT wavecvt;
if (SDL_BuildAudioCVT(&wavecvt,
format, soundData->getIsStereo() ? 2 : 1, soundData->getRate(),
@@ -744,6 +773,8 @@ class SDLSound : public Sound
SDL_ConvertAudio(&wavecvt);
mChunk = Mix_QuickLoad_RAW(wavecvt.buf, wavecvt.len_cvt);
}
+ #endif
+
soundData->release();
soundData = 0;
}
@@ -787,9 +818,9 @@ class SDLSound : public Sound
if (n>0)
{
#ifndef NME_SDL12
- mChunk = Mix_LoadWAV_RW(SDL_RWFromConstMem(resource.Bytes(),n),false);
+ mChunk = Mix_LoadWAV_RW(SDL_IOFromConstMem(resource.Bytes(),n),false);
#else
- mChunk = Mix_LoadWAV_RW(SDL_RWFromConstMem(resource.Bytes(),2));
+ mChunk = Mix_LoadWAV_RW(SDL_IOFromConstMem(resource.Bytes(),2));
#endif
}
if (!mChunk)
@@ -879,7 +910,11 @@ class SDLMusicChannel : public SoundChannel
//int sdlLoops = inLoops<0 ? -1 : inLoops==0 ? 1 : inLoops;
int sdlLoops = inLoops<0 ? -1 : inLoops==0 ? 0 : inLoops-1;
//int sdlLoops = inLoops;
+ #ifdef NME_SDL3
+ if (!Mix_PlayMusic( mMusic, sdlLoops ))
+ #else
if (Mix_PlayMusic( mMusic, sdlLoops )<0)
+ #endif
{
onMusicDone();
}
@@ -1021,9 +1056,9 @@ class SDLMusic : public Sound
reso.resize(n);
memcpy(&reso[0], resource.Bytes(), n);
#ifdef NME_SDL2
- mMusic = Mix_LoadMUS_RW(SDL_RWFromConstMem(&reso[0], reso.size()),false);
+ mMusic = Mix_LoadMUS_RW(SDL_IOFromConstMem(&reso[0], reso.size()),false);
#else
- mMusic = Mix_LoadMUS_RW(SDL_RWFromConstMem(&reso[0], reso.size()));
+ mMusic = Mix_LoadMUS_RW(SDL_IOFromConstMem(&reso[0], reso.size()));
#endif
if (mMusic)
@@ -1066,9 +1101,9 @@ class SDLMusic : public Sound
memcpy(&reso[0], inData, len);
#ifdef NME_SDL2
- mMusic = Mix_LoadMUS_RW(SDL_RWFromConstMem(&reso[0], len),false);
+ mMusic = Mix_LoadMUS_RW(SDL_IOFromConstMem(&reso[0], len),false);
#else
- mMusic = Mix_LoadMUS_RW(SDL_RWFromConstMem(&reso[0], len));
+ mMusic = Mix_LoadMUS_RW(SDL_IOFromConstMem(&reso[0], len));
#endif
@@ -1118,7 +1153,11 @@ void SuspendSdlSound()
return;
sSoundPaused = true;
+ #ifdef NME_SDL3
+ SDL_PauseAudioDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK);
+ #else
SDL_PauseAudio(true);
+ #endif
}
void ResumeSdlSound()
@@ -1127,7 +1166,11 @@ void ResumeSdlSound()
return;
sSoundPaused = false;
+ #ifdef NME_SDL3
+ SDL_ResumeAudioDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK);
+ #else
SDL_PauseAudio(false);
+ #endif
}
Sound *CreateSdlSound(const std::string &inFilename,bool inForceMusic)
diff --git a/project/src/opengl/OGL.h b/project/src/opengl/OGL.h
index 301022a6a..a624ae747 100644
--- a/project/src/opengl/OGL.h
+++ b/project/src/opengl/OGL.h
@@ -1,6 +1,10 @@
#ifndef INCLUDED_OGL_H
#define INCLUDED_OGL_H
+#if defined(NME_DYNAMIC_ANGLE)
+#define DYNAMIC_OGL
+#endif
+
#if defined(NME_ANGLE)
// Static link, not dll import
#define EGLAPI
@@ -56,7 +60,9 @@
#define NME_GL_LEVEL 300
#define NEED_EXTENSIONS
- #define DYNAMIC_OGL
+ #ifndef DYNAMIC_OGL
+ #define DYNAMIC_OGL
+ #endif
#define GL_GLEXT_PROTOTYPES
#include
@@ -110,6 +116,21 @@ typedef ptrdiff_t GLsizeiptrARB;
#endif
+namespace nme {
+void *GetGlFunction(const char *functionName);
+}
+
+
+#if defined(NME_GLES)
+const bool nmeEglMode = true;
+#elif defined(NME_DYNAMIC_ANGLE)
+extern bool nmeEglMode;
+#else
+const bool nmeEglMode = false;
+#endif
+
+
+
#if defined(HX_WINDOWS) && !defined(NME_ANGLE)
typedef HDC WinDC;
typedef HGLRC GLCtx;
diff --git a/project/src/opengl/OGLExport.cpp b/project/src/opengl/OGLExport.cpp
index 081d92300..6a3810e1b 100644
--- a/project/src/opengl/OGLExport.cpp
+++ b/project/src/opengl/OGLExport.cpp
@@ -6,7 +6,6 @@
#define OGLEXPORT
-
#ifdef ANDROID
#include
#include
@@ -506,19 +505,9 @@ DEFINE_PRIM(nme_gl_get_supported_extensions,1);
value nme_gl_get_extension(value inName)
{
- void *result = 0;
HxString name = valToHxString(inName);
- #ifdef NME_ANGLE
- result = (void *)eglGetProcAddress(name.c_str());
- #elif defined(HX_WINDOWS)
- result = (void *)wglGetProcAddress(name.c_str());
- #elif defined(ANDROID)
- result = (void *)eglGetProcAddress(name.c_str());
- //Wait until I can test this...
- //#elif defined(HX_LINUX)
- // result = dlsym(nme::gOGLLibraryHandle,#func);
- #endif
+ void *result = (void *)nme::GetGlFunction(name.c_str());
if (result)
{
@@ -1503,30 +1492,35 @@ value nme_gl_shader_source(value inId,value inSource)
// 300: in and out are used instead of attribute and varying.
// GLSL 330+ texture2D to texture
- #ifdef NME_GLES
- buffer = "#version 100\n";
- buffer = "#define texture texture2D\n";
- #else
- #ifdef HX_MACOS
- buffer = "#version 120\n";
- #else
- buffer = "#version 130\n";
- #endif
- #endif
+ if (nmeEglMode)
+ {
+ buffer = "#version 100\n";
+ buffer = "#define texture texture2D\n";
+ }
+ else
+ {
+ #ifdef HX_MACOS
+ buffer = "#version 120\n";
+ #else
+ buffer = "#version 130\n";
+ #endif
+ }
}
- #ifdef NME_GLES
- if (!precisionStart)
- buffer += std::string("precision mediump float;\n") + std::string(versionEnd);
- else
- buffer += std::string(versionEnd);
-
- #else
- if (precisionStart)
- buffer += std::string(versionEnd, precisionStart-versionEnd) + std::string(precisionEnd, p-precisionEnd);
+ if (nmeEglMode)
+ {
+ if (!precisionStart)
+ buffer += std::string("precision mediump float;\n") + std::string(versionEnd);
+ else
+ buffer += std::string(versionEnd);
+ }
else
- buffer += std::string(versionEnd);
- #endif
+ {
+ if (precisionStart)
+ buffer += std::string(versionEnd, precisionStart-versionEnd) + std::string(precisionEnd, p-precisionEnd);
+ else
+ buffer += std::string(versionEnd);
+ }
lines = buffer.c_str();
//printf("===={{{\n%s\n}}}====\n", lines);
@@ -1665,20 +1659,25 @@ DEFINE_PRIM(nme_gl_get_shader_parameter,2);
value nme_gl_get_shader_precision_format(value inShaderType,value inPrec)
{
DBGFUNC("getShaderPrecisionFormat");
- #ifdef NME_GLES
- int range[2];
- int precision;
- glGetShaderPrecisionFormat(val_int(inShaderType), val_int(inPrec), range, &precision);
+ #if defined(NME_GLES) || defined(NME_DYNAMIC_ANGLE)
+ if (nmeEglMode)
+ {
+ int range[2];
+ int precision;
+ glGetShaderPrecisionFormat(val_int(inShaderType), val_int(inPrec), range, &precision);
- value result = alloc_empty_object( );
- alloc_field(result,val_id("rangeMin"),alloc_int(range[0]));
- alloc_field(result,val_id("rangeMax"),alloc_int(range[1]));
- alloc_field(result,val_id("precision"),alloc_int(precision));
+ value result = alloc_empty_object( );
+ alloc_field(result,val_id("rangeMin"),alloc_int(range[0]));
+ alloc_field(result,val_id("rangeMax"),alloc_int(range[1]));
+ alloc_field(result,val_id("precision"),alloc_int(precision));
- return result;
- #else
- return alloc_null();
+ return result;
+ }
+ else
#endif
+ {
+ return alloc_null();
+ }
}
DEFINE_PRIM(nme_gl_get_shader_precision_format,2);
@@ -2060,11 +2059,17 @@ DEFINE_PRIM(nme_gl_clear_color,4);
value nme_gl_clear_depth(value depth)
{
- #ifdef NME_GLES
- glClearDepthf(val_number(depth));
+ #ifdef NME_DYNAMIC_ANGLE
+ if (nmeEglMode)
+ glClearDepthf(val_number(depth));
+ else
+ glClearDepth(val_number(depth));
+ #elif defined(NME_GLES)
+ glClearDepthf(val_number(depth));
#else
- glClearDepth(val_number(depth));
+ glClearDepth(val_number(depth));
#endif
+
return alloc_null();
}
DEFINE_PRIM(nme_gl_clear_depth,1);
@@ -2105,10 +2110,15 @@ DEFINE_PRIM(nme_gl_depth_mask,1);
value nme_gl_depth_range(value inNear, value inFar)
{
- #ifdef NME_GLES
- glDepthRangef(val_number(inNear), val_number(inFar));
+ #ifdef NME_DYNAMIC_ANGLE
+ if (nmeEglMode)
+ glDepthRangef(val_number(inNear), val_number(inFar));
+ else
+ glDepthRange(val_number(inNear), val_number(inFar));
+ #elif defined(NME_GLES)
+ glDepthRangef(val_number(inNear), val_number(inFar));
#else
- glDepthRange(val_number(inNear), val_number(inFar));
+ glDepthRange(val_number(inNear), val_number(inFar));
#endif
return alloc_null();
}
diff --git a/project/src/opengl/OGLExtensions.h b/project/src/opengl/OGLExtensions.h
index 9e6fd66aa..0b6c6868d 100644
--- a/project/src/opengl/OGLExtensions.h
+++ b/project/src/opengl/OGLExtensions.h
@@ -11,9 +11,8 @@
#endif
-#ifdef DECLARE_EXTENSION
-namespace nme { extern void *gOGLLibraryHandle; }
+#ifdef DECLARE_EXTENSION
#define OGL_EXT(func,ret,args) \
namespace nme { extern ret (CALLING_CONVENTION *func)args; }
@@ -25,21 +24,12 @@ namespace nme { extern void *gOGLLibraryHandle; }
#elif defined(GET_EXTENSION)
-#ifdef HX_WINDOWS
- #define OGL_EXT(func,ret,args) \
- {\
- *(void **)&nme::func = (void *)wglGetProcAddress(#func);\
- if (!func) \
- *(void **)&nme::func = (void *)wglGetProcAddress(#func "ARB");\
- }
-#elif defined(HX_LINUX)
- #define OGL_EXT(func,ret,args) \
- {\
- *(void **)&nme::func = (void *)dlsym(nme::gOGLLibraryHandle,#func);\
- if (!func) \
- *(void **)&nme::func = (void *)dlsym(nme::gOGLLibraryHandle,#func "ARB");\
- }
-#endif
+#define OGL_EXT(func,ret,args) \
+{\
+ *(void **)&::nme::func = (void *)::nme::GetGlFunction(#func);\
+ if (!func) \
+ *(void **)&::nme::func = (void *)::nme::GetGlFunction(#func "ARB");\
+}
#endif
@@ -192,6 +182,7 @@ OGL_EXT(glClear,void, (GLbitfield mask));
OGL_EXT(glClearColor,void, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha));
//OGL_EXT(glClearColorx,void, (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha));
OGL_EXT(glClearDepth,void, (GLclampf depth));
+OGL_EXT(glClearDepthf,void, (GLclampf depth));
//OGL_EXT(glClearDepthx,void, (GLclampx depth));
OGL_EXT(glClearStencil,void, (GLint s));
OGL_EXT(glClientActiveTexture,void, (GLenum texture));
@@ -208,6 +199,7 @@ OGL_EXT(glDeleteTextures,void, (GLsizei n, const GLuint *textures));
OGL_EXT(glDepthFunc,void, (GLenum func));
OGL_EXT(glDepthMask,void, (GLboolean flag));
OGL_EXT(glDepthRange,void, (GLclampf zNear, GLclampf zFar));
+OGL_EXT(glDepthRangef,void, (GLclampf zNear, GLclampf zFar));
//OGL_EXT(glDepthRangex,void, (GLclampx zNear, GLclampx zFar));
OGL_EXT(glDisable,void, (GLenum cap));
OGL_EXT(glDisableClientState,void, (GLenum array));
@@ -293,7 +285,7 @@ OGL_EXT(glViewport,void, (GLint x, GLint y, GLsizei width, GLsizei height));
OGL_EXT(glGetTexParameteriv,void,(GLenum target, GLenum pname, GLint * params));
OGL_EXT(glIsTexture, GLboolean, ( GLuint texture) );
OGL_EXT(glIsEnabled, GLboolean, ( GLuint texture) );
-
+OGL_EXT(glGetShaderPrecisionFormat, void, (GLenum shaderType, GLenum precisionType, GLint *range, GLint *precision) );
#endif
diff --git a/project/src/opengl/OGLShaders.cpp b/project/src/opengl/OGLShaders.cpp
index f56d0daa3..28c5c8446 100644
--- a/project/src/opengl/OGLShaders.cpp
+++ b/project/src/opengl/OGLShaders.cpp
@@ -53,7 +53,7 @@ GLuint OGLProg::createShader(GLuint inType, const char *inShader)
GLint blen = 0;
GLsizei slen = 0;
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &blen);
+ glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &blen);
if (blen > 0)
{
char* compiler_log = (char*)malloc(blen);
@@ -64,8 +64,7 @@ GLuint OGLProg::createShader(GLuint inType, const char *inShader)
}
else
{
- ELOG("Unknown error compiling shader : \n");
- ELOG("%s\n", source);
+ ELOG("Unknown error compiling shader : %d\n", glGetError() );
}
glDeleteShader(shader);
return 0;
@@ -299,9 +298,8 @@ GPUProg *GPUProg::create(unsigned int inID)
std::string pixelProlog = "";
std::string blendColour = "";
- #ifdef NME_GLES
- pixelVars = std::string("precision mediump float;\n");
- #endif
+ if (nmeEglMode)
+ pixelVars = std::string("precision mediump float;\n");
std::string VIN = "attribute";
std::string VOUT = "varying";
diff --git a/project/src/opengl/OGLTexture.cpp b/project/src/opengl/OGLTexture.cpp
index 09e9de083..f33bd6a60 100644
--- a/project/src/opengl/OGLTexture.cpp
+++ b/project/src/opengl/OGLTexture.cpp
@@ -32,6 +32,9 @@
#elif defined(GCW0)
#define ARGB_STORE GL_RGBA
#define ARGB_PIXEL GL_BGRA_EXT
+#elif defined(NME_DYNAMIC_ANGLE)
+ #define ARGB_STORE (nmeEglMode ? GL_BGRA : GL_RGBA)
+ #define ARGB_PIXEL (GL_BGRA)
#elif defined(NME_GLES)
#define ARGB_STORE GL_BGRA
#define ARGB_PIXEL GL_BGRA
@@ -69,17 +72,21 @@ bool NonPO2Supported(bool inNotRepeating)
#ifdef FORCE_NON_PO2
return true;
#endif
+ #ifdef NME_DYNAMIC_ANGLE
+ if (nmeEglMode)
+ return true;
+ #endif
if (!tried)
{
tried = true;
const char* extensions = (char*) glGetString(GL_EXTENSIONS);
- gFullNPO2Support = strstr(extensions, "ARB_texture_non_power_of_two") != 0;
+ gFullNPO2Support = extensions && strstr(extensions, "ARB_texture_non_power_of_two") != 0;
if (!gFullNPO2Support)
{
- gPartialNPO2Support = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0;
+ gPartialNPO2Support = extensions && strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0;
}
@@ -315,31 +322,32 @@ class OGLTexture : public Texture
bool copy_required = mSurface->GetBase() && (mTextureWidth!=mPixelWidth || mTextureHeight!=mPixelHeight || buffer_format!=fmt);
- #if defined(__APPLE__) && !defined(NME_GLES)
+ #if defined(__APPLE__)
// Minimum unpack on apple?
- int unpackAlign = 4;
+ int unpackAlign = !nmeEglMode ? 4 : 1;
#else
int unpackAlign = 1;
#endif
- #if !defined(NME_GLES)
- int texStride = (mTextureWidth*pw+unpackAlign-1)/unpackAlign*unpackAlign;
- int srcStride = mSurface->GetStride();
- if (texStride!=srcStride && !copy_required)
+ if (!nmeEglMode)
{
- copy_required = true;
- for(int i=1;i<4;i++)
+ int texStride = (mTextureWidth*pw+unpackAlign-1)/unpackAlign*unpackAlign;
+ int srcStride = mSurface->GetStride();
+ if (texStride!=srcStride && !copy_required)
{
- int align = 1<=unpackAlign && srcStride == ((texStride+align-1)/align)*align)
+ copy_required = true;
+ for(int i=1;i<4;i++)
{
- copy_required = false;
- unpackAlign = align;
- break;
+ int align = 1<=unpackAlign && srcStride == ((texStride+align-1)/align)*align)
+ {
+ copy_required = false;
+ unpackAlign = align;
+ break;
+ }
}
}
}
- #endif
if (copy_required)
{
@@ -370,9 +378,8 @@ class OGLTexture : public Texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mMipmaps ? GL_LINEAR_MIPMAP_NEAREST : GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- #ifndef NME_GLES
- glPixelStorei(GL_UNPACK_ALIGNMENT, unpackAlign);
- #endif
+ if (!nmeEglMode)
+ glPixelStorei(GL_UNPACK_ALIGNMENT, unpackAlign);
glTexImage2D(GL_TEXTURE_2D, 0, store_format, mTextureWidth, mTextureHeight, 0, pixel_format, channel, buffer ? buffer : mSurface->GetBase());
@@ -454,8 +461,7 @@ class OGLTexture : public Texture
int dh = mDirtyRect.h;
bool copy_required = buffer_format!=fmt;
- #if defined(NME_GLES)
- if (!copy_required && dw!=mPixelWidth)
+ if (nmeEglMode && (!copy_required && dw!=mPixelWidth))
{
// Formats match but width does not. Can't use GL_UNPACK_ROW_LENGTH.
// Do we do the whole row, or copy?
@@ -470,7 +476,6 @@ class OGLTexture : public Texture
else
copy_required = true;
}
- #endif
if (copy_required)
{
@@ -505,17 +510,17 @@ class OGLTexture : public Texture
}
else
{
- #ifndef NME_GLES
- glPixelStorei(GL_UNPACK_ROW_LENGTH, mSurface->Width());
- #endif
+ if (!nmeEglMode)
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, mSurface->Width());
+
glTexSubImage2D(GL_TEXTURE_2D, 0,
x0, y0,
dw, dh,
pixel_format, channel,
mSurface->Row(y0) + x0*pw );
- #ifndef NME_GLES
- glPixelStorei(GL_UNPACK_ROW_LENGTH,0);
- #endif
+
+ if (!nmeEglMode)
+ glPixelStorei(GL_UNPACK_ROW_LENGTH,0);
}
if (mMipmaps)
diff --git a/project/src/opengl/OpenGLContext.cpp b/project/src/opengl/OpenGLContext.cpp
index 9a899f669..b22000b87 100644
--- a/project/src/opengl/OpenGLContext.cpp
+++ b/project/src/opengl/OpenGLContext.cpp
@@ -6,6 +6,10 @@
#include
#endif
+#ifdef NME_DYNAMIC_ANGLE
+bool nmeEglMode = false;
+#endif
+
#ifdef NEED_EXTENSIONS
#define DEFINE_EXTENSION
@@ -316,7 +320,8 @@ class OGLContext : public HardwareRenderer
#ifndef NME_GLES
#ifndef SDL_OGL
#ifndef GLFW_OGL
- wglMakeCurrent(mDC,mOGLCtx);
+ if (!nmeEglMode)
+ wglMakeCurrent(mDC,mOGLCtx);
#endif
#endif
#endif
@@ -451,7 +456,8 @@ class OGLContext : public HardwareRenderer
#ifndef NME_GLES
#ifndef SDL_OGL
#ifndef GLFW_OGL
- SwapBuffers(mDC);
+ if (!nmeEglMode)
+ SwapBuffers(mDC);
#endif
#endif
#endif
@@ -838,10 +844,48 @@ class OGLContext : public HardwareRenderer
// ----------------------------------------------------------------------------
-void * gOGLLibraryHandle = 0;
+
+#ifdef HX_WINDOWS
+static HMODULE gEGLLibraryHandle = 0;
+static HMODULE gOGLLibraryHandle = 0;
+typedef PROC (*wglGetProcAddressFunc)(const char * unnamedParam1);
+wglGetProcAddressFunc dynamicGetProcAddress = nullptr;
+#else
+//static void * gEGLLibraryHandle = 0;
+static void * gOGLLibraryHandle = 0;
+#endif
static bool extentions_init = false;
+
+void *GetGlFunction(const char *functionName)
+{
+ void *result = nullptr;
+ #if defined(NME_DYNAMIC_ANGLE)
+ if (dynamicGetProcAddress)
+ result = dynamicGetProcAddress(functionName);
+ #ifdef HX_WINDOWS
+ if (!result && gOGLLibraryHandle)
+ result = (void *)GetProcAddress(gOGLLibraryHandle,functionName);
+ #endif
+ #elif defined(NME_ANGLE)
+ //result = (void *)eglGetProcAddress(functionName);
+ result = nullptr;
+ #elif defined(HX_WINDOWS)
+ result = (void *)wglGetProcAddress(functionName);
+ if (!result && gOGLLibraryHandle)
+ result = (void *)GetProcAddress(gOGLLibraryHandle,functionName);
+ #elif defined(ANDROID)
+ result = (void *)eglGetProcAddress(functionName);
+ #elif defined(HX_LINUX)
+ result = dlsym(nme::gOGLLibraryHandle,functionName);
+ #endif
+
+ return result;
+}
+
+bool use_angle = false;
+
bool InitOGLFunctions()
{
static bool result = true;
@@ -849,10 +893,60 @@ bool InitOGLFunctions()
{
extentions_init = true;
+ #ifdef NME_DYNAMIC_ANGLE
+ if (use_angle)
+ {
+ #ifdef HX_WINDOWS
+ gEGLLibraryHandle = LoadLibraryA("libEGL.dll");
+ gOGLLibraryHandle = LoadLibraryA("libGLESv2.dll");
+ if (!gEGLLibraryHandle)
+ {
+ //printf("Could not open libEGL\n");
+ use_angle = false;
+ }
+ else
+ {
+ dynamicGetProcAddress = (wglGetProcAddressFunc)GetProcAddress(gEGLLibraryHandle, "eglGetProcAddress");
+ //printf("eglGetProcAddress -> %p\n", dynamicGetProcAddress);
+ }
+ #endif
+ }
+
+ if (!use_angle)
+ {
+ #ifdef HX_WINDOWS
+ gOGLLibraryHandle = LoadLibraryA("opengl32.dll");
+ if (!gOGLLibraryHandle)
+ {
+ printf("Error - could not load hardware driver\n");
+ result = false;
+ return result;
+ }
+
+ dynamicGetProcAddress = (wglGetProcAddressFunc)GetProcAddress(gOGLLibraryHandle, "wglGetProcAddress");
+ if (!dynamicGetProcAddress)
+ {
+ printf("Error - could not load hardware interface\n");
+ result = false;
+ return result;
+ }
+ #endif
+ }
+
+ nmeEglMode = use_angle;
+ #else
+ #ifdef HX_WINDOWS
+ gOGLLibraryHandle = LoadLibraryA("opengl32.dll");
+ #endif
+ #endif
+
#ifdef HX_LINUX
- gOGLLibraryHandle = dlopen("libGL.so.1", RTLD_NOW|RTLD_GLOBAL);
if (!gOGLLibraryHandle)
- gOGLLibraryHandle = dlopen("libGL.so", RTLD_NOW|RTLD_GLOBAL);
+ {
+ gOGLLibraryHandle = dlopen("libGL.so.1", RTLD_NOW|RTLD_GLOBAL);
+ if (!gOGLLibraryHandle)
+ gOGLLibraryHandle = dlopen("libGL.so", RTLD_NOW|RTLD_GLOBAL);
+ }
if (!gOGLLibraryHandle)
{
//printf("Could not load %s (%s)\n",path, dlerror());
diff --git a/project/src/sdl2/SDL2Stage.cpp b/project/src/sdl2/SDL2Stage.cpp
index 9ebbad048..ba5fc4fef 100644
--- a/project/src/sdl2/SDL2Stage.cpp
+++ b/project/src/sdl2/SDL2Stage.cpp
@@ -1,6 +1,9 @@
#define WINDOWS_IGNORE_PACKING_MISMATCH 1
#include
#include
+#ifdef NME_SDL3
+ #define SDL_ENABLE_OLD_NAMES
+#endif
#include
#include
#include
@@ -15,7 +18,9 @@
#endif
#ifdef HX_WINDOWS
-#include
+ #ifndef NME_SDL3
+ #include
+ #endif
#include
#include
#endif
@@ -28,6 +33,27 @@
#define NME_WINDOWS_SINGLE_INSTANCE
#endif
+#ifdef NME_OGL
+#include "../opengl/OGL.h"
+#endif
+
+#ifdef NME_SDL3
+#define SDL_GL_GetDrawableSize SDL_GetWindowSizeInPixels
+#define Mix_GetError SDL_GetError
+#define SDL_GameControllerNameForIndex SDL_GetGamepadNameForID
+#define SDL_JoystickNameForIndex SDL_GetJoystickNameForID
+
+SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
+{
+ return SDL_CreateSurface(width, height,
+ SDL_GetPixelFormatForMasks(depth, Rmask, Gmask, Bmask, Amask));
+}
+
+typedef float MousePosType;
+#else
+typedef int MousePosType;
+#endif
+
namespace nme
{
static int sgDesktopWidth = 0;
@@ -65,6 +91,11 @@ int InitSDL()
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
#endif
+ #ifdef NME_DYNAMIC_ANGLE
+ InitOGLFunctions();
+ SDL_SetHint(SDL_HINT_RENDER_DRIVER, nmeEglMode ? "opengles2" : "opengl");
+ #endif
+
int err = SDL_Init(SDL_INIT_VIDEO | audioFlag | SDL_INIT_TIMER);
if (err == 0 && SDL_InitSubSystem (SDL_INIT_GAMECONTROLLER) == 0)
@@ -93,7 +124,16 @@ static void openAudio()
//int frequency = MIX_DEFAULT_FREQUENCY //22050
//The default frequency would have less latency, but is incompatible with the average MP3 file
+ #ifdef NME_SDL3
+ SDL_AudioSpec spec;
+ spec.format = AUDIO_S16;
+ spec.channels = 2;
+ spec.freq = frequency;
+
+ if (!Mix_OpenAudio(0,&spec))
+ #else
if (Mix_OpenAudio(frequency, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, chunksize) != 0)
+ #endif
{
fprintf(stderr,"Could not open sound: %s\n", Mix_GetError());
gSDLAudioState = sdaError;
@@ -196,9 +236,15 @@ class SDLSurf : public Surface
r.w = inRect->w;
r.h = inRect->h;
}
-
- SDL_FillRect(mSurf,rect_ptr,SDL_MapRGBA(mSurf->format,
- inColour>>16, inColour>>8, inColour, inColour>>24 ) );
+
+ Uint32 rgba;
+ #ifdef NME_SDL3
+ rgba = SDL_MapSurfaceRGBA(mSurf, inColour>>16, inColour>>8, inColour, inColour>>24 );
+ #else
+ rgba = SDL_MapRGBA(mSurf->format, inColour>>16, inColour>>8, inColour, inColour>>24 );
+ #endif
+
+ SDL_FillRect(mSurf,rect_ptr,rgba);
}
uint8 *Edit(const Rect *inRect)
@@ -299,12 +345,26 @@ SDL_Cursor *sDefaultCursor = 0;
SDL_Cursor *sTextCursor = 0;
SDL_Cursor *sHandCursor = 0;
+#ifdef NME_SDL3
+#define SDL_WINDOW_FULLSCREEN_DESKTOP SDL_WINDOW_FULLSCREEN
+#endif
unsigned int FullscreenMode = SDL_WINDOW_FULLSCREEN_DESKTOP;
//unsigned int FullscreenMode = SDL_WINDOW_FULLSCREEN;
//
extern void *GetMetalLayerFromRenderer(SDL_Renderer *renderer);
static HardwareRenderer *sgHardwareRenderer = 0;
+static void nmeShowCursor(bool show)
+{
+ #ifdef NME_SDL3
+ if (show)
+ SDL_ShowCursor();
+ else
+ SDL_HideCursor();
+ #else
+ SDL_ShowCursor(show);
+ #endif
+}
class SDLStage : public Stage
{
@@ -421,6 +481,7 @@ class SDLStage : public Stage
Close(false);
}
+
bool getCaptureMouse()
{
return mCaptureMouse;
@@ -433,7 +494,12 @@ class SDLStage : public Stage
}
void GetGlobalMouseState(int &outX, int &outY, int &outButtons)
{
- int flags = SDL_GetGlobalMouseState(&outX, &outY);
+ MousePosType mx = outX;
+ MousePosType my = outY;
+ int flags = SDL_GetGlobalMouseState(&mx, &my);
+ outX = (int)mx;
+ outY = (int)my;
+
if (flags & SDL_BUTTON(SDL_BUTTON_LEFT))
outButtons |= 0x1;
if (flags & SDL_BUTTON(SDL_BUTTON_MIDDLE))
@@ -539,20 +605,26 @@ class SDLStage : public Stage
}
mIsFullscreen = inFullscreen;
-
+
if (mIsFullscreen)
{
//SDL_SetWindowSize(mSDLWindow, sgDesktopWidth, sgDesktopHeight);
+ #ifdef NME_SDL3
+ SDL_SetWindowFullscreen(mSDLWindow, true);
+ #else
SDL_DisplayMode mode;
SDL_GetCurrentDisplayMode(0, &mode);
mode.w = sgDesktopWidth;
mode.h = sgDesktopHeight;
SDL_SetWindowDisplayMode(mSDLWindow, &mode);
-
SDL_SetWindowFullscreen(mSDLWindow, FullscreenMode /*SDL_WINDOW_FULLSCREEN_DESKTOP*/);
+ #endif
}
else
{
+ #ifdef NME_SDL3
+ SDL_SetWindowFullscreen(mSDLWindow, false);
+ #else
SDL_SetWindowFullscreen(mSDLWindow, 0);
/*
Trust sdl to restore the window position
@@ -564,15 +636,20 @@ class SDLStage : public Stage
}
#endif
*/
+ #endif
}
- SDL_ShowCursor(mShowCursor);
+ nmeShowCursor(mShowCursor);
}
}
void SetResolution(int inWidth, int inHeight)
{
+ #ifdef NME_SDL3
+
+ SDL_SetWindowFullscreen(mSDLWindow, FullscreenMode);
+ #else
fprintf(stderr, "SetResolution %i %i\n", inWidth, inHeight);
SDL_DisplayMode mode;
SDL_GetCurrentDisplayMode(0, &mode);
@@ -582,6 +659,7 @@ class SDLStage : public Stage
SDL_SetWindowFullscreen(mSDLWindow, 0);
SDL_SetWindowDisplayMode(mSDLWindow, &mode);
SDL_SetWindowFullscreen(mSDLWindow, FullscreenMode);
+ #endif
}
@@ -789,10 +867,10 @@ class SDLStage : public Stage
mCurrentCursor = inCursor;
if (inCursor==curNone || !mShowCursor)
- SDL_ShowCursor(false);
+ nmeShowCursor(false);
else
{
- SDL_ShowCursor(true);
+ nmeShowCursor(true);
if (inCursor==curPointer)
SDL_SetCursor(sDefaultCursor);
@@ -827,7 +905,11 @@ class SDLStage : public Stage
if (inLock != mLockCursor)
{
mLockCursor = inLock;
+ #ifdef NME_SDL3
+ SDL_SetWindowRelativeMouseMode(mSDLWindow, inLock ? SDL_TRUE : SDL_FALSE );
+ #else
SDL_SetRelativeMouseMode( inLock ? SDL_TRUE : SDL_FALSE );
+ #endif
}
}
@@ -1625,136 +1707,162 @@ static SDLFrame *getEventFrame(int inId, bool useDefault = true)
return nullptr;
}
+static bool jButtonPressed(const SDL_JoyButtonEvent &ev)
+{
+ #ifdef NME_SDL3
+ return ev.down;
+ #else
+ return ev.state==SDL_PRESSED;
+ #endif
+}
+
+Uint32 getWindowOrEventType(SDL_Event &inEvent)
+{
+ #ifndef NME_SDL3
+ if (inEvent.type==SDL_WINDOWEVENT)
+ return inEvent.window.event;
+ #endif
+ return inEvent.type;
+}
+
void ProcessEvent(SDL_Event &inEvent)
{
- if (inEvent.type!=SDL_WINDOWEVENT && gCurrentFileDialog)
+ #ifdef NME_SDL3
+ const bool isWindowEvent = inEvent.type>=SDL_EVENT_WINDOW_FIRST || inEvent.type<=SDL_EVENT_WINDOW_LAST;
+ auto windowEventid = inEvent.type;
+ #else
+ const bool isWindowEvent = inEvent.type==SDL_WINDOWEVENT;
+ auto windowEventid = inEvent.window.event;
+ #endif
+
+ if (gCurrentFileDialog && !isWindowEvent)
return;
- switch(inEvent.type)
+ if (isWindowEvent)
{
- case SDL_QUIT:
- {
- Event close(etQuit);
- sgSDLFrame->ProcessEvent(close);
- break;
- }
- case SDL_WINDOWEVENT:
+ SDLFrame *frame = getEventFrame(inEvent.window.windowID);
+ switch(windowEventid)
{
- SDLFrame *frame = getEventFrame(inEvent.window.windowID);
-
- switch (inEvent.window.event)
+ case SDL_WINDOWEVENT_SHOWN:
{
- case SDL_WINDOWEVENT_SHOWN:
- {
- Event activate(etActivate);
- frame->ProcessEvent(activate);
- break;
- }
- case SDL_WINDOWEVENT_HIDDEN:
+ Event activate(etActivate);
+ frame->ProcessEvent(activate);
+ break;
+ }
+ case SDL_WINDOWEVENT_HIDDEN:
+ {
+ frame = getEventFrame(inEvent.window.windowID,false);
+ if (frame)
{
- frame = getEventFrame(inEvent.window.windowID,false);
- if (frame)
- {
- Event deactivate(etDeactivate);
- frame->ProcessEvent(deactivate);
- }
- // else printf("ignore dead window\n");
- break;
+ Event deactivate(etDeactivate);
+ frame->ProcessEvent(deactivate);
}
- case SDL_WINDOWEVENT_EXPOSED:
+ // else printf("ignore dead window\n");
+ break;
+ }
+ case SDL_WINDOWEVENT_EXPOSED:
+ {
+ Event poll(etPoll);
+ sgSDLFrame->ProcessEvent(poll);
+ Event redraw(etRedraw);
+ frame->ProcessEvent(redraw);
+ break;
+ }
+ //case SDL_WINDOWEVENT_RESIZED: break;
+ case SDL_WINDOWEVENT_SIZE_CHANGED:
+ {
+ frame = getEventFrame(inEvent.window.windowID,false);
+ if (frame)
{
- Event poll(etPoll);
- sgSDLFrame->ProcessEvent(poll);
+ Event resize(etResize, inEvent.window.data1, inEvent.window.data2);
+ frame->scaleMouseDpi(resize);
+ frame->Resize(resize.x, resize.y);
+ frame->ProcessEvent(resize);
Event redraw(etRedraw);
frame->ProcessEvent(redraw);
- break;
- }
- //case SDL_WINDOWEVENT_RESIZED: break;
- case SDL_WINDOWEVENT_SIZE_CHANGED:
- {
- frame = getEventFrame(inEvent.window.windowID,false);
- if (frame)
- {
- Event resize(etResize, inEvent.window.data1, inEvent.window.data2);
- frame->scaleMouseDpi(resize);
- frame->Resize(resize.x, resize.y);
- frame->ProcessEvent(resize);
- Event redraw(etRedraw);
- frame->ProcessEvent(redraw);
- }
- break;
- }
- case SDL_WINDOWEVENT_MINIMIZED:
- {
- frame->mStage->setIsFullscreen(false);
- Event deactivate(etDeactivate);
- frame->ProcessEvent(deactivate);
- break;
}
+ break;
+ }
+ case SDL_WINDOWEVENT_MINIMIZED:
+ {
+ frame->mStage->setIsFullscreen(false);
+ Event deactivate(etDeactivate);
+ frame->ProcessEvent(deactivate);
+ break;
+ }
- case SDL_WINDOWEVENT_RESTORED:
- case SDL_WINDOWEVENT_MAXIMIZED:
- frame = getEventFrame(inEvent.window.windowID,false);
- if (frame)
- {
- bool isMax = SDL_GetWindowFlags(frame->mWindow ) &
+ case SDL_WINDOWEVENT_RESTORED:
+ case SDL_WINDOWEVENT_MAXIMIZED:
+ {
+ frame = getEventFrame(inEvent.window.windowID,false);
+ if (frame)
+ {
+ bool isMax = SDL_GetWindowFlags(frame->mWindow ) &
(SDL_WINDOW_FULLSCREEN|SDL_WINDOW_FULLSCREEN_DESKTOP);
- frame->mStage->setIsFullscreen(isMax);
-
- Event activate(etActivate);
- frame->ProcessEvent(activate);
+ frame->mStage->setIsFullscreen(isMax);
- int width = 0;
- int height = 0;
- //SDL_GetWindowSize(frame->mWindow, &width, &height);
- SDL_GL_GetDrawableSize(frame->mWindow, &width, &height);
+ Event activate(etActivate);
+ frame->ProcessEvent(activate);
- Event resize(etResize, width, height);
- frame->Resize(width,height);
- frame->ProcessEvent(resize);
- }
- break;
+ int width = 0;
+ int height = 0;
+ //SDL_GetWindowSize(frame->mWindow, &width, &height);
+ SDL_GL_GetDrawableSize(frame->mWindow, &width, &height);
- case SDL_WINDOWEVENT_MOVED:
- {
- Event event(etWindowMoved, inEvent.window.data1, inEvent.window.data2);
- frame->ProcessEvent(event);
- }
- break;
-
- case SDL_WINDOWEVENT_ENTER:
- {
- Event event(etWindowEnter);
- frame->ProcessEvent(event);
- }
- break;
- case SDL_WINDOWEVENT_LEAVE:
- {
- Event event(etWindowLeave);
- frame->ProcessEvent(event);
- }
- case SDL_WINDOWEVENT_FOCUS_GAINED:
- {
- Event inputFocus(etGotInputFocus);
- frame->ProcessEvent(inputFocus);
- break;
- }
- case SDL_WINDOWEVENT_FOCUS_LOST:
- {
- Event inputFocus(etLostInputFocus);
- frame->ProcessEvent(inputFocus);
- break;
- }
- case SDL_WINDOWEVENT_CLOSE:
- {
- Event close(etWindowClose);
- frame->ProcessEvent(close);
- break;
+ Event resize(etResize, width, height);
+ frame->Resize(width,height);
+ frame->ProcessEvent(resize);
}
+ break;
+ }
- default:
- break;
+ case SDL_WINDOWEVENT_MOVED:
+ {
+ Event event(etWindowMoved, inEvent.window.data1, inEvent.window.data2);
+ frame->ProcessEvent(event);
+ break;
+ }
+
+ case SDL_WINDOWEVENT_ENTER:
+ {
+ Event event(etWindowEnter);
+ frame->ProcessEvent(event);
+ break;
+ }
+ case SDL_WINDOWEVENT_LEAVE:
+ {
+ Event event(etWindowLeave);
+ frame->ProcessEvent(event);
+ }
+ case SDL_WINDOWEVENT_FOCUS_GAINED:
+ {
+ Event inputFocus(etGotInputFocus);
+ frame->ProcessEvent(inputFocus);
+ break;
+ }
+ case SDL_WINDOWEVENT_FOCUS_LOST:
+ {
+ Event inputFocus(etLostInputFocus);
+ frame->ProcessEvent(inputFocus);
+ break;
+ }
+ case SDL_WINDOWEVENT_CLOSE:
+ {
+ Event close(etWindowClose);
+ frame->ProcessEvent(close);
+ break;
}
+
+ default:
+ break;
+ }
+ }
+ else switch(inEvent.type)
+ {
+ case SDL_QUIT:
+ {
+ Event close(etQuit);
+ sgSDLFrame->ProcessEvent(close);
break;
}
@@ -1768,8 +1876,8 @@ void ProcessEvent(SDL_Event &inEvent)
case SDL_DROPCOMPLETE:
{
SDLFrame *frame = getEventFrame(inEvent.drop.windowID);
- int x=0;
- int y=0;
+ MousePosType x=0;
+ MousePosType y=0;
SDL_GetMouseState(&x,&y);
Event event(etDropEnd, x, y);
frame->scaleMouseDpi(event);
@@ -1781,10 +1889,16 @@ void ProcessEvent(SDL_Event &inEvent)
{
SDLFrame *frame = getEventFrame(inEvent.drop.windowID);
Event event(etDropFile);
+ #ifdef NME_SDL3
+ event.utf8Text = inEvent.drop.data;
+ event.utf8Length = strlen(inEvent.drop.data);
+ frame->ProcessEvent(event);
+ #else
event.utf8Text = inEvent.drop.file;
event.utf8Length = strlen(inEvent.drop.file);
frame->ProcessEvent(event);
SDL_free(inEvent.drop.file);
+ #endif
break;
}
@@ -1793,12 +1907,17 @@ void ProcessEvent(SDL_Event &inEvent)
{
SDLFrame *frame = getEventFrame(inEvent.motion.windowID);
//default to 0
- int deltaX = 0;
- int deltaY = 0;
+ MousePosType deltaX = 0;
+ MousePosType deltaY = 0;
//but if we are locking the cursor,
//pass the delta in as well through as deltaX
- if(SDL_GetRelativeMouseMode()) {
+ #ifdef NME_SDL3
+ if (SDL_GetWindowRelativeMouseMode(frame->mWindow))
+ #else
+ if (SDL_GetRelativeMouseMode())
+ #endif
+ {
SDL_GetRelativeMouseState( &deltaX, &deltaY );
deltaX = (int)(deltaX * frame->retinaScale);
deltaY = (int)(deltaY * frame->retinaScale);
@@ -1853,8 +1972,8 @@ void ProcessEvent(SDL_Event &inEvent)
//previous behavior in nme was fake button 3 for down, 4 for up
int event_dir = (inEvent.wheel.y > 0) ? 3 : 4;
//space to get the current mouse position, to make sure the values are sane
- int _x = 0;
- int _y = 0;
+ MousePosType _x = 0;
+ MousePosType _y = 0;
//fetch the mouse position
SDL_GetMouseState(&_x,&_y);
//create the event
@@ -1931,19 +2050,15 @@ void ProcessEvent(SDL_Event &inEvent)
SDLFrame *frame = getEventFrame(inEvent.key.windowID);
Event key(inEvent.type == SDL_KEYDOWN ? etKeyDown : etKeyUp );
bool right;
+
+ #ifdef NME_SDL3
+ key.value = SDLKeyToFlash(inEvent.key.key, right);
+ AddModStates(key.flags, inEvent.key.mod);
+ #else
key.value = SDLKeyToFlash(inEvent.key.keysym.sym, right);
- /*if (inEvent.type == SDL_KEYDOWN)
- {
- //key.code = key.value==keyBACKSPACE ? keyBACKSPACE : inEvent.key.keysym.unicode;
- key.code = inEvent.key.keysym.scancode;
- sLastUnicode[inEvent.key.keysym.scancode] = key.code;
- }
- else
- // SDL does not provide unicode on key up, so remember it,
- // keyed by scancode
- key.code = sLastUnicode[inEvent.key.keysym.scancode];*/
- //key.code = 0;
AddModStates(key.flags, inEvent.key.keysym.mod);
+ #endif
+
if (right)
key.flags |= efLocationRight;
@@ -1970,7 +2085,7 @@ void ProcessEvent(SDL_Event &inEvent)
if(inEvent.jbutton.button>=SDL_CONTROLLER_BUTTON_DPAD_UP)
controller->controllerHatEvent();
else
- controller->controllerButtonEvent(inEvent.jbutton.button, inEvent.jbutton.state==SDL_PRESSED);
+ controller->controllerButtonEvent(inEvent.jbutton.button, jButtonPressed(inEvent.jbutton) );
}
break;
}
@@ -1997,7 +2112,7 @@ void ProcessEvent(SDL_Event &inEvent)
break;
}
case SDL_JOYAXISMOTION:
- {
+ {
ControllerState* controller = sgJoysticksState[inEvent.jbutton.which];
if(controller != NULL && !controller->isGameController)
controller->joyAxisMove(inEvent.jaxis.axis, inEvent.jaxis.value);
@@ -2005,10 +2120,10 @@ void ProcessEvent(SDL_Event &inEvent)
}
case SDL_JOYBUTTONDOWN:
case SDL_JOYBUTTONUP:
- {
+ {
ControllerState* controller = sgJoysticksState[inEvent.jbutton.which];
if(controller!=NULL && !controller->isGameController)
- controller->joyButtonEvent(inEvent.jbutton.button, inEvent.jbutton.state==SDL_PRESSED);
+ controller->joyButtonEvent(inEvent.jbutton.button, jButtonPressed(inEvent.jbutton) );
break;
}
case SDL_JOYBALLMOTION:
@@ -2148,14 +2263,6 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
bool tryHighDpi = (inFlags & wfHighDpi) != 0;
//WindowScaleMode scaleMode = (WindowScaleMode)( (inFlags & wfScaleMask)/wfScaleBase );
- #ifdef HX_LINUX
- if (opengl && isMain)
- {
- if (!InitOGLFunctions())
- opengl = false;
- }
- #endif
-
#ifdef NME_WINDOWS_SINGLE_INSTANCE
bool singleInstance = (inFlags & wfSingleInstance) != 0;
if (singleInstance)
@@ -2195,14 +2302,23 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
openAudio();
#endif
+ #ifndef NME_SDL3
if (SDL_GetNumVideoDisplays() > 0)
{
-
SDL_DisplayMode currentMode;
SDL_GetDesktopDisplayMode(0, ¤tMode);
sgDesktopWidth = currentMode.w;
sgDesktopHeight = currentMode.h;
}
+ #else
+ SDL_DisplayID display_id = SDL_GetPrimaryDisplay();
+ const SDL_DisplayMode *modePtr = SDL_GetDesktopDisplayMode(display_id);
+ if (modePtr)
+ {
+ sgDesktopWidth = modePtr->w;
+ sgDesktopHeight = modePtr->h;
+ }
+ #endif
int windowFlags, requestWindowFlags = 0;
@@ -2219,15 +2335,26 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
if (inFlags & wfAlwaysOnTop)
requestWindowFlags |= SDL_WINDOW_ALWAYS_ON_TOP;
- #ifdef NME_ANGLE
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_EGL, 1);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
+ #ifdef NME_OGL
+ if (nmeEglMode)
+ {
+ //#ifdef NME_DYNAMIC_ANGLE
+ //SDL_setenv("SDL_VIDEO_GL_DRIVER", "libEGL.dll", 1);
+ //#endif
+ #ifndef NME_SDL3
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_EGL, 1);
+ #endif
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
+ }
#endif
if (opengl)
{
+ SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 2 );
+ SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 1 );
+
SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
@@ -2318,7 +2445,19 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
window = NULL;
}
+ #ifdef NME_SDL3
+ SDL_PropertiesID props = SDL_CreateProperties();
+ SDL_SetStringProperty(props, SDL_PROP_WINDOW_CREATE_TITLE_STRING, inTitle);
+ SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_X_NUMBER, targetX);
+ SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_Y_NUMBER, targetY);
+ SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER, setWidth);
+ SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER, setHeight);
+ SDL_SetNumberProperty(props, "flags", requestWindowFlags);
+ window = SDL_CreateWindowWithProperties(props);
+ SDL_DestroyProperties(props);
+ #else
window = SDL_CreateWindow(inTitle, targetX, targetY, setWidth, setHeight, requestWindowFlags);
+ #endif
#if (defined(HX_WINDOWS) && !defined(HX_WINRT))
HINSTANCE handle = ::GetModuleHandle(0);
@@ -2328,11 +2467,18 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
LPARAM smicon = (LPARAM)::LoadImage(handle, resource, IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0);
+ #ifdef NME_SDL3
+ HWND hWin = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
+ #else
SDL_SysWMinfo wminfo;
SDL_VERSION (&wminfo.version);
+ HWND hWin = (HWND)0;
if (SDL_GetWindowWMInfo(window, &wminfo) == 1)
- {
hWin = wminfo.info.win.window;
+ #endif
+
+ if (hWin)
+ {
if (icon)
{
::SendMessage(hWin, WM_SETICON, ICON_BIG, icon);
@@ -2342,6 +2488,7 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
::SendMessage(hWin, WM_SETICON, ICON_SMALL, icon);
}
}
+
#endif
// retrieve the actual window flags (as opposed to the requested ones)
@@ -2350,17 +2497,23 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
bool hardware = metal||opengl;
- int renderFlags = 0;
- if (hardware) renderFlags |= SDL_RENDERER_ACCELERATED;
- if (hardware && vsync) renderFlags |= SDL_RENDERER_PRESENTVSYNC;
+ //printf("hardware: %d\n", hardware);
if (hardware && sgMainRenderer)
{
renderer = sgMainRenderer;
break;
}
- renderer = SDL_CreateRenderer (window, -1, renderFlags);
-
+
+ #ifdef NME_SDL3
+ renderer = SDL_CreateRenderer(window, nullptr);
+ #else
+ int renderFlags = 0;
+ if (hardware) renderFlags |= SDL_RENDERER_ACCELERATED;
+ if (hardware && vsync) renderFlags |= SDL_RENDERER_PRESENTVSYNC;
+ renderer = SDL_CreateRenderer(window, -1, renderFlags);
+ #endif
+
if (opengl)
{
sgIsOGL2 = (inFlags & (wfAllowShaders | wfRequireShaders));
@@ -2369,7 +2522,7 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
{
sgIsOGL2 = false;
}
-
+
if (!renderer && (inFlags & wfHW_AA_HIRES || inFlags & wfHW_AA)) {
// if no window was created and AA was enabled, disable AA and try again
fprintf(stderr, "Multisampling is not available. Retrying without. (%s)\n", SDL_GetError());
@@ -2405,6 +2558,16 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
fprintf(stderr, "Failed to create SDL renderer: %s\n", SDL_GetError());
return;
}
+
+ #ifdef NME_OGL
+ if (opengl && isMain)
+ {
+ if (!InitOGLFunctions())
+ opengl = false;
+ }
+ #endif
+
+
int width, height;
/*
@@ -2469,11 +2632,14 @@ HWND GetApplicationWindow()
if (!sgSDLFrame)
return (HWND)gNativeWindowHandle;
+ #ifdef NME_SDL3
+ return (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(sgSDLFrame->mWindow), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
+ #else
SDL_SysWMinfo wminfo;
SDL_VERSION (&wminfo.version);
if (SDL_GetWindowWMInfo(sgSDLFrame->mWindow, &wminfo) == 1)
return wminfo.info.win.window;
-
+ #endif
return 0;
}
#endif
@@ -2484,6 +2650,19 @@ QuickVec* CapabilitiesGetScreenResolutions()
InitSDL();
QuickVec *out = new QuickVec();
+ #ifdef NME_SDL3
+
+ SDL_DisplayID display_id = SDL_GetPrimaryDisplay();
+
+ int count = 0;
+ SDL_DisplayMode **modes = SDL_GetFullscreenDisplayModes(display_id, &count);
+ for(int i=0;ipush_back(modes[i]->w);
+ out->push_back(modes[i]->h);
+ }
+ #else
+
int numModes = SDL_GetNumDisplayModes(0);
SDL_DisplayMode mode;
@@ -2493,7 +2672,8 @@ QuickVec* CapabilitiesGetScreenResolutions()
out->push_back(mode.w);
out->push_back(mode.h);
}
-
+ #endif
+
return out;
}
@@ -2503,16 +2683,31 @@ QuickVec* CapabilitiesGetScreenModes()
InitSDL();
QuickVec *out = new QuickVec();
+
+ #ifdef NME_SDL3
+ SDL_DisplayID display_id = SDL_GetPrimaryDisplay();
+ int numModes = 0;
+ SDL_DisplayMode **modes = SDL_GetFullscreenDisplayModes(display_id, &numModes);
+ #else
+
int numModes = SDL_GetNumDisplayModes(0);
SDL_DisplayMode mode;
+ SDL_DisplayMode *modePtr = &mode;
+ #endif
for (int i = 0; i < numModes; i++)
{
- SDL_GetDisplayMode(0, i, &mode);
+ #ifdef NME_SDL3
+ SDL_DisplayMode *modePtr = modes[i];
+ #else
+ SDL_GetDisplayMode(0, i, modePtr);
+ #endif
+
ScreenMode screenMode;
- screenMode.width = mode.w;
- screenMode.height = mode.h;
- switch (mode.format) {
+ screenMode.width = modePtr->w;
+ screenMode.height = modePtr->h;
+ switch (modePtr->format)
+ {
case SDL_PIXELFORMAT_UNKNOWN:
screenMode.format = PIXELFORMAT_UNKNOWN;
break;
@@ -2622,7 +2817,7 @@ QuickVec* CapabilitiesGetScreenModes()
screenMode.format = PIXELFORMAT_YVYU;
break;
}
- screenMode.refreshRate = mode.refresh_rate;
+ screenMode.refreshRate = modePtr->refresh_rate;
out->push_back(screenMode);
}
@@ -2680,7 +2875,11 @@ void StartAnimation()
event.type = SDL_NOEVENT;
//SDL_EventState(SDL_DROPTEXT, SDL_ENABLE);
+ #if NME_SDL3
+ SDL_SetEventEnabled(SDL_DROPFILE, true);
+ #else
SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
+ #endif
double nextWake = GetTimeStamp();
while(!sgDead)
diff --git a/project/toolkit/sdl-mixer/SDL_mixer b/project/toolkit/sdl-mixer/SDL_mixer
index 59caf947b..124831c87 160000
--- a/project/toolkit/sdl-mixer/SDL_mixer
+++ b/project/toolkit/sdl-mixer/SDL_mixer
@@ -1 +1 @@
-Subproject commit 59caf947bd0b024c1790a4b3c6320793b467c165
+Subproject commit 124831c87e6e546ee905db38e1c2f6086fc3c18c
diff --git a/project/toolkit/sdl/SDL b/project/toolkit/sdl/SDL
index 295266c70..640559eba 160000
--- a/project/toolkit/sdl/SDL
+++ b/project/toolkit/sdl/SDL
@@ -1 +1 @@
-Subproject commit 295266c7080a0ae5f8d19decadc76e593c498321
+Subproject commit 640559eba68e9d3cc0840fa745cff38f41adcc3f
diff --git a/project/toolkit/sdl/configs/windows/SDL_config.h b/project/toolkit/sdl/configs/windows/SDL_config.h
index 88ec5b3dd..1f4e71da4 100644
--- a/project/toolkit/sdl/configs/windows/SDL_config.h
+++ b/project/toolkit/sdl/configs/windows/SDL_config.h
@@ -221,43 +221,67 @@ typedef unsigned int uintptr_t;
#define SDL_VIDEO_RENDER_D3D11 0
#endif
-#ifndef NATIVE_TOOLKIT_SDL_ANGLE
-/* Enable OpenGL support */
+#if defined(NME_DYNAMIC_ANGLE)
+
+/* Enable OpenGL support (ES2/ANGLE) */
#ifndef SDL_VIDEO_OPENGL
#define SDL_VIDEO_OPENGL 1
#endif
-#ifndef SDL_VIDEO_OPENGL_WGL
-#define SDL_VIDEO_OPENGL_WGL 1
-#endif
+//#ifndef SDL_VIDEO_OPENGL_WGL
+//#define SDL_VIDEO_OPENGL_WGL 1
+//#endif
#ifndef SDL_VIDEO_RENDER_OGL
#define SDL_VIDEO_RENDER_OGL 1
#endif
#ifndef SDL_VIDEO_RENDER_OGL_ES2
-#define SDL_VIDEO_RENDER_OGL_ES2 0
+#define SDL_VIDEO_RENDER_OGL_ES2 1
#endif
#ifndef SDL_VIDEO_OPENGL_ES2
-#define SDL_VIDEO_OPENGL_ES2 0
+#define SDL_VIDEO_OPENGL_ES2 1
#endif
#ifndef SDL_VIDEO_OPENGL_EGL
-#define SDL_VIDEO_OPENGL_EGL 0
+#define SDL_VIDEO_OPENGL_EGL 1
+#endif
+
+#elif !defined(NATIVE_TOOLKIT_SDL_ANGLE)
+
+/* Enable OpenGL support */
+#ifndef SDL_VIDEO_OPENGL
+#define SDL_VIDEO_OPENGL 1
#endif
+#ifndef SDL_VIDEO_OPENGL_WGL
+#define SDL_VIDEO_OPENGL_WGL 1
+#endif
+#ifndef SDL_VIDEO_RENDER_OGL
+#define SDL_VIDEO_RENDER_OGL 1
+#endif
+//#ifndef SDL_VIDEO_RENDER_OGL_ES2
+//#define SDL_VIDEO_RENDER_OGL_ES2 0
+//#endif
+//#ifndef SDL_VIDEO_OPENGL_ES2
+//#define SDL_VIDEO_OPENGL_ES2 0
+//#endif
+//#ifndef SDL_VIDEO_OPENGL_EGL
+//#define SDL_VIDEO_OPENGL_EGL 0
+//#endif
/* Enable Vulkan support */
#define SDL_VIDEO_VULKAN 1
+
#else
/* Enable OpenGL support (ES2/ANGLE) */
#ifndef SDL_VIDEO_OPENGL
#define SDL_VIDEO_OPENGL 1
#endif
-#ifndef SDL_VIDEO_OPENGL_WGL
-#define SDL_VIDEO_OPENGL_WGL 0
-#endif
-#ifndef SDL_VIDEO_RENDER_OGL
-#define SDL_VIDEO_RENDER_OGL 0
-#endif
+//#ifndef SDL_VIDEO_OPENGL_WGL
+//#define SDL_VIDEO_OPENGL_WGL 0
+//#endif
+//#ifndef SDL_VIDEO_RENDER_OGL
+//#define SDL_VIDEO_RENDER_OGL 0
+//#endif
#ifndef SDL_VIDEO_RENDER_OGL_ES2
#define SDL_VIDEO_RENDER_OGL_ES2 1
#endif
diff --git a/project/toolkit/sdl/files.xml b/project/toolkit/sdl/files.xml
index be2a31a55..2018a045c 100644
--- a/project/toolkit/sdl/files.xml
+++ b/project/toolkit/sdl/files.xml
@@ -15,64 +15,64 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -90,11 +89,9 @@
-
@@ -102,6 +99,7 @@
+ -->
@@ -117,8 +115,8 @@
-
-
+
+
@@ -132,6 +130,7 @@
+
@@ -319,7 +318,6 @@