Skip to content

Commit f555281

Browse files
committed
Convert and update code for 4.2
The 4.1 editor crashes during exiting in combination with registering singletons. This problem does not occur in 4.2, so use that instead.
1 parent fcd4f18 commit f555281

11 files changed

Lines changed: 206 additions & 172 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ compile_commands.json
1111
*.dylib
1212

1313
# Godot-specific ignores
14+
.godot/
1415
.import/
1516
export.cfg
1617
export_presets.cfg

demo/addons/ropesim/Rope.gd

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
tool
1+
@tool
22
extends Node2D
33
class_name Rope
44

@@ -7,26 +7,26 @@ class_name Rope
77
signal on_registered()
88
signal on_unregistered()
99

10-
export var pause: bool = false setget _set_pause # Pause simulation
11-
export var num_segments: int = 10 setget _set_num_segs # Amount of segments the rope consists of.
12-
export var rope_length: float = 100 setget _set_length # The length of the rope.
13-
export var segment_length_distribution: Curve setget _set_seg_dist # (Optional) Allows to non-uniformly distribute rope segment lengths. Useful to add more detail/precision to certain parts of the rope.
14-
export var stiffness: float = 0.0 # Stiffness forces the rope to return to its resting position.
15-
export var gravity: float = 100 # Gravity
16-
export var damping: float = 0 # Friction
17-
export var damping_curve: Curve # (Optional) Apply different amounts of damping along the rope.
18-
export var num_constraint_iterations: int = 10 # Constraints the rope to its intended length. Less constraint iterations effectively makes the rope more elastic.
19-
20-
export var render_debug: bool = false setget _set_draw_debug # Render segments for debugging debug
21-
export var render_line: bool = true setget _set_render_line # Render the rope using lines.
22-
export var line_width: float = 2 setget _set_line_width # Render line widht
23-
export var color: Color = Color.white setget _set_color # Render color
24-
export var color_gradient: Gradient setget _set_gradient # (Optional) A color gradient along the rope.
25-
26-
var _colors := PoolColorArray()
27-
var _seg_lengths := PoolRealArray()
28-
var _points := PoolVector2Array()
29-
var _oldpoints := PoolVector2Array()
10+
@export var pause: bool = false: set = _set_pause
11+
@export var num_segments: int = 10: set = _set_num_segs
12+
@export var rope_length: float = 100: set = _set_length
13+
@export var segment_length_distribution: Curve: set = _set_seg_dist
14+
@export var stiffness: float = 0.0 # Stiffness forces the rope to return to its resting position.
15+
@export var gravity: float = 100 # Gravity
16+
@export var damping: float = 0 # Friction
17+
@export var damping_curve: Curve # (Optional) Apply different amounts of damping along the rope.
18+
@export var num_constraint_iterations: int = 10 # Constraints the rope to its intended length. Less constraint iterations effectively makes the rope more elastic.
19+
20+
@export var render_debug: bool = false: set = _set_draw_debug
21+
@export var render_line: bool = true: set = _set_render_line
22+
@export var line_width: float = 2: set = _set_line_width
23+
@export var color: Color = Color.WHITE: set = _set_color
24+
@export var color_gradient: Gradient: set = _set_gradient
25+
26+
var _colors := PackedColorArray()
27+
var _seg_lengths := PackedFloat32Array()
28+
var _points := PackedVector2Array()
29+
var _oldpoints := PackedVector2Array()
3030
var _registered: bool = false
3131

3232

@@ -35,7 +35,7 @@ var _registered: bool = false
3535
func _enter_tree() -> void:
3636
_setup()
3737

38-
if Engine.iterations_per_second != 60:
38+
if Engine.physics_ticks_per_second != 60:
3939
push_warning("Verlet Integration is FPS dependant -> Only 60 FPS are supported")
4040

4141

@@ -45,7 +45,7 @@ func _exit_tree() -> void:
4545

4646
func _on_post_update() -> void:
4747
if visible:
48-
update()
48+
queue_redraw()
4949

5050

5151
func _draw() -> void:
@@ -60,12 +60,12 @@ func _draw() -> void:
6060

6161
if render_debug:
6262
for i in _points.size():
63-
draw_circle(_points[i], line_width / 2, Color.red)
63+
draw_circle(_points[i], line_width / 2, Color.RED)
6464

