nodes/light.pyΒΆ

Part of Q1K3.

 1"""Temporary fading PointLight3D: used for muzzle flash + explosions."""
 2
 3from __future__ import annotations
 4
 5from typing import TYPE_CHECKING
 6
 7from simvx.core import Node3D, PointLight3D, Vec3
 8
 9if TYPE_CHECKING:  # pragma: no cover
10    from .root import Q1K3Root
11
12
13class TempLight(Node3D):
14    def __init__(
15        self,
16        game: Q1K3Root,
17        pos: Vec3,
18        intensity: float,
19        colour: tuple[float, float, float],
20        duration: float,
21    ) -> None:
22        super().__init__()
23        self.game = game
24        self.position = pos
25        self._intensity = intensity
26        self._duration = duration
27        self._spawn_time = game.game_time
28        self._dead = False
29        self.light = PointLight3D(
30            position=(0, 0, 0),
31            colour=colour,
32            intensity=intensity,
33            range=600.0,
34        )
35        self.add_child(self.light)
36
37    def on_update(self, dt: float) -> None:
38        if self._dead:
39            return
40        elapsed = self.game.game_time - self._spawn_time
41        if elapsed >= self._duration:
42            self._dead = True
43            self.game.queue_remove(self)
44            return
45        # Linear fade
46        self.light.intensity = self._intensity * (1.0 - elapsed / self._duration)