[gd_scene load_steps=9 format=3 uid="uid://ct48qux7spi6u"] [ext_resource type="PackedScene" uid="uid://cr7p1k2xm7mum" path="res://src/Game/Theme/PieChart/PieChart.tscn" id="1_cdu1k"] [ext_resource type="Script" path="res://src/Game/Theme/PieChart/LayeredChart.gd" id="1_wxoci"] [sub_resource type="Shader" id="Shader_ojesc"] code = "shader_type canvas_item; // The center in UV coordinates, which will always //be 0.5, the actual radius will be controlled by the control node //const vec2 center = vec2(0.5,0.5); uniform float radius = 0.4; //shadow uniform vec2 shadow_displacement = vec2(0.75,0.75); uniform float shadow_tightness = 10; uniform float shadow_radius = 0.7; uniform float shadow_thickness = 1.0; // Control of the slices uniform float stopAngles[5]; uniform vec3 colours[5]; // Trim uniform vec3 trim_colour; uniform float trim_size = 0.05; // The center is spotlighted by the gradient, //control its size and falloff with these uniform float gradient_falloff = 3.6; uniform float gradient_base = 3.1; // control whether this is a donut instead of a pie chart uniform bool donut = false; uniform bool donut_inner_trim = false; uniform float donut_inner_radius = 0.15; // get the polar coordinates of a pixel relative to the center vec2 getPolar(vec2 UVin, vec2 center){ vec2 relcoord = (UVin-center); float dist = length(relcoord); float theta = PI/2.0 + atan((relcoord.y)/(relcoord.x)); if(UVin.x < 0.5){ theta += PI; } return vec2(dist,theta); } // from thebookofshaders, returns a gradient falloff float parabola( float base, float x, float k ){ return pow( base*x*(1.0-x), k ); } float parabola_shadow(float base, float x){ return base*x*x; } void fragment() { vec2 coords = getPolar(UV,vec2(0.5,0.5)); float dist = coords.x; float theta = coords.y; vec2 shadow_polar = getPolar(UV,vec2(0.0+shadow_displacement.x,0.0+shadow_displacement.y)); float shadow_peak = radius+(radius-donut_inner_radius)/2.0; float shadow_gradient = shadow_thickness+parabola_shadow(shadow_tightness*-10.0,shadow_polar.x+shadow_peak-shadow_radius); // inner hole of the donut => make it transparent if(donut && dist <= donut_inner_radius){ COLOR = vec4(0.1,0.1,0.1,shadow_gradient); } // inner trim else if(donut && donut_inner_trim && dist <= donut_inner_radius + trim_size){ COLOR = vec4(trim_colour,1.0); } // interior else if(dist <= radius-trim_size){ for(int i=0;i