[Bf-blender-cvs] [3e1a9ee] master: Smoke drawing code cleanups (and little refactor)

Kévin Dietrich noreply at git.blender.org
Sun Nov 22 18:20:28 CET 2015


Commit: 3e1a9ee386b054912b540b7a061d76235f4049fa
Author: Kévin Dietrich
Date:   Sun Nov 22 18:17:09 2015 +0100
Branches: master
https://developer.blender.org/rB3e1a9ee386b054912b540b7a061d76235f4049fa

Smoke drawing code cleanups (and little refactor)

This patch contains the following changes:

- the vertices and edges arrays would be assigned default values, and
then reassigned new ones right away. It appears that those arrays were
once global and then made local
(rB06a2ee4afed4237398b69ddf253e29a730b2f9f0), so it makes sense now to
initialize them with the right values.
- the flame spectrum texture was created whether it was needed or not,
so now it's only created if there's flame to be drawn, also split the
code in a separate function.
 - reduce the number of parameters to the main draw function, as most of
them are member of SmokeDomainSettings.
- some other minor cleanups: fold multiple operations into one to get
rid of one local variable, mark variables as `const` when necessary,
unecessary gl draw calls, reorder the code a bit...

Reviewers: campbellbarton, psy-fi

Differential Revision: https://developer.blender.org/D1368

===================================================================

M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/editors/space_view3d/drawvolume.c
M	source/blender/editors/space_view3d/view3d_intern.h

===================================================================

diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 4ffbf61..a2386c5 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -8093,7 +8093,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short
 			}
 
 			/* don't show smoke before simulation starts, this could be made an option in the future */
