Add all TglImpl::ImplementationData methods (#1436)

* ImplementationData methods and typedefs

* RendererImpl::CreateView

* RendererImpl::CreateMeshBuilder

* DeepClone

* CreateCamera and CreateTexture

* CreateDevice

* Disable static var annotation
This commit is contained in:
MS
2025-04-19 10:30:47 -04:00
committed by GitHub
parent 451fd63eee
commit 2fef2858c9
4 changed files with 458 additions and 106 deletions

View File

@@ -95,15 +95,44 @@ public:
return m_data->CreateTextureFromSurface(pSurface, pTexture2); return m_data->CreateTextureFromSurface(pSurface, pTexture2);
} }
IDirect3DRM2* ImplementationData() const { return m_data; } typedef IDirect3DRM2* RendererDataType;
const RendererDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x10174c10
RendererDataType& ImplementationData() { return m_data; }
public: public:
inline Result Create(); inline Result Create();
inline void Destroy(); inline void Destroy();
inline Result CreateLight(LightType type, float r, float g, float b, LightImpl& rLight); inline Result CreateLight(LightType type, float r, float g, float b, LightImpl& rLight);
inline Result CreateView(
const DeviceImpl& rDevice,
const CameraImpl& rCamera,
unsigned long x,
unsigned long y,
unsigned long width,
unsigned long height,
ViewImpl& rView
);
inline Result CreateMeshBuilder(MeshBuilderImpl& rMesh);
inline Result CreateCamera(CameraImpl& rCamera);
inline Result CreateTexture(TextureImpl& rTexture);
inline Result CreateTexture(
TextureImpl& rTexture,
int width,
int height,
int bitsPerTexel,
const void* pTexels,
int texelsArePersistent,
int paletteEntryCount,
const PaletteEntry* pEntries
);
inline Result CreateDevice(const DeviceDirect3DCreateData& rCreateData, DeviceImpl& rDevice);
inline Result CreateDevice(const DeviceDirectDrawCreateData& rCreateData, DeviceImpl& rDevice);
private: private:
IDirect3DRM2* m_data; RendererDataType m_data;
}; };
extern IDirect3DRM2* g_pD3DRM; extern IDirect3DRM2* g_pD3DRM;
@@ -154,7 +183,14 @@ public:
void HandleActivate(WORD) override; void HandleActivate(WORD) override;
void HandlePaint(HDC) override; void HandlePaint(HDC) override;
IDirect3DRMDevice2* ImplementationData() const { return m_data; } typedef IDirect3DRMDevice2* DeviceDataType;
// FUNCTION: BETA10 0x101708e0
const DeviceDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x100d9540
DeviceDataType& ImplementationData() { return m_data; }
void SetImplementationData(IDirect3DRMDevice2* device) { m_data = device; } void SetImplementationData(IDirect3DRMDevice2* device) { m_data = device; }
inline void Destroy(); inline void Destroy();
@@ -162,7 +198,7 @@ public:
friend class RendererImpl; friend class RendererImpl;
private: private:
IDirect3DRMDevice2* m_data; DeviceDataType m_data;
}; };
// FUNCTION: BETA10 0x101708c0 // FUNCTION: BETA10 0x101708c0
@@ -220,7 +256,13 @@ public:
int& rPickedGroupCount int& rPickedGroupCount
) override; ) override;
IDirect3DRMViewport* ImplementationData() const { return m_data; } typedef IDirect3DRMViewport* ViewDataType;
const ViewDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x101711c0
ViewDataType& ImplementationData() { return m_data; }
void SetImplementationData(IDirect3DRMViewport* viewport) { m_data = viewport; } void SetImplementationData(IDirect3DRMViewport* viewport) { m_data = viewport; }
static Result ViewportCreateAppData(IDirect3DRM2*, IDirect3DRMViewport*, IDirect3DRMFrame2*); static Result ViewportCreateAppData(IDirect3DRM2*, IDirect3DRMViewport*, IDirect3DRMFrame2*);
@@ -242,7 +284,7 @@ public:
friend class RendererImpl; friend class RendererImpl;
private: private:
IDirect3DRMViewport* m_data; ViewDataType m_data;
}; };
// FUNCTION: BETA10 0x101711a0 // FUNCTION: BETA10 0x101711a0
@@ -275,14 +317,20 @@ public:
// vtable+0x08 // vtable+0x08
Result SetTransformation(FloatMatrix4&) override; Result SetTransformation(FloatMatrix4&) override;
IDirect3DRMFrame2* ImplementationData() const { return m_data; } typedef IDirect3DRMFrame2* CameraDataType;
// FUNCTION: BETA10 0x10170960
const CameraDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x10170980
CameraDataType& ImplementationData() { return m_data; }
inline void Destroy(); inline void Destroy();
friend class RendererImpl; friend class RendererImpl;
private: private:
IDirect3DRMFrame2* m_data; CameraDataType m_data;
}; };
// FUNCTION: BETA10 0x10170940 // FUNCTION: BETA10 0x10170940
@@ -318,7 +366,10 @@ public:
typedef IDirect3DRMFrame2* LightDataType; typedef IDirect3DRMFrame2* LightDataType;
// FUNCTION: BETA10 0x10171b90
const LightDataType& ImplementationData() const { return m_data; } const LightDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x10171240
LightDataType& ImplementationData() { return m_data; } LightDataType& ImplementationData() { return m_data; }
inline void Destroy(); inline void Destroy();
@@ -377,9 +428,12 @@ public:
typedef MeshData* MeshDataType; typedef MeshData* MeshDataType;
const MeshDataType& ImplementationData() const { return m_data; } const MeshDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x10171b70
MeshDataType& ImplementationData() { return m_data; } MeshDataType& ImplementationData() { return m_data; }
inline void Destroy(); inline void Destroy();
inline Mesh* DeepClone(const MeshBuilderImpl& rMesh);
friend class RendererImpl; friend class RendererImpl;
@@ -433,14 +487,20 @@ public:
// vtable+0x30 // vtable+0x30
Result Bounds(D3DVECTOR* p_min, D3DVECTOR* p_max) override; Result Bounds(D3DVECTOR* p_min, D3DVECTOR* p_max) override;
IDirect3DRMFrame2* ImplementationData() const { return m_data; } typedef IDirect3DRMFrame2* GroupDataType;
// FUNCTION: BETA10 0x1016fc20
const GroupDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x1016fce0
GroupDataType& ImplementationData() { return m_data; }
inline void Destroy(); inline void Destroy();
friend class RendererImpl; friend class RendererImpl;
private: private:
IDirect3DRMFrame2* m_data; GroupDataType m_data;
}; };
// FUNCTION: BETA10 0x1016c2b0 // FUNCTION: BETA10 0x1016c2b0
@@ -486,7 +546,13 @@ public:
// vtable+0x10 // vtable+0x10
MeshBuilder* Clone() override; MeshBuilder* Clone() override;
IDirect3DRMMesh* ImplementationData() const { return m_data; } typedef IDirect3DRMMesh* MeshBuilderDataType;
// FUNCTION: BETA10 0x10170420
const MeshBuilderDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x10170440
MeshBuilderDataType& ImplementationData() { return m_data; }
inline void Destroy(); inline void Destroy();
@@ -505,7 +571,7 @@ private:
ShadingModel shadingModel ShadingModel shadingModel
); );
IDirect3DRMMesh* m_data; MeshBuilderDataType m_data;
}; };
// FUNCTION: BETA10 0x10170390 // FUNCTION: BETA10 0x10170390
@@ -574,7 +640,14 @@ public:
) override; ) override;
Result SetPalette(int entryCount, PaletteEntry* entries) override; Result SetPalette(int entryCount, PaletteEntry* entries) override;
IDirect3DRMTexture* ImplementationData() const { return m_data; } typedef IDirect3DRMTexture* TextureDataType;
// FUNCTION: BETA10 0x1016fd60
const TextureDataType& ImplementationData() const { return m_data; }
// FUNCTION: BETA10 0x1016fe20
TextureDataType& ImplementationData() { return m_data; }
void SetImplementation(IDirect3DRMTexture* pData) { m_data = pData; } void SetImplementation(IDirect3DRMTexture* pData) { m_data = pData; }
inline void Destroy(); inline void Destroy();
@@ -584,7 +657,7 @@ public:
static Result SetImage(IDirect3DRMTexture* pSelf, TglD3DRMIMAGE* pImage); static Result SetImage(IDirect3DRMTexture* pSelf, TglD3DRMIMAGE* pImage);
private: private:
IDirect3DRMTexture* m_data; TextureDataType m_data;
}; };
// FUNCTION: BETA10 0x1016fd40 // FUNCTION: BETA10 0x1016fd40
@@ -739,6 +812,9 @@ inline D3DRMLIGHTTYPE Translate(LightType tglLightType)
// SYNTHETIC: BETA10 0x1016fa90 // SYNTHETIC: BETA10 0x1016fa90
// TglImpl::MeshImpl::`scalar deleting destructor' // TglImpl::MeshImpl::`scalar deleting destructor'
// SYNTHETIC: BETA10 0x10169960
// ViewportAppData::`scalar deleting destructor'
// GLOBAL: LEGO1 0x100dd1e0 // GLOBAL: LEGO1 0x100dd1e0
// IID_IDirect3DRMMeshBuilder // IID_IDirect3DRMMeshBuilder

