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;
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();
BOOL Create(CreateStruct& p_createStruct);
double FUN_100ab4b0(double p_und);
inline Lego3DView* GetLego3DView() { return this->m_3dView; }
inline ViewLODListManager* GetViewLODListManager() { return this->m_viewLODListManager; }

View file

@ -3,6 +3,7 @@
#include "legoomni.h"
#include "legoroi.h"
#include "mxtimer.h"
#include "mxtransitionmanager.h"
#include "realtime/matrix.h"
#include "viewmanager/viewroi.h"
@ -23,7 +24,7 @@ LegoVideoManager::LegoVideoManager()
m_isFullscreenMovie = FALSE;
m_palette = NULL;
m_stopWatch = NULL;
m_cursorMoved = FALSE;
m_drawCursor = FALSE;
m_cursorX = m_cursorY;
m_cursorYCopy = m_cursorY;
m_cursorXCopy = m_cursorY;
@ -33,7 +34,7 @@ LegoVideoManager::LegoVideoManager()
m_unk0x528 = 0;
m_arialFont = NULL;
m_unk0xe5 = FALSE;
m_unk0x554 = 0;
m_unk0x554 = FALSE;
m_initialized = FALSE;
}
@ -214,7 +215,7 @@ void LegoVideoManager::MoveCursor(MxS32 p_cursorX, MxS32 p_cursorY)
{
m_cursorX = p_cursorX;
m_cursorY = p_cursorY;
m_cursorMoved = TRUE;
m_drawCursor = TRUE;
if (623 < p_cursorX)
m_cursorX = 623;
@ -223,11 +224,107 @@ void LegoVideoManager::MoveCursor(MxS32 p_cursorX, MxS32 p_cursorY)
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()
{
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
return MxVideoManager::Tickle();
}
// STUB: LEGO1 0x1007c080

View file

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

View file

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

View file

@ -39,6 +39,55 @@ public:
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:
BOOL m_bOnlySoftRender; // 0x04
BOOL m_bFlipSurfaces; // 0x08
@ -69,57 +118,6 @@ protected:
int m_pauseCount; // 0x86c
DeviceModesInfo* m_pCurrentDeviceModesList; // 0x870
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

View file

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

View file

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

View file

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

View file

@ -91,12 +91,13 @@ public:
MxBool Find(T p_obj);
void Detach();
void Destroy();
MxBool Next();
MxBool Next(T& p_obj);
MxBool Prev();
MxBool Prev(T& p_obj);
MxBool Current(T& p_obj);
MxBool First(T& p_obj);
MxBool Last(T& p_obj);
MxBool Advance();
MxBool HasMatch() { return m_match != NULL; }
void SetValue(T p_obj);
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>
inline MxBool MxListCursor<T>::Next(T& p_obj)
{
@ -236,6 +248,17 @@ inline MxBool MxListCursor<T>::Next(T& p_obj)
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>
inline MxBool MxListCursor<T>::Prev(T& p_obj)
{
@ -279,17 +302,6 @@ inline MxBool MxListCursor<T>::Last(T& p_obj)
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>
inline void MxListCursor<T>::SetValue(T p_obj)
{

View file

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

View file

@ -146,7 +146,7 @@ void MxRegionTopBottom::FUN_100c5280(MxS32 p_left, MxS32 p_right)
p_right = leftRight->GetRight();
b = a;
b.Advance();
b.Next();
a.Destroy();
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);
inline TransitionType GetTransitionType() { return m_transitionType; }
private:
void EndTransition(MxBool p_notifyWorld);
void TransitionNone();
@ -55,21 +57,19 @@ private:
void SubmitCopyRect(LPDDSURFACEDESC p_ddsc);
void SetupCopyRect(LPDDSURFACEDESC p_ddsc);
MxVideoPresenter* m_waitIndicator;
RECT m_copyRect;
MxU8* m_copyBuffer;
FlagBitfield m_copyFlags;
undefined4 m_unk0x24;
FlagBitfield m_unk0x28;
TransitionType m_transitionType;
LPDIRECTDRAWSURFACE m_ddSurface;
MxU16 m_animationTimer;
MxU16 m_columnOrder[640]; // 0x36
MxU16 m_randomShift[480]; // 0x536
MxULong m_systemTime; // 0x8f8
MxS32 m_animationSpeed; // 0x8fc
MxVideoPresenter* m_waitIndicator; // 0x08
RECT m_copyRect; // 0x0c
MxU8* m_copyBuffer; // 0x1c
FlagBitfield m_copyFlags; // 0x20
undefined4 m_unk0x24; // 0x24
FlagBitfield m_unk0x28; // 0x28
TransitionType m_transitionType; // 0x2c
LPDIRECTDRAWSURFACE m_ddSurface; // 0x30
MxU16 m_animationTimer; // 0x34
MxU16 m_columnOrder[640]; // 0x36
MxU16 m_randomShift[480]; // 0x536
MxULong m_systemTime; // 0x8f8
MxS32 m_animationSpeed; // 0x8fc
};
#endif // MXTRANSITIONMANAGER_H