feat: implemented live refresh

This commit is contained in:
Sara Gerretsen 2025-12-08 22:21:28 +01:00
parent bab106eeea
commit 7ed438bcb2
3 changed files with 53 additions and 4 deletions

View file

@ -7,6 +7,7 @@
void PointPrimitiveNode::_bind_methods() { void PointPrimitiveNode::_bind_methods() {
BIND_GET_SET(primitive); BIND_GET_SET(primitive);
ClassDB::bind_method(D_METHOD("push_transform_changes"), &self_type::push_transform_changes); 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() { 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() { void PointPrimitiveNode::push_transform_changes() {
if (this->primitive.is_valid()) { if (this->primitive.is_valid()) {
this->pushing_change = true; this->pushing_change = true;

View file

@ -12,6 +12,7 @@ protected:
void _notification(int what); void _notification(int what);
public: public:
void preview_transform_changes();
void push_transform_changes(); void push_transform_changes();
void set_primitive(Ref<PointPrimitive> primitive); void set_primitive(Ref<PointPrimitive> primitive);
Ref<PointPrimitive> get_primitive() const; Ref<PointPrimitive> get_primitive() const;

View file

@ -7,6 +7,16 @@
script/source = "extends Area3D script/source = "extends Area3D
var dragged : bool = false 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: func _input(event: InputEvent) -> void:
if not dragged: if not dragged:
@ -14,11 +24,11 @@ func _input(event: InputEvent) -> void:
if event is InputEventMouseButton and not (event as InputEventMouseButton).is_pressed(): if event is InputEventMouseButton and not (event as InputEventMouseButton).is_pressed():
dragged = false dragged = false
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
$\"..\".push_transform_changes.call_deferred() parent.push_transform_changes.call_deferred()
get_viewport().set_input_as_handled() get_viewport().set_input_as_handled()
elif event is InputEventMouseMotion: elif event is InputEventMouseMotion:
var motion := event as 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() get_viewport().set_input_as_handled()
func _input_event(_camera: Camera3D, event: InputEvent, _event_position: Vector3, _normal: Vector3, _shape_idx: int) -> void: 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 dragged : bool = false
var slope_adjusted : float = 0.0 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: func _input(event: InputEvent) -> void:
if not dragged: if not dragged:
@ -66,6 +86,16 @@ func _input_event(_camera: Camera3D, event: InputEvent, _event_position: Vector3
script/source = "extends Area3D script/source = "extends Area3D
var dragged : bool = false 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: func _input(event: InputEvent) -> void:
if not dragged: if not dragged:
@ -73,19 +103,20 @@ func _input(event: InputEvent) -> void:
if event is InputEventMouseButton and not (event as InputEventMouseButton).is_pressed(): if event is InputEventMouseButton and not (event as InputEventMouseButton).is_pressed():
dragged = false dragged = false
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
$\"..\".push_transform_changes.call_deferred() parent.push_transform_changes.call_deferred()
get_viewport().set_input_as_handled() get_viewport().set_input_as_handled()
elif event is InputEventMouseMotion: elif event is InputEventMouseMotion:
var motion := event as InputEventMouseMotion var motion := event as InputEventMouseMotion
var cam_basis := get_viewport().get_camera_3d().global_basis 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 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() 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() get_viewport().set_input_as_handled()
func _input_event(_camera: Camera3D, event: InputEvent, _event_position: Vector3, _normal: Vector3, _shape_idx: int) -> void: 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(): if not dragged and event is InputEventMouseButton and (event as InputEventMouseButton).is_pressed():
dragged = true dragged = true
set_process_input(true)
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
get_viewport().set_input_as_handled() get_viewport().set_input_as_handled()
" "