diff --git a/.gitattributes b/.gitattributes
index fe3a315a..e03d0588 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,19 +1,16 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf
-.blend filter=lfs diff=lfs merge=lfs -text
-.png filter=lfs diff=lfs merge=lfs -text
-.jpg filter=lfs diff=lfs merge=lfs -text
-.glb filter=lfs diff=lfs merge=lfs -text
+*.blend filter=lfs diff=lfs merge=lfs -text
+*.png filter=lfs diff=lfs merge=lfs -text
+*.glb filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.exr filter=lfs diff=lfs merge=lfs -text
*.ogg filter=lfs diff=lfs merge=lfs -text
-*.blend filter=lfs diff=lfs merge=lfs -text
-*.blend1 filter=lfs diff=lfs merge=lfs -text
-*.png filter=lfs diff=lfs merge=lfs -text
-*.aup3 filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
+*.blend1 filter=lfs diff=lfs merge=lfs -text
+*.aup3 filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.tga filter=lfs diff=lfs merge=lfs -text
*.ico filter=lfs diff=lfs merge=lfs -text
@@ -22,7 +19,6 @@
*.aseprite filter=lfs diff=lfs merge=lfs -text
*.xcf filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
-*.glb filter=lfs diff=lfs merge=lfs -text
*.flac filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.bin filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitignore b/.gitignore
index 841fecec..3f5af292 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
src/.godot/
*.blend1
result
+src/addons/godot-jolt
\ No newline at end of file
diff --git a/design/buttons.svg b/design/buttons.svg
new file mode 100644
index 00000000..08369864
--- /dev/null
+++ b/design/buttons.svg
@@ -0,0 +1,255 @@
+
+
+
+
diff --git a/design/contributions.md b/design/contributions.md
index 14cd5d43..bd7b10ab 100644
--- a/design/contributions.md
+++ b/design/contributions.md
@@ -36,7 +36,7 @@
+ [MegaGlest](https://megaglest.org/), GPL
+ [Splash Screen Neo](https://inkscape.org/de/~MuhamadAliAkbar/%E2%98%85splash-screen-neon) by [Muhamad Ali Akbar](https://inkscape.org/de/~MuhamadAliAkbar/), CC-BY-SA
+ [Oh My Git](https://ohmygit.org/) by [bleeptrack](https://bleeptrack.de/) and [blinry](https://morr.cc/), Blue Oak Model License
- + [Ghostwriter]() by kde****
+ + [Ghostwriter]() by kde
## Music
- [Foundations I by Azure Studios](https://azurestudios.bandcamp.com/album/foundations-i-24bit), CC-BY 3.0
diff --git a/design/fairy_lights.blend b/design/fairy_lights.blend
new file mode 100644
index 00000000..5752dd3f
--- /dev/null
+++ b/design/fairy_lights.blend
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c881fcd0d24a9082f1907821b21c4d73e485a48a83f88c6aeed452fe0f7b4478
+size 1154684
diff --git a/design/interface-elements.svg b/design/interface-elements.svg
index 9f906865..ad88e175 100644
--- a/design/interface-elements.svg
+++ b/design/interface-elements.svg
@@ -8,7 +8,7 @@
version="1.1"
id="svg5"
xml:space="preserve"
- inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
sodipodi:docname="interface-elements.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
@@ -24,11 +24,11 @@
inkscape:deskcolor="#505050"
inkscape:document-units="px"
showgrid="false"
- inkscape:zoom="0.64693624"
- inkscape:cx="1021.739"
- inkscape:cy="499.2764"
+ inkscape:zoom="0.457453"
+ inkscape:cx="214.22966"
+ inkscape:cy="1458.0733"
inkscape:window-width="3840"
- inkscape:window-height="2095"
+ inkscape:window-height="2096"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
@@ -37,7 +37,9 @@
y="0"
width="270.93332"
height="270.93332"
- id="page2413" />
+ sodipodi:nodetypes="cssscscc" />
diff --git a/design/landshark_plushie.blend b/design/landshark_plushie.blend
new file mode 100644
index 00000000..189d08b5
--- /dev/null
+++ b/design/landshark_plushie.blend
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:274d537e2b2ce9c4b592a79c11ab1c2a3abf87ad5822b218e10b167b12964565
+size 16040619
diff --git a/design/star.blend b/design/star.blend
index 8177974f..23c9b8e8 100644
--- a/design/star.blend
+++ b/design/star.blend
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:13952d8888b8bc41db7192934864417175857ca10885077927e7eb4ad0722880
-size 1377601
+oid sha256:1e175ca10f16b7dceea864240cf65b0a591576377e95c15409cbdd492442a968
+size 1561733
diff --git a/design/youth-construction.blend b/design/youth-construction.blend
index e29dd2ac..c6de9c75 100644
--- a/design/youth-construction.blend
+++ b/design/youth-construction.blend
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5ba43248db25f8f893f4c6a27d034bfafca1ef1c54019ae458b712a477ac7122
-size 204553656
+oid sha256:1df3c4365550328a69c2ed3aa34232e7635c3fb6cd596802f732a2b45afea6b8
+size 198287196
diff --git a/src/addons/LineRenderer/line_plugin.gd b/src/addons/LineRenderer/line_plugin.gd
new file mode 100644
index 00000000..5dbab1b5
--- /dev/null
+++ b/src/addons/LineRenderer/line_plugin.gd
@@ -0,0 +1,11 @@
+@tool
+extends EditorPlugin
+
+func _enter_tree():
+ # Initialization of the plugin goes here.
+ add_custom_type("LineRenderer3D", "MeshInstance3D", preload("line_renderer.gd"), preload("line_render_icon.svg"))
+
+
+func _exit_tree():
+ # Clean-up of the plugin goes here.
+ remove_custom_type("Line Renderer 3D")
diff --git a/src/addons/LineRenderer/line_render_icon.svg b/src/addons/LineRenderer/line_render_icon.svg
new file mode 100644
index 00000000..aa4d895b
--- /dev/null
+++ b/src/addons/LineRenderer/line_render_icon.svg
@@ -0,0 +1,127 @@
+
+
+
+
diff --git a/src/addons/LineRenderer/line_render_icon.svg.import b/src/addons/LineRenderer/line_render_icon.svg.import
new file mode 100644
index 00000000..ffd167a5
--- /dev/null
+++ b/src/addons/LineRenderer/line_render_icon.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://drumkfhf8d2tn"
+path="res://.godot/imported/line_render_icon.svg-9fabbd2cfeb579cc989ccd151dbe0a0b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/LineRenderer/line_render_icon.svg"
+dest_files=["res://.godot/imported/line_render_icon.svg-9fabbd2cfeb579cc989ccd151dbe0a0b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/src/addons/LineRenderer/line_renderer.gd b/src/addons/LineRenderer/line_renderer.gd
new file mode 100644
index 00000000..a5ce4f74
--- /dev/null
+++ b/src/addons/LineRenderer/line_renderer.gd
@@ -0,0 +1,171 @@
+@tool
+extends MeshInstance3D
+class_name LineRenderer3D
+
+@export var points: Array[Vector3] = [Vector3(0,0,0),Vector3(0,5,0)]:
+ set(new_points): points = new_points
+@export var start_thickness:float = 0.1:
+ set(new_start_thickness): start_thickness = new_start_thickness
+@export var end_thickness:float = 0.1:
+ set(new_end_thickness): end_thickness = new_end_thickness
+@export var corner_resolution:int = 5:
+ set(new_corner_resolution): corner_resolution = new_corner_resolution
+@export var cap_resolution:int = 5:
+ set(new_cap_resolution): cap_resolution = new_cap_resolution
+@export var draw_caps:bool = true:
+ set(new_draw_caps): draw_caps = new_draw_caps
+@export var draw_crners:bool = true:
+ set(new_draw_crners): draw_crners = new_draw_crners
+@export var use_global_coords:bool = true:
+ set(new_use_global_coords): use_global_coords = new_use_global_coords
+@export var tile_texture:bool = true:
+ set(new_tile_texture): tile_texture = new_tile_texture
+
+var camera : Camera3D
+var cameraOrigin : Vector3
+
+func _enter_tree():
+ mesh = ImmediateMesh.new()
+
+func _ready():
+ pass
+
+func _process(_delta):
+ if points.size() < 2:
+ return
+
+ camera = get_viewport().get_camera_3d()
+ if camera == null:
+ return
+ cameraOrigin = to_local(camera.get_global_transform().origin)
+
+ var progressStep:float = 1.0 / points.size();
+ var progress:float = 0;
+ var thickness:float = lerp(start_thickness, end_thickness, progress);
+ var nextThickness:float = lerp(start_thickness, end_thickness, progress + progressStep);
+
+ var surface:SurfaceTool = SurfaceTool.new()
+ surface.begin(Mesh.PRIMITIVE_TRIANGLES)
+
+ for i in range(points.size() - 1):
+ var A:Vector3 = points[i]
+ var B:Vector3 = points[i+1]
+
+ if use_global_coords:
+ A = to_local(A)
+ B = to_local(B)
+
+ var AB:Vector3 = B - A;
+ var orthogonalABStart:Vector3 = (cameraOrigin - ((A + B) / 2)).cross(AB).normalized() * thickness;
+ var orthogonalABEnd:Vector3 = (cameraOrigin - ((A + B) / 2)).cross(AB).normalized() * nextThickness;
+
+ var AtoABStart:Vector3 = A + orthogonalABStart
+ var AfromABStart:Vector3 = A - orthogonalABStart
+ var BtoABEnd:Vector3 = B + orthogonalABEnd
+ var BfromABEnd:Vector3 = B - orthogonalABEnd
+
+ if i == 0:
+ if draw_caps:
+ cap(surface, A, B, thickness, cap_resolution)
+
+ if tile_texture:
+ var ABLen = AB.length()
+ var ABFloor = floor(ABLen)
+ var ABFrac = ABLen - ABFloor
+
+ surface.set_uv(Vector2(ABFloor, 0))
+ surface.add_vertex(AtoABStart)
+ surface.set_uv(Vector2(-ABFrac, 0))
+ surface.add_vertex(BtoABEnd)
+ surface.set_uv(Vector2(ABFloor, 1))
+ surface.add_vertex(AfromABStart)
+ surface.set_uv(Vector2(-ABFrac, 0))
+ surface.add_vertex(BtoABEnd)
+ surface.set_uv(Vector2(-ABFrac, 1))
+ surface.add_vertex(BfromABEnd)
+ surface.set_uv(Vector2(ABFloor, 1))
+ surface.add_vertex(AfromABStart)
+ else:
+ surface.set_uv(Vector2(1, 0))
+ surface.add_vertex(AtoABStart)
+ surface.set_uv(Vector2(0, 0))
+ surface.add_vertex(BtoABEnd)
+ surface.set_uv(Vector2(1, 1))
+ surface.add_vertex(AfromABStart)
+ surface.set_uv(Vector2(0, 0))
+ surface.add_vertex(BtoABEnd)
+ surface.set_uv(Vector2(0, 1))
+ surface.add_vertex(BfromABEnd)
+ surface.set_uv(Vector2(1, 1))
+ surface.add_vertex(AfromABStart)
+
+ if i == points.size() - 2:
+ if draw_caps:
+ cap(surface, B, A, nextThickness, cap_resolution)
+ else:
+ if draw_crners:
+ var C = points[i+2]
+ if use_global_coords:
+ C = to_local(C)
+
+ var BC = C - B;
+ var orthogonalBCStart = (cameraOrigin - ((B + C) / 2)).cross(BC).normalized() * nextThickness;
+
+ var angleDot = AB.dot(orthogonalBCStart)
+
+ if angleDot > 0 and not angleDot == 1:
+ corner(surface, B, BtoABEnd, B + orthogonalBCStart, corner_resolution)
+ elif angleDot < 0 and not angleDot == -1:
+ corner(surface, B, B - orthogonalBCStart, BfromABEnd, corner_resolution)
+
+ progress += progressStep;
+ thickness = lerp(start_thickness, end_thickness, progress);
+ nextThickness = lerp(start_thickness, end_thickness, progress + progressStep);
+
+ surface.generate_normals()
+ surface.generate_tangents()
+ mesh = surface.commit()
+
+func cap(surface: SurfaceTool, center:Vector3, pivot:Vector3, thickness:float, cap_resolution:int):
+ var orthogonal:Vector3 = (cameraOrigin - center).cross(center - pivot).normalized() * thickness;
+ var axis:Vector3 = (center - cameraOrigin).normalized();
+
+ var vertex_array:Array = []
+ for i in range(cap_resolution + 1):
+ vertex_array.append(Vector3(0,0,0))
+ vertex_array[0] = center + orthogonal;
+ vertex_array[cap_resolution] = center - orthogonal;
+
+ for i in range(1, cap_resolution):
+ vertex_array[i] = center + (orthogonal.rotated(axis, lerp(0.0, PI, float(i) / cap_resolution)));
+
+ for i in range(1, cap_resolution + 1):
+ surface.set_uv(Vector2(0, (i - 1) / cap_resolution))
+ surface.add_vertex(vertex_array[i - 1]);
+ surface.set_uv(Vector2(0, (i - 1) / cap_resolution))
+ surface.add_vertex(vertex_array[i]);
+ surface.set_uv(Vector2(0.5, 0.5))
+ surface.add_vertex(center);
+
+func corner(surface: SurfaceTool, center:Vector3, start:Vector3, end:Vector3, cap_resolution:int):
+ var vertex_array:Array = []
+ for i in range(cap_resolution + 1):
+ vertex_array.append(Vector3(0,0,0))
+ vertex_array[0] = start;
+ vertex_array[cap_resolution] = end;
+
+ var axis:Vector3 = start.cross(end).normalized()
+ var offset:Vector3 = start - center
+ var angle:float = offset.angle_to(end - center)
+
+ for i in range(1, cap_resolution):
+ vertex_array[i] = center + offset.rotated(axis, lerp(0.0, angle, float(i) / cap_resolution));
+
+ for i in range(1, cap_resolution + 1):
+ surface.set_uv(Vector2(0, (i - 1) / cap_resolution))
+ surface.add_vertex(vertex_array[i - 1]);
+ surface.set_uv(Vector2(0, (i - 1) / cap_resolution))
+ surface.add_vertex(vertex_array[i]);
+ surface.set_uv(Vector2(0.5, 0.5))
+ surface.add_vertex(center);
+
diff --git a/src/addons/LineRenderer/plugin.cfg b/src/addons/LineRenderer/plugin.cfg
new file mode 100644
index 00000000..14efb9b6
--- /dev/null
+++ b/src/addons/LineRenderer/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="LineRenderer"
+description="A simple line renderer for Godot 4.0, useful for rendering cylindrical volume such as lasers, trails, etc. Based on the Godot 3.0 version by @dbp8890 at https://github.com/dbp8890/line-renderer ported by @LemiSt24, which is based on the helpful C# implementation by @paulohyy at https://github.com/paulohyy/linerenderer and added some additional features such as UV tiling."
+author="betalars"
+version="1.0"
+script="line_plugin.gd"
diff --git a/src/base-environments/intro/luna_intro.tscn b/src/base-environments/intro/luna_intro.tscn
new file mode 100644
index 00000000..99bd80e9
--- /dev/null
+++ b/src/base-environments/intro/luna_intro.tscn
@@ -0,0 +1,5 @@
+[gd_scene load_steps=2 format=3 uid="uid://dt7mtqo43aomc"]
+
+[ext_resource type="PackedScene" uid="uid://t6opo6kuctpa" path="res://logic-scenes/luna/Luna_frame-of-mind.glb" id="1_gj414"]
+
+[node name="Luna_frame-of-mind" instance=ExtResource("1_gj414")]
diff --git a/src/base-environments/intro_scene/shaders/stars.gdshader b/src/base-environments/intro_scene/shaders/stars.gdshader
new file mode 100644
index 00000000..d2b3a336
--- /dev/null
+++ b/src/base-environments/intro_scene/shaders/stars.gdshader
@@ -0,0 +1,53 @@
+shader_type sky;
+
+uniform float star_size: hint_range(50.0, 500.0) = 120.0;
+
+uniform sampler2D star_colors: hint_default_white;
+uniform sampler2D sky_gradient: hint_default_black, repeat_disable;
+uniform sampler2D nebula_gradient: hint_default_black, repeat_disable;
+uniform float nebula_offset;
+uniform sampler2D universe_background: hint_default_black;
+
+// https://github.com/Norrox/GodotShaders/blob/master/Shaders/Voronoi-Worley/Voronoi.shader
+vec3 RNGV3(vec3 p) {
+ vec3 a = fract(vec3(p.x, p.y, p.z) * vec3(111.11,333.33,444.44));
+ a += dot(a, a+33.51);
+ return fract(vec3(a.x*a.y, a.y*a.z, a.z*a.x)); //outputs a random vec2 between 0 and 1
+}
+
+vec4 voronoy(vec3 loc, float scale){
+ loc = loc*scale;
+ vec4 output = vec4(0., 0., 0., 10.);
+ for(float y=-1.; y<=1.; y++){
+ for(float x=-1.; x<=1.; x++){
+ for(float z=-1.; z<=1.; z++){
+ vec3 offs = vec3(x,y,z);
+ vec3 n = RNGV3(floor(loc)+offs)*2.0-1.0;
+ vec3 p = offs+sin(n) * .5;
+ float d = length((fract(loc)-0.5)-p);
+ if(d