From 983bb792fa3ef3b4203d061991c752b18d9b698a Mon Sep 17 00:00:00 2001 From: Martin Felis Date: Wed, 3 May 2023 13:26:13 +0200 Subject: [PATCH] Added Noise based island generator. --- materials/IslandColorRampShader.tres | 59 +++++++++++++++++++ scenes/NoiseWorldGeneration2D.tscn | 88 ++++++++++++++++++++++++++++ scenes/TileWorld.tscn | 28 +++++++++ 3 files changed, 175 insertions(+) create mode 100644 materials/IslandColorRampShader.tres create mode 100644 scenes/NoiseWorldGeneration2D.tscn create mode 100644 scenes/TileWorld.tscn diff --git a/materials/IslandColorRampShader.tres b/materials/IslandColorRampShader.tres new file mode 100644 index 0000000..0a6e142 --- /dev/null +++ b/materials/IslandColorRampShader.tres @@ -0,0 +1,59 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=2] + +[sub_resource type="Shader" id=1] +code = "shader_type canvas_item; +render_mode skip_vertex_transform; + +void vertex() { + VERTEX = (WORLD_MATRIX * (EXTRA_MATRIX * vec4(VERTEX, 0.0, 1.0))).xy; +} + +vec3 color_ramp(float h) { + if (h < 0.4f) { + return vec3(0, 0, 0.6); + } else if (h < 0.45f) { + return vec3(0, 0, 0.7); + } else if (h < 0.5f) { + return vec3(0, 0, 1); + } else if (h < 0.55){ + return vec3(0.8, 0.8, 0.1); + } else if (h < 0.6){ + return vec3(0, 0.6, 0); + } else if (h < 0.68){ + return vec3(0, 0.4, 0); + } else if (h <= 0.78){ + return vec3(0.6, 0.6, 0.6); + } else if (h < 1.0){ + return vec3(0.8, 0.8, 0.8); + } + + return vec3(1.0); +} + +vec3 rgbToGrayscale(vec3 color) { + return vec3(dot(color.rgb, vec3(0.299, 0.587, 0.144))); +} + +float borderFalloff(vec2 uv) { + return min( + (0.5 - abs(-uv.x + 0.5)) * 2.0, + (0.5 - abs(-uv.y + 0.5)) * 2.0); +} + +float borderFalloffCircle(vec2 uv) { + return (0.5 - length(vec2(uv - vec2(0.5, 0.5)))) * 2.0; +} + +void fragment() { + vec4 texture_color = texture(TEXTURE, UV); + + + COLOR.rgb = vec3(abs(UV.x - 0.5) * 2.0); + //COLOR.rgb = color_ramp(texture_color.r * borderFalloffCircle(UV) * 1.8); + COLOR.rgb = color_ramp(texture_color.r * borderFalloff(UV) * 1.8); +} + +" + +[resource] +shader = SubResource( 1 ) diff --git a/scenes/NoiseWorldGeneration2D.tscn b/scenes/NoiseWorldGeneration2D.tscn new file mode 100644 index 0000000..8e54d04 --- /dev/null +++ b/scenes/NoiseWorldGeneration2D.tscn @@ -0,0 +1,88 @@ +[gd_scene load_steps=5 format=2] + +[sub_resource type="Shader" id=1] +code = "shader_type canvas_item; +render_mode skip_vertex_transform; + +void vertex() { + VERTEX = (WORLD_MATRIX * (EXTRA_MATRIX * vec4(VERTEX, 0.0, 1.0))).xy; +} + +vec3 color_ramp(float h) { + if (h < 0.4f) { + return vec3(0, 0, 0.6); + } else if (h < 0.45f) { + return vec3(0, 0, 0.7); + } else if (h < 0.5f) { + return vec3(0, 0, 1); + } else if (h < 0.55){ + return vec3(0.8, 0.8, 0.1); + } else if (h < 0.6){ + return vec3(0, 0.6, 0); + } else if (h < 0.68){ + return vec3(0, 0.4, 0); + } else if (h <= 0.78){ + return vec3(0.6, 0.6, 0.6); + } else if (h < 1.0){ + return vec3(0.8, 0.8, 0.8); + } + + return vec3(1.0); +} + +vec3 rgbToGrayscale(vec3 color) { + return vec3(dot(color.rgb, vec3(0.299, 0.587, 0.144))); +} + +float borderFalloff(vec2 uv) { + return min( + (0.5 - abs(-uv.x + 0.5)) * 2.0, + (0.5 - abs(-uv.y + 0.5)) * 2.0); +} + +float borderFalloffCircle(vec2 uv) { + return (0.5 - length(vec2(uv - vec2(0.5, 0.5)))) * 2.0; +} + +void fragment() { + vec4 texture_color = texture(TEXTURE, UV); + + + COLOR.rgb = vec3(abs(UV.x - 0.5) * 2.0); + //COLOR.rgb = color_ramp(texture_color.r * borderFalloffCircle(UV) * 1.8); + COLOR.rgb = color_ramp(texture_color.r * borderFalloff(UV) * 1.8); +} + +" + +[sub_resource type="ShaderMaterial" id=2] +shader = SubResource( 1 ) + +[sub_resource type="OpenSimplexNoise" id=3] +seed = 57 +octaves = 5 +period = 20.0 +persistence = 0.2 +lacunarity = 4.0 + +[sub_resource type="NoiseTexture" id=4] +width = 128 +height = 128 +seamless = true +noise = SubResource( 3 ) +noise_offset = Vector2( 2.632, 0 ) + +[node name="Node2D" type="Node2D"] + +[node name="GridContainer" type="GridContainer" parent="."] +margin_right = 861.0 +margin_bottom = 595.0 + +[node name="TextureRect" type="TextureRect" parent="GridContainer"] +material = SubResource( 2 ) +margin_right = 861.0 +margin_bottom = 595.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = SubResource( 4 ) +expand = true diff --git a/scenes/TileWorld.tscn b/scenes/TileWorld.tscn new file mode 100644 index 0000000..6a9b6c5 --- /dev/null +++ b/scenes/TileWorld.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://scenes/TileWorld.cs" type="Script" id=1] +[ext_resource path="res://icon.png" type="Texture" id=2] +[ext_resource path="res://materials/IslandColorRampShader.tres" type="Material" id=3] + +[node name="TileWorld" type="Spatial"] +script = ExtResource( 1 ) + +[node name="DirectionalLight" type="DirectionalLight" parent="."] +transform = Transform( 0.328059, -0.878387, 0.347583, 0, 0.367946, 0.929847, -0.944657, -0.305045, 0.120708, 0, 6.59293, 1.20265 ) +shadow_enabled = true +directional_shadow_mode = 0 + +[node name="OffscreenViewport" type="Viewport" parent="."] +size = Vector2( 100, 100 ) +own_world = true +handle_input_locally = false +hdr = false +usage = 0 +render_target_v_flip = true +render_target_update_mode = 3 + +[node name="TextureRect" type="TextureRect" parent="OffscreenViewport"] +material = ExtResource( 3 ) +margin_right = 40.0 +margin_bottom = 40.0 +texture = ExtResource( 2 )