Formatting

This commit is contained in:
Mark Langen 2023-11-19 00:49:11 -08:00
parent c15ca8a34d
commit 09ccc4b83d
11 changed files with 559 additions and 553 deletions

View File

@ -9,57 +9,53 @@ DECOMP_SIZE_ASSERT(MxDirect3DRM, 0x8);
IDirect3DRM* g_pD3DRM = NULL; IDirect3DRM* g_pD3DRM = NULL;
// Inlined only // Inlined only
MxDirect3DRM::MxDirect3DRM() MxDirect3DRM::MxDirect3DRM() : m_pD3DRM(NULL)
: m_pD3DRM(NULL)
{ {
if (g_pD3DRM == NULL) if (g_pD3DRM == NULL) {
{ LPDIRECT3DRM handle;
LPDIRECT3DRM handle; Direct3DRMCreate(&handle);
Direct3DRMCreate(&handle); handle->QueryInterface(IID_IDirect3DRM2, (LPVOID*) &g_pD3DRM);
handle->QueryInterface(IID_IDirect3DRM2, (LPVOID*)&g_pD3DRM); }
} else {
else m_pD3DRM->AddRef();
{ }
m_pD3DRM->AddRef(); m_pD3DRM = g_pD3DRM;
}
m_pD3DRM = g_pD3DRM;
} }
// Inlined only // Inlined only
MxDirect3DRM::~MxDirect3DRM() MxDirect3DRM::~MxDirect3DRM()
{ {
if (m_pD3DRM) if (m_pD3DRM) {
{ if (m_pD3DRM->Release() == 0)
if (m_pD3DRM->Release() == 0) g_pD3DRM = NULL;
g_pD3DRM = NULL; m_pD3DRM = NULL;
m_pD3DRM = NULL; }
}
} }
// OFFSET: LEGO1 0x100a15e0 // OFFSET: LEGO1 0x100a15e0
MxDirect3DRM* MxDirect3DRM::Create() MxDirect3DRM* MxDirect3DRM::Create()
{ {
// Not a close match. The separate create function implies that // Not a close match. The separate create function implies that
// the g_pD3DRM handling stuff should be in here rather than in the // the g_pD3DRM handling stuff should be in here rather than in the
// constructor, but the destructor definitely calls Release() on // constructor, but the destructor definitely calls Release() on
// g_pD3DRM and that implies the opposite. // g_pD3DRM and that implies the opposite.
return new MxDirect3DRM(); return new MxDirect3DRM();
} }
// OFFSET: LEGO1 0x100a22b0 // OFFSET: LEGO1 0x100a22b0
IUnknown** MxDirect3DRM::GetHandle() IUnknown** MxDirect3DRM::GetHandle()
{ {
return (IUnknown**)&m_pD3DRM; return (IUnknown**) &m_pD3DRM;
} }
// OFFSET: LEGO1 0x100a1894 STUB // OFFSET: LEGO1 0x100a1894 STUB
MxDirect3DRMDevice* MxDirect3DRM::CreateDeviceFromD3D(D3DHolder* p_holder) MxDirect3DRMDevice* MxDirect3DRM::CreateDeviceFromD3D(D3DHolder* p_holder)
{ {
return NULL; return NULL;
} }
// OFFSET: LEGO1 0x100a1900 STUB // OFFSET: LEGO1 0x100a1900 STUB
MxDirect3DRMDevice* MxDirect3DRM::CreateDeviceFromSurface(D3DSurfaceHolder* p_holder) MxDirect3DRMDevice* MxDirect3DRM::CreateDeviceFromSurface(D3DSurfaceHolder* p_holder)
{ {
return NULL; return NULL;
} }

View File

@ -1,47 +1,42 @@
#include "mxdirect3drmdevice.h"
#include "ddraw.h" #include "ddraw.h"
#include "mxdirect3drmdevice.h"
// Not sure what the deal is with these small holder structs. They might // Not sure what the deal is with these small holder structs. They might
// actually be the first part of a larger class because I haven't worked out // actually be the first part of a larger class because I haven't worked out
// enough code further up the call chain to work my way back to a constructor. // enough code further up the call chain to work my way back to a constructor.
struct D3DHolder struct D3DHolder {
{ IDirect3D* m_pDirect3D;
IDirect3D *m_pDirect3D; IDirect3DDevice* m_pDirect3DDevice;
IDirect3DDevice *m_pDirect3DDevice;
}; };
struct D3DSurfaceHolder struct D3DSurfaceHolder {
{ IDirectDraw* m_pDirectDraw;
IDirectDraw* m_pDirectDraw; int unk;
int unk; IDirectDrawSurface* m_pDirectDrawSurface;
IDirectDrawSurface* m_pDirectDrawSurface;
}; };
// VTABLE 0x100db948 // VTABLE 0x100db948
class IMxDirect3DRM : public IMxDirect3DRMObject class IMxDirect3DRM : public IMxDirect3DRMObject {
{
public: public:
virtual ~IMxDirect3DRM() {} virtual ~IMxDirect3DRM() {}
virtual IUnknown **GetHandle() = 0; virtual IUnknown** GetHandle() = 0;
virtual MxDirect3DRMDevice *CreateDeviceFromD3D(D3DHolder *p_holder) = 0; virtual MxDirect3DRMDevice* CreateDeviceFromD3D(D3DHolder* p_holder) = 0;
}; };
// VTABLE 0x100db910 // VTABLE 0x100db910
class MxDirect3DRM : public IMxDirect3DRM class MxDirect3DRM : public IMxDirect3DRM {
{
public: public:
inline MxDirect3DRM(); inline MxDirect3DRM();
virtual ~MxDirect3DRM(); virtual ~MxDirect3DRM();
static MxDirect3DRM *Create(); static MxDirect3DRM* Create();
virtual IUnknown **GetHandle(); virtual IUnknown** GetHandle();
virtual MxDirect3DRMDevice *CreateDeviceFromD3D(D3DHolder *p_holder); virtual MxDirect3DRMDevice* CreateDeviceFromD3D(D3DHolder* p_holder);
virtual MxDirect3DRMDevice *CreateDeviceFromSurface(D3DSurfaceHolder *p_holder); virtual MxDirect3DRMDevice* CreateDeviceFromSurface(D3DSurfaceHolder* p_holder);
private: private:
IDirect3DRM *m_pD3DRM; IDirect3DRM* m_pD3DRM;
}; };

View File

