extends Spatial # Saves every frame as a PNG in the project directory. Use for debugging (with caution) export var output_debug_textures := false export var first_output_frame := 0 export var plane_size := 2.0 var _frame_number := 0 var _positions_to_set = [] func set_depth_at_position(pos: Vector3, depth: float): # Transform the global position into 2D points on the water surface with values between 0 and 1 pos -= translation var position_2d = Vector2(pos.x, pos.z) position_2d += Vector2(plane_size, plane_size) / 2.0 position_2d /= plane_size if position_2d.x < 1.0 and position_2d.y < 1.0 \ and position_2d.x >= 0.0 and position_2d.y >= 0.0: _positions_to_set.append([position_2d, depth]) func _ready(): $WaterMesh.mesh.size = Vector2(plane_size, plane_size) # Apply the scale and positioning to the collider $WaterMesh/StaticBody.scale.x = plane_size / 2.0 $WaterMesh/StaticBody.scale.y = plane_size / 2.0 $WaterMesh/StaticBody.scale.z = plane_size / 2.0 $WaterMesh/StaticBody.translation.y = 0.6 * 40.0 func _physics_process(delta): # Get result of previous frame var result = $WaterHeights.get_texture() # Set it as the data of the water mesh $WaterMesh.material_override.set_shader_param("water_heights", result) # Calculate a new frame. First, get the data of the last frame and modify it accordingly var image_data = result.get_data() # Set outstanding pixels (after some frames, since the texture isn't initialized until then) if _frame_number >= 60: for position_and_depth in _positions_to_set: var pos = position_and_depth[0] var depth = position_and_depth[1] image_data.lock() image_data.set_pixel(floor(pos.x * 512), floor(pos.y * 512), Color(depth, 0.0, 0.0, 0.0)) image_data.unlock() _positions_to_set.clear() # Create an ImageTexture for this new frame var previous_frame = ImageTexture.new() previous_frame.create_from_image(image_data) # Set the previous texture in the shader so that a new texture will be available next frame $WaterHeights.set_previous_texture(previous_frame) # Debug output if needed if output_debug_textures and _frame_number > first_output_frame: image_data.save_png("res://debugframes/frame%s.png" % [_frame_number]) _frame_number += 1