-			if (smd->domain->fluid && CFRA >= smd->domain->point_cache[0]->startframe) {
+			if (sds->fluid && CFRA >= sds->point_cache[0]->startframe) {
 				float p0[3], p1[3];
 
 				/* get view vector */
@@ -8112,21 +8112,15 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short
 				p1[2] = (sds->p0[2] + sds->cell_size[2] * sds->res_max[2] + sds->obj_shift_f[2]) * fabsf(ob->size[2]);
 
 				if (!sds->wt || !(sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) {
-					smd->domain->tex = NULL;
+					sds->tex = NULL;
 					GPU_create_smoke(smd, 0);
-					draw_smoke_volume(sds, ob, sds->tex,
-					                  p0, p1,
-					                  sds->res, sds->dx, sds->scale * sds->maxres,
-					                  viewnormal, sds->tex_shadow, sds->tex_flame);
+					draw_smoke_volume(sds, ob, p0, p1, sds->res, viewnormal);
 					GPU_free_smoke(smd);
 				}
 				else if (sds->wt && (sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) {
 					sds->tex = NULL;
 					GPU_create_smoke(smd, 1);
-					draw_smoke_volume(sds, ob, sds->tex,
-					                  p0, p1,
-					                  sds->res_wt, sds->dx, sds->scale * sds->maxres,
-					                  viewnormal, sds->tex_shadow, sds->tex_flame);
+					draw_smoke_volume(sds, ob, p0, p1, sds->res_wt, viewnormal);
 					GPU_free_smoke(smd);
 				}
 
diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c
index d6691f4..a270375 100644
--- a/source/blender/editors/space_view3d/drawvolume.c
+++ b/source/blender/editors/space_view3d/drawvolume.c
@@ -59,7 +59,7 @@ struct GPUTexture;
 #  include "PIL_time_utildefines.h"
 #endif
 
-static int intersect_edges(float (*points)[3], float a, float b, float c, float d, float edges[12][2][3])
+static int intersect_edges(float (*points)[3], float a, float b, float c, float d, const float edges[12][2][3])
 {
 	int i;
 	float t;
@@ -88,74 +88,20 @@ static bool convex(const float p0[3], const float up[3], const float a[3], const
 	return dot_v3v3(up, tmp) >= 0;
 }
 
-void draw_smoke_volume(SmokeDomainSettings *sds, Object *ob,
-                       GPUTexture *tex, const float min[3], const float max[3],
-                       const int res[3], float dx, float UNUSED(base_scale), const float viewnormal[3],
-                       GPUTexture *tex_shadow, GPUTexture *tex_flame)
+static GPUTexture *create_flame_spectrum_texture(void)
 {
-	const float ob_sizei[3] = {
-	    1.0f / fabsf(ob->size[0]),
-	    1.0f / fabsf(ob->size[1]),
-	    1.0f / fabsf(ob->size[2])};
-
-	int i, j, k, n, good_index;
-	float d /*, d0 */ /* UNUSED */, dd, ds;
-	float (*points)[3] = NULL;
-	int numpoints = 0;
-	float cor[3] = {1.0f, 1.0f, 1.0f};
-	int gl_depth = 0, gl_blend = 0;
-
-	const bool use_fire = (sds->active_fields & SM_ACTIVE_FIRE) != 0;
-
-	/* draw slices of smoke is adapted from c++ code authored
-	 * by: Johannes Schmid and Ingemar Rask, 2006, johnny at grob.org */
-	float cv[][3] = {
-		{1.0f, 1.0f, 1.0f}, {-1.0f, 1.0f, 1.0f}, {-1.0f, -1.0f, 1.0f}, {1.0f, -1.0f, 1.0f},
-		{1.0f, 1.0f, -1.0f}, {-1.0f, 1.0f, -1.0f}, {-1.0f, -1.0f, -1.0f}, {1.0f, -1.0f, -1.0f}
-	};
-
-	/* edges have the form edges[n][0][xyz] + t*edges[n][1][xyz] */
-	float edges[12][2][3] = {
-		{{1.0f, 1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
-		{{-1.0f, 1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
-		{{-1.0f, -1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
-		{{1.0f, -1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
-
-		{{1.0f, -1.0f, 1.0f}, {0.0f, 2.0f, 0.0f}},
-		{{-1.0f, -1.0f, 1.0f}, {0.0f, 2.0f, 0.0f}},
-		{{-1.0f, -1.0f, -1.0f}, {0.0f, 2.0f, 0.0f}},
-		{{1.0f, -1.0f, -1.0f}, {0.0f, 2.0f, 0.0f}},
-
-		{{-1.0f, 1.0f, 1.0f}, {2.0f, 0.0f, 0.0f}},
-		{{-1.0f, -1.0f, 1.0f}, {2.0f, 0.0f, 0.0f}},
-		{{-1.0f, -1.0f, -1.0f}, {2.0f, 0.0f, 0.0f}},
-		{{-1.0f, 1.0f, -1.0f}, {2.0f, 0.0f, 0.0f}}
-	};
-
-	unsigned char *spec_data;
-	float *spec_pixels;
-	GPUTexture *tex_spec;
-	GPUProgram *smoke_program;
-	int progtype = (sds->active_fields & SM_ACTIVE_COLORS) ? GPU_PROGRAM_SMOKE_COLORED : GPU_PROGRAM_SMOKE;
-	float size[3];
-
-	if (!tex) {
-		printf("Could not allocate 3D texture for 3D View smoke drawing.\n");
-		return;
-	}
-
-#ifdef DEBUG_DRAW_TIME
-	TIMEIT_START(draw);
-#endif
-
-	/* generate flame spectrum texture */
 #define SPEC_WIDTH 256
 #define FIRE_THRESH 7
 #define MAX_FIRE_ALPHA 0.06f
 #define FULL_ON_FIRE 100
-	spec_data = malloc(SPEC_WIDTH * 4 * sizeof(unsigned char));
+
+	GPUTexture *tex;
+	int i, j, k;
+	unsigned char *spec_data = malloc(SPEC_WIDTH * 4 * sizeof(unsigned char));
+	float *spec_pixels = malloc(SPEC_WIDTH * 4 * 16 * 16 * sizeof(float));
+
 	flame_get_spectrum(spec_data, SPEC_WIDTH, 1500, 3000);
-	spec_pixels = malloc(SPEC_WIDTH * 4 * 16 * 16 * sizeof(float));
+
 	for (i = 0; i < 16; i++) {
 		for (j = 0; j < 16; j++) {
 			for (k = 0; k < SPEC_WIDTH; k++) {
@@ -168,87 +114,93 @@ void draw_smoke_volume(SmokeDomainSettings *sds, Object *ob,
 					        (k > FULL_ON_FIRE) ? 1.0f : (k - FIRE_THRESH) / ((float)FULL_ON_FIRE - FIRE_THRESH));
 				}
 				else {
-					spec_pixels[index] = spec_pixels[index + 1] = spec_pixels[index + 2] = spec_pixels[index + 3] = 0.0f;
+					zero_v4(&spec_pixels[index]);
 				}
 			}
 		}
 	}
 
-	tex_spec = GPU_texture_create_1D(SPEC_WIDTH, spec_pixels, NULL);
+	tex = GPU_texture_create_1D(SPEC_WIDTH, spec_pixels, NULL);
+
+	free(spec_data);
+	free(spec_pixels);
 
 #undef SPEC_WIDTH
 #undef FIRE_THRESH
 #undef MAX_FIRE_ALPHA
 #undef FULL_ON_FIRE
 
-	sub_v3_v3v3(size, max, min);
-
-	/* maxx, maxy, maxz */
-	cv[0][0] = max[0];
-	cv[0][1] = max[1];
-	cv[0][2] = max[2];
-	/* minx, maxy, maxz */
-	cv[1][0] = min[0];
-	cv[1][1] = max[1];
-	cv[1][2] = max[2];
-	/* minx, miny, maxz */
-	cv[2][0] = min[0];
-	cv[2][1] = min[1];
-	cv[2][2] = max[2];
-	/* maxx, miny, maxz */
-	cv[3][0] = max[0];
-	cv[3][1] = min[1];
-	cv[3][2] = max[2];
-
-	/* maxx, maxy, minz */
-	cv[4][0] = max[0];
-	cv[4][1] = max[1];
-	cv[4][2] = min[2];
-	/* minx, maxy, minz */
-	cv[5][0] = min[0];
-	cv[5][1] = max[1];
-	cv[5][2] = min[2];
-	/* minx, miny, minz */
-	cv[6][0] = min[0];
-	cv[6][1] = min[1];
-	cv[6][2] = min[2];
-	/* maxx, miny, minz */
-	cv[7][0] = max[0];
-	cv[7][1] = min[1];
-	cv[7][2] = min[2];
-
-	copy_v3_v3(edges[0][0], cv[4]); /* maxx, maxy, minz */
-	copy_v3_v3(edges[1][0], cv[5]); /* minx, maxy, minz */
-	copy_v3_v3(edges[2][0], cv[6]); /* minx, miny, minz */
-	copy_v3_v3(edges[3][0], cv[7]); /* maxx, miny, minz */
-
-	copy_v3_v3(edges[4][0], cv[3]); /* maxx, miny, maxz */
-	copy_v3_v3(edges[5][0], cv[2]); /* minx, miny, maxz */
-	copy_v3_v3(edges[6][0], cv[6]); /* minx, miny, minz */
-	copy_v3_v3(edges[7][0], cv[7]); /* maxx, miny, minz */
-
-	copy_v3_v3(edges[8][0], cv[1]); /* minx, maxy, maxz */
-	copy_v3_v3(edges[9][0], cv[2]); /* minx, miny, maxz */
-	copy_v3_v3(edges[10][0], cv[6]); /* minx, miny, minz */
-	copy_v3_v3(edges[11][0], cv[5]); /* minx, maxy, minz */
+	return tex;
+}
 
-	// printf("size x: %f, y: %f, z: %f\n", size[0], size[1], size[2]);
-	// printf("min[2]: %f, max[2]: %f\n", min[2], max[2]);
+void draw_smoke_volume(SmokeDomainSettings *sds, Object *ob,
+                       const float min[3], const float max[3],
+	                   const int res[3], const float viewnormal[3])
+{
+	GPUTexture *tex_spec;
+	GPUProgram *smoke_program;
+	const int progtype = (sds->active_fields & SM_ACTIVE_COLORS) ? GPU_PROGRAM_SMOKE_COLORED
+	                                                             : GPU_PROGRAM_SMOKE;
+
+	const float ob_sizei[3] = {
+	    1.0f / fabsf(ob->size[0]),
+	    1.0f / fabsf(ob->size[1]),
+	    1.0f / fabsf(ob->size[2])
+	};
+
+	int i, j, n, good_index;
+	float d /*, d0 */ /* UNUSED */, dd, ds;
+	float (*points)[3] = NULL;
+	int numpoints = 0;
+	float cor[3] = {1.0f, 1.0f, 1.0f};
+	int gl_depth = 0, gl_blend = 0;
+
+	const bool use_fire = (sds->active_fields & SM_ACTIVE_FIRE) != 0;
+
+	/* draw slices of smoke is adapted from c++ code authored
+	 * by: Johannes Schmid and Ingemar Rask, 2006, johnny at grob.org */
+	const float verts[8][3] = {
+		{ max[0], max[1], max[2] },
+	    { min[0], max[1], max[2] },
+	    { min[0], min[1], max[2] },
+	    { max[0], min[1], max[2] },
+		{ max[0], max[1], min[2] },
+	    { min[0], max[1], min[2] },
+	    { min[0], min[1], min[2] },
+	    { max[0], min[1], min[2] }
+	};
+
+	const float size[3] = { max[0] - min[0], max[1] - min[1], max[2] - min[2] };
+
+	/* edges have the form edges[n][0][xyz] + t*edges[n][1][xyz] */
+	const float edges[12][2][3] = {
+	    {{verts[4][0], verts[4][1], verts[4][2]}, {0.0f, 0.0f, size[2]}},
+		{{verts[5][0], verts[5][1], verts[5][2]}, {0.0f, 0.0f, size[2]}},
+		{{verts[6][0], verts[6][1], verts[6][2]}, {0.0f, 0.0f, size[2]}},
+		{{verts[7][0], verts[7][1], verts[7][2]}, {0.0f, 0.0f, size[2]}},
+
+		{{verts[3][0], verts[3][1], verts[3][2]}, {0.0f, size[1], 0.0f}},
+		{{verts[2][0], verts[2][1], verts[2][2]}, {0.0f, size[1], 0.0f}},
+		{{verts[6][0], verts[6][1], verts[6][2]}, {0.0f, size[1], 0.0f}},
+		{{verts[7][0], verts[7][1], verts[7][2]}, {0.0f, size[1], 0.0f}},
+
+		{{verts[1][0], verts[1][1], verts[1][2]}, {size[0], 0.0f, 0.0f}},
+		{{verts[2][0], verts[2][1], verts[2][2]}, {size[0], 0.0f, 0.0f}},
+		{{verts[6][0], verts[6][1], verts[6][2]}, {size[0], 0.0f, 0.0f}},
+		{{verts[5][0], verts[5][1], verts[5][2]}, {size[0], 0.0f, 0.0f}}
+	};
 
-	edges[0][1][2] = size[2];
-	edges[1][1][2] = size[2];
-	edges[2][1][2] = size[2];
-	edges[3][1][2] = size[2];
+	if (!sds->tex) {
+		printf("Could not allocate 3D texture for 3D View smoke drawing.\n");
+		return;
+	}
 
-	edges[4][1][1] = size[1];
-	edges[5][1][1] = size[1];
-	edges[6][1][1] = size[1];
-	edges[7][1][1] = size[1];
+#ifdef DEBUG_DRAW_TIME
+	TIMEIT_START(draw);
+#endif
 
-	edges[8][1][0] = size[0];
-	edges[9][1][0] = size[0];
-	edges[10][1][0] = size[0]

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list