aboutsummaryrefslogtreecommitdiff
path: root/game/src/Game/Theme/PieChart/LayeredChart.tscn
diff options
context:
space:
mode:
author Nemrav <>2023-07-29 03:07:02 +0200
committer Hop311 <hop3114@gmail.com>2023-08-09 20:02:01 +0200
commit505176d9cabe76cff7cdac6b4d4ef1c77ccb00d9 (patch)
treeeed289104a5fc476e9033d88fc74865d109e66bb /game/src/Game/Theme/PieChart/LayeredChart.tscn
parentff0d38b5d53fa95609f2587a2be5205f0c0d3118 (diff)
add piecharts
Diffstat (limited to 'game/src/Game/Theme/PieChart/LayeredChart.tscn')
-rw-r--r--game/src/Game/Theme/PieChart/LayeredChart.tscn249
1 files changed, 249 insertions, 0 deletions
diff --git a/game/src/Game/Theme/PieChart/LayeredChart.tscn b/game/src/Game/Theme/PieChart/LayeredChart.tscn
new file mode 100644
index 0000000..9382483
--- /dev/null
+++ b/game/src/Game/Theme/PieChart/LayeredChart.tscn
@@ -0,0 +1,249 @@
+[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<stopAngles.length();i++){
+ if(theta <= stopAngles[i]){
+ float gradient = parabola(gradient_base,dist,gradient_falloff);
+ COLOR = vec4(colours[i]*(1.0-gradient),1.0);
+ break;
+ }
+ }
+ }
+ // outer trim
+ else if(dist <= radius){
+ COLOR = vec4(trim_colour,1.0);
+ }
+ //outside the circle
+ else{
+ COLOR = vec4(0.1,0.1,0.1,shadow_gradient);
+ }
+}"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_6ril8"]
+resource_name = "Piechart_shader"
+shader = SubResource("Shader_ojesc")
+shader_parameter/radius = 0.4
+shader_parameter/shadow_displacement = Vector2(0.6, 0.6)
+shader_parameter/shadow_tightness = 2.0
+shader_parameter/shadow_radius = 0.75
+shader_parameter/shadow_thickness = 1.0
+shader_parameter/stopAngles = [3.14159, 5.02655, 6.28319]
+shader_parameter/colours = [Vector3(0, 0, 1), Vector3(1, 1, 0), Vector3(0.4, 0, 0.6)]
+shader_parameter/trim_colour = Vector3(0, 0, 0)
+shader_parameter/trim_size = 0.02
+shader_parameter/gradient_falloff = 3.6
+shader_parameter/gradient_base = 3.1
+shader_parameter/donut = false
+shader_parameter/donut_inner_trim = true
+shader_parameter/donut_inner_radius = 0.051
+
+[sub_resource type="CanvasTexture" id="CanvasTexture_pwdgy"]
+
+[sub_resource type="Shader" id="Shader_vq8ad"]
+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<stopAngles.length();i++){
+ if(theta <= stopAngles[i]){
+ float gradient = parabola(gradient_base,dist,gradient_falloff);
+ COLOR = vec4(colours[i]*(1.0-gradient),1.0);
+ break;
+ }
+ }
+ }
+ // outer trim
+ else if(dist <= radius){
+ COLOR = vec4(trim_colour,1.0);
+ }
+ //outside the circle
+ else{
+ COLOR = vec4(0.1,0.1,0.1,shadow_gradient);
+ }
+}"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_5ilmo"]
+resource_name = "Piechart_shader"
+shader = SubResource("Shader_vq8ad")
+shader_parameter/radius = 0.4
+shader_parameter/shadow_displacement = Vector2(0.75, 0.75)
+shader_parameter/shadow_tightness = 10.0
+shader_parameter/shadow_radius = 0.0
+shader_parameter/shadow_thickness = 1.0
+shader_parameter/stopAngles = [3.14159, 5.02655, 6.28319]
+shader_parameter/colours = [Vector3(0, 0, 1), Vector3(1, 1, 0), Vector3(0.4, 0, 0.6)]
+shader_parameter/trim_colour = Vector3(0, 0, 0)
+shader_parameter/trim_size = 0.02
+shader_parameter/gradient_falloff = 3.6
+shader_parameter/gradient_base = 3.1
+shader_parameter/donut = true
+shader_parameter/donut_inner_trim = true
+shader_parameter/donut_inner_radius = 0.2
+
+[sub_resource type="CanvasTexture" id="CanvasTexture_x3pc8"]
+
+[node name="LayeredChart" type="CenterContainer"]
+offset_right = 50.0
+offset_bottom = 50.0
+script = ExtResource("1_wxoci")
+
+[node name="PieChart" parent="." instance=ExtResource("1_cdu1k")]
+material = SubResource("ShaderMaterial_6ril8")
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+texture = SubResource("CanvasTexture_pwdgy")
+donut_inner_radius = 0.102
+shadow_focus = 2.0
+shadow_radius = 0.75
+
+[node name="PieChart2" parent="." instance=ExtResource("1_cdu1k")]
+material = SubResource("ShaderMaterial_5ilmo")
+layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
+texture = SubResource("CanvasTexture_x3pc8")
+donut = true
+donut_inner_radius = 0.4
+shadow_displacement = Vector2(0.75, 0.75)
+shadow_focus = 10.0
+shadow_radius = 0.0