Skip to content

Commit e24a50c

Browse files
authored
Update grass generator (#55)
1 parent fc27534 commit e24a50c

File tree

6 files changed

+141
-21
lines changed

6 files changed

+141
-21
lines changed
14 Bytes
Binary file not shown.

project/battle/tactical_map/grass/Grass.gd

Lines changed: 92 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,25 @@ export var blade_sway_pitch = Vector2(0, 0.175)
1212
export var thread_count: int = 4
1313
var threads = []
1414

15+
var multimesh_rid: RID
1516
var mesh_rid: RID
17+
1618
var material = preload("res://assets/battle/grass/Grass.material").get_rid()
1719

20+
var grass_cells: Array
21+
var grass_cell_size: Vector2
22+
var amount_blade_in_cell: int
23+
24+
1825
func _ready():
26+
pass
27+
28+
29+
func generate():
30+
if multimesh_rid != null and mesh_rid != null:
31+
clear()
1932
rebuild()
33+
2034

2135
func make_blade_mesh() -> ArrayMesh:
2236
var mesh = ArrayMesh.new()
@@ -66,6 +80,7 @@ func rid_blade_mesh() -> RID:
6680

6781
func rebuild():
6882
var multimesh = VisualServer.multimesh_create()
83+
multimesh_rid = multimesh
6984

7085
VisualServer.multimesh_allocate(multimesh, get_count(), VisualServer.MULTIMESH_TRANSFORM_3D, VisualServer.MULTIMESH_COLOR_NONE, VisualServer.MULTIMESH_CUSTOM_DATA_FLOAT)
7186

@@ -74,15 +89,34 @@ func rebuild():
7489

7590
var bpt = get_count() / thread_count # blades per thread
7691
threads = []
92+
93+
amount_blade_in_cell = get_parent()._amount_blade_in_cell
94+
grass_cell_size = get_parent().cell_size
95+
grass_cells = get_parent().get_global_coord_used_grass_cells()
96+
97+
amount_blade_in_cell = 140
98+
99+
var bpt_cell = grass_cells.size() / thread_count
100+
101+
var arg: Array
102+
77103
for t in thread_count:
104+
arg = [
105+
multimesh,
106+
bpt * t,
107+
bpt * t + bpt,
108+
bpt_cell * t,
109+
bpt_cell * t + bpt_cell,
110+
grass_cells, amount_blade_in_cell, grass_cell_size
111+
]
78112
threads.append(Thread.new())
79-
threads[t].start(self, "thread_worker", [multimesh, bpt * t, bpt * t + bpt])
113+
threads[t].start(self, "thread_worker", arg)
114+
# breakpoint
80115

81116
for t in thread_count:
82117
threads[t].wait_to_finish()
118+
83119

84-
# for i in get_count():
85-
# setup_blade(multimesh, i)
86120

87121
var instance = VisualServer.instance_create()
88122
var scenario = get_world().scenario
@@ -92,31 +126,77 @@ func rebuild():
92126

93127
VisualServer.instance_geometry_set_material_override(instance, material)
94128

129+
130+
func clear():
131+
VisualServer.free_rid(mesh_rid)
132+
VisualServer.free_rid(multimesh_rid)
133+
134+
95135
func thread_worker(data: Array):
96136
var rid = data[0]
97137
var start = data[1]
98138
var stop = data[2]
139+
var start_cell = data[3]
140+
var stop_cell = data[4]
141+
var cells = data[5]
142+
var amount_blade_in_cell = data[6]
143+
var grass_cell_size: Vector2 = data[7]
144+
145+
var rng = RandomNumberGenerator.new()
146+
147+
var checking: bool = false
148+
149+
var cell_index: int = start_cell
150+
var cell_current_number_blades: int = 0
151+
152+
var amount_available_cells = stop_cell - start_cell
153+
var amount_wishful_blades = amount_available_cells * amount_blade_in_cell
154+
var amount_available_blades = stop - start
155+
156+
# if amount_wishful_blades <= amount_available_blades:
157+
# checking = true
158+
# else:
159+
# amount_blade_in_cell = amount_available_blades / amount_available_cells
99160

100161
for i in range(start, stop):
101-
setup_blade(rid, i)
162+
setup_blade(
163+
rid, i,
164+
cells[cell_index], grass_cell_size,
165+
rng
166+
)
167+
cell_current_number_blades += 1
168+
169+
if cell_current_number_blades == amount_blade_in_cell:
170+
cell_current_number_blades = 0
171+
cell_index += 1
172+
173+
174+
if cell_index == stop_cell:
175+
break
102176

103-
func setup_blade(rid: RID, i: int):
177+
func setup_blade(rid: RID, i: int,
178+
cell_coord: Vector3, grass_cell_size: Vector2,
179+
rng
180+
):
104181
var width = rand_range(blade_width.x, blade_width.y)
105182
var height = rand_range(blade_height.x, blade_height.y)
106183

107-
var position: Vector2
108-
while true:
109-
position = Vector2(rand_range(-area.x/2.0, area.x/2.0), rand_range(-area.y/2.0, area.y/2.0))
110-
if get_parent().is_grass_soil(Vector3(position.x, 0, position.y)):
111-
break
112-
184+
var x = grass_cell_size.x
185+
var y = grass_cell_size.y
186+
187+
var rand_shift = Vector2(rng.randf_range(-x/2, x/2), rng.randf_range(-y/2, y/2))
188+
189+
var position: Vector3
190+
position = cell_coord
191+
position += Vector3(rand_shift.x, 0, rand_shift.y)
192+
113193
var rotation = rand_range(blade_rotation.x, blade_rotation.y)
114194

115195
var sway_yaw = rand_range(blade_sway_yaw.x, blade_sway_yaw.y)
116196
var sway_pitch = rand_range(blade_sway_pitch.x, blade_sway_pitch.y)
117197

118198
var transform = Transform.IDENTITY
119-
transform.origin = Vector3(position.x, 0, position.y)
199+
transform.origin = Vector3(position.x, 0, position.z)
120200
transform.basis = Basis.IDENTITY.rotated(Vector3.UP, deg2rad(rotation))
121201

122202
VisualServer.multimesh_instance_set_transform(rid, i, transform)

project/battle/tactical_map/scripts/tactical_map_generator.gd

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,35 @@ func generate_map(
3636
_map_height=TacticalMap.map_height
3737
):
3838
var n: float
39+
var amount_grass_cells: int = 0
3940

4041
for x in _map_widht:
4142
for y in _map_height:
4243
n = noise.get_noise_2d(x, y)
4344
var cell = offset_to_origin(x,y)
44-
_noise_parsing(cell, n)
45+
var items = _noise_parsing(cell, n)
46+
47+
if items.soil == TacticalMap.ITEM_SOIL.GRASS:
48+
amount_grass_cells += 1
49+
50+
set_meta("_amount_grass_cells", amount_grass_cells)
51+
52+
53+
func get_amount_grass_cells():
54+
return get_meta("_amount_grass_cells")
55+
4556

4657
func _noise_parsing(_cell: Array, _n):
58+
var items: Dictionary
59+
4760
if _n >= 0.0:
48-
soil.set_cell_item(_cell[0], 0, _cell[1],
49-
TacticalMap.ITEM_SOIL.GRASS)
61+
items["soil"] = TacticalMap.ITEM_SOIL.GRASS
62+
soil.set_cell_item(_cell[0], 0, _cell[1], items["soil"])
5063

5164
var r = randf()
5265
if r < OAK_TREE_3_CHANCE:
53-
obstacles.set_cell_item(_cell[0], 0, _cell[1],
54-
TacticalMap.ITEM_OBSTACLES.OAK_TREE_3)
66+
items["obstacles"] = TacticalMap.ITEM_OBSTACLES.OAK_TREE_3
67+
obstacles.set_cell_item(_cell[0], 0, _cell[1], items["obstacles"])
5568
elif r < OAK_TREE_2_CHANCE:
5669
obstacles.set_cell_item(_cell[0], 0, _cell[1],
5770
TacticalMap.ITEM_OBSTACLES.OAK_TREE_1)
@@ -60,8 +73,8 @@ func _noise_parsing(_cell: Array, _n):
6073
TacticalMap.ITEM_OBSTACLES.OAK_TREE_2)
6174

