Implement/match MxDisplaySurface::Create (#115)

This commit is contained in:
Christian Semmler 2023-08-28 05:49:15 -04:00 committed by GitHub
parent 23457da730
commit 2233da39d8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 112 additions and 11 deletions

View file

@ -1,4 +1,5 @@
#include "mxdisplaysurface.h" #include "mxdisplaysurface.h"
#include "mxomni.h"
DECOMP_SIZE_ASSERT(MxDisplaySurface, 0xac); DECOMP_SIZE_ASSERT(MxDisplaySurface, 0xac);
@ -45,10 +46,105 @@ MxResult MxDisplaySurface::Init(MxVideoParam &p_videoParam, LPDIRECTDRAWSURFACE
return result; return result;
} }
// OFFSET: LEGO1 0x100ba7f0 STUB // OFFSET: LEGO1 0x100ba7f0
MxResult MxDisplaySurface::Create(MxVideoParam *p_videoParam) MxResult MxDisplaySurface::Create(MxVideoParam &p_videoParam)
{ {
return 0; DDSURFACEDESC ddsd;
MxResult result = FAILURE;
LPDIRECTDRAW lpDirectDraw = MVideoManager()->GetDirectDraw();
HWND hWnd = MxOmni::GetInstance()->GetWindowHandle();
this->m_initialized = TRUE;
this->m_videoParam = p_videoParam;
if (!this->m_videoParam.flags().GetFullScreen())
this->m_videoParam.flags().SetFlipSurfaces(FALSE);
if (!this->m_videoParam.flags().GetFlipSurfaces()) {
this->m_videoParam.SetBackBuffers(1);
}
else {
MxU32 backBuffers = this->m_videoParam.GetBackBuffers();
if (backBuffers < 1)
this->m_videoParam.SetBackBuffers(1);
else if (backBuffers > 2)
this->m_videoParam.SetBackBuffers(2);
this->m_videoParam.flags().SetBackBuffers(TRUE);
}
if (this->m_videoParam.flags().GetFullScreen()) {
MxS32 width = this->m_videoParam.GetRect().m_right - this->m_videoParam.GetRect().m_left + 1;
MxS32 height = this->m_videoParam.GetRect().m_bottom - this->m_videoParam.GetRect().m_top + 1;
if (lpDirectDraw->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN))
goto done;
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
if (lpDirectDraw->GetDisplayMode(&ddsd))
goto done;
MxS32 bitdepth = !this->m_videoParam.flags().Get16Bit() ? 8 : 16;
if (ddsd.dwWidth != width || ddsd.dwHeight != height || ddsd.ddpfPixelFormat.dwRGBBitCount != bitdepth) {
if (lpDirectDraw->SetDisplayMode(width, height, bitdepth))
goto done;
}
}
if (this->m_videoParam.flags().GetFlipSurfaces()) {
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwBackBufferCount = this->m_videoParam.GetBackBuffers();
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_3DDEVICE | DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
if (lpDirectDraw->CreateSurface(&ddsd, &this->m_ddSurface1, NULL))
goto done;
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
if (this->m_ddSurface1->GetAttachedSurface(&ddsd.ddsCaps, &this->m_ddSurface2))
goto done;
}
else {
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if (lpDirectDraw->CreateSurface(&ddsd, &this->m_ddSurface1, NULL))
goto done;
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_CAPS;
ddsd.dwWidth = this->m_videoParam.GetRect().m_right - this->m_videoParam.GetRect().m_left + 1;
ddsd.dwHeight = this->m_videoParam.GetRect().m_bottom - this->m_videoParam.GetRect().m_top + 1;
ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE | DDSCAPS_OFFSCREENPLAIN;
if (!this->m_videoParam.flags().GetBackBuffers())
ddsd.ddsCaps.dwCaps = DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN;
if (lpDirectDraw->CreateSurface(&ddsd, &this->m_ddSurface2, NULL))
goto done;
}
memset(&this->m_surfaceDesc, 0, sizeof(this->m_surfaceDesc));
this->m_surfaceDesc.dwSize = sizeof(this->m_surfaceDesc);
if (!this->m_ddSurface2->GetSurfaceDesc(&this->m_surfaceDesc)) {
if (!lpDirectDraw->CreateClipper(0, &this->m_ddClipper, NULL) &&
!this->m_ddClipper->SetHWnd(0, hWnd) &&
!this->m_ddSurface1->SetClipper(this->m_ddClipper))
result = SUCCESS;
}
done:
return result;
} }
// OFFSET: LEGO1 0x100baa90 // OFFSET: LEGO1 0x100baa90

