Fixed Function : Extract method D3D8TransformState::RecalculateDependentMatrices, called via two getters using a dirty boolean, preventing needless recalculations.
This commit is contained in:
parent
8b8d1e0d39
commit
8200cd8e43
|
@ -6342,10 +6342,10 @@ void UpdateFixedFunctionVertexShaderState()
|
|||
D3DXMatrixTranspose((D3DXMATRIX*)&ffShaderState.Transforms.Projection, (D3DXMATRIX*)&d3d8TransformState.Transforms[X_D3DTS_PROJECTION]);
|
||||
D3DXMatrixTranspose((D3DXMATRIX*)&ffShaderState.Transforms.View, (D3DXMATRIX*)&d3d8TransformState.Transforms[X_D3DTS_VIEW]);
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
for (unsigned i = 0; i < 4; i++) {
|
||||
D3DXMatrixTranspose((D3DXMATRIX*)&ffShaderState.Transforms.Texture[i], (D3DXMATRIX*)&d3d8TransformState.Transforms[X_D3DTS_TEXTURE0 + i]);
|
||||
D3DXMatrixTranspose((D3DXMATRIX*)&ffShaderState.Transforms.WorldView[i], (D3DXMATRIX*)&d3d8TransformState.WorldView[i]);
|
||||
D3DXMatrixTranspose((D3DXMATRIX*)&ffShaderState.Transforms.WorldViewInverseTranspose[i], (D3DXMATRIX*)&d3d8TransformState.WorldViewInverseTranspose[i]);
|
||||
D3DXMatrixTranspose((D3DXMATRIX*)&ffShaderState.Transforms.WorldView[i], (D3DXMATRIX*)d3d8TransformState.GetWorldView(i));
|
||||
D3DXMatrixTranspose((D3DXMATRIX*)&ffShaderState.Transforms.WorldViewInverseTranspose[i], (D3DXMATRIX*)d3d8TransformState.GetWorldViewInverseTranspose(i));
|
||||
}
|
||||
|
||||
// Lighting
|
||||
|
|
|
@ -94,6 +94,7 @@ D3D8TransformState::D3D8TransformState() {
|
|||
this->Transforms.fill(identity);
|
||||
this->WorldView.fill(identity);
|
||||
this->WorldViewInverseTranspose.fill(identity);
|
||||
bWorldViewDirty = true;
|
||||
}
|
||||
|
||||
void D3D8TransformState::SetTransform(xbox::X_D3DTRANSFORMSTATETYPE state, const D3DMATRIX* pMatrix)
|
||||
|
@ -110,19 +111,46 @@ void D3D8TransformState::SetTransform(xbox::X_D3DTRANSFORMSTATETYPE state, const
|
|||
// Update transform state
|
||||
this->Transforms[state] = *pMatrix;
|
||||
|
||||
// Recalculate dependent matrices
|
||||
for (int i = 0; i < 4; i++) {
|
||||
auto worldState = X_D3DTS_WORLD + i;
|
||||
if (state == X_D3DTS_VIEW || state == worldState) {
|
||||
D3DXMATRIX worldView;
|
||||
D3DXMatrixMultiply(&worldView, (D3DXMATRIX*)&Transforms[worldState], (D3DXMATRIX*)&Transforms[X_D3DTS_VIEW]);
|
||||
this->WorldView[i] = worldView;
|
||||
|
||||
D3DXMATRIX worldViewInverseTranspose;
|
||||
D3DXMatrixInverse(&worldViewInverseTranspose, nullptr, &worldView);
|
||||
D3DXMatrixTranspose(&worldViewInverseTranspose, &worldViewInverseTranspose);
|
||||
|
||||
this->WorldViewInverseTranspose[i] = worldViewInverseTranspose;
|
||||
}
|
||||
if ((state == X_D3DTS_VIEW) || ((X_D3DTS_WORLD <= state) && (state <= X_D3DTS_WORLD3))) {
|
||||
bWorldViewDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
void D3D8TransformState::RecalculateDependentMatrices()
|
||||
{
|
||||
for (unsigned i = 0; i < 4; i++) {
|
||||
auto worldState = xbox::X_D3DTS_WORLD + i;
|
||||
D3DXMATRIX worldView;
|
||||
D3DXMatrixMultiply(&worldView, (D3DXMATRIX*)&Transforms[worldState], (D3DXMATRIX*)&Transforms[xbox::X_D3DTS_VIEW]);
|
||||
this->WorldView[i] = worldView;
|
||||
|
||||
D3DXMATRIX worldViewInverseTranspose;
|
||||
D3DXMatrixInverse(&worldViewInverseTranspose, nullptr, &worldView);
|
||||
D3DXMatrixTranspose(&worldViewInverseTranspose, &worldViewInverseTranspose);
|
||||
this->WorldViewInverseTranspose[i] = worldViewInverseTranspose;
|
||||
}
|
||||
}
|
||||
|
||||
D3DMATRIX* D3D8TransformState::GetWorldView(unsigned i)
|
||||
{
|
||||
assert(i < 4);
|
||||
|
||||
if (bWorldViewDirty) {
|
||||
RecalculateDependentMatrices();
|
||||
bWorldViewDirty = false;
|
||||
}
|
||||
|
||||
return &WorldView[i];
|
||||
}
|
||||
|
||||
D3DMATRIX* D3D8TransformState::GetWorldViewInverseTranspose(unsigned i)
|
||||
{
|
||||
assert(i < 4);
|
||||
|
||||
if (bWorldViewDirty) {
|
||||
RecalculateDependentMatrices();
|
||||
bWorldViewDirty = false;
|
||||
}
|
||||
|
||||
return &WorldViewInverseTranspose[i];
|
||||
}
|
||||
|
|
|
@ -27,10 +27,16 @@ class D3D8TransformState {
|
|||
public:
|
||||
D3D8TransformState();
|
||||
void SetTransform(xbox::X_D3DTRANSFORMSTATETYPE state, const D3DMATRIX* pMatrix);
|
||||
D3DMATRIX* GetWorldView(unsigned i);
|
||||
D3DMATRIX* GetWorldViewInverseTranspose(unsigned i);
|
||||
|
||||
// The transforms set by the Xbox title
|
||||
std::array<D3DMATRIX, xbox::X_D3DTS_MAX> Transforms;
|
||||
|
||||
private:
|
||||
void RecalculateDependentMatrices();
|
||||
|
||||
bool bWorldViewDirty;
|
||||
// Combines world/view matrices
|
||||
std::array<D3DMATRIX, 4> WorldView;
|
||||
// World/view inverse transpose for lighting calculations
|
||||
|
|
Loading…
Reference in New Issue