generated from krampus/template-godot4
Generalized handling of terrain & material audio
This commit is contained in:
parent
cbed315048
commit
c1b7d1b15f
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -27,7 +27,7 @@ noise = SubResource("FastNoiseLite_rpgb7")
|
|||
|
||||
[sub_resource type="Terrain3DMaterial" id="Terrain3DMaterial_woy2k"]
|
||||
_shader_parameters = {
|
||||
"auto_base_texture": 3,
|
||||
"auto_base_texture": 4,
|
||||
"auto_height_reduction": 0.1,
|
||||
"auto_overlay_texture": 0,
|
||||
"auto_slope": 0.41,
|
||||
|
|
BIN
levels/debug_level/terrain_3d_data/terrain3d_00_00.res (Stored with Git LFS)
BIN
levels/debug_level/terrain_3d_data/terrain3d_00_00.res (Stored with Git LFS)
Binary file not shown.
BIN
levels/debug_level/terrain_assets.res (Stored with Git LFS)
BIN
levels/debug_level/terrain_assets.res (Stored with Git LFS)
Binary file not shown.
|
@ -197,7 +197,12 @@ ball_previous={
|
|||
|
||||
3d_physics/layer_1="Collision Geometry"
|
||||
3d_physics/layer_2="Layer 3"
|
||||
3d_physics/layer_32="Grass Audio"
|
||||
3d_physics/layer_27="Glass Material"
|
||||
3d_physics/layer_28="Metal Material"
|
||||
3d_physics/layer_29="Rock Material"
|
||||
3d_physics/layer_30="Wood Material"
|
||||
3d_physics/layer_31="Sand Material"
|
||||
3d_physics/layer_32="Grass Material"
|
||||
|
||||
[physics]
|
||||
|
||||
|
|
|
@ -5,9 +5,6 @@ const BASE_VOLUME := -36.0
|
|||
const MAX_VOLUME := 3.0
|
||||
const VELOCITY_ATTENUATION_SCALE := 400.0
|
||||
|
||||
const GRASS_PHYSICAL_LAYER := 1 << 32
|
||||
const SAND_PHYSICAL_LAYER := 1 << 31
|
||||
|
||||
@onready var parent: GameBall = $".."
|
||||
|
||||
@onready var grass_sfx_player: AudioStreamPlayer3D = %GrassSFXPlayer
|
||||
|
@ -24,30 +21,17 @@ func _force_attenuated_volume() -> float:
|
|||
)
|
||||
|
||||
|
||||
func _play_sfx(player: AudioStreamPlayer3D) -> void:
|
||||
func _play(player: AudioStreamPlayer3D) -> void:
|
||||
player.volume_db = _force_attenuated_volume()
|
||||
print("PLAYING: ", player, "... VOLUME: ", player.volume_db)
|
||||
player.play()
|
||||
|
||||
|
||||
func play_terrain_sfx(tex_id: int) -> void:
|
||||
var player := grass_sfx_player
|
||||
match tex_id:
|
||||
2: # sand
|
||||
player = sand_sfx_player
|
||||
3: # rock
|
||||
player = concrete_sfx_player
|
||||
|
||||
_play_sfx(player)
|
||||
|
||||
|
||||
## Select the appropriate SFX to play based on the collision layer of the collider.
|
||||
##
|
||||
## We use the upper bits of the collision layer to indicate standard SFX.
|
||||
func play_physical_sfx(collision_mask: int) -> void:
|
||||
var player := concrete_sfx_player
|
||||
if collision_mask & GRASS_PHYSICAL_LAYER:
|
||||
player = grass_sfx_player
|
||||
elif collision_mask & SAND_PHYSICAL_LAYER:
|
||||
player = sand_sfx_player
|
||||
_play_sfx(player)
|
||||
func play_sfx(terrain: Terrain.Type) -> void:
|
||||
match terrain:
|
||||
Terrain.Type.ROUGH, Terrain.Type.GREEN, Terrain.Type.FAIRWAY:
|
||||
_play(grass_sfx_player)
|
||||
Terrain.Type.CONCRETE, Terrain.Type.ROCK:
|
||||
_play(concrete_sfx_player)
|
||||
Terrain.Type.SAND:
|
||||
_play(sand_sfx_player)
|
||||
|
|
|
@ -148,17 +148,10 @@ func _on_sleeping_state_changed() -> void:
|
|||
|
||||
func _on_collision(body: Node) -> void:
|
||||
if body is Terrain3D:
|
||||
var texture_blend: Vector3 = (body as Terrain3D).data.get_texture_id(global_position)
|
||||
print("T3D texture blend: ", texture_blend)
|
||||
# TODO maybe blend audio?
|
||||
|
||||
# Figure out audio for autoshader
|
||||
var tex_id: float = 0 if texture_blend.x == 3 and texture_blend.z == 0 else texture_blend.x
|
||||
|
||||
sfx.play_terrain_sfx(tex_id)
|
||||
sfx.play_sfx(Terrain.at_position(global_position, body as Terrain3D))
|
||||
elif body is CSGShape3D:
|
||||
sfx.play_physical_sfx((body as CSGShape3D).collision_layer)
|
||||
sfx.play_sfx(Terrain.from_physical_layer((body as CSGShape3D).collision_layer))
|
||||
elif body is CollisionObject3D:
|
||||
sfx.play_physical_sfx((body as CollisionObject3D).collision_layer)
|
||||
sfx.play_sfx(Terrain.from_physical_layer((body as CollisionObject3D).collision_layer))
|
||||
else:
|
||||
print_debug("COLLIDER: ", body)
|
||||
|
|
|
@ -8,6 +8,7 @@ data = PackedVector3Array(0, 0, -5.2392, -1.2315, 0, -2.5941, 1.2315, 0, -2.5941
|
|||
[node name="Sailboat" instance=ExtResource("1_ivu5q")]
|
||||
|
||||
[node name="StaticBody3D" type="StaticBody3D" parent="." index="1"]
|
||||
collision_layer = 536870913
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="0"]
|
||||
shape = SubResource("ConcavePolygonShape3D_mrf68")
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
class_name Terrain
|
||||
## Tools for working with different terrain types.
|
||||
## This provides a unified interface to Terrain3D and regular meshes.
|
||||
|
||||
## Basic terrain materials
|
||||
enum Type {
|
||||
NONE,
|
||||
ROUGH,
|
||||
FAIRWAY,
|
||||
GREEN,
|
||||
SAND,
|
||||
CONCRETE,
|
||||
ROCK,
|
||||
WOOD,
|
||||
METAL,
|
||||
GLASS,
|
||||
}
|
||||
|
||||
## We use the upper bits of collision layers to encode material data
|
||||
const PHYSICAL_LAYERS := {
|
||||
1 << 31: Type.ROUGH,
|
||||
1 << 30: Type.SAND,
|
||||
1 << 29: Type.WOOD,
|
||||
1 << 28: Type.ROCK,
|
||||
1 << 27: Type.METAL,
|
||||
1 << 26: Type.GLASS,
|
||||
}
|
||||
|
||||
|
||||
## Get the `Terrain.Type` value which corresponds to the given Terrain3D texture ID.
|
||||
##
|
||||
## Note that this relies on the ordering of textures in our Terrain3DAsset resource!
|
||||
## If the order textures are defined in changes, this will break!
|
||||
static func from_texture_id(tex_id: int) -> Type:
|
||||
match tex_id:
|
||||
0:
|
||||
return Type.ROUGH
|
||||
1:
|
||||
return Type.FAIRWAY
|
||||
2:
|
||||
return Type.SAND
|
||||
3:
|
||||
return Type.GREEN
|
||||
4:
|
||||
return Type.ROCK
|
||||
_:
|
||||
return Type.NONE
|
||||
|
||||
|
||||
## Get the `Terrain.Type` value encoded in the given collision layer setting.
|
||||
##
|
||||
## We use the upper bits in the collision layer to encode material data.
|
||||
## Check the collision layer descriptions for more information.
|
||||
static func from_physical_layer(collision_layer: int) -> Type:
|
||||
for bit: int in PHYSICAL_LAYERS:
|
||||
if collision_layer & bit:
|
||||
return PHYSICAL_LAYERS[bit]
|
||||
return Type.CONCRETE
|
||||
|
||||
|
||||
## Get the `Terrain.Type` value at the given position in a Terrain3D node.
|
||||
static func at_position(global_position: Vector3, terrain3d: Terrain3D) -> Type:
|
||||
var blend := terrain3d.data.get_texture_id(global_position)
|
||||
var id: int
|
||||
if terrain3d.data.get_control_auto(global_position):
|
||||
id = blend.x if blend.z > 0 else blend.y
|
||||
else:
|
||||
id = blend.x
|
||||
return from_texture_id(id)
|
Loading…
Reference in New Issue