feat: scale village queries and enrich Jajce center

This commit is contained in:
Rijad Zuzo
2026-07-16 23:51:08 +02:00
parent 4be72639d8
commit 2c88ed6ea8
48 changed files with 2059 additions and 280 deletions
+70
View File
@@ -0,0 +1,70 @@
// Adapted for The Steward from the bundled Terrain3D particle-grass example.
shader_type spatial;
render_mode skip_vertex_transform, cull_disabled, blend_mix;
const int MAX_INTERACTORS = 8;
uniform vec2 wind_direction = vec2(1.0, 0.7);
uniform vec3 base_color : source_color = vec3(0.16, 0.31, 0.08);
uniform vec3 tip_color : source_color = vec3(0.54, 0.68, 0.24);
uniform float wind_amount : hint_range(0.0, 1.0) = 0.34;
uniform int interactor_count : hint_range(0, 8) = 0;
uniform vec3 interactor_positions[MAX_INTERACTORS];
uniform float interaction_radius : hint_range(0.25, 4.0) = 1.8;
uniform float interaction_strength : hint_range(0.0, 2.0) = 0.75;
varying vec4 grass_data;
varying float pressed_weight;
void vertex() {
grass_data[2] = VERTEX.y + 0.55;
grass_data[2] *= grass_data[2];
VERTEX.xz *= 1.0 - grass_data[2];
COLOR = mix(COLOR, vec4(1.0), smoothstep(0.9, 1.0, grass_data[2]));
COLOR *= INSTANCE_CUSTOM[3] < 0.35 ? 1.0 : mix(1.0, 0.75, smoothstep(0.35, 0.0, grass_data[2]));
grass_data.rg = INSTANCE_CUSTOM.rg;
vec3 world_vertex = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
float scale = pow(INSTANCE_CUSTOM[3] * INSTANCE_CUSTOM[3], 0.707);
float force = INSTANCE_CUSTOM[2] * grass_data[2] * scale * wind_amount;
force -= fract(force * 256.0) * force * 0.05;
force = pow(max(force, 0.0), 0.707);
float lateral_wobble = sin(TIME * 2.0 * (1.0 + grass_data.r + grass_data.g)) * 0.2 * (1.0 - INSTANCE_CUSTOM[2]);
vec2 direction = normalize(wind_direction);
world_vertex.xz -= (vec2(-direction.y, direction.x) * lateral_wobble + direction) * force;
world_vertex.y -= INSTANCE_CUSTOM[2] * force * grass_data[2];
grass_data[3] = force;
pressed_weight = 0.0;
for (int index = 0; index < MAX_INTERACTORS; index++) {
if (index >= interactor_count) {
break;
}
vec2 offset = world_vertex.xz - interactor_positions[index].xz;
float distance_to_actor = length(offset);
float influence = 1.0 - smoothstep(0.25, interaction_radius, distance_to_actor);
vec2 away = offset / max(distance_to_actor, 0.08);
world_vertex.xz += away * influence * interaction_strength * grass_data[2];
world_vertex.y -= influence * 0.28 * grass_data[2];
pressed_weight = max(pressed_weight, influence);
}
VERTEX = (VIEW_MATRIX * vec4(world_vertex, 1.0)).xyz;
NORMAL = MODELVIEW_NORMAL_MATRIX * NORMAL;
BINORMAL = MODELVIEW_NORMAL_MATRIX * BINORMAL;
TANGENT = MODELVIEW_NORMAL_MATRIX * TANGENT;
}
void fragment() {
vec3 color = mix(base_color, tip_color, grass_data[2] * 0.62);
color.rg *= grass_data.rg * 0.18 + 0.91;
color *= pow(COLOR.rgb, vec3(2.2));
ALBEDO = mix(color, base_color * 0.72, pressed_weight * 0.42);
float specular_roughness = clamp(max(grass_data[2], grass_data[3]), 0.0, 1.0);
ROUGHNESS = 1.0 - specular_roughness * 0.22;
SPECULAR = clamp(specular_roughness * 0.2, 0.0, 0.12);
BACKLIGHT = tip_color * 0.24;
}
@@ -0,0 +1 @@
uid://3ayekivfakfr
@@ -0,0 +1,14 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=3]
[ext_resource type="Shader" path="res://world/jajce/materials/cozy_grass.gdshader" id="1_grass"]
[resource]
render_priority = 0
shader = ExtResource("1_grass")
shader_parameter/wind_direction = Vector2(1, 0.7)
shader_parameter/base_color = Vector3(0.16, 0.31, 0.08)
shader_parameter/tip_color = Vector3(0.54, 0.68, 0.24)
shader_parameter/wind_amount = 0.34
shader_parameter/interactor_count = 0
shader_parameter/interaction_radius = 1.8
shader_parameter/interaction_strength = 0.75
@@ -0,0 +1,47 @@
[gd_resource type="ShaderMaterial" load_steps=4 format=3]
[ext_resource type="Shader" path="res://addons/terrain_3d/extras/particle_example/particles.gdshader" id="1_process_shader"]
[sub_resource type="FastNoiseLite" id="FastNoise_grass"]
noise_type = 2
frequency = 0.018
cellular_return_type = 4
[sub_resource type="NoiseTexture2D" id="NoiseTexture_grass"]
seamless = true
noise = SubResource("FastNoise_grass")
[resource]
shader = ExtResource("1_process_shader")
shader_parameter/main_noise = SubResource("NoiseTexture_grass")
shader_parameter/main_noise_scale = 0.012
shader_parameter/position_offset = Vector3(0, 0.22, 0)
shader_parameter/align_to_normal = true
shader_parameter/normal_strength = 0.22
shader_parameter/random_rotation = true
shader_parameter/random_spacing = 0.72
shader_parameter/min_scale = Vector3(0.09, 0.22, 0.09)
shader_parameter/max_scale = Vector3(0.13, 0.48, 0.13)
shader_parameter/noise_scale = 0.0041
shader_parameter/wind_speed = 0.022
shader_parameter/wind_strength = 0.6
shader_parameter/wind_dithering = 4.0
shader_parameter/wind_direction = Vector2(1, 0.7)
shader_parameter/clod_scale_boost = 0.18
shader_parameter/clod_min_threshold = 0.32
shader_parameter/clod_max_threshold = 0.78
shader_parameter/patch_min_threshold = 0.08
shader_parameter/patch_max_threshold = 0.42
shader_parameter/condition_dither_range = 0.18
shader_parameter/surface_slope_min = 0.88
shader_parameter/distance_fade_ammount = 0.7
shader_parameter/max_dist = 1.0
shader_parameter/camera_position = Vector3(0, 0, 0)
shader_parameter/instance_rows = 1
shader_parameter/instance_spacing = 0.703125
shader_parameter/_background_mode = 0
shader_parameter/_vertex_spacing = 1.0
shader_parameter/_vertex_density = 1.0
shader_parameter/_region_size = 1024.0
shader_parameter/_region_texel_size = 0.000976563
shader_parameter/_region_map_size = 32
+30 -42
View File
@@ -1,54 +1,42 @@
shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx;
render_mode blend_mix, depth_prepass_alpha, cull_disabled, diffuse_burley, specular_schlick_ggx;
uniform float wave_strength : hint_range(0.0, 0.5) = 0.08;
uniform float wave_speed : hint_range(0.0, 5.0) = 0.8;
uniform float flow_speed : hint_range(0.0, 3.0) = 0.6;
uniform vec3 deep_color : source_color = vec3(0.06, 0.24, 0.38);
uniform vec3 shallow_color : source_color = vec3(0.18, 0.44, 0.58);
uniform vec3 foam_color : source_color = vec3(0.82, 0.88, 0.86);
uniform float rim_power : hint_range(0.5, 5.0) = 2.5;
uniform float sparkle_strength : hint_range(0.0, 1.0) = 0.12;
uniform float wave_strength : hint_range(0.0, 0.3) = 0.055;
uniform float wave_speed : hint_range(0.0, 3.0) = 0.72;
uniform float flow_speed : hint_range(0.0, 2.0) = 0.46;
uniform vec3 deep_color : source_color = vec3(0.03, 0.39, 0.45);
uniform vec3 shallow_color : source_color = vec3(0.07, 0.67, 0.64);
uniform vec3 sunlit_color : source_color = vec3(0.55, 0.95, 0.78);
uniform vec3 foam_color : source_color = vec3(0.82, 0.94, 0.84);
uniform vec3 sun_direction = vec3(0.4, 0.8, 0.4);
void vertex() {
vec3 pos = VERTEX;
float wave_a = sin(pos.x * 0.35 + pos.z * 0.25 + TIME * wave_speed) * wave_strength;
float wave_b = cos(pos.x * 0.45 - pos.z * 0.55 + TIME * wave_speed * 0.7) * wave_strength * 0.6;
float wave_c = sin(pos.z * 0.7 + TIME * wave_speed * 1.3) * wave_strength * 0.35;
pos.y += wave_a + wave_b + wave_c;
VERTEX = pos;
float broad_wave = sin(VERTEX.x * 0.42 + VERTEX.z * 0.18 + TIME * wave_speed);
float crossing_wave = cos(VERTEX.x * 0.7 - VERTEX.z * 0.31 + TIME * wave_speed * 0.73);
VERTEX.y += (broad_wave + crossing_wave * 0.45) * wave_strength;
}
void fragment() {
vec3 view_dir = VIEW;
vec3 normal = NORMAL;
vec3 view_norm = normalize(view_dir);
vec2 flowing_uv = UV * vec2(7.0, 10.0);
flowing_uv.y -= TIME * flow_speed;
float ribbon_a = sin(flowing_uv.y + sin(flowing_uv.x * 0.72) * 1.25) * 0.5 + 0.5;
float ribbon_b = sin(flowing_uv.y * 1.7 - flowing_uv.x * 0.55 + TIME * 0.23) * 0.5 + 0.5;
float quiet_ripple = smoothstep(0.72, 0.98, ribbon_a * 0.62 + ribbon_b * 0.38);
float fresnel = pow(1.0 - clamp(dot(normalize(NORMAL), normalize(VIEW)), 0.0, 1.0), 2.4);
float bank_distance = min(UV.x, 1.0 - UV.x);
float bank_foam = 1.0 - smoothstep(0.0, 0.07, bank_distance);
bank_foam *= 0.72 + sin(UV.y * 52.0 + TIME * 0.35) * 0.12;
float rim = 1.0 - abs(dot(normal, view_norm));
rim = pow(rim, rim_power);
rim = smoothstep(0.15, 0.7, rim);
vec2 uv = UV;
uv.x += TIME * flow_speed * 0.4;
uv.y += TIME * flow_speed * 0.3;
float flow_a = sin(uv.x * 8.0 + uv.y * 5.0) * 0.5 + 0.5;
float flow_b = cos(uv.y * 6.0 - uv.x * 4.0 + TIME * 0.25) * 0.5 + 0.5;
float flow = mix(flow_a, flow_b, 0.5);
vec3 water_color = mix(deep_color, shallow_color, flow * 0.6 + 0.2);
water_color = mix(water_color, foam_color, rim * 0.65);
vec3 half_vec = normalize(view_norm + normalize(sun_direction));
float specular = pow(max(dot(normal, half_vec), 0.0), 120.0);
specular *= smoothstep(0.4, 0.85, rim);
float sparkle = specular * sparkle_strength;
vec3 water_color = mix(deep_color, shallow_color, ribbon_a * 0.2 + 0.48);
water_color = mix(water_color, sunlit_color, fresnel * 0.42);
water_color = mix(water_color, foam_color, quiet_ripple * 0.05);
water_color = mix(water_color, foam_color, bank_foam * 0.3);
ALBEDO = water_color;
METALLIC = 0.08;
ROUGHNESS = 0.22;
EMISSION = water_color * 0.04 + foam_color * sparkle;
ALPHA = 0.76;
ALPHA_SCISSOR_THRESHOLD = 0.0;
ROUGHNESS = mix(0.34, 0.5, ribbon_b);
SPECULAR = 0.38;
EMISSION = water_color * 0.12 + sunlit_color * (quiet_ripple * 0.05 + fresnel * 0.03);
EMISSION += foam_color * bank_foam * 0.025;
ALPHA = mix(0.94, 0.99, fresnel);
}
+27 -39
View File
@@ -1,50 +1,38 @@
shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx;
render_mode blend_mix, depth_prepass_alpha, cull_disabled, diffuse_burley, specular_schlick_ggx;
uniform float scroll_speed : hint_range(0.0, 4.0) = 1.35;
uniform vec3 shadow_color : source_color = vec3(0.075, 0.33, 0.34);
uniform vec3 water_color : source_color = vec3(0.31, 0.68, 0.64);
uniform vec3 light_color : source_color = vec3(0.78, 0.94, 0.83);
uniform vec3 foam_color : source_color = vec3(0.91, 0.97, 0.9);
uniform float scroll_speed : hint_range(0.0, 5.0) = 1.8;
uniform vec3 deep_color : source_color = vec3(0.1, 0.45, 0.55);
uniform vec3 mid_color : source_color = vec3(0.45, 0.78, 0.82);
uniform vec3 foam_color : source_color = vec3(0.9, 0.95, 0.95);
uniform float foam_contrast : hint_range(0.5, 4.0) = 2.2;
uniform float sparkle_strength : hint_range(0.0, 0.8) = 0.25;
void vertex() {
float edge_weight = 1.0 - abs(UV.x * 2.0 - 1.0);
float curtain_wobble = sin(UV.y * 13.0 - TIME * 2.2 + UV.x * 8.0) * 0.05;
VERTEX.z += curtain_wobble * edge_weight;
}
void fragment() {
vec2 uv = UV;
uv.y += TIME * scroll_speed;
vec2 flow_uv = UV;
flow_uv.y += TIME * scroll_speed;
float long_thread = sin(flow_uv.x * 32.0 + sin(flow_uv.y * 3.1) * 2.4) * 0.5 + 0.5;
float soft_thread = sin(flow_uv.x * 13.0 - flow_uv.y * 7.0) * 0.5 + 0.5;
float falling_detail = sin(flow_uv.y * 27.0 + flow_uv.x * 7.0) * 0.5 + 0.5;
float thread = smoothstep(0.36, 0.9, long_thread * 0.6 + soft_thread * 0.4);
float broken_foam = smoothstep(0.72, 0.98, falling_detail * thread);
float base_foam = smoothstep(0.58, 1.0, UV.y);
float edge_fade = smoothstep(0.0, 0.08, UV.x) * smoothstep(1.0, 0.92, UV.x);
float band_a = fract(uv.y * 5.0 + sin(uv.x * 2.0) * 0.15);
band_a = smoothstep(0.2, 0.55, band_a) * smoothstep(0.8, 0.45, band_a);
float band_b = fract(uv.y * 3.5 + cos(uv.x * 2.5 + TIME * 0.3) * 0.12);
band_b = smoothstep(0.1, 0.5, band_b) * smoothstep(0.85, 0.4, band_b);
float foam_a = fract(uv.y * 4.0);
foam_a = pow(smoothstep(0.0, 0.12, foam_a) * smoothstep(0.3, 0.15, foam_a), foam_contrast);
float foam_b = fract(uv.y * 6.0 + uv.x * 1.5);
foam_b = pow(smoothstep(0.5, 0.58, foam_b) * smoothstep(0.7, 0.6, foam_b), foam_contrast * 0.8);
float foam = foam_a * 0.7 + foam_b * 0.3;
vec3 base = mix(deep_color, mid_color, band_a * 0.5 + band_b * 0.3);
vec3 color = mix(base, foam_color, foam);
float sparkle = pow(foam_a, 3.0) * sparkle_strength;
float highlight = band_a * band_b * 0.35;
float emission_value = sparkle + highlight * 0.3;
vec3 color = mix(shadow_color, water_color, 0.5 + thread * 0.35);
color = mix(color, light_color, broken_foam * 0.5);
color = mix(color, foam_color, base_foam * (0.38 + broken_foam * 0.42));
ALBEDO = color;
ALPHA = mix(0.25, 0.78, foam * 0.7 + 0.15);
EMISSION = color * emission_value;
METALLIC = 0.05;
ROUGHNESS = 0.15;
vec3 normal = NORMAL;
vec3 view_dir = VIEW;
vec3 view_norm = normalize(view_dir);
float rim = 1.0 - abs(dot(normal, view_norm));
ALPHA = mix(ALPHA, ALPHA * 0.5, rim * 0.6);
ROUGHNESS = mix(0.16, 0.32, broken_foam);
SPECULAR = 0.65;
EMISSION = light_color * (broken_foam * 0.07 + base_foam * 0.04);
ALPHA = edge_fade * mix(0.62, 0.9, thread * 0.56 + base_foam * 0.3);
}