32 lines
1022 B
GDScript
32 lines
1022 B
GDScript
@tool
|
|
class_name CSGCircularPattern
|
|
extends CSGPattern
|
|
|
|
@export var radius: float = 5.0
|
|
@export var points: int = 8
|
|
@export var layers: int = 1
|
|
## If 0 use template_size.y
|
|
@export var layer_height: float = 0.0
|
|
## Additional gap added per layer beyond base height
|
|
@export var layer_spacing: float = 0.0
|
|
|
|
func _generate(ctx: Dictionary) -> Array:
|
|
var positions: Array = []
|
|
var template_size: Vector3 = ctx.get("template_size", Vector3.ONE)
|
|
var rad: float = max(0.0, radius)
|
|
var count: int = max(1, points)
|
|
if count <= 1:
|
|
return [Vector3.ZERO]
|
|
var lyr_count = max(1, layers)
|
|
var base_y = layer_height if layer_height > 0.0 else template_size.y
|
|
var step_y = base_y + max(0.0, layer_spacing)
|
|
for i in range(count):
|
|
var angle = (i * TAU) / count
|
|
var base_pos = Vector3(cos(angle) * rad, 0, sin(angle) * rad)
|
|
for layer in range(lyr_count):
|
|
positions.append(base_pos + Vector3(0, layer * step_y, 0))
|
|
return positions
|
|
|
|
func get_estimated_count(ctx: Dictionary) -> int:
|
|
return max(1, points) * max(1, layers)
|