@@ -26,10 +26,15 @@ extends EditorPlugin
26
26
27
27
const DEPTH_BRUSH := 10.0
28
28
29
+ enum EVENT_MOUSE {
30
+ EVENT_NONE ,
31
+ EVENT_MOVE ,
32
+ EVENT_CLICK ,
33
+ }
34
+
29
35
var _raycast_3d : RayCast3D = null
30
36
var _decal_pointer : Decal = null
31
37
var _grass_selected = null
32
- var _timer_draw : Timer = null
33
38
var _position_draw := Vector3 .ZERO
34
39
var _normal_draw := Vector3 .ZERO
35
40
var _object_draw : Object = null
@@ -41,6 +46,11 @@ var _edit_rotation_rand := 1.0
41
46
var _edit_draw := true : set = _on_set_draw
42
47
var _edit_erase := false : set = _on_set_erase
43
48
var _gui_toolbar = null
49
+ var _time_draw := 0
50
+ var _draw_paused := true
51
+ var _mouse_event := EVENT_MOUSE .EVENT_NONE
52
+ var _project_ray_origin := Vector3 .INF
53
+ var _project_ray_normal := Vector3 .INF
44
54
45
55
46
56
func _enter_tree ():
@@ -59,11 +69,8 @@ func _enter_tree():
59
69
_decal_pointer .set_texture (Decal .TEXTURE_ALBEDO , load ("res://addons/simplegrasstextured/images/pointer.png" ))
60
70
_decal_pointer .visible = false
61
71
_decal_pointer .extents = Vector3 (_edit_radius , DEPTH_BRUSH , _edit_radius )
62
- _timer_draw = Timer .new ()
63
- _timer_draw .timeout .connect (_on_timer_draw_timeout )
64
72
add_child (_raycast_3d )
65
73
add_child (_decal_pointer )
66
- add_child (_timer_draw )
67
74
_gui_toolbar .slider_radius .value_changed .connect (_on_slider_radius_value_changed )
68
75
_gui_toolbar .slider_density .value_changed .connect (_on_slider_density_value_changed )
69
76
_gui_toolbar .button_draw .toggled .connect (_on_button_draw_toggled )
@@ -91,72 +98,59 @@ func _get_plugin_name() -> String:
91
98
func _handles (object ) -> bool :
92
99
if object != null and object .has_meta ("SimpleGrassTextured" ) and object .visible :
93
100
_grass_selected = object
101
+ _update_gui ()
94
102
return true
95
103
_grass_selected = null
96
104
return false
97
105
98
106
99
107
func _edit (object : Variant ):
100
108
_grass_selected = object
109
+ _update_gui ()
101
110
102
111
103
112
func _make_visible (visible : bool ):
104
113
if visible :
105
114
if _grass_selected != null :
106
- _gui_toolbar .slider_radius .value = _grass_selected .sgt_radius
107
- _gui_toolbar .slider_density .value = _grass_selected .sgt_density
108
- _gui_toolbar .edit_scale .value = _grass_selected .sgt_scale
109
- _gui_toolbar .edit_rotation .value = _grass_selected .sgt_rotation
110
- _gui_toolbar .edit_rotation_rand .value = _grass_selected .sgt_rotation_rand
111
- _gui_toolbar .edit_distance .value = _grass_selected .sgt_dist_min
112
- _gui_toolbar .chk_normals .button_pressed = _grass_selected .sgt_follow_normal
113
- if _grass_selected .multimesh != null :
114
- _gui_toolbar .label_stats .text = "Count: " + str (_grass_selected .multimesh .instance_count )
115
+ _update_gui ()
115
116
_gui_toolbar .visible = true
116
117
else :
117
118
_gui_toolbar .visible = false
118
119
_decal_pointer .visible = false
119
120
_grass_selected = null
120
121
121
122
122
- func _forward_3d_gui_input (viewport_camera : Camera3D , event : InputEvent ) -> int :
123
- if _grass_selected == null :
124
- return EditorPlugin .AFTER_GUI_INPUT_PASS
125
- if _grass_selected .multimesh != null :
126
- _gui_toolbar .label_stats .text = "Count: " + str (_grass_selected .multimesh .instance_count )
127
- if event is InputEventMouseButton :
128
- if event .button_index == MOUSE_BUTTON_LEFT :
129
- if not (_edit_draw or _edit_erase ):
130
- return EditorPlugin .AFTER_GUI_INPUT_PASS
131
- if event .pressed :
132
- _raycast_3d .global_transform .origin = viewport_camera .project_ray_origin (event .position )
133
- _raycast_3d .global_transform .basis .y = viewport_camera .project_ray_normal (event .position )
134
- _raycast_3d .target_position = Vector3 (0 , 100000 , 0 )
135
- _raycast_3d .force_raycast_update ()
136
- if _raycast_3d .is_colliding ():
137
- _position_draw = _raycast_3d .get_collision_point ()
138
- _normal_draw = _raycast_3d .get_collision_normal ()
139
- _object_draw = _raycast_3d .get_collider ()
140
- _on_timer_draw_timeout ()
141
- _timer_draw .start (0.15 )
142
- else :
143
- _object_draw = null
144
- else :
145
- _object_draw = null
146
- _timer_draw .stop ()
147
- return EditorPlugin .AFTER_GUI_INPUT_STOP
148
- if event is InputEventMouseMotion :
149
- _raycast_3d .global_transform .origin = viewport_camera .project_ray_origin (event .position )
150
- _raycast_3d .global_transform .basis .y = viewport_camera .project_ray_normal (event .position )
123
+ func _physics_process (_delta ):
124
+ if _mouse_event == EVENT_MOUSE .EVENT_CLICK :
125
+ _raycast_3d .global_transform .origin = _project_ray_origin
126
+ _raycast_3d .global_transform .basis .y = _project_ray_normal
127
+ _raycast_3d .target_position = Vector3 (0 , 100000 , 0 )
128
+ _raycast_3d .force_raycast_update ()
129
+ if _raycast_3d .is_colliding ():
130
+ _position_draw = _raycast_3d .get_collision_point ()
131
+ _normal_draw = _raycast_3d .get_collision_normal ()
132
+ _object_draw = _raycast_3d .get_collider ()
133
+ _eval_brush ()
134
+ _time_draw = Time .get_ticks_msec ()
135
+ _draw_paused = false
136
+ else :
137
+ _time_draw = 0
138
+ _draw_paused = true
139
+ _object_draw = null
140
+ _mouse_event = EVENT_MOUSE .EVENT_NONE
141
+ elif _mouse_event == EVENT_MOUSE .EVENT_MOVE :
142
+ _raycast_3d .global_transform .origin = _project_ray_origin
143
+ _raycast_3d .global_transform .basis .y = _project_ray_normal
151
144
_raycast_3d .target_position = Vector3 (0 , 100000 , 0 )
152
145
_raycast_3d .force_raycast_update ()
153
146
if ( not _raycast_3d .is_colliding ()
154
147
or ( _object_draw != null and _raycast_3d .get_collider () != _object_draw )):
155
148
_decal_pointer .visible = false
156
- _timer_draw .paused = true
157
- return EditorPlugin .AFTER_GUI_INPUT_PASS
149
+ _draw_paused = true
150
+ _mouse_event = EVENT_MOUSE .EVENT_NONE
151
+ return
158
152
else :
159
- _timer_draw . paused = false
153
+ _draw_paused = false
160
154
_position_draw = _raycast_3d .get_collision_point ()
161
155
_normal_draw = _raycast_3d .get_collision_normal ()
162
156
var trans := Transform3D ()
@@ -173,9 +167,53 @@ func _forward_3d_gui_input(viewport_camera: Camera3D, event: InputEvent) -> int:
173
167
_decal_pointer .global_transform = trans
174
168
_decal_pointer .extents = Vector3 (_edit_radius , DEPTH_BRUSH , _edit_radius )
175
169
_decal_pointer .visible = _edit_draw or _edit_erase
170
+ _mouse_event = EVENT_MOUSE .EVENT_NONE
171
+ if _time_draw > 0 :
172
+ if not _draw_paused :
173
+ if Time .get_ticks_msec () - _time_draw >= 150 :
174
+ _time_draw = Time .get_ticks_msec ()
175
+ _eval_brush ()
176
+
177
+
178
+ func _forward_3d_gui_input (viewport_camera : Camera3D , event : InputEvent ) -> int :
179
+ if _grass_selected == null :
180
+ return EditorPlugin .AFTER_GUI_INPUT_PASS
181
+ if _grass_selected .multimesh != null :
182
+ _gui_toolbar .label_stats .text = "Count: " + str (_grass_selected .multimesh .instance_count )
183
+ if event is InputEventMouseButton :
184
+ if event .button_index == MOUSE_BUTTON_LEFT :
185
+ if not (_edit_draw or _edit_erase ):
186
+ return EditorPlugin .AFTER_GUI_INPUT_PASS
187
+ if event .pressed :
188
+ _project_ray_origin = viewport_camera .project_ray_origin (event .position )
189
+ _project_ray_normal = viewport_camera .project_ray_normal (event .position )
190
+ _mouse_event = EVENT_MOUSE .EVENT_CLICK
191
+ else :
192
+ _time_draw = 0
193
+ _object_draw = null
194
+ _mouse_event = EVENT_MOUSE .EVENT_NONE
195
+ return EditorPlugin .AFTER_GUI_INPUT_STOP
196
+ if event is InputEventMouseMotion :
197
+ if _mouse_event != EVENT_MOUSE .EVENT_CLICK :
198
+ _project_ray_origin = viewport_camera .project_ray_origin (event .position )
199
+ _project_ray_normal = viewport_camera .project_ray_normal (event .position )
200
+ _mouse_event = EVENT_MOUSE .EVENT_MOVE
176
201
return EditorPlugin .AFTER_GUI_INPUT_PASS
177
202
178
203
204
+ func _update_gui ():
205
+ if _grass_selected != null :
206
+ _gui_toolbar .slider_radius .value = _grass_selected .sgt_radius
207
+ _gui_toolbar .slider_density .value = _grass_selected .sgt_density
208
+ _gui_toolbar .edit_scale .value = _grass_selected .sgt_scale
209
+ _gui_toolbar .edit_rotation .value = _grass_selected .sgt_rotation
210
+ _gui_toolbar .edit_rotation_rand .value = _grass_selected .sgt_rotation_rand
211
+ _gui_toolbar .edit_distance .value = _grass_selected .sgt_dist_min
212
+ _gui_toolbar .chk_normals .button_pressed = _grass_selected .sgt_follow_normal
213
+ if _grass_selected .multimesh != null :
214
+ _gui_toolbar .label_stats .text = "Count: " + str (_grass_selected .multimesh .instance_count )
215
+
216
+
179
217
func _on_button_draw_toggled (pressed : bool ):
180
218
_edit_draw = pressed
181
219
if _edit_draw :
@@ -253,7 +291,7 @@ func _on_set_erase(value : bool):
253
291
_gui_toolbar .button_erase .button_pressed = _edit_erase
254
292
255
293
256
- func _on_timer_draw_timeout ():
294
+ func _eval_brush ():
257
295
if _grass_selected == null :
258
296
return
259
297
if _edit_draw :
0 commit comments