diff --git a/addons/hoimar.planetgen/planet_presets/alien_planet_settings.tres b/addons/hoimar.planetgen/planet_presets/alien_planet_settings.tres index 3b9334b..a8030de 100644 --- a/addons/hoimar.planetgen/planet_presets/alien_planet_settings.tres +++ b/addons/hoimar.planetgen/planet_presets/alien_planet_settings.tres @@ -1,12 +1,29 @@ -[gd_resource type="Resource" load_steps=9 format=2] +[gd_resource type="Resource" load_steps=12 format=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/shape_generator.gd" type="Script" id=1] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/ridged_noise_generator.gd" type="Script" id=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/noise_generator.gd" type="Script" id=3] [ext_resource path="res://addons/hoimar.planetgen/scripts/celestial_bodies/planet_settings.gd" type="Script" id=4] +[ext_resource path="res://addons/hoimar.planetgen/resources/materials/water.tres" type="Material" id=5] +[ext_resource path="res://addons/hoimar.planetgen/resources/materials/planet_clouds.shader" type="Shader" id=6] -[sub_resource type="Resource" id=1] -resource_name = "Large Ridges" +[sub_resource type="ShaderMaterial" id=1] +resource_local_to_scene = true +render_priority = 2 +shader = ExtResource( 6 ) +shader_param/proximity_fade_distance = 3.0 +shader_param/distance_fade = 0.05 +shader_param/cloudscale = 1.459 +shader_param/speed = 0.01 +shader_param/clouddark = -0.004 +shader_param/cloudlight = 0.3 +shader_param/cloudcover = 0.1 +shader_param/cloudalpha = 10.0 +shader_param/skytint = 10.0 +shader_param/m = Transform2D( 1.6, -1.2, 1.2, 1.6, 0, 0 ) +shader_param/adjust_distorsion = 150.0 + +[sub_resource type="Resource" id=2] script = ExtResource( 2 ) enabled = true use_first_as_mask = false @@ -17,8 +34,7 @@ period = 0.2 persistence = 0.3 center = Vector3( 1, 1, 0 ) -[sub_resource type="Resource" id=2] -resource_name = "Details & Peaks" +[sub_resource type="Resource" id=3] script = ExtResource( 3 ) enabled = true use_first_as_mask = true @@ -29,8 +45,7 @@ period = 0.1 persistence = 0.5 center = Vector3( 0.133, 0, 0 ) -[sub_resource type="Resource" id=3] -resource_name = "Fine Detail" +[sub_resource type="Resource" id=4] script = ExtResource( 3 ) enabled = true use_first_as_mask = true @@ -41,17 +56,20 @@ period = 0.001 persistence = 0.9 center = Vector3( 1, 2, 3 ) -[sub_resource type="Resource" id=4] +[sub_resource type="Resource" id=5] script = ExtResource( 1 ) -noise_generators = [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ) ] +noise_generators = [ SubResource( 2 ), SubResource( 3 ), SubResource( 4 ) ] [resource] script = ExtResource( 4 ) resolution = 77 radius = 150.0 has_water = false +water_shader = ExtResource( 5 ) has_atmosphere = true -has_collisions = true +has_collisions = false +has_clouds = true +cloud_shader = SubResource( 1 ) atmosphere_thickness = 8.0 atmosphere_density = 0.02 -shape_generator = SubResource( 4 ) +shape_generator = SubResource( 5 ) diff --git a/addons/hoimar.planetgen/planet_presets/earthlike_planet_settings.tres b/addons/hoimar.planetgen/planet_presets/earthlike_planet_settings.tres index 62336c7..e39cf28 100644 --- a/addons/hoimar.planetgen/planet_presets/earthlike_planet_settings.tres +++ b/addons/hoimar.planetgen/planet_presets/earthlike_planet_settings.tres @@ -1,24 +1,40 @@ -[gd_resource type="Resource" load_steps=10 format=2] +[gd_resource type="Resource" load_steps=13 format=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/shape_generator.gd" type="Script" id=1] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/ridged_noise_generator.gd" type="Script" id=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/noise_generator.gd" type="Script" id=3] [ext_resource path="res://addons/hoimar.planetgen/scripts/celestial_bodies/planet_settings.gd" type="Script" id=4] +[ext_resource path="res://addons/hoimar.planetgen/resources/materials/water.tres" type="Material" id=5] +[ext_resource path="res://addons/hoimar.planetgen/resources/materials/planet_clouds.shader" type="Shader" id=6] -[sub_resource type="Resource" id=1] -resource_name = "Continents" +[sub_resource type="ShaderMaterial" id=1] +resource_local_to_scene = true +render_priority = 2 +shader = ExtResource( 6 ) +shader_param/proximity_fade_distance = 3.0 +shader_param/distance_fade = 0.05 +shader_param/cloudscale = 1.968 +shader_param/speed = 0.02 +shader_param/clouddark = 0.5 +shader_param/cloudlight = 0.3 +shader_param/cloudcover = -0.36 +shader_param/cloudalpha = 3.0 +shader_param/skytint = 100.0 +shader_param/m = Transform2D( 1.6, -1.2, 1.2, 1.6, 0, 0 ) +shader_param/adjust_distorsion = 104.615 + +[sub_resource type="Resource" id=2] script = ExtResource( 3 ) enabled = true use_first_as_mask = false seed_value = 9 -strength = 0.005 -octaves = 4 +strength = 0.01 +octaves = 6 period = 0.4 persistence = 0.6 center = Vector3( -1, 0, 1 ) -[sub_resource type="Resource" id=2] -resource_name = "Large Ridges" +[sub_resource type="Resource" id=3] script = ExtResource( 2 ) enabled = true use_first_as_mask = true @@ -29,8 +45,7 @@ period = 0.5 persistence = 0.7 center = Vector3( 0, 0, 0 ) -[sub_resource type="Resource" id=3] -resource_name = "Coarse Detail" +[sub_resource type="Resource" id=4] script = ExtResource( 3 ) enabled = true use_first_as_mask = true @@ -41,8 +56,7 @@ period = 0.03 persistence = 0.6 center = Vector3( 0, 0, 0 ) -[sub_resource type="Resource" id=4] -resource_name = "Fine Detail" +[sub_resource type="Resource" id=5] script = ExtResource( 3 ) enabled = true use_first_as_mask = true @@ -53,17 +67,20 @@ period = 0.0005 persistence = 0.7 center = Vector3( 0, 0, 0 ) -[sub_resource type="Resource" id=5] +[sub_resource type="Resource" id=6] script = ExtResource( 1 ) -noise_generators = [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ) ] +noise_generators = [ SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ) ] [resource] script = ExtResource( 4 ) -resolution = 60 +resolution = 30 radius = 200.0 has_water = true +water_shader = ExtResource( 5 ) has_atmosphere = true -has_collisions = true -atmosphere_thickness = 10.0 -atmosphere_density = 0.02 -shape_generator = SubResource( 5 ) +has_collisions = false +has_clouds = true +cloud_shader = SubResource( 1 ) +atmosphere_thickness = 4.0 +atmosphere_density = 0.03 +shape_generator = SubResource( 6 ) diff --git a/addons/hoimar.planetgen/planet_presets/moon_settings.tres b/addons/hoimar.planetgen/planet_presets/moon_settings.tres index 0c23854..d8e963e 100644 --- a/addons/hoimar.planetgen/planet_presets/moon_settings.tres +++ b/addons/hoimar.planetgen/planet_presets/moon_settings.tres @@ -1,12 +1,29 @@ -[gd_resource type="Resource" load_steps=8 format=2] +[gd_resource type="Resource" load_steps=11 format=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/shape_generator.gd" type="Script" id=1] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/ridged_noise_generator.gd" type="Script" id=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/noise_generator.gd" type="Script" id=3] [ext_resource path="res://addons/hoimar.planetgen/scripts/celestial_bodies/planet_settings.gd" type="Script" id=4] +[ext_resource path="res://addons/hoimar.planetgen/resources/materials/water.tres" type="Material" id=5] +[ext_resource path="res://addons/hoimar.planetgen/resources/materials/planet_clouds.shader" type="Shader" id=6] -[sub_resource type="Resource" id=1] -resource_name = "Continents" +[sub_resource type="ShaderMaterial" id=1] +resource_local_to_scene = true +render_priority = 2 +shader = ExtResource( 6 ) +shader_param/proximity_fade_distance = 3.0 +shader_param/distance_fade = 0.05 +shader_param/cloudscale = 3.711 +shader_param/speed = 0.01 +shader_param/clouddark = 0.5 +shader_param/cloudlight = 0.3 +shader_param/cloudcover = 0.1 +shader_param/cloudalpha = 10.0 +shader_param/skytint = 10.0 +shader_param/m = Transform2D( 1.6, -1.2, 1.2, 1.6, 0, 0 ) +shader_param/adjust_distorsion = 150.0 + +[sub_resource type="Resource" id=2] script = ExtResource( 3 ) enabled = true use_first_as_mask = false @@ -17,8 +34,7 @@ period = 0.5 persistence = 0.5 center = Vector3( 0, 0, 0 ) -[sub_resource type="Resource" id=2] -resource_name = "Large Ridges" +[sub_resource type="Resource" id=3] script = ExtResource( 2 ) enabled = true use_first_as_mask = false @@ -29,17 +45,20 @@ period = 0.2 persistence = 0.5 center = Vector3( 0, 0, 0 ) -[sub_resource type="Resource" id=3] +[sub_resource type="Resource" id=4] script = ExtResource( 1 ) -noise_generators = [ SubResource( 1 ), SubResource( 2 ) ] +noise_generators = [ SubResource( 2 ), SubResource( 3 ) ] [resource] script = ExtResource( 4 ) resolution = 40 radius = 30.0 has_water = false +water_shader = ExtResource( 5 ) has_atmosphere = false has_collisions = true +has_clouds = false +cloud_shader = SubResource( 1 ) atmosphere_thickness = 1.1 atmosphere_density = 0.1 -shape_generator = SubResource( 3 ) +shape_generator = SubResource( 4 ) diff --git a/addons/hoimar.planetgen/planet_presets/sun_settings.tres b/addons/hoimar.planetgen/planet_presets/sun_settings.tres index 2abe33f..ec775eb 100644 --- a/addons/hoimar.planetgen/planet_presets/sun_settings.tres +++ b/addons/hoimar.planetgen/planet_presets/sun_settings.tres @@ -1,11 +1,28 @@ -[gd_resource type="Resource" load_steps=6 format=2] +[gd_resource type="Resource" load_steps=9 format=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/noise_generator.gd" type="Script" id=1] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/shape_generator.gd" type="Script" id=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/celestial_bodies/planet_settings.gd" type="Script" id=3] +[ext_resource path="res://addons/hoimar.planetgen/resources/materials/water.tres" type="Material" id=4] +[ext_resource path="res://addons/hoimar.planetgen/resources/materials/planet_clouds.shader" type="Shader" id=5] -[sub_resource type="Resource" id=1] -resource_name = "Sun Surface" +[sub_resource type="ShaderMaterial" id=1] +resource_local_to_scene = true +render_priority = 2 +shader = ExtResource( 5 ) +shader_param/proximity_fade_distance = 3.0 +shader_param/distance_fade = 0.05 +shader_param/cloudscale = 3.711 +shader_param/speed = 0.01 +shader_param/clouddark = 0.5 +shader_param/cloudlight = 0.3 +shader_param/cloudcover = 0.1 +shader_param/cloudalpha = 10.0 +shader_param/skytint = 10.0 +shader_param/m = Transform2D( 1.6, -1.2, 1.2, 1.6, 0, 0 ) +shader_param/adjust_distorsion = 150.0 + +[sub_resource type="Resource" id=2] script = ExtResource( 1 ) enabled = true use_first_as_mask = false @@ -16,17 +33,20 @@ period = 0.1 persistence = 0.4 center = Vector3( 0, 0, 0 ) -[sub_resource type="Resource" id=2] +[sub_resource type="Resource" id=3] script = ExtResource( 2 ) -noise_generators = [ SubResource( 1 ) ] +noise_generators = [ SubResource( 2 ) ] [resource] script = ExtResource( 3 ) -resolution = 21 +resolution = 10 radius = 200.0 has_water = false +water_shader = ExtResource( 4 ) has_atmosphere = false has_collisions = true +has_clouds = false +cloud_shader = SubResource( 1 ) atmosphere_thickness = 1.1 atmosphere_density = 0.1 -shape_generator = SubResource( 2 ) +shape_generator = SubResource( 3 ) diff --git a/addons/hoimar.planetgen/resources/materials/planet_clouds-LOW.shader b/addons/hoimar.planetgen/resources/materials/planet_clouds-LOW.shader new file mode 100644 index 0000000..c21b804 --- /dev/null +++ b/addons/hoimar.planetgen/resources/materials/planet_clouds-LOW.shader @@ -0,0 +1,141 @@ +// cloudy skies shader +// inspired from shadertoy shader made by Drift (https://www.shadertoy.com/view/4tdSWr) + +shader_type spatial; + +render_mode cull_disabled, vertex_lighting; +uniform float proximity_fade_distance = 0.1; +uniform float distance_fade = 0.5; + +uniform float cloudscale = 1.1; +uniform float speed = 0.01; +uniform float clouddark = 0.5; +uniform float cloudlight = 0.3; +uniform float cloudcover = 0.2; +uniform float cloudalpha = 8.0; +uniform float skytint = 0.5; +uniform mat2 m = mat2(vec2(1.6,1.2),vec2(-1.2,1.6)); // changement + +// functions + +vec2 hash( vec2 p ) { + p = vec2(dot(p,vec2(127.1,311.7)), dot(p,vec2(269.5,183.3))); + return -1.0 + 2.0*fract(sin(p)*43758.5453123); +} + +float noise( in vec2 p ) { + float K1 = 0.366025404; // (sqrt(3)-1)/2; + float K2 = 0.211324865; // (3-sqrt(3))/6; + vec2 i = floor(p + (p.x+p.y)*K1); + vec2 a = p - i + (i.x+i.y)*K2; + vec2 o = (a.x>a.y) ? vec2(1.0,0.0) : vec2(0.0,1.0); //vec2 of = 0.5 + 0.5*vec2(sign(a.x-a.y), sign(a.y-a.x)); + vec2 b = a - o + K2; + vec2 c = a - 1.0 + 2.0*K2; + vec3 h = max(0.5-vec3(dot(a,a), dot(b,b), dot(c,c) ), 0.0 ); + vec3 n = h*h*h*h*vec3( dot(a,hash(i)), dot(b,hash(i+o)), dot(c,hash(i+1.0))); + return dot(n, vec3(70.0)); +} + +float fbm(vec2 n) { + return noise(n) * 0.1; +} + +uniform float scale = 1.0; +uniform float var = 0.0; +uniform float var2 = 0.5; +varying vec2 tex_position; +void vertex() { + //tex_position = VERTEX.xy; + tex_position = vec2(atan( VERTEX.x / (( VERTEX.z + var)) ),VERTEX.y / (abs(VERTEX.z) + var2) ) * scale; + if (VERTEX.z < 0.0){ + tex_position.x *= -1.0; + } + +} + + + +void fragment() { + //cloudcover += 0.1; + float dist = distance((CAMERA_MATRIX * vec4(VERTEX, 1.0)).xyz, CAMERA_MATRIX[3].xyz) * distance_fade; + ALPHA *= clamp(dist ,0.0,1.0); + + +vec2 res = vec2(1,1); // SCREEN_PIXEL_SIZE; +vec2 p = tex_position; // changement + vec2 uv = p*vec2(res.x/res.y,1.0); // changement + float time = TIME * speed ; + float q = fbm(uv * cloudscale * 0.5); + + //ridged noise shape + float r = 0.0; + uv *= cloudscale; + uv += q - time; + float weight = 0.8; + for (int i=0; i<2; i++){ + r += abs(weight*noise( uv )); + uv = m*uv + time; + weight *= 0.7; + } + + //noise shape + float f = 0.0; + uv = p*vec2(res.x/res.y,1.0); // changement + uv *= cloudscale; + uv += q - time; + weight = 0.7; + for (int i=0; i<4; i++){ + f += weight*noise( uv ); + uv = m*uv + time; + weight *= 0.6; + } + + f *= r + f; + + //noise colour + float c = 0.0; + time = TIME * speed * 2.0; + uv = p*vec2(res.x/res.y,1.0); // changement + uv *= cloudscale*2.0; + uv += q - time; + weight = 0.4; + for (int i=0; i<1; i++){ + c += weight*noise( uv ); + uv = m*uv + time; + weight *= 0.6; + } + + //noise ridge colour + float c1 = 0.0; + time = TIME * speed * 3.0; + uv = p*vec2(res.x/res.y,1.0); + uv *= cloudscale*3.0; + uv += q - time; + weight = 0.4; + for (int i=0; i<1; i++){ + c1 += abs(weight*noise( uv )); + uv = m*uv + time; + weight *= 0.6; + } + + c += c1; + + vec4 skycolour = vec4(1,1,1,0); //mix(skycolour2, skycolour1, p.y); + vec4 cloudcolour = vec4(1.1, 1.1, 0.9,1) * clamp((clouddark + cloudlight*c), 0.0, 1.0); + + f = (cloudcover + 0.1) + (cloudalpha * 2.0)*f*r; + + vec4 result = mix(skycolour, clamp(skytint * skycolour + cloudcolour, 0.0, 1.0), clamp(f + c, 0.0, 1.0)); + + ALBEDO = vec3(result.xyz); + ALPHA *= result.a; + + //Proximity fade + if (dist < 200.0){ + float depth_tex = textureLod(DEPTH_TEXTURE, SCREEN_UV, 0.0).r; + vec4 world_pos = INV_PROJECTION_MATRIX * vec4(SCREEN_UV * 2.0 - 1.0, depth_tex * 2.0 - 1.0, 1.0); + world_pos.xyz /= world_pos.a; + ALPHA *= clamp(1.0 - smoothstep(world_pos.z + proximity_fade_distance, world_pos.z, VERTEX.z), 0.0, 1.0); + } + +} diff --git a/addons/hoimar.planetgen/resources/materials/planet_clouds.shader b/addons/hoimar.planetgen/resources/materials/planet_clouds.shader new file mode 100644 index 0000000..dbfa981 --- /dev/null +++ b/addons/hoimar.planetgen/resources/materials/planet_clouds.shader @@ -0,0 +1,144 @@ +// cloudy skies shader +// inspired from shadertoy shader made by Drift (https://www.shadertoy.com/view/4tdSWr) + +shader_type spatial; + +render_mode cull_disabled, vertex_lighting; +uniform float proximity_fade_distance = 0.1; +uniform float distance_fade = 0.5; + +uniform float cloudscale = 1.1; +uniform float speed = 0.01; +uniform float clouddark = 0.5; +uniform float cloudlight = 0.3; +uniform float cloudcover = 0.2; +uniform float cloudalpha = 8.0; +uniform float skytint = 0.5; +uniform mat2 m = mat2(vec2(1.6,1.2),vec2(-1.2,1.6)); // changement + +// functions + +vec2 hash( vec2 p ) { + p = vec2(dot(p,vec2(127.1,311.7)), dot(p,vec2(269.5,183.3))); + return -1.0 + 2.0*fract(sin(p)*43758.5453123); +} + +float noise( in vec2 p ) { + float K1 = 0.366025404; // (sqrt(3)-1)/2; + float K2 = 0.211324865; // (3-sqrt(3))/6; + vec2 i = floor(p + (p.x+p.y)*K1); + vec2 a = p - i + (i.x+i.y)*K2; + vec2 o = (a.x>a.y) ? vec2(1.0,0.0) : vec2(0.0,1.0); //vec2 of = 0.5 + 0.5*vec2(sign(a.x-a.y), sign(a.y-a.x)); + vec2 b = a - o + K2; + vec2 c = a - 1.0 + 2.0*K2; + vec3 h = max(0.5-vec3(dot(a,a), dot(b,b), dot(c,c) ), 0.0 ); + vec3 n = h*h*h*h*vec3( dot(a,hash(i+0.0)), dot(b,hash(i+o)), dot(c,hash(i+1.0))); + return dot(n, vec3(70.0)); +} + +float fbm(vec2 n) { + float total = 0.0, amplitude = 0.1; + for (int i = 0; i < 7; i++) { + total += noise(n) * amplitude; + n = m * n; + amplitude *= 0.4; + } + return total; +} + +uniform float adjust_distorsion = 100; +varying vec2 tex_position; +void vertex() { + //tex_position = VERTEX.xy; + tex_position = vec2(atan( VERTEX.x / (( VERTEX.z)) ),VERTEX.y / (abs(VERTEX.z) + adjust_distorsion) ); + if (VERTEX.z < 0.0){ + tex_position.x *= -1.0; + } + +} + + + +void fragment() { + float dist = distance((CAMERA_MATRIX * vec4(VERTEX, 1.0)).xyz, CAMERA_MATRIX[3].xyz) * distance_fade; + ALPHA *= clamp(dist ,0.0,1.0); + + +vec2 res = vec2(1,1); // SCREEN_PIXEL_SIZE; +vec2 p = tex_position; // changement + vec2 uv = p*vec2(res.x/res.y,1.0); // changement + float time = TIME * speed ; + float q = fbm(uv * cloudscale * 0.5); + + //ridged noise shape + float r = 0.0; + uv *= cloudscale; + uv += q - time; + float weight = 0.8; + for (int i=0; i<8; i++){ + r += abs(weight*noise( uv )); + uv = m*uv + time; + weight *= 0.7; + } + + //noise shape + float f = 0.0; + uv = p*vec2(res.x/res.y,1.0); // changement + uv *= cloudscale; + uv += q - time; + weight = 0.7; + for (int i=0; i<8; i++){ + f += weight*noise( uv ); + uv = m*uv + time; + weight *= 0.6; + } + + f *= r + f; + + //noise colour + float c = 0.0; + time = TIME * speed * 2.0; + uv = p*vec2(res.x/res.y,1.0); // changement + uv *= cloudscale*2.0; + uv += q - time; + weight = 0.4; + for (int i=0; i<7; i++){ + c += weight*noise( uv ); + uv = m*uv + time; + weight *= 0.6; + } + + //noise ridge colour + float c1 = 0.0; + time = TIME * speed * 3.0; + uv = p*vec2(res.x/res.y,1.0); + uv *= cloudscale*3.0; + uv += q - time; + weight = 0.4; + for (int i=0; i<7; i++){ + c1 += abs(weight*noise( uv )); + uv = m*uv + time; + weight *= 0.6; + } + + c += c1; + + vec4 skycolour = vec4(1,1,1,0); //mix(skycolour2, skycolour1, p.y); + vec4 cloudcolour = vec4(1.1, 1.1, 0.9,1) * clamp((clouddark + cloudlight*c), 0.0, 1.0); + + f = cloudcover + cloudalpha*f*r; + + vec4 result = mix(skycolour, clamp(skytint * skycolour + cloudcolour, 0.0, 1.0), clamp(f + c, 0.0, 1.0)); + + ALBEDO = vec3(result.xyz); + ALPHA *= result.a; + + //Proximity fade + if (dist < 200.0){ + float depth_tex = textureLod(DEPTH_TEXTURE, SCREEN_UV, 0.0).r; + vec4 world_pos = INV_PROJECTION_MATRIX * vec4(SCREEN_UV * 2.0 - 1.0, depth_tex * 2.0 - 1.0, 1.0); + world_pos.xyz /= world_pos.a; + ALPHA *= clamp(1.0 - smoothstep(world_pos.z + proximity_fade_distance, world_pos.z, VERTEX.z), 0.0, 1.0); + } + +} diff --git a/addons/hoimar.planetgen/resources/models/ship_model.glb.import b/addons/hoimar.planetgen/resources/models/ship_model.glb.import index 2073339..6642fa4 100644 --- a/addons/hoimar.planetgen/resources/models/ship_model.glb.import +++ b/addons/hoimar.planetgen/resources/models/ship_model.glb.import @@ -16,6 +16,7 @@ nodes/root_name="Scene Root" nodes/root_scale=1.0 nodes/custom_script="" nodes/storage=0 +nodes/use_legacy_names=true materials/location=1 materials/storage=1 materials/keep_on_reimport=true diff --git a/addons/hoimar.planetgen/scenes/celestial_bodies/planet.tscn b/addons/hoimar.planetgen/scenes/celestial_bodies/planet.tscn index 67b5cbb..59980a3 100644 --- a/addons/hoimar.planetgen/scenes/celestial_bodies/planet.tscn +++ b/addons/hoimar.planetgen/scenes/celestial_bodies/planet.tscn @@ -1,17 +1,40 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=9 format=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/celestial_bodies/planet.gd" type="Script" id=1] [ext_resource path="res://addons/hoimar.planetgen/resources/materials/water.tres" type="Material" id=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/terrain/terrain_manager.gd" type="Script" id=3] [ext_resource path="res://addons/hoimar.planetgen/scenes/celestial_bodies/atmosphere.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/hoimar.planetgen/resources/materials/planet_clouds.shader" type="Shader" id=5] -[sub_resource type="SphereMesh" id=1] +[sub_resource type="SphereMesh" id=4] material = ExtResource( 2 ) radius = 26.0 height = 52.0 radial_segments = 256 rings = 128 +[sub_resource type="ShaderMaterial" id=2] +resource_local_to_scene = true +render_priority = 2 +shader = ExtResource( 5 ) +shader_param/proximity_fade_distance = 3.0 +shader_param/distance_fade = 0.05 +shader_param/cloudscale = 3.935 +shader_param/speed = 0.01 +shader_param/clouddark = 0.5 +shader_param/cloudlight = 0.3 +shader_param/cloudcover = 0.1 +shader_param/cloudalpha = 10.0 +shader_param/skytint = 10.0 +shader_param/m = Transform2D( 1.6, -1.2, 1.2, 1.6, 0, 0 ) +shader_param/adjust_distorsion = 150.0 + +[sub_resource type="SphereMesh" id=3] +resource_local_to_scene = true +material = SubResource( 2 ) +radius = 156.0 +height = 312.0 + [node name="Planet" type="Spatial"] script = ExtResource( 1 ) @@ -24,5 +47,12 @@ shader_params/u_day_color1 = Color( 0.72549, 0.854902, 0.945098, 1 ) shader_params/u_night_color0 = Color( 0.0627451, 0.0431373, 0.137255, 1 ) [node name="WaterSphere" type="MeshInstance" parent="."] -mesh = SubResource( 1 ) +mesh = SubResource( 4 ) +material/0 = null + +[node name="MeshInstance" type="MeshInstance" parent="."] + +[node name="Clouds" type="MeshInstance" parent="."] +visible = false +mesh = SubResource( 3 ) material/0 = null diff --git a/addons/hoimar.planetgen/scenes/celestial_bodies/sun.tscn b/addons/hoimar.planetgen/scenes/celestial_bodies/sun.tscn index 373a5fa..93452cb 100644 --- a/addons/hoimar.planetgen/scenes/celestial_bodies/sun.tscn +++ b/addons/hoimar.planetgen/scenes/celestial_bodies/sun.tscn @@ -28,7 +28,6 @@ material/0 = null [node name="Sunlight" type="DirectionalLight" parent="." index="4"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -202 ) -shadow_enabled = true shadow_bias = 2.0 directional_shadow_mode = 1 directional_shadow_split_1 = 0.2 diff --git a/addons/hoimar.planetgen/scripts/celestial_bodies/planet.gd b/addons/hoimar.planetgen/scripts/celestial_bodies/planet.gd index 9d1b2f6..168791b 100644 --- a/addons/hoimar.planetgen/scripts/celestial_bodies/planet.gd +++ b/addons/hoimar.planetgen/scripts/celestial_bodies/planet.gd @@ -11,6 +11,7 @@ export(NodePath) var sun_path: NodePath var _org_water_mesh: Mesh var _solar_system: Node var _logger := Logger.get_for(self) +var Terr_cache : TerrainCache onready var _terrain: TerrainManager = $TerrainManager onready var _atmosphere = $Atmosphere onready var _water_sphere: MeshInstance = $WaterSphere @@ -21,11 +22,15 @@ func _ready(): _org_water_mesh = _water_sphere.mesh generate() +func _process(delta): + if Terr_cache: + Terr_cache.emit_signal("visit") # Generate whole planet. func generate(): if not are_conditions_met(): return + Terr_cache = TerrainCache.new() var time_before = OS.get_ticks_msec() settings.init(self) _terrain.generate(settings, material) @@ -40,6 +45,12 @@ func generate(): _water_sphere.mesh.surface_set_material(0, material) material.set_shader_param("planet_radius", settings.radius) + $Clouds.visible = settings.has_clouds + if settings.has_clouds: + var height : float = 1 + (settings.atmosphere_thickness * 0.005) + $Clouds.mesh.radius = settings.radius * height + $Clouds.mesh.height = settings.radius * (height * 2) + # Adjust atmosphere. _atmosphere.visible = settings.has_atmosphere if settings.has_atmosphere: diff --git a/addons/hoimar.planetgen/scripts/celestial_bodies/planet_settings.gd b/addons/hoimar.planetgen/scripts/celestial_bodies/planet_settings.gd index 8bf0788..fa1d926 100644 --- a/addons/hoimar.planetgen/scripts/celestial_bodies/planet_settings.gd +++ b/addons/hoimar.planetgen/scripts/celestial_bodies/planet_settings.gd @@ -5,10 +5,14 @@ extends Resource export(int, 3, 9999) var resolution: int = 20 setget set_resolution export(float) var radius: float = 100 setget set_radius export(bool) var has_water = false setget set_has_water +export(Resource) var water_shader setget set_water_shader export(bool) var has_atmosphere = true setget set_has_atmosphere export(bool) var has_collisions = true setget set_has_collisions -export(float, 1, 10000) var atmosphere_thickness: float = 1.15 setget set_atmosphere_thickness -export(float, 0.0, 1.0) var atmosphere_density: float = 0.1 setget set_atmosphere_density +export(bool) var has_clouds = false setget set_has_clouds +export(Resource) var cloud_shader setget set_cloud_shader +#export(float) var cloud_resolution = 1.0 setget set_cloud_resolution +export(float, 1, 10000) var atmosphere_thickness: float = 12 setget set_atmosphere_thickness +export(float, 0.0, 1.0) var atmosphere_density: float = 0.02 setget set_atmosphere_density export(Resource) var shape_generator var _planet: Spatial setget , get_planet @@ -18,7 +22,33 @@ var shared_mutex := Mutex.new() # Used for threads creating physics shapes. func init(var _planet): self._planet = _planet shape_generator.init(_planet) - + if _planet.has_node("Clouds"): + if !cloud_shader: + cloud_shader = _planet.get_node("Clouds").mesh.material + else: + _planet.get_node("Clouds").mesh.material = cloud_shader + #_planet.get_node("Clouds/Viewport").size = Vector2(600, 300) * cloud_resolution + + if !water_shader: + water_shader = _planet.get_node("WaterSphere").mesh.material + else: + _planet.get_node("WaterSphere").mesh.material = water_shader + + +func set_cloud_shader(shader): + if _planet: + _planet.get_node("Clouds").mesh.material = shader + cloud_shader = shader + +func set_cloud_resolution(n): + return + #cloud_resolution = n + #if _planet: + # _planet.get_node("Clouds/Viewport").size = Vector2(600, 300) * n + +func set_has_clouds(n:bool): + has_clouds = n + on_settings_changed() func on_settings_changed(): if not _planet: @@ -35,6 +65,10 @@ func set_radius(var new: float): radius = new on_settings_changed() +func set_water_shader(new): + if _planet: + _planet.get_node("WaterSphere").mesh.material = new + water_shader = new func set_has_water(var new: bool): has_water = new diff --git a/addons/hoimar.planetgen/scripts/constants.gd b/addons/hoimar.planetgen/scripts/constants.gd index e044f4e..1cd3c9a 100644 --- a/addons/hoimar.planetgen/scripts/constants.gd +++ b/addons/hoimar.planetgen/scripts/constants.gd @@ -4,6 +4,7 @@ const COLLISIONS_ENABLED := true # Whether planets generate collision shapes. const GRAVITY_ENABLED := true # TODO: Implement gravity. const THREADS_ENABLED := true +const USE_TERRAIN_CACHE := true # Quad tree depth, also number of LOD levels. const MAX_TREE_DEPTH := 9 # How long the feeder thread sleeps if idle in µs. diff --git a/addons/hoimar.planetgen/scripts/quadtree/quadnode.gd b/addons/hoimar.planetgen/scripts/quadtree/quadnode.gd index 5f755ab..b4634be 100644 --- a/addons/hoimar.planetgen/scripts/quadtree/quadnode.gd +++ b/addons/hoimar.planetgen/scripts/quadtree/quadnode.gd @@ -15,7 +15,7 @@ enum STATE {PREPARING, WAITING, ACTIVE, SPLITTING, SPLIT, MAY_MERGE} var parent: QuadNode var depth: int var leaves: Array -var terrain: TerrainPatch # Terrain patch of this quadtree node. +var terrain : MeshInstance # Terrain patch of this quadtree node. var terrain_job: TerrainJob var _state: int = STATE.PREPARING var _size: float # Size of this quad, 1/depth @@ -23,6 +23,9 @@ var _terrain_manager: Spatial var _center: Vector3 # Global position of the center. var _min_distance: float # Distance to viewer at which this node subdivides. var _viewer_node: Spatial setget set_viewer +var planet : Spatial +var cached : bool +var data : PatchData func _init(var parent: QuadNode, var direction: Vector3, \ @@ -40,19 +43,30 @@ func _init(var parent: QuadNode, var direction: Vector3, \ _size = parent._size / 2 _viewer_node = parent._viewer_node offset = Const.LEAF_OFFSETS[leaf_index] - var data := PatchData.new(terrain_manager, self, direction, offset) + data = PatchData.new(terrain_manager, self, direction, offset) _terrain_manager = terrain_manager _center = data.center + planet = _terrain_manager.get_parent() _min_distance = Const.MIN_DISTANCE * _size * data.settings.radius + var cache = planet.Terr_cache.get_cached(_center) if Const.USE_TERRAIN_CACHE else null + if cache: + cached = true + terrain = MeshInstance.new() + terrain.mesh = cache + terrain.set_surface_material(0,data.material) + on_ready_to_show() + planet.Terr_cache.connect("visit",self,"visit") + return + terrain_job = PGGlobals.queue_terrain_patch(data) terrain_job.connect("job_finished", self, "on_patch_finished", [], CONNECT_DEFERRED) # Update this node in the quadtree. func visit(): - var distance: float = _viewer_node.global_transform.origin.distance_to(_terrain_manager.global_transform.origin + _center) - var viewer_in_range: bool = distance < _min_distance - + var viewer_in_range: bool = \ + _viewer_node.global_transform.origin.distance_to(planet.to_global(_center)) \ + < _min_distance if _state == STATE.ACTIVE or _state == STATE.MAY_MERGE: if viewer_in_range: split_start() @@ -85,7 +99,7 @@ func split_start(): for i in Const.MAX_LEAVES: # Workaround for cyclic reference issues. leaves.append(get_script().new( - self, terrain.data.axis_up, _terrain_manager, i + self, data.axis_up, _terrain_manager, i )) _state = STATE.SPLITTING @@ -115,14 +129,19 @@ func mark_redundant(): # Destroys this node, also handles being destroyed while job is running. func destroy(): if terrain_job: + terrain_job.disconnect("job_finished",self,"on_patch_finished") terrain_job.abort() if terrain: - terrain.queue_free() + terrain.free() + if cached: + planet.Terr_cache.disconnect("visit",self,"visit") # TerrainPatch for this node is done. func on_patch_finished(var job: TerrainJob, var patch: TerrainPatch): terrain = patch + if terrain: + planet.Terr_cache.save_patch(terrain.mesh,_center) terrain_job = null if parent: # Signal to parent that we're wait for sibling nodes to finish. @@ -133,6 +152,9 @@ func on_patch_finished(var job: TerrainJob, var patch: TerrainPatch): func on_ready_to_show(): + if _state >= STATE.ACTIVE: + _state = STATE.ACTIVE + return assert(terrain_job == null, "Terrain job for %s is not done!" % str(self)) terrain.set_visible(true) _terrain_manager.add_child(terrain) diff --git a/addons/hoimar.planetgen/scripts/terrain/TerrainCache.gd b/addons/hoimar.planetgen/scripts/terrain/TerrainCache.gd new file mode 100644 index 0000000..d76635c --- /dev/null +++ b/addons/hoimar.planetgen/scripts/terrain/TerrainCache.gd @@ -0,0 +1,16 @@ +tool +class_name TerrainCache + +var cache : Dictionary +signal visit + +func _init(): + pass + +func save_patch(data:ArrayMesh, center : Vector3): + cache[center] = data + +func get_cached(center : Vector3): + + if cache.has(center): + return cache[center] diff --git a/addons/hoimar.planetgen/scripts/terrain/patch_data.gd b/addons/hoimar.planetgen/scripts/terrain/patch_data.gd index b26aa57..44bde99 100644 --- a/addons/hoimar.planetgen/scripts/terrain/patch_data.gd +++ b/addons/hoimar.planetgen/scripts/terrain/patch_data.gd @@ -4,7 +4,7 @@ class_name PatchData const Const := preload("../constants.gd") -var parent_patch: Spatial # Parent patch in the quad tree. +var parent_patch: Reference # Parent patch in the quad tree. var quadnode: Reference var settings: PlanetSettings var axis_up: Vector3 # Normal of flat cube patch. @@ -16,7 +16,7 @@ var offset_b: Vector3 # Offsets this patch to it's quadtree cell along axis var size: float # Size of this quad. 1 is a full cube patch, 0.5 a quarter etc. var center: Vector3 var material: Material - +var _offset : Vector2 func _init(manager: Spatial, quadnode: Reference, axis_up: Vector3, offset: Vector2): @@ -28,11 +28,12 @@ func _init(manager: Spatial, quadnode: Reference, self.axis_up = axis_up axis_a = Vector3(axis_up.y, axis_up.z, axis_up.x) * size axis_b = axis_up.cross(axis_a).normalized() * size + _offset = offset offset_a = Vector3(axis_a * offset.x) offset_b = Vector3(axis_b * offset.y) if quadnode.parent: - parent_patch = quadnode.parent.terrain + parent_patch = quadnode.parent if parent_patch: offset_a += parent_patch.data.offset_a offset_b += parent_patch.data.offset_b diff --git a/demos/solar_system_demo.tscn b/demos/solar_system_demo.tscn index 7a39469..de2238d 100644 --- a/demos/solar_system_demo.tscn +++ b/demos/solar_system_demo.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=13 format=2] +[gd_scene load_steps=16 format=2] [ext_resource path="res://addons/hoimar.planetgen/scripts/celestial_bodies/solar_system.gd" type="Script" id=1] [ext_resource path="res://addons/hoimar.planetgen/scenes/celestial_bodies/planet.tscn" type="PackedScene" id=2] [ext_resource path="res://addons/hoimar.planetgen/planet_presets/earthlike_planet_settings.tres" type="Resource" id=3] -[ext_resource path="res://addons/hoimar.planetgen/resources/space_environment.tres" type="Environment" id=4] [ext_resource path="res://addons/hoimar.planetgen/scenes/gui/gui.tscn" type="PackedScene" id=5] [ext_resource path="res://addons/hoimar.planetgen/planet_presets/alien_planet_settings.tres" type="Resource" id=7] [ext_resource path="res://addons/hoimar.planetgen/scenes/ship/ship.tscn" type="PackedScene" id=8] @@ -13,16 +12,95 @@ [ext_resource path="res://addons/hoimar.planetgen/resources/materials/earthlike_planet_material.tres" type="Material" id=12] [ext_resource path="res://addons/hoimar.planetgen/planet_presets/moon_settings.tres" type="Resource" id=13] +[sub_resource type="Shader" id=1] +code = "shader_type spatial; + +render_mode cull_back, unshaded, shadows_disabled; + +uniform float seed = 0.0; +uniform vec4 star_color : hint_color = vec4( 1.0, 1.0, 1.0, 1.0 ); +uniform float star_aperture = 7.0; + +float random( vec3 pos ) +{ + return fract(sin(dot(pos, vec3(12.9898,78.233,53.532532))) * 43758.5453); +} + +float value_noise( vec3 pos ) +{ + vec3 p = floor( pos ); + vec3 f = fract( pos ); + + float v000 = random( p/*+ vec3( 0.0, 0.0, 0.0 )*/ ); + float v100 = random( p + vec3( 1.0, 0.0, 0.0 ) ); + float v010 = random( p + vec3( 0.0, 1.0, 0.0 ) ); + float v110 = random( p + vec3( 1.0, 1.0, 0.0 ) ); + float v001 = random( p + vec3( 0.0, 0.0, 1.0 ) ); + float v101 = random( p + vec3( 1.0, 0.0, 1.0 ) ); + float v011 = random( p + vec3( 0.0, 1.0, 1.0 ) ); + float v111 = random( p + vec3( 1.0, 1.0, 1.0 ) ); + + vec3 u = f * f * ( 3.0 - 2.0 * f ); + + return mix( + mix( + mix( v000, v100, u.x ) + , mix( v010, v110, u.x ) + , u.y + ) + , mix( + mix( v001, v101, u.x ) + , mix( v011, v111, u.x ) + , u.y + ) + , u.z + ); +} + +void fragment( ) +{ + //vec3 camera_pos = ( CAMERA_MATRIX * vec4( 0.0, 0.0, 0.0, 1.0 ) ).xyz; + + vec3 v = -( vec4( VIEW, 1.0 ) * INV_CAMERA_MATRIX ).xyz; + v.x += seed; + + float star_alpha = pow( value_noise( v * 786.54315543 ) * value_noise( v * 452.53254328 ), star_aperture ); + + ALPHA = min( star_alpha, 1.0 ); + ALBEDO = star_color.rgb; + DEPTH = 1.0; +} +" + +[sub_resource type="ShaderMaterial" id=2] +render_priority = -128 +shader = SubResource( 1 ) +shader_param/seed = 0.0 +shader_param/star_color = Color( 1, 1, 1, 1 ) +shader_param/star_aperture = 10.0 + +[sub_resource type="CubeMesh" id=3] +material = SubResource( 2 ) +flip_faces = true +size = Vector3( 9000, 9000, 9000 ) + +[sub_resource type="Environment" id=4] +background_mode = 1 + [node name="SolarSystemDemo" type="Node"] script = ExtResource( 1 ) +[node name="Stars" type="MeshInstance" parent="."] +mesh = SubResource( 3 ) +material/0 = null + [node name="Gui" parent="." instance=ExtResource( 5 )] [node name="Ship" parent="." instance=ExtResource( 8 )] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 400 ) +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -61.0948, 1.52588e-05, 224.37 ) [node name="Sun" parent="." instance=ExtResource( 10 )] -transform = Transform( 0.677011, 1.48735e-05, 0.735968, 0, 1, -2.02092e-05, -0.735968, 1.3682e-05, 0.677011, 5000, 0, 5000 ) +transform = Transform( 0.686254, 1.43537e-05, 0.727357, 0, 1, -1.97339e-05, -0.727357, 1.35426e-05, 0.686254, 5000, 0, 5000 ) solar_system_path = NodePath("..") sun_path = NodePath(".") @@ -47,4 +125,4 @@ solar_system_path = NodePath("..") sun_path = NodePath("../Sun") [node name="SpaceEnvironment" type="WorldEnvironment" parent="."] -environment = ExtResource( 4 ) +environment = SubResource( 4 ) diff --git a/project.godot b/project.godot index f441aaa..a8cc099 100644 --- a/project.godot +++ b/project.godot @@ -75,6 +75,11 @@ _global_script_classes=[ { "path": "res://addons/hoimar.planetgen/scripts/celestial_bodies/sun.gd" }, { "base": "Reference", +"class": "TerrainCache", +"language": "GDScript", +"path": "res://addons/hoimar.planetgen/scripts/terrain/TerrainCache.gd" +}, { +"base": "Reference", "class": "TerrainJob", "language": "GDScript", "path": "res://addons/hoimar.planetgen/scripts/terrain/terrain_job.gd" @@ -108,6 +113,7 @@ _global_script_class_icons={ "ShapeGenerator": "", "SolarSystem": "res://addons/hoimar.planetgen/resources/icons/solar_system.svg", "Sun": "res://addons/hoimar.planetgen/resources/icons/sun.svg", +"TerrainCache": "", "TerrainJob": "", "TerrainManager": "", "TerrainPatch": "", @@ -131,7 +137,7 @@ window/size/height=900 [editor_plugins] -enabled=PoolStringArray( "res://addons/hoimar.planetgen/plugin.cfg" ) +enabled=PoolStringArray( ) [input]