32 lines
1.2 KiB
GDScript
32 lines
1.2 KiB
GDScript
# 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
|