@ -6,91 +6,97 @@ DECOMP_SIZE_ASSERT(IMxDirect3DRMFrame, 0x4);
DECOMP_SIZE_ASSERT(MxDirect3DRMFrame, 0x8); DECOMP_SIZE_ASSERT(MxDirect3DRMFrame, 0x8);
// OFFSET: LEGO1 0x100a36f0 // OFFSET: LEGO1 0x100a36f0
IUnknown **MxDirect3DRMFrame::GetHandle() IUnknown** MxDirect3DRMFrame::GetHandle()
{ {
return (IUnknown**)&m_pDirect3DRMFrame; return (IUnknown**) &m_pDirect3DRMFrame;
} }
// Not 100% confident on this function signature or behavior. // Not 100% confident on this function signature or behavior.
// Known info: Calls GetPosition, then AddTransform, then GetPosition again. // Known info: Calls GetPosition, then AddTransform, then GetPosition again.
// OFFSET: LEGO1 0x100a3700 // OFFSET: LEGO1 0x100a3700
int MxDirect3DRMFrame::AddTransform(D3DRMMATRIX4D *p_matrix, D3DVECTOR *p_oldPosition) int MxDirect3DRMFrame::AddTransform(D3DRMMATRIX4D* p_matrix, D3DVECTOR* p_oldPosition)
{ {
D3DRMMATRIX4D newMatrix; D3DRMMATRIX4D newMatrix;
D3DVECTOR anotherPosition; D3DVECTOR anotherPosition;
memcpy(&newMatrix, p_matrix, sizeof(D3DRMMATRIX4D)); memcpy(&newMatrix, p_matrix, sizeof(D3DRMMATRIX4D));
m_pDirect3DRMFrame->GetPosition(NULL, p_oldPosition); m_pDirect3DRMFrame->GetPosition(NULL, p_oldPosition);
HRESULT result = m_pDirect3DRMFrame->AddTransform(D3DRMCOMBINE_REPLACE, newMatrix); HRESULT result = m_pDirect3DRMFrame->AddTransform(D3DRMCOMBINE_REPLACE, newMatrix);
m_pDirect3DRMFrame->GetPosition(NULL, &anotherPosition); m_pDirect3DRMFrame->GetPosition(NULL, &anotherPosition);
return SUCCEEDED(result); return SUCCEEDED(result);
} }
DECOMP_SIZE_ASSERT(IMxDirect3DRMLight, 0x4); DECOMP_SIZE_ASSERT(IMxDirect3DRMLight, 0x4);
DECOMP_SIZE_ASSERT(MxDirect3DRMLight, 0x8); DECOMP_SIZE_ASSERT(MxDirect3DRMLight, 0x8);
// OFFSET: LEGO1 0x100a3770 // OFFSET: LEGO1 0x100a3770
IUnknown **MxDirect3DRMLight::GetHandle() IUnknown** MxDirect3DRMLight::GetHandle()
{ {
return (IUnknown**)&m_pFrameWithLight; return (IUnknown**) &m_pFrameWithLight;
} }
// OFFSET: LEGO1 0x100a3780 STUB // OFFSET: LEGO1 0x100a3780 STUB
int MxDirect3DRMLight::AddTransform(D3DRMMATRIX4D *p_matrix) int MxDirect3DRMLight::AddTransform(D3DRMMATRIX4D* p_matrix)
{ {
return 0; return 0;
} }
// OFFSET: LEGO1 0x100a37e0 // OFFSET: LEGO1 0x100a37e0
int MxDirect3DRMLight::SetColorRGB(float p_r, float p_g, float p_b) int MxDirect3DRMLight::SetColorRGB(float p_r, float p_g, float p_b)
{ {
IDirect3DRMLightArray *lightArray; IDirect3DRMLightArray* lightArray;
IDirect3DRMLight *light; IDirect3DRMLight* light;
m_pFrameWithLight->GetLights(&lightArray); m_pFrameWithLight->GetLights(&lightArray);
lightArray->GetElement(0, &light); lightArray->GetElement(0, &light);
return SUCCEEDED(light->SetColorRGB(p_r, p_g, p_b)); return SUCCEEDED(light->SetColorRGB(p_r, p_g, p_b));
} }
DECOMP_SIZE_ASSERT(IMxDirect3DRMMesh, 0x4); DECOMP_SIZE_ASSERT(IMxDirect3DRMMesh, 0x4);
DECOMP_SIZE_ASSERT(MxDirect3DRMMesh, 0x8); DECOMP_SIZE_ASSERT(MxDirect3DRMMesh, 0x8);
// OFFSET: LEGO1 0x100a3830 // OFFSET: LEGO1 0x100a3830
IUnknown **MxDirect3DRMMesh::GetHandle() IUnknown** MxDirect3DRMMesh::GetHandle()
{ {
return (IUnknown**)&m_pDirect3DRMMesh; return (IUnknown**) &m_pDirect3DRMMesh;
} }
// OFFSET: LEGO1 0x100a3840 STUB // OFFSET: LEGO1 0x100a3840 STUB
int MxDirect3DRMMesh::SetMeshData(int p_faceCount, int p_vertexCount, void *p_positions, void *p_normals, void *p_uvs, int p_unk1, int *p_unk2) int MxDirect3DRMMesh::SetMeshData(
int p_faceCount,
int p_vertexCount,
void* p_positions,
void* p_normals,
void* p_uvs,
int p_unk1,
int* p_unk2
)
{ {
return 0; return 0;
} }
// OFFSET: LEGO1 0x100a3ae0 // OFFSET: LEGO1 0x100a3ae0
int MxDirect3DRMMesh::GetBox(float *p_minVec3, float *p_maxVec3) int MxDirect3DRMMesh::GetBox(float* p_minVec3, float* p_maxVec3)
{ {
D3DRMBOX box; D3DRMBOX box;
int ret = SUCCEEDED(m_pDirect3DRMMesh->GetBox(&box)); int ret = SUCCEEDED(m_pDirect3DRMMesh->GetBox(&box));
if (ret == TRUE) if (ret == TRUE) {
{ p_minVec3[0] = box.min.x;
p_minVec3[0] = box.min.x; p_minVec3[1] = box.min.y;
p_minVec3[1] = box.min.y; p_minVec3[2] = box.min.z;
p_minVec3[2] = box.min.z; p_maxVec3[0] = box.max.x;
p_maxVec3[0] = box.max.x; p_maxVec3[1] = box.max.y;
p_maxVec3[1] = box.max.y; p_maxVec3[2] = box.max.z;
p_maxVec3[2] = box.max.z; }
} return ret;
return ret;
} }
// OFFSET: LEGO1 0x100a3b40 // OFFSET: LEGO1 0x100a3b40
IMxDirect3DRMMesh *MxDirect3DRMMesh::Clone() IMxDirect3DRMMesh* MxDirect3DRMMesh::Clone()
{ {
MxDirect3DRMMesh *mesh = new MxDirect3DRMMesh(); MxDirect3DRMMesh* mesh = new MxDirect3DRMMesh();
int ret = m_pDirect3DRMMesh->Clone(0, IID_IDirect3DRMMeshBuilder, (void**)&mesh->m_pDirect3DRMMesh); int ret = m_pDirect3DRMMesh->Clone(0, IID_IDirect3DRMMeshBuilder, (void**) &mesh->m_pDirect3DRMMesh);
if (ret < 0) if (ret < 0) {
{ delete mesh;
delete mesh; mesh = NULL;
mesh = NULL; }
} return mesh;
return mesh;
} }

View File