View File

@@ -66,49 +66,97 @@ Result MeshImpl::SetShadingModel(ShadingModel model)
return MeshSetShadingModel(m_data, model); return MeshSetShadingModel(m_data, model);
} }
// FUNCTION: LEGO1 0x100a4030 // FUNCTION: BETA10 0x101714e0
Mesh* MeshImpl::DeepClone(MeshBuilder* pMeshBuilder) inline Result MeshDeepClone(MeshImpl::MeshData* pSource, MeshImpl::MeshData*& rpTarget, IDirect3DRMMesh* pMesh)
{ {
// Create group rpTarget = new MeshImpl::MeshData();
MeshImpl* newMesh = new MeshImpl(); rpTarget->groupMesh = pMesh;
MeshData* data = new MeshData();
newMesh->m_data = data;
// Query information from old group // Query information from old group
DWORD dataSize; DWORD dataSize;
unsigned int vcount, fcount, vperface; unsigned int vcount, fcount, vperface;
m_data->groupMesh->GetGroup(m_data->groupIndex, &vcount, &fcount, &vperface, &dataSize, NULL);
Result result =
ResultVal(pSource->groupMesh->GetGroup(pSource->groupIndex, &vcount, &fcount, &vperface, &dataSize, NULL));
assert(Succeeded(result));
unsigned int* faceBuffer = new unsigned int[dataSize]; unsigned int* faceBuffer = new unsigned int[dataSize];
m_data->groupMesh->GetGroup(m_data->groupIndex, &vcount, &fcount, &vperface, &dataSize, faceBuffer); result =
ResultVal(pSource->groupMesh->GetGroup(pSource->groupIndex, &vcount, &fcount, &vperface, &dataSize, faceBuffer)
);
assert(Succeeded(result));
// We expect vertex to be sized 0x24, checked at start of file. // We expect vertex to be sized 0x24, checked at start of file.
D3DRMVERTEX* vertexBuffer = new D3DRMVERTEX[vcount]; D3DRMVERTEX* vertexBuffer = new D3DRMVERTEX[vcount];
m_data->groupMesh->GetVertices(m_data->groupIndex, 0, vcount, vertexBuffer); result = ResultVal(pSource->groupMesh->GetVertices(pSource->groupIndex, 0, vcount, vertexBuffer));
assert(Succeeded(result));
LPDIRECT3DRMTEXTURE textureRef; LPDIRECT3DRMTEXTURE textureRef;
m_data->groupMesh->GetGroupTexture(m_data->groupIndex, &textureRef); result = ResultVal(pSource->groupMesh->GetGroupTexture(pSource->groupIndex, &textureRef));
D3DRMMAPPING mapping = m_data->groupMesh->GetGroupMapping(m_data->groupIndex); assert(Succeeded(result));
D3DRMRENDERQUALITY quality = m_data->groupMesh->GetGroupQuality(m_data->groupIndex);
D3DCOLOR color = m_data->groupMesh->GetGroupColor(m_data->groupIndex); D3DRMMAPPING mapping = pSource->groupMesh->GetGroupMapping(pSource->groupIndex);
D3DRMRENDERQUALITY quality = pSource->groupMesh->GetGroupQuality(pSource->groupIndex);
D3DCOLOR color = pSource->groupMesh->GetGroupColor(pSource->groupIndex);
// Push information to new group // Push information to new group
MeshBuilderImpl* target = static_cast<MeshBuilderImpl*>(pMeshBuilder);
D3DRMGROUPINDEX index; D3DRMGROUPINDEX index;
target->ImplementationData()->AddGroup(vcount, fcount, vperface, faceBuffer, &index); result = ResultVal(pMesh->AddGroup(vcount, fcount, 3, faceBuffer, &index));
newMesh->m_data->groupIndex = index; assert(Succeeded(result));
target->ImplementationData()->SetVertices(index, 0, vcount, vertexBuffer);
target->ImplementationData()->SetGroupTexture(index, textureRef); rpTarget->groupIndex = index;
target->ImplementationData()->SetGroupMapping(index, mapping); result = ResultVal(pMesh->SetVertices(index, 0, vcount, vertexBuffer));
target->ImplementationData()->SetGroupQuality(index, quality); assert(Succeeded(result));
Result result = ResultVal(target->ImplementationData()->SetGroupColor(index, color));
result = ResultVal(pMesh->SetGroupTexture(index, textureRef));
assert(Succeeded(result));
result = ResultVal(pMesh->SetGroupMapping(index, mapping));
assert(Succeeded(result));
result = ResultVal(pMesh->SetGroupQuality(index, quality));
assert(Succeeded(result));
result = ResultVal(pMesh->SetGroupColor(index, color));
assert(Succeeded(result));
// Cleanup // Cleanup
delete[] faceBuffer; if (faceBuffer) {
delete[] vertexBuffer; delete[] faceBuffer;
if (result == Error) {
delete newMesh;
newMesh = NULL;
} }
return newMesh; if (vertexBuffer) {
delete[] vertexBuffer;
}
return result;
}
// FUNCTION: BETA10 0x10171360
inline Mesh* MeshImpl::DeepClone(const MeshBuilderImpl& rMesh)
{
assert(m_data);
assert(rMesh.ImplementationData());
MeshImpl* clone = new MeshImpl();
assert(!clone->ImplementationData());
if (!MeshDeepClone(m_data, clone->ImplementationData(), rMesh.ImplementationData())) {
delete clone;
clone = NULL;
}
return clone;
}
// FUNCTION: LEGO1 0x100a4030
// FUNCTION: BETA10 0x101707a0
Mesh* MeshImpl::DeepClone(MeshBuilder* pMesh)
{
assert(m_data);
assert(pMesh);
return DeepClone(*static_cast<MeshBuilderImpl*>(pMesh));
} }
// FUNCTION: LEGO1 0x100a4240 // FUNCTION: LEGO1 0x100a4240

