Skip to content

Commit 3c4d268

Browse files
authored
Version 1.0.4
1 parent 1f6d06b commit 3c4d268

File tree

9 files changed

+209
-70
lines changed

9 files changed

+209
-70
lines changed

addons/simplegrasstextured/about.gd

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
@tool
2+
extends AcceptDialog
3+
4+
5+
func _ready():
6+
get_ok_button().custom_minimum_size.x = 100
7+
8+
9+
func _on_rich_text_label_meta_clicked(meta):
10+
OS.shell_open(str(meta))

addons/simplegrasstextured/about.tscn

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
[gd_scene load_steps=5 format=3 uid="uid://cb8klhv6nwvtl"]
2+
3+
[ext_resource type="Texture2D" uid="uid://bsmcpupaj02v8" path="res://addons/simplegrasstextured/icon.svg" id="1_at31v"]
4+
[ext_resource type="Script" path="res://addons/simplegrasstextured/about.gd" id="1_r23hh"]
5+
6+
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_hnw4u"]
7+
8+
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_lwftf"]
9+
10+
[node name="Control" type="AcceptDialog"]
11+
title = "About"
12+
size = Vector2i(520, 215)
13+
min_size = Vector2i(520, 200)
14+
max_size = Vector2i(1280, 720)
15+
script = ExtResource("1_r23hh")
16+
17+
[node name="MarginContainer" type="MarginContainer" parent="."]
18+
offset_left = 8.0
19+
offset_top = 8.0
20+
offset_right = 512.0
21+
offset_bottom = 166.0
22+
theme_override_constants/margin_left = 10
23+
theme_override_constants/margin_top = 10
24+
theme_override_constants/margin_right = 10
25+
theme_override_constants/margin_bottom = 10
26+
27+
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"]
28+
layout_mode = 2
29+
theme_override_constants/separation = 20
30+
31+
[node name="TextureRect" type="TextureRect" parent="MarginContainer/HBoxContainer"]
32+
custom_minimum_size = Vector2(48, 48)
33+
layout_mode = 2
34+
texture = ExtResource("1_at31v")
35+
stretch_mode = 4
36+
37+
[node name="RichTextLabel" type="RichTextLabel" parent="MarginContainer/HBoxContainer"]
38+
layout_mode = 2
39+
size_flags_horizontal = 3
40+
theme_override_styles/focus = SubResource("StyleBoxEmpty_hnw4u")
41+
theme_override_styles/normal = SubResource("StyleBoxEmpty_lwftf")
42+
bbcode_enabled = true
43+
text = "Simple Grass Textured Plugin
44+
v. 1.0.4
45+
by IcterusGames
46+
[font_size=7] [/font_size]
47+
[url]https://icterusgames.itch.io/[/url]
48+
[font_size=7] [/font_size]
49+
[url]https://github.com/IcterusGames/SimpleGrassTextured[/url]
50+
"
51+
52+
[connection signal="meta_clicked" from="MarginContainer/HBoxContainer/RichTextLabel" to="." method="_on_rich_text_label_meta_clicked"]

addons/simplegrasstextured/grass.gd

+6-8
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,6 @@ func _update_multimesh():
184184
var pos_max := pos_min * -1
185185
var center := Vector3.ZERO
186186
var radius := 0.0
187-
var r_index := []
188187
for trans in _buffer_add:
189188
if pos_min > trans.origin:
190189
pos_min = trans.origin
@@ -194,14 +193,13 @@ func _update_multimesh():
194193
radius = center.distance_to(pos_min) + 1.0
195194
for i in range(multimesh.instance_count):
196195
var trans := multimesh.get_instance_transform(i)
197-
if trans.origin.distance_to(center) <= radius:
198-
r_index.append(i)
199-
for i in r_index:
200-
var trans := multimesh.get_instance_transform(i)
196+
if trans.origin.distance_to(center) > radius:
197+
continue
201198
for trans_add in _buffer_add:
202-
if trans_add.origin.distance_to(trans.origin) <= sgt_dist_min:
203-
_buffer_add.erase(trans_add)
204-
break
199+
if trans_add.origin.distance_to(trans.origin) > sgt_dist_min:
200+
continue
201+
_buffer_add.erase(trans_add)
202+
break
205203
multi_new.instance_count = count_prev + _buffer_add.size()
206204
for i in range(multimesh.instance_count):
207205
multi_new.set_instance_transform(i, multimesh.get_instance_transform(i))

addons/simplegrasstextured/images/win_pattern.png.import

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ type="CompressedTexture2D"
55
uid="uid://i566v0wqsfa"
66
path.s3tc="res://.godot/imported/win_pattern.png-c44fa1ee331bdb684ff53320dba8c2b3.s3tc.ctex"
77
metadata={
8-
"imported_formats": ["s3tc"],
8+
"imported_formats": ["s3tc_bptc"],
99
"vram_texture": true
1010
}
1111

