Implement/match LegoVideoManager::Tickle (#409)

* Implement LegoVideoManager::Tickle

* Match

* Remove duplicate annotations

* Add missing annotations

* Rename list functions

* Fix

* Rename some symbols
This commit is contained in:
Christian Semmler 2024-01-06 12:06:50 -05:00 committed by GitHub
parent 27269647f8
commit dac2a517c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 247 additions and 114 deletions

View File

@ -63,3 +63,10 @@ void Lego3DManager::Destroy()
delete m_viewLODListManager; delete m_viewLODListManager;
m_viewLODListManager = NULL; m_viewLODListManager = NULL;
} }
// STUB: LEGO1 0xx100ab4b0
double Lego3DManager::FUN_100ab4b0(double p_und)
{
// TODO
return 0.0;
}

View File

@ -27,6 +27,7 @@ public:
virtual ~Lego3DManager(); virtual ~Lego3DManager();
BOOL Create(CreateStruct& p_createStruct); BOOL Create(CreateStruct& p_createStruct);
double FUN_100ab4b0(double p_und);
inline Lego3DView* GetLego3DView() { return this->m_3dView; } inline Lego3DView* GetLego3DView() { return this->m_3dView; }
inline ViewLODListManager* GetViewLODListManager() { return this->m_viewLODListManager; } inline ViewLODListManager* GetViewLODListManager() { return this->m_viewLODListManager; }

View File

