@ -268,36 +268,58 @@ void render_body(CelestialBody* body, RenderState* render_state) {
DrawSphereWires ( position , radius , 16 , 16 , color ) ;
}
void render_spacecraft ( Spacecraft * craft , RenderState * render_state ) {
void render_spacecraft_screen_space ( Spacecraft * craft , RenderState * render_state ) {
Vector3 render_pos = sim_to_render ( craft - > 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 ;
}
ensure_textures_loaded ( render_state ) ;
Vector3 position = sim_to_render ( craft - > position , render_state - > distance_scale ) ;
float billboard_size = 20.0f ;
float screen_size = 40.0f ;
Color spacecraft_color = { 0 , 255 , 255 , 255 } ;
float angle = calculate_spacecraft_angle ( craft - > local_velocity , render_state - > camera ) ;
DrawBillboardPro ( render_state - > camera ,
render_state - > spacecraft_texture ,
( Rectangle ) { 0 , 0 , 64 , 64 } ,
position ,
( Vector3 ) { 0 , 1 , 0 } ,
( Vector2 ) { billboard_size , billboard_size } ,
( Vector2 ) { billboard_size / 2 , billboard_size / 2 } ,
angle ,
spacecraft_color ) ;
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 ( Spacecraft * craft , Maneuver * maneuver , RenderState * render_state ) {
void render_maneuver_marker_screen_space ( Spacecraft * craft , Maneuver * maneuver , RenderState * render_state ) {
if ( maneuver - > executed ) {
return ;
}
Vector3 render_pos = sim_to_render ( craft - > 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 ;
}
ensure_textures_loaded ( render_state ) ;
Vector3 position = sim_to_render ( craft - > position , render_state - > distance_scale ) ;
float marker_size = ( float ) ( maneuver - > delta_v / 100.0f ) ;
if ( marker_size < 4.0f ) marker_size = 4.0f ;
if ( marker_size > 12.0f ) marker_size = 12.0f ;
float screen_size = ( float ) ( maneuver - > delta_v / 50.0f ) ;
if ( screen_size < 20.0f ) screen_size = 20.0f ;
if ( screen_size > 60.0f ) screen_size = 60.0f ;
int texture_index ;
switch ( maneuver - > direction ) {
@ -324,11 +346,17 @@ void render_maneuver_marker(Spacecraft* craft, Maneuver* maneuver, RenderState*
break ;
}
DrawBillboard ( render_state - > camera ,
render_state - > maneuver_textures [ texture_index ] ,
position ,
marker_size ,
WHITE ) ;
Rectangle source = { 0 , 0 , 32 , 32 } ;
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 - > maneuver_textures [ texture_index ] ,
source , dest , origin , 0 , WHITE ) ;
}
struct OrbitalBasis {
@ -533,21 +561,21 @@ void render_simulation(SimulationState* sim, RenderState* render_state) {
render_body ( & sim - > bodies [ i ] , render_state ) ;
}
// Render all spacecraft (after bodies for visibility)
EndMode3D ( ) ;
// Render spacecraft as screen-space overlays
for ( int i = 0 ; i < sim - > craft_count ; i + + ) {
render_spacecraft ( & sim - > spacecraft [ i ] , render_state ) ;
render_spacecraft_screen_space ( & sim - > spacecraft [ i ] , render_state ) ;
}
// Render maneuver markers (top layer)
// Render maneuver markers as screen-space overlays
for ( int i = 0 ; i < sim - > maneuver_count ; i + + ) {
Maneuver * maneuver = & sim - > maneuvers [ i ] ;
if ( ! maneuver - > executed & & maneuver - > craft_index > = 0 & & maneuver - > craft_index < sim - > craft_count ) {
Spacecraft * craft = & sim - > spacecraft [ maneuver - > craft_index ] ;
render_maneuver_marker ( craft , maneuver , render_state ) ;
render_maneuver_marker_screen_space ( craft , maneuver , render_state ) ;
}
}
EndMode3D ( ) ;
EndDrawing ( ) ;
}