From cf983359977dbea21b49747e3430725209a804ee Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Fri, 4 Jan 2008 17:26:22 +0000 Subject: force/vel/rho now selectable (for flowvis) --- Smoke/Makefile | 2 +- Smoke/colormap.c | 3 +- Smoke/fluids.c | 162 +++++++++++++++++++++++++++++++++++++++++----------- Smoke/fluids.h | 36 ++++++++---- Smoke/glyphs.c | 10 ++-- Smoke/glyphs.h | 4 +- Smoke/gtk.c | 19 +++--- Smoke/gtk_main.c | 91 +++++++++++++++++++---------- Smoke/heightplots.c | 13 +++++ Smoke/heightplots.h | 3 + Smoke/renderer_gl.c | 57 ++++++++++++------ Smoke/renderer_gl.h | 2 +- Smoke/smoke.bin | Bin 626063 -> 631486 bytes Smoke/smoke.c | 6 +- Smoke/smoke.h | 2 +- 15 files changed, 294 insertions(+), 116 deletions(-) diff --git a/Smoke/Makefile b/Smoke/Makefile index 1217e1d..d300bae 100644 --- a/Smoke/Makefile +++ b/Smoke/Makefile @@ -2,7 +2,7 @@ # Makefile created by Dev-C++ 4.9.9.2 CPP = g++ -CC = colorgcc -Wall +CC = gcc -Wall OBJ_GTK = funcs.o interact.o fluids.o smoke.o colormap.o glyphs.o divergence.o isolines.o heightplots.o seedpoint.o streamlines.o flowvis.o palette.o gtk_main.o gtk_colormap.o gtk_glyphs.o gtk_divergence.o gtk_isolines.o gtk_heightplots.o gtk_streamlines.o gtk_flowvis.o gtk.o renderer_gl.o fftw-2.1.3/fftw/config.o fftw-2.1.3/fftw/executor.o fftw-2.1.3/fftw/fftwf77.o fftw-2.1.3/fftw/fftwnd.o fftw-2.1.3/fftw/fn_1.o fftw-2.1.3/fftw/fn_2.o fftw-2.1.3/fftw/fn_3.o fftw-2.1.3/fftw/fn_4.o fftw-2.1.3/fftw/fn_5.o fftw-2.1.3/fftw/fn_6.o fftw-2.1.3/fftw/fn_7.o fftw-2.1.3/fftw/fn_8.o fftw-2.1.3/fftw/fn_9.o fftw-2.1.3/fftw/fn_10.o fftw-2.1.3/fftw/fn_11.o fftw-2.1.3/fftw/fn_12.o fftw-2.1.3/fftw/fn_13.o fftw-2.1.3/fftw/fn_14.o fftw-2.1.3/fftw/fn_15.o fftw-2.1.3/fftw/fn_16.o fftw-2.1.3/fftw/fn_32.o fftw-2.1.3/fftw/fn_64.o fftw-2.1.3/fftw/fni_1.o fftw-2.1.3/fftw/fni_2.o fftw-2.1.3/fftw/fni_3.o fftw-2.1.3/fftw/fni_4.o fftw-2.1.3/fftw/fni_5.o fftw-2.1.3/fftw/fni_6.o fftw-2.1.3/fftw/fni_7.o fftw-2.1.3/fftw/fni_8.o fftw-2.1.3/fftw/fni_9.o fftw-2.1.3/fftw/fni_10.o fftw-2.1.3/fftw/fni_11.o fftw-2.1.3/fftw/fni_12.o fftw-2.1.3/fftw/fni_13.o fftw-2.1.3/fftw/fni_14.o fftw-2.1.3/fftw/fni_15.o fftw-2.1.3/fftw/fni_16.o fftw-2.1.3/fftw/fni_32.o fftw-2.1.3/fftw/fni_64.o fftw-2.1.3/fftw/ftw_2.o fftw-2.1.3/fftw/ftw_3.o fftw-2.1.3/fftw/ftw_4.o fftw-2.1.3/fftw/ftw_5.o fftw-2.1.3/fftw/ftw_6.o fftw-2.1.3/fftw/ftw_7.o fftw-2.1.3/fftw/ftw_8.o fftw-2.1.3/fftw/ftw_9.o fftw-2.1.3/fftw/ftw_10.o fftw-2.1.3/fftw/ftw_16.o fftw-2.1.3/fftw/ftw_32.o fftw-2.1.3/fftw/ftw_64.o fftw-2.1.3/fftw/ftwi_2.o fftw-2.1.3/fftw/ftwi_3.o fftw-2.1.3/fftw/ftwi_4.o fftw-2.1.3/fftw/ftwi_5.o fftw-2.1.3/fftw/ftwi_6.o fftw-2.1.3/fftw/ftwi_7.o fftw-2.1.3/fftw/ftwi_8.o fftw-2.1.3/fftw/ftwi_9.o fftw-2.1.3/fftw/ftwi_10.o fftw-2.1.3/fftw/ftwi_16.o fftw-2.1.3/fftw/ftwi_32.o fftw-2.1.3/fftw/ftwi_64.o fftw-2.1.3/fftw/generic.o fftw-2.1.3/fftw/malloc.o fftw-2.1.3/fftw/planner.o fftw-2.1.3/fftw/putils.o fftw-2.1.3/fftw/rader.o fftw-2.1.3/fftw/timer.o fftw-2.1.3/fftw/twiddle.o fftw-2.1.3/fftw/wisdom.o fftw-2.1.3/fftw/wisdomio.o fftw-2.1.3/rfftw/fcr_1.o fftw-2.1.3/rfftw/fcr_2.o fftw-2.1.3/rfftw/fcr_3.o fftw-2.1.3/rfftw/fcr_4.o fftw-2.1.3/rfftw/fcr_5.o fftw-2.1.3/rfftw/fcr_6.o fftw-2.1.3/rfftw/fcr_7.o fftw-2.1.3/rfftw/fcr_8.o fftw-2.1.3/rfftw/fcr_9.o fftw-2.1.3/rfftw/fcr_10.o fftw-2.1.3/rfftw/fcr_11.o fftw-2.1.3/rfftw/fcr_12.o fftw-2.1.3/rfftw/fcr_13.o fftw-2.1.3/rfftw/fcr_14.o fftw-2.1.3/rfftw/fcr_15.o fftw-2.1.3/rfftw/fcr_16.o fftw-2.1.3/rfftw/fcr_32.o fftw-2.1.3/rfftw/fcr_64.o fftw-2.1.3/rfftw/fcr_128.o fftw-2.1.3/rfftw/fhb_2.o fftw-2.1.3/rfftw/fhb_3.o fftw-2.1.3/rfftw/fhb_4.o fftw-2.1.3/rfftw/fhb_5.o fftw-2.1.3/rfftw/fhb_6.o fftw-2.1.3/rfftw/fhb_7.o fftw-2.1.3/rfftw/fhb_8.o fftw-2.1.3/rfftw/fhb_9.o fftw-2.1.3/rfftw/fhb_10.o fftw-2.1.3/rfftw/fhb_16.o fftw-2.1.3/rfftw/fhb_32.o fftw-2.1.3/rfftw/fhf_2.o fftw-2.1.3/rfftw/fhf_3.o fftw-2.1.3/rfftw/fhf_4.o fftw-2.1.3/rfftw/fhf_5.o fftw-2.1.3/rfftw/fhf_6.o fftw-2.1.3/rfftw/fhf_7.o fftw-2.1.3/rfftw/fhf_8.o fftw-2.1.3/rfftw/fhf_9.o fftw-2.1.3/rfftw/fhf_10.o fftw-2.1.3/rfftw/fhf_16.o fftw-2.1.3/rfftw/fhf_32.o fftw-2.1.3/rfftw/frc_1.o fftw-2.1.3/rfftw/frc_2.o fftw-2.1.3/rfftw/frc_3.o fftw-2.1.3/rfftw/frc_4.o fftw-2.1.3/rfftw/frc_5.o fftw-2.1.3/rfftw/frc_6.o fftw-2.1.3/rfftw/frc_7.o fftw-2.1.3/rfftw/frc_8.o fftw-2.1.3/rfftw/frc_9.o fftw-2.1.3/rfftw/frc_10.o fftw-2.1.3/rfftw/frc_11.o fftw-2.1.3/rfftw/frc_12.o fftw-2.1.3/rfftw/frc_13.o fftw-2.1.3/rfftw/frc_14.o fftw-2.1.3/rfftw/frc_15.o fftw-2.1.3/rfftw/frc_16.o fftw-2.1.3/rfftw/frc_32.o fftw-2.1.3/rfftw/frc_64.o fftw-2.1.3/rfftw/frc_128.o fftw-2.1.3/rfftw/rconfig.o fftw-2.1.3/rfftw/rexec2.o fftw-2.1.3/rfftw/rexec.o fftw-2.1.3/rfftw/rfftwf77.o fftw-2.1.3/rfftw/rfftwnd.o fftw-2.1.3/rfftw/rgeneric.o fftw-2.1.3/rfftw/rplanner.o $(RES) OBJ_GLUT = glut.o fluids.o colormap.o glyphs.o seedpoint.o streamlines.o palette.o funcs.o interact.o fftw-2.1.3/fftw/config.o fftw-2.1.3/fftw/executor.o fftw-2.1.3/fftw/fftwf77.o fftw-2.1.3/fftw/fftwnd.o fftw-2.1.3/fftw/fn_1.o fftw-2.1.3/fftw/fn_2.o fftw-2.1.3/fftw/fn_3.o fftw-2.1.3/fftw/fn_4.o fftw-2.1.3/fftw/fn_5.o fftw-2.1.3/fftw/fn_6.o fftw-2.1.3/fftw/fn_7.o fftw-2.1.3/fftw/fn_8.o fftw-2.1.3/fftw/fn_9.o fftw-2.1.3/fftw/fn_10.o fftw-2.1.3/fftw/fn_11.o fftw-2.1.3/fftw/fn_12.o fftw-2.1.3/fftw/fn_13.o fftw-2.1.3/fftw/fn_14.o fftw-2.1.3/fftw/fn_15.o fftw-2.1.3/fftw/fn_16.o fftw-2.1.3/fftw/fn_32.o fftw-2.1.3/fftw/fn_64.o fftw-2.1.3/fftw/fni_1.o fftw-2.1.3/fftw/fni_2.o fftw-2.1.3/fftw/fni_3.o fftw-2.1.3/fftw/fni_4.o fftw-2.1.3/fftw/fni_5.o fftw-2.1.3/fftw/fni_6.o fftw-2.1.3/fftw/fni_7.o fftw-2.1.3/fftw/fni_8.o fftw-2.1.3/fftw/fni_9.o fftw-2.1.3/fftw/fni_10.o fftw-2.1.3/fftw/fni_11.o fftw-2.1.3/fftw/fni_12.o fftw-2.1.3/fftw/fni_13.o fftw-2.1.3/fftw/fni_14.o fftw-2.1.3/fftw/fni_15.o fftw-2.1.3/fftw/fni_16.o fftw-2.1.3/fftw/fni_32.o fftw-2.1.3/fftw/fni_64.o fftw-2.1.3/fftw/ftw_2.o fftw-2.1.3/fftw/ftw_3.o fftw-2.1.3/fftw/ftw_4.o fftw-2.1.3/fftw/ftw_5.o fftw-2.1.3/fftw/ftw_6.o fftw-2.1.3/fftw/ftw_7.o fftw-2.1.3/fftw/ftw_8.o fftw-2.1.3/fftw/ftw_9.o fftw-2.1.3/fftw/ftw_10.o fftw-2.1.3/fftw/ftw_16.o fftw-2.1.3/fftw/ftw_32.o fftw-2.1.3/fftw/ftw_64.o fftw-2.1.3/fftw/ftwi_2.o fftw-2.1.3/fftw/ftwi_3.o fftw-2.1.3/fftw/ftwi_4.o fftw-2.1.3/fftw/ftwi_5.o fftw-2.1.3/fftw/ftwi_6.o fftw-2.1.3/fftw/ftwi_7.o fftw-2.1.3/fftw/ftwi_8.o fftw-2.1.3/fftw/ftwi_9.o fftw-2.1.3/fftw/ftwi_10.o fftw-2.1.3/fftw/ftwi_16.o fftw-2.1.3/fftw/ftwi_32.o fftw-2.1.3/fftw/ftwi_64.o fftw-2.1.3/fftw/generic.o fftw-2.1.3/fftw/malloc.o fftw-2.1.3/fftw/planner.o fftw-2.1.3/fftw/putils.o fftw-2.1.3/fftw/rader.o fftw-2.1.3/fftw/timer.o fftw-2.1.3/fftw/twiddle.o fftw-2.1.3/fftw/wisdom.o fftw-2.1.3/fftw/wisdomio.o fftw-2.1.3/rfftw/fcr_1.o fftw-2.1.3/rfftw/fcr_2.o fftw-2.1.3/rfftw/fcr_3.o fftw-2.1.3/rfftw/fcr_4.o fftw-2.1.3/rfftw/fcr_5.o fftw-2.1.3/rfftw/fcr_6.o fftw-2.1.3/rfftw/fcr_7.o fftw-2.1.3/rfftw/fcr_8.o fftw-2.1.3/rfftw/fcr_9.o fftw-2.1.3/rfftw/fcr_10.o fftw-2.1.3/rfftw/fcr_11.o fftw-2.1.3/rfftw/fcr_12.o fftw-2.1.3/rfftw/fcr_13.o fftw-2.1.3/rfftw/fcr_14.o fftw-2.1.3/rfftw/fcr_15.o fftw-2.1.3/rfftw/fcr_16.o fftw-2.1.3/rfftw/fcr_32.o fftw-2.1.3/rfftw/fcr_64.o fftw-2.1.3/rfftw/fcr_128.o fftw-2.1.3/rfftw/fhb_2.o fftw-2.1.3/rfftw/fhb_3.o fftw-2.1.3/rfftw/fhb_4.o fftw-2.1.3/rfftw/fhb_5.o fftw-2.1.3/rfftw/fhb_6.o fftw-2.1.3/rfftw/fhb_7.o fftw-2.1.3/rfftw/fhb_8.o fftw-2.1.3/rfftw/fhb_9.o fftw-2.1.3/rfftw/fhb_10.o fftw-2.1.3/rfftw/fhb_16.o fftw-2.1.3/rfftw/fhb_32.o fftw-2.1.3/rfftw/fhf_2.o fftw-2.1.3/rfftw/fhf_3.o fftw-2.1.3/rfftw/fhf_4.o fftw-2.1.3/rfftw/fhf_5.o fftw-2.1.3/rfftw/fhf_6.o fftw-2.1.3/rfftw/fhf_7.o fftw-2.1.3/rfftw/fhf_8.o fftw-2.1.3/rfftw/fhf_9.o fftw-2.1.3/rfftw/fhf_10.o fftw-2.1.3/rfftw/fhf_16.o fftw-2.1.3/rfftw/fhf_32.o fftw-2.1.3/rfftw/frc_1.o fftw-2.1.3/rfftw/frc_2.o fftw-2.1.3/rfftw/frc_3.o fftw-2.1.3/rfftw/frc_4.o fftw-2.1.3/rfftw/frc_5.o fftw-2.1.3/rfftw/frc_6.o fftw-2.1.3/rfftw/frc_7.o fftw-2.1.3/rfftw/frc_8.o fftw-2.1.3/rfftw/frc_9.o fftw-2.1.3/rfftw/frc_10.o fftw-2.1.3/rfftw/frc_11.o fftw-2.1.3/rfftw/frc_12.o fftw-2.1.3/rfftw/frc_13.o fftw-2.1.3/rfftw/frc_14.o fftw-2.1.3/rfftw/frc_15.o fftw-2.1.3/rfftw/frc_16.o fftw-2.1.3/rfftw/frc_32.o fftw-2.1.3/rfftw/frc_64.o fftw-2.1.3/rfftw/frc_128.o fftw-2.1.3/rfftw/rconfig.o fftw-2.1.3/rfftw/rexec2.o fftw-2.1.3/rfftw/rexec.o fftw-2.1.3/rfftw/rfftwf77.o fftw-2.1.3/rfftw/rfftwnd.o fftw-2.1.3/rfftw/rgeneric.o fftw-2.1.3/rfftw/rplanner.o $(RES) LINKOBJ_GLUT = fluids.o colormap.o glyphs.o seedpoint.o streamlines.o palette.o funcs.o interact.o glut.o fftw-2.1.3/fftw/config.o fftw-2.1.3/fftw/executor.o fftw-2.1.3/fftw/fftwf77.o fftw-2.1.3/fftw/fftwnd.o fftw-2.1.3/fftw/fn_1.o fftw-2.1.3/fftw/fn_2.o fftw-2.1.3/fftw/fn_3.o fftw-2.1.3/fftw/fn_4.o fftw-2.1.3/fftw/fn_5.o fftw-2.1.3/fftw/fn_6.o fftw-2.1.3/fftw/fn_7.o fftw-2.1.3/fftw/fn_8.o fftw-2.1.3/fftw/fn_9.o fftw-2.1.3/fftw/fn_10.o fftw-2.1.3/fftw/fn_11.o fftw-2.1.3/fftw/fn_12.o fftw-2.1.3/fftw/fn_13.o fftw-2.1.3/fftw/fn_14.o fftw-2.1.3/fftw/fn_15.o fftw-2.1.3/fftw/fn_16.o fftw-2.1.3/fftw/fn_32.o fftw-2.1.3/fftw/fn_64.o fftw-2.1.3/fftw/fni_1.o fftw-2.1.3/fftw/fni_2.o fftw-2.1.3/fftw/fni_3.o fftw-2.1.3/fftw/fni_4.o fftw-2.1.3/fftw/fni_5.o fftw-2.1.3/fftw/fni_6.o fftw-2.1.3/fftw/fni_7.o fftw-2.1.3/fftw/fni_8.o fftw-2.1.3/fftw/fni_9.o fftw-2.1.3/fftw/fni_10.o fftw-2.1.3/fftw/fni_11.o fftw-2.1.3/fftw/fni_12.o fftw-2.1.3/fftw/fni_13.o fftw-2.1.3/fftw/fni_14.o fftw-2.1.3/fftw/fni_15.o fftw-2.1.3/fftw/fni_16.o fftw-2.1.3/fftw/fni_32.o fftw-2.1.3/fftw/fni_64.o fftw-2.1.3/fftw/ftw_2.o fftw-2.1.3/fftw/ftw_3.o fftw-2.1.3/fftw/ftw_4.o fftw-2.1.3/fftw/ftw_5.o fftw-2.1.3/fftw/ftw_6.o fftw-2.1.3/fftw/ftw_7.o fftw-2.1.3/fftw/ftw_8.o fftw-2.1.3/fftw/ftw_9.o fftw-2.1.3/fftw/ftw_10.o fftw-2.1.3/fftw/ftw_16.o fftw-2.1.3/fftw/ftw_32.o fftw-2.1.3/fftw/ftw_64.o fftw-2.1.3/fftw/ftwi_2.o fftw-2.1.3/fftw/ftwi_3.o fftw-2.1.3/fftw/ftwi_4.o fftw-2.1.3/fftw/ftwi_5.o fftw-2.1.3/fftw/ftwi_6.o fftw-2.1.3/fftw/ftwi_7.o fftw-2.1.3/fftw/ftwi_8.o fftw-2.1.3/fftw/ftwi_9.o fftw-2.1.3/fftw/ftwi_10.o fftw-2.1.3/fftw/ftwi_16.o fftw-2.1.3/fftw/ftwi_32.o fftw-2.1.3/fftw/ftwi_64.o fftw-2.1.3/fftw/generic.o fftw-2.1.3/fftw/malloc.o fftw-2.1.3/fftw/planner.o fftw-2.1.3/fftw/putils.o fftw-2.1.3/fftw/rader.o fftw-2.1.3/fftw/timer.o fftw-2.1.3/fftw/twiddle.o fftw-2.1.3/fftw/wisdom.o fftw-2.1.3/fftw/wisdomio.o fftw-2.1.3/rfftw/fcr_1.o fftw-2.1.3/rfftw/fcr_2.o fftw-2.1.3/rfftw/fcr_3.o fftw-2.1.3/rfftw/fcr_4.o fftw-2.1.3/rfftw/fcr_5.o fftw-2.1.3/rfftw/fcr_6.o fftw-2.1.3/rfftw/fcr_7.o fftw-2.1.3/rfftw/fcr_8.o fftw-2.1.3/rfftw/fcr_9.o fftw-2.1.3/rfftw/fcr_10.o fftw-2.1.3/rfftw/fcr_11.o fftw-2.1.3/rfftw/fcr_12.o fftw-2.1.3/rfftw/fcr_13.o fftw-2.1.3/rfftw/fcr_14.o fftw-2.1.3/rfftw/fcr_15.o fftw-2.1.3/rfftw/fcr_16.o fftw-2.1.3/rfftw/fcr_32.o fftw-2.1.3/rfftw/fcr_64.o fftw-2.1.3/rfftw/fcr_128.o fftw-2.1.3/rfftw/fhb_2.o fftw-2.1.3/rfftw/fhb_3.o fftw-2.1.3/rfftw/fhb_4.o fftw-2.1.3/rfftw/fhb_5.o fftw-2.1.3/rfftw/fhb_6.o fftw-2.1.3/rfftw/fhb_7.o fftw-2.1.3/rfftw/fhb_8.o fftw-2.1.3/rfftw/fhb_9.o fftw-2.1.3/rfftw/fhb_10.o fftw-2.1.3/rfftw/fhb_16.o fftw-2.1.3/rfftw/fhb_32.o fftw-2.1.3/rfftw/fhf_2.o fftw-2.1.3/rfftw/fhf_3.o fftw-2.1.3/rfftw/fhf_4.o fftw-2.1.3/rfftw/fhf_5.o fftw-2.1.3/rfftw/fhf_6.o fftw-2.1.3/rfftw/fhf_7.o fftw-2.1.3/rfftw/fhf_8.o fftw-2.1.3/rfftw/fhf_9.o fftw-2.1.3/rfftw/fhf_10.o fftw-2.1.3/rfftw/fhf_16.o fftw-2.1.3/rfftw/fhf_32.o fftw-2.1.3/rfftw/frc_1.o fftw-2.1.3/rfftw/frc_2.o fftw-2.1.3/rfftw/frc_3.o fftw-2.1.3/rfftw/frc_4.o fftw-2.1.3/rfftw/frc_5.o fftw-2.1.3/rfftw/frc_6.o fftw-2.1.3/rfftw/frc_7.o fftw-2.1.3/rfftw/frc_8.o fftw-2.1.3/rfftw/frc_9.o fftw-2.1.3/rfftw/frc_10.o fftw-2.1.3/rfftw/frc_11.o fftw-2.1.3/rfftw/frc_12.o fftw-2.1.3/rfftw/frc_13.o fftw-2.1.3/rfftw/frc_14.o fftw-2.1.3/rfftw/frc_15.o fftw-2.1.3/rfftw/frc_16.o fftw-2.1.3/rfftw/frc_32.o fftw-2.1.3/rfftw/frc_64.o fftw-2.1.3/rfftw/frc_128.o fftw-2.1.3/rfftw/rconfig.o fftw-2.1.3/rfftw/rexec2.o fftw-2.1.3/rfftw/rexec.o fftw-2.1.3/rfftw/rfftwf77.o fftw-2.1.3/rfftw/rfftwnd.o fftw-2.1.3/rfftw/rgeneric.o fftw-2.1.3/rfftw/rplanner.o $(RES) diff --git a/Smoke/colormap.c b/Smoke/colormap.c index 392bbac..ae6ba4f 100644 --- a/Smoke/colormap.c +++ b/Smoke/colormap.c @@ -166,12 +166,13 @@ fftw_real *colormap_get_frame(void) void colormap_autoscale(void) { if (colormap_autoscaling) { - int k; + int k, DIM; float value, scale_min, scale_max; scale_min = scale_max = get_dataset(0); colormap_scale_min = scale_min; colormap_scale_max = scale_max; + DIM = fluids_get_dim(); for (k = 1; k < DIM * DIM; k++) { diff --git a/Smoke/fluids.c b/Smoke/fluids.c index 6071d36..0dc8469 100644 --- a/Smoke/fluids.c +++ b/Smoke/fluids.c @@ -19,9 +19,10 @@ #include "fluids.h" #include "smoke.h" #include "colormap.h" +#include "glyphs.h" +#include "heightplots.h" //--- SIMULATION PARAMETERS ------------------------------------------------------------------------ -const int DIM = 50; //size of simulation grid int var_dims = 25; double dt = 0.4; //simulation time step float visc = 0.001f; //fluid viscosity @@ -49,53 +50,55 @@ float threshold2 = 2.0f; int isolines_nr = 1; static int fluids_calculate = TRUE; +static int DIM; //size of simulation grid //------ SIMULATION CODE STARTS HERE ----------------------------------------------------------------- //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) +fftw_real *init_simulation(int n, struct vis_data_arrays *vis_data) { - int i; size_t dim; + int i; size_t dim1, dim2; fftw_real *return_value; + + DIM = n; - dim = n * 2*(n/2+1)*sizeof(fftw_real); //Allocate data structures - return_value = (fftw_real *)malloc(dim); - vx = (fftw_real*) malloc(dim); - vy = (fftw_real*) malloc(dim); - vx0 = (fftw_real*) malloc(dim); - vy0 = (fftw_real*) malloc(dim); - dim = n * n * sizeof(fftw_real); - fx = (fftw_real*) malloc(dim); - fy = (fftw_real*) malloc(dim); - rho = (fftw_real*) malloc(dim); - rho0 = (fftw_real*) malloc(dim); + 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); + vy0 = (fftw_real*) malloc(dim1); + dim2 = n * n * sizeof(fftw_real); + fx = (fftw_real*) malloc(dim2); + fy = (fftw_real*) malloc(dim2); + rho = (fftw_real*) malloc(dim2); + rho0 = (fftw_real*) malloc(dim2); plan_rc = rfftw2d_create_plan(n, n, FFTW_REAL_TO_COMPLEX, FFTW_IN_PLACE); plan_cr = rfftw2d_create_plan(n, n, FFTW_COMPLEX_TO_REAL, FFTW_IN_PLACE); - height_array = (fftw_real*) malloc(dim); - normal_array = (struct point*) malloc(dim); - frame_hist = (fftw_real*) malloc(dim * n); + height_array = (fftw_real*) malloc(dim2); + normal_array = (struct point*) malloc(dim2); + frame_hist = (fftw_real*) malloc(dim2 * n); for (i = 0; i <= n; i++) { - frame_hist[i] = (fftw_real*) malloc(dim); + frame_hist[i] = (fftw_real*) malloc(dim1); } 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; } - return return_value; -} + vis_data->rho = rho; + vis_data->force = (fftw_real *)malloc(dim2); + vis_data->vel = (fftw_real *)malloc(dim1); + vis_data->div_force = (fftw_real *)malloc(dim2); + vis_data->div_vel = (fftw_real *)malloc(dim1); + vis_data->height = (fftw_real *)malloc(dim2); + vis_data->normals = (struct point *)malloc(dim2); -void fluids_init(int dim) -{ - size_t frame_size; - - frame_size = dim * 2*(dim/2+1)*sizeof(fftw_real); - - smoke_init(frame_size); + return return_value; } int rescale_to_winwidth(float value) @@ -286,7 +289,7 @@ void calculate_normal_vectors(void) } -void calculate_height_plot(void) +void calculate_height_plots(void) { int i; for (i = 0; i < DIM * DIM; i++) @@ -294,10 +297,10 @@ void calculate_height_plot(void) switch (vis_dataset) { case DATASET_FORCE: - height_array[i] = quake_root(fx[i] * fx[i] + fy[i] * fy[i]) * 100; + height_array[i] = vec_len2f(fx[i], fy[i]) * 100; break; case DATASET_VEL: - height_array[i] = quake_root(vx[i] * vx[i] + vy[i] * vy[i]) * 5000; + height_array[i] = vec_len2f(vx[i], vy[i]) * 5000; break; case DATASET_RHO: height_array[i] = rho[i] * 16; @@ -311,11 +314,88 @@ void calculate_height_plot(void) } } +void calculate_height_plot(struct vis_data_arrays *vis_data, int dataset, int index) +{ + switch(dataset) + { + default: + case DATASET_RHO: + vis_data->height[index] = rho[index]; + break; + case DATASET_VEL: + vis_data->height[index] = vec_len2f(vx[index], vy[index]); + break; + case DATASET_FORCE: + vis_data->height[index] = vec_len2f(fx[index], fy[index]); + break; + } +} + 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)); +} + +void populate_arrays(struct vis_data_arrays *vis_data) +{ + int idx, i, j; + + 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 + + for (j = 0; j < DIM; j++) + { + for (i = 0; i < DIM; i++) + { + idx = (j * DIM) + i; + + vis_data->rho[idx] = rho[idx]; + vis_data->vel[idx] = vec_len2f(vx[idx], vy[idx]); + vis_data->force[idx] = vec_len2f(fx[idx], fy[idx]); + vis_data->div_vel[idx] = par_der(vx[idx +1], vx[idx], wn) + +par_der(vy[idx +1], vy[idx], winHeight); + vis_data->div_force[idx] = par_der(fx[idx +1], fx[idx], hn) + +par_der(fy[idx +1], fy[idx], winHeight); + + calculate_height_plot(vis_data, heightplots_get_dataset(), idx); + } + } +} + +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; +} + //do_one_simulation_step: Do one complete cycle of the simulation: // - set_forces: // - solve: read forces from the user @@ -323,17 +403,28 @@ void copy_frames(fftw_real *dataset) // - gluPostRedisplay: draw a new visualization frame -void calculate_one_simulation_step(fftw_real *field) +void calculate_one_simulation_step(struct vis_data_arrays *vis_data) { + int dataset; + fftw_real *frame; + if (fluids_calculate) { set_forces(); solve(DIM, vx, vy, vx0, vy0, visc, dt); diffuse_matter(DIM, vx, vy, rho, rho0, dt); - calculate_height_plot(); + calculate_height_plots(); calculate_normal_vectors(); - copy_frames(rho); colormap_autoscale(); } + populate_arrays(vis_data); + + dataset = smoke_get_dataset(); + frame = get_frame(vis_data, dataset); + smoke_set_frame(frame); + + dataset = glyphs_get_dataset_color(); + frame = get_frame(vis_data, dataset); + glyphs_set_frame(frame); } //------ VISUALIZATION CODE STARTS HERE ----------------------------------------------------------------- @@ -491,3 +582,8 @@ int fluids_get_calculate(void) { return fluids_calculate; } + +int fluids_get_dim(void) +{ + return DIM; +} diff --git a/Smoke/fluids.h b/Smoke/fluids.h index ca2c214..c042094 100644 --- a/Smoke/fluids.h +++ b/Smoke/fluids.h @@ -3,13 +3,11 @@ //--- SIMULATION PARAMETERS ------------------------------------------------------------------------ -extern const int DIM; //size of simulation grid extern double dt; //simulation time step extern float visc; //fluid viscosity extern fftw_real *vx, *vy; //(vx,vy) = velocity field at the current moment -extern fftw_real *vx0, *vy0; //(vx0,vy0) = velocity field at the previous moment extern fftw_real *fx, *fy; //(fx,fy) = user-controlled simulation forces, steered with the mouse -extern fftw_real *rho, *rho0; //smoke density at the current (rho) and previous (rho0) moment +extern fftw_real *rho; //smoke density at the current (rho) and previous (rho0) moment extern rfftwnd_plan plan_rc, plan_cr; //simulation domain discretization extern fftw_real *height_array; //used for hight plot struct point *normal_array; //used for normal vectors @@ -22,6 +20,7 @@ extern int frame_index; #define DATASET_FORCE 2 #define DATASET_DIVV 3 #define DATASET_DIVF 4 +#define DATASET_HIST 5 #define SCALAR_RHO 0 #define SCALAR_VEL 1 @@ -41,15 +40,6 @@ extern int vis_dataset; extern int glyph_scalar; extern int glyph_vector; -fftw_real *init_simulation(int n); - -int rescale_to_winwidth(float value); - -void calculate_one_simulation_step(fftw_real *field); - -float get_dataset(int index); -void set_autoscaling(void); - ////////////////// void select_dataset(int arg); @@ -67,6 +57,17 @@ struct point { float z; }; +struct vis_data_arrays { + fftw_real *rho; + fftw_real *vel; + fftw_real *force; + fftw_real *div_vel; + fftw_real *div_force; + fftw_real *height; + struct point *normals; + fftw_real *history[50]; +}; + extern int isolines_nr; extern float threshold1; @@ -77,6 +78,17 @@ void fluids_init(int dim); void fluids_set_calculate(int calculate); int fluids_get_calculate(void); + 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 calculate_one_simulation_step(struct vis_data_arrays *vis_data); + +float get_dataset(int index); +void set_autoscaling(void); #endif diff --git a/Smoke/glyphs.c b/Smoke/glyphs.c index c4466df..6d562bf 100644 --- a/Smoke/glyphs.c +++ b/Smoke/glyphs.c @@ -23,7 +23,7 @@ static float glyphs_alpha = 0.5f; static int glyphs_dataset_color = DATASET_RHO; static int glyphs_dataset_direction = DATASET_RHO; -static fftw_real *glyphs_field; +static fftw_real *glyphs_frame; void glyphs_set_render(int render_glyphs) @@ -86,14 +86,14 @@ int glyphs_get_dataset_direction(void) return glyphs_dataset_direction; } -void glyphs_set_field(fftw_real *field) +void glyphs_set_frame(fftw_real *frame) { - glyphs_field = field; + glyphs_frame = frame; } -fftw_real *glyphs_get_field(void) +fftw_real *glyphs_get_frame(void) { - return glyphs_field; + return glyphs_frame; } diff --git a/Smoke/glyphs.h b/Smoke/glyphs.h index 2a40a94..fa97fe6 100644 --- a/Smoke/glyphs.h +++ b/Smoke/glyphs.h @@ -19,8 +19,8 @@ int glyphs_get_dataset_color(void); void glyphs_set_dataset_direction(int dataset); int glyphs_get_dataset_direction(void); -void glyphs_set_field(fftw_real *field); -fftw_real *glyphs_get_field(void); +void glyphs_set_frame(fftw_real *frame); +fftw_real *glyphs_get_frame(void); struct color4f glyphs_get_color(float value); #endif diff --git a/Smoke/gtk.c b/Smoke/gtk.c index bd1ab4b..bd04a8b 100644 --- a/Smoke/gtk.c +++ b/Smoke/gtk.c @@ -103,7 +103,7 @@ static void timeout_remove (GtkWidget *widget); static GdkGLConfig *configure_gl (void); //static GtkWidget *create_popup_menu (GtkWidget *drawing_area); -static GtkWidget *create_window (GdkGLConfig *glconfig, fftw_real *field); +static GtkWidget *create_window (GdkGLConfig *glconfig, struct vis_data_arrays *vis_data); /************************************************************************** @@ -187,7 +187,7 @@ expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer data) { - fftw_real *field = (gpointer)data; + struct vis_data_arrays *vis_data = (struct vis_data_arrays *)data; GdkGLContext *glcontext = gtk_widget_get_gl_context (widget); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget); @@ -203,8 +203,8 @@ expose_event (GtkWidget *widget, // fluids glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - calculate_one_simulation_step(field); - visualize(field); + calculate_one_simulation_step(vis_data); + visualize(vis_data); // endf /* Swap buffers */ @@ -623,7 +623,7 @@ create_popup_menu (GtkWidget *drawing_area) *** drawing area that has an OpenGL-capable visual. ***/ static GtkWidget * -create_window (GdkGLConfig *glconfig, fftw_real *field) +create_window (GdkGLConfig *glconfig, struct vis_data_arrays *vis_data) { GtkWidget *window; GtkWidget *hbox; @@ -678,7 +678,7 @@ create_window (GdkGLConfig *glconfig, fftw_real *field) g_signal_connect (G_OBJECT (drawing_area), "configure_event", G_CALLBACK (configure_event), NULL); g_signal_connect (G_OBJECT (drawing_area), "expose_event", - G_CALLBACK (expose_event), (gpointer)field); + G_CALLBACK (expose_event), (gpointer)vis_data); g_signal_connect (G_OBJECT (drawing_area), "unrealize", G_CALLBACK (unrealize), NULL); @@ -873,11 +873,10 @@ main (int argc, { GtkWidget *window; GdkGLConfig *glconfig; - fftw_real *field; + struct vis_data_arrays vis_data; /* Initialize the simulation */ - field = init_simulation(DIM); - fluids_init(DIM); + init_simulation(50, &vis_data); /* Initialize GTK. */ gtk_init (&argc, &argv); @@ -889,7 +888,7 @@ main (int argc, glconfig = configure_gl (); /* Create and show the application window. */ - window = create_window (glconfig, field); + window = create_window (glconfig, &vis_data); gtk_widget_show (window); gtk_main(); diff --git a/Smoke/gtk_main.c b/Smoke/gtk_main.c index 8d2fa9f..7635898 100644 --- a/Smoke/gtk_main.c +++ b/Smoke/gtk_main.c @@ -189,39 +189,72 @@ GtkWidget *create_main_page(void) frame = gtk_frame_new("Dataset"); - box = gtk_hbox_new(FALSE, 0); + 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(box), button, TRUE, TRUE, 0); - gtk_widget_show(button); + 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)); + 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(box), button, TRUE, TRUE, 0); - gtk_widget_show(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(box), 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); diff --git a/Smoke/heightplots.c b/Smoke/heightplots.c index c4546df..4593455 100644 --- a/Smoke/heightplots.c +++ b/Smoke/heightplots.c @@ -6,6 +6,7 @@ #include +#include "fluids.h" #include "funcs.h" #include "palette.h" @@ -20,6 +21,8 @@ static int heightplots_colormap = PALETTE_BLACKWHITE; static float heightplots_alpha = 1.0f; +static int heightplots_dataset = DATASET_RHO; + static fftw_real *heightplots_frame; @@ -63,6 +66,16 @@ float heightplots_get_alpha(void) return heightplots_alpha; } +void heightplots_set_dataset(int dataset) +{ + heightplots_dataset = dataset; +} + +int heightplots_get_dataset(void) +{ + return heightplots_dataset; +} + void heightplots_set_frame(fftw_real *frame) { heightplots_frame = frame; diff --git a/Smoke/heightplots.h b/Smoke/heightplots.h index 856a701..49c5441 100644 --- a/Smoke/heightplots.h +++ b/Smoke/heightplots.h @@ -13,6 +13,9 @@ int heightplots_get_colormap(void); void heightplots_set_alpha(float alpha); float heightplots_get_alpha(void); +void heightplots_set_dataset(int dataset); +int heightplots_get_dataset(void); + void heightplots_set_frame(fftw_real *frame); fftw_real *heightplots_get_frame(void); diff --git a/Smoke/renderer_gl.c b/Smoke/renderer_gl.c index 186568d..b21ef58 100644 --- a/Smoke/renderer_gl.c +++ b/Smoke/renderer_gl.c @@ -137,10 +137,13 @@ static void render_legend(void) static void render_normal(void) { - int i, j, idx; + int i, j, idx, DIM; double px, py; - 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 + fftw_real wn, hn; + + DIM = fluids_get_dim(); + wn = (fftw_real)winWidth / (fftw_real)(DIM + 1); // Grid cell width + hn = (fftw_real)winHeight / (fftw_real)(DIM + 1); // Grid cell height float normal_scale = 10.0f; glDisable(GL_LIGHTING); @@ -168,11 +171,16 @@ static void render_normal(void) static void render_smoke(void) { - int i, j, idx; double px,py; - 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 + int i, j, idx, DIM; + double px,py; + fftw_real wn, hn; struct color4f color; + + DIM = fluids_get_dim(); + wn = (fftw_real)winWidth / (fftw_real)(DIM + 1); // Grid cell width + hn = (fftw_real)winHeight / (fftw_real)(DIM + 1); // Grid cell height + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); for (j = 0; j < DIM - 1; j++) //draw smoke @@ -225,10 +233,13 @@ static void render_smoke(void) static void render_glyph(GLUquadricObj *qobj, float x_value, float y_value, float i, float j) { float x0, y0, z0, x1, y1, z1, x_dev, y_dev, size, length; - float scale = (float)((float)DIM / (float)get_var_dims()) / 6; + float scale; double theta, in_prod; fftw_real wn, hn; + int DIM; + DIM = fluids_get_dim(); + scale = (float)((float)DIM / (float)get_var_dims()) / 6; size = quake_root((x_value * x_value * 20) + (y_value * y_value * 20)) * 5 * scale; wn = (fftw_real)winWidth / (fftw_real)(get_var_dims() + 1); // Grid cell width @@ -306,7 +317,7 @@ static void render_glyph(GLUquadricObj *qobj, float x_value, float y_value, floa static void render_glyphs(void) { - int i, j, idx; + int i, j, idx, DIM; float value, scale, idxcf, idxrf; struct color4f color; @@ -314,6 +325,8 @@ static void render_glyphs(void) gluQuadricDrawStyle(qobj, GLU_FILL); gluQuadricNormals(qobj, GLU_SMOOTH); + DIM = fluids_get_dim(); + scale = (float)((float)DIM / (float)get_var_dims()); for (i = 0; i < get_var_dims(); i++) { @@ -361,12 +374,15 @@ static void render_glyphs(void) static void render_isolines(void) { - 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 - - int count; + fftw_real wn, hn; + int count, DIM; float iso_scale; + DIM = fluids_get_dim(); + + wn = (fftw_real)winWidth / (fftw_real)(DIM + 1); // Grid cell width + hn = (fftw_real)winHeight / (fftw_real)(DIM + 1); // Grid cell height + if (isolines_nr) { iso_scale = (float)(fabs(threshold1 - threshold2) / (float)isolines_nr); } else { @@ -502,13 +518,14 @@ static void render_isolines(void) static void render_streamlines(void) { - int i, j, k, l, idx; + int i, j, k, l, idx, DIM; float v; struct point p; int *frame_history; fftw_real cell_x, cell_y; i = j = k = l = 0; + DIM = fluids_get_dim(); for (i = 0; i < get_cur_seedpoint(); i++) { @@ -535,14 +552,20 @@ static void render_streamlines(void) void render_flowvis(void) { - int i, j, idx; double px,py; - 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 + int i, j, idx, DIM; + double px,py; + fftw_real wn, hn; struct color4f color; fftw_real *field; + DIM = fluids_get_dim(); + + wn = (fftw_real)winWidth / (fftw_real)(DIM + 1); // Grid cell width + hn = (fftw_real)winHeight / (fftw_real)(DIM + 1); // Grid cell height + field = smoke_get_frame(); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); for (j = 0; j < DIM - 1; j++) //draw smoke @@ -661,7 +684,7 @@ void renderer_reset_roll(void) //visualize: This is the main visualization function -void visualize(fftw_real *field) +void visualize(struct vis_data_arrays *vis_data) { // Rotate field diff --git a/Smoke/renderer_gl.h b/Smoke/renderer_gl.h index fd515ea..4d7d421 100644 --- a/Smoke/renderer_gl.h +++ b/Smoke/renderer_gl.h @@ -3,7 +3,7 @@ void renderer_init_gl(void); -void visualize(fftw_real *field); +void visualize(struct vis_data_arrays *vis_data); void renderer_set_zoomspeed(int zoomspeed); diff --git a/Smoke/smoke.bin b/Smoke/smoke.bin index 4b0292b..bb10f34 100755 Binary files a/Smoke/smoke.bin and b/Smoke/smoke.bin differ diff --git a/Smoke/smoke.c b/Smoke/smoke.c index 0e62854..70696a4 100644 --- a/Smoke/smoke.c +++ b/Smoke/smoke.c @@ -3,8 +3,6 @@ #include #endif -#include - #include #include "fluids.h" @@ -37,9 +35,9 @@ int smoke_get_dataset(void) return smoke_dataset; } -void smoke_init(size_t frame_size) +void smoke_set_frame(fftw_real *frame) { - smoke_frame = malloc(frame_size); + smoke_frame = frame; } fftw_real *smoke_get_frame(void) diff --git a/Smoke/smoke.h b/Smoke/smoke.h index f53f142..8c163ff 100644 --- a/Smoke/smoke.h +++ b/Smoke/smoke.h @@ -7,7 +7,7 @@ int smoke_get_render(void); void smoke_set_dataset(int dataset); int smoke_get_dataset(void); -void smoke_init(size_t frame_size); +void smoke_set_frame(fftw_real *frame); fftw_real *smoke_get_frame(void); #endif -- cgit v0.12