diff --git a/LEGO1/mxdirect3d.cpp b/LEGO1/mxdirect3d.cpp index 0f8d54c1..623e2fdf 100644 --- a/LEGO1/mxdirect3d.cpp +++ b/LEGO1/mxdirect3d.cpp @@ -473,8 +473,9 @@ MxS32 MxDeviceEnumerate::ProcessDeviceBytes(MxS32 p_deviceNum, GUID& p_guid) return -1; GUID4 compareGuid; - MxDeviceEnumerateElement& elem = *it; - for (list::iterator it2 = elem.m_devices.begin(); it2 != elem.m_devices.end(); it2++) { + MxDeviceEnumerateElement& deviceEnumerate = *it; + for (list::iterator it2 = deviceEnumerate.m_devices.begin(); it2 != deviceEnumerate.m_devices.end(); + it2++) { memcpy(&compareGuid, (*it2).m_guid, sizeof(GUID4)); if (compareGuid.m_data1 == deviceGuid.m_data1 && compareGuid.m_data2 == deviceGuid.m_data2 && @@ -521,10 +522,51 @@ MxResult MxDeviceEnumerate::GetDevice( return FAILURE; } -// STUB: LEGO1 0x1009d0d0 -MxResult MxDeviceEnumerate::FUN_1009d0d0() +// FUNCTION: LEGO1 0x1009d0d0 +MxS32 MxDeviceEnumerate::FUN_1009d0d0() { - return FAILURE; + if (!m_initialized) + return -1; + + if (m_list.empty()) + return -1; + + MxS32 i = 0; + MxS32 j = 0; + MxS32 k = -1; + MxU32 und = FUN_1009d1a0(); + + for (list::iterator it = m_list.begin();; it++) { + if (it == m_list.end()) + return k; + + for (list::iterator it2 = (*it).m_devices.begin(); it2 != (*it).m_devices.end(); it2++) { + if ((*it2).m_HWDesc.dcmColorModel) + return j; + + if ((und && (*it2).m_HELDesc.dcmColorModel == D3DCOLOR_RGB && i == 0) || + (*it2).m_HELDesc.dcmColorModel == D3DCOLOR_MONO && i == 0 && k < 0) + k = j; + + j++; + } + + i++; + } + + return -1; +} + +// STUB: LEGO1 0x1009d1a0 +undefined4 MxDeviceEnumerate::FUN_1009d1a0() +{ + return 1; +} + +// STUB: LEGO1 0x1009d1e0 +undefined4 MxDeviceEnumerate::FUN_1009d1e0() +{ + return 1; } // FUNCTION: LEGO1 0x1009d210 @@ -534,21 +576,22 @@ MxResult MxDeviceEnumerate::FUN_1009d210() return FAILURE; for (list::iterator it = m_list.begin(); it != m_list.end();) { - MxDeviceEnumerateElement& elem = *it; + MxDeviceEnumerateElement& deviceEnumerate = *it; - if (!FUN_1009d370(elem)) + if (!FUN_1009d370(deviceEnumerate)) m_list.erase(it++); else { - for (list::iterator it2 = elem.m_devices.begin(); it2 != elem.m_devices.end();) { + for (list::iterator it2 = deviceEnumerate.m_devices.begin(); + it2 != deviceEnumerate.m_devices.end();) { MxDevice& device = *it2; if (!FUN_1009d3d0(device)) - elem.m_devices.erase(it2++); + deviceEnumerate.m_devices.erase(it2++); else it2++; } - if (elem.m_devices.empty()) + if (deviceEnumerate.m_devices.empty()) m_list.erase(it++); else it++; @@ -573,8 +616,19 @@ MxBool MxDeviceEnumerate::FUN_1009d370(MxDeviceEnumerateElement& p_deviceEnumera return FALSE; } -// STUB: LEGO1 0x1009d3d0 +// FUNCTION: LEGO1 0x1009d3d0 MxBool MxDeviceEnumerate::FUN_1009d3d0(MxDevice& p_device) { + if (m_list.size() <= 0) + return FALSE; + + if (p_device.m_HWDesc.dcmColorModel) + return p_device.m_HWDesc.dwDeviceZBufferBitDepth & DDBD_16 && p_device.m_HWDesc.dpcTriCaps.dwTextureCaps & 1; + + for (list::iterator it = m_list.front().m_devices.begin(); it != m_list.front().m_devices.end(); it++) { + if ((&*it) == &p_device) + return TRUE; + } + return FALSE; } diff --git a/LEGO1/mxdirect3d.h b/LEGO1/mxdirect3d.h index 7f03ae74..7ccccae7 100644 --- a/LEGO1/mxdirect3d.h +++ b/LEGO1/mxdirect3d.h @@ -181,7 +181,7 @@ class MxDeviceEnumerate { MxS32 ParseDeviceName(const char* p_deviceId); MxS32 ProcessDeviceBytes(MxS32 p_deviceNum, GUID& p_guid); MxResult GetDevice(MxS32 p_deviceNum, MxDeviceEnumerateElement*& p_deviceEnumerate, MxDevice*& p_device); - MxResult FUN_1009d0d0(); + MxS32 FUN_1009d0d0(); MxResult FUN_1009d210(); MxBool FUN_1009d370(MxDeviceEnumerateElement& p_deviceEnumerate); MxBool FUN_1009d3d0(MxDevice& p_device); @@ -198,6 +198,8 @@ class MxDeviceEnumerate { LPD3DDEVICEDESC p_HELDesc, LPVOID p_context ); + static undefined4 FUN_1009d1a0(); + static undefined4 FUN_1009d1e0(); private: list m_list; // 0x04