Files
fps_project_1/addons/proton_scatter/src/modifiers/single_item.gd

56 lines
1.5 KiB
GDScript

@tool
extends "base_modifier.gd"
# Adds a single object with the given transform
@export var offset := Vector3.ZERO
@export var rotation := Vector3.ZERO
@export var scale := Vector3.ONE
func _init() -> void:
display_name = "Add Single Item"
category = "Create"
warning_ignore_no_shape = true
warning_ignore_no_transforms = true
can_restrict_height = false
global_reference_frame_available = true
local_reference_frame_available = true
individual_instances_reference_frame_available = false
use_local_space_by_default()
func _process_transforms(transforms, domain, _seed) -> void:
var gt: Transform3D = domain.get_global_transform()
var gt_inverse: Transform3D = gt.affine_inverse()
var t_origin := offset
var basis := Basis()
var x_axis = Vector3.RIGHT
var y_axis = Vector3.UP
var z_axis = Vector3.FORWARD
if is_using_global_space():
t_origin = gt_inverse.basis * t_origin
x_axis = gt_inverse.basis * x_axis
y_axis = gt_inverse.basis * y_axis
z_axis = gt_inverse.basis * z_axis
basis = gt_inverse.basis
basis = basis.rotated(x_axis, deg_to_rad(rotation.x))
basis = basis.rotated(y_axis, deg_to_rad(rotation.y))
basis = basis.rotated(z_axis, deg_to_rad(rotation.z))
var transform := Transform3D(basis, Vector3.ZERO)
if is_using_global_space():
var global_t: Transform3D = gt * transform
global_t.basis = global_t.basis.scaled(scale)
transform = gt_inverse * global_t
else:
transform = transform.scaled_local(scale)
transform.origin = t_origin
transforms.list.push_back(transform)