Skip to content

Commit 71c9278

Browse files
authored
Version 1.0.3
1 parent 27b7f01 commit 71c9278

14 files changed

+925
-69
lines changed

addons/simplegrasstextured/grass.gd

Lines changed: 94 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,47 @@ extends MultiMeshInstance3D
2929
@export var player_radius := 0.5 : set = _on_set_player_radius
3030
@export_color_no_alpha var albedo := Color.WHITE : set = _on_set_albedo
3131
@export var texture_albedo : Texture = load("res://addons/simplegrasstextured/textures/grassbushcc008.png") : set = _on_set_texture_albedo
32-
@export var alpha_scissor_threshold := 0.5 : set = _on_set_alpha_scissor_threshold
32+
@export_range(0.0, 1.0) var alpha_scissor_threshold := 0.5 : set = _on_set_alpha_scissor_threshold
3333
@export var scale_h := 1.0 : set = _on_set_scale_h
3434
@export var scale_w := 1.0 : set = _on_set_scale_w
3535
@export var scale_var := -0.25 : set = _on_set_scale_var
3636
@export_range(0.0, 1.0) var grass_strength := 0.8 : set = _on_set_grass_strength
3737
@export var wind_dir := Vector3.RIGHT : set = _on_set_wind_dir
38-
@export var wind_strength := 0.03 : set = _on_set_wind_strength
39-
@export var wind_speed := 1.0 : set = _on_set_wind_speed
38+
@export var wind_strength := 0.15 : set = _on_set_wind_strength
39+
@export var wind_turbulence := 1.0 : set = _on_set_wind_turbulence
40+
@export var wind_pattern : Texture = load("res://addons/simplegrasstextured/images/win_pattern.png") : set = _on_set_wind_pattern
41+
@export_group("Optimization")
4042
@export var optimization_by_distance := false : set = _on_set_optimization_by_distance
4143
@export var optimization_level := 7.0 : set = _on_set_optimization_level
44+
@export var optimization_dist_min := 10.0 : set = _on_set_optimization_dist_min
45+
@export var optimization_dist_max := 50.0 : set = _on_set_optimization_dist_max
4246

43-
var dist_min : float = 0.0
47+
var sgt_radius := 2.0
48+
var sgt_density := 25
49+
var sgt_scale := 1.0
50+
var sgt_rotation := 0.0
51+
var sgt_rotation_rand := 1.0
52+
var sgt_dist_min := 0.0
53+
var sgt_follow_normal := false
4454

4555
var _default_mesh : Mesh = null
4656
var _buffer_add : Array[Transform3D] = []
4757
var _material := load("res://addons/simplegrasstextured/materials/grass.material").duplicate() as ShaderMaterial
4858
var _force_update_multimesh := false
59+
var _properties = []
4960

5061

5162
func _init():
5263
_default_mesh = _build_default_mesh()
64+
if Engine.is_editor_hint():
65+
for var_i in get_property_list():
66+
if not var_i.name.begins_with("sgt_"):
67+
continue
68+
_properties.append({
69+
"name": var_i.name,
70+
"type": var_i.type,
71+
"usage": PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_SCRIPT_VARIABLE,
72+
})
5373

5474

5575
func _ready():
@@ -58,7 +78,7 @@ func _ready():
5878
else:
5979
set_process(false)
6080
if not has_meta("SimpleGrassTextured"):
61-
# Update for previous version, now shader needs vertex color
81+
# Update for previous version, 1.0.2 needs vertex color
6282
set_meta("SimpleGrassTextured", "1.0.2")
6383
_force_update_multimesh = true
6484
if multimesh != null:
@@ -86,9 +106,12 @@ func _ready():
86106
_on_set_grass_strength(grass_strength)
87107
_on_set_wind_dir(wind_dir)
88108
_on_set_wind_strength(wind_strength)
89-
_on_set_wind_speed(wind_speed)
109+
_on_set_wind_turbulence(wind_turbulence)
110+
_on_set_wind_pattern(wind_pattern)
90111
_on_set_optimization_by_distance(optimization_by_distance)
91112
_on_set_optimization_level(optimization_level)
113+
_on_set_optimization_dist_min(optimization_dist_min)
114+
_on_set_optimization_dist_max(optimization_dist_max)
92115

93116

94117
func _process(_delta : float):
@@ -97,15 +120,30 @@ func _process(_delta : float):
97120
_update_multimesh()
98121

99122

100-
func add_grass(pos : Vector3, normal : Vector3, scale : Vector3):
123+
func _get_property_list() -> Array:
124+
if _properties == null:
125+
return []
126+
return _properties
127+
128+
129+
func add_grass(pos : Vector3, normal : Vector3, scale : Vector3, rotated : float):
101130
var trans := Transform3D()
102-
trans = trans.rotated(Vector3.UP, TAU * randf())
103-
trans.basis.y = normal
131+
if abs(normal.z) == 1:
132+
trans.basis.x = Vector3(1,0,0)
133+
trans.basis.y = Vector3(0,0,normal.z)
134+
trans.basis.z = Vector3(0,normal.z,0)
135+
trans.basis = trans.basis.orthonormalized()
136+
else:
137+
trans.basis.y = normal
138+
trans.basis.x = normal.cross(trans.basis.z)
139+
trans.basis.z = trans.basis.x.cross(normal)
140+
trans.basis = trans.basis.orthonormalized()
141+
trans = trans.rotated_local(Vector3.UP, rotated)
104142
trans = trans.scaled(scale)
105143
trans = trans.translated(pos)
106-
if dist_min > 0:
144+
if sgt_dist_min > 0:
107145
for trans_prev in _buffer_add:
108-
if trans.origin.distance_to(trans_prev.origin) <= dist_min:
146+
if trans.origin.distance_to(trans_prev.origin) <= sgt_dist_min:
109147
return
110148
_buffer_add.append(trans)
111149