6275
else:
63-
soil.set_cell_item(_cell[0], 0, _cell[1],
64-
TacticalMap.ITEM_SOIL.DIRT)
76+
items["soil"] = TacticalMap.ITEM_SOIL.DIRT
77+
soil.set_cell_item(_cell[0], 0, _cell[1], items["soil"])
6578

6679
var r3 = randf()
6780
if r3 < STONE_CHANCE:
@@ -92,6 +105,8 @@ func _noise_parsing(_cell: Array, _n):
92105
elif r < DEAD_SPRUCE_2_CHANCE:
93106
obstacles.set_cell_item(_cell[0], 0, _cell[1],
94107
TacticalMap.ITEM_OBSTACLES.DEAD_SPRUCE_2)
108+
109+
return items
95110

96111

97112
func offset_to_origin(x: int, y: int) -> Array:

project/battle/tactical_map/tactical_map.gd

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@ enum ITEM_VEGETATION {
4040
var map_widht: int = 70
4141
var map_height: int = 70
4242

43-
var grass_game_count: int = 600
43+
var cell_size: Vector2 = Vector2(2, 2)
44+
45+
var grass_game_count: int = 600000
4446
var grass_area: Vector2 = Vector2(map_widht*2, map_height*2)
4547
var grass_blade_height: Vector2 = Vector2(0.5, 0.5) # rand_range(x, y)
4648
var grass_blade_width: Vector2 = Vector2(0.01, 0.2) # rand_range(x, y)
49+
var _amount_blade_in_cell: int
4750

4851
onready var grass: Spatial = $Grass
4952

@@ -75,11 +78,15 @@ func generate_map():
7578
soil, obstacles, vegetation)
7679
noiseMapGenerator.generate_map()
7780