@ -2,94 +2,104 @@
#include "mxdirect3drmobject.h" #include "mxdirect3drmobject.h"
// VTABLE 0x100dbae8 // VTABLE 0x100dbae8
class IMxDirect3DRMFrame : public IMxDirect3DRMObject class IMxDirect3DRMFrame : public IMxDirect3DRMObject {
{
public: public:
virtual ~IMxDirect3DRMFrame() {} virtual ~IMxDirect3DRMFrame() {}
virtual IUnknown **GetHandle() = 0; virtual IUnknown** GetHandle() = 0;
// vtable + 0x08 // vtable + 0x08
virtual int AddTransform(D3DRMMATRIX4D *p_matrix, D3DVECTOR *p_oldPosition) = 0; virtual int AddTransform(D3DRMMATRIX4D* p_matrix, D3DVECTOR* p_oldPosition) = 0;
}; };
// VTABLE 0x100dbad8 // VTABLE 0x100dbad8
class MxDirect3DRMFrame : IMxDirect3DRMFrame class MxDirect3DRMFrame : IMxDirect3DRMFrame {
{
public: public:
MxDirect3DRMFrame() {} MxDirect3DRMFrame() {}
virtual ~MxDirect3DRMFrame() {} virtual ~MxDirect3DRMFrame() {}
virtual IUnknown **GetHandle(); virtual IUnknown** GetHandle();
IDirect3DRMFrame *GetFrame() { return m_pDirect3DRMFrame; } IDirect3DRMFrame* GetFrame() { return m_pDirect3DRMFrame; }
// vtable + 0x08 // vtable + 0x08
// Not 100% confident on this function signature // Not 100% confident on this function signature
virtual int AddTransform(D3DRMMATRIX4D *p_matrix, D3DVECTOR *p_oldPosition); virtual int AddTransform(D3DRMMATRIX4D* p_matrix, D3DVECTOR* p_oldPosition);
private: private:
IDirect3DRMFrame *m_pDirect3DRMFrame; IDirect3DRMFrame* m_pDirect3DRMFrame;
}; };
// VTABLE 0x100dbb08 // VTABLE 0x100dbb08
class IMxDirect3DRMLight : public IMxDirect3DRMObject class IMxDirect3DRMLight : public IMxDirect3DRMObject {
{
public: public:
virtual ~IMxDirect3DRMLight() {} virtual ~IMxDirect3DRMLight() {}
virtual IUnknown **GetHandle() = 0; virtual IUnknown** GetHandle() = 0;
// vtable+0x08 // vtable+0x08
virtual int AddTransform(D3DRMMATRIX4D *p_matrix) = 0; virtual int AddTransform(D3DRMMATRIX4D* p_matrix) = 0;
virtual int SetColorRGB(float p_r, float p_g, float p_b) = 0; virtual int SetColorRGB(float p_r, float p_g, float p_b) = 0;
}; };
// VTABLE 0x100dbaf8 // VTABLE 0x100dbaf8
class MxDirect3DRMLight : public IMxDirect3DRMLight class MxDirect3DRMLight : public IMxDirect3DRMLight {
{
public: public:
MxDirect3DRMLight() {} MxDirect3DRMLight() {}
virtual ~MxDirect3DRMLight() {} virtual ~MxDirect3DRMLight() {}
virtual IUnknown **GetHandle(); virtual IUnknown** GetHandle();
// vtable+0x08 // vtable+0x08
// Not 100% confident on this function signature // Not 100% confident on this function signature
virtual int AddTransform(D3DRMMATRIX4D *p_matrix); virtual int AddTransform(D3DRMMATRIX4D* p_matrix);
virtual int SetColorRGB(float p_r, float p_g, float p_b); virtual int SetColorRGB(float p_r, float p_g, float p_b);
private: private:
IDirect3DRMFrame *m_pFrameWithLight; IDirect3DRMFrame* m_pFrameWithLight;
}; };
// VTABLE 0x100dbb30 // VTABLE 0x100dbb30
class IMxDirect3DRMMesh : public IMxDirect3DRMObject class IMxDirect3DRMMesh : public IMxDirect3DRMObject {
{
public: public:
virtual ~IMxDirect3DRMMesh() {} virtual ~IMxDirect3DRMMesh() {}
virtual IUnknown **GetHandle() = 0; virtual IUnknown** GetHandle() = 0;
// vtable+0x08 // vtable+0x08
virtual int SetMeshData(int p_faceCount, int p_vertexCount, void *p_positions, void *p_normals, void *p_uvs, int p_unk1, int *p_unk2) = 0; virtual int SetMeshData(
virtual int GetBox(float *p_minVec3, float *p_maxVec3) = 0; int p_faceCount,
virtual IMxDirect3DRMMesh *Clone() = 0; int p_vertexCount,
void* p_positions,
void* p_normals,
void* p_uvs,
int p_unk1,
int* p_unk2
) = 0;
virtual int GetBox(float* p_minVec3, float* p_maxVec3) = 0;
virtual IMxDirect3DRMMesh* Clone() = 0;
}; };
// VTABLE 0x100dbb18 // VTABLE 0x100dbb18
class MxDirect3DRMMesh : public IMxDirect3DRMMesh class MxDirect3DRMMesh : public IMxDirect3DRMMesh {
{
public: public:
MxDirect3DRMMesh() : m_pDirect3DRMMesh(NULL) {} MxDirect3DRMMesh() : m_pDirect3DRMMesh(NULL) {}
virtual ~MxDirect3DRMMesh() {} virtual ~MxDirect3DRMMesh() {}
virtual IUnknown **GetHandle(); virtual IUnknown** GetHandle();
// vtable+0x08 // vtable+0x08
virtual int SetMeshData(int p_faceCount, int p_vertexCount, void *p_positions, void *p_normals, void *p_uvs, int p_unk1, int *p_unk2); virtual int SetMeshData(
virtual int GetBox(float *p_minVec3, float *p_maxVec3); int p_faceCount,
virtual IMxDirect3DRMMesh *Clone(); int p_vertexCount,
void* p_positions,
void* p_normals,
void* p_uvs,
int p_unk1,
int* p_unk2
);
virtual int GetBox(float* p_minVec3, float* p_maxVec3);
virtual IMxDirect3DRMMesh* Clone();
private: private:
IDirect3DRMMesh *m_pDirect3DRMMesh; IDirect3DRMMesh* m_pDirect3DRMMesh;
}; };

View File

@ -1,92 +1,89 @@
#include "mxdirect3drmdevice.h" #include "mxdirect3drmdevice.h"
#include "d3drmwin.h" #include "d3drmwin.h"
#include "decomp.h" #include "decomp.h"
DECOMP_SIZE_ASSERT(IMxDirect3DRMDevice, 0x4); DECOMP_SIZE_ASSERT(IMxDirect3DRMDevice, 0x4);
DECOMP_SIZE_ASSERT(MxDirect3DRMDevice, 0x8); DECOMP_SIZE_ASSERT(MxDirect3DRMDevice, 0x8);
// OFFSET: LEGO1 0x100a2bf0 // OFFSET: LEGO1 0x100a2bf0
IUnknown **MxDirect3DRMDevice::GetHandle() IUnknown** MxDirect3DRMDevice::GetHandle()
{ {
return (IUnknown**)&m_pD3DRMDevice; return (IUnknown**) &m_pD3DRMDevice;
} }
// OFFSET: LEGO1 0x100a2c00 // OFFSET: LEGO1 0x100a2c00
int MxDirect3DRMDevice::GetWidth() int MxDirect3DRMDevice::GetWidth()
{ {
return m_pD3DRMDevice->GetWidth(); return m_pD3DRMDevice->GetWidth();
} }
// OFFSET: LEGO1 0x100a2c10 // OFFSET: LEGO1 0x100a2c10
int MxDirect3DRMDevice::GetHeight() int MxDirect3DRMDevice::GetHeight()
{ {
return m_pD3DRMDevice->GetHeight(); return m_pD3DRMDevice->GetHeight();
} }
// OFFSET: LEGO1 0x100a2c20 // OFFSET: LEGO1 0x100a2c20
int MxDirect3DRMDevice::unknown1() int MxDirect3DRMDevice::unknown1()
{ {
return 1; return 1;
} }
// Matching behavior, codegen differs in register alloc and timing of access. // Matching behavior, codegen differs in register alloc and timing of access.
// OFFSET: LEGO1 0x100a2c30 // OFFSET: LEGO1 0x100a2c30
int MxDirect3DRMDevice::SetQuality(MxDirect3DRMDeviceQuality p_quality) int MxDirect3DRMDevice::SetQuality(MxDirect3DRMDeviceQuality p_quality)
{ {
D3DRMRENDERQUALITY quality; D3DRMRENDERQUALITY quality;
switch (p_quality) switch (p_quality) {
{ case Wireframe:
case Wireframe: quality = D3DRMRENDER_WIREFRAME;
quality = D3DRMRENDER_WIREFRAME; break;
break; case UnlitFlat:
case UnlitFlat: quality = D3DRMRENDER_UNLITFLAT;
quality = D3DRMRENDER_UNLITFLAT; break;
break; case Flat:
case Flat: quality = D3DRMRENDER_FLAT;
quality = D3DRMRENDER_FLAT; break;
break; case Gouraud:
case Gouraud: quality = D3DRMRENDER_GOURAUD;
quality = D3DRMRENDER_GOURAUD; break;
break; case Phong:
case Phong: quality = D3DRMRENDER_PHONG;
quality = D3DRMRENDER_PHONG; break;
break; default:
default: quality = D3DRMRENDER_FLAT;
quality = D3DRMRENDER_FLAT; }
} return SUCCEEDED(m_pD3DRMDevice->SetQuality(quality));
return SUCCEEDED(m_pD3DRMDevice->SetQuality(quality));
} }
// OFFSET: LEGO1 0x100a2ca0 // OFFSET: LEGO1 0x100a2ca0
int MxDirect3DRMDevice::SetShades(MxU32 p_shades) int MxDirect3DRMDevice::SetShades(MxU32 p_shades)
{ {
return SUCCEEDED(m_pD3DRMDevice->SetShades(p_shades)); return SUCCEEDED(m_pD3DRMDevice->SetShades(p_shades));
} }
// OFFSET: LEGO1 0x100a2cc0 // OFFSET: LEGO1 0x100a2cc0
int MxDirect3DRMDevice::SetDither(int p_dither) int MxDirect3DRMDevice::SetDither(int p_dither)
{ {
return SUCCEEDED(m_pD3DRMDevice->SetDither(p_dither)); return SUCCEEDED(m_pD3DRMDevice->SetDither(p_dither));
} }
// OFFSET: LEGO1 0x100a2d60 // OFFSET: LEGO1 0x100a2d60
int MxDirect3DRMDevice::Update() int MxDirect3DRMDevice::Update()
{ {
return SUCCEEDED(m_pD3DRMDevice->Update()); return SUCCEEDED(m_pD3DRMDevice->Update());
} }
// Probably wrong, not sure what's going on in this method. // Probably wrong, not sure what's going on in this method.
// OFFSET: LEGO1 0x100a2ce0 // OFFSET: LEGO1 0x100a2ce0
void MxDirect3DRMDevice::InitFromD3D() void MxDirect3DRMDevice::InitFromD3D()
{ {
IDirect3DRMWinDevice *winDevice; IDirect3DRMWinDevice* winDevice;
if (SUCCEEDED(m_pD3DRMDevice->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*)&winDevice))) if (SUCCEEDED(m_pD3DRMDevice->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*) &winDevice))) {
{ m_pD3DRMDevice->InitFromD3D((LPDIRECT3D) &winDevice, (LPDIRECT3DDEVICE) m_pD3DRMDevice);
m_pD3DRMDevice->InitFromD3D((LPDIRECT3D)&winDevice, (LPDIRECT3DDEVICE)m_pD3DRMDevice); winDevice->Release();
winDevice->Release(); }
}
} }
// Really don't know what's going on here. Seems it will call down to Init // Really don't know what's going on here. Seems it will call down to Init
@ -95,11 +92,9 @@ void MxDirect3DRMDevice::InitFromD3D()
// OFFSET: LEGO1 0x100a2d20 // OFFSET: LEGO1 0x100a2d20
void MxDirect3DRMDevice::Init() void MxDirect3DRMDevice::Init()
{ {
IDirect3DRMWinDevice *winDevice; IDirect3DRMWinDevice* winDevice;
if (SUCCEEDED(m_pD3DRMDevice->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*)&winDevice))) if (SUCCEEDED(m_pD3DRMDevice->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*) &winDevice))) {
{ // m_pD3DRMDevice->Init();
//m_pD3DRMDevice->Init(); winDevice->Release();
winDevice->Release(); }
}
} }

