|
|
|
|
@ -100,7 +100,6 @@ void init_renderer(int width, int height, const char* title) {
|
|
|
|
|
// Close raylib
|
|
|
|
|
void close_renderer(RenderState* render_state) { |
|
|
|
|
if (render_state->texture_loaded) { |
|
|
|
|
UnloadTexture(render_state->spacecraft_texture); |
|
|
|
|
for (int i = 0; i < 6; i++) { |
|
|
|
|
UnloadTexture(render_state->maneuver_textures[i]); |
|
|
|
|
} |
|
|
|
|
@ -109,20 +108,6 @@ void close_renderer(RenderState* render_state) {
|
|
|
|
|
CloseWindow(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Texture2D generate_spacecraft_texture() { |
|
|
|
|
Image img = GenImageColor(64, 64, BLANK); |
|
|
|
|
|
|
|
|
|
ImageDrawCircle(&img, 32, 32, 28, (Color){0, 255, 255, 255}); |
|
|
|
|
ImageDrawLine(&img, 32, 10, 32, 50, (Color){0, 0, 0, 255}); |
|
|
|
|
ImageDrawLine(&img, 32, 10, 25, 17, (Color){0, 0, 0, 255}); |
|
|
|
|
ImageDrawLine(&img, 32, 10, 39, 17, (Color){0, 0, 0, 255}); |
|
|
|
|
|
|
|
|
|
Texture2D tex = LoadTextureFromImage(img); |
|
|
|
|
UnloadImage(img); |
|
|
|
|
|
|
|
|
|
return tex; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Texture2D generate_maneuver_marker_texture(Color color) { |
|
|
|
|
Image img = GenImageColor(32, 32, BLANK); |
|
|
|
|
|
|
|
|
|
@ -141,8 +126,6 @@ Texture2D generate_maneuver_marker_texture(Color color) {
|
|
|
|
|
void ensure_textures_loaded(RenderState* render_state) { |
|
|
|
|
if (render_state->texture_loaded) return; |
|
|
|
|
|
|
|
|
|
render_state->spacecraft_texture = generate_spacecraft_texture(); |
|
|
|
|
|
|
|
|
|
render_state->maneuver_textures[0] = generate_maneuver_marker_texture((Color){0, 255, 0, 200}); |
|
|
|
|
render_state->maneuver_textures[1] = generate_maneuver_marker_texture((Color){255, 0, 0, 200}); |
|
|
|
|
render_state->maneuver_textures[2] = generate_maneuver_marker_texture((Color){255, 255, 0, 200}); |
|
|
|
|
@ -153,16 +136,6 @@ void ensure_textures_loaded(RenderState* render_state) {
|
|
|
|
|
render_state->texture_loaded = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
float calculate_spacecraft_angle(Vec3 velocity, Camera3D camera) { |
|
|
|
|
if (vec3_magnitude(velocity) < 0.01) return 0.0f; |
|
|
|
|
|
|
|
|
|
Vector3 render_vel = sim_to_render(velocity, 1.0); |
|
|
|
|
Vector2 vel_2d = (Vector2){render_vel.x, render_vel.z}; |
|
|
|
|
Vector2 cam_2d = (Vector2){camera.position.x, camera.position.z}; |
|
|
|
|
|
|
|
|
|
return Vector2Angle(vel_2d, cam_2d); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Setup the 3D camera
|
|
|
|
|
void setup_camera(RenderState* render_state) { |
|
|
|
|
render_state->camera.position = (Vector3){ 0.0f, CAMERA_INITIAL_POSITION_Y, CAMERA_INITIAL_POSITION_Z }; |
|
|
|
|
@ -175,7 +148,6 @@ void setup_camera(RenderState* render_state) {
|
|
|
|
|
render_state->size_scale = SIZE_SCALE_DEFAULT; |
|
|
|
|
|
|
|
|
|
render_state->texture_loaded = false; |
|
|
|
|
render_state->spacecraft_texture = (Texture2D){0, 0, 0, 0, 0}; |
|
|
|
|
for (int i = 0; i < 6; i++) { |
|
|
|
|
render_state->maneuver_textures[i] = (Texture2D){0, 0, 0, 0, 0}; |
|
|
|
|
} |
|
|
|
|
@ -372,35 +344,6 @@ void render_body(CelestialBody* body, RenderState* render_state) {
|
|
|
|
|
DrawSphereWires(position, radius, 16, 16, color); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void render_spacecraft_screen_space(Spacecraft* craft, RenderState* render_state) { |
|
|
|
|
Vector3 render_pos = sim_to_render(craft->global_position, render_state->distance_scale); |
|
|
|
|
Vector2 screen_pos = GetWorldToScreen(render_pos, render_state->camera); |
|
|
|
|
|
|
|
|
|
int screen_width = GetScreenWidth(); |
|
|
|
|
int screen_height = GetScreenHeight(); |
|
|
|
|
|
|
|
|
|
if (screen_pos.x < -50 || screen_pos.x > screen_width + 50 || |
|
|
|
|
screen_pos.y < -50 || screen_pos.y > screen_height + 50) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
float screen_size = 40.0f; |
|
|
|
|
Color spacecraft_color = { 0, 255, 255, 255 }; |
|
|
|
|
float angle = calculate_spacecraft_angle(craft->local_velocity, render_state->camera); |
|
|
|
|
|
|
|
|
|
Rectangle source = {0, 0, 64, 64}; |
|
|
|
|
Rectangle dest = { |
|
|
|
|
screen_pos.x - screen_size/2, |
|
|
|
|
screen_pos.y - screen_size/2, |
|
|
|
|
screen_size, |
|
|
|
|
screen_size |
|
|
|
|
}; |
|
|
|
|
Vector2 origin = {screen_size/2, screen_size/2}; |
|
|
|
|
|
|
|
|
|
DrawTexturePro(render_state->spacecraft_texture, |
|
|
|
|
source, dest, origin, angle, spacecraft_color); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void render_maneuver_marker_screen_space(Spacecraft* craft, Maneuver* maneuver, RenderState* render_state) { |
|
|
|
|
if (maneuver->executed) { |
|
|
|
|
return; |
|
|
|
|
@ -689,11 +632,6 @@ void render_simulation(SimulationState* sim, RenderState* render_state) {
|
|
|
|
|
|
|
|
|
|
EndMode3D(); |
|
|
|
|
|
|
|
|
|
// Render spacecraft as screen-space overlays
|
|
|
|
|
for (int i = 0; i < sim->craft_count; i++) { |
|
|
|
|
render_spacecraft_screen_space(&sim->spacecraft[i], render_state); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Render maneuver markers as screen-space overlays
|
|
|
|
|
for (int i = 0; i < sim->maneuver_count; i++) { |
|
|
|
|
Maneuver* maneuver = &sim->maneuvers[i]; |
|
|
|
|
|