96 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
shader_type canvas_item;
 | 
						|
 | 
						|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Colors.gdshaderinc"
 | 
						|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc"
 | 
						|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc"
 | 
						|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/SDF.gdshaderinc"
 | 
						|
 | 
						|
uniform vec2 size;
 | 
						|
uniform float sharpness = 5;
 | 
						|
uniform float borderRadius = 5;
 | 
						|
uniform float strokeSize = 5;
 | 
						|
uniform float offset;
 | 
						|
 | 
						|
uniform vec4 fillColor:source_color;
 | 
						|
uniform sampler2D fill;
 | 
						|
uniform vec4 fillUVTransform;
 | 
						|
uniform sampler2D screenFillMultiply;
 | 
						|
uniform vec4 screenfillMultiplyUVTransform;
 | 
						|
uniform vec2 screenfillMultiplyUVMovement;
 | 
						|
 | 
						|
 | 
						|
uniform vec4 strokeColor:source_color;
 | 
						|
uniform sampler2D stroke;
 | 
						|
uniform vec4 strokeUVTransform;
 | 
						|
uniform sampler2D screenStrokeMultiply;
 | 
						|
uniform vec4 screenStrokeMultiplyUVTransform;
 | 
						|
uniform vec2 screenStrokeMultiplyUVMovment;
 | 
						|
 | 
						|
uniform float opacity:hint_range(0,1) = 1;
 | 
						|
 | 
						|
void vertex()
 | 
						|
{
 | 
						|
	// Called for every vertex the material is visible on.
 | 
						|
}
 | 
						|
 | 
						|
void fragment()
 | 
						|
{
 | 
						|
  float maxRadius = min( size.x, size.y ) / 2.0 - offset;
 | 
						|
 | 
						|
  vec2 fillMinP;
 | 
						|
  vec2 fillMaxP;
 | 
						|
  float fillRadius;
 | 
						|
 | 
						|
  computeRectangleBounds( offset, borderRadius, maxRadius, size, fillMinP, fillMaxP, fillRadius );
 | 
						|
  float fillMask = roundedRectangle( fillMinP, fillMaxP, UV * size, fillRadius, sharpness );
 | 
						|
  vec2 fillUV = tilingOffsetRepeat( UV, fillUVTransform );
 | 
						|
  vec2 fillMoved = screenfillMultiplyUVMovement * TIME;
 | 
						|
  vec4 screenFillMovement = vec4( 0,0, fillMoved.x, fillMoved.y );
 | 
						|
  vec2 screenFillMultiplyUV = tilingOffsetRepeat( SCREEN_UV, screenfillMultiplyUVTransform + screenFillMovement );
 | 
						|
  vec4 combinedfillColor = fillColor * texture( fill, fillUV ) * texture( screenFillMultiply, screenFillMultiplyUV );
 | 
						|
 | 
						|
 | 
						|
  vec2 strokeMinP;
 | 
						|
  vec2 strokeMaxP;
 | 
						|
  float strokeRadius;
 | 
						|
 | 
						|
  computeRectangleBounds( offset - strokeSize, borderRadius + strokeSize, maxRadius, size,strokeMinP, strokeMaxP, strokeRadius );
 | 
						|
  float outerStrokeMask = roundedRectangle( strokeMinP, strokeMaxP, UV * size, strokeRadius, sharpness );
 | 
						|
  float strokeMask = outerStrokeMask - fillMask;
 | 
						|
  vec2 strokeUV = tilingOffsetRepeat( UV, strokeUVTransform );
 | 
						|
  vec2 strokeMoved = screenStrokeMultiplyUVMovment * TIME;
 | 
						|
  vec4 screenstrokeMovement = vec4( 0,0, strokeMoved.x, strokeMoved.y );
 | 
						|
  vec2 screenStrokeMultiplyUV = tilingOffsetRepeat( SCREEN_UV, screenStrokeMultiplyUVTransform + screenstrokeMovement );
 | 
						|
  vec4 combinedStrokeColor = strokeColor * texture( stroke, strokeUV ) * texture( screenStrokeMultiply, screenStrokeMultiplyUV );
 | 
						|
 | 
						|
  vec2 fillMaskMinP;
 | 
						|
  vec2 fillMaskMaxP;
 | 
						|
  float fillMaskStrokeRadius;
 | 
						|
 | 
						|
  computeRectangleBounds( offset - strokeSize * 0.5, borderRadius + strokeSize, maxRadius, size, fillMaskMinP, fillMaskMaxP, fillMaskStrokeRadius );
 | 
						|
  float fillAlphaMask = roundedRectangle( fillMaskMinP, fillMaskMaxP, UV * size, fillMaskStrokeRadius, sharpness );
 | 
						|
 | 
						|
 | 
						|
  vec4 strokeLayer = vec4( combinedStrokeColor.rgb, combinedStrokeColor.a );
 | 
						|
  vec4 fillLayer = vec4( combinedfillColor.rgb, combinedfillColor.a * fillAlphaMask );
 | 
						|
 | 
						|
  vec4 strokePM = straightToPremultipliedColor( strokeLayer );
 | 
						|
  vec4 fillPM   = straightToPremultipliedColor( fillLayer );
 | 
						|
 | 
						|
  vec4 outputColor = premultipliedToStraightColor( mix( fillPM, strokePM, strokeMask ) );
 | 
						|
 | 
						|
  float mask = max ( fillMask , strokeMask );
 | 
						|
  mask = fillMask + strokeMask;
 | 
						|
  
 | 
						|
  vec4 tex = texture( TEXTURE, UV );
 | 
						|
 | 
						|
  COLOR = vec4( outputColor.rgb * tex.rgb, outputColor.a * mask * opacity * tex.a);
 | 
						|
 | 
						|
	// Called for every pixel the material is visible on.
 | 
						|
}
 | 
						|
 | 
						|
//void light() {
 | 
						|
	// Called for every pixel for every light affecting the CanvasItem.
 | 
						|
	// Uncomment to replace the default light processing function with this one.
 | 
						|
//}
 |