12 stars.resize(
static_cast<size_t>(star_count));
13 this->min_radius = min_radius;
14 this->max_radius = max_radius;
15 for (
auto &star : stars) {
16 respawn(star, glm::vec3(0.0f));
22 sprite = sprite_batch;
26 if (sprite !=
nullptr) {
27 sprite->resize(window);
31 void StarField::update(
float delta_time,
const glm::vec3 &camera_position,
float elapsed_time) {
32 for (
auto &star : stars) {
33 star.position += star.velocity * delta_time;
34 const float distance = glm::length(star.position - camera_position);
35 if (distance > max_radius * 1.2f || distance < min_radius * 0.35f) {
36 respawn(star, camera_position);
39 const float twinkle = 0.65f + 0.35f * std::sin(elapsed_time * star.twinkle_speed + star.twinkle_phase);
40 const float fade = std::clamp(1.0f - ((distance - min_radius) / (max_radius - min_radius)), 0.2f, 0.7f);
41 const float brightness = star.brightness * twinkle * fade;
42 star.color = glm::vec4(
43 std::clamp(star.base_color.r * brightness, 0.0f, 1.0f),
44 std::clamp(star.base_color.g * brightness, 0.0f, 1.0f),
45 std::clamp(star.base_color.b * brightness, 0.0f, 1.0f),
46 std::clamp(0.2f + brightness, 0.0f, 1.0f));
51 if (sprite ==
nullptr) {
54 for (
const auto &star : stars) {
55 sprite->drawSprite(star.position, glm::vec2(star.size), star.color);
59 void StarField::respawn(
Star &star,
const glm::vec3 ¢er) {
62 const float radius =
random_float(min_radius, max_radius);
64 star.
position.x = center.x + radius * std::sin(phi) * std::cos(theta);
65 star.
position.y = center.y + radius * std::sin(phi) * std::sin(theta);
66 star.
position.z = center.z + radius * std::cos(phi);
76 }
else if (roll < 0.65f) {
79 }
else if (roll < 0.75f) {
82 }
else if (roll < 0.85f) {
85 }
else if (roll < 0.92f) {
97 star.
layer = roll < 0.5f ? 0 : (roll < 0.85f ? 1 : 2);
Animated starfield used by the Asteroids scene.
Depth-tested 3D billboard sprite batch.
Main Vulkan window wrapper for MXVK.
void init(int star_count, float min_radius, float max_radius)
Creates the stars.
void setSprite(mxvk::VK_Sprite3D *sprite_batch)
Assigns the non-owning sprite batch used to render stars.
void update(float delta_time, const glm::vec3 &camera_position, float elapsed_time)
Advances star movement and twinkling.
void resize(mxvk::VK_Window *window)
Updates rendering resources after a window-size change.
void draw()
Submits the current stars to the assigned sprite batch.
constexpr float PI
Single-precision value of pi.
float random_float(float min_value, float max_value)
Generates a uniformly distributed floating-point value.
Runtime state for one animated background star.
glm::vec3 position
World-space position.
glm::vec4 base_color
Color before brightness modulation.
float brightness
Base brightness multiplier.
float twinkle_phase
Twinkle animation phase.
glm::vec3 velocity
World-space velocity.
float size
Rendered point size.
int layer
Parallax layer index.
glm::vec4 color
Current rendered color.
float twinkle_speed
Twinkle animation rate.