431 lines
13 KiB
HLSL
431 lines
13 KiB
HLSL
#ifndef PRAGMA_DCL
|
|
#pragma dcl position diffuse texcoord0 normal tangent0
|
|
#define PRAGMA_DCL
|
|
#endif
|
|
|
|
// NOTE: this is actually a decal shader, but we cannot define DECAL_SHADER here because
|
|
// of a tools issue related to the fact that there is no diffuse sampler
|
|
|
|
#define SPECULAR 0
|
|
#define NORMAL_MAP 0
|
|
#define NO_SKINNING
|
|
#define USE_ALPHACLIP_FADE
|
|
|
|
#include "../common.fxh"
|
|
|
|
#include "../Lighting/lighting.fxh"
|
|
#include "../Debug/EntitySelect.fxh"
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
BEGIN_RAGE_CONSTANT_BUFFER(distance_map_locals,b0)
|
|
float3 fillColor : fillColor
|
|
<
|
|
string UIName = "Fill Color";
|
|
string UIWidget = "Numeric";
|
|
float UIMin = 0.0;
|
|
float UIMax = 1.0;
|
|
float UIStep = 0.01;
|
|
> = {0.0, 0.0, 1.0};
|
|
EndConstantBufferDX10(distance_map_locals)
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
BeginSampler(sampler, DistanceMap, distanceMapSampler, distanceMap)
|
|
string UIName = "Distance Map";
|
|
string TCPTemplateRelative = "maps_other/DistanceMap.tcp";
|
|
int TCPAllowOverride = 0;
|
|
string TextureType="Distance";
|
|
ContinueSampler(sampler, DistanceMap, distanceMapSampler, distanceMap)
|
|
AddressU = CLAMP;
|
|
AddressV = CLAMP;
|
|
AddressW = CLAMP;
|
|
MIPFILTER = MIPLINEAR;
|
|
MINFILTER = LINEAR;
|
|
MAGFILTER = LINEAR;
|
|
EndSampler;
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
struct vertexInput
|
|
{
|
|
float3 pos : POSITION;
|
|
float4 diffuse : COLOR0;
|
|
float4 texCoord : TEXCOORD0;
|
|
float3 normal : NORMAL;
|
|
float4 tangent : TANGENT0;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
struct vertexInputSimple
|
|
{
|
|
float3 pos : POSITION;
|
|
float4 diffuse : COLOR0;
|
|
float4 texCoord : TEXCOORD0;
|
|
float3 normal : NORMAL;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
struct vertexOutputDeferred
|
|
{
|
|
DECLARE_POSITION(pos)
|
|
float4 texCoord : TEXCOORD0;
|
|
float3 color : TEXCOORD1;
|
|
float3 worldNormal : TEXCOORD2;
|
|
float3 worldPos : TEXCOORD3;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
struct vertexOutput
|
|
{
|
|
DECLARE_POSITION(pos)
|
|
float4 texCoord : TEXCOORD0;
|
|
float4 color : TEXCOORD1;
|
|
float3 worldNormal : TEXCOORD2;
|
|
float3 worldPos : TEXCOORD3;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
struct vertexOutputSimple
|
|
{
|
|
DECLARE_POSITION(pos)
|
|
float4 texCoord : TEXCOORD0;
|
|
float4 color : TEXCOORD1;
|
|
float3 worldNormal : TEXCOORD2;
|
|
float3 worldPos : TEXCOORD3;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
vertexOutput VS_Transform(vertexInput IN)
|
|
{
|
|
vertexOutput OUT;
|
|
|
|
// Write out final position & texture coords
|
|
float3 localPos = IN.pos;
|
|
float3 localNormal = IN.normal;
|
|
|
|
float4 projPos = mul(float4(localPos,1), gWorldViewProj);
|
|
float3 worldPos = mul(float4(localPos,1), gWorld).xyz;
|
|
|
|
// Transform normal by "transpose" matrix
|
|
float3 worldNormal = NORMALIZE_VS(mul(localNormal, (float3x3)gWorld));
|
|
|
|
OUT.worldPos = worldPos;
|
|
OUT.pos = projPos;
|
|
OUT.worldNormal = worldNormal;
|
|
|
|
OUT.texCoord = IN.texCoord;
|
|
OUT.color = IN.diffuse;
|
|
|
|
return(OUT);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
vertexOutputDeferred VS_Transform_deferred(vertexInput IN)
|
|
{
|
|
vertexOutputDeferred OUT;
|
|
|
|
// Write out final position & texture coords
|
|
float3 localPos = IN.pos;
|
|
float3 localNormal = IN.normal;
|
|
|
|
float4 projPos = mul(float4(localPos,1), gWorldViewProj);
|
|
float3 worldPos = mul(float4(localPos,1), gWorld).xyz;
|
|
|
|
// Transform normal by "transpose" matrix
|
|
float3 worldNormal = NORMALIZE_VS(mul(localNormal, (float3x3)gWorld));
|
|
|
|
OUT.pos = projPos;
|
|
OUT.texCoord = IN.texCoord;
|
|
OUT.worldNormal = worldNormal;
|
|
OUT.color = IN.diffuse.rgb;
|
|
OUT.worldPos = worldPos;
|
|
|
|
return(OUT);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
vertexOutputSimple VS_TransformParaboloid(vertexInputSimple IN)
|
|
{
|
|
vertexOutputSimple OUT;
|
|
|
|
// Write out final position & texture coords
|
|
float3 localPos = IN.pos;
|
|
float3 localNormal = IN.normal;
|
|
|
|
float3 worldPos = mul(float4(localPos,1), gWorld).xyz;
|
|
|
|
// Transform normal by "transpose" matrix
|
|
float3 worldNormal = NORMALIZE_VS(mul(localNormal, (float3x3)gWorld));
|
|
|
|
OUT.worldPos = worldPos;
|
|
OUT.pos = DualParaboloidPosTransform(localPos);
|
|
OUT.worldNormal = worldNormal;
|
|
OUT.pos.w = 1.0f;
|
|
|
|
OUT.texCoord = IN.texCoord;
|
|
OUT.color = IN.diffuse.rgba;
|
|
|
|
return(OUT);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
half4 PS_Textured(vertexOutput IN) : COLOR
|
|
{
|
|
float alpha = tex2D(distanceMapSampler, IN.texCoord.xy).x;
|
|
float4 color = float4(fillColor, (alpha >= 0.5));
|
|
|
|
#if __XENON
|
|
[isolate] // the compile thinks the shader is "too complex" without t
|
|
#endif
|
|
float4 pixelColor = calcDepthFxBasic(color, IN.worldPos);
|
|
return(PackHdr(pixelColor));
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
half4 PS_TexturedParaboloid(vertexOutputSimple IN) : COLOR
|
|
{
|
|
float4 OUT = float4(1.0, 0.0, 0.0, 1.0);
|
|
return PackHdr(OUT);
|
|
}
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
DeferredGBuffer PS_Textured_deferred(vertexOutputDeferred IN)
|
|
{
|
|
// Compute some surface information.
|
|
StandardLightingProperties surfaceStandardLightingProperties = (StandardLightingProperties)0;
|
|
|
|
// Distance map
|
|
float alpha = tex2Dlod(distanceMapSampler, float4(IN.texCoord.xy, 0.0f, 0.0f)).x;
|
|
|
|
surfaceStandardLightingProperties.diffuseColor = float4(fillColor, 1.0);
|
|
surfaceStandardLightingProperties.naturalAmbientScale = IN.color.r;
|
|
surfaceStandardLightingProperties.artificialAmbientScale = IN.color.g;
|
|
|
|
float2 gradX = ddx(IN.texCoord.xy);
|
|
float2 gradY = ddy(IN.texCoord.xy);
|
|
|
|
float4 DistEpsilonScaleMin = float4(10.0, 10.0, 0.0, 0.0);
|
|
|
|
float2 ddxyMax = max(abs(gradX), abs(gradY));
|
|
float2 DistEpsilon = max(ddxyMax.x, ddxyMax.y).xx * DistEpsilonScaleMin.xy;
|
|
DistEpsilon = max(DistEpsilon, DistEpsilonScaleMin.zw); //Clamp the min epsilon for softer edges?
|
|
float2 DistMinMax = float2(0.5 - DistEpsilon.x, 0.5 + DistEpsilon.y);
|
|
|
|
alpha = smoothstep(DistMinMax.x, DistMinMax.y, alpha);
|
|
|
|
// Pack the information into the GBuffer(s).
|
|
DeferredGBuffer OUT = PackGBuffer(normalize(IN.worldNormal), surfaceStandardLightingProperties);
|
|
OUT.col0.a = alpha;
|
|
OUT.col3.a = alpha;
|
|
|
|
return(OUT);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
DeferredGBuffer PS_Textured_deferred_AlphaClip(vertexOutputDeferred IN)
|
|
{
|
|
#if !RSG_ORBIS && !RSG_DURANGO
|
|
FadeDiscard( IN.pos, globalFade );
|
|
#endif
|
|
|
|
// Compute some surface information.
|
|
StandardLightingProperties surfaceStandardLightingProperties = (StandardLightingProperties)0;
|
|
|
|
// Distance map
|
|
float alpha = tex2Dlod(distanceMapSampler, float4(IN.texCoord.xy, 0.0f, 0.0f)).x;
|
|
|
|
surfaceStandardLightingProperties.diffuseColor = float4(fillColor, 1.0);
|
|
surfaceStandardLightingProperties.naturalAmbientScale = IN.color.r;
|
|
surfaceStandardLightingProperties.artificialAmbientScale = IN.color.g;
|
|
|
|
float2 gradX = ddx(IN.texCoord.xy);
|
|
float2 gradY = ddy(IN.texCoord.xy);
|
|
|
|
float4 DistEpsilonScaleMin = float4(10.0, 10.0, 0.0, 0.0);
|
|
|
|
float2 ddxyMax = max(abs(gradX), abs(gradY));
|
|
float2 DistEpsilon = max(ddxyMax.x, ddxyMax.y).xx * DistEpsilonScaleMin.xy;
|
|
DistEpsilon = max(DistEpsilon, DistEpsilonScaleMin.zw); //Clamp the min epsilon for softer edges?
|
|
float2 DistMinMax = float2(0.5 - DistEpsilon.x, 0.5 + DistEpsilon.y);
|
|
|
|
alpha = smoothstep(DistMinMax.x, DistMinMax.y, alpha);
|
|
|
|
// Pack the information into the GBuffer(s).
|
|
DeferredGBuffer OUT = PackGBuffer(normalize(IN.worldNormal), surfaceStandardLightingProperties);
|
|
OUT.col0.a = alpha;
|
|
OUT.col3.a = alpha;
|
|
|
|
return(OUT);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
half4 PS_NotImplemented() : COLOR
|
|
{
|
|
return half4(1.0, 0.0, 1.0, 1.0);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
#if __MAX
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
vertexOutput VS_MaxTransform(maxVertexInput IN)
|
|
{
|
|
vertexInput input;
|
|
|
|
input.pos = IN.pos;
|
|
input.diffuse = IN.diffuse;
|
|
|
|
input.texCoord = Max2RageTexCoord4(float4(IN.texCoord0.xy,IN.texCoord1.xy));
|
|
|
|
input.normal = IN.normal;
|
|
input.tangent = float4(IN.tangent,1.0f);
|
|
|
|
return VS_Transform(input);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
float4 PS_MaxTextured(vertexOutput IN) : COLOR
|
|
{
|
|
float4 OUT;
|
|
|
|
if(maxLightingToggle)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
}
|
|
|
|
float alpha = tex2D(distanceMapSampler, IN.texCoord.xy).x;
|
|
OUT = float4(fillColor, (alpha >= 0.5));
|
|
|
|
return(saturate(OUT));
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
technique tool_draw
|
|
{
|
|
pass p0
|
|
{
|
|
MAX_TOOL_TECHNIQUE_RS
|
|
AlphaBlendEnable = true;
|
|
AlphaTestEnable = false;
|
|
StencilEnable = false;
|
|
ZEnable = true;
|
|
ZWriteEnable = false;
|
|
SrcBlend = SRCALPHA;
|
|
DestBlend = INVSRCALPHA;
|
|
|
|
VertexShader = compile VERTEXSHADER VS_MaxTransform();
|
|
PixelShader = compile PIXELSHADER PS_MaxTextured();
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
#else // __MAX
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
#if DEFERRED_TECHNIQUES && NON_CUTOUT_DEFERRED_TECHNIQUES
|
|
technique deferred_draw
|
|
{
|
|
pass p0
|
|
{
|
|
zFunc = FixedupLESS;
|
|
AlphaBlendEnable = true;
|
|
AlphaTestEnable = false;
|
|
StencilEnable = false;
|
|
ZEnable = true;
|
|
ZWriteEnable = false;
|
|
SrcBlend = SRCALPHA;
|
|
DestBlend = INVSRCALPHA;
|
|
SET_COLOR_WRITE_ENABLE(RED+GREEN+BLUE, 0, 0, RED+GREEN)
|
|
|
|
VertexShader = compile VERTEXSHADER VS_Transform_deferred();
|
|
PixelShader = compile PIXELSHADER PS_Textured_deferred() CGC_FLAGS(CGC_DEFAULTFLAGS);
|
|
}
|
|
}
|
|
#endif // DEFERRED_TECHNIQUES && NON_CUTOUT_DEFERRED_TECHNIQUES
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
#if DEFERRED_TECHNIQUES && NON_CUTOUT_DEFERRED_TECHNIQUES && DRAWSKINNED_TECHNIQUES
|
|
technique deferred_drawskinned
|
|
{
|
|
pass p0
|
|
{
|
|
VertexShader = compile VERTEXSHADER VS_Transform();
|
|
PixelShader = compile PIXELSHADER PS_NotImplemented() CGC_FLAGS(CGC_DEFAULTFLAGS);
|
|
}
|
|
}
|
|
#endif // DEFERRED_TECHNIQUES && NON_CUTOUT_DEFERRED_TECHNIQUES && DRAWSKINNED_TECHNIQUES
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
#if DEFERRED_TECHNIQUES && CUTOUT_OR_SSA_TECHNIQUES
|
|
technique deferredalphaclip_draw
|
|
{
|
|
pass p0
|
|
{
|
|
zFunc = FixedupLESS;
|
|
AlphaBlendEnable = true;
|
|
AlphaTestEnable = false;
|
|
StencilEnable = false;
|
|
ZEnable = true;
|
|
ZWriteEnable = false;
|
|
SrcBlend = SRCALPHA;
|
|
DestBlend = INVSRCALPHA;
|
|
SET_COLOR_WRITE_ENABLE(RED+GREEN+BLUE, 0, 0, RED+GREEN)
|
|
|
|
VertexShader = compile VERTEXSHADER VS_Transform_deferred();
|
|
PixelShader = compile PIXELSHADER PS_Textured_deferred_AlphaClip() CGC_FLAGS(CGC_DEFAULTFLAGS);
|
|
}
|
|
}
|
|
#endif // DEFERRED_TECHNIQUES && CUTOUT_OR_SSA_TECHNIQUES
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
#if FORWARD_TECHNIQUES
|
|
technique draw
|
|
{
|
|
pass p0
|
|
{
|
|
zFunc = FixedupLESS;
|
|
AlphaBlendEnable = true;
|
|
AlphaTestEnable = false;
|
|
StencilEnable = false;
|
|
ZEnable = true;
|
|
ZWriteEnable = false;
|
|
SrcBlend = SRCALPHA;
|
|
DestBlend = INVSRCALPHA;
|
|
SET_COLOR_WRITE_ENABLE(RED+GREEN+BLUE, 0, 0, RED+GREEN)
|
|
|
|
VertexShader = compile VERTEXSHADER VS_Transform();
|
|
PixelShader = compile PIXELSHADER PS_Textured() CGC_FLAGS(CGC_DEFAULTFLAGS);
|
|
}
|
|
}
|
|
#endif // FORWARD_TECHNIQUES
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
|
|
SHADERTECHNIQUE_ENTITY_SELECT(VS_Transform(), VS_Transform())
|
|
#include "../Debug/debug_overlay_distance_map.fxh"
|
|
|
|
// ----------------------------------------------------------------------------------------------- //
|
|
#endif // __MAX
|
|
// ----------------------------------------------------------------------------------------------- //
|