From 563efbec27249cea6e2e1c1ca8189e2325f3a7e6 Mon Sep 17 00:00:00 2001 From: Alan Araujo <35024229+aaforcebox@users.noreply.github.com> Date: Thu, 31 Mar 2022 21:23:27 -0300 Subject: [PATCH 1/2] Create TrailRendererGodot4 Godot4 standalone port! Thanks for the 3.2 version! --- TrailRenderScriptClass/TrailRendererGodot4 | 125 +++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 TrailRenderScriptClass/TrailRendererGodot4 diff --git a/TrailRenderScriptClass/TrailRendererGodot4 b/TrailRenderScriptClass/TrailRendererGodot4 new file mode 100644 index 0000000..a6c29cc --- /dev/null +++ b/TrailRenderScriptClass/TrailRendererGodot4 @@ -0,0 +1,125 @@ +extends Node3D +class_name TrailRenderer + +############################# +# EXPORT PARAMS +############################# +# width +@export var width: float = 0.5 +@export var width_curve: Curve +# length +@export var max_points := 100 +@export var material: Material +# show or hide +@export var render: bool = true + + +############################# +# PARAMS +############################# +@onready var half_width = width * 0.5 +var points := [] + + +############################# +# OVERRIDE FUNCTIONS +############################# +func _ready() -> void: + var node = Node.new() + node.name = "Node" + add_child(node) + + var render = MeshInstance3D.new() + render.name = "Render" + node.add_child(render) + + +func _process(delta: float) -> void: + if render: + # add new point and render + add_point() + _draw_trail() + else: + # slowly hide the trail + if points.size() > 0: + var last_point = points.pop_back() + last_point.queue_free() + + +############################# +# API +############################# +func add_point() -> void: + var new_point = Position3D.new() + new_point.position = self.global_transform.origin + new_point.rotation = self.global_transform.basis.get_euler() + points.insert(0, new_point) + if points.size() > max_points: + var last_point = points.pop_back() + last_point.queue_free() + + +func _draw_trail() -> void: + if points.size() < 2: + return + # create surface tool + var st = SurfaceTool.new() + st.begin(Mesh.PRIMITIVE_TRIANGLES) + # draw triangles + for i in range(points.size() - 1): + _points_to_rect(st, points[i], points[i + 1], i) + # commit + st.generate_normals() +# st.generate_tangents() + $Node/Render.mesh = st.commit() + $Node/Render.set_surface_override_material(0, material) + + +func _points_to_rect(st: SurfaceTool, p1: Position3D, p2: Position3D, idx: float) -> void: + var num_points = points.size() - 1 + + var offset1 = idx / num_points + var mod1 = half_width * width_curve.interpolate(offset1) + + var v1 = p1.position + p1.transform.basis.x * mod1 + var uv1 = Vector2(0, offset1) + + var v2 = p1.position - p1.transform.basis.x * mod1 + var uv2 = Vector2(1, offset1) + + var offset2 = (idx + 1) / num_points + var mod2 = half_width * width_curve.interpolate(offset2) + + var v3 = p2.position + p2.transform.basis.x * mod2 + var uv3 = Vector2(0, offset2) + + var v4 = p2.position - p2.transform.basis.x * mod2 + var uv4 = Vector2(1, offset2) + + st.set_uv(uv1) + st.add_vertex(v1) + st.set_uv(uv2) + st.add_vertex(v2) + st.set_uv(uv3) + st.add_vertex(v3) + + st.set_uv(uv3) + st.add_vertex(v3) + st.set_uv(uv2) + st.add_vertex(v2) + st.set_uv(uv1) + st.add_vertex(v1) + + st.set_uv(uv3) + st.add_vertex(v3) + st.set_uv(uv4) + st.add_vertex(v4) + st.set_uv(uv2) + st.add_vertex(v2) + + st.set_uv(uv2) + st.add_vertex(v2) + st.set_uv(uv4) + st.add_vertex(v4) + st.set_uv(uv3) + st.add_vertex(v3) From 1ae33df88ad94fd27d1932e63416554b57398029 Mon Sep 17 00:00:00 2001 From: Alan Araujo <35024229+aaforcebox@users.noreply.github.com> Date: Thu, 31 Mar 2022 21:25:22 -0300 Subject: [PATCH 2/2] Rename TrailRendererGodot4 to TrailRendererGodot4.gd --- .../{TrailRendererGodot4 => TrailRendererGodot4.gd} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename TrailRenderScriptClass/{TrailRendererGodot4 => TrailRendererGodot4.gd} (100%) diff --git a/TrailRenderScriptClass/TrailRendererGodot4 b/TrailRenderScriptClass/TrailRendererGodot4.gd similarity index 100% rename from TrailRenderScriptClass/TrailRendererGodot4 rename to TrailRenderScriptClass/TrailRendererGodot4.gd