WIP pointsprite nuances

This commit is contained in:
PatrickvL 2020-12-22 16:27:04 +01:00
parent c6fdfc7101
commit af0058ad61
5 changed files with 44 additions and 19 deletions

View File

@ -6469,21 +6469,23 @@ void UpdateFixedFunctionVertexShaderState()
ffShaderState.Modes.BackEmissiveMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKEMISSIVEMATERIALSOURCE) : D3DMCS_MATERIAL);
// Point sprites
auto pointSize = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSIZE);
auto pointSizeMin = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSIZE_MIN);
auto pointSizeMax = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSIZE_MAX);
ffShaderState.PointSprite.PointSize = *reinterpret_cast<float*>(&pointSize);
ffShaderState.PointSprite.PointSizeMin = *reinterpret_cast<float*>(&pointSizeMin);
ffShaderState.PointSprite.PointSizeMax = *reinterpret_cast<float*>(&pointSizeMax);
bool PointSpriteEnable = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSPRITEENABLE);
float pointSize = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSIZE);
float pointSizeMin = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSIZE_MIN);
float pointSizeMax = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSIZE_MAX);
bool PointScaleEnable = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALEENABLE);
auto scaleA = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALE_A);
auto scaleB = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALE_B);
auto scaleC = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALE_C);
ffShaderState.PointSprite.ScaleABC.x = PointScaleEnable ? *reinterpret_cast<float*>(&scaleA) : 1.0f;
ffShaderState.PointSprite.ScaleABC.y = PointScaleEnable ? *reinterpret_cast<float*>(&scaleB) : 0.0f;
ffShaderState.PointSprite.ScaleABC.z = PointScaleEnable ? *reinterpret_cast<float*>(&scaleC) : 0.0f;
ffShaderState.PointSprite.XboxRenderTargetHeight = PointScaleEnable ? (float)GetPixelContainerHeight(g_pXbox_RenderTarget) : 1.0f;
float scaleA = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSCALE_A);
float scaleB = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSCALE_B);
float scaleC = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSCALE_C);
float renderTargetHeight = (float)GetPixelContainerHeight(g_pXbox_RenderTarget);
PointScaleEnable &= PointSpriteEnable;
ffShaderState.PointSprite.PointSize = PointSpriteEnable ? pointSize : 1.0f;
ffShaderState.PointSprite.PointSizeMin = PointSpriteEnable ? pointSizeMin : 1.0f;
ffShaderState.PointSprite.PointSizeMax = PointSpriteEnable ? pointSizeMax : 1.0f;
ffShaderState.PointSprite.ScaleABC.x = PointScaleEnable ? scaleA : 1.0f;
ffShaderState.PointSprite.ScaleABC.y = PointScaleEnable ? scaleB : 0.0f;
ffShaderState.PointSprite.ScaleABC.z = PointScaleEnable ? scaleC : 0.0f;
ffShaderState.PointSprite.XboxRenderTargetHeight = PointScaleEnable ? renderTargetHeight : 1.0f;
ffShaderState.PointSprite.RenderUpscaleFactor = g_RenderUpscaleFactor;
// Fog

View File

@ -19,10 +19,13 @@ struct VS_INPUT
#else
float4 pos : POSITION;
float4 bw : BLENDWEIGHT;
float4 color[2] : COLOR;
float4 normal : NORMAL;
float4 color[2] : COLOR;
float1 fogCoord : FOG;
float1 pointSize : PSIZE;
float4 backColor[2] : TEXCOORD4;
float4 normal : NORMAL;
float4 texcoord[4] : TEXCOORD;
float4 reserved[3] : TEXCOORD6;
#endif
};
@ -59,12 +62,17 @@ float4 Get(const VS_INPUT xIn, const uint index)
if(index == normal) return xIn.normal;
if(index == diffuse) return xIn.color[0];
if(index == specular) return xIn.color[1];
if(index == fogCoord) return xIn.fogCoord;
if(index == pointSize) return xIn.pointSize;
if(index == backDiffuse) return xIn.backColor[0];
if(index == backSpecular) return xIn.backColor[1];
if(index == texcoord0) return xIn.texcoord[0];
if(index == texcoord1) return xIn.texcoord[1];
if(index == texcoord2) return xIn.texcoord[2];
if(index == texcoord3) return xIn.texcoord[3];
if(index == reserved0) return xIn.reserved[0];
if(index == reserved1) return xIn.reserved[1];
if(index == reserved2) return xIn.reserved[2];
return 1;
#endif
}

View File

@ -186,6 +186,16 @@ uint32_t XboxRenderStateConverter::GetXboxRenderState(uint32_t State)
return D3D__RenderState[XboxRenderStateOffsets[State]];
}
float XboxRenderStateConverter::GetXboxRenderStateAsFloat(uint32_t State)
{
if (!XboxRenderStateExists(State)) {
EmuLog(LOG_LEVEL::WARNING, "Attempt to read a Renderstate (%s) that does not exist in the current D3D8 XDK Version (%d)", GetDxbxRenderStateInfo(State).S, g_LibVersion_D3D8);
return 0;
}
return *reinterpret_cast<float*>(&(D3D__RenderState[XboxRenderStateOffsets[State]]));
}
void XboxRenderStateConverter::StoreInitialValues()
{
for (unsigned int RenderState = xbox::X_D3DRS_FIRST; RenderState <= xbox::X_D3DRS_LAST; RenderState++) {

View File

@ -46,6 +46,7 @@ public:
void SetWireFrameMode(int mode);
void SetDirty();
uint32_t GetXboxRenderState(uint32_t State);
float GetXboxRenderStateAsFloat(uint32_t State);
private:
void VerifyAndFixDeferredRenderStateOffset();
void DeriveRenderStateOffsetFromDeferredRenderStateOffset();

View File

@ -33,6 +33,7 @@
#include "EmuShared.h"
#include "core/hle/Intercept.hpp"
#include "RenderStates.h"
#include "core/hle/D3D8/XbVertexShader.h" // For g_UseFixedFunctionVertexShader, g_Xbox_VertexShaderMode and VertexShaderMode::FixedFunction
#include "core/hle/D3D8/Direct3D9/Direct3D9.h" // For g_pD3DDevice
#include <optional>
@ -166,9 +167,12 @@ void XboxTextureStateConverter::Apply()
// The Xbox NV2A uses only Stage 3 for point-sprites, so we emulate this
// by mapping Stage 3 to Stage 0, and disabling all stages > 0
bool pointSpriteOverride = false;
bool pointSpritesEnabled = pXboxRenderStates->GetXboxRenderState(xbox::X_D3DRS_POINTSPRITEENABLE);
if (pointSpritesEnabled) {
pointSpriteOverride = true;
bool pointSpritesEnabled = false;
if (g_Xbox_VertexShaderMode == VertexShaderMode::FixedFunction && g_UseFixedFunctionVertexShader) {
pointSpritesEnabled = pXboxRenderStates->GetXboxRenderState(xbox::X_D3DRS_POINTSPRITEENABLE);
if (pointSpritesEnabled) {
pointSpriteOverride = true;
}
}
for (int XboxStage = 0; XboxStage < xbox::X_D3DTS_STAGECOUNT; XboxStage++) {