65 lines
1.4 KiB
GDScript
65 lines
1.4 KiB
GDScript
@tool
|
|
extends Node3D
|
|
|
|
|
|
const ScatterUtil := preload('./common/scatter_util.gd')
|
|
|
|
|
|
@export_category("ScatterShape")
|
|
@export var negative = false:
|
|
set(val):
|
|
negative = val
|
|
update_gizmos()
|
|
ScatterUtil.request_parent_to_rebuild(self)
|
|
|
|
@export var shape: ProtonScatterBaseShape:
|
|
set(val):
|
|
# Disconnect the previous shape if any
|
|
if shape and shape.changed.is_connected(_on_shape_changed):
|
|
shape.changed.disconnect(_on_shape_changed)
|
|
|
|
shape = val
|
|
if shape:
|
|
shape.changed.connect(_on_shape_changed)
|
|
|
|
update_gizmos()
|
|
ScatterUtil.request_parent_to_rebuild(self)
|
|
|
|
var _ignore_transform_notification = false
|
|
|
|
|
|
func _ready() -> void:
|
|
set_notify_transform(true)
|
|
|
|
|
|
func _notification(what):
|
|
match what:
|
|
NOTIFICATION_TRANSFORM_CHANGED:
|
|
if _ignore_transform_notification:
|
|
_ignore_transform_notification = false
|
|
return
|
|
ScatterUtil.request_parent_to_rebuild(self)
|
|
|
|
NOTIFICATION_ENTER_WORLD:
|
|
_ignore_transform_notification = true
|
|
|
|
|
|
func _set(property, _value):
|
|
if not Engine.is_editor_hint():
|
|
return false
|
|
|
|
# Workaround to detect when the node was duplicated from the editor.
|
|
if property == "transform":
|
|
_on_node_duplicated.call_deferred()
|
|
|
|
return false
|
|
|
|
|
|
func _on_shape_changed() -> void:
|
|
update_gizmos()
|
|
ScatterUtil.request_parent_to_rebuild(self)
|
|
|
|
|
|
func _on_node_duplicated() -> void:
|
|
shape = shape.get_copy() # Enfore uniqueness on duplicate, could be an option
|