@ -3,6 +3,7 @@
#include "legoomni.h" #include "legoomni.h"
#include "legoroi.h" #include "legoroi.h"
#include "mxtimer.h" #include "mxtimer.h"
#include "mxtransitionmanager.h"
#include "realtime/matrix.h" #include "realtime/matrix.h"
#include "viewmanager/viewroi.h" #include "viewmanager/viewroi.h"
@ -23,7 +24,7 @@ LegoVideoManager::LegoVideoManager()
m_isFullscreenMovie = FALSE; m_isFullscreenMovie = FALSE;
m_palette = NULL; m_palette = NULL;
m_stopWatch = NULL; m_stopWatch = NULL;
m_cursorMoved = FALSE; m_drawCursor = FALSE;
m_cursorX = m_cursorY; m_cursorX = m_cursorY;
m_cursorYCopy = m_cursorY; m_cursorYCopy = m_cursorY;
m_cursorXCopy = m_cursorY; m_cursorXCopy = m_cursorY;
@ -33,7 +34,7 @@ LegoVideoManager::LegoVideoManager()
m_unk0x528 = 0; m_unk0x528 = 0;
m_arialFont = NULL; m_arialFont = NULL;
m_unk0xe5 = FALSE; m_unk0xe5 = FALSE;
m_unk0x554 = 0; m_unk0x554 = FALSE;
m_initialized = FALSE; m_initialized = FALSE;
} }
@ -214,7 +215,7 @@ void LegoVideoManager::MoveCursor(MxS32 p_cursorX, MxS32 p_cursorY)
{ {
m_cursorX = p_cursorX; m_cursorX = p_cursorX;
m_cursorY = p_cursorY; m_cursorY = p_cursorY;
m_cursorMoved = TRUE; m_drawCursor = TRUE;
if (623 < p_cursorX) if (623 < p_cursorX)
m_cursorX = 623; m_cursorX = 623;
@ -223,11 +224,107 @@ void LegoVideoManager::MoveCursor(MxS32 p_cursorX, MxS32 p_cursorY)
m_cursorY = 463; m_cursorY = 463;
} }
// STUB: LEGO1 0x1007b770 inline void LegoVideoManager::DrawCursor()
{
if (m_cursorX != m_cursorXCopy || m_cursorY != m_cursorYCopy) {
if (m_cursorX >= 0 && m_cursorY >= 0) {
m_cursorXCopy = m_cursorX;
m_cursorYCopy = m_cursorY;
}
}
LPDIRECTDRAWSURFACE ddSurface2 = m_displaySurface->GetDirectDrawSurface2();
if (!m_unk0x514) {
m_unk0x518.top = 0;
m_unk0x518.left = 0;
m_unk0x518.bottom = 16;
m_unk0x518.right = 16;
m_unk0x514 = MxDisplaySurface::FUN_100bc070();
if (!m_unk0x514)
m_drawCursor = FALSE;
}
ddSurface2->BltFast(m_cursorXCopy, m_cursorYCopy, m_unk0x514, &m_unk0x518, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
}
// FUNCTION: LEGO1 0x1007b770
MxResult LegoVideoManager::Tickle() MxResult LegoVideoManager::Tickle()
{
if (m_unk0x554 && !m_videoParam.Flags().GetFlipSurfaces() &&
TransitionManager()->GetTransitionType() == MxTransitionManager::NOT_TRANSITIONING)
Sleep(30);
m_stopWatch->Stop();
m_elapsedSeconds = m_stopWatch->ElapsedSeconds();
m_stopWatch->Reset();
m_stopWatch->Start();
m_direct3d->RestoreSurfaces();
SortPresenterList();
MxPresenter* presenter;
MxPresenterListCursor cursor(m_presenters);
while (cursor.Next(presenter))
presenter->Tickle();
if (m_unk0xe4 && !m_initialized)
m_3dManager->GetLego3DView()->GetView()->Clear();
MxRect32 rect(0, 0, m_videoParam.GetRect().GetWidth() - 1, m_videoParam.GetRect().GetHeight() - 1);
InvalidateRect(rect);
if (!m_initialized && (m_unk0xe4 || m_unk0xe5)) {
cursor.Reset();
while (cursor.Next(presenter) && presenter->GetDisplayZ() >= 0)
presenter->PutData();
if (!m_unk0xe5) {
m_3dManager->FUN_100ab4b0(0.0);
m_3dManager->GetLego3DView()->GetDevice()->Update();
}
cursor.Prev();
while (cursor.Next(presenter))
presenter->PutData();
if (m_drawCursor)
DrawCursor();
if (m_drawFPS)
DrawFPS();
}
else if (m_unk0x500) {
MxPresenter* presenter;
MxPresenterListCursor cursor(m_presenters);
if (cursor.Last(presenter))
presenter->PutData();
}
if (!m_initialized) {
if (m_unk0xe4 && m_videoParam.Flags().GetFlipSurfaces()) {
m_3dManager->GetLego3DView()
->GetView()
->ForceUpdate(0, 0, m_videoParam.GetRect().GetWidth(), m_videoParam.GetRect().GetHeight());
}
UpdateRegion();
}
m_region->Reset();
return SUCCESS;
}
// STUB: LEGO1 0x1007bbc0
void LegoVideoManager::DrawFPS()
{ {
// TODO // TODO
return MxVideoManager::Tickle();
} }
// STUB: LEGO1 0x1007c080 // STUB: LEGO1 0x1007c080

View File

@ -43,40 +43,46 @@ public:
private: private:
MxResult CreateDirect3D(); MxResult CreateDirect3D();
MxResult ConfigureD3DRM(); MxResult ConfigureD3DRM();
void DrawFPS();
Tgl::Renderer* m_renderer; inline void DrawCursor();
Lego3DManager* m_3dManager; // 0x68
LegoROI* m_viewROI; // 0x6c Tgl::Renderer* m_renderer; // 0x64
undefined4 m_unk0x70; Lego3DManager* m_3dManager; // 0x68
MxDirect3D* m_direct3d; // 0x74 LegoROI* m_viewROI; // 0x6c
undefined4 m_unk0x78[27]; undefined4 m_unk0x70; // 0x70
MxBool m_unk0xe4; MxDirect3D* m_direct3d; // 0x74
MxBool m_unk0xe5; undefined4 m_unk0x78[27]; // 0x78
MxBool m_unk0xe6; MxBool m_unk0xe4; // 0xe4
MxBool m_unk0xe5; // 0xe5
MxBool m_unk0xe6; // 0xe6
PALETTEENTRY m_paletteEntries[256]; // 0xe7 PALETTEENTRY m_paletteEntries[256]; // 0xe7
undefined m_padding0x4e7; undefined m_padding0x4e7; // 0x4e7
MxUnknown100d9d00* m_unk0x100d9d00; // 0x4e8 MxUnknown100d9d00* m_unk0x100d9d00; // 0x4e8
MxBool m_isFullscreenMovie; // 0x4ec MxBool m_isFullscreenMovie; // 0x4ec
MxPalette* m_palette; // 0x4f0 MxPalette* m_palette; // 0x4f0
MxStopWatch* m_stopWatch; // 0x4f4 MxStopWatch* m_stopWatch; // 0x4f4
undefined m_padding0x4f4[8]; double m_elapsedSeconds; // 0x4f8
MxBool m_unk0x500; MxBool m_unk0x500; // 0x500
MxBool m_cursorMoved; // 0x501 MxBool m_drawCursor; // 0x501
MxS32 m_cursorXCopy; // 0x504 MxS32 m_cursorXCopy; // 0x504
MxS32 m_cursorYCopy; // 0x508 MxS32 m_cursorYCopy; // 0x508
MxS32 m_cursorX; // 0x50c MxS32 m_cursorX; // 0x50c
MxS32 m_cursorY; // 0x510 MxS32 m_cursorY; // 0x510
undefined4 m_unk0x514; LPDIRECTDRAWSURFACE m_unk0x514; // 0x514
undefined m_pad0x518[0x10]; RECT m_unk0x518; // 0x518
undefined4 m_unk0x528; undefined4 m_unk0x528; // 0x528
MxBool m_drawFPS; // 0x52c MxBool m_drawFPS; // 0x52c
RECT m_fpsRect; // 0x530 RECT m_fpsRect; // 0x530
HFONT m_arialFont; // 0x540 HFONT m_arialFont; // 0x540
SIZE m_fpsSize; // 0x544 SIZE m_fpsSize; // 0x544
undefined m_pad0x54c[8]; undefined m_pad0x54c[8]; // 0x54c
undefined m_unk0x554; MxBool m_unk0x554; // 0x554
MxBool m_initialized; // 0x555 MxBool m_initialized; // 0x555
undefined m_pad0x556[0x39]; undefined m_pad0x556[0x39]; // 0x556
}; };
// SYNTHETIC: LEGO1 0x1007ab20
// LegoVideoManager::`scalar deleting destructor'
#endif // LEGOVIDEOMANAGER_H #endif // LEGOVIDEOMANAGER_H

