2024-04-05 20:29:18 +03:00
|
|
|
shader_type spatial;
|
2024-05-26 23:22:26 +03:00
|
|
|
render_mode blend_mix, cull_back, diffuse_burley, specular_schlick_ggx;
|
2024-04-05 20:29:18 +03:00
|
|
|
|
|
|
|
uniform vec4 data[100];
|
|
|
|
uniform int data_size: hint_range(0, 100, 1);
|
2024-04-07 15:17:52 +03:00
|
|
|
uniform float alpha: hint_range(0.0, 1.0, 0.1) = 0.3;
|
2024-04-05 20:29:18 +03:00
|
|
|
uniform sampler2D color_gradient;
|
|
|
|
|
2024-05-26 23:22:26 +03:00
|
|
|
uniform float roughness : hint_range(0.0, 1.0) = 0.85;
|
2024-04-23 00:47:56 +03:00
|
|
|
uniform vec4 edge_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
|
|
|
|
|
2024-04-05 20:29:18 +03:00
|
|
|
varying vec3 color;
|
2024-05-26 23:22:26 +03:00
|
|
|
varying vec2 aspect_ratio;
|
2024-04-05 20:29:18 +03:00
|
|
|
|
2024-04-07 15:17:52 +03:00
|
|
|
float simple_weight(int index, vec3 world_pos, float p) {
|
|
|
|
return 1.0 / pow(distance(data[index].xyz, world_pos), p);
|
|
|
|
}
|
2024-04-05 20:29:18 +03:00
|
|
|
|
2024-04-07 15:17:52 +03:00
|
|
|
float sphere_weight(int index, vec3 world_pos, float r) {
|
|
|
|
float dist = distance(data[index].xyz, world_pos);
|
|
|
|
return pow(max(0, r - dist) / (r * dist), 2);
|
|
|
|
}
|
2024-04-05 20:29:18 +03:00
|
|
|
|
|
|
|
void vertex() {
|
2024-05-12 18:29:56 +03:00
|
|
|
color = vec3(0.9, 0.9, 0.9);
|
2024-05-26 23:22:26 +03:00
|
|
|
aspect_ratio = CUSTOM0.rg;
|
2024-05-22 19:38:28 +03:00
|
|
|
|
2024-04-05 20:29:18 +03:00
|
|
|
if(data_size > 0) {
|
2024-04-10 14:23:17 +03:00
|
|
|
float distances[100];
|
|
|
|
float dist_sum = 0.0;
|
|
|
|
float data_sum = 0.0;
|
2024-05-22 19:38:28 +03:00
|
|
|
|
2024-04-10 14:23:17 +03:00
|
|
|
float closest_dist = -1.0;
|
|
|
|
int closest_index = 0;
|
2024-05-22 19:38:28 +03:00
|
|
|
|
2024-04-10 14:23:17 +03:00
|
|
|
closest_dist = distance(data[0].xyz, VERTEX);
|
2024-05-22 19:38:28 +03:00
|
|
|
|
2024-04-07 15:17:52 +03:00
|
|
|
// Inverse distance weighting using Shepard's method
|
2024-04-05 20:29:18 +03:00
|
|
|
for(int i = 0; i < data_size; i++) {
|
2024-04-10 14:23:17 +03:00
|
|
|
distances[i] = sphere_weight(i, VERTEX, 5.0);
|
2024-04-07 15:17:52 +03:00
|
|
|
dist_sum += distances[i];
|
|
|
|
data_sum += distances[i] * data[i].w;
|
2024-05-22 19:38:28 +03:00
|
|
|
|
2024-04-10 14:23:17 +03:00
|
|
|
float dist = distance(data[i].xyz, VERTEX);
|
2024-05-22 19:38:28 +03:00
|
|
|
|
2024-04-07 15:17:52 +03:00
|
|
|
if(dist < closest_dist) {
|
|
|
|
closest_dist = dist;
|
|
|
|
closest_index = i;
|
|
|
|
}
|
2024-04-05 20:29:18 +03:00
|
|
|
}
|
2024-05-22 19:38:28 +03:00
|
|
|
|
2024-04-07 15:17:52 +03:00
|
|
|
float value = (1.0 / dist_sum) * data_sum;
|
2024-05-22 19:38:28 +03:00
|
|
|
|
2024-04-07 15:17:52 +03:00
|
|
|
if( value > 0.0 || value < 1.0) {
|
|
|
|
color.xyz = texture(color_gradient, vec2(value, 0)).xyz;
|
|
|
|
} else {
|
|
|
|
color.xyz = texture(color_gradient, vec2(data[closest_index].w, 0)).xyz;
|
2024-04-05 20:29:18 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void fragment() {
|
2024-04-23 00:47:56 +03:00
|
|
|
ROUGHNESS = roughness;
|
2024-05-24 22:08:27 +03:00
|
|
|
DEPTH = FRAGCOORD.z + 0.0001;
|
2024-05-26 23:22:26 +03:00
|
|
|
ALBEDO = vec3(color.xyz);
|
|
|
|
|
|
|
|
vec2 pos = vec2(UV.x * aspect_ratio.x, UV.y * aspect_ratio.y);
|
|
|
|
float border = 0.05;
|
|
|
|
|
|
|
|
if (pos.x <= border) {
|
|
|
|
ALBEDO = mix(vec3(0.0), ALBEDO, pos.x / border);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pos.x >= aspect_ratio.x - border) {
|
|
|
|
ALBEDO = mix(vec3(0.0), ALBEDO, 1.0 - (pos.x - (aspect_ratio.x - border)) / border);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pos.y <= border) {
|
|
|
|
ALBEDO = mix(vec3(0.0), ALBEDO, pos.y / border);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pos.y >= aspect_ratio.y - border) {
|
|
|
|
ALBEDO = mix(vec3(0.0), ALBEDO, 1.0 - (pos.y - (aspect_ratio.y - border)) / border);
|
|
|
|
}
|
2024-04-25 16:40:56 +03:00
|
|
|
}
|