Added water shader

master
Martin Felis 2021-08-09 00:27:53 +02:00
parent bd3d44a783
commit 4089a582e1
12 changed files with 230 additions and 63 deletions

View File

@ -21,7 +21,7 @@ var draw_island_bbox = false
var zoom_sailing = 1.0 var zoom_sailing = 1.0
var zoom_birdy = 4 var zoom_birdy = 4
var game_num_islands = 4 var game_num_islands = 1
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready():

View File

@ -6,12 +6,32 @@
[node name="Menu" type="Node2D"] [node name="Menu" type="Node2D"]
script = ExtResource( 1 ) script = ExtResource( 1 )
[node name="CanvasLayer" type="CanvasLayer" parent="."] [node name="Camera2D" type="Camera2D" parent="."]
anchor_mode = 0
current = true
[node name="HBoxContainer2" type="HBoxContainer" parent="CanvasLayer"] [node name="VBoxContainer" type="VBoxContainer" parent="Camera2D"]
anchor_right = 1.0 rect_scale = Vector2( 0.4, 0.4 )
custom_constants/separation = 64
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="TextureRect" type="TextureRect" parent="Camera2D/VBoxContainer"]
margin_right = 1523.0
margin_bottom = 445.0 margin_bottom = 445.0
rect_scale = Vector2( 0.5, 0.5 ) size_flags_horizontal = 13
size_flags_vertical = 13
texture = ExtResource( 2 )
stretch_mode = 4
[node name="HBoxContainer2" type="HBoxContainer" parent="Camera2D/VBoxContainer"]
margin_top = 509.0
margin_right = 1523.0
margin_bottom = 509.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 5 size_flags_horizontal = 5
size_flags_vertical = 5 size_flags_vertical = 5
alignment = 1 alignment = 1
@ -19,54 +39,35 @@ __meta__ = {
"_edit_use_anchors_": false "_edit_use_anchors_": false
} }
[node name="TextureRect" type="TextureRect" parent="CanvasLayer/HBoxContainer2"] [node name="HBoxContainer" type="HBoxContainer" parent="Camera2D/VBoxContainer"]
margin_top = 573.0
margin_right = 1523.0 margin_right = 1523.0
margin_bottom = 445.0 margin_bottom = 673.0
rect_scale = Vector2( 0.5, 0.5 )
size_flags_horizontal = 13
size_flags_vertical = 13
texture = ExtResource( 2 )
stretch_mode = 1
[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer"]
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
margin_left = -278.0
margin_top = -100.0
margin_right = 278.0
custom_constants/separation = 64
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="HBoxContainer" type="HBoxContainer" parent="CanvasLayer/VBoxContainer"]
margin_right = 556.0
margin_bottom = -300.0
custom_constants/separation = 128 custom_constants/separation = 128
[node name="SimpleButton" type="Button" parent="CanvasLayer/VBoxContainer/HBoxContainer"] [node name="SimpleButton" type="Button" parent="Camera2D/VBoxContainer/HBoxContainer"]
margin_right = 100.0 margin_right = 100.0
margin_bottom = 100.0 margin_bottom = 100.0
rect_min_size = Vector2( 100, 100 ) rect_min_size = Vector2( 100, 100 )
text = "Leicht" text = "Leicht"
[node name="MediumButton" type="Button" parent="CanvasLayer/VBoxContainer/HBoxContainer"] [node name="MediumButton" type="Button" parent="Camera2D/VBoxContainer/HBoxContainer"]
margin_left = 228.0 margin_left = 228.0
margin_right = 328.0 margin_right = 328.0
margin_bottom = 100.0 margin_bottom = 100.0
rect_min_size = Vector2( 100, 100 ) rect_min_size = Vector2( 100, 100 )
text = "Mittel" text = "Mittel"
[node name="HardButton" type="Button" parent="CanvasLayer/VBoxContainer/HBoxContainer"] [node name="HardButton" type="Button" parent="Camera2D/VBoxContainer/HBoxContainer"]
margin_left = 456.0 margin_left = 456.0
margin_right = 556.0 margin_right = 556.0
margin_bottom = 100.0 margin_bottom = 100.0
rect_min_size = Vector2( 100, 100 ) rect_min_size = Vector2( 100, 100 )
text = "Schwer" text = "Schwer"
[connection signal="pressed" from="CanvasLayer/VBoxContainer/HBoxContainer/SimpleButton" to="." method="_on_SimpleButton_pressed"] [node name="CanvasLayer" type="CanvasLayer" parent="."]
[connection signal="pressed" from="CanvasLayer/VBoxContainer/HBoxContainer/MediumButton" to="." method="_on_MediumButton_pressed"] follow_viewport_enable = true
[connection signal="pressed" from="CanvasLayer/VBoxContainer/HBoxContainer/HardButton" to="." method="_on_HardButton_pressed"]
[connection signal="pressed" from="Camera2D/VBoxContainer/HBoxContainer/SimpleButton" to="." method="_on_SimpleButton_pressed"]
[connection signal="pressed" from="Camera2D/VBoxContainer/HBoxContainer/MediumButton" to="." method="_on_MediumButton_pressed"]
[connection signal="pressed" from="Camera2D/VBoxContainer/HBoxContainer/HardButton" to="." method="_on_HardButton_pressed"]