View File

@ -84,4 +84,7 @@ protected:
// FUNCTION: LEGO1 0x1001f0c0 // FUNCTION: LEGO1 0x1001f0c0
// MxPresenterListCursor::~MxPresenterListCursor // MxPresenterListCursor::~MxPresenterListCursor
// TEMPLATE: LEGO1 0x10020760
// MxListCursor<MxPresenter *>::MxListCursor<MxPresenter *>
#endif // LEGOWORLD_H #endif // LEGOWORLD_H

View File

@ -39,6 +39,55 @@ public:
void* m_unk0x178; // 0x178 void* m_unk0x178; // 0x178
}; };
__declspec(dllexport) int FlipToGDISurface();
__declspec(dllexport) static int GetPrimaryBitDepth();
__declspec(dllexport) int Pause(int);
MxDirectDraw();
virtual ~MxDirectDraw();
virtual BOOL Create(
HWND hWnd,
BOOL fullscreen_1,
BOOL surface_fullscreen,
BOOL onlySystemMemory,
int width,
int height,
int bpp,
const PALETTEENTRY* pPaletteEntries,
int paletteEntryCount
); // vtable+0x04
virtual void Destroy(); // vtable+0x08
virtual void DestroyButNotDirectDraw(); // vtable+0x0c
virtual const char* ErrorToString(HRESULT p_error); // vtable+0x10
BOOL CacheOriginalPaletteEntries();
HRESULT CreateDDSurface(LPDDSURFACEDESC a2, LPDIRECTDRAWSURFACE* a3, IUnknown* a4);
BOOL CreateTextSurfaces();
BOOL CreateZBuffer(DWORD memorytype, DWORD depth);
BOOL DDCreateSurfaces();
BOOL DDInit(BOOL fullscreen);
BOOL DDSetMode(int width, int height, int bpp);
void Error(const char* p_message, MxS32 p_error);
BOOL GetDDSurfaceDesc(LPDDSURFACEDESC lpDDSurfDesc, LPDIRECTDRAWSURFACE lpDDSurf);
BOOL IsSupportedMode(int width, int height, int bpp);
BOOL RecreateDirectDraw(GUID** a2);
BOOL RestoreOriginalPaletteEntries();
BOOL RestorePaletteEntries();
BOOL RestoreSurfaces();
BOOL SetPaletteEntries(const PALETTEENTRY* pPaletteEntries, int paletteEntryCount, BOOL fullscreen);
BOOL TextToTextSurface(const char* text, IDirectDrawSurface* pSurface, SIZE& textSizeOnSurface);
BOOL TextToTextSurface1(const char* text);
BOOL TextToTextSurface2(const char* lpString);
void FUN_1009e020();
void FUN_1009d920();
inline IDirectDraw* GetDirectDraw() { return m_pDirectDraw; }
inline IDirectDrawSurface* GetFrontBuffer() { return m_pFrontBuffer; }
inline IDirectDrawSurface* GetBackBuffer() { return m_pBackBuffer; }
inline IDirectDrawClipper* GetClipper() { return m_pClipper; }
protected: protected:
BOOL m_bOnlySoftRender; // 0x04 BOOL m_bOnlySoftRender; // 0x04
BOOL m_bFlipSurfaces; // 0x08 BOOL m_bFlipSurfaces; // 0x08
@ -69,57 +118,6 @@ protected:
int m_pauseCount; // 0x86c int m_pauseCount; // 0x86c
DeviceModesInfo* m_pCurrentDeviceModesList; // 0x870 DeviceModesInfo* m_pCurrentDeviceModesList; // 0x870
Mode m_currentMode; // 0x874 Mode m_currentMode; // 0x874
public:
__declspec(dllexport) int FlipToGDISurface();
__declspec(dllexport) static int GetPrimaryBitDepth();
__declspec(dllexport) int Pause(int);
MxDirectDraw();
virtual ~MxDirectDraw();
virtual BOOL Create(
HWND hWnd,
BOOL fullscreen_1,
BOOL surface_fullscreen,
BOOL onlySystemMemory,
int width,
int height,
int bpp,
const PALETTEENTRY* pPaletteEntries,
int paletteEntryCount
); // vtable+0x04
virtual void Destroy(); // vtable+0x08
virtual void DestroyButNotDirectDraw(); // vtable+0x0c
virtual const char* ErrorToString(HRESULT p_error); // vtable+0x10
inline IDirectDraw* GetDirectDraw() { return m_pDirectDraw; }
inline IDirectDrawSurface* GetFrontBuffer() { return m_pFrontBuffer; }
inline IDirectDrawSurface* GetBackBuffer() { return m_pBackBuffer; }
inline IDirectDrawClipper* GetClipper() { return m_pClipper; }
protected:
BOOL CacheOriginalPaletteEntries();
HRESULT CreateDDSurface(LPDDSURFACEDESC a2, LPDIRECTDRAWSURFACE* a3, IUnknown* a4);
BOOL CreateTextSurfaces();
BOOL CreateZBuffer(DWORD memorytype, DWORD depth);
BOOL DDCreateSurfaces();
BOOL DDInit(BOOL fullscreen);
BOOL DDSetMode(int width, int height, int bpp);
void Error(const char* p_message, MxS32 p_error);
BOOL GetDDSurfaceDesc(LPDDSURFACEDESC lpDDSurfDesc, LPDIRECTDRAWSURFACE lpDDSurf);
BOOL IsSupportedMode(int width, int height, int bpp);
BOOL RecreateDirectDraw(GUID** a2);
BOOL RestoreOriginalPaletteEntries();
BOOL RestorePaletteEntries();
BOOL RestoreSurfaces();
BOOL SetPaletteEntries(const PALETTEENTRY* pPaletteEntries, int paletteEntryCount, BOOL fullscreen);
BOOL TextToTextSurface(const char* text, IDirectDrawSurface* pSurface, SIZE& textSizeOnSurface);
BOOL TextToTextSurface1(const char* text);
BOOL TextToTextSurface2(const char* lpString);
void FUN_1009e020();
void FUN_1009d920();
}; };
#endif // MXDIRECTDRAW_H #endif // MXDIRECTDRAW_H

