diff --git a/res/ui/ui.glade b/res/ui/ui.glade index 58b7e40..fe42ef2 100644 --- a/res/ui/ui.glade +++ b/res/ui/ui.glade @@ -1574,6 +1574,65 @@ 2 + + + True + False + + + True + False + Reference Frame: + + + False + True + 0 + + + + + True + False + Fixed + + + False + True + 1 + + + + + True + True + + + + False + True + 2 + + + + + True + False + Intertial + + + False + True + 3 + + + + + False + True + 3 + + Re-fetch Data @@ -1586,7 +1645,7 @@ False True - 3 + 4 @@ -1668,7 +1727,7 @@ False True - 4 + 5 diff --git a/src/phys/phys.c b/src/phys/phys.c index 75bded4..383ffb2 100644 --- a/src/phys/phys.c +++ b/src/phys/phys.c @@ -2,7 +2,9 @@ #include "SGP4.h" +#include "camera.h" #include "satellite.h" +#include "setting.h" #include "system.h" #include "thread.h" #include "timemgr.h" @@ -75,6 +77,14 @@ void *phys_thrd(void *arguments) void phys_phys_sync(void) { + if (gs_reference_frame == REFERENCE_FRAME_INERTIAL) { + gint64 diff_ms = phys_ctx_sync.epoch_ms - e_phys.epoch_ms; + float dang = (-2.f * (float)G_PI * diff_ms) / MS_IN_DAY; + glm_vec2_copy((vec2){ e_camera.pos[0] * cosf(dang) - e_camera.pos[1] * sinf(dang), + e_camera.pos[1] * cosf(dang) + e_camera.pos[0] * sinf(dang) }, + e_camera.pos); + camera_view_update(&e_camera); + } e_phys = phys_ctx_sync; } diff --git a/src/ui/setting.c b/src/ui/setting.c index 8059d7e..3702f18 100644 --- a/src/ui/setting.c +++ b/src/ui/setting.c @@ -28,6 +28,7 @@ struct Setting settings[3] = { gboolean gs_gmt = FALSE; gboolean gs_clouds = TRUE; gboolean gs_lighting = TRUE; +enum ReferenceFrame gs_reference_frame = REFERENCE_FRAME_FIXED; static GtkWindow *window_settings; @@ -35,6 +36,7 @@ static void on_settings_clicked(GtkToolButton *toolbutton, gpointer user_data); static gboolean on_window_settings_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data); static void on_setting_toggled(GtkToggleButton *togglebutton, gpointer user_data); static void on_fetch_data_clicked(GtkButton *button, gpointer user_data); +static gboolean on_reference_frame_state_set(GtkSwitch *widget, gboolean state, gpointer user_data); void on_settings_clicked(GtkToolButton *toolbutton, gpointer user_data) { @@ -73,6 +75,16 @@ void on_fetch_data_clicked(GtkButton *button, gpointer user_data) } } +gboolean on_reference_frame_state_set(GtkSwitch *widget, gboolean state, gpointer user_data) +{ + (void)widget; + (void)user_data; + + gs_reference_frame = (enum ReferenceFrame)state; + + return FALSE; +} + void setting_init(GtkBuilder *builder) { gtk_builder_add_callback_symbols(builder, @@ -80,6 +92,7 @@ void setting_init(GtkBuilder *builder) "on_setting_toggled", G_CALLBACK(on_setting_toggled), "on_window_settings_delete_event", G_CALLBACK(on_window_settings_delete_event), "on_fetch_data_clicked", G_CALLBACK(on_fetch_data_clicked), + "on_reference_frame_state_set", G_CALLBACK(on_reference_frame_state_set), NULL); window_settings = GTK_WINDOW(gtk_builder_get_object(builder, "window_settings")); diff --git a/src/ui/setting.h b/src/ui/setting.h index e70c58a..1902b9e 100644 --- a/src/ui/setting.h +++ b/src/ui/setting.h @@ -4,9 +4,15 @@ #include "type.h" #include "ui.h" +enum ReferenceFrame { + REFERENCE_FRAME_FIXED = 0u, + REFERENCE_FRAME_INERTIAL, +}; + extern gboolean gs_gmt; extern gboolean gs_clouds; extern gboolean gs_lighting; +extern enum ReferenceFrame gs_reference_frame; void setting_init(GtkBuilder *builder);