Finish ViewImpl

This commit is contained in:
disinvite 2025-04-15 12:51:31 -04:00
parent 3fa315be0d
commit c05eefe79c
2 changed files with 129 additions and 30 deletions

View File

@ -229,6 +229,14 @@ class ViewImpl : public View {
Result Remove(const LightImpl& rLight); Result Remove(const LightImpl& rLight);
Result SetCamera(const CameraImpl& rCamera); Result SetCamera(const CameraImpl& rCamera);
Result Render(const GroupImpl& rScene); Result Render(const GroupImpl& rScene);
Result Pick(
unsigned long x,
unsigned long y,
const GroupImpl** ppGroupsToPickFrom,
int groupsToPickFromCount,
const Group**& rppPickedGroups,
int& rPickedGroupCount
);
friend class RendererImpl; friend class RendererImpl;
@ -619,6 +627,7 @@ inline D3DRMRENDERQUALITY Translate(ShadingModel tglShadingModel)
return renderQuality; return renderQuality;
} }
// FUNCTION: BETA10 0x101703b0
inline D3DRMPROJECTIONTYPE Translate(ProjectionType tglProjectionType) inline D3DRMPROJECTIONTYPE Translate(ProjectionType tglProjectionType)
{ {
D3DRMPROJECTIONTYPE projectionType; D3DRMPROJECTIONTYPE projectionType;
@ -649,6 +658,16 @@ inline D3DRMMATRIX4D* Translate(FloatMatrix4& tglMatrix4x4, D3DRMMATRIX4D& rD3DR
return &rD3DRMMatrix4x4; return &rD3DRMMatrix4x4;
} }
// FUNCTION: BETA10 0x1016fba0
inline D3DVECTOR* Translate(const float tglVector[3], D3DVECTOR& rD3DVector)
{
rD3DVector.x = D3DVAL(tglVector[0]);
rD3DVector.y = D3DVAL(tglVector[1]);
rD3DVector.z = D3DVAL(tglVector[2]);
return &rD3DVector;
}
// SYNTHETIC: LEGO1 0x100a16d0 // SYNTHETIC: LEGO1 0x100a16d0
// SYNTHETIC: BETA10 0x10169aa0 // SYNTHETIC: BETA10 0x10169aa0
// TglImpl::RendererImpl::`scalar deleting destructor' // TglImpl::RendererImpl::`scalar deleting destructor'

View File

@ -104,11 +104,12 @@ void ViewportDestroyCallback(IDirect3DRMObject* pObject, void* pArg)
} }
// FUNCTION: LEGO1 0x100a1290 // FUNCTION: LEGO1 0x100a1290
// FUNCTION: BETA10 0x10168eab
Result ViewportPickImpl( Result ViewportPickImpl(
IDirect3DRMViewport* pViewport, IDirect3DRMViewport* pViewport,
int x, int x,
int y, int y,
const Group** ppGroupsToPickFrom, const GroupImpl** ppGroupsToPickFrom,
int groupsToPickFromCount, int groupsToPickFromCount,
const Group**& rppPickedGroups, const Group**& rppPickedGroups,
int& rPickedGroupCount int& rPickedGroupCount
@ -233,28 +234,53 @@ Result ViewImpl::SetCamera(const Camera* pCamera)
return SetCamera(*static_cast<const CameraImpl*>(pCamera)); return SetCamera(*static_cast<const CameraImpl*>(pCamera));
} }
// FUNCTION: LEGO1 0x100a2e70 // FUNCTION: BETA10 0x1016e870
Result ViewImpl::SetProjection(ProjectionType type) inline Result ViewSetProjection(IDirect3DRMViewport* pViewport, ProjectionType type)
{ {
return ResultVal(m_data->SetProjection(Translate(type))); D3DRMPROJECTIONTYPE projectionType = Translate(type);
return ResultVal(pViewport->SetProjection(projectionType));
} }
// FUNCTION: LEGO1 0x100a2eb0 // FUNCTION: LEGO1 0x100a2e70
Result ViewImpl::SetFrustrum(float frontClippingDistance, float backClippingDistance, float degrees) // FUNCTION: BETA10 0x1016e810
Result ViewImpl::SetProjection(ProjectionType type)
{
assert(m_data);
return ViewSetProjection(m_data, type);
}
// FUNCTION: BETA10 0x1016e920
inline Result ViewSetFrustrum(
IDirect3DRMViewport* pViewport,
float frontClippingDistance,
float backClippingDistance,
float degrees
)
{ {
float field = frontClippingDistance * tan(DegreesToRadians(degrees / 2)); float field = frontClippingDistance * tan(DegreesToRadians(degrees / 2));
Result result; Result result;
result = ResultVal(m_data->SetFront(frontClippingDistance)); result = ResultVal(pViewport->SetFront(frontClippingDistance));
if (Succeeded(result)) { if (Succeeded(result)) {
result = ResultVal(m_data->SetBack(backClippingDistance)); result = ResultVal(pViewport->SetBack(backClippingDistance));
} }
if (Succeeded(result)) { if (Succeeded(result)) {
result = ResultVal(m_data->SetField(field)); result = ResultVal(pViewport->SetField(field));
} }
return result; return result;
} }
// FUNCTION: LEGO1 0x100a2eb0
// FUNCTION: BETA10 0x1016e8b0
Result ViewImpl::SetFrustrum(float frontClippingDistance, float backClippingDistance, float degrees)
{
assert(m_data);
return ViewSetFrustrum(m_data, frontClippingDistance, backClippingDistance, degrees);
}
// FUNCTION: BETA10 0x1016ea70 // FUNCTION: BETA10 0x1016ea70
inline Result ViewSetBackgroundColor(IDirect3DRMViewport* pViewport, float r, float g, float b) inline Result ViewSetBackgroundColor(IDirect3DRMViewport* pViewport, float r, float g, float b)
{ {
@ -269,10 +295,9 @@ inline Result ViewSetBackgroundColor(IDirect3DRMViewport* pViewport, float r, fl
if (pViewportAppData->m_pLastRenderedFrame) { if (pViewportAppData->m_pLastRenderedFrame) {
result = ResultVal(pViewportAppData->m_pLastRenderedFrame->SetSceneBackgroundRGB(r, g, b)); result = ResultVal(pViewportAppData->m_pLastRenderedFrame->SetSceneBackgroundRGB(r, g, b));
assert(Succeeded(result));
} }
assert(Succeeded(result));
return result; return result;
} }
@ -411,22 +436,39 @@ Result ViewImpl::Render(const Group* pGroup)
return Render(*static_cast<const GroupImpl*>(pGroup)); return Render(*static_cast<const GroupImpl*>(pGroup));
} }
// FUNCTION: LEGO1 0x100a3080 // FUNCTION: BETA10 0x1016edd0
Result ViewImpl::ForceUpdate(unsigned long x, unsigned long y, unsigned long width, unsigned long height) inline Result ViewForceUpdate(
{ IDirect3DRMViewport* pViewport,
return ResultVal(m_data->ForceUpdate(x, y, x + width - 1, y + height - 1));
}
// FUNCTION: LEGO1 0x100a30c0
Result ViewImpl::Pick(
unsigned long x, unsigned long x,
unsigned long y, unsigned long y,
const Group** ppGroupsToPickFrom, unsigned long width,
unsigned long height
)
{
return ResultVal(pViewport->ForceUpdate(x, y, x + width - 1, y + height - 1));
}
// FUNCTION: LEGO1 0x100a3080
// FUNCTION: BETA10 0x1016ed60
Result ViewImpl::ForceUpdate(unsigned long x, unsigned long y, unsigned long width, unsigned long height)
{
assert(m_data);
return ViewForceUpdate(m_data, x, y, width, height);
}
// FUNCTION: BETA10 0x101710f0
inline Result ViewImpl::Pick(
unsigned long x,
unsigned long y,
const GroupImpl** ppGroupsToPickFrom,
int groupsToPickFromCount, int groupsToPickFromCount,
const Group**& rppPickedGroups, const Group**& rppPickedGroups,
int& rPickedGroupCount int& rPickedGroupCount
) )
{ {
assert(m_data);
return ViewportPickImpl( return ViewportPickImpl(
m_data, m_data,
x, x,
@ -438,17 +480,38 @@ Result ViewImpl::Pick(
); );
} }
// FUNCTION: LEGO1 0x100a30f0 // FUNCTION: LEGO1 0x100a30c0
Result ViewImpl::TransformWorldToScreen(const float world[3], float screen[4]) // FUNCTION: BETA10 0x1016ee10
Result ViewImpl::Pick(
unsigned long x,
unsigned long y,
const Group** ppGroupsToPickFrom,
int groupsToPickFromCount,
const Group**& rppPickedGroups,
int& rPickedGroupCount
)
{
assert(m_data);
return Pick(
x,
y,
reinterpret_cast<const GroupImpl**>(ppGroupsToPickFrom),
groupsToPickFromCount,
rppPickedGroups,
rPickedGroupCount
);
}
// FUNCTION: BETA10 0x1016eff0
inline Result ViewTransformWorldToScreen(IDirect3DRMViewport* pViewport, const float world[3], float screen[4])
{ {
D3DRMVECTOR4D d3dRMScreen; D3DRMVECTOR4D d3dRMScreen;
D3DVECTOR d3dRMWorld; D3DVECTOR d3dRMWorld;
d3dRMWorld.x = world[0]; D3DVECTOR* pD3DRMWorld = Translate(world, d3dRMWorld);
d3dRMWorld.y = world[1];
d3dRMWorld.z = world[2];
Result result; Result result;
result = ResultVal(m_data->Transform(&d3dRMScreen, &d3dRMWorld)); result = ResultVal(pViewport->Transform(&d3dRMScreen, pD3DRMWorld));
if (Succeeded(result)) { if (Succeeded(result)) {
screen[0] = d3dRMScreen.x; screen[0] = d3dRMScreen.x;
@ -460,10 +523,18 @@ Result ViewImpl::TransformWorldToScreen(const float world[3], float screen[4])
return result; return result;
} }
// FUNCTION: LEGO1 0x100a3160 // FUNCTION: LEGO1 0x100a30f0
Result ViewImpl::TransformScreenToWorld(const float screen[4], float world[3]) // FUNCTION: BETA10 0x1016ef90
Result ViewImpl::TransformWorldToScreen(const float world[3], float screen[4])
{
assert(m_data);
return ViewTransformWorldToScreen(m_data, world, screen);
}
// FUNCTION: BETA10 0x1016f0d0
inline Result ViewTransformScreenToWorld(IDirect3DRMViewport* pViewport, const float screen[4], float world[3])
{ {
// 100% match minus instruction reordering.
D3DVECTOR d3dRMWorld; D3DVECTOR d3dRMWorld;
D3DRMVECTOR4D d3dScreen; D3DRMVECTOR4D d3dScreen;
d3dScreen.x = screen[0]; d3dScreen.x = screen[0];
@ -472,7 +543,7 @@ Result ViewImpl::TransformScreenToWorld(const float screen[4], float world[3])
d3dScreen.w = screen[3]; d3dScreen.w = screen[3];
Result result; Result result;
result = ResultVal(m_data->InverseTransform(&d3dRMWorld, &d3dScreen)); result = ResultVal(pViewport->InverseTransform(&d3dRMWorld, &d3dScreen));
if (Succeeded(result)) { if (Succeeded(result)) {
world[0] = d3dRMWorld.x; world[0] = d3dRMWorld.x;
@ -482,3 +553,12 @@ Result ViewImpl::TransformScreenToWorld(const float screen[4], float world[3])
return result; return result;
} }
// FUNCTION: LEGO1 0x100a3160
// FUNCTION: BETA10 0x1016f070
Result ViewImpl::TransformScreenToWorld(const float screen[4], float world[3])
{
assert(m_data);
return ViewTransformScreenToWorld(m_data, screen, world);
}