View File

@ -11,6 +11,8 @@
// NOTE: MxStopWatch measures elapsed (wall clock) time. // NOTE: MxStopWatch measures elapsed (wall clock) time.
// //
#define HUGE_VAL_IMMEDIATE 1.7976931348623157e+308
class MxStopWatch { class MxStopWatch {
public: public:
MxStopWatch(); MxStopWatch();
@ -54,7 +56,7 @@ inline void MxStopWatch::Stop()
if (endTick.HighPart != m_startTick.HighPart) { if (endTick.HighPart != m_startTick.HighPart) {
// LARGE_INTEGER arithmetic not yet provided // LARGE_INTEGER arithmetic not yet provided
m_elapsedSeconds = HUGE_VAL; m_elapsedSeconds = HUGE_VAL_IMMEDIATE;
} }
else { else {
m_elapsedSeconds += ((endTick.LowPart - m_startTick.LowPart) / (double) m_ticksPerSeconds); m_elapsedSeconds += ((endTick.LowPart - m_startTick.LowPart) / (double) m_ticksPerSeconds);

View File

@ -569,6 +569,12 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44(MxBitmap*, undefined4*, undefin
return NULL; return NULL;
} }
// STUB: LEGO1 0x100bc070
LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070()
{
return NULL;
}
// STUB: LEGO1 0x100bc200 // STUB: LEGO1 0x100bc200
void MxDisplaySurface::VTable0x24( void MxDisplaySurface::VTable0x24(
LPDDSURFACEDESC, LPDDSURFACEDESC,

View File

@ -86,6 +86,7 @@ public:
virtual LPDIRECTDRAWSURFACE VTable0x44(MxBitmap*, undefined4*, undefined4, undefined4); // vtable+0x44 virtual LPDIRECTDRAWSURFACE VTable0x44(MxBitmap*, undefined4*, undefined4, undefined4); // vtable+0x44
void FUN_100ba640(); void FUN_100ba640();
static LPDIRECTDRAWSURFACE FUN_100bc070();
inline LPDIRECTDRAWSURFACE GetDirectDrawSurface1() { return this->m_ddSurface1; } inline LPDIRECTDRAWSURFACE GetDirectDrawSurface1() { return this->m_ddSurface1; }
inline LPDIRECTDRAWSURFACE GetDirectDrawSurface2() { return this->m_ddSurface2; } inline LPDIRECTDRAWSURFACE GetDirectDrawSurface2() { return this->m_ddSurface2; }

View File

@ -91,12 +91,13 @@ public:
MxBool Find(T p_obj); MxBool Find(T p_obj);
void Detach(); void Detach();
void Destroy(); void Destroy();
MxBool Next();
MxBool Next(T& p_obj); MxBool Next(T& p_obj);
MxBool Prev();
MxBool Prev(T& p_obj); MxBool Prev(T& p_obj);
MxBool Current(T& p_obj); MxBool Current(T& p_obj);
MxBool First(T& p_obj); MxBool First(T& p_obj);
MxBool Last(T& p_obj); MxBool Last(T& p_obj);
MxBool Advance();
MxBool HasMatch() { return m_match != NULL; } MxBool HasMatch() { return m_match != NULL; }
void SetValue(T p_obj); void SetValue(T p_obj);
MxBool Head() MxBool Head()
@ -222,6 +223,17 @@ inline void MxListCursor<T>::Destroy()
} }
} }
template <class T>
inline MxBool MxListCursor<T>::Next()
{
if (!m_match)
m_match = m_list->m_first;
else
m_match = m_match->GetNext();
return m_match != NULL;
}
template <class T> template <class T>
inline MxBool MxListCursor<T>::Next(T& p_obj) inline MxBool MxListCursor<T>::Next(T& p_obj)
{ {
@ -236,6 +248,17 @@ inline MxBool MxListCursor<T>::Next(T& p_obj)
return m_match != NULL; return m_match != NULL;
} }
template <class T>
inline MxBool MxListCursor<T>::Prev()
{
if (!m_match)
m_match = m_list->m_last;
else
m_match = m_match->GetPrev();
return m_match != NULL;
}
template <class T> template <class T>
inline MxBool MxListCursor<T>::Prev(T& p_obj) inline MxBool MxListCursor<T>::Prev(T& p_obj)
{ {
@ -279,17 +302,6 @@ inline MxBool MxListCursor<T>::Last(T& p_obj)
return m_match != NULL; return m_match != NULL;
} }
template <class T>
inline MxBool MxListCursor<T>::Advance()
{
if (!m_match)
m_match = m_list->m_first;
else
m_match = m_match->GetNext();
return m_match != NULL;
}
template <class T> template <class T>
inline void MxListCursor<T>::SetValue(T p_obj) inline void MxListCursor<T>::SetValue(T p_obj)
{ {

View File

@ -99,7 +99,7 @@ void MxLoopingSmkPresenter::RepeatingTickle()
while (cursor.Next(chunk)) while (cursor.Next(chunk))
chunk->SetTime(chunk->GetTime() + time); chunk->SetTime(chunk->GetTime() + time);
m_cursor->Advance(); m_cursor->Next();
} }
MxStreamChunk* chunk; MxStreamChunk* chunk;

View File

@ -146,7 +146,7 @@ void MxRegionTopBottom::FUN_100c5280(MxS32 p_left, MxS32 p_right)
p_right = leftRight->GetRight(); p_right = leftRight->GetRight();
b = a; b = a;
b.Advance(); b.Next();
a.Destroy(); a.Destroy();
if (!b.Current(leftRight)) if (!b.Current(leftRight))

View File

@ -43,6 +43,8 @@ public:
MxResult StartTransition(TransitionType p_animationType, MxS32 p_speed, MxBool p_doCopy, MxBool p_playMusicInAnim); MxResult StartTransition(TransitionType p_animationType, MxS32 p_speed, MxBool p_doCopy, MxBool p_playMusicInAnim);
inline TransitionType GetTransitionType() { return m_transitionType; }
private: private:
void EndTransition(MxBool p_notifyWorld); void EndTransition(MxBool p_notifyWorld);
void TransitionNone(); void TransitionNone();
@ -55,21 +57,19 @@ private:
void SubmitCopyRect(LPDDSURFACEDESC p_ddsc); void SubmitCopyRect(LPDDSURFACEDESC p_ddsc);
void SetupCopyRect(LPDDSURFACEDESC p_ddsc); void SetupCopyRect(LPDDSURFACEDESC p_ddsc);
MxVideoPresenter* m_waitIndicator; MxVideoPresenter* m_waitIndicator; // 0x08
RECT m_copyRect; RECT m_copyRect; // 0x0c
MxU8* m_copyBuffer; MxU8* m_copyBuffer; // 0x1c
FlagBitfield m_copyFlags; // 0x20
FlagBitfield m_copyFlags; undefined4 m_unk0x24; // 0x24
undefined4 m_unk0x24; FlagBitfield m_unk0x28; // 0x28
FlagBitfield m_unk0x28; TransitionType m_transitionType; // 0x2c
LPDIRECTDRAWSURFACE m_ddSurface; // 0x30
TransitionType m_transitionType; MxU16 m_animationTimer; // 0x34
LPDIRECTDRAWSURFACE m_ddSurface; MxU16 m_columnOrder[640]; // 0x36
MxU16 m_animationTimer; MxU16 m_randomShift[480]; // 0x536
MxU16 m_columnOrder[640]; // 0x36 MxULong m_systemTime; // 0x8f8
MxU16 m_randomShift[480]; // 0x536 MxS32 m_animationSpeed; // 0x8fc
MxULong m_systemTime; // 0x8f8
MxS32 m_animationSpeed; // 0x8fc
}; };
#endif // MXTRANSITIONMANAGER_H #endif // MXTRANSITIONMANAGER_H