BIN
assets/water.kra Normal file

Binary file not shown.

BIN
assets/water.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

34
assets/water.png.import Normal file
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/water.png-60eb5d11192d61f791951f83acef7554.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/water.png"
dest_files=[ "res://.import/water.png-60eb5d11192d61f791951f83acef7554.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=1
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

3
assets/water.tres Normal file
View File

@ -0,0 +1,3 @@
[gd_resource type="ImageTexture" format=2]
[resource]

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=29 format=2] [gd_scene load_steps=30 format=2]
[ext_resource path="res://scenes/World.gd" type="Script" id=1] [ext_resource path="res://scenes/World.gd" type="Script" id=1]
[ext_resource path="res://scenes/Grid.gd" type="Script" id=2] [ext_resource path="res://scenes/Grid.gd" type="Script" id=2]
@ -18,6 +18,7 @@
[ext_resource path="res://assets/parrot.svg" type="Texture" id=16] [ext_resource path="res://assets/parrot.svg" type="Texture" id=16]
[ext_resource path="res://assets/arrowback.svg" type="Texture" id=17] [ext_resource path="res://assets/arrowback.svg" type="Texture" id=17]
[ext_resource path="res://assets/arrowrepeat.svg" type="Texture" id=18] [ext_resource path="res://assets/arrowrepeat.svg" type="Texture" id=18]
[ext_resource path="res://scenes/Water.tscn" type="PackedScene" id=19]
[sub_resource type="DynamicFont" id=1] [sub_resource type="DynamicFont" id=1]
size = 27 size = 27
@ -71,6 +72,11 @@ scale_curve = SubResource( 8 )
[node name="GameRoot" type="Node"] [node name="GameRoot" type="Node"]
[node name="WaterNode" parent="." instance=ExtResource( 19 )]
position = Vector2( -102.276, -102.208 )
scale = Vector2( 50, 50 )
z_index = -5
[node name="MusicPlayer" type="AudioStreamPlayer" parent="."] [node name="MusicPlayer" type="AudioStreamPlayer" parent="."]
volume_db = -16.124 volume_db = -16.124
autoplay = true autoplay = true
@ -283,7 +289,6 @@ __meta__ = {
} }
[node name="DebugContainer" type="HBoxContainer" parent="World/UI"] [node name="DebugContainer" type="HBoxContainer" parent="World/UI"]
visible = false
anchor_top = 1.0 anchor_top = 1.0
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
@ -464,6 +469,8 @@ render_target_update_mode = 1
[node name="Camera2D" type="Camera2D" parent="IslandMapRenderer"] [node name="Camera2D" type="Camera2D" parent="IslandMapRenderer"]
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[connection signal="value_changed" from="Editor/UI/Editor/IslandIndex" to="Editor" method="_on_IslandIndex_value_changed"] [connection signal="value_changed" from="Editor/UI/Editor/IslandIndex" to="Editor" method="_on_IslandIndex_value_changed"]
[connection signal="pressed" from="Editor/UI/Editor/ClearWorldButton" to="Editor" method="_on_ClearWorldButton_pressed"] [connection signal="pressed" from="Editor/UI/Editor/ClearWorldButton" to="Editor" method="_on_ClearWorldButton_pressed"]
[connection signal="pressed" from="Editor/UI/Editor/LoadWorldButton" to="Editor" method="_on_LoadWorldButton_pressed"] [connection signal="pressed" from="Editor/UI/Editor/LoadWorldButton" to="Editor" method="_on_LoadWorldButton_pressed"]

