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
+
+
+
+ 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);