mirror of
https://github.com/love2d/love-android.git
synced 2026-08-19 04:05:22 +02:00
imported changes from love-0.9.2
This commit is contained in:
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest package="org.love2d.android"
|
<manifest package="org.love2d.android"
|
||||||
android:versionCode="14"
|
android:versionCode="14"
|
||||||
android:versionName="0.9.1b"
|
android:versionName="0.9.2"
|
||||||
android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android">
|
android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
luajit
|
||||||
|
lj_bcdef.h
|
||||||
|
lj_ffdef.h
|
||||||
|
lj_libdef.h
|
||||||
|
lj_recdef.h
|
||||||
|
lj_folddef.h
|
||||||
|
lj_vm.s
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
minilua
|
||||||
|
buildvm
|
||||||
|
buildvm_arch.h
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
vmdef.lua
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
@rem Script to build LuaJIT with the PS4 SDK.
|
||||||
|
@rem Donated to the public domain.
|
||||||
|
@rem
|
||||||
|
@rem Open a "Visual Studio .NET Command Prompt" (64 bit host compiler)
|
||||||
|
@rem Then cd to this directory and run this script.
|
||||||
|
|
||||||
|
@if not defined INCLUDE goto :FAIL
|
||||||
|
@if not defined SCE_ORBIS_SDK_DIR goto :FAIL
|
||||||
|
|
||||||
|
@setlocal
|
||||||
|
@rem ---- Host compiler ----
|
||||||
|
@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE
|
||||||
|
@set LJLINK=link /nologo
|
||||||
|
@set LJMT=mt /nologo
|
||||||
|
@set DASMDIR=..\dynasm
|
||||||
|
@set DASM=%DASMDIR%\dynasm.lua
|
||||||
|
@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c
|
||||||
|
|
||||||
|
%LJCOMPILE% host\minilua.c
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
%LJLINK% /out:minilua.exe minilua.obj
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
if exist minilua.exe.manifest^
|
||||||
|
%LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe
|
||||||
|
|
||||||
|
@rem Check for 64 bit host compiler.
|
||||||
|
@minilua
|
||||||
|
@if not errorlevel 8 goto :FAIL
|
||||||
|
|
||||||
|
@set DASMFLAGS=-D P64
|
||||||
|
minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
|
||||||
|
%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_X64 -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI host\buildvm*.c
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
%LJLINK% /out:buildvm.exe buildvm*.obj
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
if exist buildvm.exe.manifest^
|
||||||
|
%LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe
|
||||||
|
|
||||||
|
buildvm -m elfasm -o lj_vm.s
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m libdef -o lj_libdef.h %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m recdef -o lj_recdef.h %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m folddef -o lj_folddef.h lj_opt_fold.c
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
|
||||||
|
@rem ---- Cross compiler ----
|
||||||
|
@set LJCOMPILE="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-clang" -c -Wall -DLUAJIT_DISABLE_FFI
|
||||||
|
@set LJLIB="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-ar" rcus
|
||||||
|
@set INCLUDE=""
|
||||||
|
|
||||||
|
orbis-as -o lj_vm.o lj_vm.s
|
||||||
|
|
||||||
|
@if "%1" neq "debug" goto :NODEBUG
|
||||||
|
@shift
|
||||||
|
@set LJCOMPILE=%LJCOMPILE% -g -O0
|
||||||
|
@set TARGETLIB=libluajitD.a
|
||||||
|
goto :BUILD
|
||||||
|
:NODEBUG
|
||||||
|
@set LJCOMPILE=%LJCOMPILE% -O2
|
||||||
|
@set TARGETLIB=libluajit.a
|
||||||
|
:BUILD
|
||||||
|
del %TARGETLIB%
|
||||||
|
@if "%1"=="amalg" goto :AMALG
|
||||||
|
for %%f in (lj_*.c lib_*.c) do (
|
||||||
|
%LJCOMPILE% %%f
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
)
|
||||||
|
|
||||||
|
%LJLIB% %TARGETLIB% lj_*.o lib_*.o
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
@goto :NOAMALG
|
||||||
|
:AMALG
|
||||||
|
%LJCOMPILE% ljamalg.c
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
%LJLIB% %TARGETLIB% ljamalg.o lj_vm.o
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
:NOAMALG
|
||||||
|
|
||||||
|
@del *.o *.obj *.manifest minilua.exe buildvm.exe
|
||||||
|
@echo.
|
||||||
|
@echo === Successfully built LuaJIT for PS4 ===
|
||||||
|
|
||||||
|
@goto :END
|
||||||
|
:BAD
|
||||||
|
@echo.
|
||||||
|
@echo *******************************************************
|
||||||
|
@echo *** Build FAILED -- Please check the error messages ***
|
||||||
|
@echo *******************************************************
|
||||||
|
@goto :END
|
||||||
|
:FAIL
|
||||||
|
@echo To run this script you must open a "Visual Studio .NET Command Prompt"
|
||||||
|
@echo (64 bit host compiler). The PS4 Orbis SDK must be installed, too.
|
||||||
|
:END
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
@rem Script to build LuaJIT with the PS Vita SDK.
|
||||||
|
@rem Donated to the public domain.
|
||||||
|
@rem
|
||||||
|
@rem Open a "Visual Studio .NET Command Prompt" (32 bit host compiler)
|
||||||
|
@rem Then cd to this directory and run this script.
|
||||||
|
|
||||||
|
@if not defined INCLUDE goto :FAIL
|
||||||
|
@if not defined SCE_PSP2_SDK_DIR goto :FAIL
|
||||||
|
|
||||||
|
@setlocal
|
||||||
|
@rem ---- Host compiler ----
|
||||||
|
@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE
|
||||||
|
@set LJLINK=link /nologo
|
||||||
|
@set LJMT=mt /nologo
|
||||||
|
@set DASMDIR=..\dynasm
|
||||||
|
@set DASM=%DASMDIR%\dynasm.lua
|
||||||
|
@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c
|
||||||
|
|
||||||
|
%LJCOMPILE% host\minilua.c
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
%LJLINK% /out:minilua.exe minilua.obj
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
if exist minilua.exe.manifest^
|
||||||
|
%LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe
|
||||||
|
|
||||||
|
@rem Check for 32 bit host compiler.
|
||||||
|
@minilua
|
||||||
|
@if errorlevel 8 goto :FAIL
|
||||||
|
|
||||||
|
@set DASMFLAGS=-D FPU -D HFABI
|
||||||
|
minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_arm.dasc
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
|
||||||
|
%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_ARM -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLJ_TARGET_PSVITA=1 host\buildvm*.c
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
%LJLINK% /out:buildvm.exe buildvm*.obj
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
if exist buildvm.exe.manifest^
|
||||||
|
%LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe
|
||||||
|
|
||||||
|
buildvm -m elfasm -o lj_vm.s
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m libdef -o lj_libdef.h %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m recdef -o lj_recdef.h %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
buildvm -m folddef -o lj_folddef.h lj_opt_fold.c
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
|
||||||
|
@rem ---- Cross compiler ----
|
||||||
|
@set LJCOMPILE="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2snc" -c -w -DLUAJIT_DISABLE_FFI -DLUAJIT_USE_SYSMALLOC
|
||||||
|
@set LJLIB="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2ld32" -r --output=
|
||||||
|
@set INCLUDE=""
|
||||||
|
|
||||||
|
"%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2as" -o lj_vm.o lj_vm.s
|
||||||
|
|
||||||
|
@if "%1" neq "debug" goto :NODEBUG
|
||||||
|
@shift
|
||||||
|
@set LJCOMPILE=%LJCOMPILE% -g -O0
|
||||||
|
@set TARGETLIB=libluajitD.a
|
||||||
|
goto :BUILD
|
||||||
|
:NODEBUG
|
||||||
|
@set LJCOMPILE=%LJCOMPILE% -O2
|
||||||
|
@set TARGETLIB=libluajit.a
|
||||||
|
:BUILD
|
||||||
|
del %TARGETLIB%
|
||||||
|
|
||||||
|
%LJCOMPILE% ljamalg.c
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
%LJLIB%%TARGETLIB% ljamalg.o lj_vm.o
|
||||||
|
@if errorlevel 1 goto :BAD
|
||||||
|
|
||||||
|
@del *.o *.obj *.manifest minilua.exe buildvm.exe
|
||||||
|
@echo.
|
||||||
|
@echo === Successfully built LuaJIT for PS Vita ===
|
||||||
|
|
||||||
|
@goto :END
|
||||||
|
:BAD
|
||||||
|
@echo.
|
||||||
|
@echo *******************************************************
|
||||||
|
@echo *** Build FAILED -- Please check the error messages ***
|
||||||
|
@echo *******************************************************
|
||||||
|
@goto :END
|
||||||
|
:FAIL
|
||||||
|
@echo To run this script you must open a "Visual Studio .NET Command Prompt"
|
||||||
|
@echo (32 bit host compiler). The PS Vita SDK must be installed, too.
|
||||||
|
:END
|
||||||
@@ -72,93 +72,6 @@ public:
|
|||||||
**/
|
**/
|
||||||
virtual void release();
|
virtual void release();
|
||||||
|
|
||||||
/**
|
|
||||||
* Meant to be used as a temporary object. Facilitates safer and cleaner
|
|
||||||
* code to release objects by doing so when the AutoRelease object is
|
|
||||||
* destroyed (e.g. goes out of scope.)
|
|
||||||
**/
|
|
||||||
class AutoRelease
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
AutoRelease(Object *obj)
|
|
||||||
: object(obj)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
~AutoRelease()
|
|
||||||
{
|
|
||||||
if (object)
|
|
||||||
object->release();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
AutoRelease() {}
|
|
||||||
Object *object;
|
|
||||||
|
|
||||||
}; // AutoRelease
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Partial re-implementation + specialization of std::shared_ptr. We can't
|
|
||||||
* use C++11's stdlib yet...
|
|
||||||
**/
|
|
||||||
template <typename T>
|
|
||||||
class StrongRef
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
StrongRef()
|
|
||||||
: object(nullptr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
StrongRef(T *obj)
|
|
||||||
: object(obj)
|
|
||||||
{
|
|
||||||
if (object) object->retain();
|
|
||||||
}
|
|
||||||
|
|
||||||
StrongRef(const StrongRef &other)
|
|
||||||
: object(other.get())
|
|
||||||
{
|
|
||||||
if (object) object->retain();
|
|
||||||
}
|
|
||||||
|
|
||||||
~StrongRef()
|
|
||||||
{
|
|
||||||
if (object) object->release();
|
|
||||||
}
|
|
||||||
|
|
||||||
StrongRef &operator = (const StrongRef &other)
|
|
||||||
{
|
|
||||||
set(other.get());
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
T *operator->() const
|
|
||||||
{
|
|
||||||
return object;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set(T *obj)
|
|
||||||
{
|
|
||||||
if (obj) obj->retain();
|
|
||||||
if (object) object->release();
|
|
||||||
object = obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
T *get() const
|
|
||||||
{
|
|
||||||
return object;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
T *object;
|
|
||||||
|
|
||||||
}; // StrongRef
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// The reference count.
|
// The reference count.
|
||||||
@@ -166,6 +79,66 @@ private:
|
|||||||
|
|
||||||
}; // Object
|
}; // Object
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Partial re-implementation + specialization of std::shared_ptr. We can't
|
||||||
|
* use C++11's stdlib yet...
|
||||||
|
**/
|
||||||
|
template <typename T>
|
||||||
|
class StrongRef
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
StrongRef()
|
||||||
|
: object(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
StrongRef(T *obj)
|
||||||
|
: object(obj)
|
||||||
|
{
|
||||||
|
if (object) object->retain();
|
||||||
|
}
|
||||||
|
|
||||||
|
StrongRef(const StrongRef &other)
|
||||||
|
: object(other.get())
|
||||||
|
{
|
||||||
|
if (object) object->retain();
|
||||||
|
}
|
||||||
|
|
||||||
|
~StrongRef()
|
||||||
|
{
|
||||||
|
if (object) object->release();
|
||||||
|
}
|
||||||
|
|
||||||
|
StrongRef &operator = (const StrongRef &other)
|
||||||
|
{
|
||||||
|
set(other.get());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
T *operator->() const
|
||||||
|
{
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set(T *obj)
|
||||||
|
{
|
||||||
|
if (obj) obj->retain();
|
||||||
|
if (object) object->release();
|
||||||
|
object = obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
T *get() const
|
||||||
|
{
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
T *object;
|
||||||
|
|
||||||
|
}; // StrongRef
|
||||||
|
|
||||||
} // love
|
} // love
|
||||||
|
|
||||||
#endif // LOVE_OBJECT_H
|
#endif // LOVE_OBJECT_H
|
||||||
|
|||||||
@@ -25,10 +25,11 @@ namespace love
|
|||||||
{
|
{
|
||||||
|
|
||||||
// Version stuff.
|
// Version stuff.
|
||||||
|
#define LOVE_VERSION_STRING "0.9.2"
|
||||||
const int VERSION_MAJOR = 0;
|
const int VERSION_MAJOR = 0;
|
||||||
const int VERSION_MINOR = 9;
|
const int VERSION_MINOR = 9;
|
||||||
const int VERSION_REV = 2;
|
const int VERSION_REV = 2;
|
||||||
const char *VERSION = "0.9.2";
|
const char *VERSION = LOVE_VERSION_STRING;
|
||||||
const char *VERSION_COMPATIBILITY[] = { VERSION, "0.9.1", "0.9.0", 0 };
|
const char *VERSION_COMPATIBILITY[] = { VERSION, "0.9.1", "0.9.0", 0 };
|
||||||
const char *VERSION_CODENAME = "Baby Inspector";
|
const char *VERSION_CODENAME = "Baby Inspector";
|
||||||
|
|
||||||
|
|||||||
+12
-2
@@ -23,6 +23,7 @@
|
|||||||
#ifndef LOVE_ANDROID
|
#ifndef LOVE_ANDROID
|
||||||
#include "common/version.h"
|
#include "common/version.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
|
||||||
@@ -43,7 +44,16 @@ extern "C" {
|
|||||||
#include "OSX.h"
|
#include "OSX.h"
|
||||||
#endif // LOVE_MACOSX
|
#endif // LOVE_MACOSX
|
||||||
|
|
||||||
#include <string>
|
#ifdef LOVE_WINDOWS
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
// Prefer the higher performance GPU on Windows systems that use nvidia Optimus.
|
||||||
|
// http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf
|
||||||
|
// TODO: Re-evaluate in the future when the average integrated GPU in Optimus
|
||||||
|
// systems is less mediocre?
|
||||||
|
LOVE_EXPORT DWORD NvOptimusEnablement = 0x00000001;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
|
#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
|
||||||
|
|
||||||
@@ -206,7 +216,7 @@ int main(int argc, char **argv)
|
|||||||
if (strcmp(love::VERSION, love_version()) != 0)
|
if (strcmp(love::VERSION, love_version()) != 0)
|
||||||
{
|
{
|
||||||
printf("Version mismatch detected!\nLOVE binary is version %s\n"
|
printf("Version mismatch detected!\nLOVE binary is version %s\n"
|
||||||
"LOVE library is version %s\n", love::VERSION, love_version());
|
"LOVE library is version %s\n", LOVE_VERSION_STRING, love_version());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -185,6 +185,9 @@ public:
|
|||||||
**/
|
**/
|
||||||
virtual void setVelocity(float *v) = 0;
|
virtual void setVelocity(float *v) = 0;
|
||||||
|
|
||||||
|
virtual void setDopplerScale(float scale) = 0;
|
||||||
|
virtual float getDopplerScale() const = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins recording audio input from the microphone.
|
* Begins recording audio input from the microphone.
|
||||||
**/
|
**/
|
||||||
|
|||||||
@@ -132,6 +132,15 @@ void Audio::setVelocity(float *)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Audio::setDopplerScale(float)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
float Audio::getDopplerScale() const
|
||||||
|
{
|
||||||
|
return 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
void Audio::record()
|
void Audio::record()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ public:
|
|||||||
void getVelocity(float *v) const;
|
void getVelocity(float *v) const;
|
||||||
void setVelocity(float *v);
|
void setVelocity(float *v);
|
||||||
|
|
||||||
|
void setDopplerScale(float scale);
|
||||||
|
float getDopplerScale() const;
|
||||||
|
|
||||||
void record();
|
void record();
|
||||||
love::sound::SoundData *getRecordedData();
|
love::sound::SoundData *getRecordedData();
|
||||||
love::sound::SoundData *stopRecording(bool returnData);
|
love::sound::SoundData *stopRecording(bool returnData);
|
||||||
|
|||||||
@@ -262,6 +262,17 @@ void Audio::setVelocity(float *v)
|
|||||||
alListenerfv(AL_VELOCITY, v);
|
alListenerfv(AL_VELOCITY, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Audio::setDopplerScale(float scale)
|
||||||
|
{
|
||||||
|
if (scale >= 0.0f)
|
||||||
|
alDopplerFactor(scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
float Audio::getDopplerScale() const
|
||||||
|
{
|
||||||
|
return alGetFloat(AL_DOPPLER_FACTOR);
|
||||||
|
}
|
||||||
|
|
||||||
void Audio::record()
|
void Audio::record()
|
||||||
{
|
{
|
||||||
if (!canRecord()) return;
|
if (!canRecord()) return;
|
||||||
|
|||||||
@@ -86,6 +86,9 @@ public:
|
|||||||
void getVelocity(float *v) const;
|
void getVelocity(float *v) const;
|
||||||
void setVelocity(float *v);
|
void setVelocity(float *v);
|
||||||
|
|
||||||
|
void setDopplerScale(float scale);
|
||||||
|
float getDopplerScale() const;
|
||||||
|
|
||||||
void record();
|
void record();
|
||||||
love::sound::SoundData *getRecordedData();
|
love::sound::SoundData *getRecordedData();
|
||||||
love::sound::SoundData *stopRecording(bool returnData);
|
love::sound::SoundData *stopRecording(bool returnData);
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ private:
|
|||||||
static const unsigned int MAX_BUFFERS = 8;
|
static const unsigned int MAX_BUFFERS = 8;
|
||||||
ALuint streamBuffers[MAX_BUFFERS];
|
ALuint streamBuffers[MAX_BUFFERS];
|
||||||
|
|
||||||
Object::StrongRef<StaticDataBuffer> staticBuffer;
|
StrongRef<StaticDataBuffer> staticBuffer;
|
||||||
|
|
||||||
float pitch;
|
float pitch;
|
||||||
float volume;
|
float volume;
|
||||||
@@ -183,7 +183,7 @@ private:
|
|||||||
int sampleRate;
|
int sampleRate;
|
||||||
int channels;
|
int channels;
|
||||||
|
|
||||||
Object::StrongRef<love::sound::Decoder> decoder;
|
StrongRef<love::sound::Decoder> decoder;
|
||||||
|
|
||||||
unsigned int toLoop;
|
unsigned int toLoop;
|
||||||
|
|
||||||
|
|||||||
@@ -218,6 +218,18 @@ int w_getVelocity(lua_State *L)
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int w_setDopplerScale(lua_State *L)
|
||||||
|
{
|
||||||
|
instance()->setDopplerScale(luax_checkfloat(L, 1));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int w_getDopplerScale(lua_State *L)
|
||||||
|
{
|
||||||
|
lua_pushnumber(L, instance()->getDopplerScale());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int w_record(lua_State *)
|
int w_record(lua_State *)
|
||||||
{
|
{
|
||||||
instance()->record();
|
instance()->record();
|
||||||
@@ -299,6 +311,8 @@ static const luaL_Reg functions[] =
|
|||||||
{ "getOrientation", w_getOrientation },
|
{ "getOrientation", w_getOrientation },
|
||||||
{ "setVelocity", w_setVelocity },
|
{ "setVelocity", w_setVelocity },
|
||||||
{ "getVelocity", w_getVelocity },
|
{ "getVelocity", w_getVelocity },
|
||||||
|
{ "setDopplerScale", w_setDopplerScale },
|
||||||
|
{ "getDopplerScale", w_getDopplerScale },
|
||||||
/*{ "record", w_record },
|
/*{ "record", w_record },
|
||||||
{ "getRecordedData", w_getRecordedData },
|
{ "getRecordedData", w_getRecordedData },
|
||||||
{ "stopRecording", w_stopRecording },*/
|
{ "stopRecording", w_stopRecording },*/
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ int w_setOrientation(lua_State *L);
|
|||||||
int w_getOrientation(lua_State *L);
|
int w_getOrientation(lua_State *L);
|
||||||
int w_setVelocity(lua_State *L);
|
int w_setVelocity(lua_State *L);
|
||||||
int w_getVelocity(lua_State *L);
|
int w_getVelocity(lua_State *L);
|
||||||
|
int w_setDopplerScale(lua_State *L);
|
||||||
|
int w_getDopplerScale(lua_State *L);
|
||||||
int w_record(lua_State *L);
|
int w_record(lua_State *L);
|
||||||
int w_getRecordedData(lua_State *L);
|
int w_getRecordedData(lua_State *L);
|
||||||
int w_stopRecording(lua_State *L);
|
int w_stopRecording(lua_State *L);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace love
|
|||||||
namespace event
|
namespace event
|
||||||
{
|
{
|
||||||
|
|
||||||
Message::Message(const std::string &name, const std::vector<Object::StrongRef<Variant>> &vargs)
|
Message::Message(const std::string &name, const std::vector<StrongRef<Variant>> &vargs)
|
||||||
: name(name)
|
: name(name)
|
||||||
, args(vargs)
|
, args(vargs)
|
||||||
{
|
{
|
||||||
@@ -42,7 +42,7 @@ int Message::toLua(lua_State *L)
|
|||||||
{
|
{
|
||||||
luax_pushstring(L, name);
|
luax_pushstring(L, name);
|
||||||
|
|
||||||
for (const Object::StrongRef<Variant> &v : args)
|
for (const StrongRef<Variant> &v : args)
|
||||||
{
|
{
|
||||||
if (v.get() != nullptr)
|
if (v.get() != nullptr)
|
||||||
v->toLua(L);
|
v->toLua(L);
|
||||||
@@ -56,7 +56,7 @@ int Message::toLua(lua_State *L)
|
|||||||
Message *Message::fromLua(lua_State *L, int n)
|
Message *Message::fromLua(lua_State *L, int n)
|
||||||
{
|
{
|
||||||
std::string name = luax_checkstring(L, n);
|
std::string name = luax_checkstring(L, n);
|
||||||
std::vector<Object::StrongRef<Variant>> vargs;
|
std::vector<StrongRef<Variant>> vargs;
|
||||||
|
|
||||||
int count = lua_gettop(L) - n;
|
int count = lua_gettop(L) - n;
|
||||||
n++;
|
n++;
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class Message : public Object
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Message(const std::string &name, const std::vector<Object::StrongRef<Variant>> &vargs = std::vector<Object::StrongRef<Variant>>());
|
Message(const std::string &name, const std::vector<StrongRef<Variant>> &vargs = std::vector<StrongRef<Variant>>());
|
||||||
~Message();
|
~Message();
|
||||||
|
|
||||||
int toLua(lua_State *L);
|
int toLua(lua_State *L);
|
||||||
@@ -52,7 +52,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
std::vector<Object::StrongRef<Variant>> args;
|
std::vector<StrongRef<Variant>> args;
|
||||||
|
|
||||||
}; // Message
|
}; // Message
|
||||||
|
|
||||||
|
|||||||
@@ -30,10 +30,19 @@ namespace filesystem
|
|||||||
{
|
{
|
||||||
|
|
||||||
FileData::FileData(uint64 size, const std::string &filename)
|
FileData::FileData(uint64 size, const std::string &filename)
|
||||||
: data(new char[(size_t) size])
|
: data(nullptr)
|
||||||
, size((size_t) size)
|
, size((size_t) size)
|
||||||
, filename(filename)
|
, filename(filename)
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
data = new char[(size_t) size];
|
||||||
|
}
|
||||||
|
catch (std::bad_alloc &)
|
||||||
|
{
|
||||||
|
throw love::Exception("Out of memory.");
|
||||||
|
}
|
||||||
|
|
||||||
if (filename.rfind('.') != std::string::npos)
|
if (filename.rfind('.') != std::string::npos)
|
||||||
extension = filename.substr(filename.rfind('.')+1);
|
extension = filename.substr(filename.rfind('.')+1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -277,6 +277,24 @@ int w_getSourceBaseDirectory(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int w_getRealDirectory(lua_State *L)
|
||||||
|
{
|
||||||
|
const char *filename = luaL_checkstring(L, 1);
|
||||||
|
std::string dir;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dir = instance()->getRealDirectory(filename);
|
||||||
|
}
|
||||||
|
catch (love::Exception &e)
|
||||||
|
{
|
||||||
|
return luax_ioError(L, "%s", e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pushstring(L, dir.c_str());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int w_exists(lua_State *L)
|
int w_exists(lua_State *L)
|
||||||
{
|
{
|
||||||
const char *arg = luaL_checkstring(L, 1);
|
const char *arg = luaL_checkstring(L, 1);
|
||||||
@@ -658,6 +676,7 @@ static const luaL_Reg functions[] =
|
|||||||
{ "getAppdataDirectory", w_getAppdataDirectory },
|
{ "getAppdataDirectory", w_getAppdataDirectory },
|
||||||
{ "getSaveDirectory", w_getSaveDirectory },
|
{ "getSaveDirectory", w_getSaveDirectory },
|
||||||
{ "getSourceBaseDirectory", w_getSourceBaseDirectory },
|
{ "getSourceBaseDirectory", w_getSourceBaseDirectory },
|
||||||
|
{ "getRealDirectory", w_getRealDirectory },
|
||||||
{ "exists", w_exists },
|
{ "exists", w_exists },
|
||||||
{ "isDirectory", w_isDirectory },
|
{ "isDirectory", w_isDirectory },
|
||||||
{ "isFile", w_isFile },
|
{ "isFile", w_isFile },
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ int w_getUserDirectory(lua_State *L);
|
|||||||
int w_getAppdataDirectory(lua_State *L);
|
int w_getAppdataDirectory(lua_State *L);
|
||||||
int w_getSaveDirectory(lua_State *L);
|
int w_getSaveDirectory(lua_State *L);
|
||||||
int w_getSourceBaseDirectory(lua_State *L);
|
int w_getSourceBaseDirectory(lua_State *L);
|
||||||
|
int w_getRealDirectory(lua_State *L);
|
||||||
int w_exists(lua_State *L);
|
int w_exists(lua_State *L);
|
||||||
int w_isDirectory(lua_State *L);
|
int w_isDirectory(lua_State *L);
|
||||||
int w_isFile(lua_State *L);
|
int w_isFile(lua_State *L);
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ public:
|
|||||||
// Implements Module.
|
// Implements Module.
|
||||||
virtual ModuleType getModuleType() const { return M_FONT; }
|
virtual ModuleType getModuleType() const { return M_FONT; }
|
||||||
|
|
||||||
|
virtual Rasterizer *newRasterizer(int size) = 0;
|
||||||
virtual Rasterizer *newRasterizer(Data *data, int size) = 0;
|
virtual Rasterizer *newRasterizer(Data *data, int size) = 0;
|
||||||
virtual Rasterizer *newRasterizer(love::image::ImageData *data, const std::string &glyphs) = 0;
|
virtual Rasterizer *newRasterizer(love::image::ImageData *data, const std::string &glyphs) = 0;
|
||||||
virtual Rasterizer *newRasterizer(love::image::ImageData *data, uint32 *glyphs, int length) = 0;
|
virtual Rasterizer *newRasterizer(love::image::ImageData *data, uint32 *glyphs, int length) = 0;
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ private:
|
|||||||
void load();
|
void load();
|
||||||
|
|
||||||
// The image data
|
// The image data
|
||||||
Object::StrongRef<love::image::ImageData> imageData;
|
StrongRef<love::image::ImageData> imageData;
|
||||||
|
|
||||||
// The glyphs in the font
|
// The glyphs in the font
|
||||||
uint32 *glyphs;
|
uint32 *glyphs;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
#include "libraries/utf8/utf8.h"
|
#include "libraries/utf8/utf8.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
namespace love
|
namespace love
|
||||||
{
|
{
|
||||||
namespace font
|
namespace font
|
||||||
@@ -32,10 +34,13 @@ namespace font
|
|||||||
namespace freetype
|
namespace freetype
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Default TrueType font.
|
||||||
|
#include "font/Vera.ttf.h"
|
||||||
|
|
||||||
Font::Font()
|
Font::Font()
|
||||||
{
|
{
|
||||||
if (FT_Init_FreeType(&library))
|
if (FT_Init_FreeType(&library))
|
||||||
throw love::Exception("TrueTypeFont Loading error: FT_Init_FreeType failed\n");
|
throw love::Exception("TrueTypeFont Loading error: FT_Init_FreeType failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
Font::~Font()
|
Font::~Font()
|
||||||
@@ -43,6 +48,16 @@ Font::~Font()
|
|||||||
FT_Done_FreeType(library);
|
FT_Done_FreeType(library);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rasterizer *Font::newRasterizer(int size)
|
||||||
|
{
|
||||||
|
StrongRef<filesystem::FileData> data(new filesystem::FileData(sizeof(Vera_ttf), "Vera.ttf"));
|
||||||
|
data->release();
|
||||||
|
|
||||||
|
memcpy(data->getData(), Vera_ttf, sizeof(Vera_ttf));
|
||||||
|
|
||||||
|
return new TrueTypeRasterizer(library, data.get(), size);
|
||||||
|
}
|
||||||
|
|
||||||
Rasterizer *Font::newRasterizer(Data *data, int size)
|
Rasterizer *Font::newRasterizer(Data *data, int size)
|
||||||
{
|
{
|
||||||
return new TrueTypeRasterizer(library, data, size);
|
return new TrueTypeRasterizer(library, data, size);
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ public:
|
|||||||
virtual ~Font();
|
virtual ~Font();
|
||||||
|
|
||||||
// Implements Font
|
// Implements Font
|
||||||
|
Rasterizer *newRasterizer(int size);
|
||||||
Rasterizer *newRasterizer(Data *data, int size);
|
Rasterizer *newRasterizer(Data *data, int size);
|
||||||
Rasterizer *newRasterizer(love::image::ImageData *data, const std::string &text);
|
Rasterizer *newRasterizer(love::image::ImageData *data, const std::string &text);
|
||||||
Rasterizer *newRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs);
|
Rasterizer *newRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs);
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ namespace freetype
|
|||||||
TrueTypeRasterizer::TrueTypeRasterizer(FT_Library library, Data *data, int size)
|
TrueTypeRasterizer::TrueTypeRasterizer(FT_Library library, Data *data, int size)
|
||||||
: data(data)
|
: data(data)
|
||||||
{
|
{
|
||||||
|
if (size <= 0)
|
||||||
|
throw love::Exception("Invalid TrueType font size: %d", size);
|
||||||
|
|
||||||
FT_Error err = FT_Err_Ok;
|
FT_Error err = FT_Err_Ok;
|
||||||
err = FT_New_Memory_Face(library,
|
err = FT_New_Memory_Face(library,
|
||||||
(const FT_Byte *)data->getData(), /* first byte in memory */
|
(const FT_Byte *)data->getData(), /* first byte in memory */
|
||||||
@@ -41,9 +44,12 @@ TrueTypeRasterizer::TrueTypeRasterizer(FT_Library library, Data *data, int size)
|
|||||||
&face);
|
&face);
|
||||||
|
|
||||||
if (err != FT_Err_Ok)
|
if (err != FT_Err_Ok)
|
||||||
throw love::Exception("TrueType Font Loading error: FT_New_Face failed: 0x%x (problem with font file?)", err);
|
throw love::Exception("TrueType Font loading error: FT_New_Face failed: 0x%x (problem with font file?)", err);
|
||||||
|
|
||||||
FT_Set_Pixel_Sizes(face, size, size);
|
err = FT_Set_Pixel_Sizes(face, size, size);
|
||||||
|
|
||||||
|
if (err != FT_Err_Ok)
|
||||||
|
throw love::Exception("TrueType Font loading error: FT_Set_Pixel_Sizes failed: 0x%x (invalid size?)", err);
|
||||||
|
|
||||||
// Set global metrics
|
// Set global metrics
|
||||||
FT_Size_Metrics s = face->size->metrics;
|
FT_Size_Metrics s = face->size->metrics;
|
||||||
@@ -74,14 +80,17 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const
|
|||||||
err = FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_DEFAULT);
|
err = FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_DEFAULT);
|
||||||
|
|
||||||
if (err != FT_Err_Ok)
|
if (err != FT_Err_Ok)
|
||||||
throw love::Exception("TrueType Font Loading error: FT_Load_Glyph failed (0x%x)", err);
|
throw love::Exception("TrueType Font glyph error: FT_Load_Glyph failed (0x%x)", err);
|
||||||
|
|
||||||
err = FT_Get_Glyph(face->glyph, &ftglyph);
|
err = FT_Get_Glyph(face->glyph, &ftglyph);
|
||||||
|
|
||||||
if (err != FT_Err_Ok)
|
if (err != FT_Err_Ok)
|
||||||
throw love::Exception("TrueType Font Loading error: FT_Get_Glyph failed (0x%x)", err);
|
throw love::Exception("TrueType Font glyph error: FT_Get_Glyph failed (0x%x)", err);
|
||||||
|
|
||||||
FT_Glyph_To_Bitmap(&ftglyph, FT_RENDER_MODE_NORMAL, 0, 1);
|
err = FT_Glyph_To_Bitmap(&ftglyph, FT_RENDER_MODE_NORMAL, 0, 1);
|
||||||
|
|
||||||
|
if (err != FT_Err_Ok)
|
||||||
|
throw love::Exception("TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)", err);
|
||||||
|
|
||||||
FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph) ftglyph;
|
FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph) ftglyph;
|
||||||
FT_Bitmap &bitmap = bitmap_glyph->bitmap; //just to make things easier
|
FT_Bitmap &bitmap = bitmap_glyph->bitmap; //just to make things easier
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ private:
|
|||||||
FT_Face face;
|
FT_Face face;
|
||||||
|
|
||||||
// File data
|
// File data
|
||||||
Object::StrongRef<Data> data;
|
StrongRef<Data> data;
|
||||||
}; // FreetypeRasterizer
|
}; // FreetypeRasterizer
|
||||||
|
|
||||||
} // freetype
|
} // freetype
|
||||||
|
|||||||
@@ -49,17 +49,21 @@ int w_newRasterizer(lua_State *L)
|
|||||||
std::string glyphs(g);
|
std::string glyphs(g);
|
||||||
luax_catchexcept(L, [&](){ t = instance()->newRasterizer(d, glyphs); });
|
luax_catchexcept(L, [&](){ t = instance()->newRasterizer(d, glyphs); });
|
||||||
}
|
}
|
||||||
else if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T))
|
else if (lua_type(L, 1) == LUA_TSTRING || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T))
|
||||||
{
|
{
|
||||||
love::filesystem::FileData *d = love::filesystem::luax_getfiledata(L, 1);
|
love::filesystem::FileData *d = love::filesystem::luax_getfiledata(L, 1);
|
||||||
int size = luaL_checkint(L, 2);
|
int size = luaL_optint(L, 2, 12);
|
||||||
luax_catchexcept(L,
|
luax_catchexcept(L,
|
||||||
[&]() { t = instance()->newRasterizer(d, size); },
|
[&]() { t = instance()->newRasterizer(d, size); },
|
||||||
[&]() { d->release(); }
|
[&]() { d->release(); }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return luaL_argerror(L, 1, "expected ImageData, filename, or FileData");
|
{
|
||||||
|
// Default font (Vera.)
|
||||||
|
int size = luaL_optint(L, 1, 12);
|
||||||
|
luax_catchexcept(L, [&]() { t = instance()->newRasterizer(size); });
|
||||||
|
}
|
||||||
|
|
||||||
luax_pushtype(L, "Rasterizer", FONT_RASTERIZER_T, t);
|
luax_pushtype(L, "Rasterizer", FONT_RASTERIZER_T, t);
|
||||||
t->release();
|
t->release();
|
||||||
|
|||||||
@@ -157,6 +157,24 @@ public:
|
|||||||
size_t textureMemory;
|
size_t textureMemory;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ColorMask
|
||||||
|
{
|
||||||
|
bool r;
|
||||||
|
bool g;
|
||||||
|
bool b;
|
||||||
|
bool a;
|
||||||
|
|
||||||
|
bool operator == (const ColorMask &m) const
|
||||||
|
{
|
||||||
|
return r == m.r && g == m.g && b == m.b && a == m.a;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator != (const ColorMask &m) const
|
||||||
|
{
|
||||||
|
return !(operator == (m));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
virtual ~Graphics();
|
virtual ~Graphics();
|
||||||
|
|
||||||
// Implements Module.
|
// Implements Module.
|
||||||
|
|||||||
@@ -595,7 +595,9 @@ bool Canvas::loadVolatile()
|
|||||||
|
|
||||||
if (glGetError() != GL_NO_ERROR)
|
if (glGetError() != GL_NO_ERROR)
|
||||||
{
|
{
|
||||||
status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
gl.deleteTexture(texture);
|
||||||
|
texture = 0;
|
||||||
|
status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -619,7 +621,14 @@ bool Canvas::loadVolatile()
|
|||||||
status = strategy->createFBO(fbo, texture);
|
status = strategy->createFBO(fbo, texture);
|
||||||
|
|
||||||
if (status != GL_FRAMEBUFFER_COMPLETE)
|
if (status != GL_FRAMEBUFFER_COMPLETE)
|
||||||
|
{
|
||||||
|
if (fbo != 0)
|
||||||
|
{
|
||||||
|
strategy->deleteFBO(fbo, 0, 0);
|
||||||
|
fbo = 0;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
clear(Color(0, 0, 0, 0));
|
clear(Color(0, 0, 0, 0));
|
||||||
|
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ private:
|
|||||||
Glyph *addGlyph(uint32 glyph);
|
Glyph *addGlyph(uint32 glyph);
|
||||||
Glyph *findGlyph(uint32 glyph);
|
Glyph *findGlyph(uint32 glyph);
|
||||||
|
|
||||||
Object::StrongRef<love::font::Rasterizer> rasterizer;
|
StrongRef<love::font::Rasterizer> rasterizer;
|
||||||
|
|
||||||
VertexIndex *indexBuffer;
|
VertexIndex *indexBuffer;
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include "Graphics.h"
|
#include "Graphics.h"
|
||||||
#include "window/sdl/Window.h"
|
#include "window/sdl/Window.h"
|
||||||
|
#include "font/Font.h"
|
||||||
#include "Polyline.h"
|
#include "Polyline.h"
|
||||||
|
|
||||||
// C++
|
// C++
|
||||||
@@ -71,6 +72,7 @@ Graphics::~Graphics()
|
|||||||
{
|
{
|
||||||
// We do this manually so the love objects get released before the window.
|
// We do this manually so the love objects get released before the window.
|
||||||
states.clear();
|
states.clear();
|
||||||
|
defaultFont.set(nullptr);
|
||||||
|
|
||||||
if (Shader::defaultShader)
|
if (Shader::defaultShader)
|
||||||
{
|
{
|
||||||
@@ -160,14 +162,8 @@ void Graphics::restoreStateChecked(const DisplayState &s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
if (s.colorMask != cur.colorMask)
|
||||||
{
|
setColorMask(s.colorMask);
|
||||||
if (s.colorMask[i] != cur.colorMask[i])
|
|
||||||
{
|
|
||||||
setColorMask(s.colorMask);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s.wireframe != cur.wireframe)
|
if (s.wireframe != cur.wireframe)
|
||||||
setWireframe(s.wireframe);
|
setWireframe(s.wireframe);
|
||||||
@@ -176,6 +172,29 @@ void Graphics::restoreStateChecked(const DisplayState &s)
|
|||||||
setDefaultMipmapFilter(s.defaultMipmapFilter, s.defaultMipmapSharpness);
|
setDefaultMipmapFilter(s.defaultMipmapFilter, s.defaultMipmapSharpness);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Graphics::checkSetDefaultFont()
|
||||||
|
{
|
||||||
|
// We don't create or set the default Font if an existing font is in use.
|
||||||
|
if (states.back().font.get() != nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Create a new default font if we don't have one yet.
|
||||||
|
if (!defaultFont.get())
|
||||||
|
{
|
||||||
|
font::Font *fontmodule = Module::getInstance<font::Font>(M_FONT);
|
||||||
|
if (!fontmodule)
|
||||||
|
throw love::Exception("Font module has not been loaded.");
|
||||||
|
|
||||||
|
StrongRef<font::Rasterizer> r(fontmodule->newRasterizer(12));
|
||||||
|
r->release();
|
||||||
|
|
||||||
|
defaultFont.set(newFont(r.get()));
|
||||||
|
defaultFont->release();
|
||||||
|
}
|
||||||
|
|
||||||
|
states.back().font.set(defaultFont.get());
|
||||||
|
}
|
||||||
|
|
||||||
void Graphics::setViewportSize(int width, int height)
|
void Graphics::setViewportSize(int width, int height)
|
||||||
{
|
{
|
||||||
this->width = width;
|
this->width = width;
|
||||||
@@ -186,7 +205,7 @@ void Graphics::setViewportSize(int width, int height)
|
|||||||
|
|
||||||
// We want to affect the main screen, not any Canvas that's currently active
|
// We want to affect the main screen, not any Canvas that's currently active
|
||||||
// (not that any *should* be active when this is called.)
|
// (not that any *should* be active when this is called.)
|
||||||
std::vector<Object::StrongRef<Canvas>> canvases = states.back().canvases;
|
std::vector<StrongRef<Canvas>> canvases = states.back().canvases;
|
||||||
setCanvas();
|
setCanvas();
|
||||||
|
|
||||||
// Set the viewport to top-left corner.
|
// Set the viewport to top-left corner.
|
||||||
@@ -233,17 +252,8 @@ bool Graphics::setMode(int width, int height, bool &sRGB)
|
|||||||
// Enable blending
|
// Enable blending
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
// Enable all color component writes.
|
|
||||||
bool colormask[] = {true, true, true, true};
|
|
||||||
setColorMask(colormask);
|
|
||||||
|
|
||||||
// Enable line/point smoothing.
|
|
||||||
setLineStyle(LINE_SMOOTH);
|
|
||||||
if (GLAD_VERSION_1_0)
|
if (GLAD_VERSION_1_0)
|
||||||
{
|
|
||||||
glEnable(GL_POINT_SMOOTH);
|
|
||||||
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
|
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
|
||||||
}
|
|
||||||
|
|
||||||
// Auto-generated mipmaps should be the best quality possible
|
// Auto-generated mipmaps should be the best quality possible
|
||||||
if (GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4 || GLAD_SGIS_generate_mipmap)
|
if (GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4 || GLAD_SGIS_generate_mipmap)
|
||||||
@@ -429,7 +439,7 @@ void Graphics::present()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Make sure we don't have a canvas active.
|
// Make sure we don't have a canvas active.
|
||||||
std::vector<Object::StrongRef<Canvas>> canvases = states.back().canvases;
|
std::vector<StrongRef<Canvas>> canvases = states.back().canvases;
|
||||||
setCanvas();
|
setCanvas();
|
||||||
|
|
||||||
if (GLAD_EXT_discard_framebuffer)
|
if (GLAD_EXT_discard_framebuffer)
|
||||||
@@ -710,18 +720,16 @@ Color Graphics::getBackgroundColor() const
|
|||||||
|
|
||||||
void Graphics::setFont(Font *font)
|
void Graphics::setFont(Font *font)
|
||||||
{
|
{
|
||||||
// Hack: the Lua-facing love.graphics.print function will set the current
|
// We don't need to set a default font here if null is passed in, since we
|
||||||
// font if needed, but only on its first call... we want to make sure a nil
|
// only care about the default font in getFont and print.
|
||||||
// font is never accidentally set (e.g. via love.graphics.reset.)
|
|
||||||
if (font == nullptr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
DisplayState &state = states.back();
|
DisplayState &state = states.back();
|
||||||
state.font.set(font);
|
state.font.set(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
Font *Graphics::getFont() const
|
Font *Graphics::getFont()
|
||||||
{
|
{
|
||||||
|
checkSetDefaultFont();
|
||||||
return states.back().font.get();
|
return states.back().font.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -760,7 +768,7 @@ void Graphics::setCanvas(Canvas *canvas)
|
|||||||
|
|
||||||
canvas->startGrab();
|
canvas->startGrab();
|
||||||
|
|
||||||
std::vector<Object::StrongRef<Canvas>> canvasref;
|
std::vector<StrongRef<Canvas>> canvasref;
|
||||||
canvasref.push_back(canvas);
|
canvasref.push_back(canvas);
|
||||||
|
|
||||||
std::swap(state.canvases, canvasref);
|
std::swap(state.canvases, canvasref);
|
||||||
@@ -778,7 +786,7 @@ void Graphics::setCanvas(const std::vector<Canvas *> &canvases)
|
|||||||
auto attachments = std::vector<Canvas *>(canvases.begin() + 1, canvases.end());
|
auto attachments = std::vector<Canvas *>(canvases.begin() + 1, canvases.end());
|
||||||
canvases[0]->startGrab(attachments);
|
canvases[0]->startGrab(attachments);
|
||||||
|
|
||||||
std::vector<Object::StrongRef<Canvas>> canvasrefs;
|
std::vector<StrongRef<Canvas>> canvasrefs;
|
||||||
canvasrefs.reserve(canvases.size());
|
canvasrefs.reserve(canvases.size());
|
||||||
|
|
||||||
for (Canvas *c : canvases)
|
for (Canvas *c : canvases)
|
||||||
@@ -787,12 +795,12 @@ void Graphics::setCanvas(const std::vector<Canvas *> &canvases)
|
|||||||
std::swap(state.canvases, canvasrefs);
|
std::swap(state.canvases, canvasrefs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Graphics::setCanvas(const std::vector<Object::StrongRef<Canvas>> &canvases)
|
void Graphics::setCanvas(const std::vector<StrongRef<Canvas>> &canvases)
|
||||||
{
|
{
|
||||||
std::vector<Canvas *> canvaslist;
|
std::vector<Canvas *> canvaslist;
|
||||||
canvaslist.reserve(canvases.size());
|
canvaslist.reserve(canvases.size());
|
||||||
|
|
||||||
for (const Object::StrongRef<Canvas> &c : canvases)
|
for (const StrongRef<Canvas> &c : canvases)
|
||||||
canvaslist.push_back(c.get());
|
canvaslist.push_back(c.get());
|
||||||
|
|
||||||
return setCanvas(canvaslist);
|
return setCanvas(canvaslist);
|
||||||
@@ -813,21 +821,18 @@ std::vector<Canvas *> Graphics::getCanvas() const
|
|||||||
std::vector<Canvas *> canvases;
|
std::vector<Canvas *> canvases;
|
||||||
canvases.reserve(states.back().canvases.size());
|
canvases.reserve(states.back().canvases.size());
|
||||||
|
|
||||||
for (const Object::StrongRef<Canvas> &c : states.back().canvases)
|
for (const StrongRef<Canvas> &c : states.back().canvases)
|
||||||
canvases.push_back(c.get());
|
canvases.push_back(c.get());
|
||||||
|
|
||||||
return canvases;
|
return canvases;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Graphics::setColorMask(const bool mask[4])
|
void Graphics::setColorMask(ColorMask mask)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++)
|
glColorMask(mask.r, mask.g, mask.b, mask.a);
|
||||||
states.back().colorMask[i] = mask[i];
|
|
||||||
|
|
||||||
glColorMask(mask[0], mask[1], mask[2], mask[3]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool *Graphics::getColorMask() const
|
Graphics::ColorMask Graphics::getColorMask() const
|
||||||
{
|
{
|
||||||
return states.back().colorMask;
|
return states.back().colorMask;
|
||||||
}
|
}
|
||||||
@@ -990,6 +995,8 @@ bool Graphics::isWireframe() const
|
|||||||
|
|
||||||
void Graphics::print(const std::string &str, float x, float y , float angle, float sx, float sy, float ox, float oy, float kx, float ky)
|
void Graphics::print(const std::string &str, float x, float y , float angle, float sx, float sy, float ox, float oy, float kx, float ky)
|
||||||
{
|
{
|
||||||
|
checkSetDefaultFont();
|
||||||
|
|
||||||
DisplayState &state = states.back();
|
DisplayState &state = states.back();
|
||||||
|
|
||||||
if (state.font.get() != nullptr)
|
if (state.font.get() != nullptr)
|
||||||
@@ -998,6 +1005,8 @@ void Graphics::print(const std::string &str, float x, float y , float angle, flo
|
|||||||
|
|
||||||
void Graphics::printf(const std::string &str, float x, float y, float wrap, AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky)
|
void Graphics::printf(const std::string &str, float x, float y, float wrap, AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky)
|
||||||
{
|
{
|
||||||
|
checkSetDefaultFont();
|
||||||
|
|
||||||
DisplayState &state = states.back();
|
DisplayState &state = states.back();
|
||||||
|
|
||||||
if (state.font.get() == nullptr)
|
if (state.font.get() == nullptr)
|
||||||
@@ -1231,7 +1240,7 @@ love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool
|
|||||||
{
|
{
|
||||||
// Temporarily unbind the currently active canvas (glReadPixels reads the
|
// Temporarily unbind the currently active canvas (glReadPixels reads the
|
||||||
// active framebuffer, not the main one.)
|
// active framebuffer, not the main one.)
|
||||||
std::vector<Object::StrongRef<Canvas>> canvases = states.back().canvases;
|
std::vector<StrongRef<Canvas>> canvases = states.back().canvases;
|
||||||
setCanvas();
|
setCanvas();
|
||||||
|
|
||||||
int w = getWidth();
|
int w = getWidth();
|
||||||
@@ -1486,14 +1495,12 @@ Graphics::DisplayState::DisplayState()
|
|||||||
, scissorBox()
|
, scissorBox()
|
||||||
, font(nullptr)
|
, font(nullptr)
|
||||||
, shader(nullptr)
|
, shader(nullptr)
|
||||||
|
, colorMask({true, true, true, true})
|
||||||
, wireframe(false)
|
, wireframe(false)
|
||||||
, defaultFilter()
|
, defaultFilter()
|
||||||
, defaultMipmapFilter(Texture::FILTER_NONE)
|
, defaultMipmapFilter(Texture::FILTER_NONE)
|
||||||
, defaultMipmapSharpness(0.0f)
|
, defaultMipmapSharpness(0.0f)
|
||||||
{
|
{
|
||||||
// We should just directly initialize the array in the initializer list, but
|
|
||||||
// that feature of C++11 is broken in Visual Studio 2013...
|
|
||||||
colorMask[0] = colorMask[1] = colorMask[2] = colorMask[3] = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Graphics::DisplayState::DisplayState(const DisplayState &other)
|
Graphics::DisplayState::DisplayState(const DisplayState &other)
|
||||||
@@ -1510,13 +1517,12 @@ Graphics::DisplayState::DisplayState(const DisplayState &other)
|
|||||||
, font(other.font)
|
, font(other.font)
|
||||||
, shader(other.shader)
|
, shader(other.shader)
|
||||||
, canvases(other.canvases)
|
, canvases(other.canvases)
|
||||||
|
, colorMask(other.colorMask)
|
||||||
, wireframe(other.wireframe)
|
, wireframe(other.wireframe)
|
||||||
, defaultFilter(other.defaultFilter)
|
, defaultFilter(other.defaultFilter)
|
||||||
, defaultMipmapFilter(other.defaultMipmapFilter)
|
, defaultMipmapFilter(other.defaultMipmapFilter)
|
||||||
, defaultMipmapSharpness(other.defaultMipmapSharpness)
|
, defaultMipmapSharpness(other.defaultMipmapSharpness)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
colorMask[i] = other.colorMask[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Graphics::DisplayState::~DisplayState()
|
Graphics::DisplayState::~DisplayState()
|
||||||
@@ -1540,8 +1546,7 @@ Graphics::DisplayState &Graphics::DisplayState::operator = (const DisplayState &
|
|||||||
shader = other.shader;
|
shader = other.shader;
|
||||||
canvases = other.canvases;
|
canvases = other.canvases;
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
colorMask = other.colorMask;
|
||||||
colorMask[i] = other.colorMask[i];
|
|
||||||
|
|
||||||
wireframe = other.wireframe;
|
wireframe = other.wireframe;
|
||||||
|
|
||||||
|
|||||||
@@ -193,15 +193,8 @@ public:
|
|||||||
**/
|
**/
|
||||||
Color getBackgroundColor() const;
|
Color getBackgroundColor() const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the current font.
|
|
||||||
* @param font A Font object.
|
|
||||||
**/
|
|
||||||
void setFont(Font *font);
|
void setFont(Font *font);
|
||||||
/**
|
Font *getFont();
|
||||||
* Gets the current Font, or nil if none.
|
|
||||||
**/
|
|
||||||
Font *getFont() const;
|
|
||||||
|
|
||||||
void setShader(Shader *shader);
|
void setShader(Shader *shader);
|
||||||
void setShader();
|
void setShader();
|
||||||
@@ -210,7 +203,7 @@ public:
|
|||||||
|
|
||||||
void setCanvas(Canvas *canvas);
|
void setCanvas(Canvas *canvas);
|
||||||
void setCanvas(const std::vector<Canvas *> &canvases);
|
void setCanvas(const std::vector<Canvas *> &canvases);
|
||||||
void setCanvas(const std::vector<Object::StrongRef<Canvas>> &canvases);
|
void setCanvas(const std::vector<StrongRef<Canvas>> &canvases);
|
||||||
void setCanvas();
|
void setCanvas();
|
||||||
|
|
||||||
std::vector<Canvas *> getCanvas() const;
|
std::vector<Canvas *> getCanvas() const;
|
||||||
@@ -218,13 +211,12 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Sets the enabled color components when rendering.
|
* Sets the enabled color components when rendering.
|
||||||
**/
|
**/
|
||||||
void setColorMask(const bool mask[4]);
|
void setColorMask(ColorMask mask);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the current color mask.
|
* Gets the current color mask.
|
||||||
* Returns an array of 4 booleans representing the mask.
|
|
||||||
**/
|
**/
|
||||||
const bool *getColorMask() const;
|
ColorMask getColorMask() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the current blend mode.
|
* Sets the current blend mode.
|
||||||
@@ -447,40 +439,32 @@ private:
|
|||||||
|
|
||||||
struct DisplayState
|
struct DisplayState
|
||||||
{
|
{
|
||||||
// Colors.
|
|
||||||
Color color;
|
Color color;
|
||||||
Color backgroundColor;
|
Color backgroundColor;
|
||||||
|
|
||||||
// Blend mode.
|
|
||||||
BlendMode blendMode;
|
BlendMode blendMode;
|
||||||
|
|
||||||
// Line.
|
|
||||||
float lineWidth;
|
float lineWidth;
|
||||||
LineStyle lineStyle;
|
LineStyle lineStyle;
|
||||||
LineJoin lineJoin;
|
LineJoin lineJoin;
|
||||||
|
|
||||||
// Point.
|
|
||||||
float pointSize;
|
float pointSize;
|
||||||
PointStyle pointStyle;
|
PointStyle pointStyle;
|
||||||
|
|
||||||
// Scissor.
|
|
||||||
bool scissor;
|
bool scissor;
|
||||||
OpenGL::Viewport scissorBox;
|
OpenGL::Viewport scissorBox;
|
||||||
|
|
||||||
Object::StrongRef<Font> font;
|
StrongRef<Font> font;
|
||||||
Object::StrongRef<Shader> shader;
|
StrongRef<Shader> shader;
|
||||||
|
|
||||||
std::vector<Object::StrongRef<Canvas>> canvases;
|
std::vector<StrongRef<Canvas>> canvases;
|
||||||
|
|
||||||
// Color mask.
|
ColorMask colorMask;
|
||||||
bool colorMask[4];
|
|
||||||
|
|
||||||
bool wireframe;
|
bool wireframe;
|
||||||
|
|
||||||
// Default filter.
|
|
||||||
Texture::Filter defaultFilter;
|
Texture::Filter defaultFilter;
|
||||||
|
|
||||||
// Default mipmap filter and sharpness.
|
|
||||||
Texture::FilterMode defaultMipmapFilter;
|
Texture::FilterMode defaultMipmapFilter;
|
||||||
float defaultMipmapSharpness;
|
float defaultMipmapSharpness;
|
||||||
|
|
||||||
@@ -494,8 +478,12 @@ private:
|
|||||||
void restoreState(const DisplayState &s);
|
void restoreState(const DisplayState &s);
|
||||||
void restoreStateChecked(const DisplayState &s);
|
void restoreStateChecked(const DisplayState &s);
|
||||||
|
|
||||||
|
void checkSetDefaultFont();
|
||||||
|
|
||||||
love::window::Window *currentWindow;
|
love::window::Window *currentWindow;
|
||||||
|
|
||||||
|
StrongRef<Font> defaultFont;
|
||||||
|
|
||||||
std::vector<double> pixel_size_stack; // stores current size of a pixel (needed for line drawing)
|
std::vector<double> pixel_size_stack; // stores current size of a pixel (needed for line drawing)
|
||||||
|
|
||||||
int width;
|
int width;
|
||||||
|
|||||||
@@ -157,11 +157,11 @@ private:
|
|||||||
|
|
||||||
// The ImageData from which the texture is created. May be null if
|
// The ImageData from which the texture is created. May be null if
|
||||||
// Compressed image data was used to create the texture.
|
// Compressed image data was used to create the texture.
|
||||||
Object::StrongRef<love::image::ImageData> data;
|
StrongRef<love::image::ImageData> data;
|
||||||
|
|
||||||
// Or the Compressed Image Data from which the texture is created. May be
|
// Or the Compressed Image Data from which the texture is created. May be
|
||||||
// null if raw ImageData was used to create the texture.
|
// null if raw ImageData was used to create the texture.
|
||||||
Object::StrongRef<love::image::CompressedData> cdata;
|
StrongRef<love::image::CompressedData> cdata;
|
||||||
|
|
||||||
// Real dimensions of the texture, if it was auto-padded to POT size.
|
// Real dimensions of the texture, if it was auto-padded to POT size.
|
||||||
int paddedWidth, paddedHeight;
|
int paddedWidth, paddedHeight;
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ private:
|
|||||||
int range_min;
|
int range_min;
|
||||||
int range_max;
|
int range_max;
|
||||||
|
|
||||||
Object::StrongRef<Texture> texture;
|
StrongRef<Texture> texture;
|
||||||
|
|
||||||
// Whether the per-vertex colors are used when drawing.
|
// Whether the per-vertex colors are used when drawing.
|
||||||
bool colors_enabled;
|
bool colors_enabled;
|
||||||
|
|||||||
@@ -137,8 +137,6 @@ bool OpenGL::initContext()
|
|||||||
initMaxValues();
|
initMaxValues();
|
||||||
createDefaultTexture();
|
createDefaultTexture();
|
||||||
|
|
||||||
state.lastPseudoInstanceID = -1;
|
|
||||||
|
|
||||||
// Invalidate the cached matrices by setting some elements to NaN.
|
// Invalidate the cached matrices by setting some elements to NaN.
|
||||||
float nan = std::numeric_limits<float>::quiet_NaN();
|
float nan = std::numeric_limits<float>::quiet_NaN();
|
||||||
state.lastProjectionMatrix.setTranslation(nan, nan);
|
state.lastProjectionMatrix.setTranslation(nan, nan);
|
||||||
@@ -305,14 +303,6 @@ void OpenGL::prepareDraw()
|
|||||||
{
|
{
|
||||||
shader->checkSetScreenParams();
|
shader->checkSetScreenParams();
|
||||||
|
|
||||||
// Make sure the Instance ID variable is up-to-date when
|
|
||||||
// pseudo-instancing is used.
|
|
||||||
if (state.lastPseudoInstanceID != 0 && shader->hasVertexAttrib(ATTRIB_PSEUDO_INSTANCE_ID))
|
|
||||||
{
|
|
||||||
glVertexAttrib1f((GLuint) ATTRIB_PSEUDO_INSTANCE_ID, 0.0f);
|
|
||||||
state.lastPseudoInstanceID = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We need to make sure antialiased Canvases are properly resolved
|
// We need to make sure antialiased Canvases are properly resolved
|
||||||
// before sampling from their textures in a shader.
|
// before sampling from their textures in a shader.
|
||||||
// This is kind of a big hack. :(
|
// This is kind of a big hack. :(
|
||||||
@@ -379,62 +369,6 @@ void OpenGL::drawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, con
|
|||||||
++stats.drawCalls;
|
++stats.drawCalls;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenGL::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
|
|
||||||
{
|
|
||||||
Shader *shader = Shader::current;
|
|
||||||
|
|
||||||
if (GLAD_ARB_draw_instanced)
|
|
||||||
glDrawArraysInstancedARB(mode, first, count, primcount);
|
|
||||||
else if (GLAD_EXT_draw_instanced && GLAD_ES_VERSION_2_0)
|
|
||||||
glDrawArraysInstancedEXT(mode, first, count, primcount);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool shaderHasID = shader && shader->hasVertexAttrib(ATTRIB_PSEUDO_INSTANCE_ID);
|
|
||||||
|
|
||||||
// Pseudo-instancing fallback.
|
|
||||||
for (int i = 0; i < primcount; i++)
|
|
||||||
{
|
|
||||||
if (shaderHasID)
|
|
||||||
glVertexAttrib1f((GLuint) ATTRIB_PSEUDO_INSTANCE_ID, (GLfloat) i);
|
|
||||||
|
|
||||||
glDrawArrays(mode, first, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shaderHasID)
|
|
||||||
state.lastPseudoInstanceID = primcount - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
++stats.drawCalls;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGL::drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount)
|
|
||||||
{
|
|
||||||
Shader *shader = Shader::current;
|
|
||||||
|
|
||||||
if (GLAD_ARB_draw_instanced)
|
|
||||||
glDrawElementsInstancedARB(mode, count, type, indices, primcount);
|
|
||||||
else if (GLAD_EXT_draw_instanced && GLAD_ES_VERSION_2_0)
|
|
||||||
glDrawElementsInstancedEXT(mode, count, type, indices, primcount);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool shaderHasID = shader && shader->hasVertexAttrib(ATTRIB_PSEUDO_INSTANCE_ID);
|
|
||||||
|
|
||||||
// Pseudo-instancing fallback.
|
|
||||||
for (int i = 0; i < primcount; i++)
|
|
||||||
{
|
|
||||||
if (shaderHasID)
|
|
||||||
glVertexAttrib1f((GLuint) ATTRIB_PSEUDO_INSTANCE_ID, (GLfloat) i);
|
|
||||||
|
|
||||||
glDrawElements(mode, count, type, indices);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shaderHasID)
|
|
||||||
state.lastPseudoInstanceID = primcount - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
++stats.drawCalls;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGL::setColor(const Color &c)
|
void OpenGL::setColor(const Color &c)
|
||||||
{
|
{
|
||||||
if (GLAD_ES_VERSION_2_0)
|
if (GLAD_ES_VERSION_2_0)
|
||||||
|
|||||||
@@ -186,13 +186,6 @@ public:
|
|||||||
void drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
|
void drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
|
||||||
void drawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex);
|
void drawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex);
|
||||||
|
|
||||||
/**
|
|
||||||
* glDrawArraysInstanced and glDrawElementsInstanced with pseudo-instancing
|
|
||||||
* fallbacks. They also increment the draw-call counter (once per call).
|
|
||||||
**/
|
|
||||||
void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
|
|
||||||
void drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the current constant color.
|
* Sets the current constant color.
|
||||||
**/
|
**/
|
||||||
@@ -388,9 +381,6 @@ private:
|
|||||||
|
|
||||||
BlendState blend;
|
BlendState blend;
|
||||||
|
|
||||||
// The last ID value used for pseudo-instancing.
|
|
||||||
int lastPseudoInstanceID;
|
|
||||||
|
|
||||||
Matrix lastProjectionMatrix;
|
Matrix lastProjectionMatrix;
|
||||||
Matrix lastTransformMatrix;
|
Matrix lastTransformMatrix;
|
||||||
|
|
||||||
|
|||||||
@@ -749,7 +749,7 @@ std::vector<Quad *> ParticleSystem::getQuads() const
|
|||||||
std::vector<Quad *> quadlist;
|
std::vector<Quad *> quadlist;
|
||||||
quadlist.reserve(quads.size());
|
quadlist.reserve(quads.size());
|
||||||
|
|
||||||
for (const Object::StrongRef<Quad> &q : quads)
|
for (const StrongRef<Quad> &q : quads)
|
||||||
quadlist.push_back(q.get());
|
quadlist.push_back(q.get());
|
||||||
|
|
||||||
return quadlist;
|
return quadlist;
|
||||||
|
|||||||
@@ -580,7 +580,7 @@ protected:
|
|||||||
VertexIndex *ibo;
|
VertexIndex *ibo;
|
||||||
|
|
||||||
// The texture to be drawn.
|
// The texture to be drawn.
|
||||||
Object::StrongRef<Texture> texture;
|
StrongRef<Texture> texture;
|
||||||
|
|
||||||
// Whether the particle emitter is active.
|
// Whether the particle emitter is active.
|
||||||
bool active;
|
bool active;
|
||||||
@@ -660,7 +660,7 @@ protected:
|
|||||||
std::vector<Colorf> colors;
|
std::vector<Colorf> colors;
|
||||||
|
|
||||||
// Quads.
|
// Quads.
|
||||||
std::vector<Object::StrongRef<Quad>> quads;
|
std::vector<StrongRef<Quad>> quads;
|
||||||
|
|
||||||
bool relativeRotation;
|
bool relativeRotation;
|
||||||
|
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
void setColorv(Vertex *v, const Color &color);
|
void setColorv(Vertex *v, const Color &color);
|
||||||
|
|
||||||
Object::StrongRef<Texture> texture;
|
StrongRef<Texture> texture;
|
||||||
|
|
||||||
// Max number of sprites in the batch.
|
// Max number of sprites in the batch.
|
||||||
int size;
|
int size;
|
||||||
|
|||||||
@@ -252,11 +252,19 @@ int w_newQuad(lua_State *L)
|
|||||||
|
|
||||||
int w_newFont(lua_State *L)
|
int w_newFont(lua_State *L)
|
||||||
{
|
{
|
||||||
// Convert to Rasterizer, if necessary.
|
// Convert to Rasterizer, if necessary. Note that lua_isstring returns true
|
||||||
if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T))
|
// if the value is a number, which we rely on for the variant that uses the
|
||||||
|
// default Font rather than a font file.
|
||||||
|
if (lua_isnoneornil(L, 1) || lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T))
|
||||||
{
|
{
|
||||||
int idxs[] = {1, 2};
|
if (lua_isnone(L, 1))
|
||||||
luax_convobj(L, idxs, 2, "font", "newRasterizer");
|
lua_pushnil(L);
|
||||||
|
|
||||||
|
std::vector<int> idxs;
|
||||||
|
for (int i = 0; i < lua_gettop(L); i++)
|
||||||
|
idxs.push_back(i + 1);
|
||||||
|
|
||||||
|
luax_convobj(L, &idxs[0], (int) idxs.size(), "font", "newRasterizer");
|
||||||
}
|
}
|
||||||
|
|
||||||
love::font::Rasterizer *rasterizer = luax_checktype<love::font::Rasterizer>(L, 1, "Rasterizer", FONT_RASTERIZER_T);
|
love::font::Rasterizer *rasterizer = luax_checktype<love::font::Rasterizer>(L, 1, "Rasterizer", FONT_RASTERIZER_T);
|
||||||
@@ -640,6 +648,14 @@ int w_getBackgroundColor(lua_State *L)
|
|||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int w_setNewFont(lua_State *L)
|
||||||
|
{
|
||||||
|
int ret = w_newFont(L);
|
||||||
|
Font *font = luax_checktype<Font>(L, -1, "Font", GRAPHICS_FONT_T);
|
||||||
|
instance()->setFont(font);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int w_setFont(lua_State *L)
|
int w_setFont(lua_State *L)
|
||||||
{
|
{
|
||||||
Font *font = luax_checktype<Font>(L, 1, "Font", GRAPHICS_FONT_T);
|
Font *font = luax_checktype<Font>(L, 1, "Font", GRAPHICS_FONT_T);
|
||||||
@@ -649,10 +665,8 @@ int w_setFont(lua_State *L)
|
|||||||
|
|
||||||
int w_getFont(lua_State *L)
|
int w_getFont(lua_State *L)
|
||||||
{
|
{
|
||||||
Font *f = instance()->getFont();
|
Font *f = nullptr;
|
||||||
|
luax_catchexcept(L, [&](){ f = instance()->getFont(); });
|
||||||
if (f == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
luax_pushtype(L, "Font", GRAPHICS_FONT_T, f);
|
luax_pushtype(L, "Font", GRAPHICS_FONT_T, f);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -660,17 +674,19 @@ int w_getFont(lua_State *L)
|
|||||||
|
|
||||||
int w_setColorMask(lua_State *L)
|
int w_setColorMask(lua_State *L)
|
||||||
{
|
{
|
||||||
bool mask[4];
|
Graphics::ColorMask mask;
|
||||||
|
|
||||||
if (lua_gettop(L) <= 1 && lua_isnoneornil(L, 1))
|
if (lua_gettop(L) <= 1 && lua_isnoneornil(L, 1))
|
||||||
{
|
{
|
||||||
// Enable all color components if no argument is given.
|
// Enable all color components if no argument is given.
|
||||||
mask[0] = mask[1] = mask[2] = mask[3] = true;
|
mask.r = mask.g = mask.b = mask.a = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++)
|
mask.r = luax_toboolean(L, 1);
|
||||||
mask[i] = luax_toboolean(L, i + 1);
|
mask.g = luax_toboolean(L, 2);
|
||||||
|
mask.b = luax_toboolean(L, 3);
|
||||||
|
mask.a = luax_toboolean(L, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
instance()->setColorMask(mask);
|
instance()->setColorMask(mask);
|
||||||
@@ -680,10 +696,12 @@ int w_setColorMask(lua_State *L)
|
|||||||
|
|
||||||
int w_getColorMask(lua_State *L)
|
int w_getColorMask(lua_State *L)
|
||||||
{
|
{
|
||||||
const bool *mask = instance()->getColorMask();
|
Graphics::ColorMask mask = instance()->getColorMask();
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
luax_pushboolean(L, mask.r);
|
||||||
luax_pushboolean(L, mask[i]);
|
luax_pushboolean(L, mask.g);
|
||||||
|
luax_pushboolean(L, mask.b);
|
||||||
|
luax_pushboolean(L, mask.a);
|
||||||
|
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
@@ -1470,6 +1488,7 @@ static const luaL_Reg functions[] =
|
|||||||
{ "setBackgroundColor", w_setBackgroundColor },
|
{ "setBackgroundColor", w_setBackgroundColor },
|
||||||
{ "getBackgroundColor", w_getBackgroundColor },
|
{ "getBackgroundColor", w_getBackgroundColor },
|
||||||
|
|
||||||
|
{ "setNewFont", w_setNewFont },
|
||||||
{ "setFont", w_setFont },
|
{ "setFont", w_setFont },
|
||||||
{ "getFont", w_getFont },
|
{ "getFont", w_getFont },
|
||||||
|
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ int w_setColor(lua_State *L);
|
|||||||
int w_getColor(lua_State *L);
|
int w_getColor(lua_State *L);
|
||||||
int w_setBackgroundColor(lua_State *L);
|
int w_setBackgroundColor(lua_State *L);
|
||||||
int w_getBackgroundColor(lua_State *L);
|
int w_getBackgroundColor(lua_State *L);
|
||||||
|
int w_setNewFont(lua_State *L);
|
||||||
int w_setFont(lua_State *L);
|
int w_setFont(lua_State *L);
|
||||||
int w_getFont(lua_State *L);
|
int w_getFont(lua_State *L);
|
||||||
int w_setColorMask(lua_State *L);
|
int w_setColorMask(lua_State *L);
|
||||||
|
|||||||
@@ -27,18 +27,30 @@ namespace love
|
|||||||
namespace keyboard
|
namespace keyboard
|
||||||
{
|
{
|
||||||
|
|
||||||
bool Keyboard::getConstant(const char *in, Keyboard::Key &out)
|
bool Keyboard::getConstant(const char *in, Key &out)
|
||||||
{
|
{
|
||||||
return keys.find(in, out);
|
return keys.find(in, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Keyboard::getConstant(Keyboard::Key in, const char *&out)
|
bool Keyboard::getConstant(Key in, const char *&out)
|
||||||
{
|
{
|
||||||
return keys.find(in, out);
|
return keys.find(in, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Keyboard::getConstant(const char *in, Scancode &out)
|
||||||
|
{
|
||||||
|
return scancodes.find(in, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Keyboard::getConstant(Scancode in, const char *&out)
|
||||||
|
{
|
||||||
|
return scancodes.find(in, out);
|
||||||
|
}
|
||||||
|
|
||||||
StringMap<Keyboard::Key, Keyboard::KEY_MAX_ENUM>::Entry Keyboard::keyEntries[] =
|
StringMap<Keyboard::Key, Keyboard::KEY_MAX_ENUM>::Entry Keyboard::keyEntries[] =
|
||||||
{
|
{
|
||||||
|
{"unknown", Keyboard::KEY_UNKNOWN},
|
||||||
|
|
||||||
{"return", Keyboard::KEY_RETURN},
|
{"return", Keyboard::KEY_RETURN},
|
||||||
{"escape", Keyboard::KEY_ESCAPE},
|
{"escape", Keyboard::KEY_ESCAPE},
|
||||||
{"backspace", Keyboard::KEY_BACKSPACE},
|
{"backspace", Keyboard::KEY_BACKSPACE},
|
||||||
@@ -245,6 +257,269 @@ StringMap<Keyboard::Key, Keyboard::KEY_MAX_ENUM>::Entry Keyboard::keyEntries[] =
|
|||||||
|
|
||||||
StringMap<Keyboard::Key, Keyboard::KEY_MAX_ENUM> Keyboard::keys(Keyboard::keyEntries, sizeof(Keyboard::keyEntries));
|
StringMap<Keyboard::Key, Keyboard::KEY_MAX_ENUM> Keyboard::keys(Keyboard::keyEntries, sizeof(Keyboard::keyEntries));
|
||||||
|
|
||||||
|
StringMap<Keyboard::Scancode, Keyboard::SCANCODE_MAX_ENUM>::Entry Keyboard::scancodeEntries[] =
|
||||||
|
{
|
||||||
|
{"unknown", SCANCODE_UNKNOWN},
|
||||||
|
|
||||||
|
{"a", SCANCODE_A},
|
||||||
|
{"b", SCANCODE_B},
|
||||||
|
{"c", SCANCODE_C},
|
||||||
|
{"d", SCANCODE_D},
|
||||||
|
{"e", SCANCODE_E},
|
||||||
|
{"f", SCANCODE_F},
|
||||||
|
{"g", SCANCODE_G},
|
||||||
|
{"h", SCANCODE_H},
|
||||||
|
{"i", SCANCODE_I},
|
||||||
|
{"j", SCANCODE_J},
|
||||||
|
{"k", SCANCODE_K},
|
||||||
|
{"l", SCANCODE_L},
|
||||||
|
{"m", SCANCODE_M},
|
||||||
|
{"n", SCANCODE_N},
|
||||||
|
{"o", SCANCODE_O},
|
||||||
|
{"p", SCANCODE_P},
|
||||||
|
{"q", SCANCODE_Q},
|
||||||
|
{"r", SCANCODE_R},
|
||||||
|
{"s", SCANCODE_S},
|
||||||
|
{"t", SCANCODE_T},
|
||||||
|
{"u", SCANCODE_U},
|
||||||
|
{"v", SCANCODE_V},
|
||||||
|
{"w", SCANCODE_W},
|
||||||
|
{"x", SCANCODE_X},
|
||||||
|
{"y", SCANCODE_Y},
|
||||||
|
{"z", SCANCODE_Z},
|
||||||
|
|
||||||
|
{"1", SCANCODE_1},
|
||||||
|
{"2", SCANCODE_2},
|
||||||
|
{"3", SCANCODE_3},
|
||||||
|
{"4", SCANCODE_4},
|
||||||
|
{"5", SCANCODE_5},
|
||||||
|
{"6", SCANCODE_6},
|
||||||
|
{"7", SCANCODE_7},
|
||||||
|
{"8", SCANCODE_8},
|
||||||
|
{"9", SCANCODE_9},
|
||||||
|
{"0", SCANCODE_0},
|
||||||
|
|
||||||
|
{"return", SCANCODE_RETURN},
|
||||||
|
{"escape", SCANCODE_ESCAPE},
|
||||||
|
{"backspace", SCANCODE_BACKSPACE},
|
||||||
|
{"tab", SCANCODE_TAB},
|
||||||
|
{" ", SCANCODE_SPACE},
|
||||||
|
|
||||||
|
{"-", SCANCODE_MINUS},
|
||||||
|
{"=", SCANCODE_EQUALS},
|
||||||
|
{"[", SCANCODE_LEFTBRACKET},
|
||||||
|
{"]", SCANCODE_RIGHTBRACKET},
|
||||||
|
{"\\", SCANCODE_BACKSLASH},
|
||||||
|
{"nonus#", SCANCODE_NONUSHASH},
|
||||||
|
{";", SCANCODE_SEMICOLON},
|
||||||
|
{"'", SCANCODE_APOSTROPHE},
|
||||||
|
{"`", SCANCODE_GRAVE},
|
||||||
|
{",", SCANCODE_COMMA},
|
||||||
|
{".", SCANCODE_PERIOD},
|
||||||
|
{"/", SCANCODE_SLASH},
|
||||||
|
|
||||||
|
{"capslock", SCANCODE_CAPSLOCK},
|
||||||
|
|
||||||
|
{"f1", SCANCODE_F1},
|
||||||
|
{"f2", SCANCODE_F2},
|
||||||
|
{"f3", SCANCODE_F3},
|
||||||
|
{"f4", SCANCODE_F4},
|
||||||
|
{"f5", SCANCODE_F5},
|
||||||
|
{"f6", SCANCODE_F6},
|
||||||
|
{"f7", SCANCODE_F7},
|
||||||
|
{"f8", SCANCODE_F8},
|
||||||
|
{"f9", SCANCODE_F9},
|
||||||
|
{"f10", SCANCODE_F10},
|
||||||
|
{"f11", SCANCODE_F11},
|
||||||
|
{"f12", SCANCODE_F12},
|
||||||
|
|
||||||
|
{"printscreen", SCANCODE_PRINTSCREEN},
|
||||||
|
{"scrolllock", SCANCODE_SCROLLLOCK},
|
||||||
|
{"pause", SCANCODE_PAUSE},
|
||||||
|
{"insert", SCANCODE_INSERT},
|
||||||
|
{"home", SCANCODE_HOME},
|
||||||
|
{"pageup", SCANCODE_PAGEUP},
|
||||||
|
{"delete", SCANCODE_DELETE},
|
||||||
|
{"end", SCANCODE_END},
|
||||||
|
{"pagedown", SCANCODE_PAGEDOWN},
|
||||||
|
{"right", SCANCODE_RIGHT},
|
||||||
|
{"left", SCANCODE_LEFT},
|
||||||
|
{"down", SCANCODE_DOWN},
|
||||||
|
{"up", SCANCODE_UP},
|
||||||
|
|
||||||
|
{"numlock", SCANCODE_NUMLOCKCLEAR},
|
||||||
|
{"kp/", SCANCODE_KP_DIVIDE},
|
||||||
|
{"kp*", SCANCODE_KP_MULTIPLY},
|
||||||
|
{"kp-", SCANCODE_KP_MINUS},
|
||||||
|
{"kp+", SCANCODE_KP_PLUS},
|
||||||
|
{"kpenter", SCANCODE_KP_ENTER},
|
||||||
|
{"kp1", SCANCODE_KP_1},
|
||||||
|
{"kp2", SCANCODE_KP_2},
|
||||||
|
{"kp3", SCANCODE_KP_3},
|
||||||
|
{"kp4", SCANCODE_KP_4},
|
||||||
|
{"kp5", SCANCODE_KP_5},
|
||||||
|
{"kp6", SCANCODE_KP_6},
|
||||||
|
{"kp7", SCANCODE_KP_7},
|
||||||
|
{"kp8", SCANCODE_KP_8},
|
||||||
|
{"kp9", SCANCODE_KP_9},
|
||||||
|
{"kp0", SCANCODE_KP_0},
|
||||||
|
{"kp.", SCANCODE_KP_PERIOD},
|
||||||
|
|
||||||
|
{"nonusbackslash", SCANCODE_NONUSBACKSLASH},
|
||||||
|
{"application", SCANCODE_APPLICATION},
|
||||||
|
{"power", SCANCODE_POWER},
|
||||||
|
{"=", SCANCODE_KP_EQUALS},
|
||||||
|
{"f13", SCANCODE_F13},
|
||||||
|
{"f14", SCANCODE_F14},
|
||||||
|
{"f15", SCANCODE_F15},
|
||||||
|
{"f16", SCANCODE_F16},
|
||||||
|
{"f17", SCANCODE_F17},
|
||||||
|
{"f18", SCANCODE_F18},
|
||||||
|
{"f19", SCANCODE_F19},
|
||||||
|
{"f20", SCANCODE_F20},
|
||||||
|
{"f21", SCANCODE_F21},
|
||||||
|
{"f22", SCANCODE_F22},
|
||||||
|
{"f23", SCANCODE_F23},
|
||||||
|
{"f24", SCANCODE_F24},
|
||||||
|
{"execute", SCANCODE_EXECUTE},
|
||||||
|
{"help", SCANCODE_HELP},
|
||||||
|
{"menu", SCANCODE_MENU},
|
||||||
|
{"select", SCANCODE_SELECT},
|
||||||
|
{"stop", SCANCODE_STOP},
|
||||||
|
{"again", SCANCODE_AGAIN},
|
||||||
|
{"undo", SCANCODE_UNDO},
|
||||||
|
{"cut", SCANCODE_CUT},
|
||||||
|
{"copy", SCANCODE_COPY},
|
||||||
|
{"paste", SCANCODE_PASTE},
|
||||||
|
{"find", SCANCODE_FIND},
|
||||||
|
{"mute", SCANCODE_MUTE},
|
||||||
|
{"volumeup", SCANCODE_VOLUMEUP},
|
||||||
|
{"volumedown", SCANCODE_VOLUMEDOWN},
|
||||||
|
{"kp,", SCANCODE_KP_COMMA},
|
||||||
|
{"kp=400", SCANCODE_KP_EQUALSAS400},
|
||||||
|
|
||||||
|
{"international1", SCANCODE_INTERNATIONAL1},
|
||||||
|
{"international2", SCANCODE_INTERNATIONAL2},
|
||||||
|
{"international3", SCANCODE_INTERNATIONAL3},
|
||||||
|
{"international4", SCANCODE_INTERNATIONAL4},
|
||||||
|
{"international5", SCANCODE_INTERNATIONAL5},
|
||||||
|
{"international6", SCANCODE_INTERNATIONAL6},
|
||||||
|
{"international7", SCANCODE_INTERNATIONAL7},
|
||||||
|
{"international8", SCANCODE_INTERNATIONAL8},
|
||||||
|
{"international9", SCANCODE_INTERNATIONAL9},
|
||||||
|
{"lang1", SCANCODE_LANG1},
|
||||||
|
{"lang2", SCANCODE_LANG2},
|
||||||
|
{"lang3", SCANCODE_LANG3},
|
||||||
|
{"lang4", SCANCODE_LANG4},
|
||||||
|
{"lang5", SCANCODE_LANG5},
|
||||||
|
{"lang6", SCANCODE_LANG6},
|
||||||
|
{"lang7", SCANCODE_LANG7},
|
||||||
|
{"lang8", SCANCODE_LANG8},
|
||||||
|
{"lang9", SCANCODE_LANG9},
|
||||||
|
|
||||||
|
{"alterase", SCANCODE_ALTERASE},
|
||||||
|
{"sysreq", SCANCODE_SYSREQ},
|
||||||
|
{"cancel", SCANCODE_CANCEL},
|
||||||
|
{"clear", SCANCODE_CLEAR},
|
||||||
|
{"prior", SCANCODE_PRIOR},
|
||||||
|
{"return2", SCANCODE_RETURN2},
|
||||||
|
{"separator", SCANCODE_SEPARATOR},
|
||||||
|
{"out", SCANCODE_OUT},
|
||||||
|
{"oper", SCANCODE_OPER},
|
||||||
|
{"clearagain", SCANCODE_CLEARAGAIN},
|
||||||
|
{"crsel", SCANCODE_CRSEL},
|
||||||
|
{"exsel", SCANCODE_EXSEL},
|
||||||
|
|
||||||
|
{"kp00", SCANCODE_KP_00},
|
||||||
|
{"kp000", SCANCODE_KP_000},
|
||||||
|
{"thsousandsseparator", SCANCODE_THOUSANDSSEPARATOR},
|
||||||
|
{"decimalseparator", SCANCODE_DECIMALSEPARATOR},
|
||||||
|
{"currencyunit", SCANCODE_CURRENCYUNIT},
|
||||||
|
{"currencysubunit", SCANCODE_CURRENCYSUBUNIT},
|
||||||
|
{"kp(", SCANCODE_KP_LEFTPAREN},
|
||||||
|
{"kp)", SCANCODE_KP_RIGHTPAREN},
|
||||||
|
{"kp{", SCANCODE_KP_LEFTBRACE},
|
||||||
|
{"kp}", SCANCODE_KP_RIGHTBRACE},
|
||||||
|
{"kptab", SCANCODE_KP_TAB},
|
||||||
|
{"kpbackspace", SCANCODE_KP_BACKSPACE},
|
||||||
|
{"kpa", SCANCODE_KP_A},
|
||||||
|
{"kpb", SCANCODE_KP_B},
|
||||||
|
{"kpc", SCANCODE_KP_C},
|
||||||
|
{"kpd", SCANCODE_KP_D},
|
||||||
|
{"kpe", SCANCODE_KP_E},
|
||||||
|
{"kpf", SCANCODE_KP_F},
|
||||||
|
{"kpxor", SCANCODE_KP_XOR},
|
||||||
|
{"kpower", SCANCODE_KP_POWER},
|
||||||
|
{"kp%", SCANCODE_KP_PERCENT},
|
||||||
|
{"kp<", SCANCODE_KP_LESS},
|
||||||
|
{"kp>", SCANCODE_KP_GREATER},
|
||||||
|
{"kp&", SCANCODE_KP_AMPERSAND},
|
||||||
|
{"kp&&", SCANCODE_KP_DBLAMPERSAND},
|
||||||
|
{"kp|", SCANCODE_KP_VERTICALBAR},
|
||||||
|
{"kp||", SCANCODE_KP_DBLVERTICALBAR},
|
||||||
|
{"kp:", SCANCODE_KP_COLON},
|
||||||
|
{"kp#", SCANCODE_KP_HASH},
|
||||||
|
{"kp ", SCANCODE_KP_SPACE},
|
||||||
|
{"kp@", SCANCODE_KP_AT},
|
||||||
|
{"kp!", SCANCODE_KP_EXCLAM},
|
||||||
|
{"kpmemstore", SCANCODE_KP_MEMSTORE},
|
||||||
|
{"kpmemrecall", SCANCODE_KP_MEMRECALL},
|
||||||
|
{"kpmemclear", SCANCODE_KP_MEMCLEAR},
|
||||||
|
{"kpmem+", SCANCODE_KP_MEMADD},
|
||||||
|
{"kpmem-", SCANCODE_KP_MEMSUBTRACT},
|
||||||
|
{"kpmem*", SCANCODE_KP_MEMMULTIPLY},
|
||||||
|
{"kpmem/", SCANCODE_KP_MEMDIVIDE},
|
||||||
|
{"kp+-", SCANCODE_KP_PLUSMINUS},
|
||||||
|
{"kpclear", SCANCODE_KP_CLEAR},
|
||||||
|
{"kpclearentry", SCANCODE_KP_CLEARENTRY},
|
||||||
|
{"kpbinary", SCANCODE_KP_BINARY},
|
||||||
|
{"kpoctal", SCANCODE_KP_OCTAL},
|
||||||
|
{"kpdecimal", SCANCODE_KP_DECIMAL},
|
||||||
|
{"kphex", SCANCODE_KP_HEXADECIMAL},
|
||||||
|
|
||||||
|
{"lctrl", SCANCODE_LCTRL},
|
||||||
|
{"lshift", SCANCODE_LSHIFT},
|
||||||
|
{"lalt", SCANCODE_LALT},
|
||||||
|
{"lgui", SCANCODE_LGUI},
|
||||||
|
{"rctrl", SCANCODE_RCTRL},
|
||||||
|
{"rshift", SCANCODE_RSHIFT},
|
||||||
|
{"ralt", SCANCODE_RALT},
|
||||||
|
{"rgui", SCANCODE_RGUI},
|
||||||
|
|
||||||
|
{"mode", SCANCODE_MODE},
|
||||||
|
|
||||||
|
{"audionext", SCANCODE_AUDIONEXT},
|
||||||
|
{"audioprev", SCANCODE_AUDIOPREV},
|
||||||
|
{"audiostop", SCANCODE_AUDIOSTOP},
|
||||||
|
{"audioplay", SCANCODE_AUDIOPLAY},
|
||||||
|
{"audiomute", SCANCODE_AUDIOMUTE},
|
||||||
|
{"mediaselect", SCANCODE_MEDIASELECT},
|
||||||
|
{"www", SCANCODE_WWW},
|
||||||
|
{"mail", SCANCODE_MAIL},
|
||||||
|
{"calculator", SCANCODE_CALCULATOR},
|
||||||
|
{"computer", SCANCODE_COMPUTER},
|
||||||
|
{"acsearch", SCANCODE_AC_SEARCH},
|
||||||
|
{"achome", SCANCODE_AC_HOME},
|
||||||
|
{"acback", SCANCODE_AC_BACK},
|
||||||
|
{"acforward", SCANCODE_AC_FORWARD},
|
||||||
|
{"acstop", SCANCODE_AC_STOP},
|
||||||
|
{"acrefresh", SCANCODE_AC_REFRESH},
|
||||||
|
{"acbookmarks", SCANCODE_AC_BOOKMARKS},
|
||||||
|
|
||||||
|
{"brightnessdown", SCANCODE_BRIGHTNESSDOWN},
|
||||||
|
{"brightnessup", SCANCODE_BRIGHTNESSUP},
|
||||||
|
{"displayswitch", SCANCODE_DISPLAYSWITCH},
|
||||||
|
{"kbdillumtoggle", SCANCODE_KBDILLUMTOGGLE},
|
||||||
|
{"kbdillumdown", SCANCODE_KBDILLUMDOWN},
|
||||||
|
{"kbdillumup", SCANCODE_KBDILLUMUP},
|
||||||
|
{"eject", SCANCODE_EJECT},
|
||||||
|
{"sleep", SCANCODE_SLEEP},
|
||||||
|
|
||||||
|
{"app1", SCANCODE_APP1},
|
||||||
|
{"app2", SCANCODE_APP2},
|
||||||
|
};
|
||||||
|
|
||||||
|
StringMap<Keyboard::Scancode, Keyboard::SCANCODE_MAX_ENUM> Keyboard::scancodes(Keyboard::scancodeEntries, sizeof(Keyboard::scancodeEntries));
|
||||||
|
|
||||||
} // keyboard
|
} // keyboard
|
||||||
} // love
|
} // love
|
||||||
|
|||||||
@@ -34,6 +34,9 @@ class Keyboard : public Module
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keyboard keys. They are dependent on the current layout of the keyboard.
|
||||||
|
**/
|
||||||
enum Key
|
enum Key
|
||||||
{
|
{
|
||||||
KEY_UNKNOWN,
|
KEY_UNKNOWN,
|
||||||
@@ -245,6 +248,275 @@ public:
|
|||||||
KEY_MAX_ENUM
|
KEY_MAX_ENUM
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scancodes represent physical keys independent of the current layout.
|
||||||
|
* Their names may not match the names of the keys printed on the keyboard.
|
||||||
|
* Some of them are very esoteric...
|
||||||
|
**/
|
||||||
|
enum Scancode
|
||||||
|
{
|
||||||
|
SCANCODE_UNKNOWN,
|
||||||
|
|
||||||
|
SCANCODE_A,
|
||||||
|
SCANCODE_B,
|
||||||
|
SCANCODE_C,
|
||||||
|
SCANCODE_D,
|
||||||
|
SCANCODE_E,
|
||||||
|
SCANCODE_F,
|
||||||
|
SCANCODE_G,
|
||||||
|
SCANCODE_H,
|
||||||
|
SCANCODE_I,
|
||||||
|
SCANCODE_J,
|
||||||
|
SCANCODE_K,
|
||||||
|
SCANCODE_L,
|
||||||
|
SCANCODE_M,
|
||||||
|
SCANCODE_N,
|
||||||
|
SCANCODE_O,
|
||||||
|
SCANCODE_P,
|
||||||
|
SCANCODE_Q,
|
||||||
|
SCANCODE_R,
|
||||||
|
SCANCODE_S,
|
||||||
|
SCANCODE_T,
|
||||||
|
SCANCODE_U,
|
||||||
|
SCANCODE_V,
|
||||||
|
SCANCODE_W,
|
||||||
|
SCANCODE_X,
|
||||||
|
SCANCODE_Y,
|
||||||
|
SCANCODE_Z,
|
||||||
|
|
||||||
|
SCANCODE_1,
|
||||||
|
SCANCODE_2,
|
||||||
|
SCANCODE_3,
|
||||||
|
SCANCODE_4,
|
||||||
|
SCANCODE_5,
|
||||||
|
SCANCODE_6,
|
||||||
|
SCANCODE_7,
|
||||||
|
SCANCODE_8,
|
||||||
|
SCANCODE_9,
|
||||||
|
SCANCODE_0,
|
||||||
|
|
||||||
|
SCANCODE_RETURN,
|
||||||
|
SCANCODE_ESCAPE,
|
||||||
|
SCANCODE_BACKSPACE,
|
||||||
|
SCANCODE_TAB,
|
||||||
|
SCANCODE_SPACE,
|
||||||
|
|
||||||
|
SCANCODE_MINUS,
|
||||||
|
SCANCODE_EQUALS,
|
||||||
|
SCANCODE_LEFTBRACKET,
|
||||||
|
SCANCODE_RIGHTBRACKET,
|
||||||
|
SCANCODE_BACKSLASH,
|
||||||
|
SCANCODE_NONUSHASH,
|
||||||
|
SCANCODE_SEMICOLON,
|
||||||
|
SCANCODE_APOSTROPHE,
|
||||||
|
SCANCODE_GRAVE,
|
||||||
|
SCANCODE_COMMA,
|
||||||
|
SCANCODE_PERIOD,
|
||||||
|
SCANCODE_SLASH,
|
||||||
|
|
||||||
|
SCANCODE_CAPSLOCK,
|
||||||
|
|
||||||
|
SCANCODE_F1,
|
||||||
|
SCANCODE_F2,
|
||||||
|
SCANCODE_F3,
|
||||||
|
SCANCODE_F4,
|
||||||
|
SCANCODE_F5,
|
||||||
|
SCANCODE_F6,
|
||||||
|
SCANCODE_F7,
|
||||||
|
SCANCODE_F8,
|
||||||
|
SCANCODE_F9,
|
||||||
|
SCANCODE_F10,
|
||||||
|
SCANCODE_F11,
|
||||||
|
SCANCODE_F12,
|
||||||
|
|
||||||
|
SCANCODE_PRINTSCREEN,
|
||||||
|
SCANCODE_SCROLLLOCK,
|
||||||
|
SCANCODE_PAUSE,
|
||||||
|
SCANCODE_INSERT,
|
||||||
|
SCANCODE_HOME,
|
||||||
|
SCANCODE_PAGEUP,
|
||||||
|
SCANCODE_DELETE,
|
||||||
|
SCANCODE_END,
|
||||||
|
SCANCODE_PAGEDOWN,
|
||||||
|
SCANCODE_RIGHT,
|
||||||
|
SCANCODE_LEFT,
|
||||||
|
SCANCODE_DOWN,
|
||||||
|
SCANCODE_UP,
|
||||||
|
|
||||||
|
SCANCODE_NUMLOCKCLEAR,
|
||||||
|
SCANCODE_KP_DIVIDE,
|
||||||
|
SCANCODE_KP_MULTIPLY,
|
||||||
|
SCANCODE_KP_MINUS,
|
||||||
|
SCANCODE_KP_PLUS,
|
||||||
|
SCANCODE_KP_ENTER,
|
||||||
|
SCANCODE_KP_1,
|
||||||
|
SCANCODE_KP_2,
|
||||||
|
SCANCODE_KP_3,
|
||||||
|
SCANCODE_KP_4,
|
||||||
|
SCANCODE_KP_5,
|
||||||
|
SCANCODE_KP_6,
|
||||||
|
SCANCODE_KP_7,
|
||||||
|
SCANCODE_KP_8,
|
||||||
|
SCANCODE_KP_9,
|
||||||
|
SCANCODE_KP_0,
|
||||||
|
SCANCODE_KP_PERIOD,
|
||||||
|
|
||||||
|
SCANCODE_NONUSBACKSLASH,
|
||||||
|
SCANCODE_APPLICATION,
|
||||||
|
SCANCODE_POWER,
|
||||||
|
SCANCODE_KP_EQUALS,
|
||||||
|
SCANCODE_F13,
|
||||||
|
SCANCODE_F14,
|
||||||
|
SCANCODE_F15,
|
||||||
|
SCANCODE_F16,
|
||||||
|
SCANCODE_F17,
|
||||||
|
SCANCODE_F18,
|
||||||
|
SCANCODE_F19,
|
||||||
|
SCANCODE_F20,
|
||||||
|
SCANCODE_F21,
|
||||||
|
SCANCODE_F22,
|
||||||
|
SCANCODE_F23,
|
||||||
|
SCANCODE_F24,
|
||||||
|
SCANCODE_EXECUTE,
|
||||||
|
SCANCODE_HELP,
|
||||||
|
SCANCODE_MENU,
|
||||||
|
SCANCODE_SELECT,
|
||||||
|
SCANCODE_STOP,
|
||||||
|
SCANCODE_AGAIN,
|
||||||
|
SCANCODE_UNDO,
|
||||||
|
SCANCODE_CUT,
|
||||||
|
SCANCODE_COPY,
|
||||||
|
SCANCODE_PASTE,
|
||||||
|
SCANCODE_FIND,
|
||||||
|
SCANCODE_MUTE,
|
||||||
|
SCANCODE_VOLUMEUP,
|
||||||
|
SCANCODE_VOLUMEDOWN,
|
||||||
|
SCANCODE_KP_COMMA,
|
||||||
|
SCANCODE_KP_EQUALSAS400,
|
||||||
|
|
||||||
|
SCANCODE_INTERNATIONAL1,
|
||||||
|
SCANCODE_INTERNATIONAL2,
|
||||||
|
SCANCODE_INTERNATIONAL3,
|
||||||
|
SCANCODE_INTERNATIONAL4,
|
||||||
|
SCANCODE_INTERNATIONAL5,
|
||||||
|
SCANCODE_INTERNATIONAL6,
|
||||||
|
SCANCODE_INTERNATIONAL7,
|
||||||
|
SCANCODE_INTERNATIONAL8,
|
||||||
|
SCANCODE_INTERNATIONAL9,
|
||||||
|
SCANCODE_LANG1,
|
||||||
|
SCANCODE_LANG2,
|
||||||
|
SCANCODE_LANG3,
|
||||||
|
SCANCODE_LANG4,
|
||||||
|
SCANCODE_LANG5,
|
||||||
|
SCANCODE_LANG6,
|
||||||
|
SCANCODE_LANG7,
|
||||||
|
SCANCODE_LANG8,
|
||||||
|
SCANCODE_LANG9,
|
||||||
|
|
||||||
|
SCANCODE_ALTERASE,
|
||||||
|
SCANCODE_SYSREQ,
|
||||||
|
SCANCODE_CANCEL,
|
||||||
|
SCANCODE_CLEAR,
|
||||||
|
SCANCODE_PRIOR,
|
||||||
|
SCANCODE_RETURN2,
|
||||||
|
SCANCODE_SEPARATOR,
|
||||||
|
SCANCODE_OUT,
|
||||||
|
SCANCODE_OPER,
|
||||||
|
SCANCODE_CLEARAGAIN,
|
||||||
|
SCANCODE_CRSEL,
|
||||||
|
SCANCODE_EXSEL,
|
||||||
|
|
||||||
|
SCANCODE_KP_00,
|
||||||
|
SCANCODE_KP_000,
|
||||||
|
SCANCODE_THOUSANDSSEPARATOR,
|
||||||
|
SCANCODE_DECIMALSEPARATOR,
|
||||||
|
SCANCODE_CURRENCYUNIT,
|
||||||
|
SCANCODE_CURRENCYSUBUNIT,
|
||||||
|
SCANCODE_KP_LEFTPAREN,
|
||||||
|
SCANCODE_KP_RIGHTPAREN,
|
||||||
|
SCANCODE_KP_LEFTBRACE,
|
||||||
|
SCANCODE_KP_RIGHTBRACE,
|
||||||
|
SCANCODE_KP_TAB,
|
||||||
|
SCANCODE_KP_BACKSPACE,
|
||||||
|
SCANCODE_KP_A,
|
||||||
|
SCANCODE_KP_B,
|
||||||
|
SCANCODE_KP_C,
|
||||||
|
SCANCODE_KP_D,
|
||||||
|
SCANCODE_KP_E,
|
||||||
|
SCANCODE_KP_F,
|
||||||
|
SCANCODE_KP_XOR,
|
||||||
|
SCANCODE_KP_POWER,
|
||||||
|
SCANCODE_KP_PERCENT,
|
||||||
|
SCANCODE_KP_LESS,
|
||||||
|
SCANCODE_KP_GREATER,
|
||||||
|
SCANCODE_KP_AMPERSAND,
|
||||||
|
SCANCODE_KP_DBLAMPERSAND,
|
||||||
|
SCANCODE_KP_VERTICALBAR,
|
||||||
|
SCANCODE_KP_DBLVERTICALBAR,
|
||||||
|
SCANCODE_KP_COLON,
|
||||||
|
SCANCODE_KP_HASH,
|
||||||
|
SCANCODE_KP_SPACE,
|
||||||
|
SCANCODE_KP_AT,
|
||||||
|
SCANCODE_KP_EXCLAM,
|
||||||
|
SCANCODE_KP_MEMSTORE,
|
||||||
|
SCANCODE_KP_MEMRECALL,
|
||||||
|
SCANCODE_KP_MEMCLEAR,
|
||||||
|
SCANCODE_KP_MEMADD,
|
||||||
|
SCANCODE_KP_MEMSUBTRACT,
|
||||||
|
SCANCODE_KP_MEMMULTIPLY,
|
||||||
|
SCANCODE_KP_MEMDIVIDE,
|
||||||
|
SCANCODE_KP_PLUSMINUS,
|
||||||
|
SCANCODE_KP_CLEAR,
|
||||||
|
SCANCODE_KP_CLEARENTRY,
|
||||||
|
SCANCODE_KP_BINARY,
|
||||||
|
SCANCODE_KP_OCTAL,
|
||||||
|
SCANCODE_KP_DECIMAL,
|
||||||
|
SCANCODE_KP_HEXADECIMAL,
|
||||||
|
|
||||||
|
SCANCODE_LCTRL,
|
||||||
|
SCANCODE_LSHIFT,
|
||||||
|
SCANCODE_LALT,
|
||||||
|
SCANCODE_LGUI,
|
||||||
|
SCANCODE_RCTRL,
|
||||||
|
SCANCODE_RSHIFT,
|
||||||
|
SCANCODE_RALT,
|
||||||
|
SCANCODE_RGUI,
|
||||||
|
|
||||||
|
SCANCODE_MODE,
|
||||||
|
|
||||||
|
SCANCODE_AUDIONEXT,
|
||||||
|
SCANCODE_AUDIOPREV,
|
||||||
|
SCANCODE_AUDIOSTOP,
|
||||||
|
SCANCODE_AUDIOPLAY,
|
||||||
|
SCANCODE_AUDIOMUTE,
|
||||||
|
SCANCODE_MEDIASELECT,
|
||||||
|
SCANCODE_WWW,
|
||||||
|
SCANCODE_MAIL,
|
||||||
|
SCANCODE_CALCULATOR,
|
||||||
|
SCANCODE_COMPUTER,
|
||||||
|
SCANCODE_AC_SEARCH,
|
||||||
|
SCANCODE_AC_HOME,
|
||||||
|
SCANCODE_AC_BACK,
|
||||||
|
SCANCODE_AC_FORWARD,
|
||||||
|
SCANCODE_AC_STOP,
|
||||||
|
SCANCODE_AC_REFRESH,
|
||||||
|
SCANCODE_AC_BOOKMARKS,
|
||||||
|
|
||||||
|
SCANCODE_BRIGHTNESSDOWN,
|
||||||
|
SCANCODE_BRIGHTNESSUP,
|
||||||
|
SCANCODE_DISPLAYSWITCH,
|
||||||
|
SCANCODE_KBDILLUMTOGGLE,
|
||||||
|
SCANCODE_KBDILLUMDOWN,
|
||||||
|
SCANCODE_KBDILLUMUP,
|
||||||
|
SCANCODE_EJECT,
|
||||||
|
SCANCODE_SLEEP,
|
||||||
|
|
||||||
|
SCANCODE_APP1,
|
||||||
|
SCANCODE_APP2,
|
||||||
|
|
||||||
|
SCANCODE_MAX_ENUM
|
||||||
|
};
|
||||||
|
|
||||||
virtual ~Keyboard() {}
|
virtual ~Keyboard() {}
|
||||||
|
|
||||||
// Implements Module.
|
// Implements Module.
|
||||||
@@ -269,6 +541,18 @@ public:
|
|||||||
**/
|
**/
|
||||||
virtual bool isDown(Key *keylist) const = 0;
|
virtual bool isDown(Key *keylist) const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the key corresponding to the specified scancode according to the
|
||||||
|
* current keyboard layout.
|
||||||
|
**/
|
||||||
|
virtual Key getKeyFromScancode(Scancode scancode) const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the scancode corresponding to the specified key according to the
|
||||||
|
* current keyboard layout.
|
||||||
|
**/
|
||||||
|
virtual Scancode getScancodeFromKey(Key key) const = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets whether text input events should be sent
|
* Sets whether text input events should be sent
|
||||||
* @param enable Whether to send text input events.
|
* @param enable Whether to send text input events.
|
||||||
@@ -293,13 +577,19 @@ public:
|
|||||||
virtual bool hasScreenKeyboard() const = 0;
|
virtual bool hasScreenKeyboard() const = 0;
|
||||||
|
|
||||||
static bool getConstant(const char *in, Key &out);
|
static bool getConstant(const char *in, Key &out);
|
||||||
static bool getConstant(Key in, const char *&out);
|
static bool getConstant(Key in, const char *&out);
|
||||||
|
|
||||||
|
static bool getConstant(const char *in, Scancode &out);
|
||||||
|
static bool getConstant(Scancode in, const char *&out);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
static StringMap<Key, KEY_MAX_ENUM>::Entry keyEntries[];
|
static StringMap<Key, KEY_MAX_ENUM>::Entry keyEntries[];
|
||||||
static StringMap<Key, KEY_MAX_ENUM> keys;
|
static StringMap<Key, KEY_MAX_ENUM> keys;
|
||||||
|
|
||||||
|
static StringMap<Scancode, SCANCODE_MAX_ENUM>::Entry scancodeEntries[];
|
||||||
|
static StringMap<Scancode, SCANCODE_MAX_ENUM> scancodes;
|
||||||
|
|
||||||
}; // Keyboard
|
}; // Keyboard
|
||||||
|
|
||||||
} // keyboard
|
} // keyboard
|
||||||
|
|||||||
@@ -61,6 +61,37 @@ bool Keyboard::isDown(Key *keylist) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Keyboard::Key Keyboard::getKeyFromScancode(Scancode scancode) const
|
||||||
|
{
|
||||||
|
SDL_Scancode sdlscancode = SDL_SCANCODE_UNKNOWN;
|
||||||
|
scancodes.find(scancode, sdlscancode);
|
||||||
|
|
||||||
|
SDL_Keycode sdlkey = SDL_GetKeyFromScancode(sdlscancode);
|
||||||
|
|
||||||
|
for (int i = 0; i < KEY_MAX_ENUM; i++)
|
||||||
|
{
|
||||||
|
if (keymap[i] == sdlkey)
|
||||||
|
return (Key) i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return KEY_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
Keyboard::Scancode Keyboard::getScancodeFromKey(Key key) const
|
||||||
|
{
|
||||||
|
Scancode scancode = SCANCODE_UNKNOWN;
|
||||||
|
|
||||||
|
if (key != KEY_MAX_ENUM)
|
||||||
|
{
|
||||||
|
SDL_Keycode sdlkey = keymap[key];
|
||||||
|
|
||||||
|
SDL_Scancode sdlscancode = SDL_GetScancodeFromKey(sdlkey);
|
||||||
|
scancodes.find(sdlscancode, scancode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return scancode;
|
||||||
|
}
|
||||||
|
|
||||||
void Keyboard::setTextInput(bool enable)
|
void Keyboard::setTextInput(bool enable)
|
||||||
{
|
{
|
||||||
if (enable)
|
if (enable)
|
||||||
@@ -302,6 +333,270 @@ const SDL_Keycode *Keyboard::createKeyMap()
|
|||||||
|
|
||||||
const SDL_Keycode *Keyboard::keymap = Keyboard::createKeyMap();
|
const SDL_Keycode *Keyboard::keymap = Keyboard::createKeyMap();
|
||||||
|
|
||||||
|
EnumMap<Keyboard::Scancode, SDL_Scancode, SDL_NUM_SCANCODES>::Entry Keyboard::scancodeEntries[] =
|
||||||
|
{
|
||||||
|
{SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN},
|
||||||
|
|
||||||
|
{SCANCODE_A, SDL_SCANCODE_A},
|
||||||
|
{SCANCODE_B, SDL_SCANCODE_B},
|
||||||
|
{SCANCODE_C, SDL_SCANCODE_C},
|
||||||
|
{SCANCODE_D, SDL_SCANCODE_D},
|
||||||
|
{SCANCODE_E, SDL_SCANCODE_E},
|
||||||
|
{SCANCODE_F, SDL_SCANCODE_F},
|
||||||
|
{SCANCODE_G, SDL_SCANCODE_G},
|
||||||
|
{SCANCODE_H, SDL_SCANCODE_H},
|
||||||
|
{SCANCODE_I, SDL_SCANCODE_I},
|
||||||
|
{SCANCODE_J, SDL_SCANCODE_J},
|
||||||
|
{SCANCODE_K, SDL_SCANCODE_K},
|
||||||
|
{SCANCODE_L, SDL_SCANCODE_L},
|
||||||
|
{SCANCODE_M, SDL_SCANCODE_M},
|
||||||
|
{SCANCODE_N, SDL_SCANCODE_N},
|
||||||
|
{SCANCODE_O, SDL_SCANCODE_O},
|
||||||
|
{SCANCODE_P, SDL_SCANCODE_P},
|
||||||
|
{SCANCODE_Q, SDL_SCANCODE_Q},
|
||||||
|
{SCANCODE_R, SDL_SCANCODE_R},
|
||||||
|
{SCANCODE_S, SDL_SCANCODE_S},
|
||||||
|
{SCANCODE_T, SDL_SCANCODE_T},
|
||||||
|
{SCANCODE_U, SDL_SCANCODE_U},
|
||||||
|
{SCANCODE_V, SDL_SCANCODE_V},
|
||||||
|
{SCANCODE_W, SDL_SCANCODE_W},
|
||||||
|
{SCANCODE_X, SDL_SCANCODE_X},
|
||||||
|
{SCANCODE_Y, SDL_SCANCODE_Y},
|
||||||
|
{SCANCODE_Z, SDL_SCANCODE_Z},
|
||||||
|
|
||||||
|
{SCANCODE_1, SDL_SCANCODE_1},
|
||||||
|
{SCANCODE_2, SDL_SCANCODE_2},
|
||||||
|
{SCANCODE_3, SDL_SCANCODE_3},
|
||||||
|
{SCANCODE_4, SDL_SCANCODE_4},
|
||||||
|
{SCANCODE_5, SDL_SCANCODE_5},
|
||||||
|
{SCANCODE_6, SDL_SCANCODE_6},
|
||||||
|
{SCANCODE_7, SDL_SCANCODE_7},
|
||||||
|
{SCANCODE_8, SDL_SCANCODE_8},
|
||||||
|
{SCANCODE_9, SDL_SCANCODE_9},
|
||||||
|
{SCANCODE_0, SDL_SCANCODE_0},
|
||||||
|
|
||||||
|
{SCANCODE_RETURN, SDL_SCANCODE_RETURN},
|
||||||
|
{SCANCODE_ESCAPE, SDL_SCANCODE_ESCAPE},
|
||||||
|
{SCANCODE_BACKSPACE, SDL_SCANCODE_BACKSPACE},
|
||||||
|
{SCANCODE_TAB, SDL_SCANCODE_TAB},
|
||||||
|
{SCANCODE_SPACE, SDL_SCANCODE_SPACE},
|
||||||
|
|
||||||
|
{SCANCODE_MINUS, SDL_SCANCODE_MINUS},
|
||||||
|
{SCANCODE_EQUALS, SDL_SCANCODE_EQUALS},
|
||||||
|
{SCANCODE_LEFTBRACKET, SDL_SCANCODE_LEFTBRACKET},
|
||||||
|
{SCANCODE_RIGHTBRACKET, SDL_SCANCODE_RIGHTBRACKET},
|
||||||
|
{SCANCODE_BACKSLASH, SDL_SCANCODE_BACKSLASH},
|
||||||
|
{SCANCODE_NONUSHASH, SDL_SCANCODE_NONUSHASH},
|
||||||
|
{SCANCODE_SEMICOLON, SDL_SCANCODE_SEMICOLON},
|
||||||
|
{SCANCODE_APOSTROPHE, SDL_SCANCODE_APOSTROPHE},
|
||||||
|
{SCANCODE_GRAVE, SDL_SCANCODE_GRAVE},
|
||||||
|
{SCANCODE_COMMA, SDL_SCANCODE_COMMA},
|
||||||
|
{SCANCODE_PERIOD, SDL_SCANCODE_PERIOD},
|
||||||
|
{SCANCODE_SLASH, SDL_SCANCODE_SLASH},
|
||||||
|
|
||||||
|
{SCANCODE_CAPSLOCK, SDL_SCANCODE_CAPSLOCK},
|
||||||
|
|
||||||
|
{SCANCODE_F1, SDL_SCANCODE_F1},
|
||||||
|
{SCANCODE_F2, SDL_SCANCODE_F2},
|
||||||
|
{SCANCODE_F3, SDL_SCANCODE_F3},
|
||||||
|
{SCANCODE_F4, SDL_SCANCODE_F4},
|
||||||
|
{SCANCODE_F5, SDL_SCANCODE_F5},
|
||||||
|
{SCANCODE_F6, SDL_SCANCODE_F6},
|
||||||
|
{SCANCODE_F7, SDL_SCANCODE_F7},
|
||||||
|
{SCANCODE_F8, SDL_SCANCODE_F8},
|
||||||
|
{SCANCODE_F9, SDL_SCANCODE_F9},
|
||||||
|
{SCANCODE_F10, SDL_SCANCODE_F10},
|
||||||
|
{SCANCODE_F11, SDL_SCANCODE_F11},
|
||||||
|
{SCANCODE_F12, SDL_SCANCODE_F12},
|
||||||
|
|
||||||
|
{SCANCODE_PRINTSCREEN, SDL_SCANCODE_PRINTSCREEN},
|
||||||
|
{SCANCODE_SCROLLLOCK, SDL_SCANCODE_SCROLLLOCK},
|
||||||
|
{SCANCODE_PAUSE, SDL_SCANCODE_PAUSE},
|
||||||
|
{SCANCODE_INSERT, SDL_SCANCODE_INSERT},
|
||||||
|
{SCANCODE_HOME, SDL_SCANCODE_HOME},
|
||||||
|
{SCANCODE_PAGEUP, SDL_SCANCODE_PAGEUP},
|
||||||
|
{SCANCODE_DELETE, SDL_SCANCODE_DELETE},
|
||||||
|
{SCANCODE_END, SDL_SCANCODE_END},
|
||||||
|
{SCANCODE_PAGEDOWN, SDL_SCANCODE_PAGEDOWN},
|
||||||
|
{SCANCODE_RIGHT, SDL_SCANCODE_RIGHT},
|
||||||
|
{SCANCODE_LEFT, SDL_SCANCODE_LEFT},
|
||||||
|
{SCANCODE_DOWN, SDL_SCANCODE_DOWN},
|
||||||
|
{SCANCODE_UP, SDL_SCANCODE_UP},
|
||||||
|
|
||||||
|
{SCANCODE_NUMLOCKCLEAR, SDL_SCANCODE_NUMLOCKCLEAR},
|
||||||
|
{SCANCODE_KP_DIVIDE, SDL_SCANCODE_KP_DIVIDE},
|
||||||
|
{SCANCODE_KP_MULTIPLY, SDL_SCANCODE_KP_MULTIPLY},
|
||||||
|
{SCANCODE_KP_MINUS, SDL_SCANCODE_KP_MINUS},
|
||||||
|
{SCANCODE_KP_PLUS, SDL_SCANCODE_KP_PLUS},
|
||||||
|
{SCANCODE_KP_ENTER, SDL_SCANCODE_KP_ENTER},
|
||||||
|
{SCANCODE_KP_1, SDL_SCANCODE_KP_1},
|
||||||
|
{SCANCODE_KP_2, SDL_SCANCODE_KP_2},
|
||||||
|
{SCANCODE_KP_3, SDL_SCANCODE_KP_3},
|
||||||
|
{SCANCODE_KP_4, SDL_SCANCODE_KP_4},
|
||||||
|
{SCANCODE_KP_5, SDL_SCANCODE_KP_5},
|
||||||
|
{SCANCODE_KP_6, SDL_SCANCODE_KP_6},
|
||||||
|
{SCANCODE_KP_7, SDL_SCANCODE_KP_7},
|
||||||
|
{SCANCODE_KP_8, SDL_SCANCODE_KP_8},
|
||||||
|
{SCANCODE_KP_9, SDL_SCANCODE_KP_9},
|
||||||
|
{SCANCODE_KP_0, SDL_SCANCODE_KP_0},
|
||||||
|
{SCANCODE_KP_PERIOD, SDL_SCANCODE_KP_PERIOD},
|
||||||
|
|
||||||
|
{SCANCODE_NONUSBACKSLASH, SDL_SCANCODE_NONUSBACKSLASH},
|
||||||
|
{SCANCODE_APPLICATION, SDL_SCANCODE_APPLICATION},
|
||||||
|
{SCANCODE_POWER, SDL_SCANCODE_POWER},
|
||||||
|
{SCANCODE_KP_EQUALS, SDL_SCANCODE_KP_EQUALS},
|
||||||
|
{SCANCODE_F13, SDL_SCANCODE_F13},
|
||||||
|
{SCANCODE_F14, SDL_SCANCODE_F14},
|
||||||
|
{SCANCODE_F15, SDL_SCANCODE_F15},
|
||||||
|
{SCANCODE_F16, SDL_SCANCODE_F16},
|
||||||
|
{SCANCODE_F17, SDL_SCANCODE_F17},
|
||||||
|
{SCANCODE_F18, SDL_SCANCODE_F18},
|
||||||
|
{SCANCODE_F19, SDL_SCANCODE_F19},
|
||||||
|
{SCANCODE_F20, SDL_SCANCODE_F20},
|
||||||
|
{SCANCODE_F21, SDL_SCANCODE_F21},
|
||||||
|
{SCANCODE_F22, SDL_SCANCODE_F22},
|
||||||
|
{SCANCODE_F23, SDL_SCANCODE_F23},
|
||||||
|
{SCANCODE_F24, SDL_SCANCODE_F24},
|
||||||
|
{SCANCODE_EXECUTE, SDL_SCANCODE_EXECUTE},
|
||||||
|
{SCANCODE_HELP, SDL_SCANCODE_HELP},
|
||||||
|
{SCANCODE_MENU, SDL_SCANCODE_MENU},
|
||||||
|
{SCANCODE_SELECT, SDL_SCANCODE_SELECT},
|
||||||
|
{SCANCODE_STOP, SDL_SCANCODE_STOP},
|
||||||
|
{SCANCODE_AGAIN, SDL_SCANCODE_AGAIN},
|
||||||
|
{SCANCODE_UNDO, SDL_SCANCODE_UNDO},
|
||||||
|
{SCANCODE_CUT, SDL_SCANCODE_CUT},
|
||||||
|
{SCANCODE_COPY, SDL_SCANCODE_COPY},
|
||||||
|
{SCANCODE_PASTE, SDL_SCANCODE_PASTE},
|
||||||
|
{SCANCODE_FIND, SDL_SCANCODE_FIND},
|
||||||
|
{SCANCODE_MUTE, SDL_SCANCODE_MUTE},
|
||||||
|
{SCANCODE_VOLUMEUP, SDL_SCANCODE_VOLUMEUP},
|
||||||
|
{SCANCODE_VOLUMEDOWN, SDL_SCANCODE_VOLUMEDOWN},
|
||||||
|
{SCANCODE_KP_COMMA, SDL_SCANCODE_KP_COMMA},
|
||||||
|
{SCANCODE_KP_EQUALSAS400, SDL_SCANCODE_KP_EQUALSAS400},
|
||||||
|
|
||||||
|
{SCANCODE_INTERNATIONAL1, SDL_SCANCODE_INTERNATIONAL1},
|
||||||
|
{SCANCODE_INTERNATIONAL2, SDL_SCANCODE_INTERNATIONAL2},
|
||||||
|
{SCANCODE_INTERNATIONAL3, SDL_SCANCODE_INTERNATIONAL3},
|
||||||
|
{SCANCODE_INTERNATIONAL4, SDL_SCANCODE_INTERNATIONAL4},
|
||||||
|
{SCANCODE_INTERNATIONAL5, SDL_SCANCODE_INTERNATIONAL5},
|
||||||
|
{SCANCODE_INTERNATIONAL6, SDL_SCANCODE_INTERNATIONAL6},
|
||||||
|
{SCANCODE_INTERNATIONAL7, SDL_SCANCODE_INTERNATIONAL7},
|
||||||
|
{SCANCODE_INTERNATIONAL8, SDL_SCANCODE_INTERNATIONAL8},
|
||||||
|
{SCANCODE_INTERNATIONAL9, SDL_SCANCODE_INTERNATIONAL9},
|
||||||
|
{SCANCODE_LANG1, SDL_SCANCODE_LANG1},
|
||||||
|
{SCANCODE_LANG2, SDL_SCANCODE_LANG2},
|
||||||
|
{SCANCODE_LANG3, SDL_SCANCODE_LANG3},
|
||||||
|
{SCANCODE_LANG4, SDL_SCANCODE_LANG4},
|
||||||
|
{SCANCODE_LANG5, SDL_SCANCODE_LANG5},
|
||||||
|
{SCANCODE_LANG6, SDL_SCANCODE_LANG6},
|
||||||
|
{SCANCODE_LANG7, SDL_SCANCODE_LANG7},
|
||||||
|
{SCANCODE_LANG8, SDL_SCANCODE_LANG8},
|
||||||
|
{SCANCODE_LANG9, SDL_SCANCODE_LANG9},
|
||||||
|
|
||||||
|
{SCANCODE_ALTERASE, SDL_SCANCODE_ALTERASE},
|
||||||
|
{SCANCODE_SYSREQ, SDL_SCANCODE_SYSREQ},
|
||||||
|
{SCANCODE_CANCEL, SDL_SCANCODE_CANCEL},
|
||||||
|
{SCANCODE_CLEAR, SDL_SCANCODE_CLEAR},
|
||||||
|
{SCANCODE_PRIOR, SDL_SCANCODE_PRIOR},
|
||||||
|
{SCANCODE_RETURN2, SDL_SCANCODE_RETURN2},
|
||||||
|
{SCANCODE_SEPARATOR, SDL_SCANCODE_SEPARATOR},
|
||||||
|
{SCANCODE_OUT, SDL_SCANCODE_OUT},
|
||||||
|
{SCANCODE_OPER, SDL_SCANCODE_OPER},
|
||||||
|
{SCANCODE_CLEARAGAIN, SDL_SCANCODE_CLEARAGAIN},
|
||||||
|
{SCANCODE_CRSEL, SDL_SCANCODE_CRSEL},
|
||||||
|
{SCANCODE_EXSEL, SDL_SCANCODE_EXSEL},
|
||||||
|
|
||||||
|
{SCANCODE_KP_00, SDL_SCANCODE_KP_00},
|
||||||
|
{SCANCODE_KP_000, SDL_SCANCODE_KP_000},
|
||||||
|
{SCANCODE_THOUSANDSSEPARATOR, SDL_SCANCODE_THOUSANDSSEPARATOR},
|
||||||
|
{SCANCODE_DECIMALSEPARATOR, SDL_SCANCODE_DECIMALSEPARATOR},
|
||||||
|
{SCANCODE_CURRENCYUNIT, SDL_SCANCODE_CURRENCYUNIT},
|
||||||
|
{SCANCODE_CURRENCYSUBUNIT, SDL_SCANCODE_CURRENCYSUBUNIT},
|
||||||
|
{SCANCODE_KP_LEFTPAREN, SDL_SCANCODE_KP_LEFTPAREN},
|
||||||
|
{SCANCODE_KP_RIGHTPAREN, SDL_SCANCODE_KP_RIGHTPAREN},
|
||||||
|
{SCANCODE_KP_LEFTBRACE, SDL_SCANCODE_KP_LEFTBRACE},
|
||||||
|
{SCANCODE_KP_RIGHTBRACE, SDL_SCANCODE_KP_RIGHTBRACE},
|
||||||
|
{SCANCODE_KP_TAB, SDL_SCANCODE_KP_TAB},
|
||||||
|
{SCANCODE_KP_BACKSPACE, SDL_SCANCODE_KP_BACKSPACE},
|
||||||
|
{SCANCODE_KP_A, SDL_SCANCODE_KP_A},
|
||||||
|
{SCANCODE_KP_B, SDL_SCANCODE_KP_B},
|
||||||
|
{SCANCODE_KP_C, SDL_SCANCODE_KP_C},
|
||||||
|
{SCANCODE_KP_D, SDL_SCANCODE_KP_D},
|
||||||
|
{SCANCODE_KP_E, SDL_SCANCODE_KP_E},
|
||||||
|
{SCANCODE_KP_F, SDL_SCANCODE_KP_F},
|
||||||
|
{SCANCODE_KP_XOR, SDL_SCANCODE_KP_XOR},
|
||||||
|
{SCANCODE_KP_POWER, SDL_SCANCODE_KP_POWER},
|
||||||
|
{SCANCODE_KP_PERCENT, SDL_SCANCODE_KP_PERCENT},
|
||||||
|
{SCANCODE_KP_LESS, SDL_SCANCODE_KP_LESS},
|
||||||
|
{SCANCODE_KP_GREATER, SDL_SCANCODE_KP_GREATER},
|
||||||
|
{SCANCODE_KP_AMPERSAND, SDL_SCANCODE_KP_AMPERSAND},
|
||||||
|
{SCANCODE_KP_DBLAMPERSAND, SDL_SCANCODE_KP_DBLAMPERSAND},
|
||||||
|
{SCANCODE_KP_VERTICALBAR, SDL_SCANCODE_KP_VERTICALBAR},
|
||||||
|
{SCANCODE_KP_DBLVERTICALBAR, SDL_SCANCODE_KP_DBLVERTICALBAR},
|
||||||
|
{SCANCODE_KP_COLON, SDL_SCANCODE_KP_COLON},
|
||||||
|
{SCANCODE_KP_HASH, SDL_SCANCODE_KP_HASH},
|
||||||
|
{SCANCODE_KP_SPACE, SDL_SCANCODE_KP_SPACE},
|
||||||
|
{SCANCODE_KP_AT, SDL_SCANCODE_KP_AT},
|
||||||
|
{SCANCODE_KP_EXCLAM, SDL_SCANCODE_KP_EXCLAM},
|
||||||
|
{SCANCODE_KP_MEMSTORE, SDL_SCANCODE_KP_MEMSTORE},
|
||||||
|
{SCANCODE_KP_MEMRECALL, SDL_SCANCODE_KP_MEMRECALL},
|
||||||
|
{SCANCODE_KP_MEMCLEAR, SDL_SCANCODE_KP_MEMCLEAR},
|
||||||
|
{SCANCODE_KP_MEMADD, SDL_SCANCODE_KP_MEMADD},
|
||||||
|
{SCANCODE_KP_MEMSUBTRACT, SDL_SCANCODE_KP_MEMSUBTRACT},
|
||||||
|
{SCANCODE_KP_MEMMULTIPLY, SDL_SCANCODE_KP_MEMMULTIPLY},
|
||||||
|
{SCANCODE_KP_MEMDIVIDE, SDL_SCANCODE_KP_MEMDIVIDE},
|
||||||
|
{SCANCODE_KP_PLUSMINUS, SDL_SCANCODE_KP_PLUSMINUS},
|
||||||
|
{SCANCODE_KP_CLEAR, SDL_SCANCODE_KP_CLEAR},
|
||||||
|
{SCANCODE_KP_CLEARENTRY, SDL_SCANCODE_KP_CLEARENTRY},
|
||||||
|
{SCANCODE_KP_BINARY, SDL_SCANCODE_KP_BINARY},
|
||||||
|
{SCANCODE_KP_OCTAL, SDL_SCANCODE_KP_OCTAL},
|
||||||
|
{SCANCODE_KP_DECIMAL, SDL_SCANCODE_KP_DECIMAL},
|
||||||
|
{SCANCODE_KP_HEXADECIMAL, SDL_SCANCODE_KP_HEXADECIMAL},
|
||||||
|
|
||||||
|
{SCANCODE_LCTRL, SDL_SCANCODE_LCTRL},
|
||||||
|
{SCANCODE_LSHIFT, SDL_SCANCODE_LSHIFT},
|
||||||
|
{SCANCODE_LALT, SDL_SCANCODE_LALT},
|
||||||
|
{SCANCODE_LGUI, SDL_SCANCODE_LGUI},
|
||||||
|
{SCANCODE_RCTRL, SDL_SCANCODE_RCTRL},
|
||||||
|
{SCANCODE_RSHIFT, SDL_SCANCODE_RSHIFT},
|
||||||
|
{SCANCODE_RALT, SDL_SCANCODE_RALT},
|
||||||
|
{SCANCODE_RGUI, SDL_SCANCODE_RGUI},
|
||||||
|
|
||||||
|
{SCANCODE_MODE, SDL_SCANCODE_MODE},
|
||||||
|
|
||||||
|
{SCANCODE_AUDIONEXT, SDL_SCANCODE_AUDIONEXT},
|
||||||
|
{SCANCODE_AUDIOPREV, SDL_SCANCODE_AUDIOPREV},
|
||||||
|
{SCANCODE_AUDIOSTOP, SDL_SCANCODE_AUDIOSTOP},
|
||||||
|
{SCANCODE_AUDIOPLAY, SDL_SCANCODE_AUDIOPLAY},
|
||||||
|
{SCANCODE_AUDIOMUTE, SDL_SCANCODE_AUDIOMUTE},
|
||||||
|
{SCANCODE_MEDIASELECT, SDL_SCANCODE_MEDIASELECT},
|
||||||
|
{SCANCODE_WWW, SDL_SCANCODE_WWW},
|
||||||
|
{SCANCODE_MAIL, SDL_SCANCODE_MAIL},
|
||||||
|
{SCANCODE_CALCULATOR, SDL_SCANCODE_CALCULATOR},
|
||||||
|
{SCANCODE_COMPUTER, SDL_SCANCODE_COMPUTER},
|
||||||
|
{SCANCODE_AC_SEARCH, SDL_SCANCODE_AC_SEARCH},
|
||||||
|
{SCANCODE_AC_HOME, SDL_SCANCODE_AC_HOME},
|
||||||
|
{SCANCODE_AC_BACK, SDL_SCANCODE_AC_BACK},
|
||||||
|
{SCANCODE_AC_FORWARD, SDL_SCANCODE_AC_FORWARD},
|
||||||
|
{SCANCODE_AC_STOP, SDL_SCANCODE_AC_STOP},
|
||||||
|
{SCANCODE_AC_REFRESH, SDL_SCANCODE_AC_REFRESH},
|
||||||
|
{SCANCODE_AC_BOOKMARKS, SDL_SCANCODE_AC_BOOKMARKS},
|
||||||
|
|
||||||
|
{SCANCODE_BRIGHTNESSDOWN, SDL_SCANCODE_BRIGHTNESSDOWN},
|
||||||
|
{SCANCODE_BRIGHTNESSUP, SDL_SCANCODE_BRIGHTNESSUP},
|
||||||
|
{SCANCODE_DISPLAYSWITCH, SDL_SCANCODE_DISPLAYSWITCH},
|
||||||
|
{SCANCODE_KBDILLUMTOGGLE, SDL_SCANCODE_KBDILLUMTOGGLE},
|
||||||
|
{SCANCODE_KBDILLUMDOWN, SDL_SCANCODE_KBDILLUMDOWN},
|
||||||
|
{SCANCODE_KBDILLUMUP, SDL_SCANCODE_KBDILLUMUP},
|
||||||
|
{SCANCODE_EJECT, SDL_SCANCODE_EJECT},
|
||||||
|
{SCANCODE_SLEEP, SDL_SCANCODE_SLEEP},
|
||||||
|
|
||||||
|
{SCANCODE_APP1, SDL_SCANCODE_APP1},
|
||||||
|
{SCANCODE_APP2, SDL_SCANCODE_APP2},
|
||||||
|
};
|
||||||
|
|
||||||
|
EnumMap<Keyboard::Scancode, SDL_Scancode, SDL_NUM_SCANCODES> Keyboard::scancodes(Keyboard::scancodeEntries, sizeof(Keyboard::scancodeEntries));
|
||||||
|
|
||||||
} // sdl
|
} // sdl
|
||||||
} // keyboard
|
} // keyboard
|
||||||
} // love
|
} // love
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ public:
|
|||||||
bool hasKeyRepeat() const;
|
bool hasKeyRepeat() const;
|
||||||
bool isDown(Key *keylist) const;
|
bool isDown(Key *keylist) const;
|
||||||
|
|
||||||
|
Key getKeyFromScancode(Scancode scancode) const;
|
||||||
|
Scancode getScancodeFromKey(Key key) const;
|
||||||
|
|
||||||
void setTextInput(bool enable);
|
void setTextInput(bool enable);
|
||||||
void setTextInput(bool enable, int x, int y, int w, int h);
|
void setTextInput(bool enable, int x, int y, int w, int h);
|
||||||
bool hasTextInput() const;
|
bool hasTextInput() const;
|
||||||
@@ -62,6 +65,9 @@ private:
|
|||||||
static const SDL_Keycode *createKeyMap();
|
static const SDL_Keycode *createKeyMap();
|
||||||
static const SDL_Keycode *keymap;
|
static const SDL_Keycode *keymap;
|
||||||
|
|
||||||
|
static EnumMap<Scancode, SDL_Scancode, SDL_NUM_SCANCODES>::Entry scancodeEntries[];
|
||||||
|
static EnumMap<Scancode, SDL_Scancode, SDL_NUM_SCANCODES> scancodes;
|
||||||
|
|
||||||
}; // Keyboard
|
}; // Keyboard
|
||||||
|
|
||||||
} // sdl
|
} // sdl
|
||||||
|
|||||||
@@ -62,6 +62,40 @@ int w_isDown(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int w_getScancodeFromKey(lua_State *L)
|
||||||
|
{
|
||||||
|
const char *keystr = luaL_checkstring(L, 1);
|
||||||
|
Keyboard::Key key;
|
||||||
|
if (!Keyboard::getConstant(keystr, key))
|
||||||
|
return luaL_error(L, "Invalid key constant: %s", keystr);
|
||||||
|
|
||||||
|
Keyboard::Scancode scancode = instance()->getScancodeFromKey(key);
|
||||||
|
|
||||||
|
const char *scancodestr;
|
||||||
|
if (!Keyboard::getConstant(scancode, scancodestr))
|
||||||
|
return luaL_error(L, "Unknown scancode.");
|
||||||
|
|
||||||
|
lua_pushstring(L, scancodestr);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int w_getKeyFromScancode(lua_State *L)
|
||||||
|
{
|
||||||
|
const char *scancodestr = luaL_checkstring(L, 1);
|
||||||
|
Keyboard::Scancode scancode;
|
||||||
|
if (!Keyboard::getConstant(scancodestr, scancode))
|
||||||
|
return luaL_error(L, "Invalid scancode: %s", scancodestr);
|
||||||
|
|
||||||
|
Keyboard::Key key = instance()->getKeyFromScancode(scancode);
|
||||||
|
|
||||||
|
const char *keystr;
|
||||||
|
if (!Keyboard::getConstant(key, keystr))
|
||||||
|
return luaL_error(L, "Unknown key constant");
|
||||||
|
|
||||||
|
lua_pushstring(L, keystr);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int w_setTextInput(lua_State *L)
|
int w_setTextInput(lua_State *L)
|
||||||
{
|
{
|
||||||
bool enable = luax_toboolean(L, 1);
|
bool enable = luax_toboolean(L, 1);
|
||||||
@@ -101,6 +135,8 @@ static const luaL_Reg functions[] =
|
|||||||
{ "hasTextInput", w_hasTextInput },
|
{ "hasTextInput", w_hasTextInput },
|
||||||
{ "hasScreenKeyboard", w_hasScreenKeyboard },
|
{ "hasScreenKeyboard", w_hasScreenKeyboard },
|
||||||
{ "isDown", w_isDown },
|
{ "isDown", w_isDown },
|
||||||
|
{ "getScancodeFromKey", w_getScancodeFromKey },
|
||||||
|
{ "getKeyFromScancode", w_getKeyFromScancode },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ namespace keyboard
|
|||||||
int w_setKeyRepeat(lua_State *L);
|
int w_setKeyRepeat(lua_State *L);
|
||||||
int w_hasKeyRepeat(lua_State *L);
|
int w_hasKeyRepeat(lua_State *L);
|
||||||
int w_isDown(lua_State *L);
|
int w_isDown(lua_State *L);
|
||||||
|
int w_getKeyFromScancode(lua_State *L);
|
||||||
|
int w_getScancodeFromkey(lua_State *L);
|
||||||
int w_setTextInput(lua_State *L);
|
int w_setTextInput(lua_State *L);
|
||||||
int w_hasTextInput(lua_State *L);
|
int w_hasTextInput(lua_State *L);
|
||||||
int w_hasScreenKeyboard(lua_State *L);
|
int w_hasScreenKeyboard(lua_State *L);
|
||||||
|
|||||||
@@ -179,7 +179,9 @@ int w__setAccelerometerAsJoystick(lua_State *L);
|
|||||||
|
|
||||||
const char *love_version()
|
const char *love_version()
|
||||||
{
|
{
|
||||||
return love::VERSION;
|
// Do not refer to love::VERSION here, the linker
|
||||||
|
// will patch it back up to the executable's one..
|
||||||
|
return LOVE_VERSION_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *love_codename()
|
const char *love_codename()
|
||||||
@@ -269,44 +271,77 @@ int luaopen_love(lua_State * L)
|
|||||||
|
|
||||||
#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
|
#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
|
||||||
|
|
||||||
|
// Mostly taken from the Windows 8.1 SDK's VersionHelpers.h.
|
||||||
|
static bool IsWindowsVistaOrGreater()
|
||||||
|
{
|
||||||
|
OSVERSIONINFOEXW osvi = {sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0};
|
||||||
|
|
||||||
|
osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_VISTA);
|
||||||
|
osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_VISTA);
|
||||||
|
osvi.wServicePackMajor = 0;
|
||||||
|
|
||||||
|
DWORDLONG majorversionmask = VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL);
|
||||||
|
DWORDLONG versionmask = VerSetConditionMask(majorversionmask, VER_MINORVERSION, VER_GREATER_EQUAL);
|
||||||
|
DWORDLONG mask = VerSetConditionMask(versionmask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
|
||||||
|
|
||||||
|
return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, mask) != FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
int w__openConsole(lua_State *L)
|
int w__openConsole(lua_State *L)
|
||||||
{
|
{
|
||||||
static bool is_open = false;
|
static bool is_open = false;
|
||||||
|
|
||||||
if (is_open)
|
if (is_open)
|
||||||
return 0;
|
{
|
||||||
|
love::luax_pushboolean(L, is_open);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
is_open = true;
|
is_open = true;
|
||||||
|
|
||||||
if (GetConsoleWindow() != NULL || AllocConsole() == 0)
|
// FIXME: we don't call AttachConsole in Windows XP because it seems to
|
||||||
return 0;
|
// break later AllocConsole calls if it fails. A better workaround might be
|
||||||
|
// possible, but it's hard to find a WinXP system to test on these days...
|
||||||
|
if (!IsWindowsVistaOrGreater() || !AttachConsole(ATTACH_PARENT_PROCESS))
|
||||||
|
{
|
||||||
|
// Create our own console if we can't attach to an existing one.
|
||||||
|
if (!AllocConsole())
|
||||||
|
{
|
||||||
|
is_open = false;
|
||||||
|
love::luax_pushboolean(L, is_open);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
const int MAX_CONSOLE_LINES = 5000;
|
SetConsoleTitle(TEXT("LOVE Console"));
|
||||||
CONSOLE_SCREEN_BUFFER_INFO console_info;
|
|
||||||
|
|
||||||
// Set size.
|
const int MAX_CONSOLE_LINES = 5000;
|
||||||
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &console_info);
|
CONSOLE_SCREEN_BUFFER_INFO console_info;
|
||||||
console_info.dwSize.Y = MAX_CONSOLE_LINES;
|
|
||||||
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), console_info.dwSize);
|
|
||||||
|
|
||||||
SetConsoleTitle(TEXT("LOVE Console"));
|
// Set size.
|
||||||
|
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &console_info);
|
||||||
|
console_info.dwSize.Y = MAX_CONSOLE_LINES;
|
||||||
|
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), console_info.dwSize);
|
||||||
|
}
|
||||||
|
|
||||||
FILE * fp;
|
FILE *fp;
|
||||||
|
|
||||||
// Redirect stdout.
|
// Redirect stdout.
|
||||||
fp = freopen("CONOUT$", "w", stdout);
|
fp = freopen("CONOUT$", "w", stdout);
|
||||||
if (L && fp == NULL)
|
if (L && fp == NULL)
|
||||||
luaL_error(L, "Console redirection of stdout failed.");
|
return luaL_error(L, "Console redirection of stdout failed.");
|
||||||
|
|
||||||
// Redirect stdin.
|
// Redirect stdin.
|
||||||
fp = freopen("CONIN$", "r", stdin);
|
fp = freopen("CONIN$", "r", stdin);
|
||||||
if (L && fp == NULL)
|
if (L && fp == NULL)
|
||||||
luaL_error(L, "Console redirection of stdin failed.");
|
return luaL_error(L, "Console redirection of stdin failed.");
|
||||||
|
|
||||||
// Redirect stderr.
|
// Redirect stderr.
|
||||||
fp = freopen("CONOUT$", "w", stderr);
|
fp = freopen("CONOUT$", "w", stderr);
|
||||||
if (L && fp == NULL)
|
if (L && fp == NULL)
|
||||||
luaL_error(L, "Console redirection of stderr failed.");
|
return luaL_error(L, "Console redirection of stderr failed.");
|
||||||
|
|
||||||
return 0;
|
love::luax_pushboolean(L, is_open);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
|
#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
|
||||||
|
|||||||
@@ -75,8 +75,8 @@ public:
|
|||||||
virtual bool isVisible() const = 0;
|
virtual bool isVisible() const = 0;
|
||||||
virtual void setGrabbed(bool grab) = 0;
|
virtual void setGrabbed(bool grab) = 0;
|
||||||
virtual bool isGrabbed() const = 0;
|
virtual bool isGrabbed() const = 0;
|
||||||
virtual bool setRelative(bool relative) = 0;
|
virtual bool setRelativeMode(bool relative) = 0;
|
||||||
virtual bool isRelative() const = 0;
|
virtual bool getRelativeMode() const = 0;
|
||||||
|
|
||||||
static bool getConstant(const char *in, Button &out);
|
static bool getConstant(const char *in, Button &out);
|
||||||
static bool getConstant(Button in, const char *&out);
|
static bool getConstant(Button in, const char *&out);
|
||||||
|
|||||||
@@ -121,18 +121,10 @@ bool Mouse::hasCursor() const
|
|||||||
return SDL_GetDefaultCursor() != nullptr;
|
return SDL_GetDefaultCursor() != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Uint32 GetSDLMouseState(int *x, int *y)
|
|
||||||
{
|
|
||||||
// SDL's Linux and Windows video backends don't update the internal mouse
|
|
||||||
// state until the next PumpEvents, if SDL_WarpMouse was called previously.
|
|
||||||
SDL_PumpEvents();
|
|
||||||
return SDL_GetMouseState(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
int Mouse::getX() const
|
int Mouse::getX() const
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
GetSDLMouseState(&x, nullptr);
|
SDL_GetMouseState(&x, nullptr);
|
||||||
windowToPixelCoords(&x, nullptr);
|
windowToPixelCoords(&x, nullptr);
|
||||||
|
|
||||||
return x;
|
return x;
|
||||||
@@ -141,7 +133,7 @@ int Mouse::getX() const
|
|||||||
int Mouse::getY() const
|
int Mouse::getY() const
|
||||||
{
|
{
|
||||||
int y;
|
int y;
|
||||||
GetSDLMouseState(nullptr, &y);
|
SDL_GetMouseState(nullptr, &y);
|
||||||
windowToPixelCoords(nullptr, &y);
|
windowToPixelCoords(nullptr, &y);
|
||||||
|
|
||||||
return y;
|
return y;
|
||||||
@@ -150,7 +142,7 @@ int Mouse::getY() const
|
|||||||
void Mouse::getPosition(int &x, int &y) const
|
void Mouse::getPosition(int &x, int &y) const
|
||||||
{
|
{
|
||||||
int mx, my;
|
int mx, my;
|
||||||
GetSDLMouseState(&mx, &my);
|
SDL_GetMouseState(&mx, &my);
|
||||||
windowToPixelCoords(&mx, &my);
|
windowToPixelCoords(&mx, &my);
|
||||||
|
|
||||||
x = mx;
|
x = mx;
|
||||||
@@ -167,6 +159,11 @@ void Mouse::setPosition(int x, int y)
|
|||||||
|
|
||||||
pixelToWindowCoords(&x, &y);
|
pixelToWindowCoords(&x, &y);
|
||||||
SDL_WarpMouseInWindow(handle, x, y);
|
SDL_WarpMouseInWindow(handle, x, y);
|
||||||
|
|
||||||
|
// SDL_WarpMouse doesn't directly update SDL's internal mouse state in Linux
|
||||||
|
// and Windows, so we call SDL_PumpEvents now to make sure the next
|
||||||
|
// getPosition call always returns the updated state.
|
||||||
|
SDL_PumpEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mouse::setX(int x)
|
void Mouse::setX(int x)
|
||||||
@@ -220,12 +217,12 @@ bool Mouse::isGrabbed() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Mouse::setRelative(bool relative)
|
bool Mouse::setRelativeMode(bool relative)
|
||||||
{
|
{
|
||||||
return SDL_SetRelativeMouseMode(relative ? SDL_TRUE : SDL_FALSE) == 0;
|
return SDL_SetRelativeMouseMode(relative ? SDL_TRUE : SDL_FALSE) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Mouse::isRelative() const
|
bool Mouse::getRelativeMode() const
|
||||||
{
|
{
|
||||||
return SDL_GetRelativeMouseMode() != SDL_FALSE;
|
return SDL_GetRelativeMouseMode() != SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,12 +66,12 @@ public:
|
|||||||
bool isVisible() const;
|
bool isVisible() const;
|
||||||
void setGrabbed(bool grab);
|
void setGrabbed(bool grab);
|
||||||
bool isGrabbed() const;
|
bool isGrabbed() const;
|
||||||
bool setRelative(bool relative);
|
bool setRelativeMode(bool relative);
|
||||||
bool isRelative() const;
|
bool getRelativeMode() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Object::StrongRef<love::mouse::Cursor> curCursor;
|
StrongRef<love::mouse::Cursor> curCursor;
|
||||||
|
|
||||||
std::map<Cursor::SystemCursor, Cursor *> systemCursors;
|
std::map<Cursor::SystemCursor, Cursor *> systemCursors;
|
||||||
|
|
||||||
|
|||||||
@@ -185,16 +185,16 @@ int w_isGrabbed(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int w_setRelative(lua_State *L)
|
int w_setRelativeMode(lua_State *L)
|
||||||
{
|
{
|
||||||
bool relative = luax_toboolean(L, 1);
|
bool relative = luax_toboolean(L, 1);
|
||||||
luax_pushboolean(L, instance()->setRelative(relative));
|
luax_pushboolean(L, instance()->setRelativeMode(relative));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int w_isRelative(lua_State *L)
|
int w_getRelativeMode(lua_State *L)
|
||||||
{
|
{
|
||||||
luax_pushboolean(L, instance()->isRelative());
|
luax_pushboolean(L, instance()->getRelativeMode());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,8 +217,8 @@ static const luaL_Reg functions[] =
|
|||||||
{ "getPosition", w_getPosition },
|
{ "getPosition", w_getPosition },
|
||||||
{ "setGrabbed", w_setGrabbed },
|
{ "setGrabbed", w_setGrabbed },
|
||||||
{ "isGrabbed", w_isGrabbed },
|
{ "isGrabbed", w_isGrabbed },
|
||||||
{ "setRelative", w_setRelative },
|
{ "setRelativeMode", w_setRelativeMode },
|
||||||
{ "isRelative", w_isRelative },
|
{ "getRelativeMode", w_getRelativeMode },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ int w_setVisible(lua_State *L);
|
|||||||
int w_isVisible(lua_State *L);
|
int w_isVisible(lua_State *L);
|
||||||
int w_setGrabbed(lua_State *L);
|
int w_setGrabbed(lua_State *L);
|
||||||
int w_isGrabbed(lua_State *L);
|
int w_isGrabbed(lua_State *L);
|
||||||
int w_setRelative(lua_State *L);
|
int w_setRelativeMode(lua_State *L);
|
||||||
int w_isRelative(lua_State *L);
|
int w_getRelativeMode(lua_State *L);
|
||||||
extern "C" LOVE_EXPORT int luaopen_love_mouse(lua_State *L);
|
extern "C" LOVE_EXPORT int luaopen_love_mouse(lua_State *L);
|
||||||
|
|
||||||
} // mouse
|
} // mouse
|
||||||
|
|||||||
@@ -441,7 +441,7 @@ private:
|
|||||||
//
|
//
|
||||||
// This ensures that a World only can be destroyed
|
// This ensures that a World only can be destroyed
|
||||||
// once all bodies have been destroyed too.
|
// once all bodies have been destroyed too.
|
||||||
Object::StrongRef<World> world;
|
StrongRef<World> world;
|
||||||
|
|
||||||
bodyudata *udata;
|
bodyudata *udata;
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ protected:
|
|||||||
|
|
||||||
// The encoded data. This should be replaced with buffered file
|
// The encoded data. This should be replaced with buffered file
|
||||||
// reads in the future.
|
// reads in the future.
|
||||||
Object::StrongRef<Data> data;
|
StrongRef<Data> data;
|
||||||
|
|
||||||
// File extension.
|
// File extension.
|
||||||
std::string ext;
|
std::string ext;
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ private:
|
|||||||
|
|
||||||
void onError();
|
void onError();
|
||||||
|
|
||||||
Object::StrongRef<love::Data> code;
|
StrongRef<love::Data> code;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string error;
|
std::string error;
|
||||||
|
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ private:
|
|||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
WindowSettings settings;
|
WindowSettings settings;
|
||||||
Object::StrongRef<love::image::ImageData> icon;
|
StrongRef<love::image::ImageData> icon;
|
||||||
|
|
||||||
} curMode;
|
} curMode;
|
||||||
|
|
||||||
|
|||||||
@@ -524,6 +524,7 @@ static const luaL_Reg functions[] =
|
|||||||
{ "toPixels", w_toPixels },
|
{ "toPixels", w_toPixels },
|
||||||
{ "fromPixels", w_fromPixels },
|
{ "fromPixels", w_fromPixels },
|
||||||
{ "minimize", w_minimize },
|
{ "minimize", w_minimize },
|
||||||
|
{ "maximize", w_maximize },
|
||||||
{ "showMessageBox", w_showMessageBox },
|
{ "showMessageBox", w_showMessageBox },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -483,22 +483,8 @@ function love.init()
|
|||||||
|
|
||||||
print(msg)
|
print(msg)
|
||||||
|
|
||||||
local can_display = love.window and love.window.isCreated()
|
if love.window then
|
||||||
can_display = can_display and love.graphics and love.graphics.isCreated()
|
love.window.showMessageBox("Compatibility Warning", msg, "warning")
|
||||||
|
|
||||||
if can_display and love.timer and love.event then
|
|
||||||
love.graphics.setBackgroundColor(89, 157, 220)
|
|
||||||
love.graphics.origin()
|
|
||||||
|
|
||||||
local start = love.timer.getTime()
|
|
||||||
while love.timer.getTime() < start + 4 do
|
|
||||||
love.event.pump()
|
|
||||||
love.graphics.clear()
|
|
||||||
love.graphics.print(msg, 70, 70)
|
|
||||||
love.graphics.present()
|
|
||||||
love.timer.sleep(1/20)
|
|
||||||
end
|
|
||||||
love.graphics.setBackgroundColor(0, 0, 0)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -889,44 +889,12 @@ const unsigned char boot_lua[] =
|
|||||||
0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x22, 0x2e, 0x2e, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f,
|
0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x22, 0x2e, 0x2e, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f,
|
||||||
0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x2e, 0x22, 0x29, 0x2e, 0x22, 0x0a,
|
0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x2e, 0x22, 0x29, 0x2e, 0x22, 0x0a,
|
||||||
0x09, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a,
|
0x09, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a,
|
||||||
0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c,
|
0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20,
|
||||||
0x61, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x61,
|
0x74, 0x68, 0x65, 0x6e, 0x0a,
|
||||||
0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x69, 0x73, 0x43,
|
0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x68,
|
||||||
0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x28, 0x29, 0x0a,
|
0x6f, 0x77, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6f, 0x78, 0x28, 0x22, 0x43, 0x6f, 0x6d, 0x70,
|
||||||
0x09, 0x09, 0x09, 0x63, 0x61, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x3d, 0x20, 0x63,
|
0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22,
|
||||||
0x61, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76,
|
0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x22, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a,
|
||||||
0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76,
|
|
||||||
0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x69, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74,
|
|
||||||
0x65, 0x64, 0x28, 0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20,
|
|
||||||
0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64,
|
|
||||||
0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e,
|
|
||||||
0x73, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
|
|
||||||
0x28, 0x38, 0x39, 0x2c, 0x20, 0x31, 0x35, 0x37, 0x2c, 0x20, 0x32, 0x32, 0x30, 0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e,
|
|
||||||
0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x28, 0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20,
|
|
||||||
0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65,
|
|
||||||
0x28, 0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d,
|
|
||||||
0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x20, 0x3c, 0x20, 0x73, 0x74, 0x61,
|
|
||||||
0x72, 0x74, 0x20, 0x2b, 0x20, 0x34, 0x20, 0x64, 0x6f, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x75,
|
|
||||||
0x6d, 0x70, 0x28, 0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73,
|
|
||||||
0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73,
|
|
||||||
0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x37, 0x30, 0x2c, 0x20, 0x37, 0x30,
|
|
||||||
0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73,
|
|
||||||
0x2e, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x28, 0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x73, 0x6c,
|
|
||||||
0x65, 0x65, 0x70, 0x28, 0x31, 0x2f, 0x32, 0x30, 0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e,
|
|
||||||
0x73, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
|
|
||||||
0x28, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x0a,
|
|
||||||
0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,
|
0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,
|
||||||
0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,
|
0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,
|
||||||
0x09, 0x65, 0x6e, 0x64, 0x0a,
|
0x09, 0x65, 0x6e, 0x64, 0x0a,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user