Added footsteps, new tree, various other tweaks
This commit is contained in:
94
addons/proton_scatter/src/modifiers/offset_scale.gd
Normal file
94
addons/proton_scatter/src/modifiers/offset_scale.gd
Normal file
@@ -0,0 +1,94 @@
|
||||
@tool
|
||||
extends "base_modifier.gd"
|
||||
|
||||
|
||||
@export_enum("Offset:0", "Multiply:1", "Override:2") var operation: int = 1
|
||||
@export var scale := Vector3(1, 1, 1)
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
display_name = "Edit Scale"
|
||||
category = "Offset"
|
||||
can_restrict_height = false
|
||||
global_reference_frame_available = true
|
||||
local_reference_frame_available = true
|
||||
individual_instances_reference_frame_available = true
|
||||
use_individual_instances_space_by_default()
|
||||
|
||||
documentation.add_paragraph("Scales every transform.")
|
||||
|
||||
var p := documentation.add_parameter("Scale")
|
||||
p.set_type("Vector3")
|
||||
p.set_description("How much to scale the transform along each axes (X, Y, Z)")
|
||||
|
||||
|
||||
func _process_transforms(transforms, domain, _seed) -> void:
|
||||
var s_gt: Transform3D = domain.get_global_transform()
|
||||
var s_lt: Transform3D = domain.get_local_transform()
|
||||
var s_gt_inverse := s_gt.affine_inverse()
|
||||
var s_lt_inverse := s_lt.affine_inverse()
|
||||
var basis: Basis
|
||||
var t: Transform3D
|
||||
var tmp_t: Transform3D
|
||||
|
||||
for i in transforms.size():
|
||||
t = transforms.list[i]
|
||||
basis = t.basis
|
||||
|
||||
match operation:
|
||||
0: # Offset
|
||||
if is_using_individual_instances_space():
|
||||
var current_scale := basis.get_scale()
|
||||
var s = (current_scale + scale) / current_scale
|
||||
basis = t.scaled_local(s).basis
|
||||
|
||||
elif is_using_global_space():
|
||||
# Convert to global space, scale, convert back to local space
|
||||
tmp_t = s_gt * t
|
||||
var current_scale: Vector3 = tmp_t.basis.get_scale()
|
||||
tmp_t.basis = tmp_t.basis.scaled((current_scale + scale) / current_scale)
|
||||
basis = (s_gt_inverse * tmp_t).basis
|
||||
|
||||
else:
|
||||
var current_scale: Vector3 = basis.get_scale()
|
||||
basis = basis.scaled((current_scale + scale) / current_scale)
|
||||
|
||||
1: # Multiply
|
||||
if is_using_individual_instances_space():
|
||||
basis = t.scaled_local(scale).basis
|
||||
|
||||
elif is_using_global_space():
|
||||
# Convert to global space, scale, convert back to local space
|
||||
tmp_t = s_gt * t
|
||||
tmp_t = tmp_t.scaled(scale)
|
||||
basis = (s_gt_inverse * tmp_t).basis
|
||||
|
||||
else:
|
||||
basis = basis.scaled(scale)
|
||||
|
||||
2: # Override
|
||||
if is_using_individual_instances_space():
|
||||
var t_scale: Vector3 = basis.get_scale()
|
||||
t_scale.x = (1.0 / t_scale.x) * scale.x
|
||||
t_scale.y = (1.0 / t_scale.y) * scale.y
|
||||
t_scale.z = (1.0 / t_scale.z) * scale.z
|
||||
basis = t.scaled_local(t_scale).basis
|
||||
|
||||
elif is_using_global_space():
|
||||
# Convert to global space, scale, convert back to local space
|
||||
tmp_t = t * s_gt
|
||||
var t_scale: Vector3 = tmp_t.basis.get_scale()
|
||||
t_scale.x = (1.0 / t_scale.x) * scale.x
|
||||
t_scale.y = (1.0 / t_scale.y) * scale.y
|
||||
t_scale.z = (1.0 / t_scale.z) * scale.z
|
||||
tmp_t.basis = tmp_t.basis.scaled(t_scale)
|
||||
basis = (s_gt_inverse * tmp_t).basis
|
||||
|
||||
else:
|
||||
var t_scale: Vector3 = basis.get_scale()
|
||||
t_scale.x = (1.0 / t_scale.x) * scale.x
|
||||
t_scale.y = (1.0 / t_scale.y) * scale.y
|
||||
t_scale.z = (1.0 / t_scale.z) * scale.z
|
||||
basis = basis.scaled(t_scale)
|
||||
|
||||
transforms.list[i].basis = basis
|
||||
Reference in New Issue
Block a user