MxDirect3D (#114)

* MxDirect3D Constructor

* Implement MxDirect3D::Clear (not yet matching)

* Match MxDirect3D::Clear

* Building out MxDirect3D, link dxguid, add size asserts

* Move a few things around on the Enumerate context obj

* remove dupe mxdirect3d

* Match BuildErrorString and _DoEnumerate

* Fix style

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
Co-authored-by: disinvite <disinvite@users.noreply.github.com>
This commit is contained in:
Joshua Peisach 2023-09-10 08:56:16 -04:00 committed by GitHub
parent 1fa2fd9737
commit dc18b5d9c1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 262 additions and 10 deletions

View file

@ -46,9 +46,9 @@ add_library(lego1 SHARED
LEGO1/jukeboxentity.cpp LEGO1/jukeboxentity.cpp
LEGO1/jukeboxstate.cpp LEGO1/jukeboxstate.cpp
LEGO1/legoact2state.cpp LEGO1/legoact2state.cpp
LEGO1/legoactor.cpp
LEGO1/legoactioncontrolpresenter.cpp LEGO1/legoactioncontrolpresenter.cpp
LEGO1/legoactor.cpp LEGO1/legoactor.cpp
LEGO1/legoactor.cpp
LEGO1/legoanimactor.cpp LEGO1/legoanimactor.cpp
LEGO1/legoanimationmanager.cpp LEGO1/legoanimationmanager.cpp
LEGO1/legoanimmmpresenter.cpp LEGO1/legoanimmmpresenter.cpp
@ -102,6 +102,7 @@ add_library(lego1 SHARED
LEGO1/mxcontrolpresenter.cpp LEGO1/mxcontrolpresenter.cpp
LEGO1/mxcore.cpp LEGO1/mxcore.cpp
LEGO1/mxcriticalsection.cpp LEGO1/mxcriticalsection.cpp
LEGO1/mxdirect3d.cpp
LEGO1/mxdirectdraw.cpp LEGO1/mxdirectdraw.cpp
LEGO1/mxdiskstreamcontroller.cpp LEGO1/mxdiskstreamcontroller.cpp
LEGO1/mxdiskstreamprovider.cpp LEGO1/mxdiskstreamprovider.cpp
@ -118,10 +119,10 @@ add_library(lego1 SHARED
LEGO1/mxdsparallelaction.cpp LEGO1/mxdsparallelaction.cpp
LEGO1/mxdsselectaction.cpp LEGO1/mxdsselectaction.cpp
LEGO1/mxdsserialaction.cpp LEGO1/mxdsserialaction.cpp
LEGO1/mxdsstreamingaction.cpp
LEGO1/mxdssound.cpp LEGO1/mxdssound.cpp
LEGO1/mxdssource.cpp LEGO1/mxdssource.cpp
LEGO1/mxdsstill.cpp LEGO1/mxdsstill.cpp
LEGO1/mxdsstreamingaction.cpp
LEGO1/mxdssubscriber.cpp LEGO1/mxdssubscriber.cpp
LEGO1/mxentity.cpp LEGO1/mxentity.cpp
LEGO1/mxeventmanager.cpp LEGO1/mxeventmanager.cpp
@ -205,7 +206,7 @@ if (ISLE_USE_DX5)
endif() endif()
# Link libraries # Link libraries
target_link_libraries(lego1 PRIVATE ddraw dsound winmm) target_link_libraries(lego1 PRIVATE ddraw dsound dxguid winmm)
# Make sure filenames are ALL CAPS # Make sure filenames are ALL CAPS
set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1) set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1)

View file

@ -0,0 +1,191 @@
#include "mxdirect3d.h"
#include <stdio.h> // for vsprintf
DECOMP_SIZE_ASSERT(MxDirect3D, 0x894);
DECOMP_SIZE_ASSERT(MxDeviceModeFinder, 0xe4);
DECOMP_SIZE_ASSERT(MxDeviceEnumerate, 0x198);
// OFFSET: LEGO1 0x1009b0a0
MxDirect3D::MxDirect3D()
{
this->m_pDirect3d = NULL;
this->m_pDirect3dDevice = NULL;
this->m_unk88c = NULL;
this->m_pDeviceModeFinder = NULL;
}
// OFFSET: LEGO1 0x1009b140
MxDirect3D::~MxDirect3D()
{
Destroy();
}
// OFFSET: LEGO1 0x1009b1a0
BOOL MxDirect3D::Create(
HWND hWnd,
BOOL fullscreen_1,
BOOL surface_fullscreen,
BOOL onlySystemMemory,
int width,
int height,
int bpp,
const PALETTEENTRY* pPaletteEntries,
int paletteEntryCount)
{
BOOL success = FALSE;
BOOL ret = MxDirectDraw::Create(hWnd, fullscreen_1, surface_fullscreen,
onlySystemMemory, width, height, bpp,
pPaletteEntries, paletteEntryCount);
if (ret && CreateIDirect3D() && D3DSetMode())
success = TRUE;
if (!success)
FUN_1009D920();
return success;
}
// OFFSET: LEGO1 0x1009b210
void MxDirect3D::Destroy()
{
if (this->m_pDirect3dDevice) {
this->m_pDirect3dDevice->Release();
this->m_pDirect3dDevice = NULL;
}
if (this->m_pDirect3d) {
this->m_pDirect3d->Release();
this->m_pDirect3d = NULL;
}
if (this->m_pDeviceModeFinder) {
delete m_pDeviceModeFinder;
this->m_pDeviceModeFinder = NULL;
}
// This should get deleted by MxDirectDraw::Destroy
if (m_pCurrentDeviceModesList) {
// delete m_pCurrentDeviceModesList; // missing?
m_pCurrentDeviceModesList = NULL;
}
MxDirectDraw::Destroy();
}
// OFFSET: LEGO1 0x1009b290
void MxDirect3D::Clear()
{
if(this->m_pDirect3dDevice) {
this->m_pDirect3dDevice->Release();
this->m_pDirect3dDevice = NULL;
}
if(this->m_pDirect3d) {
this->m_pDirect3d->Release();
this->m_pDirect3d = NULL;
}
MxDirectDraw::DestroyButNotDirectDraw();
}
// OFFSET: LEGO1 0x1009b2d0
BOOL MxDirect3D::CreateIDirect3D()
{
MxResult ret = IDirect3D_QueryInterface(m_pDirectDraw,
IID_IDirect3D2,
(LPVOID*)&m_pDirect3d);
if (ret) {
Error("Creation of IDirect3D failed", ret);
return FALSE;
}
return TRUE;
}
// OFFSET: LEGO1 0x1009b310 STUB
BOOL MxDirect3D::D3DSetMode()
{
// TODO
//if (m_pDeviceModeFinder)
Error("This device cannot support the current display mode", 0);
OutputDebugString("MxDirect3D::D3DSetMode() front lock failed\n");
OutputDebugString("MxDirect3D::D3DSetMode() back lock failed\n");
return TRUE;
}
// OFFSET: LEGO1 0x1009b8b0
MxDeviceModeFinder::MxDeviceModeFinder()
{
memset(this, 0, sizeof(*this));
}
// OFFSET: LEGO1 0x1009b8d0
MxDeviceModeFinder::~MxDeviceModeFinder()
{
if (m_deviceInfo) {
delete m_deviceInfo;
m_deviceInfo = NULL;
}
}
// OFFSET: LEGO1 0x1009c070 STUB
BOOL MxDeviceEnumerate::FUN_1009c070()
{
// TODO
// HRESULT ret = DirectDrawCreate();
HRESULT ret = 0;
if (ret) {
MxDirect3D::BuildErrorString("GetCaps failed: %s\n",
EnumerateErrorToString(ret));
}
//IDirect3D2_EnumDevices
return TRUE;
}
// OFFSET: LEGO1 0x1009c4c0
void MxDirect3D::BuildErrorString(const char *p_format, ...)
{
va_list args;
char buf[512];
va_start(args, p_format);
vsprintf(buf, p_format, args);
va_end(args);
OutputDebugString(buf);
}
// OFFSET: LEGO1 0x1009c6c0
MxResult MxDeviceEnumerate::_DoEnumerate()
{
// TODO: what does ECX refer to in this context?
if (m_unk010_flag)
return FAILURE;
HRESULT ret = DirectDrawEnumerate(EnumerateCallback, this);
if (ret) {
MxDirect3D::BuildErrorString("DirectDrawEnumerate returned error %s\n",
EnumerateErrorToString(ret));
return FAILURE;
}
m_unk010_flag = TRUE;
return SUCCESS;
}
// OFFSET: LEGO1 0x1009c710 STUB
BOOL FAR PASCAL EnumerateCallback(GUID FAR *, LPSTR, LPSTR, LPVOID)
{
// TODO
return FALSE;
}
// OFFSET: LEGO1 0x1009c730 STUB
char *MxDeviceEnumerate::EnumerateErrorToString(HRESULT p_error)
{
// TODO: This is a list of error messages, similar to the function in
// MxDirectDraw, except that this one now contains the Direct3D errors.
// Probably just copied from a sample file in the dx5 sdk.
return "";
}

View file

@ -2,24 +2,77 @@
#define MXDIRECT3D_H #define MXDIRECT3D_H
#include "mxdirectdraw.h" #include "mxdirectdraw.h"
#include "mxtypes.h"
#include "decomp.h" #include "decomp.h"
#include <d3d.h> #include <d3d.h>
class MxDeviceModeFinder; // SIZE 0xe4
class MxDeviceModeFinder
{
public:
MxDeviceModeFinder();
~MxDeviceModeFinder();
undefined4 m_unknown[56];
MxDirectDraw::DeviceModesInfo *m_deviceInfo; // +0xe0
};
// VTABLE 0x100db814 (or 0x100d9cc8?)
// SIZE 0x198
class MxDeviceEnumerate
{
public:
MxDeviceEnumerate();
virtual MxResult _DoEnumerate();
BOOL FUN_1009c070();
char *EnumerateErrorToString(HRESULT p_error);
undefined4 m_unk004;
undefined4 m_unk008;
undefined4 m_unk00c;
MxBool m_unk010_flag; // +0x10
undefined4 m_unknown[97];
};
// VTABLE 0x100db800
// SIZE 0x894 // SIZE 0x894
class MxDirect3D : public MxDirectDraw class MxDirect3D : public MxDirectDraw
{ {
public: public:
MxDirect3D();
void Clear();
inline MxDeviceModeFinder *GetDeviceModeFinder() { return this->m_pDeviceModeFinder; }; inline MxDeviceModeFinder *GetDeviceModeFinder() { return this->m_pDeviceModeFinder; };
virtual ~MxDirect3D();
virtual BOOL Create(
HWND hWnd,
BOOL fullscreen_1,
BOOL surface_fullscreen,
BOOL onlySystemMemory,
int width,
int height,
int bpp,
const PALETTEENTRY* pPaletteEntries,
int paletteEntryCount);
virtual void Destroy();
BOOL CreateIDirect3D();
BOOL D3DSetMode();
static void BuildErrorString(const char *, ...);
private: private:
MxDeviceModeFinder *m_pDeviceModeFinder; MxDeviceModeFinder *m_pDeviceModeFinder; // +0x880
IDirect3D *m_pDirect3d; IDirect3D *m_pDirect3d; // +0x884
IDirect3DDevice *m_pDirect3dDevice; IDirect3DDevice *m_pDirect3dDevice;
undefined4 m_unk88c; undefined4 m_unk88c;
undefined4 m_unk890; undefined4 m_unk890;
}; };
BOOL FAR PASCAL EnumerateCallback(GUID FAR *, LPSTR, LPSTR, LPVOID);
#endif // MXDIRECT3D_H #endif // MXDIRECT3D_H

View file

@ -1,8 +1,8 @@
#include "mxdirectdraw.h" #include "mxdirectdraw.h"
#include "decomp.h" #include "decomp.h"
DECOMP_SIZE_ASSERT(MxDirectDraw, 0x880); DECOMP_SIZE_ASSERT(MxDirectDraw, 0x880);
DECOMP_SIZE_ASSERT(MxDirectDraw::DeviceModesInfo, 0x17c);
#ifndef DDSCAPS_3DDEVICE #ifndef DDSCAPS_3DDEVICE
#define DDSCAPS_3DDEVICE 0x00002000l #define DDSCAPS_3DDEVICE 0x00002000l
@ -30,6 +30,12 @@ void EnableResizing(HWND hwnd, BOOL flag)
} }
} }
// OFFSET: LEGO1 0x1009efb0
MxDirectDraw::DeviceModesInfo::DeviceModesInfo()
{
memset(this, 0, sizeof(*this));
}
// OFFSET: LEGO1 0x1009EFD0 // OFFSET: LEGO1 0x1009EFD0
MxDirectDraw::DeviceModesInfo::~DeviceModesInfo() MxDirectDraw::DeviceModesInfo::~DeviceModesInfo()
{ {

View file

@ -1,4 +1,3 @@
#ifndef MXDIRECTDRAW_H #ifndef MXDIRECTDRAW_H
#define MXDIRECTDRAW_H #define MXDIRECTDRAW_H
@ -7,6 +6,7 @@
extern BOOL g_is_PALETTEINDEXED8; extern BOOL g_is_PALETTEINDEXED8;
// VTABLE 0x100db818
// SIZE 0x880 // SIZE 0x880
class MxDirectDraw class MxDirectDraw
{ {
@ -37,11 +37,12 @@ class MxDirectDraw
DDCAPS m_ddcaps; DDCAPS m_ddcaps;
void* a_178; void* a_178;
DeviceModesInfo();
~DeviceModesInfo(); ~DeviceModesInfo();
}; };
private: protected:
BOOL m_bOnlySoftRender; BOOL m_bOnlySoftRender;
BOOL m_bFlipSurfaces; BOOL m_bFlipSurfaces;
IDirectDraw* m_pDirectDraw; IDirectDraw* m_pDirectDraw;
@ -94,7 +95,7 @@ class MxDirectDraw
virtual void DestroyButNotDirectDraw(); virtual void DestroyButNotDirectDraw();
virtual const char* ErrorToString(HRESULT error); virtual const char* ErrorToString(HRESULT error);
private: protected:
BOOL CacheOriginalPaletteEntries(); BOOL CacheOriginalPaletteEntries();
HRESULT CreateDDSurface( HRESULT CreateDDSurface(
LPDDSURFACEDESC a2, LPDDSURFACEDESC a2,