# EffectLib TwoSideRenderer / ThreeSideRenderer angles, carried per face in UV2. # One particle simulation drives every face (no independent emitter randomness). extends RefCounted static func build(size: Vector2, billboard: int) -> Mesh: if billboard not in [4, 5]: var quad := QuadMesh.new() quad.size = size return quad var angles := [-30.0, 30.0] if billboard == 4 else [0.0, -60.0, 60.0] var vertices := PackedVector3Array() var normals := PackedVector3Array() var uv := PackedVector2Array() var uv2 := PackedVector2Array() var corners := [Vector2(0, 0), Vector2(0, 1), Vector2(1, 1), Vector2(0, 0), Vector2(1, 1), Vector2(1, 0)] for angle in angles: for corner in corners: vertices.append(Vector3((corner.x - 0.5) * size.x, (0.5 - corner.y) * size.y, 0)) normals.append(Vector3(0, 0, 1)) uv.append(corner) uv2.append(Vector2(deg_to_rad(angle), 0)) var arrays := [] arrays.resize(Mesh.ARRAY_MAX) arrays[Mesh.ARRAY_VERTEX] = vertices arrays[Mesh.ARRAY_NORMAL] = normals arrays[Mesh.ARRAY_TEX_UV] = uv arrays[Mesh.ARRAY_TEX_UV2] = uv2 var mesh := ArrayMesh.new() mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) return mesh