7 void StarField::init(
int star_count,
float min_radius,
float max_radius) {
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);
67 star.velocity = glm::vec3(
74 star.base_color = {0.90f, 0.90f, 1.00f, 1.0f};
76 }
else if (roll < 0.65f) {
77 star.base_color = {0.60f, 0.78f, 1.00f, 1.0f};
79 }
else if (roll < 0.75f) {
80 star.base_color = {1.00f, 0.95f, 0.65f, 1.0f};
82 }
else if (roll < 0.85f) {
83 star.base_color = {1.00f, 0.66f, 0.32f, 1.0f};
85 }
else if (roll < 0.92f) {
86 star.base_color = {1.00f, 0.40f, 0.40f, 1.0f};
89 star.base_color = {1.00f, 1.00f, 1.00f, 1.0f};
94 star.color = star.base_color;
97 star.
layer = roll < 0.5f ? 0 : (roll < 0.85f ? 1 : 2);
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.