Add SDL cursors ()

* Add SDL cursors

* Fix naming
This commit is contained in:
Christian Semmler 2024-06-01 10:54:17 -04:00 committed by Anonymous Maarten
parent 8a2bbcac84
commit 4bf9174c15
3 changed files with 77 additions and 49 deletions
ISLE
LEGO1/lego/legoomni/src/common

View file

@ -9,6 +9,7 @@
#include "legomain.h" #include "legomain.h"
#include "legomodelpresenter.h" #include "legomodelpresenter.h"
#include "legopartpresenter.h" #include "legopartpresenter.h"
#include "legoutils.h"
#include "legovideomanager.h" #include "legovideomanager.h"
#include "legoworldpresenter.h" #include "legoworldpresenter.h"
#include "misc.h" #include "misc.h"
@ -318,8 +319,6 @@ int SDL_AppEvent(void* appstate, const SDL_Event* event)
// Remaining functionality to be implemented: // Remaining functionality to be implemented:
// Full screen - crashes when minimizing/maximizing // Full screen - crashes when minimizing/maximizing
// WM_TIMER - use SDL_Timer functionality instead // WM_TIMER - use SDL_Timer functionality instead
// WM_SETCURSOR - update cursor
// 0x5400 - custom LEGO Island SetupCursor event
switch (event->type) { switch (event->type) {
case SDL_EVENT_WINDOW_FOCUS_GAINED: case SDL_EVENT_WINDOW_FOCUS_GAINED:
@ -391,6 +390,14 @@ int SDL_AppEvent(void* appstate, const SDL_Event* event)
break; break;
} }
if (event->type >= SDL_EVENT_USER && event->type <= SDL_EVENT_LAST - 1) {
switch (event->user.code) {
case WM_ISLE_SETCURSOR:
g_isle->SetupCursor((Cursor) (MxS32) event->user.data1);
break;
}
}
return SDL_APP_CONTINUE; return SDL_APP_CONTINUE;
} }
@ -440,6 +447,12 @@ MxResult IsleApp::SetupWindow()
srand(time(NULL)); srand(time(NULL));
// [library:window] Use original game cursors in the resources instead?
m_cursorCurrent = m_cursorArrow = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW);
m_cursorBusy = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_WAIT);
m_cursorNo = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO);
SDL_SetCursor(m_cursorCurrent);
if (m_fullScreen) { if (m_fullScreen) {
m_windowHandle = SDL_CreateWindow(WINDOW_TITLE, g_targetWidth, g_targetHeight, SDL_WINDOW_FULLSCREEN); m_windowHandle = SDL_CreateWindow(WINDOW_TITLE, g_targetWidth, g_targetHeight, SDL_WINDOW_FULLSCREEN);
} }
@ -635,30 +648,36 @@ inline void IsleApp::Tick()
} }
// FUNCTION: ISLE 0x402e80 // FUNCTION: ISLE 0x402e80
void IsleApp::SetupCursor(WPARAM wParam) void IsleApp::SetupCursor(Cursor p_cursor)
{ {
switch (wParam) { switch (p_cursor) {
case 0: case e_cursorArrow:
m_cursorCurrent = m_cursorArrow; m_cursorCurrent = m_cursorArrow;
break; break;
case 1: case e_cursorBusy:
m_cursorCurrent = m_cursorBusy; m_cursorCurrent = m_cursorBusy;
break; break;
case 2: case e_cursorNo:
m_cursorCurrent = m_cursorNo; m_cursorCurrent = m_cursorNo;
break; break;
case 0xB: case e_cursorNone:
m_cursorCurrent = NULL; m_cursorCurrent = NULL;
case 3: case e_cursorUnused3:
case 4: case e_cursorUnused4:
case 5: case e_cursorUnused5:
case 6: case e_cursorUnused6:
case 7: case e_cursorUnused7:
case 8: case e_cursorUnused8:
case 9: case e_cursorUnused9:
case 0xA: case e_cursorUnused10:
break; break;
} }
SetCursor(m_cursorCurrent); if (m_cursorCurrent != NULL) {
SDL_SetCursor(m_cursorCurrent);
SDL_ShowCursor();
}
else {
SDL_HideCursor();
}
} }

View file

