diff --git a/modules/terrain_editor/point_primitive_node.cpp b/modules/terrain_editor/point_primitive_node.cpp index fb9bcb53..ae23a569 100644 --- a/modules/terrain_editor/point_primitive_node.cpp +++ b/modules/terrain_editor/point_primitive_node.cpp @@ -7,6 +7,7 @@ void PointPrimitiveNode::_bind_methods() { BIND_GET_SET(primitive); ClassDB::bind_method(D_METHOD("push_transform_changes"), &self_type::push_transform_changes); + ClassDB::bind_method(D_METHOD("preview_transform_changes"), &self_type::preview_transform_changes); } void PointPrimitiveNode::on_underlying_changed() { @@ -30,6 +31,22 @@ void PointPrimitiveNode::_notification(int what) { } } +void PointPrimitiveNode::preview_transform_changes() { + if (this->primitive.is_valid()) { + this->pushing_change = true; + Vector3 const position{ get_global_position() }; + Vector2 const center{ position.x, position.z }; + if (center != this->primitive->get_center()) { + this->primitive->set_center(center); + } + if (position.y != this->primitive->get_height()) { + this->primitive->set_height(position.y); + } + + this->pushing_change = false; + } +} + void PointPrimitiveNode::push_transform_changes() { if (this->primitive.is_valid()) { this->pushing_change = true; diff --git a/modules/terrain_editor/point_primitive_node.h b/modules/terrain_editor/point_primitive_node.h index 1a5e9fe7..3c11f1d7 100644 --- a/modules/terrain_editor/point_primitive_node.h +++ b/modules/terrain_editor/point_primitive_node.h @@ -12,6 +12,7 @@ protected: void _notification(int what); public: + void preview_transform_changes(); void push_transform_changes(); void set_primitive(Ref primitive); Ref get_primitive() const; diff --git a/project/objects/primitive_nodes/point_primitive_node.tscn b/project/objects/primitive_nodes/point_primitive_node.tscn index e5a2c3c0..8b7d4cac 100644 --- a/project/objects/primitive_nodes/point_primitive_node.tscn +++ b/project/objects/primitive_nodes/point_primitive_node.tscn @@ -7,6 +7,16 @@ script/source = "extends Area3D var dragged : bool = false +var refresh_time : float +@onready +var parent := get_parent() as PointPrimitiveNode + +func _process(delta): + if dragged and refresh_time < 0.0: + parent.preview_transform_changes.call_deferred() + refresh_time = 0.3 + elif dragged: + refresh_time -= minf(delta, 0.05) func _input(event: InputEvent) -> void: if not dragged: @@ -14,11 +24,11 @@ func _input(event: InputEvent) -> void: if event is InputEventMouseButton and not (event as InputEventMouseButton).is_pressed(): dragged = false Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - $\"..\".push_transform_changes.call_deferred() + parent.push_transform_changes.call_deferred() get_viewport().set_input_as_handled() elif event is InputEventMouseMotion: var motion := event as InputEventMouseMotion - get_parent_node_3d().global_position.y -= motion.screen_relative.y + parent.global_position.y -= motion.screen_relative.y get_viewport().set_input_as_handled() func _input_event(_camera: Camera3D, event: InputEvent, _event_position: Vector3, _normal: Vector3, _shape_idx: int) -> void: @@ -37,6 +47,16 @@ script/source = "extends Area3D var dragged : bool = false var slope_adjusted : float = 0.0 +var refresh_time : float +@onready +var parent = get_parent() as PointPrimitiveNode + +func _process(delta): + if dragged and refresh_time < 0.0: + parent.get_primitive().set_deferred(\"slope\", slope_adjusted) + refresh_time = 0.3 + elif dragged: + refresh_time -= minf(delta, 0.05) func _input(event: InputEvent) -> void: if not dragged: @@ -66,6 +86,16 @@ func _input_event(_camera: Camera3D, event: InputEvent, _event_position: Vector3 script/source = "extends Area3D var dragged : bool = false +var refresh_time : float +@onready +var parent = get_parent() as PointPrimitiveNode + +func _process(delta): + if dragged and refresh_time < 0.0: + parent.preview_transform_changes.call_deferred() + refresh_time = 0.3 + elif dragged: + refresh_time -= minf(delta, 0.05) func _input(event: InputEvent) -> void: if not dragged: @@ -73,19 +103,20 @@ func _input(event: InputEvent) -> void: if event is InputEventMouseButton and not (event as InputEventMouseButton).is_pressed(): dragged = false Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - $\"..\".push_transform_changes.call_deferred() + parent.push_transform_changes.call_deferred() get_viewport().set_input_as_handled() elif event is InputEventMouseMotion: var motion := event as InputEventMouseMotion var cam_basis := get_viewport().get_camera_3d().global_basis var x_axis := Vector3(cam_basis.x.x, 0, cam_basis.x.z).normalized() var z_axis := Vector3(cam_basis.z.x, 0, cam_basis.z.z).normalized() - get_parent_node_3d().global_position += motion.screen_relative.y * z_axis + motion.screen_relative.x * x_axis + parent.global_position += motion.screen_relative.y * z_axis + motion.screen_relative.x * x_axis get_viewport().set_input_as_handled() func _input_event(_camera: Camera3D, event: InputEvent, _event_position: Vector3, _normal: Vector3, _shape_idx: int) -> void: if not dragged and event is InputEventMouseButton and (event as InputEventMouseButton).is_pressed(): dragged = true + set_process_input(true) Input.mouse_mode = Input.MOUSE_MODE_CAPTURED get_viewport().set_input_as_handled() "