View File

@ -1,52 +1,47 @@
#include "mxtypes.h"
#include "d3drm.h" #include "d3drm.h"
#include "mxdirect3drmobject.h" #include "mxdirect3drmobject.h"
#include "mxtypes.h"
// VTABLE 0x100db9b8 // VTABLE 0x100db9b8
class IMxDirect3DRMDevice : public IMxDirect3DRMObject class IMxDirect3DRMDevice : public IMxDirect3DRMObject {
{
public: public:
virtual ~IMxDirect3DRMDevice() {} virtual ~IMxDirect3DRMDevice() {}
virtual IUnknown **GetHandle() = 0; virtual IUnknown** GetHandle() = 0;
}; };
enum MxDirect3DRMDeviceQuality enum MxDirect3DRMDeviceQuality {
{ Wireframe = 0x0,
Wireframe = 0x0, UnlitFlat = 0x1,
UnlitFlat = 0x1, Flat = 0x2,
Flat = 0x2, Gouraud = 0x3,
Gouraud = 0x3, Phong = 0x4,
Phong = 0x4,
}; };
// VTABLE 0x100db988 // VTABLE 0x100db988
class MxDirect3DRMDevice : public IMxDirect3DRMDevice class MxDirect3DRMDevice : public IMxDirect3DRMDevice {
{
public: public:
MxDirect3DRMDevice() {} MxDirect3DRMDevice() {}
virtual ~MxDirect3DRMDevice() {} virtual ~MxDirect3DRMDevice() {}
virtual IUnknown **GetHandle(); virtual IUnknown** GetHandle();
// 0x08 in vtable // 0x08 in vtable
virtual int GetWidth(); virtual int GetWidth();
virtual int GetHeight(); virtual int GetHeight();
// 0x10 in vtable // 0x10 in vtable
virtual int unknown1(); virtual int unknown1();
virtual int SetQuality(MxDirect3DRMDeviceQuality p_quality); virtual int SetQuality(MxDirect3DRMDeviceQuality p_quality);
virtual int SetShades(MxU32 p_shades); virtual int SetShades(MxU32 p_shades);
virtual int SetDither(int p_dither); virtual int SetDither(int p_dither);
// 0x20 in vtable // 0x20 in vtable
virtual int Update(); virtual int Update();
virtual void InitFromD3D(); virtual void InitFromD3D();
virtual void Init(); virtual void Init();
private: private:
IDirect3DRMDevice *m_pD3DRMDevice; IDirect3DRMDevice* m_pD3DRMDevice;
}; };

View File

@ -1,14 +1,12 @@
#include "mxtypes.h"
#include "d3d.h" #include "d3d.h"
#include "d3drm.h" #include "d3drm.h"
#include "mxtypes.h"
// VTABLE 0x100db980 // VTABLE 0x100db980
class IMxDirect3DRMObject class IMxDirect3DRMObject {
{
public: public:
virtual ~IMxDirect3DRMObject() {} virtual ~IMxDirect3DRMObject() {}
virtual IUnknown **GetHandle() = 0; virtual IUnknown** GetHandle() = 0;
}; };

View File