@ -8,6 +8,8 @@
#include <SDL3/SDL_video.h> #include <SDL3/SDL_video.h>
#include <windows.h> #include <windows.h>
enum Cursor;
// SIZE 0x8c // SIZE 0x8c
class IsleApp { class IsleApp {
public: public:
@ -32,48 +34,48 @@ public:
void LoadConfig(); void LoadConfig();
void Tick(); void Tick();
void SetupCursor(WPARAM wParam); void SetupCursor(Cursor p_cursor);
static MxU8 MapMouseButtonFlagsToModifier(SDL_MouseButtonFlags p_flags); static MxU8 MapMouseButtonFlagsToModifier(SDL_MouseButtonFlags p_flags);
inline SDL_Window* GetWindowHandle() { return m_windowHandle; } inline SDL_Window* GetWindowHandle() { return m_windowHandle; }
inline MxLong GetFrameDelta() { return m_frameDelta; } inline MxLong GetFrameDelta() { return m_frameDelta; }
inline MxS32 GetFullScreen() { return m_fullScreen; } inline MxS32 GetFullScreen() { return m_fullScreen; }
inline HCURSOR GetCursorCurrent() { return m_cursorCurrent; } inline SDL_Cursor* GetCursorCurrent() { return m_cursorCurrent; }
inline HCURSOR GetCursorBusy() { return m_cursorBusy; } inline SDL_Cursor* GetCursorBusy() { return m_cursorBusy; }
inline HCURSOR GetCursorNo() { return m_cursorNo; } inline SDL_Cursor* GetCursorNo() { return m_cursorNo; }
inline MxS32 GetDrawCursor() { return m_drawCursor; } inline MxS32 GetDrawCursor() { return m_drawCursor; }
inline void SetWindowActive(MxS32 p_windowActive) { m_windowActive = p_windowActive; } inline void SetWindowActive(MxS32 p_windowActive) { m_windowActive = p_windowActive; }
private: private:
char* m_hdPath; // 0x00 char* m_hdPath; // 0x00
char* m_cdPath; // 0x04 char* m_cdPath; // 0x04
char* m_deviceId; // 0x08 char* m_deviceId; // 0x08
char* m_savePath; // 0x0c char* m_savePath; // 0x0c
MxS32 m_fullScreen; // 0x10 MxS32 m_fullScreen; // 0x10
MxS32 m_flipSurfaces; // 0x14 MxS32 m_flipSurfaces; // 0x14
MxS32 m_backBuffersInVram; // 0x18 MxS32 m_backBuffersInVram; // 0x18
MxS32 m_using8bit; // 0x1c MxS32 m_using8bit; // 0x1c
MxS32 m_using16bit; // 0x20 MxS32 m_using16bit; // 0x20
MxS32 m_unk0x24; // 0x24 MxS32 m_unk0x24; // 0x24
MxS32 m_use3dSound; // 0x28 MxS32 m_use3dSound; // 0x28
MxS32 m_useMusic; // 0x2c MxS32 m_useMusic; // 0x2c
MxS32 m_useJoystick; // 0x30 MxS32 m_useJoystick; // 0x30
MxS32 m_joystickIndex; // 0x34 MxS32 m_joystickIndex; // 0x34
MxS32 m_wideViewAngle; // 0x38 MxS32 m_wideViewAngle; // 0x38
MxS32 m_islandQuality; // 0x3c MxS32 m_islandQuality; // 0x3c
MxS32 m_islandTexture; // 0x40 MxS32 m_islandTexture; // 0x40
MxS32 m_gameStarted; // 0x44 MxS32 m_gameStarted; // 0x44
MxLong m_frameDelta; // 0x48 MxLong m_frameDelta; // 0x48
MxVideoParam m_videoParam; // 0x4c MxVideoParam m_videoParam; // 0x4c
MxS32 m_windowActive; // 0x70 MxS32 m_windowActive; // 0x70
SDL_Window* m_windowHandle; // 0x74 SDL_Window* m_windowHandle; // 0x74
MxS32 m_drawCursor; // 0x78 MxS32 m_drawCursor; // 0x78
HCURSOR m_cursorArrow; // 0x7c SDL_Cursor* m_cursorArrow; // 0x7c
HCURSOR m_cursorBusy; // 0x80 SDL_Cursor* m_cursorBusy; // 0x80
HCURSOR m_cursorNo; // 0x84 SDL_Cursor* m_cursorNo; // 0x84
HCURSOR m_cursorCurrent; // 0x88 SDL_Cursor* m_cursorCurrent; // 0x88
}; };
#endif // ISLEAPP_H #endif // ISLEAPP_H

View file

@ -27,6 +27,7 @@
#include "realtime/realtime.h" #include "realtime/realtime.h"
#include "scripts.h" #include "scripts.h"
#include <SDL3/SDL_events.h>
#include <process.h> #include <process.h>
#include <string.h> #include <string.h>
#include <vec.h> #include <vec.h>
@ -451,7 +452,13 @@ void FUN_1003ef00(MxBool p_enable)
// FUNCTION: LEGO1 0x1003ef40 // FUNCTION: LEGO1 0x1003ef40
void SetAppCursor(Cursor p_cursor) void SetAppCursor(Cursor p_cursor)
{ {
PostMessageA(MxOmni::GetInstance()->GetWindowHandle(), WM_ISLE_SETCURSOR, p_cursor, 0); static Uint32 g_userEvent = SDL_RegisterEvents(1);
SDL_Event event;
event.user.type = g_userEvent;
event.user.code = WM_ISLE_SETCURSOR;
event.user.data1 = (void*) p_cursor;
SDL_PushEvent(&event);
} }
// FUNCTION: LEGO1 0x1003ef60 // FUNCTION: LEGO1 0x1003ef60