WIP pointsprite nuances
This commit is contained in:
parent
c6fdfc7101
commit
af0058ad61
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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++) {
|
||||
|
|
Loading…
Reference in New Issue