@ -7,160 +7,160 @@ DECOMP_SIZE_ASSERT(MxDirect3DRMTexture, 0x8);
DECOMP_SIZE_ASSERT(MxD3DRMIMAGE, 0x40); DECOMP_SIZE_ASSERT(MxD3DRMIMAGE, 0x40);
// OFFSET: LEGO1 0x100a1330 // OFFSET: LEGO1 0x100a1330
MxD3DRMIMAGE::MxD3DRMIMAGE(int p_width, int p_height, int p_depth, void *p_buffer, int p_useBuffer, int p_paletteSize, PaletteEntry *p_palette) MxD3DRMIMAGE::MxD3DRMIMAGE(
int p_width,
int p_height,
int p_depth,
void* p_buffer,
int p_useBuffer,
int p_paletteSize,
PaletteEntry* p_palette
)
{ {
m_image.aspectx = 1; m_image.aspectx = 1;
m_image.aspecty = 1; m_image.aspecty = 1;
m_image.width = 0; m_image.width = 0;
m_image.height = 0; m_image.height = 0;
m_image.depth = 0; m_image.depth = 0;
m_image.rgb = 0; m_image.rgb = 0;
m_image.bytes_per_line = 0; m_image.bytes_per_line = 0;
m_image.buffer1 = NULL; m_image.buffer1 = NULL;
m_image.buffer2 = NULL; m_image.buffer2 = NULL;
m_image.red_mask = 0xFF; m_image.red_mask = 0xFF;
m_image.green_mask = 0xFF; m_image.green_mask = 0xFF;
m_image.blue_mask = 0xFF; m_image.blue_mask = 0xFF;
m_image.alpha_mask = 0xFF; m_image.alpha_mask = 0xFF;
m_image.palette_size = 0; m_image.palette_size = 0;
m_image.palette = NULL; m_image.palette = NULL;
m_extra = 0; m_extra = 0;
if (p_buffer != NULL) if (p_buffer != NULL) {
{ CreateBuffer(p_width, p_height, p_depth, p_buffer, p_useBuffer);
CreateBuffer(p_width, p_height, p_depth, p_buffer, p_useBuffer); }
} if (p_palette != NULL) {
if (p_palette != NULL) InitializePalette(p_paletteSize, p_palette);
{ }
InitializePalette(p_paletteSize, p_palette);
}
} }
// OFFSET: LEGO1 0x100a13e0 STUB // OFFSET: LEGO1 0x100a13e0 STUB
int MxD3DRMIMAGE::CreateBuffer(int p_width, int p_height, int p_depth, void *p_buffer, int p_useBuffer) int MxD3DRMIMAGE::CreateBuffer(int p_width, int p_height, int p_depth, void* p_buffer, int p_useBuffer)
{ {
return 0; return 0;
} }
// OFFSET: LEGO1 0x100a13b0 // OFFSET: LEGO1 0x100a13b0
void MxD3DRMIMAGE::Destroy() void MxD3DRMIMAGE::Destroy()
{ {
if (m_extra == 0) if (m_extra == 0) {
{ free(m_image.buffer1);
free(m_image.buffer1); }
} free(m_image.palette);
free(m_image.palette);
} }
// OFFSET: LEGO1 0x100a1510 // OFFSET: LEGO1 0x100a1510
void MxD3DRMIMAGE::FillRowsOfTexture(int p_y, int p_height, char *p_content) void MxD3DRMIMAGE::FillRowsOfTexture(int p_y, int p_height, char* p_content)
{ {
// The purpose is clearly this but I can't get the assembly to line up. // The purpose is clearly this but I can't get the assembly to line up.
memcpy((char*)m_image.buffer1 + (p_y * m_image.bytes_per_line), memcpy((char*) m_image.buffer1 + (p_y * m_image.bytes_per_line), p_content, p_height * m_image.bytes_per_line);
p_content,
p_height * m_image.bytes_per_line);
} }
// OFFSET: LEGO1 0x100a1550 // OFFSET: LEGO1 0x100a1550
int MxD3DRMIMAGE::InitializePalette(int p_paletteSize, PaletteEntry *p_palette) int MxD3DRMIMAGE::InitializePalette(int p_paletteSize, PaletteEntry* p_palette)
{ {
if (m_image.palette_size != p_paletteSize) if (m_image.palette_size != p_paletteSize) {
{ if (m_image.palette != NULL) {
if (m_image.palette != NULL) free(m_image.palette);
{ m_image.palette = NULL;
free(m_image.palette); m_image.palette_size = 0;
m_image.palette = NULL; }
m_image.palette_size = 0; if (p_paletteSize > 0) {
} m_image.palette = (D3DRMPALETTEENTRY*) malloc(4 * p_paletteSize);
if (p_paletteSize > 0) m_image.palette_size = p_paletteSize;
{ }
m_image.palette = (D3DRMPALETTEENTRY*)malloc(4 * p_paletteSize); }
m_image.palette_size = p_paletteSize; if (p_paletteSize > 0) {
} for (int i = 0; i < p_paletteSize; i++) {
} m_image.palette[i].red = p_palette[i].r;
if (p_paletteSize > 0) m_image.palette[i].green = p_palette[i].g;
{ m_image.palette[i].blue = p_palette[i].b;
for (int i = 0; i < p_paletteSize; i++) m_image.palette[i].flags = D3DRMPALETTE_READONLY;
{ }
m_image.palette[i].red = p_palette[i].r; }
m_image.palette[i].green = p_palette[i].g; return TRUE;
m_image.palette[i].blue = p_palette[i].b;
m_image.palette[i].flags = D3DRMPALETTE_READONLY;
}
}
return TRUE;
} }
// OFFSET: LEGO1 0x100a3d70 // OFFSET: LEGO1 0x100a3d70
IUnknown **MxDirect3DRMTexture::GetHandle() IUnknown** MxDirect3DRMTexture::GetHandle()
{ {
return (IUnknown**)&m_pDirect3DRMTexture; return (IUnknown**) &m_pDirect3DRMTexture;
} }
// OFFSET: LEGO1 0x100a3c10 // OFFSET: LEGO1 0x100a3c10
int MxDirect3DRMTexture::SetBuffer(int p_width, int p_height, int p_depth, void *p_buffer) int MxDirect3DRMTexture::SetBuffer(int p_width, int p_height, int p_depth, void* p_buffer)
{ {
// Haven't tried very hard to get a very good match here yet, the control // Haven't tried very hard to get a very good match here yet, the control
// flow for the result handling is a bit annoying. // flow for the result handling is a bit annoying.
MxD3DRMIMAGE *image = GetImageData(); MxD3DRMIMAGE* image = GetImageData();
int result = image->CreateBuffer(p_width, p_height, p_depth, p_buffer, TRUE); int result = image->CreateBuffer(p_width, p_height, p_depth, p_buffer, TRUE);
if (result == TRUE) if (result == TRUE) {
{ if (!SUCCEEDED(m_pDirect3DRMTexture->Changed(TRUE, FALSE))) {
if (!SUCCEEDED(m_pDirect3DRMTexture->Changed(TRUE, FALSE))) result = FALSE;
{ }
result = FALSE; }
} return result;
}
return result;
} }
// OFFSET: LEGO1 0x100a3c60 // OFFSET: LEGO1 0x100a3c60
void MxDirect3DRMTexture::FillRowsOfTexture(int p_y, int p_height, void *p_buffer) void MxDirect3DRMTexture::FillRowsOfTexture(int p_y, int p_height, void* p_buffer)
{ {
MxD3DRMIMAGE *image = GetImageData(); MxD3DRMIMAGE* image = GetImageData();
image->FillRowsOfTexture(p_y, p_height, (char*)p_buffer); image->FillRowsOfTexture(p_y, p_height, (char*) p_buffer);
} }
// OFFSET: LEGO1 0x100a3c90 // OFFSET: LEGO1 0x100a3c90
int MxDirect3DRMTexture::Changed(int p_pixelsChanged, int p_paletteChanged) int MxDirect3DRMTexture::Changed(int p_pixelsChanged, int p_paletteChanged)
{ {
return SUCCEEDED(m_pDirect3DRMTexture->Changed(p_pixelsChanged, p_paletteChanged)); return SUCCEEDED(m_pDirect3DRMTexture->Changed(p_pixelsChanged, p_paletteChanged));
} }
// OFFSET: LEGO1 0x100a3d00 // OFFSET: LEGO1 0x100a3d00
int MxDirect3DRMTexture::GetBufferAndPalette(int *p_width, int *p_height, int *p_depth, void **p_buffer, int *p_paletteSize, MxD3DRMIMAGE::PaletteEntry **p_palette) int MxDirect3DRMTexture::GetBufferAndPalette(
int* p_width,
int* p_height,
int* p_depth,
void** p_buffer,
int* p_paletteSize,
MxD3DRMIMAGE::PaletteEntry** p_palette
)
{ {
// Something really doesn't match here, not sure what's up. // Something really doesn't match here, not sure what's up.
MxD3DRMIMAGE *image = GetImageData(); MxD3DRMIMAGE* image = GetImageData();
*p_width = image->m_image.width; *p_width = image->m_image.width;
*p_height = image->m_image.height; *p_height = image->m_image.height;
*p_depth = image->m_image.depth; *p_depth = image->m_image.depth;
*p_buffer = image->m_image.buffer1; *p_buffer = image->m_image.buffer1;
*p_paletteSize = image->m_image.palette_size; *p_paletteSize = image->m_image.palette_size;
for (int i = 0; i < image->m_image.palette_size; i++) for (int i = 0; i < image->m_image.palette_size; i++) {
{ p_palette[i]->r = image->m_image.palette[i].red;
p_palette[i]->r = image->m_image.palette[i].red; p_palette[i]->g = image->m_image.palette[i].green;
p_palette[i]->g = image->m_image.palette[i].green; p_palette[i]->b = image->m_image.palette[i].blue;
p_palette[i]->b = image->m_image.palette[i].blue; }
} return TRUE;
return TRUE;
} }
// OFFSET: LEGO1 0x100a3d40 // OFFSET: LEGO1 0x100a3d40
int MxDirect3DRMTexture::InitializePalette(int p_paletteSize, MxD3DRMIMAGE::PaletteEntry *p_palette) int MxDirect3DRMTexture::InitializePalette(int p_paletteSize, MxD3DRMIMAGE::PaletteEntry* p_palette)
{ {
// Not 100% confident this is supposed to directly be forwarding arguments, // Not 100% confident this is supposed to directly be forwarding arguments,
// but it probably is given FillRowsOfTexture matches doing that. // but it probably is given FillRowsOfTexture matches doing that.
MxD3DRMIMAGE *image = GetImageData(); MxD3DRMIMAGE* image = GetImageData();
image->InitializePalette(p_paletteSize, p_palette); image->InitializePalette(p_paletteSize, p_palette);
m_pDirect3DRMTexture->Changed(FALSE, TRUE); m_pDirect3DRMTexture->Changed(FALSE, TRUE);
return TRUE; return TRUE;
} }
// OFFSET: LEGO1 0x100a1300 // OFFSET: LEGO1 0x100a1300
void MxDirect3DRMTexture::OnDestroyed() void MxDirect3DRMTexture::OnDestroyed()
{ {
delete GetImageData(); delete GetImageData();
m_pDirect3DRMTexture->SetAppData(NULL); m_pDirect3DRMTexture->SetAppData(NULL);
} }

View File

