forked from ThePathfindersCodex/Godot-Boids-Compute-Shader
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.gd
More file actions
104 lines (89 loc) · 3.96 KB
/
main.gd
File metadata and controls
104 lines (89 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
extends Node2D
var slider_bindings = {
"%SliderSpeed": "dt",
"%SliderVisionRadius": "vision_radius",
"%SliderAlignmentForce": "alignment_force",
"%SliderCohesionForce": "cohesion_force",
"%SliderSeparationForce": "separation_force",
"%SliderSteeringForce": "steering_force",
"%SliderMinSpeed": "min_speed",
"%SliderMaxSpeed": "max_speed",
"%SliderDrag": "drag",
"%SliderMovementRandomness": "movement_randomness",
"%SliderMovementScaling": "movement_scaling"
}
func _ready():
# Connect all sliders and set defaults
for slider_path in slider_bindings.keys():
var slider = get_node(slider_path)
var property = slider_bindings[slider_path]
slider.value = %ComputeBoids.get(property)
slider.connect("value_changed", Callable(self, "_on_slider_changed").bind(property))
# Options default values
%OptionStartPointCount.selected = 3
#
func _process(_delta):
# SET READOUT VALUES
%LabelPointsValue.text = str(snapped(%ComputeBoids.boids_count,1))
%LabelSpeedValue.text = str(snapped(%ComputeBoids.dt,.01))
%LabelVisionRadiusValue.text = str(snapped(%ComputeBoids.vision_radius,1))
%LabelAlignmentForceValue.text = str(snapped(%ComputeBoids.alignment_force,.1))
%LabelCohesionForceValue.text = str(snapped(%ComputeBoids.cohesion_force,.1))
%LabelSeparationForceValue.text = str(snapped(%ComputeBoids.separation_force,.1))
%LabelSteeringForceValue.text = str(snapped(%ComputeBoids.steering_force,.1))
%LabelMinSpeedValue.text = str(snapped(%ComputeBoids.min_speed,.1))
%LabelMaxSpeedValue.text = str(snapped(%ComputeBoids.max_speed,.1))
%LabelDragValue.text = str(snapped(%ComputeBoids.drag,.01))
%LabelSliderMovementRandomnessValue.text = str(snapped(%ComputeBoids.movement_randomness,.1))
%LabelSliderMovementScalingValue.text = str(snapped(%ComputeBoids.movement_scaling,.1))
%LabelCamCenterValue.text = "("+str(snapped(%ComputeBoids.camera_center.x,.1))+ ", " + str(snapped(%ComputeBoids.camera_center.y,.1)) + ")"
%LabelZoomValue.text = str(snapped(%ComputeBoids.zoom,.01))
# HANDLE PAUSE/RESUME
if Input.is_action_just_pressed("pause_resume"):
pause_resume()
func pause_resume():
if %ComputeBoids.dt == 0.0:
%ComputeBoids.dt = %ComputeBoids.paused_dt # resume
%ButtonPauseResume.text = "PAUSE"
else:
%ComputeBoids.paused_dt = %ComputeBoids.dt # store current
%ComputeBoids.dt = 0.0 # pause
%ButtonPauseResume.text = "RESUME"
func _on_slider_changed(value: float, property: String):
%ComputeBoids.set(property, value)
func _on_button_restart_pressed() -> void:
%ComputeBoids.restart_simulation()
func _on_button_pause_resume_pressed() -> void:
pause_resume()
func _on_option_start_point_count_item_selected(index: int) -> void:
%ComputeBoids.start_boids_count=int(%OptionStartPointCount.get_item_text(index))
func _on_button_toggle_compute_texture_pressed() -> void:
if (%ComputeBoids.texture == null):
# show compute texture
%ComputeBoids.texture = %ComputeBoids.textureRD # DEBUG attach the compute texture to the display node
%MMI.visible = false
else:
# default show final render
%ComputeBoids.texture = null
%MMI.visible = true
# HANDLE MOUSE INPUTS
var dragging := false
var last_mouse_pos := Vector2()
func _unhandled_input(event):
if (%ComputeBoids.texture != null):
return
if event is InputEventMouseButton:
# Handle zoom
if event.button_index == MOUSE_BUTTON_WHEEL_UP:
%ComputeBoids.zoom = clamp(%ComputeBoids.zoom * 1.05, %ComputeBoids.MIN_ZOOM, %ComputeBoids.MAX_ZOOM)
elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
%ComputeBoids.zoom = clamp(%ComputeBoids.zoom / 1.05, %ComputeBoids.MIN_ZOOM, %ComputeBoids.MAX_ZOOM)
# Start/stop panning with right mouse button
elif event.button_index == MOUSE_BUTTON_RIGHT:
dragging = event.pressed
last_mouse_pos = event.position
elif event is InputEventMouseMotion and dragging:
# Convert drag delta to world space based on zoom
var delta : Vector2 = (event.position - last_mouse_pos) / %ComputeBoids.zoom
last_mouse_pos = event.position
%ComputeBoids.camera_center -= delta