ImmediateMesh lines
A mesh cleared and rebuilt vertex by vertex every frame, with a line strip and a line surface.
The editor above is running this project. Change a line and it reloads.
Godot classes used
ImmediateMeshMeshInstance3DStandardMaterial3D
The code
scripts/main.gd
extends Node
const POINTS: int = 460
const SPOKE_STEP: int = 12
const FLOOR: float = -3.2
var mesh: ImmediateMesh
var elapsed: float = 0.0
func _ready() -> void:
_add_environment()
mesh = ImmediateMesh.new()
var instance: MeshInstance3D = MeshInstance3D.new()
instance.mesh = mesh
instance.material_override = _make_material()
add_child(instance)
var camera: Camera3D = Camera3D.new()
camera.position = Vector3(0, 1.5, 7.4)
add_child(camera)
camera.look_at(Vector3.ZERO, Vector3.UP)
camera.current = true
print('the curve is rebuilt vertex by vertex every frame, nothing is cached')
func _process(delta: float) -> void:
elapsed += delta
mesh.clear_surfaces()
mesh.surface_begin(Mesh.PRIMITIVE_LINE_STRIP)
for i in POINTS + 1:
var point: Vector3 = _curve(TAU * i / POINTS)
mesh.surface_set_color(Color('#8da5f3').lerp(Color('#8eef97'), sin(TAU * i / POINTS + elapsed) * 0.5 + 0.5))
mesh.surface_add_vertex(point)
mesh.surface_end()
mesh.surface_begin(Mesh.PRIMITIVE_LINES)
for i in range(0, POINTS, SPOKE_STEP):
var point: Vector3 = _curve(TAU * i / POINTS)
mesh.surface_set_color(Color('#f3d48d'))
mesh.surface_add_vertex(point)
mesh.surface_set_color(Color('#12141a'))
mesh.surface_add_vertex(Vector3(point.x, FLOOR, point.z))
mesh.surface_end()
func _curve(t: float) -> Vector3:
return Vector3(
sin(t * 3.0 + elapsed * 0.4) * 3.2,
sin(t * 4.0 + elapsed * 0.7) * 1.9,
cos(t * 2.0 + elapsed * 0.3) * 3.2
)
func _make_material() -> StandardMaterial3D:
var material: StandardMaterial3D = StandardMaterial3D.new()
material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
material.vertex_color_use_as_albedo = true
return material
func _add_environment() -> void:
var env: Environment = Environment.new()
env.background_mode = Environment.BG_COLOR
env.background_color = Color('#12141a')
env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
env.ambient_light_color = Color('#2a2f3d')
var world: WorldEnvironment = WorldEnvironment.new()
world.environment = env
add_child(world)