@ -2,72 +2,87 @@
#include "mxdirect3drmobject.h" #include "mxdirect3drmobject.h"
// No vtable, this is just a simple wrapper around D3DRMIMAGE // No vtable, this is just a simple wrapper around D3DRMIMAGE
class MxD3DRMIMAGE class MxD3DRMIMAGE {
{
public: public:
struct PaletteEntry struct PaletteEntry {
{ unsigned char r;
unsigned char r; unsigned char g;
unsigned char g; unsigned char b;
unsigned char b; };
};
MxD3DRMIMAGE(int p_width, int p_height, int p_depth, void *p_buffer, int p_useBuffer, int p_paletteSize, PaletteEntry *p_palette); MxD3DRMIMAGE(
~MxD3DRMIMAGE() { Destroy(); } int p_width,
int p_height,
int CreateBuffer(int p_width, int p_height, int p_depth, void *p_buffer, int p_useBuffer); int p_depth,
void Destroy(); void* p_buffer,
void FillRowsOfTexture(int p_y, int p_height, char *p_content); int p_useBuffer,
int InitializePalette(int p_paletteSize, PaletteEntry *p_palette); int p_paletteSize,
PaletteEntry* p_palette
);
~MxD3DRMIMAGE() { Destroy(); }
D3DRMIMAGE m_image; int CreateBuffer(int p_width, int p_height, int p_depth, void* p_buffer, int p_useBuffer);
int m_extra; void Destroy();
void FillRowsOfTexture(int p_y, int p_height, char* p_content);
int InitializePalette(int p_paletteSize, PaletteEntry* p_palette);
D3DRMIMAGE m_image;
int m_extra;
}; };
// VTABLE 0x100dbb68 // VTABLE 0x100dbb68
class IMxDirect3DRMTexture : public IMxDirect3DRMObject class IMxDirect3DRMTexture : public IMxDirect3DRMObject {
{
public: public:
virtual ~IMxDirect3DRMTexture() {} virtual ~IMxDirect3DRMTexture() {}
virtual IUnknown **GetHandle() = 0; virtual IUnknown** GetHandle() = 0;
// vtable+0x08 // vtable+0x08
virtual int SetBuffer(int p_width, int p_height, int p_depth, void *p_buffer) = 0; virtual int SetBuffer(int p_width, int p_height, int p_depth, void* p_buffer) = 0;
virtual void FillRowsOfTexture(int p_y, int p_height, void *p_buffer) = 0; virtual void FillRowsOfTexture(int p_y, int p_height, void* p_buffer) = 0;
// vtable+0x10 // vtable+0x10
virtual int Changed(int p_pixelsChanged, int p_paletteChanged) = 0; virtual int Changed(int p_pixelsChanged, int p_paletteChanged) = 0;
virtual int GetBufferAndPalette(int *p_width, int *p_height, int *p_depth, void **p_buffer, int *p_paletteSize, MxD3DRMIMAGE::PaletteEntry **p_palette) = 0; virtual int GetBufferAndPalette(
virtual int InitializePalette(int p_paletteSize, MxD3DRMIMAGE::PaletteEntry *p_palette) = 0; int* p_width,
int* p_height,
int* p_depth,
void** p_buffer,
int* p_paletteSize,
MxD3DRMIMAGE::PaletteEntry** p_palette
) = 0;
virtual int InitializePalette(int p_paletteSize, MxD3DRMIMAGE::PaletteEntry* p_palette) = 0;
}; };
// VTABLE 0x100dbb48 // VTABLE 0x100dbb48
class MxDirect3DRMTexture : public IMxDirect3DRMTexture class MxDirect3DRMTexture : public IMxDirect3DRMTexture {
{
public: public:
MxDirect3DRMTexture() {} MxDirect3DRMTexture() {}
virtual ~MxDirect3DRMTexture() {} virtual ~MxDirect3DRMTexture() {}
virtual IUnknown **GetHandle(); virtual IUnknown** GetHandle();
// vtable+0x08 // vtable+0x08
virtual int SetBuffer(int p_width, int p_height, int p_depth, void *p_buffer); virtual int SetBuffer(int p_width, int p_height, int p_depth, void* p_buffer);
virtual void FillRowsOfTexture(int p_y, int p_height, void *p_buffer); virtual void FillRowsOfTexture(int p_y, int p_height, void* p_buffer);
// vtable+0x10 // vtable+0x10
virtual int Changed(int p_pixelsChanged, int p_paletteChanged); virtual int Changed(int p_pixelsChanged, int p_paletteChanged);
virtual int GetBufferAndPalette(int *p_width, int *p_height, int *p_depth, void **p_buffer, int *p_paletteSize, MxD3DRMIMAGE::PaletteEntry **p_palette); virtual int GetBufferAndPalette(
virtual int InitializePalette(int p_paletteSize, MxD3DRMIMAGE::PaletteEntry *p_palette); int* p_width,
int* p_height,
int* p_depth,
void** p_buffer,
int* p_paletteSize,
MxD3DRMIMAGE::PaletteEntry** p_palette
);
virtual int InitializePalette(int p_paletteSize, MxD3DRMIMAGE::PaletteEntry* p_palette);
// Not virtual // Not virtual
void OnDestroyed(); void OnDestroyed();
private: private:
inline MxD3DRMIMAGE *GetImageData() inline MxD3DRMIMAGE* GetImageData() { return (MxD3DRMIMAGE*) m_pDirect3DRMTexture->GetAppData(); }
{
return (MxD3DRMIMAGE*)m_pDirect3DRMTexture->GetAppData();
}
IDirect3DRMTexture *m_pDirect3DRMTexture; IDirect3DRMTexture* m_pDirect3DRMTexture;
}; };

View File

