adding fairy lights

This commit is contained in:
betalars 2024-02-10 13:34:34 +01:00
parent 9dde7abddf
commit afb3f241c4
17 changed files with 575 additions and 1 deletions

BIN
design/fairy_lights.blend (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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")

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.0 KiB

View File

@ -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

View File

@ -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);

View File

@ -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"

View File

@ -0,0 +1,82 @@
[gd_scene load_steps=9 format=3 uid="uid://cg70r0102t8nl"]
[ext_resource type="Texture2D" uid="uid://i75aktvgsdwg" path="res://base-environments/youth_room/import/textures/wires_normal.png" id="1_p3lcj"]
[ext_resource type="Texture2D" uid="uid://chisldkpt6bf5" path="res://base-environments/youth_room/import/textures/wires_albedo.png" id="1_xsr58"]
[ext_resource type="Script" path="res://addons/LineRenderer/line_renderer.gd" id="2_javfj"]
[ext_resource type="ArrayMesh" uid="uid://f5fr2e5gq313" path="res://base-environments/youth_room/shaders/fairy_light_diode.res" id="4_qh8yy"]
[sub_resource type="GDScript" id="GDScript_2caij"]
script/source = "@tool
extends Node3D
@export var light_array: Array[Vector3]:
set(points):
light_array = points
if is_inside_tree():
rebuild()
@onready var wires:LineRenderer3D = $wires
@onready var diodes:MultiMeshInstance3D = $diodes
@export var seed:int = 42
var rng = RandomNumberGenerator.new()
@export var size:float = 0.1:
set(new_size):
size = new_size
rebuild()
if is_inside_tree():
wires.end_thickness = size*0.1
wires.start_thickness = size*0.1
# Called when the node enters the scene tree for the first time.
func _ready():
rebuild()
func rebuild():
rng.seed = seed
rng.state = 0
for child in wires.get_children(): child.free()
wires.points = light_array
diodes.multimesh.instance_count = light_array.size()
var meshBuffer:PackedFloat32Array
for point in light_array:
rng
var base:Basis = Basis(Vector3(rng.randf_range(-1, 1), rng.randf_range(-1, 1), rng.randf_range(-1, 1)).normalized(), rng.randf_range(0, PI*2))
base = base.scaled(Vector3(size, size, size))
meshBuffer.append_array([base.x.x, base.x.y, base.x.z, point.x, base.y.x, base.y.y, base.y.z, point.y, base.z.x, base.z.y, base.z.z, point.z])
diodes.multimesh.buffer = meshBuffer
"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_5ca5e"]
transparency = 2
alpha_scissor_threshold = 0.5
alpha_antialiasing_mode = 0
cull_mode = 2
albedo_color = Color(0.368627, 0.368627, 0.368627, 1)
albedo_texture = ExtResource("1_xsr58")
normal_enabled = true
normal_texture = ExtResource("1_p3lcj")
[sub_resource type="ImmediateMesh" id="ImmediateMesh_u31or"]
[sub_resource type="MultiMesh" id="MultiMesh_ic3h7"]
transform_format = 1
instance_count = 30
mesh = ExtResource("4_qh8yy")
buffer = PackedFloat32Array(0.0998169, 0.00482103, -0.00365424, -0.545, -0.00428558, 0.0989875, 0.0135316, 0.915, 0.0042696, -0.0133502, 0.0990128, 1.035, 0.0700075, -0.0358849, 0.0617351, -0.47, 0.0525334, 0.0844406, -0.0104897, 0.855, -0.0483653, 0.0397751, 0.0779663, 0.905, 0.0042587, 0.0920312, -0.0388859, -0.44, -0.00571533, 0.0390819, 0.0918692, 0.871, 0.0997457, -0.00168997, 0.00692427, 0.78, 0.0219999, -0.0870806, -0.0439656, -0.385, 0.0800974, 0.041851, -0.0428124, 0.91, 0.0556813, -0.0257966, 0.0789565, 0.69, 0.0923335, 0.0288341, -0.0253597, -0.38, -0.0359662, 0.088075, -0.0308096, 0.995, 0.0134518, 0.0375685, 0.0916933, 0.595, 0.0410372, 0.0236122, 0.0880819, -0.39, -0.0818364, -0.0330796, 0.0469951, 0.925, 0.0402337, -0.0913685, 0.00574842, 0.465, 0.0963897, 0.0249758, -0.00923199, -0.364, -0.025153, 0.0967818, -0.000788714, 0.86, 0.0087379, 0.00308236, 0.0995698, 0.211, 0.0905162, -0.0353528, 0.0236008, -0.295, 0.00980512, 0.0713907, 0.0693341, 0.82, -0.0413604, -0.0604445, 0.0680866, 0.06, 0.0999699, -0.000440024, 0.00241425, -0.255, 0.00037743, 0.0999657, 0.0025912, 0.805, -0.00242483, -0.00258131, 0.0999373, -0.15, 0.0666952, -0.0744692, 0.00246829, -0.175, 0.0669796, 0.0613729, 0.0417982, 0.83, -0.0326417, -0.0262242, 0.090812, -0.355, 0.00827521, 0.0528018, -0.0845191, -0.135, 0.0951837, -0.0293119, -0.00899272, 0.955, -0.0295225, -0.0797043, -0.0526844, -0.515, 0.0983988, -0.0102168, 0.0146044, -0.025, 0.00642553, 0.0967642, 0.0244007, 0.78, -0.0166249, -0.0230716, 0.0958714, -0.615, -0.0341773, -0.0716575, -0.0608039, 0.115, 0.0144934, 0.059907, -0.078747, 0.63, 0.0928539, -0.0357262, -0.010089, -0.695, -0.0232891, -0.0711249, 0.066324, 0.245, 0.0795472, -0.0531651, -0.0290812, 0.555, 0.0559451, 0.0459861, 0.0689595, -0.745, -0.0599926, -0.0254553, -0.075848, 0.37, -0.0708402, 0.0609612, 0.0355725, 0.595, 0.0371828, 0.0750717, -0.0546048, -0.805, 0.0107775, 0.0912119, 0.0395505, 0.455, 0.0273445, -0.0409675, 0.0870284, 0.745, 0.0955831, 0.00143545, -0.0293567, -0.84, 0.0745873, 0.00700857, -0.0662391, 0.505, -0.0366242, 0.0873785, -0.0319947, 0.89, 0.0556363, 0.0481236, 0.0677401, -0.87, -0.0524777, -0.0408163, -0.0747002, 0.445, -0.0771795, -0.0142038, 0.0619805, 1.175, -0.0359084, 0.0901791, -0.024048, -0.87, 0.0652616, -0.0746751, 0.0128275, 0.26, -0.071962, -0.0663868, -0.0203536, 1.28, 0.0237149, 0.00405218, -0.0970628, -0.815, 0.0477617, -0.0860534, 0.0177096, 0.125, -0.0450234, -0.00666441, 0.089042, 1.35, -0.0754435, -0.0505014, -0.0419272, -0.8, 0.0526553, -0.07791, -0.0340215, -0.037, -0.0570784, -0.00274075, -0.0820643, 1.479, 0.0630038, 0.0626301, -0.0459129, -0.834, 0.0726285, 0.053708, 0.0429017, -0.2, -0.0349996, 0.0826095, -0.0441667, 1.601, -0.0591619, 0.0170622, 0.0787956, -0.851, 0.0581542, 0.0297762, -0.0757065, -0.359, -0.0464154, 0.0885717, -0.000817926, 1.769, 0.0668109, 0.0356151, 0.0653289, -0.85, 0.0875991, -0.0425381, 0.0227357, -0.5, 0.0336438, 0.0876653, 0.0343932, 1.949, -0.0345616, -0.022479, 0.0911054, -0.85, 0.0946831, -0.0299322, -0.0117972, -0.594, 0.0199689, 0.0259233, 0.0944946, 2.126, -0.0252261, -0.0918261, 0.0305222, -0.85, 0.0626413, -0.0766232, 0.0143161, -0.634, 0.0779479, 0.0616799, -0.0109416, 2.238, -0.000446323, 0.0180131, 0.0983633, -0.85, 0.0510754, -0.0397606, 0.076226, -0.634, -0.0155809, 0.0829139, 0.0536891, 2.035, -0.084549, -0.0392986, 0.0361536, -0.85, -0.055891, -0.072196, -0.0407913, -0.614, -0.0700671, 0.0148083, 0.0697948, 1.875, -0.0443486, 0.0675903, -0.0588622, -0.85, -0.0545317, 0.0517385, -0.0659501, -0.65, 0.0389976, 0.0853039, 0.0346761, 1.655, 0.0741989, -0.00680947, -0.0666945, -0.85, 0.0858331, 0.0430527, -0.0279131, -0.65, 0.0302511, -0.0864024, -0.040243, 1.475, -0.0414433, 0.0260978, -0.0871858, -0.87)
[node name="fairylights" type="Node3D"]
script = SubResource("GDScript_2caij")
light_array = Array[Vector3]([Vector3(0, 0, 0), Vector3(0, 1, 0)])
[node name="wires" type="MeshInstance3D" parent="."]
material_override = SubResource("StandardMaterial3D_5ca5e")
mesh = SubResource("ImmediateMesh_u31or")
script = ExtResource("2_javfj")
points = Array[Vector3]([Vector3(0, 0, 0), Vector3(0, 1, 0)])
start_thickness = 0.01
end_thickness = 0.01
use_global_coords = false
tile_texture = false
[node name="diodes" type="MultiMeshInstance3D" parent="."]
multimesh = SubResource("MultiMesh_ic3h7")

