Match a few more Tgl functions (#1435)

* RendererImpl::CreateLight

* Swap addrs for LightImpl and MeshBuilderImpl

* SetShadingModel functions
This commit is contained in:
MS 2025-04-17 17:19:54 -04:00 committed by GitHub
parent 544372759e
commit 451fd63eee
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 171 additions and 96 deletions

View File

@ -1,5 +1,6 @@
#include "impl.h" #include "impl.h"
#include <assert.h>
#include <d3drmwin.h> #include <d3drmwin.h>
using namespace TglImpl; using namespace TglImpl;
@ -29,13 +30,20 @@ Result DeviceImpl::SetColorModel(ColorModel)
return Success; return Success;
} }
// FUNCTION: BETA10 0x1016e020
inline Result DeviceSetShadingModel(IDirect3DRMDevice2* pDevice, ShadingModel model)
{
D3DRMRENDERQUALITY renderQuality = Translate(model);
return ResultVal(pDevice->SetQuality(renderQuality));
}
// FUNCTION: LEGO1 0x100a2c30 // FUNCTION: LEGO1 0x100a2c30
// FUNCTION: BETA10 0x1016dfc0
Result DeviceImpl::SetShadingModel(ShadingModel model) Result DeviceImpl::SetShadingModel(ShadingModel model)
{ {
// Doesn't match well even though we know this is exactly assert(m_data);
// the original code thanks to the jump table.
D3DRMRENDERQUALITY renderQuality = Translate(model); return DeviceSetShadingModel(m_data, model);
return ResultVal(m_data->SetQuality(renderQuality));
} }
// FUNCTION: LEGO1 0x100a2ca0 // FUNCTION: LEGO1 0x100a2ca0

View File

