vfx-water-ripple

Creates animated normal-distortion water ripples on a plane using a Godot spatial shader and GDScript controller.

66|4|Updated Feb 26, 2026
One-click install
npx skills add https://github.com/SummerEngine/summer --skill vfx-water-ripple-summerengine
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: vfx-water-ripple
Source: https://github.com/SummerEngine/summer/tree/main/library/skills/vfx-water-ripple
Command: npx skills add https://github.com/SummerEngine/summer --skill vfx-water-ripple-summerengine

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Static water surfaces in games look lifeless when rain, footsteps, bullets, or fish fail to disturb them. This Skill implements impact-triggered, expanding ripple rings on a water plane in Summer Engine (Godot 4.6+), with correct normal distortion so ripples actually refract reflections. ## Core Features & Use Cases - Ring-buffer ripple shader: A spatial shader tracks up to 16 simultaneous ripples as (origin, time, amplitude) tuples, displacing vertices and compositing ripple normals over a scrolling base water normal map. - One-call GDScript API: The WaterRippleSurface controller exposes add_ripple(world_pos, amplitude) so rain systems, footstep callbacks, and projectile impacts spawn ripples with a single call. - Named variants: Cookbook presets for puddle-shallow, lake-calm, lava-glow, and blood-pool retune speed, lifetime, wavelength, and color. - Use Case: When the player walks through a puddle, call puddle.add_ripple(global_position, 0.5) from the footstep callback to spawn an expanding refractive ring at the exact contact point. ## Quick Start Ask your agent to add impact ripples to the water plane in the main scene using the vfx-water-ripple recipe, then verify with summer_play and the debugger.

Frequently Asked Questions about vfx-water-ripple

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I add ripples when a player walks through water in Godot?

Attach the WaterRippleSurface controller to a MeshInstance3D with a subdivided PlaneMesh, then call add_ripple(global_position, 0.5) from your character's footstep callback. Use contains_point() to check the player is over the water surface first.

How to make rain create ripples on a water surface shader?

Spawn ripples from a Rain node by calling add_ripple at random positions inside the puddle bounds with low amplitude around 0.2. Throttle to roughly 5 ripples per second so the fixed 16-slot shader buffer is not flooded.

Why do my shader ripples disappear after an hour of runtime?

Godot's shader TIME wraps at rendering/limits/time/time_rollover_secs (3600 seconds by default), sending ripple ages negative. Drive ripple timing from your own accumulated clock pushed as a uniform every frame instead of comparing against TIME.

Can this ripple shader work on a wavy ocean or Gerstner water?

No, this shader assumes a flat water plane. For wavy water, sample the wave height in the same shader and add ripple displacement on top, or use a dedicated ocean-water recipe for large-scale waves.

What are the limitations of the water ripple ring buffer?

The shader holds a fixed maximum of 16 simultaneous ripples; older entries are overwritten when full. Raise MAX_RIPPLES in both the GLSL constant and GDScript together, or throttle spawn rates for heavy rain.

Why does my water surface look permanently tilted after assigning NORMAL_MAP?

The engine decodes NORMAL_MAP again with normal_map.xy * 2.0 - 1.0, so writing an already-decoded ±1 vector causes permanent maximum tilt. Re-encode the normal with * 0.5 + 0.5 before assigning, as the shader does.