BIN
src/base-environments/youth_room/import/fairy_light.glb (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,57 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://cat2o0tdxahiq"
path="res://.godot/imported/fairy_light.glb-23acffacc6593c5a8045d4a2c6c8f3f3.scn"
[deps]
source_file="res://base-environments/youth_room/import/fairy_light.glb"
dest_files=["res://.godot/imported/fairy_light.glb-23acffacc6593c5a8045d4a2c6c8f3f3.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={
"materials": {
"emit": {
"use_external/enabled": true,
"use_external/path": "res://base-environments/youth_room/shaders/fairylight.material"
},
"halo": {
"use_external/enabled": true,
"use_external/path": "res://base-environments/youth_room/shaders/fairylight_halo.material"
}
},
"meshes": {
"fairy_light_diode": {
"generate/lightmap_uv": 0,
"generate/lods": 0,
"generate/shadow_meshes": 0,
"lods/normal_merge_angle": 60.0,
"lods/normal_split_angle": 25.0,
"save_to_file/enabled": true,
"save_to_file/make_streamable": "",
"save_to_file/path": "res://base-environments/youth_room/shaders/fairy_light_diode.res"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://chisldkpt6bf5"
path.s3tc="res://.godot/imported/wires_albedo.png-e2ca1c0cfbd554203dfd9c0e487f3b1c.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://base-environments/youth_room/import/textures/wires_albedo.png"
dest_files=["res://.godot/imported/wires_albedo.png-e2ca1c0cfbd554203dfd9c0e487f3b1c.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
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=0

Binary file not shown.

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://i75aktvgsdwg"
path.s3tc="res://.godot/imported/wires_normal.png-a1ed398b6f0bdd3bf06fa8d9f72a947e.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://base-environments/youth_room/import/textures/wires_normal.png"
dest_files=["res://.godot/imported/wires_normal.png-a1ed398b6f0bdd3bf06fa8d9f72a947e.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://base-environments/youth_room/import/textures/wires_normal.png"
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=0

View File

@ -38,7 +38,7 @@ mouse_cursor/custom_image="res://import/interface-elements/cursor.png"
[editor_plugins]
enabled=PackedStringArray()
enabled=PackedStringArray("res://addons/LineRenderer/plugin.cfg")
[filesystem]