From 95276812f04f5bf47d4c69da8bafed5563ff082b Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Wed, 9 Jan 2008 10:16:09 +0000 Subject: smoke! --- Smoke/fluids.c | 8 +- Smoke/renderer_gl.c | 215 +++++++++++++++++++++++++++------------------------- Smoke/smoke.bin | Bin 637207 -> 637668 bytes 3 files changed, 116 insertions(+), 107 deletions(-) diff --git a/Smoke/fluids.c b/Smoke/fluids.c index 2113357..21bb554 100644 --- a/Smoke/fluids.c +++ b/Smoke/fluids.c @@ -399,10 +399,10 @@ void populate_arrays(struct vis_data_arrays *vis_data) vis_data->height[idx] = calculate_height_plot(heightplots_get_dataset(), idx); vis_data->normals[idx] = calculate_normal_vector(vis_data->height, idx, i, j); -// if (normal_array[idx].x != vis_data->normals[idx].x) { - // printf("n: %lf; old: %lf\n", - // vis_data->normals[idx].x, normal_array[idx].x); - //} +// if (normal_array[idx].z != vis_data->normals[idx].z) { +// printf("n: %lf; old: %lf\n", +// vis_data->normals[idx].z, normal_array[idx].z); +// } } } } diff --git a/Smoke/renderer_gl.c b/Smoke/renderer_gl.c index 5a33093..a2b6a6f 100644 --- a/Smoke/renderer_gl.c +++ b/Smoke/renderer_gl.c @@ -65,6 +65,51 @@ static int renderer_zoomspeed = DEFAULT_ZOOM_SPEED; static GLuint texture; + +GLuint load_textures(char *filename) +{ + GLuint return_value; + FILE *bitmap; + + return_value = 0; + + bitmap = fopen(filename, "rb"); + if (bitmap > 0) { + unsigned int dataoffset, filesize; + GLsizei width, height; + unsigned char *imagedata; + + fseek(bitmap, BITMAP_FILESIZE, SEEK_SET); + fread(&filesize, 4, 1, bitmap); + fseek(bitmap, BITMAP_OFFSET, SEEK_SET); + fread(&dataoffset, 4, 1, bitmap); +/* fseek(bitmap, BITMAP_HEADERSIZE, SEEK_SET); */ +/* fread(&headersize, 4, 1, bitmap); */ + fseek(bitmap, BITMAP_WIDTH, SEEK_SET); + fread(&width, 4, 1, bitmap); +/* fseek(bitmap, BITMAP_HEIGHT, SEEK_SET); */ + fread(&height, 4, 1, bitmap); + + imagedata = (unsigned char *)malloc((size_t)(filesize -dataoffset) /* *(char *) */); + + fseek(bitmap, dataoffset, SEEK_SET); + fread(imagedata, (size_t)(filesize -dataoffset), 1, bitmap); + + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_BGR, GL_UNSIGNED_BYTE, imagedata); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + return_value = texture; + + free(imagedata); + fclose(bitmap); + } + + return return_value; +} + + static void render_legend(void) { int i, s, c; @@ -225,14 +270,14 @@ static void render_normals(void) int i, j, idx, DIM; fftw_real wn, hn; fftw_real *height; - struct point *normals; + struct point *normal; 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 height = heightplots_get_frame(); - normals = normals_get_frame(); + normal = normals_get_frame(); glDisable(GL_LIGHTING); glBegin(GL_LINES); @@ -252,27 +297,33 @@ static void render_normals(void) pz = height[idx] *height_multiplier; glVertex3f(px, py, pz); - glVertex3f(px +(normal_array[idx].x *NORMAL_SCALE), - py +(normal_array[idx].y *NORMAL_SCALE), - pz +(normal_array[idx].z *NORMAL_SCALE)); + glVertex3f(px +(normal[idx].x *NORMAL_SCALE), + py +(normal[idx].y *NORMAL_SCALE), + pz +(normal[idx].z *NORMAL_SCALE)); } } glEnable(GL_LIGHTING); glEnd(); } -static void render_smoke(void) + +void render_smoke(void) { - int i, j, idx, DIM; - double px,py; + int i, j, idx, DIM; + double px, py, pz; fftw_real wn, hn; struct color4f color; + fftw_real *frame, *height; + struct point *normal; - 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 + hn = (fftw_real)winHeight / (fftw_real)(DIM + 1); // Grid cell height + frame = smoke_get_frame(); + height = heightplots_get_frame(); + normal = normals_get_frame(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); for (j = 0; j < DIM - 1; j++) //draw smoke @@ -280,92 +331,49 @@ static void render_smoke(void) glBegin(GL_TRIANGLE_STRIP); i = 0; + idx = (j * DIM) + i; px = wn + (fftw_real)i * wn; py = hn + (fftw_real)j * hn; - idx = (j * DIM) + i; + pz = height[idx] *heightplots_get_height(); - color = colormap_get_color(get_dataset(idx)); - glColor4f(color.r, color.g, color.b, color.a); - glNormal3f(normal_array[idx].x, normal_array[idx].y, normal_array[idx].z); - glVertex3f(px, py, height_array[idx]); // vertex 1 - + color = colormap_get_color(frame[idx]); + glColor3f(frame[idx], frame[idx], frame[idx]); + glNormal3f(normal[idx].x, normal[idx].y, normal[idx].z); + glVertex3f(px, py, pz); + for (i = 0; i < DIM - 1; i++) { + idx = ((j + 1) * DIM) + i; px = wn + (fftw_real)i * wn; py = hn + (fftw_real)(j + 1) * hn; - idx = ((j + 1) * DIM) + i; - get_dataset(idx); - color = colormap_get_color(get_dataset(idx)); - glColor4f(color.r, color.g, color.b, color.a); - glNormal3f(normal_array[idx].x, normal_array[idx].y, normal_array[idx].z); - glVertex3f(px, py, height_array[idx]); // vertex 2 - + pz = height[idx] *heightplots_get_height(); + color = colormap_get_color(frame[idx]); + glColor4f(color.r, color.g, color.b, color.a); + glNormal3f(normal[idx].x, normal[idx].y, normal[idx].z); + glVertex3f(px, py, pz); + idx = (j * DIM) + (i + 1); px = wn + (fftw_real)(i + 1) * wn; py = hn + (fftw_real)j * hn; - idx = (j * DIM) + (i + 1); - color = colormap_get_color(get_dataset(idx)); + pz = height[idx] *heightplots_get_height(); + color = colormap_get_color(frame[idx]); glColor4f(color.r, color.g, color.b, color.a); - glNormal3f(normal_array[idx].x, normal_array[idx].y, normal_array[idx].z); - glVertex3f(px, py, height_array[idx]); // vertex 3 + glNormal3f(normal[idx].x, normal[idx].y, normal[idx].z); + glVertex3f(px, py, pz); } + idx = ((j + 1) * DIM) + (DIM - 1); px = wn + (fftw_real)(DIM - 1) * wn; py = hn + (fftw_real)(j + 1) * hn; - idx = ((j + 1) * DIM) + (DIM - 1); - color = colormap_get_color(get_dataset(idx)); + pz = height[idx] *heightplots_get_height(); + color = colormap_get_color(frame[idx]); glColor4f(color.r, color.g, color.b, color.a); - glNormal3f(normal_array[idx].x, normal_array[idx].y, normal_array[idx].z); - glVertex3f(px, py, height_array[idx]); // vertex 4 - + glNormal3f(normal[idx].x, normal[idx].y, normal[idx].z); + glVertex3f(px, py, pz); glEnd(); } } -GLuint LoadTextures(char *filename) -{ - GLuint return_value; - FILE *bitmap; - - return_value = 0; - - bitmap = fopen(filename, "rb"); - if (bitmap > 0) { - unsigned int dataoffset, filesize; - GLsizei width, height; - unsigned char *imagedata; - - fseek(bitmap, BITMAP_FILESIZE, SEEK_SET); - fread(&filesize, 4, 1, bitmap); - fseek(bitmap, BITMAP_OFFSET, SEEK_SET); - fread(&dataoffset, 4, 1, bitmap); -/* fseek(bitmap, BITMAP_HEADERSIZE, SEEK_SET); */ -/* fread(&headersize, 4, 1, bitmap); */ - fseek(bitmap, BITMAP_WIDTH, SEEK_SET); - fread(&width, 4, 1, bitmap); -/* fseek(bitmap, BITMAP_HEIGHT, SEEK_SET); */ - fread(&height, 4, 1, bitmap); - - imagedata = (unsigned char *)malloc((size_t)(filesize -dataoffset) /* *(char *) */); - - fseek(bitmap, dataoffset, SEEK_SET); - fread(imagedata, (size_t)(filesize -dataoffset), 1, bitmap); - - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_BGR, GL_UNSIGNED_BYTE, imagedata); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - return_value = texture; - - free(imagedata); - fclose(bitmap); - } - - return return_value; -} - - 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; @@ -781,21 +789,17 @@ static void render_streamlines(void) } -void render_flowvis(void) +static void render_flowvis(void) { - int i, j, idx, DIM; - double px, py, pz; + int i, j, idx, DIM; + double px,py; fftw_real wn, hn; struct color4f color; - fftw_real *frame, *height; + 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 - - frame = smoke_get_frame(); - height = heightplots_get_frame(); + hn = (fftw_real)winHeight / (fftw_real)(DIM + 1); // Grid cell height glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); @@ -804,44 +808,49 @@ void render_flowvis(void) glBegin(GL_TRIANGLE_STRIP); i = 0; - idx = (j * DIM) + i; px = wn + (fftw_real)i * wn; py = hn + (fftw_real)j * hn; - pz = height[idx] *heightplots_get_height(); + idx = (j * DIM) + i; - glColor3f(frame[idx],frame[idx],frame[idx]); - glVertex3f(px, py, pz); + color = flowvis_get_color(get_dataset(idx)); + glColor4f(color.r, color.g, color.b, color.a); + glNormal3f(normal_array[idx].x, normal_array[idx].y, normal_array[idx].z); + glVertex3f(px, py, height_array[idx]); // vertex 1 for (i = 0; i < DIM - 1; i++) { - idx = ((j + 1) * DIM) + i; px = wn + (fftw_real)i * wn; py = hn + (fftw_real)(j + 1) * hn; - pz = height[idx] *heightplots_get_height(); - color = flowvis_get_color(frame[idx]); - glColor4f(color.r, color.g, color.b, color.a); - glVertex3f(px, py, pz); - idx = (j * DIM) + (i + 1); + idx = ((j + 1) * DIM) + i; + get_dataset(idx); + color = flowvis_get_color(get_dataset(idx)); + glColor4f(color.r, color.g, color.b, color.a); + glNormal3f(normal_array[idx].x, normal_array[idx].y, normal_array[idx].z); + glVertex3f(px, py, height_array[idx]); // vertex 2 + px = wn + (fftw_real)(i + 1) * wn; py = hn + (fftw_real)j * hn; - pz = height[idx] *heightplots_get_height(); - color = flowvis_get_color(frame[idx]); + idx = (j * DIM) + (i + 1); + color = flowvis_get_color(get_dataset(idx)); glColor4f(color.r, color.g, color.b, color.a); - glVertex3f(px, py, pz); + glNormal3f(normal_array[idx].x, normal_array[idx].y, normal_array[idx].z); + glVertex3f(px, py, height_array[idx]); // vertex 3 } - idx = ((j + 1) * DIM) + (DIM - 1); px = wn + (fftw_real)(DIM - 1) * wn; py = hn + (fftw_real)(j + 1) * hn; - pz = height[idx] *heightplots_get_height(); - color = flowvis_get_color(frame[idx]); + idx = ((j + 1) * DIM) + (DIM - 1); + color = flowvis_get_color(get_dataset(idx)); glColor4f(color.r, color.g, color.b, color.a); - glVertex3f(px, py, pz); + glNormal3f(normal_array[idx].x, normal_array[idx].y, normal_array[idx].z); + glVertex3f(px, py, height_array[idx]); // vertex 4 + glEnd(); } } + void renderer_init_gl(void) { float LightAmbient[] = { 0.10f, 0.10f, 0.10f, 1.00f }; // Ambient light values @@ -869,7 +878,7 @@ void renderer_init_gl(void) glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT0, GL_POSITION, LightPosition); - texture = LoadTextures(BITMAP_SOURCE); + texture = load_textures(BITMAP_SOURCE); } diff --git a/Smoke/smoke.bin b/Smoke/smoke.bin index 580da38..df62b48 100755 Binary files a/Smoke/smoke.bin and b/Smoke/smoke.bin differ -- cgit v0.12