extends SS2D_Action ## ActionDeletePoints const TUP := preload("res://addons/rmsmartshape/lib/tuple.gd") const ActionInvertOrientation := preload("res://addons/rmsmartshape/actions/action_invert_orientation.gd") var _invert_orientation: ActionInvertOrientation const ActionCloseShape := preload("res://addons/rmsmartshape/actions/action_close_shape.gd") var _close_shape: ActionCloseShape var _shape: SS2D_Shape var _keys: PackedInt32Array var _indicies: PackedInt32Array var _positions: PackedVector2Array var _points_in: PackedVector2Array var _points_out: PackedVector2Array var _properties: Array[SS2D_VertexProperties] var _constraints: Array[Dictionary] var _was_closed: bool var _commit_update: bool func _init(shape: SS2D_Shape, keys: PackedInt32Array, commit_update: bool = true) -> void: _shape = shape _invert_orientation = ActionInvertOrientation.new(shape) _close_shape = ActionCloseShape.new(shape) _commit_update = commit_update for k in keys: add_point_to_delete(k) func get_name() -> String: return "Delete Points %s" % [_keys] func do() -> void: _shape.begin_update() _was_closed = _shape.is_shape_closed() var first_run := _positions.size() == 0 for k in _keys: if first_run: _indicies.append(_shape.get_point_index(k)) _positions.append(_shape.get_point_position(k)) _points_in.append(_shape.get_point_in(k)) _points_out.append(_shape.get_point_out(k)) _properties.append(_shape.get_point_properties(k)) _shape.remove_point(k) if _was_closed: _close_shape.do() _invert_orientation.do() if _commit_update: _shape.end_update() func undo() -> void: _shape.begin_update() _invert_orientation.undo() if _was_closed: _close_shape.undo() for i in range(_keys.size()-1, -1, -1): _shape.add_point(_positions[i], _indicies[i], _keys[i]) _shape.set_point_in(_keys[i], _points_in[i]) _shape.set_point_out(_keys[i], _points_out[i]) _shape.set_point_properties(_keys[i], _properties[i]) # Restore point constraints. for i in range(_keys.size()-1, -1, -1): for tuple: Vector2i in _constraints[i]: _shape.set_constraint(tuple[0], tuple[1], _constraints[i][tuple]) _shape.end_update() func add_point_to_delete(key: int) -> void: _keys.push_back(key) var constraints := _shape.get_point_array().get_point_constraints(key) # Save point constraints. _constraints.append(constraints) for tuple: Vector2i in constraints: var constraint: SS2D_Point_Array.CONSTRAINT = constraints[tuple] if constraint == SS2D_Point_Array.CONSTRAINT.NONE: continue var key_other := SS2D_IndexTuple.get_other_value(tuple, key) if constraint & SS2D_Point_Array.CONSTRAINT.ALL: if not _keys.has(key_other): add_point_to_delete(key_other)