98 lines
3.5 KiB
Plaintext
98 lines
3.5 KiB
Plaintext
![]() |
shader_type particles;
|
||
|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc"
|
||
|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc"
|
||
|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Textures.gdshaderinc"
|
||
|
|
||
|
uniform vec3 cameraPosition;
|
||
|
uniform float yaw;
|
||
|
uniform float cellSize = 1.0;
|
||
|
uniform int width = 10;
|
||
|
uniform int height = 10;
|
||
|
|
||
|
uniform sampler2D positionVariance;
|
||
|
uniform vec3 maxPositionOffset = vec3(0,0,0);
|
||
|
uniform vec2 positionUVScale = vec2( 1.0, 1.0 );
|
||
|
uniform vec2 positionUVOffset = vec2( 1.0, 1.0 );
|
||
|
uniform float heightOffset = 0;
|
||
|
|
||
|
uniform sampler2D rotationVariance;
|
||
|
uniform vec3 minRotation = vec3( 0, 0, 0 );
|
||
|
uniform vec3 maxRotation = vec3( 0, 1, 0 );
|
||
|
uniform vec2 rotationUVScale = vec2( 1.0, 1.0 );
|
||
|
uniform vec2 rotationUVOffset = vec2( 1.0, 1.0 );
|
||
|
|
||
|
uniform sampler2D scaleVariance;
|
||
|
uniform vec3 minScale = vec3( 1, 1, 1 );
|
||
|
uniform vec3 maxScale = vec3( 1, 1, 1 );
|
||
|
uniform vec2 scaleUVScale = vec2( 1.0, 1.0 );
|
||
|
uniform vec2 scaleUVOffset = vec2( 1.0, 1.0 );
|
||
|
|
||
|
uniform float occupancyAmount = 0;
|
||
|
uniform float occupancyPower = 0;
|
||
|
uniform float occupancyTreshold = 0.5;
|
||
|
uniform float occupancyHideOffset = -3;
|
||
|
uniform float occupancyHideScale = 0.1;
|
||
|
|
||
|
uniform sampler2D occupancyVariance;
|
||
|
uniform vec2 occupancyUVScale = vec2( 1.0, 1.0 );
|
||
|
uniform vec2 occupancyUVOffset = vec2( 1.0, 1.0 );
|
||
|
|
||
|
uniform float hideStart = 40;
|
||
|
uniform float hideMax = 60;
|
||
|
uniform float hideOffset = -0.6;
|
||
|
|
||
|
uniform vec2 mapSize = vec2(1024,1024);
|
||
|
uniform vec2 mapCenter = vec2(0,0);
|
||
|
|
||
|
vec2 indexToPosition( int index )
|
||
|
{
|
||
|
int x = index % width;
|
||
|
int y = index / height;
|
||
|
|
||
|
return vec2( float(x), float(y) );
|
||
|
}
|
||
|
|
||
|
void process()
|
||
|
{
|
||
|
vec2 position = indexToPosition( int(INDEX) );
|
||
|
float rotation = round( 4.0 * yaw / 360.0 ) * PI / 2.0;
|
||
|
|
||
|
vec3 snappedCameraPosition = vec3(
|
||
|
floor( cameraPosition.x / cellSize ) * cellSize,
|
||
|
0,
|
||
|
floor( cameraPosition.z / cellSize ) * cellSize
|
||
|
);
|
||
|
|
||
|
vec2 origin = vec2( float(width)/2.0, float(height)/2.0 );
|
||
|
position -= origin;
|
||
|
|
||
|
position = rotate_v2( position, rotation ) * cellSize;
|
||
|
|
||
|
|
||
|
vec3 position3D = vec3( position.x, heightOffset, position.y ) + snappedCameraPosition;
|
||
|
|
||
|
float d = length( position3D - cameraPosition );
|
||
|
float yOffset = mapClamped( d, hideStart, hideMax, 0, hideOffset );
|
||
|
position3D.y += yOffset;
|
||
|
|
||
|
|
||
|
vec2 mapOffset = mapCenter - mapSize/2.0;
|
||
|
vec2 uv = ( vec2( position3D.x, position3D.z ) - mapOffset ) / mapSize;
|
||
|
|
||
|
vec3 offset = (textureLod( positionVariance, tilingOffset( uv, positionUVScale, positionUVOffset ), 0 ).rgb - vec3(0.5,0.5,0.5) ) * maxPositionOffset;
|
||
|
position3D += offset;
|
||
|
vec3 rotSampled = textureLod( rotationVariance, tilingOffset( uv, rotationUVScale, rotationUVOffset ), 0 ).rgb;
|
||
|
vec3 rot = ( rotSampled * ( maxRotation - minRotation ) + minRotation ) * PI * 2.0;
|
||
|
// rot.y = round( 4.0 * rot.y / PI * 2.0 ) / 4.0 * PI * 2.0;
|
||
|
vec3 sca = textureLod( scaleVariance, tilingOffset( uv, scaleUVScale, scaleUVOffset ), 0 ).rgb;
|
||
|
sca = sca * ( maxScale - minScale ) + minScale;
|
||
|
|
||
|
vec2 uv2 = ( vec2( position3D.x, position3D.z ) - mapOffset ) / mapSize;
|
||
|
|
||
|
float occ = textureLod( occupancyVariance, tilingOffset( uv2, occupancyUVScale, occupancyUVOffset ), 0 ).r;
|
||
|
occ = clamp( ( occ - occupancyTreshold ) * occupancyPower + occupancyTreshold, 0.0, 1.0 );
|
||
|
sca *= mix( 1.0, occupancyHideScale , ( 1.0 - occ ) * occupancyAmount );
|
||
|
position3D.y += ( 1.0 - occ ) * occupancyAmount * occupancyHideOffset;
|
||
|
TRANSFORM = TRS( position3D, rot, vec3( sca.x , sca.y, sca.z ) );
|
||
|
}
|