153 lines
5.1 KiB
Plaintext
153 lines
5.1 KiB
Plaintext
Shader ${ShaderCategory}
|
|
{
|
|
Properties { _MainTex ("Texture", any) = "" {} }
|
|
|
|
SubShader
|
|
{
|
|
ZTest Always Cull OFF ZWrite Off
|
|
|
|
HLSLINCLUDE
|
|
|
|
#include "UnityCG.cginc"
|
|
#include "Packages/com.unity.terrain-tools/Shaders/TerrainTools.hlsl"
|
|
|
|
sampler2D _MainTex;
|
|
float4 _MainTex_TexelSize; // 1/width, 1/height, width, height
|
|
|
|
float2 _WorldHeightRemap;
|
|
|
|
// brush matrices
|
|
float4x4 _b2w; // brush to world
|
|
float4x4 _w2b; // world to brush
|
|
float4x4 _b2w_Rotation;
|
|
float4x4 _w2b_Rotation;
|
|
float4x4 _b2w_Translation;
|
|
float4x4 _w2b_Translation;
|
|
float4x4 _b2w_Scale;
|
|
float4x4 _w2b_Scale;
|
|
|
|
#define BRUSH_POSITION ( _b2w_Translation._m03_m13_m23 )
|
|
#define BRUSH_ROTATION ( 0 )
|
|
#define BRUSH_SCALE ( _b2w_Scale._m00_m11_m22 )
|
|
|
|
sampler2D _BrushTex;
|
|
float4 _BrushParams; // x = strength, y = , z = , w = brushSize
|
|
float4 _BasePos;
|
|
float4 _BaseSize;
|
|
|
|
float4 _Origin;
|
|
#define BRUSH_STRENGTH ( _BrushParams[0] )
|
|
#define BRUSH_SIZE ( _BrushParams[2] )
|
|
#define INV_BRUSH_SIZE ( _BrushParams[3] )
|
|
|
|
struct appdata_t
|
|
{
|
|
float4 vertex : POSITION;
|
|
float2 pcUV : TEXCOORD0;
|
|
};
|
|
|
|
struct v2f
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float2 pcUV : TEXCOORD0;
|
|
};
|
|
|
|
v2f vert( appdata_t v )
|
|
{
|
|
v2f o;
|
|
|
|
o.vertex = UnityObjectToClipPos( v.vertex );
|
|
o.pcUV = v.pcUV;
|
|
|
|
return o;
|
|
}
|
|
|
|
ENDHLSL
|
|
|
|
BEGINPASSTEMPLATE
|
|
|
|
Pass // ${NoiseName} Noise
|
|
{
|
|
Name "${NoiseName} Noise"
|
|
|
|
HLSLPROGRAM
|
|
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
|
|
${Includes}
|
|
|
|
inline float3 UVToWS( float3 pcUV )
|
|
{
|
|
// float2 pcPixels = pcUV * float2(pixelRect.width, pixelRect.height) - 0.5f;
|
|
// float2 texturePixels = pcPixels + pixelRect.min;
|
|
|
|
// float3 position_TerrainSpace =
|
|
// float3(
|
|
// texturePixels.x * pixelSize.x,
|
|
// 0.0f,
|
|
// texturePixels.z * pixelSize.y);
|
|
|
|
// float3 position_WorldSpace = position_TerrainSpace + Terrain.position;
|
|
// return position_WorldSpace;
|
|
|
|
|
|
float3 rotatedOffset = mul( _w2b_Rotation, float4( BRUSH_POSITION, 0 ) ).xyz;
|
|
// rotatedOffset = mul( _w2b_Scale, float4( rotatedOffset, 0 ) ).xyz;
|
|
// rotatedOffset = mul( _w2b_Translation, float4( rotatedOffset, 0 ) ).xyz;
|
|
|
|
// need to adjust uvs due to "scaling" from brush rotation
|
|
float3 pcUVRescale = float3( length( _PCUVToBrushUVScales.xy ),
|
|
0, // unused since brush is 2D geometry
|
|
length( _PCUVToBrushUVScales.zw ) );
|
|
|
|
// float3 brushUV = ( pcUV - float3( .5, 0, .5 ) ); // brush-space position
|
|
// float3 pos = brushUV * BRUSH_SCALE * pcUVRescale + BRUSH_POSITION;
|
|
|
|
float3 brushUV = ( pcUV - float3( .5, 0, .5 ) ) * pcUVRescale;
|
|
float3 pos = brushUV;
|
|
|
|
// pos = mul( _b2w_Rotation, float4( pos, 1 ) ).xyz;
|
|
// pos = mul( _b2w_Scale, float4( pos, 1 ) ).xyz;
|
|
// pos = mul( _b2w_Translation, float4( pos, 1 ) ).xyz;
|
|
// // pos = mul( _w2b_Rotation, float4( pos, 1 ) ).xyz;
|
|
// // pos = mul( _w2b_Scale, float4( pos, 1 ) ).xyz;
|
|
// // pos += rotatedOffset * BRUSH_SCALE;d
|
|
|
|
pos *= BRUSH_SCALE;
|
|
pos += BRUSH_POSITION;
|
|
// pos = float3( -pos.z, 0, pos.x );
|
|
|
|
return pos;
|
|
}
|
|
|
|
float4 frag( v2f i ) : SV_Target
|
|
{
|
|
float height = UnpackHeightmap( tex2D( _MainTex, i.pcUV ) );
|
|
|
|
float2 brushUV = PaintContextUVToBrushUV( i.pcUV );
|
|
float oob = all( saturate( brushUV ) == brushUV ) ? 1 : 0;
|
|
|
|
// calc noise val for center of pixel
|
|
float3 pcUV = float3( i.pcUV.x, 0, i.pcUV.y ) + .5 * float3(1, 0, 1) * _MainTex_TexelSize.xxy;
|
|
float3 pos3D_worldSpace = UVToWS( pcUV );
|
|
float2 pos2D = pos3D_worldSpace.xz;
|
|
|
|
// out of bounds multiplier
|
|
float brushShape = oob * UnpackHeightmap( tex2D( _BrushTex, brushUV ) );
|
|
|
|
float3 pos3D_noiseSpace = ApplyNoiseTransform( pos3D_worldSpace );
|
|
pos2D = ApplyNoiseTransform( pos2D );
|
|
|
|
float noiseVal = noise_${VariantName}( pos3D_noiseSpace, ${GetInputs} );
|
|
|
|
// return PackHeightmap( clamp( height + BRUSH_STRENGTH * brushShape * noiseVal, 0, 0.5 ) );
|
|
return -1; // make sure this fails cuz we don't want to use this anymore
|
|
}
|
|
|
|
ENDHLSL
|
|
}
|
|
|
|
ENDPASSTEMPLATE
|
|
}
|
|
} |