From 29e82f50f6f23b1a344b486f377d918425e37188 Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Wed, 9 Jan 2008 13:02:54 +0000 Subject: simulation reset added; colormap autoscaling moved to fluids main loop --- Smoke/colormap.c | 2 +- Smoke/colormap.h | 1 - Smoke/fluids.c | 94 ++++++++++++++++++++++++++------------------ Smoke/fluids.h | 11 +++--- Smoke/gtk.c | 4 +- Smoke/gtk_main.c | 117 +++++++++++++++++++++++++++++++------------------------ Smoke/smoke.bin | Bin 640613 -> 641533 bytes 7 files changed, 132 insertions(+), 97 deletions(-) diff --git a/Smoke/colormap.c b/Smoke/colormap.c index 37afa8f..f928bce 100644 --- a/Smoke/colormap.c +++ b/Smoke/colormap.c @@ -158,7 +158,7 @@ fftw_real *colormap_get_frame(void) -void colormap_autoscale(void) +static void colormap_autoscale(void) { if (colormap_autoscaling) { int k, DIM; diff --git a/Smoke/colormap.h b/Smoke/colormap.h index 9115753..2b08fcc 100644 --- a/Smoke/colormap.h +++ b/Smoke/colormap.h @@ -35,7 +35,6 @@ void colormap_set_frame(fftw_real *frame); fftw_real *colormap_get_frame(void); -void colormap_autoscale(void); struct color4f colormap_get_color(float value); diff --git a/Smoke/fluids.c b/Smoke/fluids.c index d1fc279..51ee23e 100644 --- a/Smoke/fluids.c +++ b/Smoke/fluids.c @@ -55,15 +55,13 @@ static int DIM; //size of simulation grid //init_simulation: Initialize simulation data structures as a function of the grid size 'n'. // Although the simulation takes place on a 2D grid, we allocate all data structures as 1D arrays, // for compatibility with the FFTW numerical library. -fftw_real *init_simulation(int n, struct vis_data_arrays *vis_data) +void fluids_init_simulation(int n, struct vis_data_arrays *vis_data) { int i; size_t dim1, dim2; - fftw_real *return_value; DIM = n; dim1 = n * 2*(n/2+1)*sizeof(fftw_real); //Allocate data structures - return_value = (fftw_real *)malloc(dim1); vx = (fftw_real*) malloc(dim1); vy = (fftw_real*) malloc(dim1); vx0 = (fftw_real*) malloc(dim1); @@ -86,7 +84,7 @@ fftw_real *init_simulation(int n, struct vis_data_arrays *vis_data) } for (i = 0; i < n * n; i++) //Initialize data structures to 0 - { vx[i] = vy[i] = vx0[i] = vy0[i] = fx[i] = fy[i] = rho[i] = rho0[i] = height_array[i] = 0.0f; } + { vx[i] = vy[i] = vx0[i] = vy0[i] = fx[i] = fy[i] = rho[i] = rho0[i] = 0.0f; } vis_data->rho = rho; vis_data->force = (fftw_real *)malloc(dim2); @@ -95,8 +93,13 @@ fftw_real *init_simulation(int n, struct vis_data_arrays *vis_data) vis_data->div_vel = (fftw_real *)malloc(dim1); vis_data->height = (fftw_real *)malloc(dim2); vis_data->normals = (struct point *)malloc(dim2 *sizeof(struct point *)); +} - return return_value; +void fluids_reset_simulation(void) { + int i; + + for (i = 0; i < DIM * DIM; i++) //Initialize data structures to 0 + { vx[i] = vy[i] = vx0[i] = vy0[i] = fx[i] = fy[i] = rho[i] = rho0[i] = 0.0f; } } int rescale_to_winwidth(float value) @@ -363,23 +366,62 @@ fftw_real calculate_height_plot(int dataset, int index) return return_value; } + void copy_frames(fftw_real *dataset) { memcpy(smoke_get_frame(), dataset, DIM * 2 * (DIM / 2 + 1) * sizeof(fftw_real)); } + float par_der(float xy1, float xy2, fftw_real cell) { return (xy1 - (xy2/ cell)); } + +fftw_real *get_frame(struct vis_data_arrays *vis_data, int dataset) +{ + fftw_real *return_value; + + switch(dataset) + { + default: + case DATASET_RHO: + return_value = vis_data->rho; + break; + case DATASET_VEL: + return_value = vis_data->vel; + break; + case DATASET_FORCE: + return_value = vis_data->force; + break; + case DATASET_DIVV: + return_value = vis_data->div_vel; + break; + case DATASET_DIVF: + return_value = vis_data->div_force; + break; + case DATASET_HIST: + return_value = vis_data->history[0]; + } + + return return_value; +} + + void populate_arrays(struct vis_data_arrays *vis_data) { int idx, i, j; + float scale_min, scale_max; + fftw_real *frame; + fftw_real wn = (fftw_real)winWidth / (fftw_real)(DIM + 1); // Grid cell width fftw_real hn = (fftw_real)winHeight / (fftw_real)(DIM + 1); // Grid cell height - + + frame = get_frame(vis_data, smoke_get_dataset()); + scale_min = scale_max = frame[0]; + for (j = 0; j < DIM; j++) { for (i = 0; i < DIM; i++) @@ -401,37 +443,15 @@ void populate_arrays(struct vis_data_arrays *vis_data) // printf("n: %lf; old: %lf\n", // vis_data->normals[idx].z, normal_array[idx].z); // } - } - } -} -fftw_real *get_frame(struct vis_data_arrays *vis_data, int dataset) -{ - fftw_real *return_value; - switch(dataset) - { - default: - case DATASET_RHO: - return_value = vis_data->rho; - break; - case DATASET_VEL: - return_value = vis_data->vel; - break; - case DATASET_FORCE: - return_value = vis_data->force; - break; - case DATASET_DIVV: - return_value = vis_data->div_vel; - break; - case DATASET_DIVF: - return_value = vis_data->div_force; - break; - case DATASET_HIST: - return_value = vis_data->history[0]; - } - - return return_value; + + if (colormap_get_autoscaling()) { + if (scale_min > frame[idx]) { colormap_set_scale_min(frame[idx]); } + if (scale_max < frame[idx]) { colormap_set_scale_max(frame[idx]); } + } + } + } } //do_one_simulation_step: Do one complete cycle of the simulation: @@ -441,7 +461,7 @@ fftw_real *get_frame(struct vis_data_arrays *vis_data, int dataset) // - gluPostRedisplay: draw a new visualization frame -void calculate_one_simulation_step(struct vis_data_arrays *vis_data) +void fluids_calculate_one_simulation_step(struct vis_data_arrays *vis_data) { int dataset; fftw_real *frame; @@ -452,7 +472,6 @@ void calculate_one_simulation_step(struct vis_data_arrays *vis_data) diffuse_matter(DIM, vx, vy, rho, rho0, dt); calculate_height_plots(); calculate_normal_vectors(); - colormap_autoscale(); } populate_arrays(vis_data); @@ -466,6 +485,7 @@ void calculate_one_simulation_step(struct vis_data_arrays *vis_data) heightplots_set_frame(vis_data->height); normals_set_frame(vis_data->normals); +// streamlines_set_frame(vis_data->history); } //------ VISUALIZATION CODE STARTS HERE ----------------------------------------------------------------- diff --git a/Smoke/fluids.h b/Smoke/fluids.h index 85e82b5..07e8c1b 100644 --- a/Smoke/fluids.h +++ b/Smoke/fluids.h @@ -74,7 +74,9 @@ extern float threshold1; extern float threshold2; extern int active_slider; -void fluids_init(int dim); +int rescale_to_winwidth(float value); + + void fluids_set_calculate(int calculate); int fluids_get_calculate(void); @@ -83,11 +85,10 @@ void fluids_insert_smoke(int x, int y); int fluids_get_dim(void); -fftw_real *init_simulation(int n, struct vis_data_arrays *vis_data); - -int rescale_to_winwidth(float value); +void fluids_init_simulation(int n, struct vis_data_arrays *vis_data); +void fluids_reset_simulation(void); -void calculate_one_simulation_step(struct vis_data_arrays *vis_data); +void fluids_calculate_one_simulation_step(struct vis_data_arrays *vis_data); float get_dataset(int index); void set_autoscaling(void); diff --git a/Smoke/gtk.c b/Smoke/gtk.c index fc2971a..537a7f3 100644 --- a/Smoke/gtk.c +++ b/Smoke/gtk.c @@ -203,7 +203,7 @@ expose_event (GtkWidget *widget, // fluids glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - calculate_one_simulation_step(vis_data); + fluids_calculate_one_simulation_step(vis_data); visualize(vis_data); // endf @@ -876,7 +876,7 @@ main (int argc, struct vis_data_arrays vis_data; /* Initialize the simulation */ - init_simulation(50, &vis_data); + fluids_init_simulation(50, &vis_data); /* Initialize GTK. */ gtk_init (&argc, &argv); diff --git a/Smoke/gtk_main.c b/Smoke/gtk_main.c index 679ba12..f2ba7d0 100644 --- a/Smoke/gtk_main.c +++ b/Smoke/gtk_main.c @@ -139,6 +139,12 @@ static gboolean select_zoom_speed(GtkRange *adjustment, gpointer data) return TRUE; } +static gboolean reset_simulation(GtkWidget *button, gpointer data) { + fluids_reset_simulation(); + + return TRUE; +} + GtkWidget *create_main_page(void) { @@ -154,64 +160,73 @@ GtkWidget *create_main_page(void) page = gtk_vbox_new(FALSE, 0); - 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); + frame = gtk_frame_new("Simulation"); - 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); + 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 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("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("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 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("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("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 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_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); - gtk_box_pack_start (GTK_BOX(page), box, FALSE, TRUE, 0); - gtk_widget_show(box); + 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"); diff --git a/Smoke/smoke.bin b/Smoke/smoke.bin index b5a7166..0d6b680 100755 Binary files a/Smoke/smoke.bin and b/Smoke/smoke.bin differ -- cgit v0.12