6565

6666
# Logic
6767

68-
func _setup(reset: bool = true) -> void:
68+
func _setup(run_reset: bool = true) -> void:
6969
if not is_inside_tree():
7070
return
7171

@@ -90,7 +90,7 @@ func _setup(reset: bool = true) -> void:
9090
# simultaneously.
9191
damping_curve.bake()
9292

93-
if reset:
93+
if run_reset:
9494
reset()
9595
_start_stop_process()
9696

@@ -106,24 +106,24 @@ func _start_stop_rendering() -> void:
106106
# Re-register (or not) to hook NativeRopeServer.on_post_update() if neccessary.
107107
_unregister_server()
108108
_start_stop_process()
109-
update()
109+
queue_redraw()
110110

111111

112112
func _register_server():
113113
if not _registered:
114114
NativeRopeServer.register_rope(self)
115115
emit_signal("on_registered")
116116
if render_debug or render_line:
117-
NativeRopeServer.connect("on_post_update", self, "_on_post_update") # warning-ignore: return_value_discarded
117+
NativeRopeServer.connect("on_post_update", Callable(self, "_on_post_update")) # warning-ignore: return_value_discarded
118118
_registered = true
119119

120120

121121
func _unregister_server():
122122
if _registered:
123123
NativeRopeServer.unregister_rope(self)
124124
emit_signal("on_unregistered")
125-
if NativeRopeServer.is_connected("on_post_update", self, "_on_post_update"):
126-
NativeRopeServer.disconnect("on_post_update", self, "_on_post_update")
125+
if NativeRopeServer.is_connected("on_post_update", Callable(self, "_on_post_update")):
126+
NativeRopeServer.disconnect("on_post_update", Callable(self, "_on_post_update"))
127127
_registered = false
128128

129129

@@ -137,9 +137,9 @@ func update_colors():
137137
_colors.resize(_points.size())
138138

139139
for i in _colors.size():
140-
_colors[i] = color * color_gradient.interpolate(get_point_perc(i))
140+
_colors[i] = color * color_gradient.sample(get_point_perc(i))
141141

142-
update()
142+
queue_redraw()
143143

144144

145145
# Recompute segment lengths according to rope_length, num_segments and segment_length_distribution curve.
@@ -152,7 +152,7 @@ func update_segments():
152152
var length = 0.0
153153

154154
for i in _seg_lengths.size():
155-
_seg_lengths[i] = segment_length_distribution.interpolate(get_point_perc(i + 1))
155+
_seg_lengths[i] = segment_length_distribution.sample(get_point_perc(i + 1))
156156
length += _seg_lengths[i]
157157

158158
var scaling = rope_length / length
@@ -215,12 +215,12 @@ func move_point(index: int, vec: Vector2) -> void:
215215

216216

217217
# Makes a copy! PoolVector2Array is pass-by-value.
218-
func get_points() -> PoolVector2Array:
218+
func get_points() -> PackedVector2Array:
219219
return _points
220220

221221

222222
# Makes a copy! PoolVector2Array is pass-by-value.
223-
func get_old_points() -> PoolVector2Array:
223+
func get_old_points() -> PackedVector2Array:
224224
return _oldpoints
225225

226226

@@ -234,14 +234,14 @@ func reset(dir: Vector2 = Vector2.DOWN) -> void:
234234
for i in range(1, _points.size()):
235235
_points[i] = _points[i - 1] + dir * get_segment_length(i - 1)
236236
_oldpoints = _points
237-
update()
237+
queue_redraw()
238238

239239

240-
func set_points(points: PoolVector2Array) -> void:
240+
func set_points(points: PackedVector2Array) -> void:
241241
_points = points
242242

243243

244-
func set_old_points(points: PoolVector2Array) -> void:
244+
func set_old_points(points: PackedVector2Array) -> void:
245245
_oldpoints = points
246246

247247

@@ -251,7 +251,7 @@ func get_color(index: int) -> Color:
251251
return color
252252

253253

254-
func get_segment_lengths() -> PoolRealArray:
254+
func get_segment_lengths() -> PackedFloat32Array:
255255
return _seg_lengths
256256

257257

@@ -275,7 +275,7 @@ func _set_render_line(value: bool):
275275

276276
func _set_line_width(value: float):
277277
line_width = value
278-
update()
278+
queue_redraw()
279279

