immersive-home/app/content/system/house/mini/mini_wall_shader.gdshader

64 lines
1.6 KiB
Plaintext
Raw Normal View History

2024-04-05 20:29:18 +03:00
shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_disabled, diffuse_lambert, specular_schlick_ggx, unshaded;
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;
varying vec3 color;
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() {
color = vec3(1.0, 1.0, 1.0);
if(data_size > 0) {
float distances[100];
float dist_sum = 0.0;
float data_sum = 0.0;
float closest_dist = -1.0;
int closest_index = 0;
// Calculate Global Coordinates
//vec3 world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
closest_dist = distance(data[0].xyz, VERTEX);
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++) {
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-04-05 20:29:18 +03:00
float dist = distance(data[i].xyz, VERTEX);
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-04-07 15:17:52 +03:00
float value = (1.0 / dist_sum) * data_sum;
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() {
ALBEDO = vec3(color.xyz);
ALPHA = alpha;
2024-04-05 20:29:18 +03:00
}