@@ -141,11 +179,27 @@ func _update_multimesh():
141179
multi_new.mesh = mesh
142180
else:
143181
multi_new.mesh = _default_mesh
144-
if _buffer_add.size() > 0 and dist_min > 0:
182+
if _buffer_add.size() > 0 and sgt_dist_min > 0:
183+
var pos_min := Vector3(10000000, 10000000, 10000000)
184+
var pos_max := pos_min * -1
185+
var center := Vector3.ZERO
186+
var radius := 0.0
187+
var r_index := []
188+
for trans in _buffer_add:
189+
if pos_min > trans.origin:
190+
pos_min = trans.origin
191+
if pos_max < trans.origin:
192+
pos_max = trans.origin
193+
center = pos_min + ((pos_max - pos_min) / 2.0)
194+
radius = center.distance_to(pos_min) + 1.0
145195
for i in range(multimesh.instance_count):
196+
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:
146200
var trans := multimesh.get_instance_transform(i)
147201
for trans_add in _buffer_add:
148-
if trans_add.origin.distance_to(trans.origin) <= dist_min:
202+
if trans_add.origin.distance_to(trans.origin) <= sgt_dist_min:
149203
_buffer_add.erase(trans_add)
150204
break
151205
multi_new.instance_count = count_prev + _buffer_add.size()
@@ -227,6 +281,11 @@ func _build_default_mesh() -> Mesh:
227281

228282
func _on_set_mesh(value : Mesh):
229283
mesh = value
284+
if _material != null:
285+
if mesh != null:
286+
_material.set_shader_parameter("grass_size_y", mesh.get_aabb().size.y)
287+
else:
288+
_material.set_shader_parameter("grass_size_y", 1.0)
230289
if Engine.is_editor_hint() and is_inside_tree():
231290
_update_multimesh()
232291

@@ -297,10 +356,16 @@ func _on_set_wind_strength(value : float):
297356
_material.set_shader_parameter("wind_strength", wind_strength)
298357

299358

300-
func _on_set_wind_speed(value : float):
301-
wind_speed = value
359+
func _on_set_wind_turbulence(value : float):
360+
wind_turbulence = value
361+
if _material != null:
362+
_material.set_shader_parameter("wind_turbulence", wind_turbulence)
363+
364+
365+
func _on_set_wind_pattern(value : Texture):
366+
wind_pattern = value
302367
if _material != null:
303-
_material.set_shader_parameter("wind_speed", wind_speed)
368+
_material.set_shader_parameter("wind_pattern", wind_pattern)
304369

305370

306371
func _on_set_optimization_by_distance(value : bool):
@@ -313,3 +378,16 @@ func _on_set_optimization_level(value : float):
313378
optimization_level = value
314379
if _material != null:
315380
_material.set_shader_parameter("optimization_level", optimization_level)
381+
382+
383+
func _on_set_optimization_dist_min(value : float):
384+
optimization_dist_min = value
385+
if _material != null:
386+
_material.set_shader_parameter("optimization_dist_min", optimization_dist_min)
387+
388+
389+
func _on_set_optimization_dist_max(value : float):
390+
optimization_dist_max = value
391+
if _material != null:
392+
_material.set_shader_parameter("optimization_dist_max", optimization_dist_max)
393+
Lines changed: 147 additions & 0 deletions
Loading
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://tqiak77omdnr"
6+
path="res://.godot/imported/icon_density.svg-7b089b052c26d4ee2c77b8ad63ad16e0.ctex"
7+
metadata={
8+
"vram_texture": false
9+
}
10+
11+
[deps]
12+
13+
source_file="res://addons/simplegrasstextured/images/icon_density.svg"
14+
dest_files=["res://.godot/imported/icon_density.svg-7b089b052c26d4ee2c77b8ad63ad16e0.ctex"]
15+
16+
[params]
17+
18+
compress/mode=0
19+
compress/lossy_quality=0.7
20+
compress/hdr_compression=1
21+
compress/bptc_ldr=0
22+
compress/normal_map=0
23+
compress/channel_pack=0
24+
mipmaps/generate=false
25+
mipmaps/limit=-1
26+
roughness/mode=0
27+
roughness/src_normal=""
28+
process/fix_alpha_border=true
29+
process/premult_alpha=false
30+
process/normal_map_invert_y=false
31+
process/hdr_as_srgb=false
32+
process/hdr_clamp_exposure=false
33+
process/size_limit=0
34+
detect_3d/compress_to=1
35+
svg/scale=1.0
36+
editor/scale_with_editor_scale=false
37+
editor/convert_colors_with_editor_theme=false

0 commit comments

Comments
 (0)