View file

@ -20,7 +20,7 @@ class MxDisplaySurface : public MxCore
void Reset(); void Reset();
virtual MxResult Init(MxVideoParam &p_videoParam, LPDIRECTDRAWSURFACE p_ddSurface1, LPDIRECTDRAWSURFACE p_ddSurface2, LPDIRECTDRAWCLIPPER p_ddClipper); virtual MxResult Init(MxVideoParam &p_videoParam, LPDIRECTDRAWSURFACE p_ddSurface1, LPDIRECTDRAWSURFACE p_ddSurface2, LPDIRECTDRAWCLIPPER p_ddClipper);
virtual MxResult Create(MxVideoParam *p_videoParam); virtual MxResult Create(MxVideoParam &p_videoParam);
virtual void Clear(); virtual void Clear();
virtual void SetPalette(MxPalette *p_palette); virtual void SetPalette(MxPalette *p_palette);
virtual void vtable24(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); virtual void vtable24(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4);

View file

@ -38,6 +38,7 @@ class MxOmni : public MxCore
virtual MxResult Create(MxOmniCreateParam &p); // vtable+18 virtual MxResult Create(MxOmniCreateParam &p); // vtable+18
virtual void Destroy(); // vtable+1c virtual void Destroy(); // vtable+1c
static void SetInstance(MxOmni* instance); static void SetInstance(MxOmni* instance);
HWND GetWindowHandle() const { return this->m_windowHandle; }
MxObjectFactory* GetObjectFactory() const { return this->m_objectFactory; } MxObjectFactory* GetObjectFactory() const { return this->m_objectFactory; }
MxNotificationManager* GetNotificationManager() const { return this->m_notificationManager; } MxNotificationManager* GetNotificationManager() const { return this->m_notificationManager; }
MxTickleManager* GetTickleManager() const { return this->m_tickleManager; } MxTickleManager* GetTickleManager() const { return this->m_tickleManager; }
@ -53,7 +54,7 @@ class MxOmni : public MxCore
static MxOmni* g_instance; static MxOmni* g_instance;
MxString m_mediaPath; // 0x8 MxString m_mediaPath; // 0x8
HWND *m_windowHandle; // 0x18; HWND m_windowHandle; // 0x18;
MxObjectFactory *m_objectFactory; // 0x1C MxObjectFactory *m_objectFactory; // 0x1C
MxVariableTable* m_variableTable; //0x20 MxVariableTable* m_variableTable; //0x20
MxTickleManager* m_tickleManager; //0x24 MxTickleManager* m_tickleManager; //0x24

View file

@ -5,7 +5,7 @@ class MxRect32
{ {
public: public:
MxRect32() { } MxRect32() { }
MxRect32(int p_left, int p_top, int p_right, int p_bottom) MxRect32(MxS32 p_left, MxS32 p_top, MxS32 p_right, MxS32 p_bottom)
{ {
this->m_left = p_left; this->m_left = p_left;
this->m_top = p_top; this->m_top = p_top;
@ -13,10 +13,10 @@ class MxRect32
this->m_bottom = p_bottom; this->m_bottom = p_bottom;
} }
int m_left; MxS32 m_left;
int m_top; MxS32 m_top;
int m_right; MxS32 m_right;
int m_bottom; MxS32 m_bottom;
}; };
#endif // MXRECT32_H #endif // MXRECT32_H

View file

@ -24,12 +24,16 @@ class MxVideoParam
inline MxVideoParamFlags &flags() { return m_flags; } inline MxVideoParamFlags &flags() { return m_flags; }
inline void SetPalette(MxPalette *p_palette) { this->m_palette = p_palette; } inline void SetPalette(MxPalette *p_palette) { this->m_palette = p_palette; }
inline void SetBackBuffers(MxU32 p_backBuffers) { this->m_backBuffers = p_backBuffers; }
inline MxRect32 &GetRect() { return this->m_rect; }
inline MxPalette *GetPalette() { return this->m_palette; } inline MxPalette *GetPalette() { return this->m_palette; }
inline MxU32 GetBackBuffers() { return this->m_backBuffers; }
private: private:
MxRect32 m_rect; MxRect32 m_rect;
MxPalette *m_palette; MxPalette *m_palette;
unsigned int m_backBuffers; MxU32 m_backBuffers;
MxVideoParamFlags m_flags; MxVideoParamFlags m_flags;
int m_unk1c; int m_unk1c;
char *m_deviceId; char *m_deviceId;