@ -7,183 +7,181 @@
DECOMP_SIZE_ASSERT(IMxDirect3DRMViewport, 0x4); DECOMP_SIZE_ASSERT(IMxDirect3DRMViewport, 0x4);
DECOMP_SIZE_ASSERT(MxDirect3DRMViewport, 0x8); DECOMP_SIZE_ASSERT(MxDirect3DRMViewport, 0x8);
struct MxDirect3DRMViewportData struct MxDirect3DRMViewportData {
{ IDirect3DRMFrame* m_pDirect3DRMFrame;
IDirect3DRMFrame *m_pDirect3DRMFrame; IDirect3DRMFrame* m_pCamera;
IDirect3DRMFrame *m_pCamera; IDirect3DRMFrame* m_pCameraParent;
IDirect3DRMFrame *m_pCameraParent; float m_backgroundRGB[3];
float m_backgroundRGB[3];
}; };
// OFFSET: LEGO1 0x100a2d80 // OFFSET: LEGO1 0x100a2d80
IUnknown **MxDirect3DRMViewport::GetHandle() IUnknown** MxDirect3DRMViewport::GetHandle()
{ {
return (IUnknown**)&m_pDirect3DRMViewport; return (IUnknown**) &m_pDirect3DRMViewport;
} }
// OFFSET: LEGO1 0x100a2d90 // OFFSET: LEGO1 0x100a2d90
int MxDirect3DRMViewport::AddLight(MxDirect3DRMFrame *p_frame) int MxDirect3DRMViewport::AddLight(MxDirect3DRMFrame* p_frame)
{ {
IDirect3DRMFrame *frame = p_frame->GetFrame(); IDirect3DRMFrame* frame = p_frame->GetFrame();
return SUCCEEDED(GetViewportData()->m_pDirect3DRMFrame->AddChild(frame)); return SUCCEEDED(GetViewportData()->m_pDirect3DRMFrame->AddChild(frame));
} }
// OFFSET: LEGO1 0x100a2dc0 // OFFSET: LEGO1 0x100a2dc0
int MxDirect3DRMViewport::DeleteLight(MxDirect3DRMFrame *p_frame) int MxDirect3DRMViewport::DeleteLight(MxDirect3DRMFrame* p_frame)
{ {
IDirect3DRMFrame *frame = p_frame->GetFrame(); IDirect3DRMFrame* frame = p_frame->GetFrame();
return SUCCEEDED(GetViewportData()->m_pDirect3DRMFrame->DeleteChild(frame)); return SUCCEEDED(GetViewportData()->m_pDirect3DRMFrame->DeleteChild(frame));
} }
// Disassembly is not close, not sure what's going wrong. // Disassembly is not close, not sure what's going wrong.
// OFFSET: LEGO1 0x100a2df0 // OFFSET: LEGO1 0x100a2df0
int MxDirect3DRMViewport::SetCamera(MxDirect3DRMFrame *p_camera) int MxDirect3DRMViewport::SetCamera(MxDirect3DRMFrame* p_camera)
{ {
IDirect3DRMViewport *viewport = GetViewport(); IDirect3DRMViewport* viewport = GetViewport();
IDirect3DRMFrame *camera = p_camera->GetFrame(); IDirect3DRMFrame* camera = p_camera->GetFrame();
MxDirect3DRMViewportData* data = GetViewportData(); MxDirect3DRMViewportData* data = GetViewportData();
if (data->m_pCameraParent) if (data->m_pCameraParent) {
{ data->m_pCameraParent->DeleteChild(data->m_pCamera);
data->m_pCameraParent->DeleteChild(data->m_pCamera); // Another call goes here, not sure what.
// Another call goes here, not sure what. data->m_pCameraParent->Release();
data->m_pCameraParent->Release(); }
} data->m_pCamera = camera;
data->m_pCamera = camera; data->m_pCameraParent = NULL;
data->m_pCameraParent = NULL; return SUCCEEDED(viewport->SetCamera(camera));
return SUCCEEDED(viewport->SetCamera(camera));
} }
// OFFSET: LEGO1 0x100a2e70 // OFFSET: LEGO1 0x100a2e70
int MxDirect3DRMViewport::SetProjection(int p_type) int MxDirect3DRMViewport::SetProjection(int p_type)
{ {
D3DRMPROJECTIONTYPE proj; D3DRMPROJECTIONTYPE proj;
switch (p_type) switch (p_type) {
{ case 0:
case 0: proj = D3DRMPROJECT_PERSPECTIVE;
proj = D3DRMPROJECT_PERSPECTIVE; break;
break; case 1:
case 1: proj = D3DRMPROJECT_ORTHOGRAPHIC;
proj = D3DRMPROJECT_ORTHOGRAPHIC; break;
break; default:
default: proj = D3DRMPROJECT_PERSPECTIVE;
proj = D3DRMPROJECT_PERSPECTIVE; }
} return SUCCEEDED(GetViewport()->SetProjection(proj));
return SUCCEEDED(GetViewport()->SetProjection(proj));
} }
// OFFSET: LEGO1 0x100a2eb0 // OFFSET: LEGO1 0x100a2eb0
int MxDirect3DRMViewport::SetPlanes(float p_near, float p_far, float p_FoV) int MxDirect3DRMViewport::SetPlanes(float p_near, float p_far, float p_FoV)
{ {
int ret; int ret;
float field = tanf(((p_FoV * 0.5f) * (5/9)) * 3.141592653589793); float field = tanf(((p_FoV * 0.5f) * (5 / 9)) * 3.141592653589793);
// Not very confident about this code, seems like p_near may actually be // Not very confident about this code, seems like p_near may actually be
// multiplied by something before being passed to SetFront. // multiplied by something before being passed to SetFront.
if (ret = SUCCEEDED(m_pDirect3DRMViewport->SetFront(p_near))) if (ret = SUCCEEDED(m_pDirect3DRMViewport->SetFront(p_near))) {
{ if (ret = SUCCEEDED(m_pDirect3DRMViewport->SetBack(p_far))) {
if (ret = SUCCEEDED(m_pDirect3DRMViewport->SetBack(p_far))) ret = SUCCEEDED(m_pDirect3DRMViewport->SetField(field));
{ }
ret = SUCCEEDED(m_pDirect3DRMViewport->SetField(field)); }
} return ret;
}
return ret;
} }
// OFFSET: LEGO1 0x100a2f30 // OFFSET: LEGO1 0x100a2f30
int MxDirect3DRMViewport::SetBackgroundRGB(float p_r, float p_g, float p_b) int MxDirect3DRMViewport::SetBackgroundRGB(float p_r, float p_g, float p_b)
{ {
int ret = TRUE; int ret = TRUE;
MxDirect3DRMViewportData* data = GetViewportData(); MxDirect3DRMViewportData* data = GetViewportData();
data->m_backgroundRGB[0] = p_r; data->m_backgroundRGB[0] = p_r;
data->m_backgroundRGB[1] = p_g; data->m_backgroundRGB[1] = p_g;
data->m_backgroundRGB[2] = p_b; data->m_backgroundRGB[2] = p_b;
if (data->m_pCameraParent) if (data->m_pCameraParent) {
{ ret = data->m_pCameraParent->SetSceneBackgroundRGB(p_r, p_g, p_b) < 0 ? FALSE : TRUE;
ret = data->m_pCameraParent->SetSceneBackgroundRGB(p_r, p_g, p_b) < 0 ? FALSE : TRUE; }
} return ret;
return ret;
} }
// OFFSET: LEGO1 0x100a2f80 // OFFSET: LEGO1 0x100a2f80
int MxDirect3DRMViewport::GetBackgroundRGB(float *p_r, float *p_g, float *p_b) int MxDirect3DRMViewport::GetBackgroundRGB(float* p_r, float* p_g, float* p_b)
{ {
MxDirect3DRMViewportData* data = GetViewportData(); MxDirect3DRMViewportData* data = GetViewportData();
*p_r = data->m_backgroundRGB[0]; *p_r = data->m_backgroundRGB[0];
*p_g = data->m_backgroundRGB[1]; *p_g = data->m_backgroundRGB[1];
*p_b = data->m_backgroundRGB[2]; *p_b = data->m_backgroundRGB[2];
return TRUE; return TRUE;
} }
// OFFSET: LEGO1 0x100a2fb0 // OFFSET: LEGO1 0x100a2fb0
int MxDirect3DRMViewport::Clear() int MxDirect3DRMViewport::Clear()
{ {
return SUCCEEDED(m_pDirect3DRMViewport->Clear()); return SUCCEEDED(m_pDirect3DRMViewport->Clear());
} }
// OFFSET: LEGO1 0x100a2fd0 SetCameraParent // OFFSET: LEGO1 0x100a2fd0 SetCameraParent
int MxDirect3DRMViewport::SetCameraParent(MxDirect3DRMFrame *p_frame) int MxDirect3DRMViewport::SetCameraParent(MxDirect3DRMFrame* p_frame)
{ {
// Not close yet due to missing calls below. // Not close yet due to missing calls below.
IDirect3DRMViewport* viewport = GetViewport(); IDirect3DRMViewport* viewport = GetViewport();
IDirect3DRMFrame* newParent = p_frame->GetFrame(); IDirect3DRMFrame* newParent = p_frame->GetFrame();
MxDirect3DRMViewportData* data = GetViewportData(); MxDirect3DRMViewportData* data = GetViewportData();
IDirect3DRMFrame *oldParent = data->m_pCameraParent; IDirect3DRMFrame* oldParent = data->m_pCameraParent;
if (newParent != oldParent) if (newParent != oldParent) {
{ if (oldParent != NULL) {
if (oldParent != NULL) oldParent->DeleteChild(data->m_pCamera);
{ // Another call goes here, not sure what.
oldParent->DeleteChild(data->m_pCamera); oldParent->Release();
// Another call goes here, not sure what. }
oldParent->Release(); data->m_pCameraParent = newParent;
} oldParent = data->m_pDirect3DRMFrame;
data->m_pCameraParent = newParent; if (newParent != NULL) {
oldParent = data->m_pDirect3DRMFrame; newParent
if (newParent != NULL) ->SetSceneBackgroundRGB(data->m_backgroundRGB[0], data->m_backgroundRGB[1], data->m_backgroundRGB[2]);
{ newParent->AddChild(data->m_pCamera);
newParent->SetSceneBackgroundRGB(data->m_backgroundRGB[0], data->m_backgroundRGB[1], data->m_backgroundRGB[2]); // Another call goes here, not sure what.
newParent->AddChild(data->m_pCamera); newParent->AddRef();
// Another call goes here, not sure what. }
newParent->AddRef(); }
} return SUCCEEDED(viewport->Render(newParent));
}
return SUCCEEDED(viewport->Render(newParent));
} }
// OFFSET: LEGO1 0x100a3080 // OFFSET: LEGO1 0x100a3080
int MxDirect3DRMViewport::ForceUpdate(int x, int y, int width, int height) int MxDirect3DRMViewport::ForceUpdate(int x, int y, int width, int height)
{ {
return SUCCEEDED(m_pDirect3DRMViewport->ForceUpdate(x, y, x + width - 1, y + height - 1)); return SUCCEEDED(m_pDirect3DRMViewport->ForceUpdate(x, y, x + width - 1, y + height - 1));
} }
// OFFSET: LEGO1 0x100a30f0 Transform // OFFSET: LEGO1 0x100a30f0 Transform
int MxDirect3DRMViewport::Transform(float *p_shiftByVector3, float *p_out) int MxDirect3DRMViewport::Transform(float* p_shiftByVector3, float* p_out)
{ {
D3DVECTOR s; D3DVECTOR s;
s.x = p_shiftByVector3[0]; s.x = p_shiftByVector3[0];
s.y = p_shiftByVector3[1]; s.y = p_shiftByVector3[1];
s.z = p_shiftByVector3[2]; s.z = p_shiftByVector3[2];
D3DRMVECTOR4D d; D3DRMVECTOR4D d;
int ret = m_pDirect3DRMViewport->Transform(&d, &s); int ret = m_pDirect3DRMViewport->Transform(&d, &s);
if (SUCCEEDED(ret) == TRUE) if (SUCCEEDED(ret) == TRUE) {
{ p_out[0] = d.x;
p_out[0] = d.x; p_out[1] = d.y;
p_out[1] = d.y; p_out[2] = d.z;
p_out[2] = d.z; p_out[3] = d.w;
p_out[3] = d.w; }
} return SUCCEEDED(ret);
return SUCCEEDED(ret);
} }
// Don't know the types of the parameters for this. // Don't know the types of the parameters for this.
// OFFSET: LEGO1 0x100a30c0 // OFFSET: LEGO1 0x100a30c0
int MxDirect3DRMViewport::unk(int p_1, int p_2, int p_3, int p_4, int p_5, int p_6) int MxDirect3DRMViewport::unk(int p_1, int p_2, int p_3, int p_4, int p_5, int p_6)
{ {
return unkInternal(m_pDirect3DRMViewport, p_1, p_2, p_3, p_4, p_5, p_6); return unkInternal(m_pDirect3DRMViewport, p_1, p_2, p_3, p_4, p_5, p_6);
} }
// OFFSET: LEGO1 0x100a1290 // OFFSET: LEGO1 0x100a1290
int MxDirect3DRMViewport::unkInternal(IDirect3DRMViewport* p_viewport, int p_1, int p_2, int p_3, int p_4, int p_5, int p_6) int MxDirect3DRMViewport::unkInternal(
IDirect3DRMViewport* p_viewport,
int p_1,
int p_2,
int p_3,
int p_4,
int p_5,
int p_6
)
{ {
return 0; return 0;
} }

View File

@ -2,75 +2,73 @@
#include "mxdirect3drmclasses.h" #include "mxdirect3drmclasses.h"
// VTABLE 0x100dba28 // VTABLE 0x100dba28
class IMxDirect3DRMViewport : public IMxDirect3DRMObject class IMxDirect3DRMViewport : public IMxDirect3DRMObject {
{
public: public:
virtual ~IMxDirect3DRMViewport() {} virtual ~IMxDirect3DRMViewport() {}
virtual IUnknown **GetHandle() = 0; virtual IUnknown** GetHandle() = 0;
// vtable+0x08 // vtable+0x08
virtual int AddLight(MxDirect3DRMFrame *p_frame) = 0; virtual int AddLight(MxDirect3DRMFrame* p_frame) = 0;
virtual int DeleteLight(MxDirect3DRMFrame *p_frame) = 0; virtual int DeleteLight(MxDirect3DRMFrame* p_frame) = 0;
// vtable+0x10 // vtable+0x10
virtual int SetCamera(MxDirect3DRMFrame *p_camera) = 0; virtual int SetCamera(MxDirect3DRMFrame* p_camera) = 0;
virtual int SetProjection(int p_type) = 0; virtual int SetProjection(int p_type) = 0;
virtual int SetPlanes(float p_near, float p_far, float p_FoV) = 0; virtual int SetPlanes(float p_near, float p_far, float p_FoV) = 0;
virtual int SetBackgroundRGB(float p_r, float p_g, float p_b) = 0; virtual int SetBackgroundRGB(float p_r, float p_g, float p_b) = 0;
// vtable+0x20 // vtable+0x20
virtual int GetBackgroundRGB(float *p_r, float *p_g, float *p_b) = 0; virtual int GetBackgroundRGB(float* p_r, float* p_g, float* p_b) = 0;
virtual int Clear() = 0; virtual int Clear() = 0;
virtual int SetCameraParent(MxDirect3DRMFrame *p_frame) = 0; virtual int SetCameraParent(MxDirect3DRMFrame* p_frame) = 0;
virtual int ForceUpdate(int x, int y, int width, int height) = 0; virtual int ForceUpdate(int x, int y, int width, int height) = 0;
// vtable+0x30 // vtable+0x30
virtual int Transform(float *p_shiftByVector3, float *p_out) = 0; virtual int Transform(float* p_shiftByVector3, float* p_out) = 0;
virtual int InverseTransform(D3DRMVECTOR4D *p_in, float *p_outVector3) = 0; virtual int InverseTransform(D3DRMVECTOR4D* p_in, float* p_outVector3) = 0;
virtual int unk(int p_1, int p_2, int p_3, int p_4, int p_5, int p_6) = 0; virtual int unk(int p_1, int p_2, int p_3, int p_4, int p_5, int p_6) = 0;
}; };
struct MxDirect3DRMViewportData; struct MxDirect3DRMViewportData;
// VTABLE 0x100db9e8 // VTABLE 0x100db9e8
class MxDirect3DRMViewport : public IMxDirect3DRMViewport class MxDirect3DRMViewport : public IMxDirect3DRMViewport {
{
public: public:
MxDirect3DRMViewport() {} MxDirect3DRMViewport() {}
virtual ~MxDirect3DRMViewport() {} virtual ~MxDirect3DRMViewport() {}
virtual IUnknown **GetHandle(); virtual IUnknown** GetHandle();
IDirect3DRMViewport *GetViewport() { return m_pDirect3DRMViewport; } IDirect3DRMViewport* GetViewport() { return m_pDirect3DRMViewport; }
// vtable+0x08 // vtable+0x08
virtual int AddLight(MxDirect3DRMFrame *p_frame); virtual int AddLight(MxDirect3DRMFrame* p_frame);
virtual int DeleteLight(MxDirect3DRMFrame *p_frame); virtual int DeleteLight(MxDirect3DRMFrame* p_frame);
// vtable+0x10 // vtable+0x10
virtual int SetCamera(MxDirect3DRMFrame *p_camera); virtual int SetCamera(MxDirect3DRMFrame* p_camera);
virtual int SetProjection(int p_type); virtual int SetProjection(int p_type);
virtual int SetPlanes(float p_near, float p_far, float p_FoV); virtual int SetPlanes(float p_near, float p_far, float p_FoV);
virtual int SetBackgroundRGB(float p_r, float p_g, float p_b); virtual int SetBackgroundRGB(float p_r, float p_g, float p_b);
// vtable+0x20 // vtable+0x20
virtual int GetBackgroundRGB(float *p_r, float *p_g, float *p_b); virtual int GetBackgroundRGB(float* p_r, float* p_g, float* p_b);
virtual int Clear(); virtual int Clear();
virtual int SetCameraParent(MxDirect3DRMFrame *p_frame); virtual int SetCameraParent(MxDirect3DRMFrame* p_frame);
virtual int ForceUpdate(int x, int y, int width, int height); virtual int ForceUpdate(int x, int y, int width, int height);
// vtable+0x30 // vtable+0x30
virtual int Transform(float *p_shiftByVector3, float *p_out); virtual int Transform(float* p_shiftByVector3, float* p_out);
virtual int InverseTransform(D3DRMVECTOR4D *p_in, float *p_outVector3); virtual int InverseTransform(D3DRMVECTOR4D* p_in, float* p_outVector3);
virtual int unk(int p_1, int p_2, int p_3, int p_4, int p_5, int p_6); virtual int unk(int p_1, int p_2, int p_3, int p_4, int p_5, int p_6);
private: private:
static int unkInternal(IDirect3DRMViewport* p_viewport, int p_1, int p_2, int p_3, int p_4, int p_5, int p_6); static int unkInternal(IDirect3DRMViewport* p_viewport, int p_1, int p_2, int p_3, int p_4, int p_5, int p_6);
inline MxDirect3DRMViewportData *GetViewportData() inline MxDirect3DRMViewportData* GetViewportData()
{ {
return (MxDirect3DRMViewportData*)m_pDirect3DRMViewport->GetAppData(); return (MxDirect3DRMViewportData*) m_pDirect3DRMViewport->GetAppData();
} }
IDirect3DRMViewport *m_pDirect3DRMViewport; IDirect3DRMViewport* m_pDirect3DRMViewport;
}; };