280280
func _set_color(value: Color):
281281
color = value
@@ -287,17 +287,17 @@ func _set_pause(value: bool):
287287

288288
func _set_gradient(value: Gradient):
289289
if color_gradient:
290-
color_gradient.disconnect("changed", self, "update_colors")
290+
color_gradient.disconnect("changed", Callable(self, "update_colors"))
291291
color_gradient = value
292292
if color_gradient:
293-
color_gradient.connect("changed", self, "update_colors") # warning-ignore: return_value_discarded
293+
color_gradient.connect("changed", Callable(self, "update_colors")) # warning-ignore: return_value_discarded
294294
update_colors()
295295

296296
func _set_seg_dist(value: Curve):
297297
if segment_length_distribution:
298-
segment_length_distribution.disconnect("changed", self, "update_segments")
298+
segment_length_distribution.disconnect("changed", Callable(self, "update_segments"))
299299
segment_length_distribution = value
300300
if segment_length_distribution:
301-
segment_length_distribution.connect("changed", self, "update_segments") # warning-ignore: return_value_discarded
301+
segment_length_distribution.connect("changed", Callable(self, "update_segments")) # warning-ignore: return_value_discarded
302302
update_segments()
303303

demo/addons/ropesim/RopeAnchor.gd

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
tool
2-
extends Position2D
1+
@tool
2+
extends Marker2D
33
class_name RopeAnchor
44

55
# Gets emitted just after applying the position.
66
signal on_after_update()
77

8-
export var force_update: bool setget _set_force_update # Can be used in the Inspector to force an update
9-
export var enable: bool = true setget set_enable, get_enable # Enable or disable.
10-
export(NodePath) var rope_path setget set_rope_path # Target rope path.
11-
export(float, 0, 1) var rope_position = 1.0 # Position on the rope between 0 and 1.
12-
export var apply_angle := false # Also apply rotation according to the rope curvature.
8+
@export var force_update: bool: set = _set_force_update
9+
@export var enable: bool = true: get = get_enable, set = set_enable # Enable or disable.
10+
@export var rope_path: NodePath: set = set_rope_path
11+
@export var rope_position = 1.0 # Position on the rope between 0 and 1. # (float, 0, 1)
12+
@export var apply_angle := false # Also apply rotation according to the rope curvature.
1313
## If false, only consider the nearest vertex on the rope. Otherwise, interpolate the position between two relevant points when applicable.
14-
export var precise: bool = false
14+
@export var precise: bool = false
1515
var _helper: RopeToolHelper
1616

1717

@@ -61,5 +61,5 @@ func _update() -> void:
6161

6262

6363
func _set_force_update(_val: bool) -> void:
64-
if Engine.editor_hint and _helper.target_rope:
64+
if Engine.is_editor_hint() and _helper.target_rope:
6565
_update()

demo/addons/ropesim/RopeCollisionShapeGenerator.gd

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
tool
1+
@tool
22
extends Node
33
class_name RopeCollisionShapeGenerator
44

55
# Populates the parent with CollisionShape2Ds with a SegmentShape2D to fit the target rope.
66
# It can be added as child to an Area2D for example, to detect if something collides with the rope.
77
# It does _not_ make the rope interact with other physics objects.
88

9-
export var enable: bool = true setget set_enable, get_enable # Enable or disable.
10-
export(NodePath) var rope_path setget set_rope_path # Target rope path.
9+
@export var enable: bool = true: get = get_enable, set = set_enable # Enable or disable.
10+
@export var rope_path: NodePath: set = set_rope_path
1111

1212
var _helper: RopeToolHelper
1313
var _colliders := [] # Array[CollisionShape2D]
@@ -81,7 +81,7 @@ func _update_shapes() -> void:
8181

8282
for i in _colliders.size():
8383
var shape: CollisionShape2D = _colliders[i]
84-
shape.global_transform = Transform2D(0, Vector2.ZERO) # set_as_toplevel() is buggy with collision shapes
84+
shape.global_transform = Transform2D(0, Vector2.ZERO) # set_as_top_level() is buggy with collision shapes
8585
var seg: SegmentShape2D = shape.shape
8686
seg.a = points[i]
8787
seg.b = points[i + 1]

