#include #include #include "fluids.h" #include "gtk_main.h" #include "renderer_gl.h" #include "smoke.h" #include "normals.h" #include "colormap.h" #include "glyphs.h" #include "divergence.h" #include "isolines.h" #include "heightplots.h" #include "streamlines.h" #include "flowvis.h" static gboolean select_render_grid(GtkWidget *button, gpointer data) { renderer_set_render_grid(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); return TRUE; } static gboolean select_render_smoke(GtkWidget *button, gpointer data) { smoke_set_render(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); return TRUE; } static gboolean select_render_glyphs(GtkWidget *button, gpointer data) { glyphs_set_render(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); return TRUE; } static gboolean select_render_isolines(GtkWidget *button, gpointer data) { isolines_set_render(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); return TRUE; } static gboolean select_render_streamlines(GtkWidget *button, gpointer data) { streamlines_set_render(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); return TRUE; } static gboolean select_render_flowvis(GtkWidget *button, gpointer data) { flowvis_set_render(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); return TRUE; } static gboolean select_calculate(GtkWidget *button, gpointer data) { fluids_set_calculate(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); return TRUE; } static gboolean set_dataset(GtkToggleButton *button, gpointer data) { if (gtk_toggle_button_get_active(button)) { smoke_set_dataset((int)data); } return TRUE; } static gboolean select_normals(GtkWidget *button, gpointer data) { normals_set_render(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); return TRUE; } static gboolean select_normals2(GtkWidget *button, gpointer data) { normals_set_render2(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); return TRUE; } static gboolean reset_zoom(GtkWidget *button, gpointer data) { renderer_reset_zoom(); return TRUE; } static gboolean reset_pos(GtkWidget *button, gpointer data) { renderer_reset_pos(); return TRUE; } static gboolean reset_yaw(GtkWidget *button, gpointer data) { renderer_reset_yaw(); return TRUE; } static gboolean reset_pitch(GtkWidget *button, gpointer data) { renderer_reset_pitch(); return TRUE; } static gboolean reset_roll(GtkWidget *button, gpointer data) { renderer_reset_roll(); return TRUE; } static gboolean reset_rotate(GtkWidget *button, gpointer data) { renderer_reset_yaw(); renderer_reset_pitch(); renderer_reset_roll(); return TRUE; } static gboolean reset_all(GtkWidget *button, gpointer data) { renderer_reset_yaw(); renderer_reset_pitch(); renderer_reset_roll(); renderer_reset_zoom(); renderer_reset_pos(); return TRUE; } static gboolean select_zoom_speed(GtkRange *adjustment, gpointer data) { renderer_set_zoomspeed((int)gtk_range_get_value(adjustment)); return TRUE; } static gboolean reset_simulation(GtkWidget *button, gpointer data) { fluids_reset_simulation(); return TRUE; } GtkWidget *create_main_page(void) { /* in reality a page is really just a vbox filled with other widgets */ GtkWidget *page; GtkWidget *frame; GtkWidget *box, *box2; GtkWidget *button; GtkAdjustment *adjustment; GtkWidget *scale; GSList *dataset_group; page = gtk_vbox_new(FALSE, 0); frame = gtk_frame_new("Simulation"); box = gtk_vbox_new(FALSE, 0); button = gtk_check_button_new_with_label("Draw Grid"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), renderer_get_render_grid()); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_grid), NULL); gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_check_button_new_with_label("Draw Smoke"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), smoke_get_render()); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_smoke), NULL); gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_check_button_new_with_label("Draw Glyphs"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), glyphs_get_render()); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_glyphs), NULL); gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_check_button_new_with_label("Draw Isolines"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), isolines_get_render()); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_isolines), NULL); gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_check_button_new_with_label("Draw Streamlines"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), streamlines_get_render()); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_streamlines), NULL); gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_check_button_new_with_label("Draw Flowvis"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), flowvis_get_render()); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_flowvis), NULL); gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_check_button_new_with_label("Toggle Calculation"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), fluids_get_calculate()); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_calculate), NULL); gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_check_button_new_with_label("Draw Normals Vectors"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), normals_get_render()); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_normals), NULL); gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_check_button_new_with_label("Draw Normals2 Vectors"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), normals_get_render2()); g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_normals2), NULL); gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_button_new_with_label("Reset Simulation"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_simulation), NULL); gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); gtk_container_add(GTK_CONTAINER(frame), box); gtk_widget_show(box); gtk_box_pack_start (GTK_BOX(page), frame, FALSE, TRUE, 0); gtk_widget_show(frame); frame = gtk_frame_new("Dataset"); box = gtk_vbox_new(FALSE, 0); box2 = gtk_hbox_new(FALSE, 0); button = gtk_radio_button_new_with_label (NULL, "Rho"); if (smoke_get_dataset() == DATASET_RHO) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); } g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(set_dataset), (gpointer)DATASET_RHO); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); dataset_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button)); button = gtk_radio_button_new_with_label(dataset_group, "Velocity"); if (smoke_get_dataset() == DATASET_VEL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); } g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(set_dataset), (gpointer)DATASET_VEL); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), "Force"); if (smoke_get_dataset() == DATASET_FORCE) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); } g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(set_dataset), (gpointer)DATASET_FORCE); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(box), box2, TRUE, TRUE, 0); gtk_widget_show(box2); box2 = gtk_hbox_new(FALSE, 0); dataset_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button)); button = gtk_radio_button_new_with_label(dataset_group, "Divergence Velocity"); if (smoke_get_dataset() == DATASET_DIVV) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); } g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(set_dataset), (gpointer)DATASET_DIVV); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), "Divergence Force"); if (smoke_get_dataset() == DATASET_DIVF) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); } g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(set_dataset), (gpointer)DATASET_DIVF); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(box), box2, TRUE, TRUE, 0); gtk_widget_show(box2); gtk_container_add(GTK_CONTAINER(frame), box); gtk_widget_show(box); gtk_box_pack_start (GTK_BOX(page), frame, FALSE, TRUE, 0); gtk_widget_show(frame); frame = gtk_frame_new("View"); box = gtk_hbox_new(FALSE, 0); button = gtk_button_new_with_label("Reset All"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_all), NULL); gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0); gtk_widget_show(button); box2 = gtk_vbox_new(FALSE, 0); button = gtk_button_new_with_label("Reset Zoom"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_zoom), NULL); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_button_new_with_label("Reset Position"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_pos), NULL); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_button_new_with_label("Reset Rotate"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_rotate), NULL); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(box), box2, TRUE, TRUE, 0); gtk_widget_show(box2); box2 = gtk_vbox_new(FALSE, 0); button = gtk_button_new_with_label("Reset Yaw"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_yaw), NULL); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_button_new_with_label("Reset Pitch"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_pitch), NULL); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); button = gtk_button_new_with_label("Reset Roll"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_roll), NULL); gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(box), box2, TRUE, TRUE, 0); gtk_widget_show(box2); gtk_container_add(GTK_CONTAINER(frame), box); gtk_widget_show(box); gtk_box_pack_start (GTK_BOX(page), frame, FALSE, TRUE, 0); gtk_widget_show(frame); frame = gtk_frame_new("Zoom Speed"); box = gtk_vbox_new(FALSE, 0); adjustment = GTK_ADJUSTMENT(gtk_adjustment_new( renderer_get_zoomspeed(), 1, 100, 5, 5, 0.1)); scale = gtk_hscale_new(adjustment); gtk_scale_set_digits(GTK_SCALE(scale), 0); g_signal_connect(GTK_RANGE(scale), "value-changed", G_CALLBACK(select_zoom_speed), NULL); gtk_box_pack_start(GTK_BOX(box), scale, FALSE, TRUE, 0); gtk_widget_show(scale); gtk_widget_show(box); gtk_container_add(GTK_CONTAINER(frame), box); gtk_box_pack_start (GTK_BOX(page), frame, FALSE, TRUE, 0); gtk_widget_show(frame); return page; }