From 7937c4c4d40d33998a424a36e892debd1160e834 Mon Sep 17 00:00:00 2001 From: spartanj Date: Mon, 7 Feb 2011 04:03:27 -0300 Subject: [PATCH] Preparing SDL encapsulation. Modified some things on the GL3 renderer. --- src/ee.h | 13 +- src/graphics/cbatchrenderer.cpp | 22 +- src/graphics/cconsole.cpp | 128 +++--- src/graphics/cfont.cpp | 4 +- src/graphics/cparticlesystem.cpp | 8 - src/graphics/cvertexbuffer.cpp | 24 -- src/graphics/cvertexbuffer.hpp | 2 +- src/graphics/cvertexbufferogl.cpp | 24 +- src/graphics/cvertexbufferogl.hpp | 2 + src/graphics/cvertexbuffervbo.cpp | 50 ++- src/graphics/cvertexbuffervbo.hpp | 2 + src/graphics/renderer/crenderergl3.cpp | 140 +++--- src/graphics/renderer/crenderergl3.hpp | 2 + src/helper/haikuttf/hkbase.hpp | 12 - src/physics/constraints/cdampedspring.cpp | 3 + src/physics/cshapepoly.cpp | 23 +- src/physics/cshapesegment.cpp | 2 +- src/test/ee.cpp | 15 +- src/ui/cuidragable.cpp | 2 +- src/ui/cuieventkey.cpp | 9 +- src/ui/cuieventkey.hpp | 5 +- src/ui/cuilistbox.cpp | 2 +- src/ui/cuimanager.cpp | 12 +- src/ui/cuimanager.hpp | 6 +- src/window/cengine.cpp | 8 +- src/window/cinput.cpp | 97 +---- src/window/cinputtextbuffer.cpp | 20 +- src/window/inputhelper.cpp | 86 ++++ src/window/inputhelper.hpp | 492 ++++++++++++---------- 29 files changed, 626 insertions(+), 589 deletions(-) create mode 100644 src/window/inputhelper.cpp diff --git a/src/ee.h b/src/ee.h index 60b9826f6..dc9a6353a 100755 --- a/src/ee.h +++ b/src/ee.h @@ -11,14 +11,23 @@ Thanks to: \n * Sean Barrett for the stb_vorbis and stb_image libraries. \n * Sam Latinga for Simple DirectMedia Layer library. \n - * Lucian Wischik for ziputils library. \n * Jonathan Dummer for the Simple OpenGL Image Library. \n * Laurent Gomila for the SFML library ( eepp audio module is based on the SFML audio module ) \n * OGRE staff for the Timer implementation \n - * Amir 'Genjix' Taaki for the information of SDL_Collide.h. \n + * Lewis Van Winkle for PlusCallback \n + * Dieter Baron and Thomas Klausner for libzip \n + * Jean-loup Gailly and Mark Adler for zlib \n + * Milan Ikits and Marcelo Magallon for GLEW \n * And a lot more people! **/ +/** + @TODO Add some Surface Grid class, to create special effects ( waved texture, and stuff like that ). + @TODO Add Scripting support ( lua or squirrel ). + @TODO Encapsulate SDL and OpenGL ( and remove unnecessary dependencies ). + @TODO Support color cursors ( not only black and white cursors, that really sucks ) - Imposible with SDL 1.2 +*/ + // General includes and declarations #include "base.hpp" using namespace EE; diff --git a/src/graphics/cbatchrenderer.cpp b/src/graphics/cbatchrenderer.cpp index 3beaeec54..a810143be 100755 --- a/src/graphics/cbatchrenderer.cpp +++ b/src/graphics/cbatchrenderer.cpp @@ -98,12 +98,6 @@ void cBatchRenderer::Flush() { bool CreateMatrix = ( mRotation || mScale != 1.0f || mPosition.x || mPosition.y ); - if ( NULL != mTexture ) { - cTextureFactory::instance()->Bind( mTexture ); - } else { - GLi->Disable( GL_TEXTURE_2D ); - } - cTextureFactory::instance()->SetPreBlendFunc( mBlend ); if ( mCurrentMode == DM_POINTS && NULL != mTexture ) { @@ -115,9 +109,7 @@ void cBatchRenderer::Flush() { GLi->LoadIdentity(); GLi->PushMatrix(); - GLi->Translatef( mPosition.x, mPosition.y, 0.0f); - - GLi->Translatef( mCenter.x, mCenter.y, 0.0f); + GLi->Translatef( mPosition.x + mCenter.x, mPosition.y + mCenter.y, 0.0f); GLi->Rotatef( mRotation, 0.0f, 0.0f, 1.0f ); GLi->Scalef( mScale, mScale, 1.0f ); GLi->Translatef( -mCenter.x, -mCenter.y, 0.0f); @@ -128,16 +120,19 @@ void cBatchRenderer::Flush() { GLi->VertexPointer ( 2, GL_FLOAT , sizeof(eeVertex), reinterpret_cast ( &mVertex[0] ) , alloc ); GLi->ColorPointer ( 4, GL_UNSIGNED_BYTE , sizeof(eeVertex), reinterpret_cast ( &mVertex[0] ) + sizeof(eeVector2f) + sizeof(eeTexCoord) , alloc ); - if ( GLv_3 == GLi->Version() ) { - if ( NULL != mTexture ) - GLi->TexCoordPointer( 2, GL_FLOAT , sizeof(eeVertex), reinterpret_cast ( &mVertex[0] ) + sizeof(eeVector2f) , alloc ); + if ( NULL != mTexture ) { + cTextureFactory::instance()->Bind( mTexture ); + GLi->TexCoordPointer( 2, GL_FLOAT , sizeof(eeVertex), reinterpret_cast ( &mVertex[0] ) + sizeof(eeVector2f) , alloc ); } else { - GLi->TexCoordPointer( 2, GL_FLOAT , sizeof(eeVertex), reinterpret_cast ( &mVertex[0] ) + sizeof(eeVector2f) , alloc ); + GLi->Disable( GL_TEXTURE_2D ); + GLi->DisableClientState( GL_TEXTURE_COORD_ARRAY ); } #ifdef EE_GLES if ( DM_QUADS == mCurrentMode ) { GLi->DrawArrays( DM_TRIANGLES, 0, NumVertex ); + } else if ( DM_POLYGON == mCurrentMode ) { + GLi->DrawArrays( DM_TRIANGLE_FAN, 0, NumVertex ); } else #endif { @@ -154,6 +149,7 @@ void cBatchRenderer::Flush() { if ( mTexture == 0 ) { GLi->Enable( GL_TEXTURE_2D ); + GLi->EnableClientState( GL_TEXTURE_COORD_ARRAY ); } } diff --git a/src/graphics/cconsole.cpp b/src/graphics/cconsole.cpp index defe55011..8ebfad941 100755 --- a/src/graphics/cconsole.cpp +++ b/src/graphics/cconsole.cpp @@ -304,81 +304,79 @@ void cConsole::PrintCommandsStartingWith( const std::wstring& start ) { } } -void cConsole::PrivInputCallback( EE_Event* Event ) { - switch( Event->type ) { - case SDL_KEYUP: - if ( mVisible ) { - if ( ( Event->key.keysym.sym == SDLK_TAB ) && (eeUint)mTBuf.CurPos() == mTBuf.Buffer().size() ) { - PrintCommandsStartingWith( mTBuf.Buffer() ); - } +void cConsole::PrivInputCallback( EE_Event * Event ) { + Uint8 etype = Event->type; + + if ( mVisible ) { + Uint32 KeyCode = (Uint32)Event->key.keysym.sym; + Uint32 Button = Event->button.button; + + if ( SDL_KEYDOWN == etype ) { + if ( ( KeyCode == KEY_TAB ) && (eeUint)mTBuf.CurPos() == mTBuf.Buffer().size() ) { + PrintCommandsStartingWith( mTBuf.Buffer() ); } - case SDL_KEYDOWN: - if ( mVisible ) { - if ( mLastCommands.size() > 0 ) { - if ( Event->key.keysym.sym == SDLK_UP && mLastLogPos > 0 ) - mLastLogPos--; - if ( Event->key.keysym.sym == SDLK_DOWN && mLastLogPos < static_cast( mLastCommands.size() ) ) - mLastLogPos++; + if ( mLastCommands.size() > 0 ) { + if ( KeyCode == KEY_UP && mLastLogPos > 0 ) { + mLastLogPos--; + } - if ( Event->key.keysym.sym == SDLK_UP || Event->key.keysym.sym == SDLK_DOWN ) { - if ( mLastLogPos == static_cast( mLastCommands.size() ) ) { - mTBuf.Buffer( L"" ); - } else { - mTBuf.Buffer( mLastCommands[mLastLogPos] ); - } + if ( KeyCode == KEY_DOWN && mLastLogPos < static_cast( mLastCommands.size() ) ) { + mLastLogPos++; + } + + if ( KeyCode == KEY_UP || KeyCode == KEY_DOWN ) { + if ( mLastLogPos == static_cast( mLastCommands.size() ) ) { + mTBuf.Buffer( L"" ); + } else { + mTBuf.Buffer( mLastCommands[mLastLogPos] ); } } - - if ( Event->key.keysym.sym == SDLK_PAGEUP ) { - if ( mCon.ConMin - mCon.ConModif > 0 ) - mCon.ConModif++; - } - - if ( Event->key.keysym.sym == SDLK_PAGEDOWN ) { - if ( mCon.ConModif > 0 ) - mCon.ConModif--; - } - - if ( Event->key.keysym.sym == SDLK_HOME ) { - Int16 LinesInScreen = static_cast ( (mCurHeight / mFontSize) - 1 ); - if ( static_cast( mCmdLog.size() ) > LinesInScreen ) - mCon.ConModif = mCon.ConMin; - } - - if ( Event->key.keysym.sym == SDLK_END ) { - mCon.ConModif = 0; - } } - break; - case SDL_VIDEOEXPOSE: - case SDL_VIDEORESIZE: // Fix the size of the console if the resolution change - mWidth = (eeFloat) cEngine::instance()->GetWidth(); - mHeight = (eeFloat) cEngine::instance()->GetHeight(); - mHeightMin = (eeFloat) cEngine::instance()->GetHeight() * 0.4f; - if (mVisible) { - if ( mExpand ) - mCurHeight = mHeight; - else - mCurHeight = mHeightMin; - - mY = mCurHeight; + if ( KeyCode == KEY_PAGEUP ) { + if ( mCon.ConMin - mCon.ConModif > 0 ) + mCon.ConModif++; } - break; - case SDL_MOUSEBUTTONDOWN: - if ( mVisible ) { - if ( Event->button.button == SDL_BUTTON_WHEELUP ) { - if ( mCon.ConMin - mCon.ConModif > 0 ) - mCon.ConModif++; - } - if ( Event->button.button == SDL_BUTTON_WHEELDOWN ) { - if ( mCon.ConModif > 0 ) - mCon.ConModif--; - } + if ( KeyCode == KEY_PAGEDOWN ) { + if ( mCon.ConModif > 0 ) + mCon.ConModif--; } - break; + + if ( KeyCode == KEY_HOME ) { + Int16 LinesInScreen = static_cast ( (mCurHeight / mFontSize) - 1 ); + if ( static_cast( mCmdLog.size() ) > LinesInScreen ) + mCon.ConModif = mCon.ConMin; + } + + if ( KeyCode == KEY_END ) { + mCon.ConModif = 0; + } + } else if ( SDL_MOUSEBUTTONDOWN == etype ) { + if ( Button == EE_BUTTON_WHEELUP ) { + if ( mCon.ConMin - mCon.ConModif > 0 ) + mCon.ConModif++; + } + + if ( Button == EE_BUTTON_WHEELDOWN ) { + if ( mCon.ConModif > 0 ) + mCon.ConModif--; + } + } + } else if ( SDL_VIDEOEXPOSE == etype || SDL_VIDEORESIZE == etype ) { + mWidth = (eeFloat) cEngine::instance()->GetWidth(); + mHeight = (eeFloat) cEngine::instance()->GetHeight(); + mHeightMin = (eeFloat) cEngine::instance()->GetHeight() * 0.4f; + + if ( mVisible ) { + if ( mExpand ) + mCurHeight = mHeight; + else + mCurHeight = mHeightMin; + + mY = mCurHeight; + } } } diff --git a/src/graphics/cfont.cpp b/src/graphics/cfont.cpp index 1153fbc3e..5abe6034b 100644 --- a/src/graphics/cfont.cpp +++ b/src/graphics/cfont.cpp @@ -161,9 +161,7 @@ void cFont::Draw( cTextCache& TextCache, const eeFloat& X, const eeFloat& Y, con GLi->Translatef( Center.x , Center.y, 0.f ); GLi->Rotatef( Angle, 0.0f, 0.0f, 1.0f ); GLi->Scalef( Scale, Scale, 1.0f ); - GLi->Translatef( -Center.x, -Center.y, 0.f ); - - GLi->Translatef( X, Y, 0.f ); + GLi->Translatef( -Center.x + X, -Center.y + Y, 0.f ); } std::vector& RenderCoords = TextCache.VertextCoords(); diff --git a/src/graphics/cparticlesystem.cpp b/src/graphics/cparticlesystem.cpp index e34cee814..2ac242d57 100755 --- a/src/graphics/cparticlesystem.cpp +++ b/src/graphics/cparticlesystem.cpp @@ -263,10 +263,6 @@ void cParticleSystem::Draw() { TF->SetPreBlendFunc( ALPHA_BLENDONE ); if ( mPointsSup ) { - if ( GLi->Version() == GLv_3 ) { - GLi->Enable( GL_VERTEX_PROGRAM_POINT_SIZE ); - } - GLi->Enable( GL_POINT_SPRITE ); GLi->PointSize( mSize ); @@ -278,10 +274,6 @@ void cParticleSystem::Draw() { GLi->DrawArrays( GL_POINTS, 0, (GLsizei)mPCount ); GLi->Disable( GL_POINT_SPRITE ); - - if ( GLi->Version() == GLv_3 ) { - GLi->Disable( GL_VERTEX_PROGRAM_POINT_SIZE ); - } } else { cTexture * Tex = TF->GetTexture( mTexId ); diff --git a/src/graphics/cvertexbuffer.cpp b/src/graphics/cvertexbuffer.cpp index e67ed9ff9..a0f6beb50 100644 --- a/src/graphics/cvertexbuffer.cpp +++ b/src/graphics/cvertexbuffer.cpp @@ -35,12 +35,6 @@ cVertexBuffer::cVertexBuffer( const Uint32& VertexFlags, EE_DRAW_MODE DrawType, } cVertexBuffer::~cVertexBuffer() { - for( Int32 i = 0; i < VERTEX_FLAGS_COUNT_ARR; i++ ) - mVertexArray[ i ].clear(); - - mColorArray.clear(); - mIndexArray.clear(); - cVertexBufferManager::instance()->Remove( this ); } @@ -141,22 +135,4 @@ const Int32& cVertexBuffer::GetElementNum() const { return mElemDraw; } -void cVertexBuffer::Unbind() { - if( !VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_POSITION ) ) { - if ( GLv_3 == GLi->Version() ) { - GLi->EnableClientState( GL_VERTEX_ARRAY ); - } - } - - if( !VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_COLOR ) ) { - if ( GLv_3 == GLi->Version() ) { - GLi->EnableClientState( GL_COLOR_ARRAY ); - } - } - - if( !VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_TEXTURE0 ) ) { - GLi->Enable( GL_TEXTURE_2D ); - } -} - }} diff --git a/src/graphics/cvertexbuffer.hpp b/src/graphics/cvertexbuffer.hpp index b8f51896f..670834b43 100644 --- a/src/graphics/cvertexbuffer.hpp +++ b/src/graphics/cvertexbuffer.hpp @@ -50,7 +50,7 @@ class cVertexBuffer { virtual void Bind() = 0; - virtual void Unbind(); + virtual void Unbind() = 0; virtual void Draw() = 0; diff --git a/src/graphics/cvertexbufferogl.cpp b/src/graphics/cvertexbufferogl.cpp index 2d0af80d4..37daa30ea 100644 --- a/src/graphics/cvertexbufferogl.cpp +++ b/src/graphics/cvertexbufferogl.cpp @@ -41,7 +41,7 @@ void cVertexBufferOGL::SetVertexStates() { GLi->EnableClientState( GL_VERTEX_ARRAY ); GLi->VertexPointer( eeVertexElements[ VERTEX_FLAG_POSITION ], GL_FLOAT, sizeof(float) * eeVertexElements[ VERTEX_FLAG_POSITION ], &mVertexArray[ VERTEX_FLAG_POSITION ][0], alloc ); } else { - //GLi->DisableClientState( GL_VERTEX_ARRAY ); + GLi->DisableClientState( GL_VERTEX_ARRAY ); } /// COLOR @@ -49,7 +49,7 @@ void cVertexBufferOGL::SetVertexStates() { GLi->EnableClientState( GL_COLOR_ARRAY ); GLi->ColorPointer( eeVertexElements[ VERTEX_FLAG_COLOR ], GL_UNSIGNED_BYTE, sizeof(Uint8) * eeVertexElements[ VERTEX_FLAG_COLOR ], &mColorArray[0], allocC ); } else { - //GLi->DisableClientState( GL_COLOR_ARRAY ); + GLi->DisableClientState( GL_COLOR_ARRAY ); } /// TEXTURES @@ -61,8 +61,8 @@ void cVertexBufferOGL::SetVertexStates() { GLi->TexCoordPointer( eeVertexElements[ VERTEX_FLAG_TEXTURE0 + i ], GL_FLOAT, sizeof(float) * eeVertexElements[ VERTEX_FLAG_TEXTURE0 + i ], &mVertexArray[ VERTEX_FLAG_TEXTURE0 + i ][0], alloc ); } else { - //GLi->DisableClientState( GL_TEXTURE_COORD_ARRAY ); GLi->Disable( GL_TEXTURE_2D ); + GLi->DisableClientState( GL_TEXTURE_COORD_ARRAY ); } } } else { @@ -70,8 +70,8 @@ void cVertexBufferOGL::SetVertexStates() { GLi->EnableClientState( GL_TEXTURE_COORD_ARRAY ); GLi->TexCoordPointer( eeVertexElements[ VERTEX_FLAG_TEXTURE0 ], GL_FLOAT, sizeof(float) * eeVertexElements[ VERTEX_FLAG_TEXTURE0 ], &mVertexArray[ VERTEX_FLAG_TEXTURE0 ][0], alloc ); } else { - //GLi->DisableClientState( GL_TEXTURE_COORD_ARRAY ); GLi->Disable( GL_TEXTURE_2D ); + GLi->DisableClientState( GL_TEXTURE_COORD_ARRAY ); } } @@ -79,6 +79,22 @@ void cVertexBufferOGL::SetVertexStates() { GLi->ClientActiveTexture( GL_TEXTURE0 ); } + +void cVertexBufferOGL::Unbind() { + if( !VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_POSITION ) ) { + GLi->EnableClientState( GL_VERTEX_ARRAY ); + } + + if( !VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_COLOR ) ) { + GLi->EnableClientState( GL_COLOR_ARRAY ); + } + + if( !VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_TEXTURE0 ) ) { + GLi->Enable( GL_TEXTURE_2D ); + GLi->EnableClientState( GL_TEXTURE_COORD_ARRAY ); + } +} + void cVertexBufferOGL::Update( const Uint32& Types, bool Indices ) { } diff --git a/src/graphics/cvertexbufferogl.hpp b/src/graphics/cvertexbufferogl.hpp index 7956ef125..2bff528f0 100644 --- a/src/graphics/cvertexbufferogl.hpp +++ b/src/graphics/cvertexbufferogl.hpp @@ -20,6 +20,8 @@ class cVertexBufferOGL : public cVertexBuffer { void Update( const Uint32& Types, bool Indices ); void Reload(); + + void Unbind(); protected: void SetVertexStates(); diff --git a/src/graphics/cvertexbuffervbo.cpp b/src/graphics/cvertexbuffervbo.cpp index 1df984e01..7affcee71 100644 --- a/src/graphics/cvertexbuffervbo.cpp +++ b/src/graphics/cvertexbuffervbo.cpp @@ -100,13 +100,13 @@ void cVertexBufferVBO::Draw() { return; if ( GLv_3 == GLi->Version() ) { - if ( !mTextured ) { - GLi->Disable( GL_TEXTURE_2D ); - } - #ifndef EE_GLES2 glBindVertexArray( mVAO ); #endif + + if ( !mTextured ) { + GLi->Disable( GL_TEXTURE_2D ); + } } if( VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_USE_INDICES ) ) { @@ -159,9 +159,7 @@ void cVertexBufferVBO::SetVertexStates() { GLi->VertexPointer( eeVertexElements[ VERTEX_FLAG_POSITION ], GL_FLOAT, 0, (char*)NULL, 0 ); } } else { - if ( GLv_3 == GLi->Version() ) { - GLi->DisableClientState( GL_VERTEX_ARRAY ); - } + GLi->DisableClientState( GL_VERTEX_ARRAY ); } /// COLOR @@ -178,20 +176,16 @@ void cVertexBufferVBO::SetVertexStates() { GLi->ColorPointer( eeVertexElements[ VERTEX_FLAG_COLOR ], GL_UNSIGNED_BYTE, 0, (char*)NULL, 0 ); } } else { - if ( GLv_3 == GLi->Version() ) { - GLi->DisableClientState( GL_COLOR_ARRAY ); - } + GLi->DisableClientState( GL_COLOR_ARRAY ); } /// TEXTURES if ( GLi->IsExtension( EEGL_ARB_multitexture ) ) { for ( Int32 i = 0; i < 5; i++ ) { if( VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_TEXTURE0 + i ) ) { - if ( GLv_3 != GLi->Version() ) { - GLi->ClientActiveTexture( GL_TEXTURE0 + i ); - } - + GLi->ClientActiveTexture( GL_TEXTURE0 + i ); GLi->EnableClientState( GL_TEXTURE_COORD_ARRAY ); + glBindBuffer( GL_ARRAY_BUFFER, mArrayHandle[ VERTEX_FLAG_TEXTURE0 + i ] ); if ( GLv_3 == GLi->Version() ) { /** FIXME: Support for multitexturing */ @@ -205,6 +199,7 @@ void cVertexBufferVBO::SetVertexStates() { mTextured = true; } else { + GLi->DisableClientState( GL_TEXTURE_COORD_ARRAY ); GLi->Disable( GL_TEXTURE_2D ); mTextured = false; @@ -229,16 +224,14 @@ void cVertexBufferVBO::SetVertexStates() { mTextured = true; } else { GLi->Disable( GL_TEXTURE_2D ); + GLi->DisableClientState( GL_TEXTURE_COORD_ARRAY ); mTextured = false; } } GLi->ActiveTexture( GL_TEXTURE0 ); - - if ( GLv_3 != GLi->Version() ) { - GLi->ClientActiveTexture( GL_TEXTURE0 ); - } + GLi->ClientActiveTexture( GL_TEXTURE0 ); glBindBuffer( GL_ARRAY_BUFFER, 0 ); @@ -283,4 +276,25 @@ void cVertexBufferVBO::Reload() { Compile(); } + +void cVertexBufferVBO::Unbind() { + if ( GLv_3 == GLi->Version() ) { + GLi->GetRendererGL3()->BindGlobalVAO(); + } else { + if( !VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_POSITION ) ) { + GLi->EnableClientState( GL_VERTEX_ARRAY ); + } + + if( !VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_COLOR ) ) { + GLi->EnableClientState( GL_COLOR_ARRAY ); + } + + if( !VERTEX_FLAG_QUERY( mVertexFlags, VERTEX_FLAG_TEXTURE0 ) ) { + GLi->Enable( GL_TEXTURE_2D ); + GLi->EnableClientState( GL_TEXTURE_COORD_ARRAY ); + } + } +} + + }} diff --git a/src/graphics/cvertexbuffervbo.hpp b/src/graphics/cvertexbuffervbo.hpp index 779fe9793..b019cad43 100644 --- a/src/graphics/cvertexbuffervbo.hpp +++ b/src/graphics/cvertexbuffervbo.hpp @@ -20,6 +20,8 @@ class cVertexBufferVBO : public cVertexBuffer { void Update( const Uint32& Types, bool Indices ); void Reload(); + + void Unbind(); protected: void SetVertexStates(); diff --git a/src/graphics/renderer/crenderergl3.cpp b/src/graphics/renderer/crenderergl3.cpp index a975492f8..d2e916c56 100644 --- a/src/graphics/renderer/crenderergl3.cpp +++ b/src/graphics/renderer/crenderergl3.cpp @@ -9,7 +9,7 @@ const char * EEGL_STATES_NAME[] = { "dgl_Normal", "dgl_Color", "dgl_Index", - "dgl_TexCoord", + "dgl_MultiTexCoord0", "dgl_EdgeFlag" }; @@ -33,28 +33,27 @@ const char * EEGL_PLANES_NAME[] = { const GLchar * EEGL_SHADER_BASE_VS[] = { "#version 150\n", - "#extension GL_ARB_explicit_attrib_location : enable\n", "#define MAX_CLIP_PLANES 6\n", - "uniform mat4 dgl_ProjectionMatrix;\n", // replaces deprecated gl_ProjectionMatrix - "uniform mat4 dgl_ModelViewMatrix;\n", // replaces deprecated gl_ModelViewMatrix - "uniform int dgl_ClippingEnabled = 0;\n", - "uniform int dgl_ClipEnabled[ MAX_CLIP_PLANES ] = { 0, 0, 0, 0, 0, 0 };\n", - "uniform vec4 dgl_ClipPlane[ MAX_CLIP_PLANES ];\n", + "uniform mat4 dgl_ProjectionMatrix;\n", // replaces deprecated gl_ProjectionMatrix + "uniform mat4 dgl_ModelViewMatrix;\n", // replaces deprecated gl_ModelViewMatrix + "uniform int dgl_ClippingEnabled = 0;\n", + "uniform int dgl_ClipEnabled[ MAX_CLIP_PLANES ] = { 0, 0, 0, 0, 0, 0 };\n", + "uniform vec4 dgl_ClipPlane[ MAX_CLIP_PLANES ];\n", #ifdef EE_GLES2 - "uniform float dgl_PointSize = 1;\n", + "uniform float dgl_PointSize = 1;\n", #endif - "layout(location = 0) in vec4 dgl_Vertex;\n", // replaces deprecated gl_Vertex - "layout(location = 2) in vec4 dgl_Color;\n", // replaces deprecated gl_Color - "layout(location = 4) in vec2 dgl_TexCoord;\n", // replaces deprecated gl_TexCoord - "invariant out vec4 Color;\n", // to fragment shader - "invariant out vec2 TexCoord;\n", // to fragment shader + "in vec4 dgl_Vertex;\n", // replaces deprecated gl_Vertex + "in vec4 dgl_Color;\n", // replaces deprecated gl_Color + "in vec4 dgl_MultiTexCoord0;\n", // replaces deprecated gl_MultiTexCoord0 + "invariant out vec4 dgl_VertexColor;\n", // to fragment shader + "invariant out vec4 dgl_TexCoord0;\n", // to fragment shader "void main(void)\n", "{\n", #ifdef EE_GLES2 " gl_PointSize = dgl_PointSize;\n", #endif - " Color = dgl_Color;\n", - " TexCoord = dgl_TexCoord;\n", + " dgl_VertexColor = dgl_Color;\n", + " dgl_TexCoord0 = dgl_MultiTexCoord0;\n", " vec4 vEye = dgl_ModelViewMatrix * dgl_Vertex;\n", " gl_Position = dgl_ProjectionMatrix * vEye;\n", " if ( 1 == dgl_ClippingEnabled ) {\n", @@ -71,18 +70,18 @@ const GLchar * EEGL_SHADER_BASE_FS[] = { "uniform sampler2D textureUnit0;\n", "uniform int dgl_TexActive = 1;\n", "uniform int dgl_PointSpriteActive = 0;\n", - "invariant in vec4 Color;\n", - "invariant in vec2 TexCoord;\n", - "out vec4 dgl_FragColor;\n", + "invariant in vec4 dgl_VertexColor;\n", + "invariant in vec4 dgl_TexCoord0;\n", + "smooth out vec4 dgl_FragColor;\n", "void main(void)\n", "{\n", " if ( 0 == dgl_PointSpriteActive ) {\n", " if ( 1 == dgl_TexActive )\n", - " dgl_FragColor = Color * texture2D( textureUnit0, TexCoord );\n", + " dgl_FragColor = dgl_VertexColor * texture2D( textureUnit0, dgl_TexCoord0.xy );\n", " else\n", - " dgl_FragColor = Color;\n", + " dgl_FragColor = dgl_VertexColor;\n", " } else\n", - " dgl_FragColor = Color * texture2D( textureUnit0, gl_PointCoord );\n", + " dgl_FragColor = dgl_VertexColor * texture2D( textureUnit0, gl_PointCoord );\n", "}\n" }; @@ -162,49 +161,6 @@ void cRendererGL3::SetShader( cShaderProgram * Shader ) { MatrixMode( CM ); } -void cRendererGL3::Disable ( GLenum cap ) { - switch ( cap ) { - case GL_TEXTURE_2D: - { - if ( glIsEnabled( cap ) ) { - mTexActive = 0; - mCurShader->SetUniform( mTexActiveLoc, mTexActive ); - - /// Reset the vertex attrib to zero to avoid crashes on draw calls - TexCoordPointer( 2, GL_FLOAT, 0, (const GLvoid*)NULL, 0 ); - } - - break; - } - case GL_CLIP_PLANE0: - case GL_CLIP_PLANE1: - case GL_CLIP_PLANE2: - case GL_CLIP_PLANE3: - case GL_CLIP_PLANE4: - case GL_CLIP_PLANE5: - { - GLint plane = cap - GL_CLIP_PLANE0; - - mPlanesStates[ plane ] = 0; - PlaneStateCheck( false ); - mCurShader->SetUniform( EEGL_PLANES_ENABLED_NAME[ plane ], 0 ); - - break; - } - case GL_POINT_SPRITE: - { - mCurShader->SetUniform( mPointSpriteLoc, 0 ); - break; - } - case GL_VERTEX_PROGRAM_POINT_SIZE: - { /// Point Sprite flag for the shader? - break; - } - } - - cGL::Disable( cap ); -} - void cRendererGL3::Enable( GLenum cap ) { switch ( cap ) { case GL_TEXTURE_2D: @@ -234,10 +190,9 @@ void cRendererGL3::Enable( GLenum cap ) { case GL_POINT_SPRITE: { mCurShader->SetUniform( mPointSpriteLoc, 1 ); - break; - } - case GL_VERTEX_PROGRAM_POINT_SIZE: - { + + cGL::Enable( GL_VERTEX_PROGRAM_POINT_SIZE ); + break; } } @@ -245,6 +200,45 @@ void cRendererGL3::Enable( GLenum cap ) { cGL::Enable( cap ); } +void cRendererGL3::Disable ( GLenum cap ) { + switch ( cap ) { + case GL_TEXTURE_2D: + { + if ( glIsEnabled( cap ) ) { + mTexActive = 0; + mCurShader->SetUniform( mTexActiveLoc, mTexActive ); + } + + break; + } + case GL_CLIP_PLANE0: + case GL_CLIP_PLANE1: + case GL_CLIP_PLANE2: + case GL_CLIP_PLANE3: + case GL_CLIP_PLANE4: + case GL_CLIP_PLANE5: + { + GLint plane = cap - GL_CLIP_PLANE0; + + mPlanesStates[ plane ] = 0; + PlaneStateCheck( false ); + mCurShader->SetUniform( EEGL_PLANES_ENABLED_NAME[ plane ], 0 ); + + break; + } + case GL_POINT_SPRITE: + { + mCurShader->SetUniform( mPointSpriteLoc, 0 ); + + cGL::Disable( GL_VERTEX_PROGRAM_POINT_SIZE ); + + break; + } + } + + cGL::Disable( cap ); +} + void cRendererGL3::PlaneStateCheck( bool tryEnable ) { GLint i; @@ -439,11 +433,11 @@ void cRendererGL3::MatrixMode(GLenum mode) { } void cRendererGL3::EnableClientState( GLenum array ) { - glEnableVertexAttribArray( array - GL_VERTEX_ARRAY ); + glEnableVertexAttribArray( mStates[ array - GL_VERTEX_ARRAY ] ); } void cRendererGL3::DisableClientState( GLenum array ) { - glDisableVertexAttribArray( array - GL_VERTEX_ARRAY ); + glDisableVertexAttribArray( mStates[ array - GL_VERTEX_ARRAY ] ); } void cRendererGL3::VertexPointer ( GLint size, GLenum type, GLsizei stride, const GLvoid * pointer, GLuint allocate ) { @@ -581,6 +575,12 @@ GLfloat cRendererGL3::PointSize() { return mPointSize; } +void cRendererGL3::BindGlobalVAO() { + #ifndef EE_GLES2 + glBindVertexArray( mVAO ); + #endif +} + void cRendererGL3::ClientActiveTexture( GLenum texture ) { /// TODO: Implement multitexturing in GL3 renderer } diff --git a/src/graphics/renderer/crenderergl3.hpp b/src/graphics/renderer/crenderergl3.hpp index e35df1ed3..e8fbc3950 100644 --- a/src/graphics/renderer/crenderergl3.hpp +++ b/src/graphics/renderer/crenderergl3.hpp @@ -101,6 +101,8 @@ class cRendererGL3 : public cGL { void fromGLMmat4( glm::mat4 from, GLfloat * to ); GLenum GetCurrentMatrixMode(); + + void BindGlobalVAO(); protected: std::stack mProjectionMatrix; // cpu-side GLint mProjectionMatrix_id; // cpu-side hook to shader uniform diff --git a/src/helper/haikuttf/hkbase.hpp b/src/helper/haikuttf/hkbase.hpp index 50da18bf4..74bc86ca7 100644 --- a/src/helper/haikuttf/hkbase.hpp +++ b/src/helper/haikuttf/hkbase.hpp @@ -73,18 +73,6 @@ typedef SOPHIST_uint32 u32; #define HK_TTF_STYLE_NO_GLYPH_CHANGE ( HK_TTF_STYLE_UNDERLINE | HK_TTF_STYLE_STRIKETHROUGH ) -/** Disable this until implement support for multi-threaded memory manager -#ifdef EE_DEBUG -#include "../../base/memorymanager.hpp" -#define hkNew eeNew -#define hkNewArray eeNewArray -#define hkMalloc eeMalloc -#define hkDelete eeDelete -#define hkDeleteArray eeDeleteArray -#define hkFree eeFree -#endif -*/ - #ifndef hkNew #define hkNew( classType, constructor ) new classType constructor #endif diff --git a/src/physics/constraints/cdampedspring.cpp b/src/physics/constraints/cdampedspring.cpp index 23f4288ac..5fa06a1b1 100644 --- a/src/physics/constraints/cdampedspring.cpp +++ b/src/physics/constraints/cdampedspring.cpp @@ -100,6 +100,9 @@ void cDampedSpring::Draw() { GLi->DrawArrays( GL_LINE_STRIP, 0, springVAR_count ); GLi->PopMatrix(); + + GLi->Enable( GL_TEXTURE_2D ); + GLi->EnableClientState( GL_TEXTURE_COORD_ARRAY ); #endif } diff --git a/src/physics/cshapepoly.cpp b/src/physics/cshapepoly.cpp index 71406547b..010c5562a 100644 --- a/src/physics/cshapepoly.cpp +++ b/src/physics/cshapepoly.cpp @@ -62,25 +62,32 @@ void cShapePoly::Draw( cSpace * space ) { eeColorA Col = ColorForShape( (cpShape *)poly, space->Space() ); - // Could be a triangle fan - BR->PointsBegin(); - BR->PolygonSetColor( Col ); - if( !poly->CP_PRIVATE(shape).sensor ){ - for ( int i = 0; i < poly->CP_PRIVATE(numVerts); i++ ) { - BR->BatchPolygonByPoint( poly->CP_PRIVATE(tVerts)[i].x, poly->CP_PRIVATE(tVerts)[i].y ); + if ( 4 != poly->CP_PRIVATE(numVerts) ) { + BR->PointsBegin(); + BR->PolygonSetColor( Col ); + + for ( int i = 0; i < poly->CP_PRIVATE(numVerts); i++ ) { + BR->BatchPolygonByPoint( poly->CP_PRIVATE(tVerts)[i].x, poly->CP_PRIVATE(tVerts)[i].y ); + } + } else { + BR->QuadsBegin(); + BR->QuadsSetColor( Col ); + + BR->BatchQuadFreeEx(poly->CP_PRIVATE(tVerts)[0].x, poly->CP_PRIVATE(tVerts)[0].y, poly->CP_PRIVATE(tVerts)[1].x, poly->CP_PRIVATE(tVerts)[1].y, poly->CP_PRIVATE(tVerts)[2].x, poly->CP_PRIVATE(tVerts)[2].y, poly->CP_PRIVATE(tVerts)[3].x, poly->CP_PRIVATE(tVerts)[3].y ); } - BR->Draw(); + BR->DrawOpt(); } + BR->LineLoopBegin(); BR->LineLoopSetColor( Col ); for ( int i = 0; i < poly->CP_PRIVATE(numVerts); i++ ) { BR->BatchLineLoop( poly->CP_PRIVATE(tVerts)[i].x, poly->CP_PRIVATE(tVerts)[i].y ); } - BR->Draw(); + BR->DrawOpt(); #endif } diff --git a/src/physics/cshapesegment.cpp b/src/physics/cshapesegment.cpp index 63f0c6cb2..d0b3377b6 100644 --- a/src/physics/cshapesegment.cpp +++ b/src/physics/cshapesegment.cpp @@ -100,8 +100,8 @@ void cShapeSegment::Draw( cSpace * space ) { GLi->PopMatrix(); - GLi->EnableClientState( GL_TEXTURE_COORD_ARRAY ); GLi->Enable( GL_TEXTURE_2D ); + GLi->EnableClientState( GL_TEXTURE_COORD_ARRAY ); } else { cPrimitives p; p.DrawLine( eeVector2f( a.x, a.y ), eeVector2f( b.x, b.y ) ); diff --git a/src/test/ee.cpp b/src/test/ee.cpp index d45b039dd..ba0338370 100644 --- a/src/test/ee.cpp +++ b/src/test/ee.cpp @@ -1,12 +1,5 @@ #include "../ee.h" -/** -@TODO Add some Surface Grid class, to create special effects ( waved texture, and stuff like that ). -@TODO Add Scripting support ( lua or squirrel ). -@TODO Encapsulate SDL and OpenGL ( and remove unnecessary dependencies ). -@TODO Support color cursors ( not only black and white cursors, that really sucks ) - Imposible with SDL 1.2 -*/ - class cUITest : public cUIControlAnim { public: cUITest( cUIControlAnim::CreateParams& Params ) : cUIControlAnim( Params ) { mOldColor = mBackground->Colors(); } @@ -1177,7 +1170,7 @@ void cEETest::Screen2() { scale = (!side) ? scale+et * 0.00025f : scale-et * 0.00025f; if ( mUseShaders ) { - mBlurFactor = scale * 0.01f; + mBlurFactor = ( 1.5f * 0.01f ) - ( scale * 0.01f ); mShaderProgram->Bind(); mShaderProgram->SetUniform( "blurfactor" , mBlurFactor ); } @@ -1754,7 +1747,8 @@ void cEETest::Demo1Create() { body = mSpace->AddBody( cBody::New( 1.0f, Moment::ForBox( 1.0f, 30.0f, 30.0f ) ) ); body->Pos( cVectNew( hw + j * 32 - i * 16, 100 + i * 32 ) ); - shape = mSpace->AddShape( cShapePolySprite::New( body, 30.f, 30.f, mBoxSprite ) ); + //shape = mSpace->AddShape( cShapePolySprite::New( body, 30.f, 30.f, mBoxSprite ) ); + shape = mSpace->AddShape( cShapePoly::New( body, 30.f, 30.f ) ); shape->e( 0.0f ); shape->u( 0.8f ); } @@ -1765,7 +1759,8 @@ void cEETest::Demo1Create() { body = mSpace->AddBody( cBody::New( 10.0f, Moment::ForCircle( 10.0f, 0.0f, radius, cVectZero ) ) ); body->Pos( cVectNew( hw, EE->GetHeight() - radius - 5 ) ); - shape = mSpace->AddShape( cShapeCircleSprite::New( body, radius, cVectZero, mCircleSprite ) ); + //shape = mSpace->AddShape( cShapeCircleSprite::New( body, radius, cVectZero, mCircleSprite ) ); + shape = mSpace->AddShape( cShapeCircle::New( body, radius, cVectZero ) ); shape->e( 0.0f ); shape->u( 0.9f ); } diff --git a/src/ui/cuidragable.cpp b/src/ui/cuidragable.cpp index c0de97fc4..4ce5e5723 100644 --- a/src/ui/cuidragable.cpp +++ b/src/ui/cuidragable.cpp @@ -48,7 +48,7 @@ void cUIDragable::Update() { return; if ( Dragging() ) { - if ( !( cInput::instance()->PressTrigger() & mDragButton ) ) { + if ( !( cUIManager::instance()->PressTrigger() & mDragButton ) ) { Dragging( false ); return; } diff --git a/src/ui/cuieventkey.cpp b/src/ui/cuieventkey.cpp index 3e5c2d5c8..c470174ae 100644 --- a/src/ui/cuieventkey.cpp +++ b/src/ui/cuieventkey.cpp @@ -3,10 +3,11 @@ namespace EE { namespace UI { -cUIEventKey::cUIEventKey( cUIControl * Ctrl, const Uint32& EventNum, const Uint32& KeyCode, const Uint16& Char ) : +cUIEventKey::cUIEventKey( cUIControl * Ctrl, const Uint32& EventNum, const Uint32& KeyCode, const Uint16& Char, const Uint32& Mod ) : cUIEvent( Ctrl, EventNum ), mKeyCode( KeyCode ), - mChar( Char ) + mChar( Char ), + mMod( Mod ) { } @@ -22,4 +23,8 @@ const Uint16& cUIEventKey::Char() const { return mChar; } +const Uint32& cUIEventKey::Mod() const { + return mMod; +} + }} diff --git a/src/ui/cuieventkey.hpp b/src/ui/cuieventkey.hpp index 9c2007e7e..02ae50c45 100644 --- a/src/ui/cuieventkey.hpp +++ b/src/ui/cuieventkey.hpp @@ -10,16 +10,19 @@ class cUIControl; class EE_API cUIEventKey : public cUIEvent { public: - cUIEventKey( cUIControl * Ctrl, const Uint32& EventNum, const Uint32& KeyCode, const Uint16& Char ); + cUIEventKey( cUIControl * Ctrl, const Uint32& EventNum, const Uint32& KeyCode, const Uint16& Char, const Uint32& Mod ); ~cUIEventKey(); const Uint32& KeyCode() const; const Uint16& Char() const; + + const Uint32& Mod() const; protected: Uint32 mKeyCode; Uint16 mChar; + Uint32 mMod; }; }} diff --git a/src/ui/cuilistbox.cpp b/src/ui/cuilistbox.cpp index f2b3f0880..532ee7b85 100644 --- a/src/ui/cuilistbox.cpp +++ b/src/ui/cuilistbox.cpp @@ -548,7 +548,7 @@ void cUIListBox::UpdateScroll( bool FromScrollChange ) { } void cUIListBox::ItemKeyEvent( const cUIEventKey &Event ) { - cUIEventKey ItemEvent( Event.Ctrl(), cUIEvent::EventOnItemKeyDown, Event.KeyCode(), Event.Char() ); + cUIEventKey ItemEvent( Event.Ctrl(), cUIEvent::EventOnItemKeyDown, Event.KeyCode(), Event.Char(), Event.Mod() ); SendEvent( &ItemEvent ); } diff --git a/src/ui/cuimanager.cpp b/src/ui/cuimanager.cpp index cbf5617d9..c18f19e58 100644 --- a/src/ui/cuimanager.cpp +++ b/src/ui/cuimanager.cpp @@ -54,10 +54,10 @@ void cUIManager::Shutdown() { void cUIManager::InputCallback( EE_Event * Event ) { switch( Event->type ) { case SDL_KEYUP: - SendKeyUp( Event ); + SendKeyUp( Event->key.keysym.sym, Event->key.keysym.unicode, Event->key.keysym.mod ); break; case SDL_KEYDOWN: - SendKeyDown( Event ); + SendKeyDown( Event->key.keysym.sym, Event->key.keysym.unicode, Event->key.keysym.mod ); break; } } @@ -67,8 +67,8 @@ void cUIManager::ResizeControl() { SendMsg( mControl, cUIMessage::MsgWindowResize ); } -void cUIManager::SendKeyUp( EE_Event * Event ) { - cUIEventKey KeyEvent = cUIEventKey( mFocusControl, cUIEvent::EventKeyUp, Event->key.keysym.sym, Event->key.keysym.unicode ); +void cUIManager::SendKeyUp( const Uint32& KeyCode, const Uint16& Char, const Uint32& Mod ) { + cUIEventKey KeyEvent = cUIEventKey( mFocusControl, cUIEvent::EventKeyUp, KeyCode, Char, Mod ); cUIControl * CtrlLoop = mFocusControl; while( NULL != CtrlLoop ) { @@ -79,8 +79,8 @@ void cUIManager::SendKeyUp( EE_Event * Event ) { } } -void cUIManager::SendKeyDown( EE_Event * Event ) { - cUIEventKey KeyEvent = cUIEventKey( mFocusControl, cUIEvent::EventKeyDown, Event->key.keysym.sym, Event->key.keysym.unicode ); +void cUIManager::SendKeyDown( const Uint32& KeyCode, const Uint16& Char, const Uint32& Mod ) { + cUIEventKey KeyEvent = cUIEventKey( mFocusControl, cUIEvent::EventKeyDown, KeyCode, Char, Mod ); cUIControl * CtrlLoop = mFocusControl; while( NULL != CtrlLoop ) { diff --git a/src/ui/cuimanager.hpp b/src/ui/cuimanager.hpp index f4e9a3245..cd44d6f62 100644 --- a/src/ui/cuimanager.hpp +++ b/src/ui/cuimanager.hpp @@ -51,6 +51,10 @@ class EE_API cUIManager : public tSingleton { void ClipEnable( const Int32& x, const Int32& y, const Uint32& Width, const Uint32& Height ); void ClipDisable(); + + void SendKeyUp( const Uint32& KeyCode, const Uint16& Char, const Uint32& Mod ); + + void SendKeyDown( const Uint32& KeyCode, const Uint16& Char, const Uint32& Mod ); protected: cInput * mKM; @@ -64,8 +68,6 @@ class EE_API cUIManager : public tSingleton { Int32 mCbId; void InputCallback( EE_Event * Event ); - void SendKeyUp( EE_Event * Event ); - void SendKeyDown( EE_Event * Event ); }; }} diff --git a/src/window/cengine.cpp b/src/window/cengine.cpp index b491cfb60..7a571312c 100755 --- a/src/window/cengine.cpp +++ b/src/window/cengine.cpp @@ -19,12 +19,12 @@ using namespace EE::Graphics; using namespace EE::Graphics::Private; #define T(A, B, C, D) (int)((A<<24)|(B<<16)|(C<<8)|(D<<0)) -#define FORMAT_PREFIX "SDL_scrap_0x" +#define FORMAT_PREFIX "EE_scrap_0x" namespace EE { namespace Window { #if EE_PLATFORM == EE_PLATFORM_LINUX -static int clipboard_filter(const SDL_Event *event) { +static int clipboard_filter( const SDL_Event *event ) { /* Post all non-window manager specific events */ if ( event->type != SDL_SYSWMEVENT ) { return(1); @@ -270,7 +270,7 @@ void cEngine::Setup2D( const bool& KeepView ) { SetLineSmooth( mVideoInfo.LineSmooth ); - GLi->Enable( GL_TEXTURE_2D ); // Enable Textures + GLi->Enable ( GL_TEXTURE_2D ); // Enable Textures GLi->Disable( GL_DEPTH_TEST ); GLi->Disable( GL_LIGHTING ); @@ -909,7 +909,7 @@ void cEngine::clipboard_get_scrap(int type, int *dstlen, char **dst) { owner = mVideoInfo.info.info.x11.wmwindow; mVideoInfo.info.info.x11.lock_func(); - selection = XInternAtom( mVideoInfo.info.info.x11.display, "SDL_SELECTION", False); + selection = XInternAtom( mVideoInfo.info.info.x11.display, "SELECTION", False); XConvertSelection( mVideoInfo.info.info.x11.display, XA_PRIMARY, format, selection, owner, CurrentTime); mVideoInfo.info.info.x11.unlock_func(); diff --git a/src/window/cinput.cpp b/src/window/cinput.cpp index 5362522fd..06caa7e0f 100644 --- a/src/window/cinput.cpp +++ b/src/window/cinput.cpp @@ -4,91 +4,6 @@ namespace EE { namespace Window { -Int32 convertKeyCharacter( EE_Event* event ) { - SDL_keysym keysym = event->key.keysym; - - Int32 value = 0; - - if ( keysym.unicode < 255 ) - value = (Int32)keysym.unicode; - - if ( isCharacter(value) ) - return value; - - switch (keysym.sym) { - case KEY_TAB: value = KEY_TAB; break; - case KEY_LALT: value = KEY_LALT; break; - case KEY_RALT: value = KEY_RALT; break; - case KEY_LSHIFT: value = KEY_LSHIFT; break; - case KEY_RSHIFT: value = KEY_RSHIFT; break; - case KEY_LCTRL: value = KEY_RSHIFT; break; - case KEY_RCTRL: value = KEY_LCTRL; break; - case KEY_BACKSPACE: value = KEY_BACKSPACE; break; - case KEY_PAUSE: value = KEY_PAUSE; break; - case KEY_SPACE: - // Special characters like ~ (tilde) ends up with the keysym.sym KEY_SPACE which - // without this check would be lost. The check is only valid on key down events in SDL. - if (event->type == SDL_KEYUP || keysym.unicode == ' ') - value = KEY_SPACE; - break; - case KEY_ESCAPE: value = KEY_ESCAPE; break; - case KEY_DELETE: value = KEY_DELETE; break; - case KEY_INSERT: value = KEY_INSERT; break; - case KEY_HOME: value = KEY_HOME; break; - case KEY_END: value = KEY_END; break; - case KEY_PAGEUP: value = KEY_PAGEUP; break; - case KEY_PRINT: value = KEY_PRINT; break; - case KEY_PAGEDOWN: value = KEY_PAGEDOWN; break; - case KEY_F1: value = KEY_F1; break; - case KEY_F2: value = KEY_F2; break; - case KEY_F3: value = KEY_F3; break; - case KEY_F4: value = KEY_F4; break; - case KEY_F5: value = KEY_F5; break; - case KEY_F6: value = KEY_F6; break; - case KEY_F7: value = KEY_F7; break; - case KEY_F8: value = KEY_F8; break; - case KEY_F9: value = KEY_F9; break; - case KEY_F10: value = KEY_F10; break; - case KEY_F11: value = KEY_F11; break; - case KEY_F12: value = KEY_F12; break; - case KEY_F13: value = KEY_F13; break; - case KEY_F14: value = KEY_F14; break; - case KEY_F15: value = KEY_F15; break; - case KEY_NUMLOCK: value = KEY_NUMLOCK; break; - case KEY_CAPSLOCK: value = KEY_CAPSLOCK; break; - case KEY_SCROLLOCK: value = KEY_SCROLLOCK; break; - case KEY_RMETA: value = KEY_RMETA; break; - case KEY_LMETA: value = KEY_LMETA; break; - case KEY_LSUPER: value = KEY_LSUPER; break; - case KEY_RSUPER: value = KEY_RSUPER; break; - case KEY_MODE: value = KEY_MODE; break; - case KEY_UP: value = KEY_UP; break; - case KEY_DOWN: value = KEY_DOWN; break; - case KEY_LEFT: value = KEY_LEFT; break; - case KEY_RIGHT: value = KEY_RIGHT; break; - case KEY_RETURN: value = KEY_RETURN; break; - case KEY_KP_ENTER: value = KEY_KP_ENTER; break; - default: break; - } - - if (! (keysym.mod & KMOD_NUM) ) { - switch (keysym.sym) { - case KEY_KP0: value = KEY_INSERT; break; - case KEY_KP1: value = KEY_END; break; - case KEY_KP2: value = KEY_DOWN; break; - case KEY_KP3: value = KEY_PAGEDOWN; break; - case KEY_KP4: value = KEY_LEFT; break; - case KEY_KP5: value = 0; break; - case KEY_KP6: value = KEY_RIGHT; break; - case KEY_KP7: value = KEY_HOME; break; - case KEY_KP8: value = KEY_UP; break; - case KEY_KP9: value = KEY_PAGEUP; break; - default: break; - } - } - return value; -} - cInput::cInput() : mPressTrigger(0), mReleaseTrigger(0), mLastPressTrigger(0), mClickTrigger(0), mDoubleClickTrigger(0), mInputMod(0), mDoubleClickInterval(500), @@ -126,8 +41,8 @@ void cInput::Update() { mDoubleClickTrigger = 0; mInputMod = 0; - while ( SDL_PollEvent(&mEvent) ) { - switch(mEvent.type) { + while ( SDL_PollEvent( &mEvent ) ) { + switch( mEvent.type ) { case SDL_KEYDOWN: mInputMod = mEvent.key.keysym.mod; @@ -345,19 +260,19 @@ void cInput::InjectMousePos( const eeVector2i& Pos ) { } bool cInput::ControlPressed() const { - return ( mInputMod & KMOD_CTRL ) != 0; + return ( mInputMod & KEYMOD_CTRL ) != 0; } bool cInput::ShiftPressed() const { - return ( mInputMod & KMOD_SHIFT ) != 0; + return ( mInputMod & KEYMOD_SHIFT ) != 0; } bool cInput::AltPressed() const { - return ( mInputMod & KMOD_ALT ) != 0; + return ( mInputMod & KEYMOD_ALT ) != 0; } bool cInput::MetaPressed() const { - return ( mInputMod & KMOD_META ) != 0; + return ( mInputMod & KEYMOD_META ) != 0; } bool cInput::MouseLeftPressed() const { diff --git a/src/window/cinputtextbuffer.cpp b/src/window/cinputtextbuffer.cpp index 88c548433..64b995a8e 100755 --- a/src/window/cinputtextbuffer.cpp +++ b/src/window/cinputtextbuffer.cpp @@ -53,15 +53,16 @@ void cInputTextBuffer::Start() { void cInputTextBuffer::Update( EE_Event* Event ) { if ( Active() ) { ChangedSinceLastUpdate( false ); - Int32 c = convertKeyCharacter( Event ); + Int32 c = eeConvertKeyCharacter( Event->key.keysym.sym, Event->key.keysym.unicode, Event->key.keysym.mod ); if ( SupportFreeEditing() ) { switch ( Event->type ) { case SDL_KEYDOWN: + { if ( cInput::instance()->ShiftPressed() || cInput::instance()->ControlPressed() ) { if ( !AllowOnlyNumbers() && - ( ( ( Event->key.keysym.mod & KMOD_SHIFT ) && Event->key.keysym.sym == SDLK_INSERT ) || - ( ( Event->key.keysym.mod & KMOD_CTRL ) && Event->key.keysym.sym == SDLK_v ) ) + ( ( ( Event->key.keysym.mod & KEYMOD_SHIFT ) && c == KEY_INSERT ) || + ( ( Event->key.keysym.mod & KEYMOD_CTRL ) && Event->key.keysym.sym == SDLK_v ) ) ) { std::wstring txt = cEngine::instance()->GetClipboardTextWStr(); @@ -120,7 +121,7 @@ void cInputTextBuffer::Update( EE_Event* Event ) { if ( mEnterCall.IsSet() ) mEnterCall(); - } else if ( c == KEY_LEFT ) { + } else if ( c == KEY_LEFT ) { if ( ( mPromptPos - 1 ) >= 0 ) { mPromptPos--; AutoPrompt( false ); @@ -168,9 +169,11 @@ void cInputTextBuffer::Update( EE_Event* Event ) { } break; + } case SDL_KEYUP: + { if ( SupportNewLine() ) { - if ( Event->key.keysym.sym == SDLK_END ) { + if ( c == KEY_END ) { for ( Uint32 i = mPromptPos; i < mText.size(); i++ ) { if ( mText[i] == L'\n' ) { mPromptPos = i; @@ -185,7 +188,7 @@ void cInputTextBuffer::Update( EE_Event* Event ) { } } - if ( Event->key.keysym.sym == SDLK_HOME ) { + if ( c == KEY_HOME ) { if ( 0 != mPromptPos ) { for ( Int32 i = (Int32)mPromptPos - 1; i >= 0; i-- ) { if ( i >= 0 ) { @@ -204,16 +207,17 @@ void cInputTextBuffer::Update( EE_Event* Event ) { } } } else { - if ( Event->key.keysym.sym == SDLK_END ) { + if ( c == KEY_END ) { AutoPrompt( true ); } - if ( Event->key.keysym.sym == SDLK_HOME ) { + if ( c == KEY_HOME ) { mPromptPos = 0; AutoPrompt(false); } } break; + } } } else { if ( Event->type == SDL_KEYDOWN ) { diff --git a/src/window/inputhelper.cpp b/src/window/inputhelper.cpp new file mode 100644 index 000000000..2e87ec1a2 --- /dev/null +++ b/src/window/inputhelper.cpp @@ -0,0 +1,86 @@ +#include "inputhelper.hpp" + +namespace EE { namespace Window { + +Uint32 eeConvertKeyCharacter( const Uint32& KeyCode, const Uint16& Unicode, const Uint32& Modifiers ) { + Uint32 value = 0; + + if ( Unicode < 255 ) { + value = Unicode; + } + + if ( isCharacter( value ) ) { + return value; + } + + switch ( KeyCode ) { + case KEY_TAB: value = KEY_TAB; break; + case KEY_LALT: value = KEY_LALT; break; + case KEY_RALT: value = KEY_RALT; break; + case KEY_LSHIFT: value = KEY_LSHIFT; break; + case KEY_RSHIFT: value = KEY_RSHIFT; break; + case KEY_LCTRL: value = KEY_RSHIFT; break; + case KEY_RCTRL: value = KEY_LCTRL; break; + case KEY_BACKSPACE: value = KEY_BACKSPACE; break; + case KEY_PAUSE: value = KEY_PAUSE; break; + case KEY_SPACE: value = KEY_SPACE; break; + case KEY_ESCAPE: value = KEY_ESCAPE; break; + case KEY_DELETE: value = KEY_DELETE; break; + case KEY_INSERT: value = KEY_INSERT; break; + case KEY_HOME: value = KEY_HOME; break; + case KEY_END: value = KEY_END; break; + case KEY_PAGEUP: value = KEY_PAGEUP; break; + case KEY_PRINT: value = KEY_PRINT; break; + case KEY_PAGEDOWN: value = KEY_PAGEDOWN; break; + case KEY_F1: value = KEY_F1; break; + case KEY_F2: value = KEY_F2; break; + case KEY_F3: value = KEY_F3; break; + case KEY_F4: value = KEY_F4; break; + case KEY_F5: value = KEY_F5; break; + case KEY_F6: value = KEY_F6; break; + case KEY_F7: value = KEY_F7; break; + case KEY_F8: value = KEY_F8; break; + case KEY_F9: value = KEY_F9; break; + case KEY_F10: value = KEY_F10; break; + case KEY_F11: value = KEY_F11; break; + case KEY_F12: value = KEY_F12; break; + case KEY_F13: value = KEY_F13; break; + case KEY_F14: value = KEY_F14; break; + case KEY_F15: value = KEY_F15; break; + case KEY_NUMLOCK: value = KEY_NUMLOCK; break; + case KEY_CAPSLOCK: value = KEY_CAPSLOCK; break; + case KEY_SCROLLOCK: value = KEY_SCROLLOCK; break; + case KEY_RMETA: value = KEY_RMETA; break; + case KEY_LMETA: value = KEY_LMETA; break; + case KEY_LSUPER: value = KEY_LSUPER; break; + case KEY_RSUPER: value = KEY_RSUPER; break; + case KEY_MODE: value = KEY_MODE; break; + case KEY_UP: value = KEY_UP; break; + case KEY_DOWN: value = KEY_DOWN; break; + case KEY_LEFT: value = KEY_LEFT; break; + case KEY_RIGHT: value = KEY_RIGHT; break; + case KEY_RETURN: value = KEY_RETURN; break; + case KEY_KP_ENTER: value = KEY_KP_ENTER; break; + default: break; + } + + if ( !( Modifiers & KEYMOD_NUM ) ) { + switch ( KeyCode ) { + case KEY_KP0: value = KEY_INSERT; break; + case KEY_KP1: value = KEY_END; break; + case KEY_KP2: value = KEY_DOWN; break; + case KEY_KP3: value = KEY_PAGEDOWN; break; + case KEY_KP4: value = KEY_LEFT; break; + case KEY_KP5: value = 0; break; + case KEY_KP6: value = KEY_RIGHT; break; + case KEY_KP7: value = KEY_HOME; break; + case KEY_KP8: value = KEY_UP; break; + case KEY_KP9: value = KEY_PAGEUP; break; + default: break; + } + } + + return value; +} + +}} diff --git a/src/window/inputhelper.hpp b/src/window/inputhelper.hpp index 3c026dea6..005941d22 100644 --- a/src/window/inputhelper.hpp +++ b/src/window/inputhelper.hpp @@ -1,6 +1,9 @@ #ifndef EE_INPUT_HELPER_HPP #define EE_INPUT_HELPER_HPP +#include "../base.hpp" +#include "base.hpp" + namespace EE { namespace Window { #define EE_BUTTON(X) ( 1 << ( ( X ) - 1 ) ) @@ -28,263 +31,284 @@ namespace EE { namespace Window { /** EE_Event is just an SDL_Event */ typedef SDL_Event EE_Event; -int EE_API convertKeyCharacter(EE_Event* event); +Uint32 EE_API eeConvertKeyCharacter( const Uint32& KeyCode, const Uint16& Unicode, const Uint32& Modifiers ); /** @enum EE_KEY Enum of keyboard keys. */ enum EE_KEY { - KEY_UNKNOWN= SDLK_UNKNOWN, - KEY_FIRST= SDLK_FIRST, - KEY_BACKSPACE= SDLK_BACKSPACE, - KEY_TAB= SDLK_TAB, - KEY_CLEAR= SDLK_CLEAR, - KEY_RETURN= SDLK_RETURN, - KEY_PAUSE= SDLK_PAUSE, - KEY_ESCAPE= SDLK_ESCAPE, - KEY_SPACE= SDLK_SPACE, - KEY_EXCLAIM= SDLK_EXCLAIM, - KEY_QUOTEDBL= SDLK_QUOTEDBL, - KEY_HASH= SDLK_HASH, - KEY_DOLLAR= SDLK_DOLLAR, - KEY_AMPERSAND= SDLK_AMPERSAND, - KEY_QUOTE= SDLK_QUOTE, - KEY_LEFTPAREN= SDLK_LEFTPAREN, - KEY_RIGHTPAREN= SDLK_RIGHTPAREN, - KEY_ASTERISK= SDLK_ASTERISK, - KEY_PLUS= SDLK_PLUS, - KEY_COMMA= SDLK_COMMA, - KEY_MINUS= SDLK_MINUS, - KEY_PERIOD= SDLK_PERIOD, - KEY_SLASH= SDLK_SLASH, - KEY_0= SDLK_0, - KEY_1= SDLK_1, - KEY_2= SDLK_2, - KEY_3= SDLK_3, - KEY_4= SDLK_4, - KEY_5= SDLK_5, - KEY_6= SDLK_6, - KEY_7= SDLK_7, - KEY_8= SDLK_8, - KEY_9= SDLK_9, - KEY_COLON= SDLK_COLON, - KEY_SEMICOLON= SDLK_SEMICOLON, - KEY_LESS= SDLK_LESS, - KEY_EQUALS= SDLK_EQUALS, - KEY_GREATER= SDLK_GREATER, - KEY_QUESTION= SDLK_QUESTION, - KEY_AT= SDLK_AT, + KEY_UNKNOWN = SDLK_UNKNOWN, + KEY_FIRST = SDLK_FIRST, + KEY_BACKSPACE = SDLK_BACKSPACE, + KEY_TAB = SDLK_TAB, + KEY_CLEAR = SDLK_CLEAR, + KEY_RETURN = SDLK_RETURN, + KEY_PAUSE = SDLK_PAUSE, + KEY_ESCAPE = SDLK_ESCAPE, + KEY_SPACE = SDLK_SPACE, + KEY_EXCLAIM = SDLK_EXCLAIM, + KEY_QUOTEDBL = SDLK_QUOTEDBL, + KEY_HASH = SDLK_HASH, + KEY_DOLLAR = SDLK_DOLLAR, + KEY_AMPERSAND = SDLK_AMPERSAND, + KEY_QUOTE = SDLK_QUOTE, + KEY_LEFTPAREN = SDLK_LEFTPAREN, + KEY_RIGHTPAREN = SDLK_RIGHTPAREN, + KEY_ASTERISK = SDLK_ASTERISK, + KEY_PLUS = SDLK_PLUS, + KEY_COMMA = SDLK_COMMA, + KEY_MINUS = SDLK_MINUS, + KEY_PERIOD = SDLK_PERIOD, + KEY_SLASH = SDLK_SLASH, + KEY_0 = SDLK_0, + KEY_1 = SDLK_1, + KEY_2 = SDLK_2, + KEY_3 = SDLK_3, + KEY_4 = SDLK_4, + KEY_5 = SDLK_5, + KEY_6 = SDLK_6, + KEY_7 = SDLK_7, + KEY_8 = SDLK_8, + KEY_9 = SDLK_9, + KEY_COLON = SDLK_COLON, + KEY_SEMICOLON = SDLK_SEMICOLON, + KEY_LESS = SDLK_LESS, + KEY_EQUALS = SDLK_EQUALS, + KEY_GREATER = SDLK_GREATER, + KEY_QUESTION = SDLK_QUESTION, + KEY_AT = SDLK_AT, /* Skip uppercase letters */ - KEY_LEFTBRACKET= SDLK_LEFTBRACKET, - KEY_BACKSLASH= SDLK_BACKSLASH, - KEY_RIGHTBRACKET= SDLK_RIGHTBRACKET, - KEY_CARET= SDLK_CARET, - KEY_UNDERSCORE= SDLK_UNDERSCORE, - KEY_BACKQUOTE= SDLK_BACKQUOTE, ///< GRAVE - KEY_A= SDLK_a, - KEY_B= SDLK_b, - KEY_C= SDLK_c, - KEY_D= SDLK_d, - KEY_E= SDLK_e, - KEY_F= SDLK_f, - KEY_G= SDLK_g, - KEY_H= SDLK_h, - KEY_I= SDLK_i, - KEY_J= SDLK_j, - KEY_K= SDLK_k, - KEY_L= SDLK_l, - KEY_M= SDLK_m, - KEY_N= SDLK_n, - KEY_O= SDLK_o, - KEY_P= SDLK_p, - KEY_Q= SDLK_q, - KEY_R= SDLK_r, - KEY_S= SDLK_s, - KEY_T= SDLK_t, - KEY_U= SDLK_u, - KEY_V= SDLK_v, - KEY_W= SDLK_w, - KEY_X= SDLK_x, - KEY_Y= SDLK_y, - KEY_Z= SDLK_z, - KEY_DELETE= SDLK_DELETE, + KEY_LEFTBRACKET = SDLK_LEFTBRACKET, + KEY_BACKSLASH = SDLK_BACKSLASH, + KEY_RIGHTBRACKET = SDLK_RIGHTBRACKET, + KEY_CARET = SDLK_CARET, + KEY_UNDERSCORE = SDLK_UNDERSCORE, + KEY_BACKQUOTE = SDLK_BACKQUOTE, ///< GRAVE + KEY_A = SDLK_a, + KEY_B = SDLK_b, + KEY_C = SDLK_c, + KEY_D = SDLK_d, + KEY_E = SDLK_e, + KEY_F = SDLK_f, + KEY_G = SDLK_g, + KEY_H = SDLK_h, + KEY_I = SDLK_i, + KEY_J = SDLK_j, + KEY_K = SDLK_k, + KEY_L = SDLK_l, + KEY_M = SDLK_m, + KEY_N = SDLK_n, + KEY_O = SDLK_o, + KEY_P = SDLK_p, + KEY_Q = SDLK_q, + KEY_R = SDLK_r, + KEY_S = SDLK_s, + KEY_T = SDLK_t, + KEY_U = SDLK_u, + KEY_V = SDLK_v, + KEY_W = SDLK_w, + KEY_X = SDLK_x, + KEY_Y = SDLK_y, + KEY_Z = SDLK_z, + KEY_DELETE = SDLK_DELETE, /* End of ASCII mapped keysyms */ /* Numeric keypad */ - KEY_KP0= SDLK_KP0, - KEY_KP1= SDLK_KP1, - KEY_KP2= SDLK_KP2, - KEY_KP3= SDLK_KP3, - KEY_KP4= SDLK_KP4, - KEY_KP5= SDLK_KP5, - KEY_KP6= SDLK_KP6, - KEY_KP7= SDLK_KP7, - KEY_KP8= SDLK_KP8, - KEY_KP9= SDLK_KP9, - KEY_KP_PEROID= SDLK_KP_PERIOD, - KEY_KP_DIVIDE= SDLK_KP_DIVIDE, - KEY_KP_MULTIPLY= SDLK_KP_MULTIPLY, - KEY_KP_MINUS= SDLK_KP_MINUS, - KEY_KP_PLUS= SDLK_KP_PLUS, - KEY_KP_ENTER= SDLK_KP_ENTER, - KEY_KP_EQUALS= SDLK_KP_EQUALS, + KEY_KP0 = SDLK_KP0, + KEY_KP1 = SDLK_KP1, + KEY_KP2 = SDLK_KP2, + KEY_KP3 = SDLK_KP3, + KEY_KP4 = SDLK_KP4, + KEY_KP5 = SDLK_KP5, + KEY_KP6 = SDLK_KP6, + KEY_KP7 = SDLK_KP7, + KEY_KP8 = SDLK_KP8, + KEY_KP9 = SDLK_KP9, + KEY_KP_PEROID = SDLK_KP_PERIOD, + KEY_KP_DIVIDE = SDLK_KP_DIVIDE, + KEY_KP_MULTIPLY = SDLK_KP_MULTIPLY, + KEY_KP_MINUS = SDLK_KP_MINUS, + KEY_KP_PLUS = SDLK_KP_PLUS, + KEY_KP_ENTER = SDLK_KP_ENTER, + KEY_KP_EQUALS = SDLK_KP_EQUALS, /* Arrows + Home/End pad */ - KEY_UP= SDLK_UP, - KEY_DOWN= SDLK_DOWN, - KEY_RIGHT= SDLK_RIGHT, - KEY_LEFT= SDLK_LEFT, - KEY_INSERT= SDLK_INSERT, - KEY_HOME= SDLK_HOME, - KEY_END= SDLK_END, - KEY_PAGEUP= SDLK_PAGEUP, - KEY_PAGEDOWN= SDLK_PAGEDOWN, + KEY_UP = SDLK_UP, + KEY_DOWN = SDLK_DOWN, + KEY_RIGHT = SDLK_RIGHT, + KEY_LEFT = SDLK_LEFT, + KEY_INSERT = SDLK_INSERT, + KEY_HOME = SDLK_HOME, + KEY_END = SDLK_END, + KEY_PAGEUP = SDLK_PAGEUP, + KEY_PAGEDOWN = SDLK_PAGEDOWN, /* Function keys */ - KEY_F1= SDLK_F1, - KEY_F2= SDLK_F2, - KEY_F3= SDLK_F3, - KEY_F4= SDLK_F4, - KEY_F5= SDLK_F5, - KEY_F6= SDLK_F6, - KEY_F7= SDLK_F7, - KEY_F8= SDLK_F8, - KEY_F9= SDLK_F9, - KEY_F10= SDLK_F10, - KEY_F11= SDLK_F11, - KEY_F12= SDLK_F12, - KEY_F13= SDLK_F13, - KEY_F14= SDLK_F14, - KEY_F15= SDLK_F15, + KEY_F1 = SDLK_F1, + KEY_F2 = SDLK_F2, + KEY_F3 = SDLK_F3, + KEY_F4 = SDLK_F4, + KEY_F5 = SDLK_F5, + KEY_F6 = SDLK_F6, + KEY_F7 = SDLK_F7, + KEY_F8 = SDLK_F8, + KEY_F9 = SDLK_F9, + KEY_F10 = SDLK_F10, + KEY_F11 = SDLK_F11, + KEY_F12 = SDLK_F12, + KEY_F13 = SDLK_F13, + KEY_F14 = SDLK_F14, + KEY_F15 = SDLK_F15, /* Key state modifier keys */ - KEY_NUMLOCK= SDLK_NUMLOCK, - KEY_CAPSLOCK= SDLK_CAPSLOCK, - KEY_SCROLLOCK= SDLK_SCROLLOCK, - KEY_RSHIFT= SDLK_RSHIFT, - KEY_LSHIFT= SDLK_LSHIFT, - KEY_RCTRL= SDLK_RCTRL, - KEY_LCTRL= SDLK_LCTRL, - KEY_RALT= SDLK_RALT, - KEY_LALT= SDLK_LALT, - KEY_RMETA= SDLK_RMETA, - KEY_LMETA= SDLK_LMETA, - KEY_LSUPER= SDLK_LSUPER, ///< Left "Windows" key - KEY_RSUPER= SDLK_RSUPER, ///< Right "Windows" key + KEY_NUMLOCK = SDLK_NUMLOCK, + KEY_CAPSLOCK = SDLK_CAPSLOCK, + KEY_SCROLLOCK = SDLK_SCROLLOCK, + KEY_RSHIFT = SDLK_RSHIFT, + KEY_LSHIFT = SDLK_LSHIFT, + KEY_RCTRL = SDLK_RCTRL, + KEY_LCTRL = SDLK_LCTRL, + KEY_RALT = SDLK_RALT, + KEY_LALT = SDLK_LALT, + KEY_RMETA = SDLK_RMETA, + KEY_LMETA = SDLK_LMETA, + KEY_LSUPER = SDLK_LSUPER, ///< Left "Windows" key + KEY_RSUPER = SDLK_RSUPER, ///< Right "Windows" key /* Miscellaneous function keys */ - KEY_HELP= SDLK_HELP, - KEY_PRINT= SDLK_PRINT, - KEY_SYSREQ= SDLK_SYSREQ, - KEY_BREAK= SDLK_BREAK, - KEY_MENU= SDLK_MENU, - KEY_MODE= SDLK_MODE, ///< "Alt Gr" key - KEY_COMPOSE= SDLK_COMPOSE, ///< Multi-key compose key - KEY_POWER= SDLK_POWER, ///< Power Macintosh power key - KEY_EURO= SDLK_EURO, ///< Some european keyboards - KEY_UNDO= SDLK_UNDO, ///< Atari keyboard has Undo + KEY_HELP = SDLK_HELP, + KEY_PRINT = SDLK_PRINT, + KEY_SYSREQ = SDLK_SYSREQ, + KEY_BREAK = SDLK_BREAK, + KEY_MENU = SDLK_MENU, + KEY_MODE = SDLK_MODE, ///< "Alt Gr" key + KEY_COMPOSE = SDLK_COMPOSE, ///< Multi-key compose key + KEY_POWER = SDLK_POWER, ///< Power Macintosh power key + KEY_EURO = SDLK_EURO, ///< Some european keyboards + KEY_UNDO = SDLK_UNDO, ///< Atari keyboard has Undo /* International keyboard syms */ - KEY_WORLD_0= SDLK_WORLD_0, - KEY_WORLD_1= SDLK_WORLD_1, - KEY_WORLD_2= SDLK_WORLD_2, - KEY_WORLD_3= SDLK_WORLD_3, - KEY_WORLD_4= SDLK_WORLD_4, - KEY_WORLD_5= SDLK_WORLD_5, - KEY_WORLD_6= SDLK_WORLD_6, - KEY_WORLD_7= SDLK_WORLD_7, - KEY_WORLD_8= SDLK_WORLD_8, - KEY_WORLD_9= SDLK_WORLD_9, - KEY_WORLD_10= SDLK_WORLD_10, - KEY_WORLD_11= SDLK_WORLD_11, - KEY_WORLD_12= SDLK_WORLD_12, - KEY_WORLD_13= SDLK_WORLD_13, - KEY_WORLD_14= SDLK_WORLD_14, - KEY_WORLD_15= SDLK_WORLD_15, - KEY_WORLD_16= SDLK_WORLD_16, - KEY_WORLD_17= SDLK_WORLD_17, - KEY_WORLD_18= SDLK_WORLD_18, - KEY_WORLD_19= SDLK_WORLD_19, - KEY_WORLD_20= SDLK_WORLD_20, - KEY_WORLD_21= SDLK_WORLD_21, - KEY_WORLD_22= SDLK_WORLD_22, - KEY_WORLD_23= SDLK_WORLD_23, - KEY_WORLD_24= SDLK_WORLD_24, - KEY_WORLD_25= SDLK_WORLD_25, - KEY_WORLD_26= SDLK_WORLD_26, - KEY_WORLD_27= SDLK_WORLD_27, - KEY_WORLD_28= SDLK_WORLD_28, - KEY_WORLD_29= SDLK_WORLD_29, - KEY_WORLD_30= SDLK_WORLD_30, - KEY_WORLD_31= SDLK_WORLD_31, - KEY_WORLD_32= SDLK_WORLD_32, - KEY_WORLD_33= SDLK_WORLD_33, - KEY_WORLD_34= SDLK_WORLD_34, - KEY_WORLD_35= SDLK_WORLD_35, - KEY_WORLD_36= SDLK_WORLD_36, - KEY_WORLD_37= SDLK_WORLD_37, - KEY_WORLD_38= SDLK_WORLD_38, - KEY_WORLD_39= SDLK_WORLD_39, - KEY_WORLD_40= SDLK_WORLD_40, - KEY_WORLD_41= SDLK_WORLD_41, - KEY_WORLD_42= SDLK_WORLD_42, - KEY_WORLD_43= SDLK_WORLD_43, - KEY_WORLD_44= SDLK_WORLD_44, - KEY_WORLD_45= SDLK_WORLD_45, - KEY_WORLD_46= SDLK_WORLD_46, - KEY_WORLD_47= SDLK_WORLD_47, - KEY_WORLD_48= SDLK_WORLD_48, - KEY_WORLD_49= SDLK_WORLD_49, - KEY_WORLD_50= SDLK_WORLD_50, - KEY_WORLD_51= SDLK_WORLD_51, - KEY_WORLD_52= SDLK_WORLD_52, - KEY_WORLD_53= SDLK_WORLD_53, - KEY_WORLD_54= SDLK_WORLD_54, - KEY_WORLD_55= SDLK_WORLD_55, - KEY_WORLD_56= SDLK_WORLD_56, - KEY_WORLD_57= SDLK_WORLD_57, - KEY_WORLD_58= SDLK_WORLD_58, - KEY_WORLD_59= SDLK_WORLD_59, - KEY_WORLD_60= SDLK_WORLD_60, - KEY_WORLD_61= SDLK_WORLD_61, - KEY_WORLD_62= SDLK_WORLD_62, - KEY_WORLD_63= SDLK_WORLD_63, - KEY_WORLD_64= SDLK_WORLD_64, - KEY_WORLD_65= SDLK_WORLD_65, - KEY_WORLD_66= SDLK_WORLD_66, - KEY_WORLD_67= SDLK_WORLD_67, - KEY_WORLD_68= SDLK_WORLD_68, - KEY_WORLD_69= SDLK_WORLD_69, - KEY_WORLD_70= SDLK_WORLD_70, - KEY_WORLD_71= SDLK_WORLD_71, - KEY_WORLD_72= SDLK_WORLD_72, - KEY_WORLD_73= SDLK_WORLD_73, - KEY_WORLD_74= SDLK_WORLD_74, - KEY_WORLD_75= SDLK_WORLD_75, - KEY_WORLD_76= SDLK_WORLD_76, - KEY_WORLD_77= SDLK_WORLD_77, - KEY_WORLD_78= SDLK_WORLD_78, - KEY_WORLD_79= SDLK_WORLD_79, - KEY_WORLD_80= SDLK_WORLD_80, - KEY_WORLD_81= SDLK_WORLD_81, - KEY_WORLD_82= SDLK_WORLD_82, - KEY_WORLD_83= SDLK_WORLD_83, - KEY_WORLD_84= SDLK_WORLD_84, - KEY_WORLD_85= SDLK_WORLD_85, - KEY_WORLD_86= SDLK_WORLD_86, - KEY_WORLD_87= SDLK_WORLD_87, - KEY_WORLD_88= SDLK_WORLD_88, - KEY_WORLD_89= SDLK_WORLD_89, - KEY_WORLD_90= SDLK_WORLD_90, - KEY_WORLD_91= SDLK_WORLD_91, - KEY_WORLD_92= SDLK_WORLD_92, - KEY_WORLD_93= SDLK_WORLD_93, - KEY_WORLD_94= SDLK_WORLD_94, - KEY_WORLD_95= SDLK_WORLD_95 + KEY_WORLD_0 = SDLK_WORLD_0, + KEY_WORLD_1 = SDLK_WORLD_1, + KEY_WORLD_2 = SDLK_WORLD_2, + KEY_WORLD_3 = SDLK_WORLD_3, + KEY_WORLD_4 = SDLK_WORLD_4, + KEY_WORLD_5 = SDLK_WORLD_5, + KEY_WORLD_6 = SDLK_WORLD_6, + KEY_WORLD_7 = SDLK_WORLD_7, + KEY_WORLD_8 = SDLK_WORLD_8, + KEY_WORLD_9 = SDLK_WORLD_9, + KEY_WORLD_10 = SDLK_WORLD_10, + KEY_WORLD_11 = SDLK_WORLD_11, + KEY_WORLD_12 = SDLK_WORLD_12, + KEY_WORLD_13 = SDLK_WORLD_13, + KEY_WORLD_14 = SDLK_WORLD_14, + KEY_WORLD_15 = SDLK_WORLD_15, + KEY_WORLD_16 = SDLK_WORLD_16, + KEY_WORLD_17 = SDLK_WORLD_17, + KEY_WORLD_18 = SDLK_WORLD_18, + KEY_WORLD_19 = SDLK_WORLD_19, + KEY_WORLD_20 = SDLK_WORLD_20, + KEY_WORLD_21 = SDLK_WORLD_21, + KEY_WORLD_22 = SDLK_WORLD_22, + KEY_WORLD_23 = SDLK_WORLD_23, + KEY_WORLD_24 = SDLK_WORLD_24, + KEY_WORLD_25 = SDLK_WORLD_25, + KEY_WORLD_26 = SDLK_WORLD_26, + KEY_WORLD_27 = SDLK_WORLD_27, + KEY_WORLD_28 = SDLK_WORLD_28, + KEY_WORLD_29 = SDLK_WORLD_29, + KEY_WORLD_30 = SDLK_WORLD_30, + KEY_WORLD_31 = SDLK_WORLD_31, + KEY_WORLD_32 = SDLK_WORLD_32, + KEY_WORLD_33 = SDLK_WORLD_33, + KEY_WORLD_34 = SDLK_WORLD_34, + KEY_WORLD_35 = SDLK_WORLD_35, + KEY_WORLD_36 = SDLK_WORLD_36, + KEY_WORLD_37 = SDLK_WORLD_37, + KEY_WORLD_38 = SDLK_WORLD_38, + KEY_WORLD_39 = SDLK_WORLD_39, + KEY_WORLD_40 = SDLK_WORLD_40, + KEY_WORLD_41 = SDLK_WORLD_41, + KEY_WORLD_42 = SDLK_WORLD_42, + KEY_WORLD_43 = SDLK_WORLD_43, + KEY_WORLD_44 = SDLK_WORLD_44, + KEY_WORLD_45 = SDLK_WORLD_45, + KEY_WORLD_46 = SDLK_WORLD_46, + KEY_WORLD_47 = SDLK_WORLD_47, + KEY_WORLD_48 = SDLK_WORLD_48, + KEY_WORLD_49 = SDLK_WORLD_49, + KEY_WORLD_50 = SDLK_WORLD_50, + KEY_WORLD_51 = SDLK_WORLD_51, + KEY_WORLD_52 = SDLK_WORLD_52, + KEY_WORLD_53 = SDLK_WORLD_53, + KEY_WORLD_54 = SDLK_WORLD_54, + KEY_WORLD_55 = SDLK_WORLD_55, + KEY_WORLD_56 = SDLK_WORLD_56, + KEY_WORLD_57 = SDLK_WORLD_57, + KEY_WORLD_58 = SDLK_WORLD_58, + KEY_WORLD_59 = SDLK_WORLD_59, + KEY_WORLD_60 = SDLK_WORLD_60, + KEY_WORLD_61 = SDLK_WORLD_61, + KEY_WORLD_62 = SDLK_WORLD_62, + KEY_WORLD_63 = SDLK_WORLD_63, + KEY_WORLD_64 = SDLK_WORLD_64, + KEY_WORLD_65 = SDLK_WORLD_65, + KEY_WORLD_66 = SDLK_WORLD_66, + KEY_WORLD_67 = SDLK_WORLD_67, + KEY_WORLD_68 = SDLK_WORLD_68, + KEY_WORLD_69 = SDLK_WORLD_69, + KEY_WORLD_70 = SDLK_WORLD_70, + KEY_WORLD_71 = SDLK_WORLD_71, + KEY_WORLD_72 = SDLK_WORLD_72, + KEY_WORLD_73 = SDLK_WORLD_73, + KEY_WORLD_74 = SDLK_WORLD_74, + KEY_WORLD_75 = SDLK_WORLD_75, + KEY_WORLD_76 = SDLK_WORLD_76, + KEY_WORLD_77 = SDLK_WORLD_77, + KEY_WORLD_78 = SDLK_WORLD_78, + KEY_WORLD_79 = SDLK_WORLD_79, + KEY_WORLD_80 = SDLK_WORLD_80, + KEY_WORLD_81 = SDLK_WORLD_81, + KEY_WORLD_82 = SDLK_WORLD_82, + KEY_WORLD_83 = SDLK_WORLD_83, + KEY_WORLD_84 = SDLK_WORLD_84, + KEY_WORLD_85 = SDLK_WORLD_85, + KEY_WORLD_86 = SDLK_WORLD_86, + KEY_WORLD_87 = SDLK_WORLD_87, + KEY_WORLD_88 = SDLK_WORLD_88, + KEY_WORLD_89 = SDLK_WORLD_89, + KEY_WORLD_90 = SDLK_WORLD_90, + KEY_WORLD_91 = SDLK_WORLD_91, + KEY_WORLD_92 = SDLK_WORLD_92, + KEY_WORLD_93 = SDLK_WORLD_93, + KEY_WORLD_94 = SDLK_WORLD_94, + KEY_WORLD_95 = SDLK_WORLD_95 }; +enum EE_KEY_MOD { + KEYMOD_NONE = KMOD_NONE, + KEYMOD_LSHIFT = KMOD_LSHIFT, + KEYMOD_RSHIFT = KMOD_RSHIFT, + KEYMOD_LCTRL = KMOD_LCTRL, + KEYMOD_RCTRL = KMOD_RCTRL, + KEYMOD_LALT = KMOD_LALT, + KEYMOD_RALT = KMOD_RALT, + KEYMOD_LMETA = KMOD_LMETA, + KEYMOD_RMETA = KMOD_RMETA, + KEYMOD_NUM = KMOD_NUM, + KEYMOD_CAPS = KMOD_CAPS, + KEYMOD_MODE = KMOD_MODE, + KEYMOD_RESERVED = KMOD_RESERVED +}; + +#define KEYMOD_CTRL ( KEYMOD_LCTRL | KEYMOD_RCTRL ) +#define KEYMOD_SHIFT ( KEYMOD_LSHIFT | KEYMOD_RSHIFT ) +#define KEYMOD_ALT ( KEYMOD_LALT | KEYMOD_RALT ) +#define KEYMOD_META ( KEYMOD_LMETA | KEYMOD_RMETA ) + }} #endif