View File

@ -15,7 +15,6 @@ var obstacles_local_coords = {}
var treasure_local_coords = null var treasure_local_coords = null
var highlight_treasure = false var highlight_treasure = false
var prerender_texture = null var prerender_texture = null
var prerender = false
var render_sprite = null var render_sprite = null
@ -169,25 +168,16 @@ func draw_bsphere():
func _draw(): func _draw():
if prerender or highlight_treasure or render_sprite.texture == null: var transform = get_transform()
print ("Prerendering!")
var transform = get_transform() for coord in tiles.keys():
draw_set_transform (coord + offset_world, 0, Vector2.ONE)
draw_polygon(HexTileDrawer.HexPoints, HexTileDrawer.get_tile_color(tiles[coord]))
for coord in tiles.keys(): if highlight_treasure and treasure_local_coords:
draw_set_transform (coord + offset_world, 0, Vector2.ONE) draw_set_transform (treasure_local_coords + offset_world, 0, Vector2.ONE)
draw_polygon(HexTileDrawer.HexPoints, HexTileDrawer.get_tile_color(tiles[coord])) draw_polygon(HexTileDrawer.HexPoints, HexTileDrawer.create_color_array("#922"))
if highlight_treasure and treasure_local_coords:
draw_set_transform (treasure_local_coords + offset_world, 0, Vector2.ONE)
draw_polygon(HexTileDrawer.HexPoints, HexTileDrawer.create_color_array("#922"))
prerender = false
return
else:
print ("using prerendered")
if Globals.draw_island_bbox: if Globals.draw_island_bbox:
# draw_set_transform(transform.origin, transform.get_rotation(), transform.get_scale()) # draw_set_transform(transform.origin, transform.get_rotation(), transform.get_scale())
draw_rect(rect_world, Color.red, false) draw_rect(rect_world, Color.red, false)

113
scenes/Water.tscn Normal file
View File

