Normalize the values returned by the texture state converter
This commit is contained in:
parent
657a8ef7c3
commit
814b040ff1
|
@ -124,7 +124,6 @@ void XboxTextureStateConverter::BuildTextureStateMappingTable()
|
|||
|
||||
DWORD XboxTextureStateConverter::GetHostTextureOpValue(DWORD Value)
|
||||
{
|
||||
bool bOldOrder = g_LibVersion_D3D8 <= 3948; // Verified old order in 3944, new order in 4039
|
||||
switch (Value) {
|
||||
case xbox::X_D3DTOP_DISABLE: return D3DTOP_DISABLE;
|
||||
case xbox::X_D3DTOP_SELECTARG1: return D3DTOP_SELECTARG1;
|
||||
|
@ -138,10 +137,10 @@ DWORD XboxTextureStateConverter::GetHostTextureOpValue(DWORD Value)
|
|||
case xbox::X_D3DTOP_SUBTRACT: return D3DTOP_SUBTRACT;
|
||||
case xbox::X_D3DTOP_ADDSMOOTH: return D3DTOP_ADDSMOOTH;
|
||||
case xbox::X_D3DTOP_BLENDDIFFUSEALPHA: return D3DTOP_BLENDDIFFUSEALPHA;
|
||||
case 0x0D/*xbox::X_D3DTOP_BLENDCURRENTALPHA */: return bOldOrder ? D3DTOP_BLENDTEXTUREALPHA : D3DTOP_BLENDCURRENTALPHA;
|
||||
case 0x0E/*xbox::X_D3DTOP_BLENDTEXTUREALPHA */: return bOldOrder ? D3DTOP_BLENDFACTORALPHA : D3DTOP_BLENDTEXTUREALPHA;
|
||||
case 0x0F/*xbox::X_D3DTOP_BLENDFACTORALPHA */: return bOldOrder ? D3DTOP_BLENDTEXTUREALPHAPM : D3DTOP_BLENDFACTORALPHA;
|
||||
case 0x10/*xbox::X_D3DTOP_BLENDTEXTUREALPHAPM*/: return bOldOrder ? D3DTOP_BLENDCURRENTALPHA : D3DTOP_BLENDTEXTUREALPHAPM;
|
||||
case xbox::X_D3DTOP_BLENDCURRENTALPHA: return D3DTOP_BLENDCURRENTALPHA;
|
||||
case xbox::X_D3DTOP_BLENDTEXTUREALPHA: return D3DTOP_BLENDTEXTUREALPHA;
|
||||
case xbox::X_D3DTOP_BLENDFACTORALPHA: return D3DTOP_BLENDFACTORALPHA;
|
||||
case xbox::X_D3DTOP_BLENDTEXTUREALPHAPM: return D3DTOP_BLENDTEXTUREALPHAPM;
|
||||
case xbox::X_D3DTOP_PREMODULATE: return D3DTOP_PREMODULATE;
|
||||
case xbox::X_D3DTOP_MODULATEALPHA_ADDCOLOR: return D3DTOP_MODULATEALPHA_ADDCOLOR;
|
||||
case xbox::X_D3DTOP_MODULATECOLOR_ADDALPHA: return D3DTOP_MODULATECOLOR_ADDALPHA;
|
||||
|
@ -180,7 +179,7 @@ void XboxTextureStateConverter::Apply()
|
|||
|
||||
for (int State = xbox::X_D3DTSS_FIRST; State <= xbox::X_D3DTSS_LAST; State++) {
|
||||
// Read the value of the current stage/state from the Xbox data structure
|
||||
DWORD XboxValue = Get(XboxStage, State); // OR D3D__TextureState[(XboxStage * xbox::X_D3DTS_STAGESIZE) + XboxTextureStateOffsets[State]];
|
||||
DWORD XboxValue = Get(XboxStage, State);
|
||||
DWORD PcValue = XboxValue;
|
||||
|
||||
// If the state hasn't changed, skip setting it
|
||||
|
@ -337,6 +336,29 @@ void XboxTextureStateConverter::Apply()
|
|||
}
|
||||
}
|
||||
|
||||
// Normalize values which may have different mappings per XDK version
|
||||
DWORD NormalizeValue(DWORD xboxState, DWORD value) {
|
||||
if (g_LibVersion_D3D8 <= 3948) {
|
||||
// D3DTOP verified old order in 3948, new order in 4039
|
||||
switch (xboxState) {
|
||||
case xbox::X_D3DTSS_COLOROP:
|
||||
case xbox::X_D3DTSS_ALPHAOP:
|
||||
switch (value) {
|
||||
case 13:
|
||||
return xbox::X_D3DTOP_BLENDTEXTUREALPHA;
|
||||
case 14:
|
||||
return xbox::X_D3DTOP_BLENDFACTORALPHA;
|
||||
case 15:
|
||||
return xbox::X_D3DTOP_BLENDTEXTUREALPHAPM;
|
||||
case 16:
|
||||
return xbox::X_D3DTOP_BLENDCURRENTALPHA;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
uint32_t XboxTextureStateConverter::Get(int textureStage, DWORD xboxState) {
|
||||
if (textureStage < 0 || textureStage > 3)
|
||||
CxbxKrnlCleanup("Requested texture stage was out of range: %d", textureStage);
|
||||
|
@ -344,5 +366,7 @@ uint32_t XboxTextureStateConverter::Get(int textureStage, DWORD xboxState) {
|
|||
CxbxKrnlCleanup("Requested texture state was out of range: %d", xboxState);
|
||||
|
||||
// Read the value of the current stage/state from the Xbox data structure
|
||||
return D3D__TextureState[(textureStage * xbox::X_D3DTS_STAGESIZE) + XboxTextureStateOffsets[xboxState]];
|
||||
DWORD rawValue = D3D__TextureState[(textureStage * xbox::X_D3DTS_STAGESIZE) + XboxTextureStateOffsets[xboxState]];
|
||||
|
||||
return NormalizeValue(xboxState, rawValue);
|
||||
}
|
||||
|
|
|
@ -45,6 +45,8 @@ private:
|
|||
void BuildTextureStateMappingTable();
|
||||
DWORD GetHostTextureOpValue(DWORD XboxTextureOp);
|
||||
|
||||
// Pointer to Xbox texture states
|
||||
// Note mappings may change between XDK versions
|
||||
uint32_t* D3D__TextureState = nullptr;
|
||||
std::array<int, xbox::X_D3DTSS_LAST + 1> XboxTextureStateOffsets;
|
||||
XboxRenderStateConverter* pXboxRenderStates;
|
||||
|
|
Loading…
Reference in New Issue