@ -100,6 +100,7 @@ public:
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);
private: private:
IDirect3DRM2* m_data; IDirect3DRM2* m_data;
@ -300,13 +301,13 @@ void CameraImpl::Destroy()
} }
// VTABLE: LEGO1 0x100dbaf8 // VTABLE: LEGO1 0x100dbaf8
// VTABLE: BETA10 0x101c31e0 // VTABLE: BETA10 0x101c3270
class LightImpl : public Light { class LightImpl : public Light {
public: public:
// FUNCTION: BETA10 0x1016b260 // FUNCTION: BETA10 0x1016b460
LightImpl() : m_data(0) {} LightImpl() : m_data(0) {}
// FUNCTION: BETA10 0x1016c7e0 // FUNCTION: BETA10 0x1016f5c0
~LightImpl() override { Destroy(); } ~LightImpl() override { Destroy(); }
void* ImplementationDataPtr() override; void* ImplementationDataPtr() override;
@ -315,23 +316,26 @@ public:
Result SetTransformation(FloatMatrix4&) override; Result SetTransformation(FloatMatrix4&) override;
Result SetColor(float r, float g, float b) override; Result SetColor(float r, float g, float b) override;
IDirect3DRMFrame2* ImplementationData() const { return m_data; } typedef IDirect3DRMFrame2* LightDataType;
const LightDataType& ImplementationData() const { return m_data; }
LightDataType& ImplementationData() { return m_data; }
inline void Destroy(); inline void Destroy();
friend class RendererImpl; friend class RendererImpl;
private: private:
IDirect3DRMFrame2* m_data; LightDataType m_data;
}; };
// FUNCTION: BETA10 0x10170390 // FUNCTION: BETA10 0x10171220
inline void LightDestroy(IDirect3DRMFrame2* pLight) inline void LightDestroy(IDirect3DRMFrame2* pLight)
{ {
pLight->Release(); pLight->Release();
} }
// FUNCTION: BETA10 0x10170350 // FUNCTION: BETA10 0x101711e0
void LightImpl::Destroy() void LightImpl::Destroy()
{ {
if (m_data) { if (m_data) {
@ -455,13 +459,13 @@ void GroupImpl::Destroy()
} }
// VTABLE: LEGO1 0x100dbb18 // VTABLE: LEGO1 0x100dbb18
// VTABLE: BETA10 0x101c3270 // VTABLE: BETA10 0x101c31e0
class MeshBuilderImpl : public MeshBuilder { class MeshBuilderImpl : public MeshBuilder {
public: public:
// FUNCTION: BETA10 0x1016b460 // FUNCTION: BETA10 0x1016b260
MeshBuilderImpl() : m_data(0) {} MeshBuilderImpl() : m_data(0) {}
// FUNCTION: BETA10 0x1016f5c0 // FUNCTION: BETA10 0x1016c7e0
~MeshBuilderImpl() override { Destroy(); } ~MeshBuilderImpl() override { Destroy(); }
void* ImplementationDataPtr() override; void* ImplementationDataPtr() override;
@ -504,13 +508,13 @@ private:
IDirect3DRMMesh* m_data; IDirect3DRMMesh* m_data;
}; };
// FUNCTION: BETA10 0x10171220 // FUNCTION: BETA10 0x10170390
inline void MeshBuilderDestroy(IDirect3DRMMesh* pMeshBuilder) inline void MeshBuilderDestroy(IDirect3DRMMesh* pMeshBuilder)
{ {
pMeshBuilder->Release(); pMeshBuilder->Release();
} }
// FUNCTION: BETA10 0x101711e0 // FUNCTION: BETA10 0x10170350
void MeshBuilderImpl::Destroy() void MeshBuilderImpl::Destroy()
{ {
if (m_data) { if (m_data) {
@ -599,6 +603,7 @@ void TextureImpl::Destroy()
} }
// Translation helpers // Translation helpers
// FUNCTION: BETA10 0x1016fc40
inline D3DRMRENDERQUALITY Translate(ShadingModel tglShadingModel) inline D3DRMRENDERQUALITY Translate(ShadingModel tglShadingModel)
{ {
D3DRMRENDERQUALITY renderQuality; D3DRMRENDERQUALITY renderQuality;
@ -668,6 +673,36 @@ inline D3DVECTOR* Translate(const float tglVector[3], D3DVECTOR& rD3DVector)
return &rD3DVector; return &rD3DVector;
} }
// FUNCTION: BETA10 0x1016fd80
inline D3DRMLIGHTTYPE Translate(LightType tglLightType)
{
D3DRMLIGHTTYPE lightType;
// ??? use lookup table
switch (tglLightType) {
case Ambient:
lightType = D3DRMLIGHT_AMBIENT;
break;
case Point:
lightType = D3DRMLIGHT_POINT;
break;
case Spot:
lightType = D3DRMLIGHT_SPOT;
break;
case Directional:
lightType = D3DRMLIGHT_DIRECTIONAL;
break;
case ParallelPoint:
lightType = D3DRMLIGHT_PARALLELPOINT;
break;
default:
lightType = D3DRMLIGHT_AMBIENT;
break;
}
return lightType;
}
// SYNTHETIC: LEGO1 0x100a16d0 // SYNTHETIC: LEGO1 0x100a16d0
// SYNTHETIC: BETA10 0x10169aa0 // SYNTHETIC: BETA10 0x10169aa0
// TglImpl::RendererImpl::`scalar deleting destructor' // TglImpl::RendererImpl::`scalar deleting destructor'
@ -689,11 +724,11 @@ inline D3DVECTOR* Translate(const float tglVector[3], D3DVECTOR& rD3DVector)
// TglImpl::CameraImpl::`scalar deleting destructor' // TglImpl::CameraImpl::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x100a2640 // SYNTHETIC: LEGO1 0x100a2640
// SYNTHETIC: BETA10 0x1016b5f0 // SYNTHETIC: BETA10 0x1016ba30
// TglImpl::LightImpl::`scalar deleting destructor' // TglImpl::LightImpl::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x100a2720 // SYNTHETIC: LEGO1 0x100a2720
// SYNTHETIC: BETA10 0x1016ba30 // SYNTHETIC: BETA10 0x1016b5f0
// TglImpl::MeshBuilderImpl::`scalar deleting destructor' // TglImpl::MeshBuilderImpl::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x100a2800 // SYNTHETIC: LEGO1 0x100a2800

View File

@ -6,7 +6,7 @@ DECOMP_SIZE_ASSERT(Light, 0x04);
DECOMP_SIZE_ASSERT(LightImpl, 0x08); DECOMP_SIZE_ASSERT(LightImpl, 0x08);
// FUNCTION: LEGO1 0x100a3770 // FUNCTION: LEGO1 0x100a3770
// FUNCTION: BETA10 0x1016c9f0 // FUNCTION: BETA10 0x1016f630
void* LightImpl::ImplementationDataPtr() void* LightImpl::ImplementationDataPtr()
{ {
return reinterpret_cast<void*>(&m_data); return reinterpret_cast<void*>(&m_data);

View File

@ -1,5 +1,7 @@
#include "impl.h" #include "impl.h"
#include <assert.h>
using namespace TglImpl; using namespace TglImpl;
DECOMP_SIZE_ASSERT(D3DRMVERTEX, 0x24); DECOMP_SIZE_ASSERT(D3DRMVERTEX, 0x24);
@ -49,28 +51,19 @@ Result MeshImpl::SetTextureMappingMode(TextureMappingMode mode)
} }
} }
// FUNCTION: BETA10 0x10170750
inline Result MeshSetShadingModel(MeshImpl::MeshData* pMesh, ShadingModel model)
{
D3DRMRENDERQUALITY mode = Translate(model);
return ResultVal(pMesh->groupMesh->SetGroupQuality(pMesh->groupIndex, mode));
}
// FUNCTION: LEGO1 0x100a3fc0 // FUNCTION: LEGO1 0x100a3fc0
// FUNCTION: BETA10 0x101706f0
Result MeshImpl::SetShadingModel(ShadingModel model) Result MeshImpl::SetShadingModel(ShadingModel model)
{ {
D3DRMRENDERQUALITY mode; assert(m_data);
switch (model) { return MeshSetShadingModel(m_data, model);
case Wireframe:
mode = D3DRMRENDER_WIREFRAME;
break;
case UnlitFlat:
mode = D3DRMRENDER_UNLITFLAT;
break;
case Flat:
mode = D3DRMRENDER_FLAT;
break;
case Gouraud:
mode = D3DRMRENDER_GOURAUD;
break;
case Phong:
mode = D3DRMRENDER_PHONG;
break;
}
return ResultVal(m_data->groupMesh->SetGroupQuality(m_data->groupIndex, mode));
} }
// FUNCTION: LEGO1 0x100a4030 // FUNCTION: LEGO1 0x100a4030

View File

@ -1,12 +1,14 @@
#include "impl.h" #include "impl.h"
#include <assert.h>
using namespace TglImpl; using namespace TglImpl;
DECOMP_SIZE_ASSERT(MeshBuilder, 0x04); DECOMP_SIZE_ASSERT(MeshBuilder, 0x04);
DECOMP_SIZE_ASSERT(MeshBuilderImpl, 0x08); DECOMP_SIZE_ASSERT(MeshBuilderImpl, 0x08);
// FUNCTION: LEGO1 0x100a3830 // FUNCTION: LEGO1 0x100a3830
// FUNCTION: BETA10 0x1016f630 // FUNCTION: BETA10 0x1016c9f0
void* MeshBuilderImpl::ImplementationDataPtr() void* MeshBuilderImpl::ImplementationDataPtr()
{ {
return reinterpret_cast<void*>(&m_data); return reinterpret_cast<void*>(&m_data);
@ -159,12 +161,12 @@ inline Result MeshBuilderImpl::CreateMeshImpl(
); );
} }
// FUNCTION: LEGO1 0x100a3ae0 // FUNCTION: BETA10 0x1016e060
Result MeshBuilderImpl::GetBoundingBox(float min[3], float max[3]) const inline Result MeshBuilderGetBoundingBox(IDirect3DRMMesh* pMesh, float min[3], float max[3])
{ {
D3DRMBOX box; D3DRMBOX box;
Result result = ResultVal(m_data->GetBox(&box)); Result result = ResultVal(pMesh->GetBox(&box));
if (result == Success) { if (Succeeded(result)) {
min[0] = box.min.x; min[0] = box.min.x;
min[1] = box.min.y; min[1] = box.min.y;
min[2] = box.min.z; min[2] = box.min.z;
@ -175,6 +177,15 @@ Result MeshBuilderImpl::GetBoundingBox(float min[3], float max[3]) const
return result; return result;
} }
// FUNCTION: LEGO1 0x100a3ae0
// FUNCTION: BETA10 0x1016ce00
Result MeshBuilderImpl::GetBoundingBox(float min[3], float max[3]) const
{
assert(m_data);
return MeshBuilderGetBoundingBox(m_data, min, max);
}
// FUNCTION: LEGO1 0x100a3b40 // FUNCTION: LEGO1 0x100a3b40
MeshBuilder* MeshBuilderImpl::Clone() MeshBuilder* MeshBuilderImpl::Clone()
{ {

View File

@ -1,5 +1,7 @@
#include "impl.h" #include "impl.h"
#include <assert.h>
using namespace TglImpl; using namespace TglImpl;
// FUNCTION: LEGO1 0x100a15e0 // FUNCTION: LEGO1 0x100a15e0
@ -156,56 +158,82 @@ Camera* RendererImpl::CreateCamera()
return camera; return camera;
} }
// FUNCTION: BETA10 0x1016d580
inline Result RendererCreateLight(
IDirect3DRM2* pD3DRM,
LightType type,
float r,
float g,
float b,
IDirect3DRMFrame2*& rpLight
)
{
D3DRMLIGHTTYPE lightType = Translate(type);
IDirect3DRMFrame2* pLightFrame;
IDirect3DRMLight* pLight;
Result result;
result = ResultVal(pD3DRM->CreateFrame(NULL, &pLightFrame));
assert(Succeeded(result));
if (!Succeeded(result)) {
return result;
}
// pLightFrame ref count is now 1
assert((pLightFrame->AddRef(), pLightFrame->Release()) == 1);
result = ResultVal(pD3DRM->CreateLightRGB(lightType, D3DVAL(r), D3DVAL(g), D3DVAL(b), &pLight));
assert(Succeeded(result));
if (!Succeeded(result)) {
pLightFrame->Release();
return result;
}
// pLight ref count is now 1
assert((pLight->AddRef(), pLight->Release()) == 1);
result = ResultVal(pLightFrame->AddLight(pLight));
assert(Succeeded(result));
if (!Succeeded(result)) {
pLightFrame->Release();
pLight->Release();
return result;
}
// pLightFrame ref count is still 1
assert((pLightFrame->AddRef(), pLightFrame->Release()) == 1);
// pLight ref count is now 2
assert((pLight->AddRef(), pLight->Release()) == 2);
// Release() pLight so it gets deleted when pLightFrame is Release()
pLight->Release();
rpLight = pLightFrame;
return result;
}
// FUNCTION: BETA10 0x1016d4e0
inline Result RendererImpl::CreateLight(LightType type, float r, float g, float b, LightImpl& rLight)
{
assert(m_data);
assert(!rLight.ImplementationData());
return RendererCreateLight(m_data, type, r, g, b, rLight.ImplementationData());
}
// FUNCTION: LEGO1 0x100a1cf0 // FUNCTION: LEGO1 0x100a1cf0
// FUNCTION: BETA10 0x1016aa90
Light* RendererImpl::CreateLight(LightType type, float r, float g, float b) Light* RendererImpl::CreateLight(LightType type, float r, float g, float b)
{ {
LightImpl* newLight = new LightImpl(); assert(m_data);
D3DRMLIGHTTYPE translatedType;
switch (type) { LightImpl* pLightImpl = new LightImpl;
case Ambient:
translatedType = D3DRMLIGHT_AMBIENT; if (!CreateLight(type, r, g, b, *pLightImpl)) {
break; delete pLightImpl;
case Point: pLightImpl = 0;
translatedType = D3DRMLIGHT_POINT;
break;
case Spot:
translatedType = D3DRMLIGHT_SPOT;
break;
case Directional:
translatedType = D3DRMLIGHT_DIRECTIONAL;
break;
case ParallelPoint:
translatedType = D3DRMLIGHT_PARALLELPOINT;
break;
default:
translatedType = D3DRMLIGHT_AMBIENT;
} }
LPDIRECT3DRMFRAME2 frame; return pLightImpl;
Result result = ResultVal(m_data->CreateFrame(NULL, &frame));
if (Succeeded(result)) {
LPDIRECT3DRMLIGHT d3dLight;
result = ResultVal(m_data->CreateLightRGB(translatedType, r, g, b, &d3dLight));
if (!Succeeded(result)) {
frame->Release();
}
else {
result = ResultVal(frame->AddLight(d3dLight));
if (!Succeeded(result)) {
d3dLight->Release();
frame->Release();
}
else {
d3dLight->Release();
newLight->m_data = frame;
}
}
}
if (!Succeeded(result)) {
delete newLight;
newLight = NULL;
}
return newLight;
} }
// FUNCTION: LEGO1 0x100a1e90 // FUNCTION: LEGO1 0x100a1e90

View File

@ -285,21 +285,21 @@ public:
}; };
// VTABLE: LEGO1 0x100dbb08 // VTABLE: LEGO1 0x100dbb08
// VTABLE: BETA10 0x101c32a0 // VTABLE: BETA10 0x101c3330
class Light : public Object { class Light : public Object {
public: public:
virtual Result SetTransformation(FloatMatrix4&) = 0; virtual Result SetTransformation(FloatMatrix4&) = 0;
virtual Result SetColor(float r, float g, float b) = 0; virtual Result SetColor(float r, float g, float b) = 0;
// SYNTHETIC: BETA10 0x1016b630 // SYNTHETIC: BETA10 0x1016ba70
// Tgl::Light::Light // Tgl::Light::Light
// SYNTHETIC: LEGO1 0x100a26d0 // SYNTHETIC: LEGO1 0x100a26d0
// SYNTHETIC: BETA10 0x1016b6a0 // SYNTHETIC: BETA10 0x1016bae0
// Tgl::Light::~Light // Tgl::Light::~Light
// SYNTHETIC: LEGO1 0x100a2aa0 // SYNTHETIC: LEGO1 0x100a2aa0
// SYNTHETIC: BETA10 0x1016bb80 // SYNTHETIC: BETA10 0x1016bc80
// Tgl::Light::`scalar deleting destructor' // Tgl::Light::`scalar deleting destructor'
}; };
@ -367,7 +367,7 @@ public:
// was not in the leaked Tgl code. My suspicion is that it's // was not in the leaked Tgl code. My suspicion is that it's
// some kind of builder class for creating meshes. // some kind of builder class for creating meshes.
// VTABLE: LEGO1 0x100dbb30 // VTABLE: LEGO1 0x100dbb30
// VTABLE: BETA10 0x101c3330 // VTABLE: BETA10 0x101c32a0
class MeshBuilder : public Object { class MeshBuilder : public Object {
public: public:
virtual Mesh* CreateMesh( virtual Mesh* CreateMesh(
@ -383,15 +383,15 @@ public:
virtual Result GetBoundingBox(float min[3], float max[3]) const = 0; virtual Result GetBoundingBox(float min[3], float max[3]) const = 0;
virtual MeshBuilder* Clone() = 0; virtual MeshBuilder* Clone() = 0;
// SYNTHETIC: BETA10 0x1016ba70 // SYNTHETIC: BETA10 0x1016b630
// Tgl::MeshBuilder::MeshBuilder // Tgl::MeshBuilder::MeshBuilder
// SYNTHETIC: LEGO1 0x100a27b0 // SYNTHETIC: LEGO1 0x100a27b0
// SYNTHETIC: BETA10 0x1016bae0 // SYNTHETIC: BETA10 0x1016b6a0
// Tgl::MeshBuilder::~MeshBuilder // Tgl::MeshBuilder::~MeshBuilder
// SYNTHETIC: LEGO1 0x100a2b10 // SYNTHETIC: LEGO1 0x100a2b10
// SYNTHETIC: BETA10 0x1016bc80 // SYNTHETIC: BETA10 0x1016bb80
// Tgl::MeshBuilder::`scalar deleting destructor' // Tgl::MeshBuilder::`scalar deleting destructor'
}; };