mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-15 20:32:07 +00:00
fix(vfx): remove ball contact sparks
This commit is contained in:
@@ -119,7 +119,6 @@ const THRUST_THRESHOLD = 1.0 # percent
|
|||||||
var _engine_cores: Array[MeshInstance3D] = []
|
var _engine_cores: Array[MeshInstance3D] = []
|
||||||
var _engine_flames: Array[MeshInstance3D] = []
|
var _engine_flames: Array[MeshInstance3D] = []
|
||||||
var _engine_lights: Array[OmniLight3D] = []
|
var _engine_lights: Array[OmniLight3D] = []
|
||||||
var _impact_sparks: GPUParticles3D
|
|
||||||
|
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
@@ -264,17 +263,6 @@ func _build_movement_vfx() -> void:
|
|||||||
add_child(light)
|
add_child(light)
|
||||||
_engine_lights.append(light)
|
_engine_lights.append(light)
|
||||||
|
|
||||||
_impact_sparks = _make_particles(
|
|
||||||
"ImpactSparks", Color(1.0, 0.72, 0.22, 1.0), Vector2(0.09, 0.3),
|
|
||||||
28, 0.32, Vector3.UP, 180.0, 5.0, 12.0
|
|
||||||
)
|
|
||||||
_impact_sparks.one_shot = true
|
|
||||||
_impact_sparks.explosiveness = 1.0
|
|
||||||
_impact_sparks.local_coords = false
|
|
||||||
_impact_sparks.emitting = false
|
|
||||||
add_child(_impact_sparks)
|
|
||||||
|
|
||||||
|
|
||||||
func _vfx_material(color: Color, energy: float) -> StandardMaterial3D:
|
func _vfx_material(color: Color, energy: float) -> StandardMaterial3D:
|
||||||
var mat := StandardMaterial3D.new()
|
var mat := StandardMaterial3D.new()
|
||||||
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
|
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
|
||||||
@@ -287,34 +275,6 @@ func _vfx_material(color: Color, energy: float) -> StandardMaterial3D:
|
|||||||
return mat
|
return mat
|
||||||
|
|
||||||
|
|
||||||
func _make_particles(
|
|
||||||
particle_name: String, color: Color, size: Vector2, amount: int,
|
|
||||||
lifetime: float, direction: Vector3, spread: float,
|
|
||||||
velocity_min: float, velocity_max: float
|
|
||||||
) -> GPUParticles3D:
|
|
||||||
var quad := QuadMesh.new()
|
|
||||||
quad.size = size
|
|
||||||
quad.material = _vfx_material(color, 2.2)
|
|
||||||
var process := ParticleProcessMaterial.new()
|
|
||||||
process.direction = direction
|
|
||||||
process.spread = spread
|
|
||||||
process.initial_velocity_min = velocity_min
|
|
||||||
process.initial_velocity_max = velocity_max
|
|
||||||
process.gravity = Vector3.ZERO
|
|
||||||
process.scale_min = 0.35
|
|
||||||
process.scale_max = 1.0
|
|
||||||
var particles := GPUParticles3D.new()
|
|
||||||
particles.name = particle_name
|
|
||||||
particles.amount = amount
|
|
||||||
particles.lifetime = lifetime
|
|
||||||
particles.local_coords = true
|
|
||||||
particles.process_material = process
|
|
||||||
particles.draw_pass_1 = quad
|
|
||||||
particles.visibility_aabb = AABB(Vector3(-3, -3, -1), Vector3(6, 6, 12))
|
|
||||||
particles.emitting = false
|
|
||||||
return particles
|
|
||||||
|
|
||||||
|
|
||||||
func _update_movement_vfx() -> void:
|
func _update_movement_vfx() -> void:
|
||||||
if _engine_flames.is_empty():
|
if _engine_flames.is_empty():
|
||||||
return
|
return
|
||||||
@@ -354,10 +314,6 @@ func _on_body_entered(body: Node) -> void:
|
|||||||
var relative_speed := (linear_velocity - (body as Ball).linear_velocity).length()
|
var relative_speed := (linear_velocity - (body as Ball).linear_velocity).length()
|
||||||
var intensity := clampf(inverse_lerp(3.0, 24.0, relative_speed), 0.12, 1.0)
|
var intensity := clampf(inverse_lerp(3.0, 24.0, relative_speed), 0.12, 1.0)
|
||||||
var contact_pos := (global_position + (body as Ball).global_position) * 0.5
|
var contact_pos := (global_position + (body as Ball).global_position) * 0.5
|
||||||
if _impact_sparks:
|
|
||||||
_impact_sparks.position = to_local(contact_pos)
|
|
||||||
_impact_sparks.amount_ratio = lerpf(0.25, 1.0, intensity)
|
|
||||||
_impact_sparks.restart()
|
|
||||||
ball_contact.emit(intensity, contact_pos)
|
ball_contact.emit(intensity, contact_pos)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ The largest gap between this and a AAA-feeling product is presentation, not code
|
|||||||
|
|
||||||
- [ ] **Audio — there is none.** Zero sound files, zero `AudioStreamPlayer` nodes, no bus layout. Needs: engine hum pitched to throttle, turbo whoosh, ball impacts scaled by collision impulse, wall scrapes, goal explosion, crowd bed, UI clicks, countdown beeps, music. Can be driven off `Ship`'s existing telemetry signals.
|
- [ ] **Audio — there is none.** Zero sound files, zero `AudioStreamPlayer` nodes, no bus layout. Needs: engine hum pitched to throttle, turbo whoosh, ball impacts scaled by collision impulse, wall scrapes, goal explosion, crowd bed, UI clicks, countdown beeps, music. Can be driven off `Ship`'s existing telemetry signals.
|
||||||
- [x] SSAO/SSIL in the arena Environments — cheapest single perceived-quality win available; grounds the ships against the deck and gives the fillets and goal recesses real depth.
|
- [x] SSAO/SSIL in the arena Environments — cheapest single perceived-quality win available; grounds the ships against the deck and gives the fillets and goal recesses real depth.
|
||||||
- [x] VFX on anything that moves: throttle-reactive engine cores and simple rear flames, a speed-scaled ball trail, contact sparks and team-tinted goal bursts.
|
- [x] VFX on anything that moves: throttle-reactive engine cores and simple rear flames, a speed-scaled ball trail and team-tinted goal bursts.
|
||||||
- [x] Impact feedback — intensity-scaled screen shake, unscaled hit-stop, HUD flash and controller rumble on ball contact.
|
- [x] Impact feedback — intensity-scaled screen shake, unscaled hit-stop, HUD flash and controller rumble on ball contact.
|
||||||
- [x] Camera feel in `ship_camera.gd` — speed-based FOV widening, turbo kick-back and decaying impact shake.
|
- [x] Camera feel in `ship_camera.gd` — speed-based FOV widening, turbo kick-back and decaying impact shake.
|
||||||
- [x] Goal celebration sequence: goal burst, team-tinted flash/title card, dedicated camera cut and slow-motion beat after authoritative score registration and before reset/kickoff.
|
- [x] Goal celebration sequence: goal burst, team-tinted flash/title card, dedicated camera cut and slow-motion beat after authoritative score registration and before reset/kickoff.
|
||||||
|
|||||||
Reference in New Issue
Block a user