diff --git a/Content/Documentation/ScriptingAPI-Documentation.md b/Content/Documentation/ScriptingAPI-Documentation.md index e3c9a7ee9..4e5aa981b 100644 --- a/Content/Documentation/ScriptingAPI-Documentation.md +++ b/Content/Documentation/ScriptingAPI-Documentation.md @@ -1863,6 +1863,9 @@ Query input devices - IsGamepadButton(int button) : bool -- returns whether that button code is a gamepad button or not - StringToButton(string str) : int -- returns button code for a given string name - ButtonToString(int button, opt int preference = CONTROLLER_PREFERENCE_GENERIC) : string -- returns string name for the given button code. You can set a preference for controller type which can modify the string returned +- SetCursor(int cursor) -- sets the current cursor type. Values can be of the cursor values, see below +- SetCursorFromFile(int cursor, string filename) -- sets the specified cursor type to an image from a cursor file +- ResetCursor(int cursor) -- resets the specified cursor to the default one #### ControllerFeedback Describes controller feedback such as touch and LED color which can be replayed on a controller @@ -2004,6 +2007,18 @@ Playstation button codes: - [outer]CONTROLLER_PREFERENCE_PLAYSTATION : int - [outer]CONTROLLER_PREFERENCE_XBOX : int +#### Cursor codes: +- [outer]CURSOR_DEFAULT : int +- [outer]CURSOR_TEXTINPUT : int +- [outer]CURSOR_RESIZEALL : int +- [outer]CURSOR_RESIZE_NS : int +- [outer]CURSOR_RESIZE_EW : int +- [outer]CURSOR_RESIZE_NESW : int +- [outer]CURSOR_RESIZE_NWSE : int +- [outer]CURSOR_HAND : int +- [outer]CURSOR_NOTALLOWED : int +- [outer]CURSOR_CROSS : int + ### Physics - [outer]physics : Physics -- use this global object to access physics functions diff --git a/WickedEngine/wiInput.cpp b/WickedEngine/wiInput.cpp index ee127fc19..7f7b47a88 100644 --- a/WickedEngine/wiInput.cpp +++ b/WickedEngine/wiInput.cpp @@ -42,9 +42,41 @@ namespace wi::input bool double_click = false; wi::Timer doubleclick_timer; XMFLOAT2 doubleclick_prevpos = XMFLOAT2(0, 0); - CURSOR cursor_current = CURSOR_CROSS; // something that's not default, because at least once code should change it to default + CURSOR cursor_current = CURSOR_COUNT; // something that's not default, because at least once code should change it to default CURSOR cursor_next = CURSOR_DEFAULT; +#ifdef PLATFORM_WINDOWS_DESKTOP + static const HCURSOR cursor_table_original[] = { + ::LoadCursor(nullptr, IDC_ARROW), + ::LoadCursor(nullptr, IDC_IBEAM), + ::LoadCursor(nullptr, IDC_SIZEALL), + ::LoadCursor(nullptr, IDC_SIZENS), + ::LoadCursor(nullptr, IDC_SIZEWE), + ::LoadCursor(nullptr, IDC_SIZENESW), + ::LoadCursor(nullptr, IDC_SIZENWSE), + ::LoadCursor(nullptr, IDC_HAND), + ::LoadCursor(nullptr, IDC_NO), + ::LoadCursor(nullptr, IDC_CROSS), + }; + static HCURSOR cursor_table[arraysize(cursor_table_original)] = {}; +#endif // PLATFORM_WINDOWS_DESKTOP + +#ifdef SDL2 + static const SDL_Cursor* cursor_table_original[] = { + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW), + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM), + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL), + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS), + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE), + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW), + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE), + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND), + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO), + SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_CROSSHAIR), + }; + static SDL_Cursor* cursor_table[arraysize(cursor_table_original)] = {}; +#endif // SDL2 + const KeyboardState& GetKeyboardState() { return keyboard; } const MouseState& GetMouseState() { return mouse; } @@ -93,6 +125,11 @@ namespace wi::input wi::input::ps5::Initialize(); #endif // PLATFORM_PS5 + for (int i = 0; i < arraysize(cursor_table); ++i) + { + cursor_table[i] = cursor_table_original[i]; + } + wi::backlog::post("wi::input Initialized (" + std::to_string((int)std::round(timer.elapsed())) + " ms)"); initialized.store(true); } @@ -354,34 +391,10 @@ namespace wi::input if(cursor_next != cursor_current || cursor_next != CURSOR_DEFAULT) { #ifdef PLATFORM_WINDOWS_DESKTOP - static HCURSOR cursor_table[] = { - ::LoadCursor(nullptr, IDC_ARROW), - ::LoadCursor(nullptr, IDC_IBEAM), - ::LoadCursor(nullptr, IDC_SIZEALL), - ::LoadCursor(nullptr, IDC_SIZENS), - ::LoadCursor(nullptr, IDC_SIZEWE), - ::LoadCursor(nullptr, IDC_SIZENESW), - ::LoadCursor(nullptr, IDC_SIZENWSE), - ::LoadCursor(nullptr, IDC_HAND), - ::LoadCursor(nullptr, IDC_NO), - ::LoadCursor(nullptr, IDC_CROSS), - }; ::SetCursor(cursor_table[cursor_next]); #endif // PLATFORM_WINDOWS_DESKTOP #ifdef SDL2 - static SDL_Cursor* cursor_table[] = { - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW), - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM), - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL), - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS), - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE), - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW), - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE), - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND), - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO), - SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_CROSSHAIR), - }; SDL_SetCursor(cursor_table[cursor_next] ? cursor_table[cursor_next] : cursor_table[CURSOR_DEFAULT]); #endif // SDL2 @@ -735,7 +748,14 @@ namespace wi::input BUTTON WhatIsPressed(int playerindex) { - for (int i = DIGIT_RANGE_START; i < BUTTON_ENUM_SIZE; ++i) + // First go through predefined enums: + for (int i = GAMEPAD_RANGE_START + 1; i < BUTTON_ENUM_SIZE; ++i) + { + if (Press((BUTTON)i, playerindex)) + return (BUTTON)i; + } + // Go through remaining digits, letters and undefined: + for (int i = DIGIT_RANGE_START; i < GAMEPAD_RANGE_START; ++i) { if (Press((BUTTON)i, playerindex)) return (BUTTON)i; @@ -809,6 +829,28 @@ namespace wi::input cursor_next = cursor; } + void SetCursorFromFile(CURSOR cursor, const char* filename) + { +#ifdef PLATFORM_WINDOWS_DESKTOP + wchar_t wfilename[1024] = {}; + wi::helper::StringConvert(filename, wfilename); + cursor_table[cursor] = LoadCursorFromFile(wfilename); +#endif // PLATFORM_WINDOWS_DESKTOP + + // refresh in case we set the current one: + cursor_next = cursor_current; + cursor_current = CURSOR_COUNT; + } + + void ResetCursor(CURSOR cursor) + { + cursor_table[cursor] = cursor_table_original[cursor]; + + // refresh in case we set the current one: + cursor_next = cursor_current; + cursor_current = CURSOR_COUNT; + } + BUTTON StringToButton(const char* str) { if (str == nullptr) diff --git a/WickedEngine/wiInput.h b/WickedEngine/wiInput.h index 27cbc7d86..7b1b77d20 100644 --- a/WickedEngine/wiInput.h +++ b/WickedEngine/wiInput.h @@ -252,9 +252,18 @@ namespace wi::input CURSOR_HAND, CURSOR_NOTALLOWED, CURSOR_CROSS, + + CURSOR_COUNT }; void SetCursor(CURSOR cursor); + // Replaces the specified cursor from a cursor image file + // (file type must be a .cur or .ani on Windows) + void SetCursorFromFile(CURSOR cursor, const char* filename); + + // Resets specified cursor to the original: + void ResetCursor(CURSOR cursor); + BUTTON StringToButton(const char* str); enum CONTROLLER_PREFERENCE diff --git a/WickedEngine/wiInput_BindLua.cpp b/WickedEngine/wiInput_BindLua.cpp index 55fa25d70..1d4c8f65c 100644 --- a/WickedEngine/wiInput_BindLua.cpp +++ b/WickedEngine/wiInput_BindLua.cpp @@ -20,6 +20,9 @@ namespace wi::lua lunamethod(Input_BindLua, IsGamepadButton), lunamethod(Input_BindLua, ButtonToString), lunamethod(Input_BindLua, StringToButton), + lunamethod(Input_BindLua, SetCursor), + lunamethod(Input_BindLua, SetCursorFromFile), + lunamethod(Input_BindLua, ResetCursor), { NULL, NULL } }; Luna::PropertyType Input_BindLua::properties[] = { @@ -253,6 +256,43 @@ namespace wi::lua wi::lua::SError(L, "StringToButton(string str): not enough parameters!"); return 0; } + int Input_BindLua::SetCursor(lua_State* L) + { + int argc = wi::lua::SGetArgCount(L); + if (argc > 0) + { + wi::input::CURSOR cursor = (wi::input::CURSOR)wi::lua::SGetInt(L, 1); + wi::input::SetCursor(cursor); + return 0; + } + wi::lua::SError(L, "SetCursor(int cursor) not enough arguments!"); + return 0; + } + int Input_BindLua::SetCursorFromFile(lua_State* L) + { + int argc = wi::lua::SGetArgCount(L); + if (argc > 1) + { + wi::input::CURSOR cursor = (wi::input::CURSOR)wi::lua::SGetInt(L, 1); + const char* filename = wi::lua::SGetString(L, 2); + wi::input::SetCursorFromFile(cursor, filename); + return 0; + } + wi::lua::SError(L, "SetCursorFromFile(int cursor, string filename) not enough arguments!"); + return 0; + } + int Input_BindLua::ResetCursor(lua_State* L) + { + int argc = wi::lua::SGetArgCount(L); + if (argc > 0) + { + wi::input::CURSOR cursor = (wi::input::CURSOR)wi::lua::SGetInt(L, 1); + wi::input::ResetCursor(cursor); + return 0; + } + wi::lua::SError(L, "ResetCursor(int cursor) not enough arguments!"); + return 0; + } void Input_BindLua::Bind() { @@ -393,6 +433,17 @@ KEYBOARD_BUTTON_INSERT = 564 CONTROLLER_PREFERENCE_GENERIC = 0 CONTROLLER_PREFERENCE_PLAYSTATION = 1 CONTROLLER_PREFERENCE_XBOX = 2 + +CURSOR_DEFAULT = 0 +CURSOR_TEXTINPUT = 1 +CURSOR_RESIZEALL = 2 +CURSOR_RESIZE_NS = 3 +CURSOR_RESIZE_EW = 4 +CURSOR_RESIZE_NESW = 5 +CURSOR_RESIZE_NWSE = 6 +CURSOR_HAND = 7 +CURSOR_NOTALLOWED = 8 +CURSOR_CROSS = 9 )"); } diff --git a/WickedEngine/wiInput_BindLua.h b/WickedEngine/wiInput_BindLua.h index c8850ad7c..2b3116c70 100644 --- a/WickedEngine/wiInput_BindLua.h +++ b/WickedEngine/wiInput_BindLua.h @@ -30,6 +30,9 @@ namespace wi::lua int IsGamepadButton(lua_State* L); int ButtonToString(lua_State* L); int StringToButton(lua_State* L); + int SetCursor(lua_State* L); + int SetCursorFromFile(lua_State* L); + int ResetCursor(lua_State* L); static void Bind(); }; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index c3a78d78d..8ada79250 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 606; + const int revision = 607; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);