@@ -17,9 +17,9 @@ dest_files=["res://.godot/imported/win_pattern.png-c44fa1ee331bdb684ff53320dba8c
1717
[params]
1818

1919
compress/mode=2
20+
compress/high_quality=false
2021
compress/lossy_quality=0.7
2122
compress/hdr_compression=1
22-
compress/bptc_ldr=0
2323
compress/normal_map=0
2424
compress/channel_pack=0
2525
mipmaps/generate=true

addons/simplegrasstextured/plugin.cfg

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="SimpleGrassTextured"
44
description="Create simple grass textured"
55
author="IcterusGames"
6-
version="1.0.3"
6+
version="1.0.4"
77
script="plugin.gd"

addons/simplegrasstextured/plugin.gd

+84-46
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,15 @@ extends EditorPlugin
2626

2727
const DEPTH_BRUSH := 10.0
2828

29+
enum EVENT_MOUSE {
30+
EVENT_NONE,
31+
EVENT_MOVE,
32+
EVENT_CLICK,
33+
}
34+
2935
var _raycast_3d : RayCast3D = null
3036
var _decal_pointer : Decal = null
3137
var _grass_selected = null
32-
var _timer_draw : Timer = null
3338
var _position_draw := Vector3.ZERO
3439
var _normal_draw := Vector3.ZERO
3540
var _object_draw : Object = null
@@ -41,6 +46,11 @@ var _edit_rotation_rand := 1.0
4146
var _edit_draw := true : set = _on_set_draw
4247
var _edit_erase := false : set = _on_set_erase
4348
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
4454

4555

4656
func _enter_tree():
@@ -59,11 +69,8 @@ func _enter_tree():
5969
_decal_pointer.set_texture(Decal.TEXTURE_ALBEDO, load("res://addons/simplegrasstextured/images/pointer.png"))
6070
_decal_pointer.visible = false
6171
_decal_pointer.extents = Vector3(_edit_radius, DEPTH_BRUSH, _edit_radius)
62-
_timer_draw = Timer.new()
63-
_timer_draw.timeout.connect(_on_timer_draw_timeout)
6472
add_child(_raycast_3d)
6573
add_child(_decal_pointer)
66-
add_child(_timer_draw)
6774
_gui_toolbar.slider_radius.value_changed.connect(_on_slider_radius_value_changed)
6875
_gui_toolbar.slider_density.value_changed.connect(_on_slider_density_value_changed)
6976
_gui_toolbar.button_draw.toggled.connect(_on_button_draw_toggled)
@@ -91,72 +98,59 @@ func _get_plugin_name() -> String:
9198
func _handles(object) -> bool:
9299
if object != null and object.has_meta("SimpleGrassTextured") and object.visible:
93100
_grass_selected = object
101+
_update_gui()
94102
return true
95103
_grass_selected = null
96104
return false
97105

98106

99107
func _edit(object : Variant):
100108
_grass_selected = object
109+
_update_gui()
101110

102111

103112
func _make_visible(visible : bool):
104113
if visible:
105114
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()
115116
_gui_toolbar.visible = true
116117
else:
117118
_gui_toolbar.visible = false
118119
_decal_pointer.visible = false
119120
_grass_selected = null
120121

121122

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
151144
_raycast_3d.target_position = Vector3(0, 100000, 0)
152145
_raycast_3d.force_raycast_update()
153146
if ( not _raycast_3d.is_colliding()
154147
or ( _object_draw != null and _raycast_3d.get_collider() != _object_draw )):
155148
_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
158152
else:
159-
_timer_draw.paused = false
153+
_draw_paused = false
160154
_position_draw = _raycast_3d.get_collision_point()
161155
_normal_draw = _raycast_3d.get_collision_normal()
162156
var trans := Transform3D()
@@ -173,9 +167,53 @@ func _forward_3d_gui_input(viewport_camera: Camera3D, event: InputEvent) -> int:
173167
_decal_pointer.global_transform = trans
174168
_decal_pointer.extents = Vector3(_edit_radius, DEPTH_BRUSH, _edit_radius)
175169
_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
176201
return EditorPlugin.AFTER_GUI_INPUT_PASS
177202

178203

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+
179217
func _on_button_draw_toggled(pressed : bool):
180218
_edit_draw = pressed
181219
if _edit_draw:
@@ -253,7 +291,7 @@ func _on_set_erase(value : bool):
253291
_gui_toolbar.button_erase.button_pressed = _edit_erase
254292

255293

256-
func _on_timer_draw_timeout():
294+
func _eval_brush():
257295
if _grass_selected == null:
258296
return
259297
if _edit_draw:

addons/simplegrasstextured/textures/grassbushcc008.png.import

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ type="CompressedTexture2D"
55
uid="uid://c4ggdp0kg5wjk"
66
path.s3tc="res://.godot/imported/grassbushcc008.png-7110abc2a2a9dc117662bb95ed60be39.s3tc.ctex"
77
metadata={
8-
"imported_formats": ["s3tc"],
8+
"imported_formats": ["s3tc_bptc"],
99
"vram_texture": true
1010
}
1111

@@ -17,9 +17,9 @@ dest_files=["res://.godot/imported/grassbushcc008.png-7110abc2a2a9dc117662bb95ed
1717
[params]
1818

1919
compress/mode=2
20+
compress/high_quality=false
2021
compress/lossy_quality=0.7
2122
compress/hdr_compression=1
22-
compress/bptc_ldr=0
2323
compress/normal_map=0
2424
compress/channel_pack=0
2525
mipmaps/generate=true

addons/simplegrasstextured/toolbar.gd

+8
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ extends HBoxContainer
3939
@onready var _label_density := $HSliderDensity/Label as Label
4040
@onready var _tween_radius : Tween = null
4141
@onready var _tween_density : Tween = null
42+
var _win_about = load("res://addons/simplegrasstextured/about.tscn").instantiate()
4243

4344

4445
func _ready():
46+
get_window().call_deferred(StringName("add_child"), _win_about)
4547
_on_theme_changed()
4648

4749

@@ -74,3 +76,9 @@ func _on_theme_changed():
7476
$IconRadius.modulate = get_theme_color("font_color", "Label")
7577
$IconDensity.modulate = get_theme_color("font_color", "Label")
7678
$IconDistance.modulate = get_theme_color("font_color", "Label")
79+
80+
81+
func _on_panel_container_gui_input(event):
82+
if event is InputEventMouseButton:
83+
if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
84+
_win_about.popup_centered()

0 commit comments

Comments
 (0)