This commit is contained in:
Christian Semmler 2024-01-03 20:16:41 -05:00
parent 778b0f2108
commit 50541075eb
3 changed files with 115 additions and 26 deletions

View File

@ -57,18 +57,18 @@ MxResult LegoVideoManager::CreateDirect3D()
MxResult LegoVideoManager::Create(MxVideoParam& p_videoParam, MxU32 p_frequencyMS, MxBool p_createThread)
{
MxBool paletteCreated = FALSE;
undefined* und1 = NULL;
undefined* und2 = NULL;
MxDeviceEnumerateElement* deviceEnumerate = NULL;
MxDevice* device = NULL;
MxResult result = FAILURE;
MxDeviceEnumerate100d9cc8 deviceEnumerate;
MxDeviceEnumerate100d9cc8 deviceEnumerator;
Vector3Data posVec(0.0, 1.25, -50.0);
Vector3Data dirVec(0.0, 0.0, 1.0);
Vector3Data upVec(0.0, 1.0, 0.0);
Matrix4Data outMatrix;
HWND hwnd = MxOmni::GetInstance()->GetWindowHandle();
MxS32 bits = p_videoParam.Flags().Get16Bit() ? 16 : 8;
MxS32 und3 = -1;
MxS32 deviceNum = -1;
if (!p_videoParam.GetPalette()) {
MxPalette* palette = new MxPalette;
@ -85,26 +85,26 @@ MxResult LegoVideoManager::Create(MxVideoParam& p_videoParam, MxU32 p_frequencyM
if (CreateDirect3D() != SUCCESS)
goto done;
if (deviceEnumerate.DoEnumerate() != SUCCESS)
if (deviceEnumerator.DoEnumerate() != SUCCESS)
goto done;
if (p_videoParam.GetDeviceName()) {
und3 = deviceEnumerate.ParseDeviceName(p_videoParam.GetDeviceName());
if (und3 >= 0) {
if ((und3 = deviceEnumerate.FUN_1009d030(und3, &und1, &und2)) != SUCCESS)
und3 = -1;
deviceNum = deviceEnumerator.ParseDeviceName(p_videoParam.GetDeviceName());
if (deviceNum >= 0) {
if ((deviceNum = deviceEnumerator.GetDevice(deviceNum, deviceEnumerate, device)) != SUCCESS)
deviceNum = -1;
}
}
if (und3 < 0) {
deviceEnumerate.FUN_1009d210();
und3 = deviceEnumerate.FUN_1009d0d0();
deviceEnumerate.FUN_1009d030(und3, &und1, &und2);
if (deviceNum < 0) {
deviceEnumerator.FUN_1009d210();
deviceNum = deviceEnumerator.FUN_1009d0d0();
deviceEnumerator.GetDevice(deviceNum, deviceEnumerate, device);
}
m_direct3d->FUN_1009b5f0(deviceEnumerate, und1, und2);
m_direct3d->FUN_1009b5f0(deviceEnumerator, deviceEnumerate, device);
if (!*((MxU32*) &und1[0x14]) && *((MxU32*) &und1[0xe0]) != 2)
if (!deviceEnumerate->m_ddCaps.dwCaps2 && deviceEnumerate->m_ddCaps.dwSVBRops[7] != 2)
p_videoParam.Flags().SetF2bit0(TRUE);
else
p_videoParam.Flags().SetF2bit0(FALSE);

View File

@ -126,7 +126,11 @@ BOOL MxDirect3D::D3DSetMode()
}
// STUB: LEGO1 0x1009b5f0
BOOL MxDirect3D::FUN_1009b5f0(MxDeviceEnumerate& p_deviceEnumerate, undefined* p_und1, undefined* p_und2)
BOOL MxDirect3D::FUN_1009b5f0(
MxDeviceEnumerate& p_deviceEnumerator,
MxDeviceEnumerateElement* p_deviceEnumerate,
MxDevice* p_device
)
{
return TRUE;
}
@ -444,7 +448,7 @@ MxS32 MxDeviceEnumerate::ParseDeviceName(const char* p_deviceId)
}
// FUNCTION: LEGO1 0x1009cf20
MxS32 MxDeviceEnumerate::ProcessDeviceBytes(MxS32 p_num, GUID& p_guid)
MxS32 MxDeviceEnumerate::ProcessDeviceBytes(MxS32 p_deviceNum, GUID& p_guid)
{
if (!m_initialized)
return -1;
@ -465,7 +469,7 @@ MxS32 MxDeviceEnumerate::ProcessDeviceBytes(MxS32 p_num, GUID& p_guid)
memcpy(&deviceGuid, &p_guid, sizeof(GUID4));
for (list<MxDeviceEnumerateElement>::iterator it = m_list.begin(); it != m_list.end(); it++) {
if (p_num >= 0 && p_num < i)
if (p_deviceNum >= 0 && p_deviceNum < i)
return -1;
GUID4 compareGuid;
@ -474,7 +478,8 @@ MxS32 MxDeviceEnumerate::ProcessDeviceBytes(MxS32 p_num, GUID& p_guid)
memcpy(&compareGuid, (*it2).m_guid, sizeof(GUID4));
if (compareGuid.m_data1 == deviceGuid.m_data1 && compareGuid.m_data2 == deviceGuid.m_data2 &&
compareGuid.m_data3 == deviceGuid.m_data3 && compareGuid.m_data4 == deviceGuid.m_data4 && i == p_num)
compareGuid.m_data3 == deviceGuid.m_data3 && compareGuid.m_data4 == deviceGuid.m_data4 &&
i == p_deviceNum)
return j;
j++;
@ -486,9 +491,33 @@ MxS32 MxDeviceEnumerate::ProcessDeviceBytes(MxS32 p_num, GUID& p_guid)
return -1;
}
// STUB: LEGO1 0x1009d030
MxResult MxDeviceEnumerate::FUN_1009d030(MxS32 p_und1, undefined** p_und2, undefined** p_und3)
// FUNCTION: LEGO1 0x1009d030
MxResult MxDeviceEnumerate::GetDevice(
MxS32 p_deviceNum,
MxDeviceEnumerateElement*& p_deviceEnumerate,
MxDevice*& p_device
)
{
if (p_deviceNum >= 0 && m_initialized) {
MxS32 i = 0;
for (list<MxDeviceEnumerateElement>::iterator it = m_list.begin(); it != m_list.end(); it++) {
p_deviceEnumerate = &*it;
for (list<MxDevice>::iterator it2 = p_deviceEnumerate->m_devices.begin();
it2 != p_deviceEnumerate->m_devices.end();
it2++) {
if (i == p_deviceNum) {
p_device = &*it2;
return SUCCESS;
}
i++;
}
}
return FAILURE;
}
return FAILURE;
}
@ -498,8 +527,54 @@ MxResult MxDeviceEnumerate::FUN_1009d0d0()
return FAILURE;
}
// STUB: LEGO1 0x1009d210
// FUNCTION: LEGO1 0x1009d210
MxResult MxDeviceEnumerate::FUN_1009d210()
{
return FAILURE;
if (!m_initialized)
return FAILURE;
for (list<MxDeviceEnumerateElement>::iterator it = m_list.begin(); it != m_list.end();) {
MxDeviceEnumerateElement& elem = *it;
if (!FUN_1009d370(elem))
m_list.erase(it++);
else {
for (list<MxDevice>::iterator it2 = elem.m_devices.begin(); it2 != elem.m_devices.end();) {
MxDevice& device = *it2;
if (!FUN_1009d3d0(device))
elem.m_devices.erase(it2++);
else
it2++;
}
if (elem.m_devices.empty())
m_list.erase(it++);
else
it++;
}
}
return m_list.empty() ? FAILURE : SUCCESS;
}
// FUNCTION: LEGO1 0x1009d370
MxBool MxDeviceEnumerate::FUN_1009d370(MxDeviceEnumerateElement& p_deviceEnumerate)
{
for (list<MxDisplayMode>::iterator it = p_deviceEnumerate.m_displayModes.begin();
it != p_deviceEnumerate.m_displayModes.end();
it++) {
if ((*it).m_width == 640 && (*it).m_height == 480) {
if ((*it).m_bitsPerPixel == 8 || (*it).m_bitsPerPixel == 16)
return TRUE;
}
}
return FALSE;
}
// STUB: LEGO1 0x1009d3d0
MxBool MxDeviceEnumerate::FUN_1009d3d0(MxDevice& p_device)
{
return FALSE;
}

View File

@ -19,6 +19,8 @@ class MxDeviceModeFinder {
};
class MxDeviceEnumerate;
struct MxDeviceEnumerateElement;
struct MxDevice;
// VTABLE: LEGO1 0x100db800
// SIZE 0x894
@ -43,7 +45,11 @@ class MxDirect3D : public MxDirectDraw {
BOOL CreateIDirect3D();
BOOL D3DSetMode();
BOOL FUN_1009b5f0(MxDeviceEnumerate& p_deviceEnumerate, undefined* p_und1, undefined* p_und2);
BOOL FUN_1009b5f0(
MxDeviceEnumerate& p_deviceEnumerator,
MxDeviceEnumerateElement* p_deviceEnumerate,
MxDevice* p_device
);
inline MxDeviceModeFinder* GetDeviceModeFinder() { return this->m_pDeviceModeFinder; };
inline IDirect3D* GetDirect3D() { return this->m_pDirect3d; }
@ -146,6 +152,12 @@ struct MxDeviceEnumerateElement {
// SYNTHETIC: LEGO1 0x1009c290
// MxDeviceEnumerateElement::MxDeviceEnumerateElement
// SYNTHETIC: LEGO1 0x1009d450
// MxDeviceEnumerateElement::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x1009d470
// MxDevice::`scalar deleting destructor'
// VTABLE: LEGO1 0x100db814
// SIZE 0x14
class MxDeviceEnumerate {
@ -167,10 +179,12 @@ class MxDeviceEnumerate {
);
const char* EnumerateErrorToString(HRESULT p_error);
MxS32 ParseDeviceName(const char* p_deviceId);
MxS32 ProcessDeviceBytes(MxS32 p_num, GUID& p_guid);
MxResult FUN_1009d030(MxS32 p_und1, undefined** p_und2, undefined** p_und3);
MxS32 ProcessDeviceBytes(MxS32 p_deviceNum, GUID& p_guid);
MxResult GetDevice(MxS32 p_deviceNum, MxDeviceEnumerateElement*& p_deviceEnumerate, MxDevice*& p_device);
MxResult FUN_1009d0d0();
MxResult FUN_1009d210();
MxBool FUN_1009d370(MxDeviceEnumerateElement& p_deviceEnumerate);
MxBool FUN_1009d3d0(MxDevice& p_device);
static void BuildErrorString(const char*, ...);
static BOOL CALLBACK