demo/addons/ropesim/RopeHandle.gd

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
tool
2-
extends Position2D
1+
@tool
2+
extends Marker2D
33
class_name RopeHandle
44

55
# Gets emitted just before applying the position.
66
signal on_before_update()
77

8-
export var enable: bool = true setget set_enable, get_enable # Enable or disable
9-
export(NodePath) var rope_path setget set_rope_path # Target rope path
10-
export(float, 0, 1) var rope_position = 1.0 # Position on the rope between 0 and 1.
11-
export var smoothing: bool = false # Whether to smoothly snap to RopeHandle's position instead of instantly.
12-
export var smoothing_speed: float = 0.5 # Smoothing speed
8+
@export var enable: bool = true: get = get_enable, set = set_enable # Enable or disable
9+
@export var rope_path: NodePath: set = set_rope_path
10+
@export var rope_position = 1.0 # Position on the rope between 0 and 1. # (float, 0, 1)
11+
@export var smoothing: bool = false # Whether to smoothly snap to RopeHandle's position instead of instantly.
12+
@export var position_smoothing_speed: float = 0.5 # Smoothing speed
1313
## If false, only affect the nearest vertex on the rope. Otherwise, affect both surrounding points when applicable.
14-
export var precise: bool = false
14+
@export var precise: bool = false
1515
var _helper: RopeToolHelper
1616

1717

@@ -49,7 +49,7 @@ func _on_pre_update() -> void:
4949

5050
func _move_point(idx: int, from: Vector2, to: Vector2) -> void:
5151
if smoothing:
52-
to = from.linear_interpolate(to, get_physics_process_delta_time() * smoothing_speed)
52+
to = from.lerp(to, get_physics_process_delta_time() * position_smoothing_speed)
5353
_helper.target_rope.set_point(idx, to)
5454

5555

demo/addons/ropesim/RopeRendererLine2D.gd

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
tool
1+
@tool
22
extends Line2D
33
class_name RopeRendererLine2D
44

55
const UPDATE_HOOK = "on_post_update"
66
const HOOK_FUNC = "refresh"
77

8-
export var force_update: bool setget _force_update # Can be used in Editor to force regenerating.
9-
export var target_rope_path: NodePath = ".." setget set_rope_path # Target rope path
10-
export var keep_rope_position: bool = true setget _set_keep_pos # Render at the rope's position instead of RopeRendererLine2D's position.
11-
export var auto_update: bool = true setget set_auto_update, get_auto_update # Automatically update
12-
export var invert: bool = false
8+
@export var force_update: bool: set = _force_update
9+
@export var target_rope_path: NodePath = "..": set = set_rope_path
10+
@export var keep_rope_position: bool = true: set = _set_keep_pos
11+
@export var auto_update: bool = true: get = get_auto_update, set = set_auto_update
12+
@export var invert: bool = false
1313
var _helper: RopeToolHelper
1414

1515

@@ -29,18 +29,22 @@ func refresh() -> void:
2929
var target: Rope = _helper.target_rope
3030

3131
if target and target.get_num_points() > 0 and visible:
32-
var transform: Transform2D
32+
var xform: Transform2D
33+
3334
if keep_rope_position:
34-
if Engine.editor_hint:
35-
transform = Transform2D(0, -global_position - target.get_point(0) + target.global_position)
35+
if Engine.is_editor_hint():
36+
xform = Transform2D(0, -global_position - target.get_point(0) + target.global_position)
3637
else:
37-
transform = Transform2D(0, -global_position)
38+
xform = Transform2D(0, -global_position)
3839
else:
39-
transform = Transform2D(0, -target.get_point(0))
40-
transform = transform.scaled(scale)
41-
var p: PoolVector2Array = transform.xform(target.get_points())
40+
xform = Transform2D(0, -target.get_point(0))
41+
42+
xform = xform.scaled(scale)
43+
var p: PackedVector2Array = xform * target.get_points()
44+
4245
if invert:
43-
p.invert()
46+
p.reverse()
47+
4448
points = p
4549
global_rotation = 0
4650

@@ -62,7 +66,6 @@ func _set_keep_pos(value: bool):
6266

6367

6468
func set_auto_update(value: bool):
65-
auto_update = value
6669
_helper.enable = value
6770

6871
func get_auto_update() -> bool:

0 commit comments

Comments
 (0)