@ -0,0 +1,113 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://assets/water.png" type="Texture" id=1]
[ext_resource path="res://scenes/water.gd" type="Script" id=2]
[sub_resource type="Shader" id=1]
code = "shader_type canvas_item;
uniform vec2 tiled_factor = vec2(5.0, 5.0);
uniform float aspect_ratio = 0.5;
uniform float wave_speed = 0.4;
vec4 fragment_tiled_voronoi(vec2 uv) {
vec2 tiled_uvs = uv * tiled_factor;
tiled_uvs.y *= aspect_ratio;
vec2 i_st = floor(tiled_uvs);
vec2 f_st = fract(tiled_uvs);
vec2 point = vec2 (0.2, 0.2);
vec2 diff = point - f_st;
float dist = length(diff);
return vec4(1.0, 0., 0., 1.0);
}
/*
void fragment_old() {
vec2 tiled_uvs = UV * tiled_factor;
tiled_uvs.y *= aspect_ratio;
vec2 uv_offset = vec2(0., 0.);
// uv_offset.x = sin(TIME * wave_speed);
// uv_offset.y = cos(TIME * wave_speed);
tiled_uvs = tiled_uvs;
vec2 uv_repeat = tiled_uvs;
uv_repeat.x = uv_repeat.x - round(uv_repeat.x) + 0.5;
uv_repeat.y = uv_repeat.y - round(uv_repeat.y) + 0.5;
vec2 points[5];
points[0] = vec2(0.83,0.75);
points[1] = vec2(0.60,0.07);
points[2] = vec2(0.28,0.64);
points[3] = vec2(0.31,0.26);
float m_dist = 1.;
for (int i = 0; i < 5; i++) {
float dist = distance (uv_repeat, points[i]);
m_dist = min(m_dist, dist);
}
COLOR = vec4(uv_repeat, 0., 1.);
COLOR = vec4(m_dist, m_dist, m_dist, 1.0);
// COLOR = texture(TEXTURE, uv_repeat);
}
*/
vec2 rand(vec2 co){
return vec2(
fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453),
fract(sin(dot(co.yx ,vec2(12.9898,78.233))) * 43758.5453));
}
void fragment() {
vec2 tiled_uvs = UV * tiled_factor;
tiled_uvs.y *= aspect_ratio;
vec2 i_st = floor(tiled_uvs);
vec2 f_st = fract(tiled_uvs);
float m_dist = 1.;
for (int y = -1; y <= 1; y++) {
for (int x = -1; x <= 1; x++) {
vec2 neighbour = vec2(float(x), float(y));
vec2 point = rand (i_st + neighbour);
point = 0.5 + 0.5 * sin(TIME * 1. + 6.2831 * point);
vec2 diff = neighbour + point - f_st;
float dist = length(diff);
m_dist = min(m_dist, dist);
}
}
vec4 blue_color = vec4(0.04, 0.33, 1.0, 1.);
vec4 m_dist_color = vec4(m_dist, m_dist, m_dist, 1.);
float exponent = 4.;
vec4 color = blue_color + 0.5 * pow(m_dist_color, vec4(exponent, exponent, exponent, 1.));
// vec4 color =
// color += 1.0 - m_dist;
COLOR = vec4(color);
}"
[sub_resource type="ShaderMaterial" id=2]
shader = SubResource( 1 )
shader_param/tiled_factor = Vector2( 300, 300 )
shader_param/aspect_ratio = 0.647
shader_param/wave_speed = 0.4
[node name="Water" type="Node2D"]
[node name="water" type="Sprite" parent="."]
material = SubResource( 2 )
position = Vector2( -0.00827694, 0 )
scale = Vector2( 0.444957, 0.287887 )
texture = ExtResource( 1 )
script = ExtResource( 2 )
[connection signal="item_rect_changed" from="water" to="water" method="calculate_aspect_ratio"]

View File

@ -240,13 +240,6 @@ func place_treasure():
treasure_island.update() treasure_island.update()
# Creates a viewport and sets up the scene to render the
# island
func island_prerender_setup():
for island in Islands.get_children():
pass
func prerender_island(island): func prerender_island(island):
var render_island = Island.new() var render_island = Island.new()
render_island.tiles = island.tiles.duplicate() render_island.tiles = island.tiles.duplicate()
@ -372,7 +365,7 @@ func generate():
print ("Could not place island! steps: " + str(overlap_retry_num)) print ("Could not place island! steps: " + str(overlap_retry_num))
else: else:
print ("Placed after " + str(overlap_retry_num) + " retries.") print ("Placed after " + str(overlap_retry_num) + " retries.")
prerender_island(island) # prerender_island(island)
Islands.add_child(island) Islands.add_child(island)
num_islands = Islands.get_child_count() num_islands = Islands.get_child_count()

14
scenes/water.gd Normal file
View File

@ -0,0 +1,14 @@
tool
extends Sprite
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
func calculate_aspect_ratio():
material.set_shader_param("aspect_ratio", scale.y / scale.x)

12
shaders/water.shader Normal file
View File

@ -0,0 +1,12 @@
shader_type canvas_item;
uniform vec2 tiled_factor = vec2(5.0, 5.0);
uniform float aspect_ratio = 0.5;
void fragment() {
vec2 tiled_uvs = UV * tiled_factor;
tiled_uvs.y *= aspect_ratio;
COLOR= texture(TEXTURE, tiled_uvs);
// COLOR = vec4(tiled_uvs, 0., 1.);
}