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));
24 if (sprite !=
nullptr) {
25 sprite->resize(window);
29 void StarField::update(
float delta_time,
const glm::vec3 &camera_position,
float elapsed_time) {
30 for (
auto &star : stars) {
31 star.position += star.velocity * delta_time;
32 const float distance = glm::length(star.position - camera_position);
33 if (distance > max_radius * 1.2f || distance < min_radius * 0.35f) {
34 respawn(star, camera_position);
37 const float twinkle = 0.65f + 0.35f * std::sin(elapsed_time * star.twinkle_speed + star.twinkle_phase);
38 const float fade = std::clamp(1.0f - ((distance - min_radius) / (max_radius - min_radius)), 0.2f, 0.7f);
39 const float brightness = star.brightness * twinkle * fade;
40 star.color = glm::vec4(std::clamp(star.base_color.r * brightness, 0.0f, 1.0f), std::clamp(star.base_color.g * brightness, 0.0f, 1.0f), std::clamp(star.base_color.b * brightness, 0.0f, 1.0f), std::clamp(0.2f + brightness, 0.0f, 1.0f));
45 if (sprite ==
nullptr) {
48 for (
const auto &star : stars) {
49 sprite->drawSprite(star.position, glm::vec2(star.size), star.color);
53 void StarField::respawn(
Star &star,
const glm::vec3 ¢er) {
56 const float radius =
random_float(min_radius, max_radius);
58 star.
position.x = center.x + radius * std::sin(phi) * std::cos(theta);
59 star.
position.y = center.y + radius * std::sin(phi) * std::sin(theta);
60 star.
position.z = center.z + radius * std::cos(phi);
67 }
else if (roll < 0.65f) {
70 }
else if (roll < 0.75f) {
73 }
else if (roll < 0.85f) {
76 }
else if (roll < 0.92f) {
88 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.