View File

@@ -36,64 +36,158 @@ Result RendererImpl::Create()
return (m_data != NULL) ? Success : Error; return (m_data != NULL) ? Success : Error;
} }
// FUNCTION: BETA10 0x1016cf00
inline Result RendererCreateDevice(
IDirect3DRM2* pD3DRM,
const DeviceDirect3DCreateData& rCreateData,
IDirect3DRMDevice2*& rpDevice
)
{
Result result =
ResultVal(pD3DRM->CreateDeviceFromD3D(rCreateData.m_pDirect3D, rCreateData.m_pDirect3DDevice, &rpDevice));
return result;
}
// FUNCTION: BETA10 0x1016ce60
inline Result RendererImpl::CreateDevice(const DeviceDirect3DCreateData& rCreateData, DeviceImpl& rDevice)
{
assert(m_data);
assert(!rDevice.ImplementationData());
return RendererCreateDevice(m_data, rCreateData, rDevice.ImplementationData());
}
// FUNCTION: LEGO1 0x100a1830 // FUNCTION: LEGO1 0x100a1830
// FUNCTION: BETA10 0x10169d90
Device* RendererImpl::CreateDevice(const DeviceDirect3DCreateData& data) Device* RendererImpl::CreateDevice(const DeviceDirect3DCreateData& data)
{ {
assert(m_data);
DeviceImpl* device = new DeviceImpl(); DeviceImpl* device = new DeviceImpl();
HRESULT result = m_data->CreateDeviceFromD3D(data.m_pDirect3D, data.m_pDirect3DDevice, &device->m_data);
if (!SUCCEEDED(result)) { if (!CreateDevice(data, *device)) {
delete device; delete device;
device = NULL; device = NULL;
} }
return device; return device;
} }
// FUNCTION: BETA10 0x1016cfe0
inline Result RendererCreateDevice(
IDirect3DRM2* pD3DRM,
const DeviceDirectDrawCreateData& rCreateData,
IDirect3DRMDevice2*& rpDevice
)
{
Result result = ResultVal(pD3DRM->CreateDeviceFromSurface(
const_cast<GUID*>(rCreateData.m_driverGUID),
rCreateData.m_pDirectDraw,
rCreateData.m_pBackBuffer,
&rpDevice
));
if (Succeeded(result)) {
if (rCreateData.m_pBackBuffer) {
// LEGO1 0x10101040
// GLOBAL: BETA10 0x102055f4
static int g_setBufferCount = 1;
if (g_setBufferCount) {
Result result2 = ResultVal(rpDevice->SetBufferCount(2));
assert(Succeeded(result));
}
}
}
return result;
}
// FUNCTION: BETA10 0x1016cf40
inline Result RendererImpl::CreateDevice(const DeviceDirectDrawCreateData& rCreateData, DeviceImpl& rDevice)
{
assert(m_data);
assert(!rDevice.ImplementationData());
return RendererCreateDevice(m_data, rCreateData, rDevice.ImplementationData());
}
// FUNCTION: LEGO1 0x100a1900 // FUNCTION: LEGO1 0x100a1900
// FUNCTION: BETA10 0x10169ea0
Device* RendererImpl::CreateDevice(const DeviceDirectDrawCreateData& data) Device* RendererImpl::CreateDevice(const DeviceDirectDrawCreateData& data)
{ {
// at LEGO1 0x10101040, needs no annotation assert(m_data);
static int g_SetBufferCount = 1;
DeviceImpl* device = new DeviceImpl(); DeviceImpl* device = new DeviceImpl();
HRESULT result = m_data->CreateDeviceFromSurface(
const_cast<LPGUID>(data.m_driverGUID), if (!CreateDevice(data, *device)) {
data.m_pDirectDraw,
data.m_pBackBuffer,
&device->m_data
);
if (SUCCEEDED(result) && data.m_pBackBuffer && g_SetBufferCount) {
device->m_data->SetBufferCount(2);
}
if (!SUCCEEDED(result)) {
delete device; delete device;
device = NULL; device = NULL;
} }
return device; return device;
} }
// FUNCTION: BETA10 0x1016d1d0
inline Result RendererCreateView( inline Result RendererCreateView(
IDirect3DRM2* pRenderer, IDirect3DRM2* pRenderer,
IDirect3DRMDevice2* pDevice, const IDirect3DRMDevice2* pDevice,
IDirect3DRMFrame2* pCamera, const IDirect3DRMFrame2* pCamera,
IDirect3DRMViewport*& rpView,
unsigned long x, unsigned long x,
unsigned long y, unsigned long y,
unsigned long width, unsigned long width,
unsigned long height unsigned long height,
IDirect3DRMViewport*& rpView
) )
{ {
Result result = ResultVal(pRenderer->CreateViewport(pDevice, pCamera, x, y, width, height, &rpView)); Result result = ResultVal(pRenderer->CreateViewport(
const_cast<IDirect3DRMDevice2*>(pDevice),
const_cast<IDirect3DRMFrame2*>(pCamera),
x,
y,
width,
height,
&rpView
));
if (Succeeded(result)) { if (Succeeded(result)) {
result = ViewImpl::ViewportCreateAppData(pRenderer, rpView, pCamera); result = ViewImpl::ViewportCreateAppData(pRenderer, rpView, const_cast<IDirect3DRMFrame2*>(pCamera));
if (!Succeeded(result)) { if (!Succeeded(result)) {
rpView->Release(); rpView->Release();
rpView = NULL; rpView = NULL;
} }
} }
return result; return result;
} }
// FUNCTION: BETA10 0x1016d0b0
inline Result RendererImpl::CreateView(
const DeviceImpl& rDevice,
const CameraImpl& rCamera,
unsigned long x,
unsigned long y,
unsigned long width,
unsigned long height,
ViewImpl& rView
)
{
assert(m_data);
assert(rDevice.ImplementationData());
assert(rCamera.ImplementationData());
assert(!rView.ImplementationData());
return RendererCreateView(
m_data,
rDevice.ImplementationData(),
rCamera.ImplementationData(),
x,
y,
width,
height,
rView.ImplementationData()
);
}
// FUNCTION: LEGO1 0x100a1a00 // FUNCTION: LEGO1 0x100a1a00
// FUNCTION: BETA10 0x10169fb0
View* RendererImpl::CreateView( View* RendererImpl::CreateView(
const Device* pDevice, const Device* pDevice,
const Camera* pCamera, const Camera* pCamera,
@@ -103,21 +197,24 @@ View* RendererImpl::CreateView(
unsigned long height unsigned long height
) )
{ {
assert(m_data);
assert(pDevice);
assert(pCamera);
ViewImpl* view = new ViewImpl(); ViewImpl* view = new ViewImpl();
Result result = RendererCreateView( if (!CreateView(
m_data, *static_cast<const DeviceImpl*>(pDevice),
static_cast<const DeviceImpl*>(pDevice)->m_data, *static_cast<const CameraImpl*>(pCamera),
static_cast<const CameraImpl*>(pCamera)->m_data, x,
view->m_data, y,
x, width,
y, height,
width, *view
height )) {
);
if (!result) {
delete view; delete view;
view = NULL; view = NULL;
} }
return view; return view;
} }
@@ -147,14 +244,33 @@ Group* RendererImpl::CreateGroup(const Group* pParent)
return group; return group;
} }
// FUNCTION: BETA10 0x1016d4b0
inline Result RendererCreateCamera(IDirect3DRM2* pD3DRM, IDirect3DRMFrame2*& rpCamera)
{
return ResultVal(pD3DRM->CreateFrame(NULL, &rpCamera));
}
// FUNCTION: BETA10 0x1016d420
inline Result RendererImpl::CreateCamera(CameraImpl& rCamera)
{
assert(m_data);
assert(!rCamera.ImplementationData());
return RendererCreateCamera(m_data, rCamera.ImplementationData());
}
// FUNCTION: LEGO1 0x100a1c30 // FUNCTION: LEGO1 0x100a1c30
// FUNCTION: BETA10 0x1016a980
Camera* RendererImpl::CreateCamera() Camera* RendererImpl::CreateCamera()
{ {
assert(m_data);
CameraImpl* camera = new CameraImpl(); CameraImpl* camera = new CameraImpl();
if (FAILED(m_data->CreateFrame(NULL, &camera->m_data))) {
if (!CreateCamera(*camera)) {
delete camera; delete camera;
camera = NULL; camera = NULL;
} }
return camera; return camera;
} }
@@ -236,50 +352,106 @@ Light* RendererImpl::CreateLight(LightType type, float r, float g, float b)
return pLightImpl; return pLightImpl;
} }
// FUNCTION: BETA10 0x1016d8e0
inline Result RendererCreateMeshBuilder(IDirect3DRM2* pD3DRM, IDirect3DRMMesh*& rpMesh)
{
return ResultVal(pD3DRM->CreateMesh(&rpMesh));
}
// FUNCTION: BETA10 0x1016d850
inline Result RendererImpl::CreateMeshBuilder(MeshBuilderImpl& rMesh)
{
assert(m_data);
assert(!rMesh.ImplementationData());
return RendererCreateMeshBuilder(m_data, rMesh.ImplementationData());
}
// FUNCTION: LEGO1 0x100a1e90 // FUNCTION: LEGO1 0x100a1e90
// FUNCTION: BETA10 0x1016abf0
MeshBuilder* RendererImpl::CreateMeshBuilder() MeshBuilder* RendererImpl::CreateMeshBuilder()
{ {
assert(m_data);
MeshBuilderImpl* meshBuilder = new MeshBuilderImpl(); MeshBuilderImpl* meshBuilder = new MeshBuilderImpl();
if (FAILED(m_data->CreateMesh(&meshBuilder->m_data))) {
if (!CreateMeshBuilder(*static_cast<MeshBuilderImpl*>(meshBuilder))) {
delete meshBuilder; delete meshBuilder;
meshBuilder = NULL; meshBuilder = NULL;
} }
return meshBuilder; return meshBuilder;
} }
// FUNCTION: BETA10 0x1016d9c0
inline Result RendererCreateTexture( inline Result RendererCreateTexture(
IDirect3DRM2* renderer, IDirect3DRM2* pRenderer,
IDirect3DRMTexture*& texture,
int width, int width,
int height, int height,
int bytesPerPixel, int bytesPerPixel,
void* pBuffer, void* pBuffer,
int useBuffer, int useBuffer,
int paletteSize, int paletteSize,
PaletteEntry* pEntries PaletteEntry* pEntries,
IDirect3DRMTexture*& rpTexture
) )
{ {
TglD3DRMIMAGE* image;
Result result; Result result;
image = new TglD3DRMIMAGE(width, height, bytesPerPixel, pBuffer, useBuffer, paletteSize, pEntries); TglD3DRMIMAGE* pImage = new TglD3DRMIMAGE(width, height, bytesPerPixel, pBuffer, useBuffer, paletteSize, pEntries);
assert(pImage);
// TODO: LPDIRECT3DRMTEXTURE2? // TODO: LPDIRECT3DRMTEXTURE2?
result = ResultVal(renderer->CreateTexture(&image->m_image, (LPDIRECT3DRMTEXTURE2*) &texture)); result = ResultVal(pRenderer->CreateTexture(&pImage->m_image, (LPDIRECT3DRMTEXTURE2*) &rpTexture));
assert(Succeeded(result));
assert((rpTexture->AddRef(), rpTexture->Release()) == 1);
if (Succeeded(result)) { if (Succeeded(result)) {
result = TextureImpl::SetImage(texture, image); result = TextureImpl::SetImage(rpTexture, pImage);
assert(Succeeded(result));
if (!Succeeded(result)) { if (!Succeeded(result)) {
texture->Release(); rpTexture->Release();
texture = NULL; rpTexture = NULL;
delete image; delete pImage;
} }
} }
else { else {
delete image; delete pImage;
} }
return result; return result;
} }
// FUNCTION: BETA10 0x1016d910
inline Result RendererImpl::CreateTexture(
TextureImpl& rTexture,
int width,
int height,
int bitsPerTexel,
const void* pTexels,
int texelsArePersistent,
int paletteEntryCount,
const PaletteEntry* pEntries
)
{
assert(m_data);
assert(!rTexture.ImplementationData());
return RendererCreateTexture(
m_data,
width,
height,
bitsPerTexel,
const_cast<void*>(pTexels),
texelsArePersistent,
paletteEntryCount,
const_cast<PaletteEntry*>(pEntries),
rTexture.ImplementationData()
);
}
// FUNCTION: LEGO1 0x100a1f50 // FUNCTION: LEGO1 0x100a1f50
// FUNCTION: BETA10 0x1016ad00
Texture* RendererImpl::CreateTexture( Texture* RendererImpl::CreateTexture(
int width, int width,
int height, int height,
@@ -290,10 +462,11 @@ Texture* RendererImpl::CreateTexture(
const PaletteEntry* pEntries const PaletteEntry* pEntries
) )
{ {
assert(m_data);
TextureImpl* texture = new TextureImpl(); TextureImpl* texture = new TextureImpl();
if (!Succeeded(RendererCreateTexture( if (!CreateTexture(
m_data, *texture,
texture->m_data,
width, width,
height, height,
bitsPerTexel, bitsPerTexel,
@@ -301,21 +474,40 @@ Texture* RendererImpl::CreateTexture(
texelsArePersistent, texelsArePersistent,
paletteEntryCount, paletteEntryCount,
const_cast<PaletteEntry*>(pEntries) const_cast<PaletteEntry*>(pEntries)
))) { )) {
delete texture; delete texture;
texture = NULL; texture = NULL;
} }
return texture; return texture;
} }
// FUNCTION: BETA10 0x1016dcb0
inline Result RendererCreateTexture(IDirect3DRM2* pRenderer, IDirect3DRMTexture*& rpTexture)
{
return RendererCreateTexture(pRenderer, 0, 0, 0, NULL, FALSE, 0, NULL, rpTexture);
}
// FUNCTION: BETA10 0x1016dc20
inline Result RendererImpl::CreateTexture(TextureImpl& rTexture)
{
assert(m_data);
assert(!rTexture.ImplementationData());
return RendererCreateTexture(m_data, rTexture.ImplementationData());
}
// FUNCTION: LEGO1 0x100a20d0 // FUNCTION: LEGO1 0x100a20d0
// FUNCTION: BETA10 0x1016ae20
Texture* RendererImpl::CreateTexture() Texture* RendererImpl::CreateTexture()
{ {
assert(m_data);
TextureImpl* texture = new TextureImpl(); TextureImpl* texture = new TextureImpl();
if (!Succeeded(RendererCreateTexture(m_data, texture->m_data, 0, 0, 0, NULL, FALSE, 0, NULL))) { if (!CreateTexture(*texture)) {
delete texture; delete texture;
texture = NULL; texture = NULL;
} }
return texture; return texture;
} }

View File

@@ -19,9 +19,12 @@ struct ViewportAppData {
DECOMP_SIZE_ASSERT(ViewportAppData, 0x18); DECOMP_SIZE_ASSERT(ViewportAppData, 0x18);
// FUNCTION: LEGO1 0x100a10b0 // FUNCTION: LEGO1 0x100a10b0
// FUNCTION: BETA10 0x10168920
ViewportAppData::ViewportAppData(IDirect3DRM2* pRenderer) ViewportAppData::ViewportAppData(IDirect3DRM2* pRenderer)
{ {
pRenderer->CreateFrame(NULL, &m_pLightFrame); Result result = ResultVal(pRenderer->CreateFrame(NULL, &m_pLightFrame));
assert(Succeeded(result));
m_pCamera = NULL; m_pCamera = NULL;
m_pLastRenderedFrame = NULL; m_pLastRenderedFrame = NULL;
m_backgroundColorRed = 0.0f; m_backgroundColorRed = 0.0f;
@@ -30,36 +33,64 @@ ViewportAppData::ViewportAppData(IDirect3DRM2* pRenderer)
} }
// FUNCTION: LEGO1 0x100a10e0 // FUNCTION: LEGO1 0x100a10e0
// FUNCTION: BETA10 0x101689bd
ViewportAppData::~ViewportAppData() ViewportAppData::~ViewportAppData()
{ {
int refCount;
IDirect3DRMFrameArray* pChildFrames; IDirect3DRMFrameArray* pChildFrames;
IDirect3DRMFrame* pChildFrame = NULL; IDirect3DRMFrame* pChildFrame = NULL;
m_pLightFrame->GetChildren(&pChildFrames); Result result = ResultVal(m_pLightFrame->GetChildren(&pChildFrames));
assert(Succeeded(result));
for (int i = 0; i < (int) pChildFrames->GetSize(); i++) { for (int i = 0; i < (int) pChildFrames->GetSize(); i++) {
pChildFrames->GetElement(i, &pChildFrame); result = ResultVal(pChildFrames->GetElement(i, &pChildFrame));
m_pLightFrame->DeleteChild(pChildFrame); assert(Succeeded(result));
pChildFrame->Release(); // GetElement() does AddRef()
result = ResultVal(m_pLightFrame->DeleteChild(pChildFrame));
assert(Succeeded(result));
refCount = pChildFrame->Release(); // GetElement() does AddRef()
assert(refCount >= 1);
} }
pChildFrames->Release();
m_pLightFrame->Release(); refCount = pChildFrames->Release();
assert(refCount == 0);
refCount = m_pLightFrame->Release();
assert(refCount == 0);
} }
// Forward declare to satisfy order check // Forward declare to satisfy order check
void ViewportDestroyCallback(IDirect3DRMObject* pObject, void* pArg); void ViewportDestroyCallback(IDirect3DRMObject* pObject, void* pArg);
// FUNCTION: LEGO1 0x100a1160 // FUNCTION: LEGO1 0x100a1160
Result ViewImpl::ViewportCreateAppData(IDirect3DRM2* pDevice, IDirect3DRMViewport* pView, IDirect3DRMFrame2* pCamera) // FUNCTION: BETA10 0x10168ba5
Result ViewImpl::ViewportCreateAppData(
IDirect3DRM2* pDevice,
IDirect3DRMViewport* pViewport,
IDirect3DRMFrame2* pCamera
)
{ {
ViewportAppData* data = new ViewportAppData(pDevice); ViewportAppData* pViewportAppData = new ViewportAppData(pDevice);
data->m_pCamera = pCamera; assert(pViewportAppData);
Result result = ResultVal(pView->SetAppData(reinterpret_cast<LPD3DRM_APPDATA>(data)));
pViewportAppData->m_pCamera = pCamera;
assert(!pViewport->GetAppData());
Result result = ResultVal(pViewport->SetAppData(reinterpret_cast<LPD3DRM_APPDATA>(pViewportAppData)));
assert(Succeeded(result));
assert(reinterpret_cast<ViewportAppData*>(pViewport->GetAppData()) == pViewportAppData);
if (Succeeded(result)) { if (Succeeded(result)) {
result = ResultVal(pView->AddDestroyCallback(ViewportDestroyCallback, data)); result = ResultVal(pViewport->AddDestroyCallback(ViewportDestroyCallback, pViewportAppData));
assert(Succeeded(result));
} }
if (!Succeeded(result)) { if (!Succeeded(result)) {
delete data; delete pViewportAppData;
pView->SetAppData(0); pViewport->SetAppData(0);
} }
return result; return result;
} }
@@ -90,16 +121,21 @@ inline Result ViewRestoreFrameAfterRender(
// FIXME: from LEGO1/tgl/d3drm/view.cpp // FIXME: from LEGO1/tgl/d3drm/view.cpp
// FUNCTION: LEGO1 0x100a1240 // FUNCTION: LEGO1 0x100a1240
// FUNCTION: BETA10 0x10168dc9
void ViewportDestroyCallback(IDirect3DRMObject* pObject, void* pArg) void ViewportDestroyCallback(IDirect3DRMObject* pObject, void* pArg)
{ {
ViewportAppData* pViewportAppData = reinterpret_cast<ViewportAppData*>(pArg); ViewportAppData* pViewportAppData = reinterpret_cast<ViewportAppData*>(pArg);
assert(static_cast<ViewImpl::ViewDataType>(pObject));
assert(pViewportAppData);
ViewRestoreFrameAfterRender( Result result = ViewRestoreFrameAfterRender(
pViewportAppData->m_pLastRenderedFrame, pViewportAppData->m_pLastRenderedFrame,
pViewportAppData->m_pCamera, pViewportAppData->m_pCamera,
pViewportAppData->m_pLightFrame pViewportAppData->m_pLightFrame
); );
assert(Succeeded(result));
delete pViewportAppData; delete pViewportAppData;
} }