81+
var amount: int = noiseMapGenerator.get_amount_grass_cells()
82+
_amount_blade_in_cell = grass_game_count / amount
83+
_amount_blade_in_cell = ceil(_amount_blade_in_cell)
84+
7885
grass.game_count = grass_game_count
7986
grass.area = grass_area
8087
grass.blade_height = grass_blade_height
8188
grass.blade_width = grass_blade_width
82-
grass.rebuild()
89+
grass.generate()
8390

8491

8592
func clear_map():
@@ -103,6 +110,22 @@ func is_grass_soil(_global_v: Vector3) -> bool:
103110
return result
104111

105112

113+
func get_global_coord_used_grass_cells():
114+
var used_cells: Array = soil.get_used_cells()
115+
var global_coord_used_grass_cells: Array
116+
117+
var item: int
118+
var global_coord_item: Vector3
119+
120+
for cell in used_cells:
121+
item = soil.get_cell_item(cell.x, cell.y, cell.z)
122+
if item == ITEM_SOIL.GRASS:
123+
global_coord_item = soil.map_to_world(cell.x, cell.y, cell.z)
124+
global_coord_used_grass_cells.append(global_coord_item)
125+
126+
return global_coord_used_grass_cells
127+
128+
106129
########
107130

108131
func get_map_path(from: Vector3, to: Vector3) -> PoolVector3Array:

project/battle/tactical_map/tactical_map.tscn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ __meta__ = {
4444
[node name="Grass" parent="." instance=ExtResource( 6 )]
4545
blade_height = Vector2( 0.5, 0.08 )
4646
blade_width = Vector2( 0.5, 0.02 )
47+
thread_count = 8
4748

4849
[node name="Camera" parent="." instance=ExtResource( 4 )]
4950
transform = Transform( 1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 38.2787, 3 )

project/project.godot

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,4 +1203,5 @@ F11={
12031203

12041204
[rendering]
12051205

1206+
threads/thread_model=2
12061207
environment/default_environment="res://default_env.tres"

0 commit comments

Comments
 (0)