void ray_reflect( Ray* result, const Ray* r, const Point* intersect, const Vector* norm) { result->o.x = intersect->x; result->o.y = intersect->y; result->o.z = intersect->z; double dot_norm_ray = Vector_dot(norm, &r->d); double norm_mag_squared = Vector_mag(norm) * Vector_mag(norm); double double_proj_mag = 2 * dot_norm_ray / norm_mag_squared; result->d.x = r->d.x - double_proj_mag*norm->x; result->d.y = r->d.y - double_proj_mag*norm->y; result->d.z = r->d.z - double_proj_mag*norm->z; }
void NBody_tick(NBody* self, uint32_t dt) { self->player->acceleration = Vector_init(0.0f, 0.0f, 0.0f); Vector accelerations[NUM_STARS] = {{0.0f, 0.0f, 0.0f}}; // Update player for (size_t i = 0; i < NUM_STARS; ++i) { Star* star = &self->stars[i]; Vector delta = Vector_subtract(star->position, self->player->position); float distance = Vector_mag(delta) + 0.00001f; // Add small amount to avoid collision Vector force = Vector_scale(delta, 0.001f / (distance * distance * distance)); self->player->acceleration = Vector_add(self->player->acceleration, Vector_scale(force, star->mass)); } self->player->velocity = Vector_add(self->player->velocity, Vector_scale(self->player->acceleration, 0.001f * dt)); self->player->position = Vector_add(self->player->position, Vector_scale(self->player->velocity, 0.001f * dt)); // Update stars for (size_t i = 0; i < NUM_STARS; ++i) { Star* star_i = &self->stars[i]; for (size_t j = i + 1; j < NUM_STARS; ++j) { Star* star_j = &self->stars[j]; Vector delta = Vector_subtract(star_j->position, star_i->position); float distance = Vector_mag(delta) + 0.00001f; // Add small amount to avoid collision Vector force = Vector_scale(delta, 0.001f / (distance * distance * distance)); accelerations[i] = Vector_add(accelerations[i], Vector_scale(force, star_j->mass)); accelerations[j] = Vector_add(accelerations[j], Vector_scale(force, -star_i->mass)); } star_i->velocity = Vector_add(star_i->velocity, Vector_scale(accelerations[i], 0.001f * dt)); star_i->position = Vector_add(star_i->position, Vector_scale(star_i->velocity, 0.001f * dt)); } }