[Bf-blender-cvs] [9affa84] master: Expose smoke simulation velocities in Python API

Johannes Meng noreply at git.blender.org
Fri Jun 19 13:57:17 CEST 2015


Commit: 9affa8450a3eadc40d4def539c29986320e73298
Author: Johannes Meng
Date:   Fri Jun 19 13:45:26 2015 +0200
Branches: master
https://developer.blender.org/rB9affa8450a3eadc40d4def539c29986320e73298

Expose smoke simulation velocities in Python API

This patch exposes smoke simulation velocities in the Python API,
similar to how density and flame grids are exposed.

This is useful to export velocities to an external renderer using Python.

Reviewers: campbellbarton, sergey

Reviewed By: sergey

Subscribers: sergey

Projects: #bf_blender

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

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

M	source/blender/makesrna/intern/rna_smoke.c

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

diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index 55262a9..03fca13 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -165,6 +165,31 @@ static int rna_SmokeModifier_color_grid_get_length(PointerRNA *ptr, int length[R
 	return length[0];
 }
 
+static int rna_SmokeModifier_velocity_grid_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+{
+#ifdef WITH_SMOKE
+	SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
+	float *vx = NULL;
+	float *vy = NULL;
+	float *vz = NULL;
+	int size = 0;
+
+	/* Velocity data is always low-resolution. */
+	if (sds->fluid) {
+		size = 3 * sds->res[0] * sds->res[1] * sds->res[2];
+		vx = smoke_get_velocity_x(sds->fluid);
+		vy = smoke_get_velocity_y(sds->fluid);
+		vz = smoke_get_velocity_z(sds->fluid);
+	}
+
+	length[0] = (vx && vy && vz) ? size : 0;
+#else
+	(void)ptr;
+	length[0] = 0;
+#endif
+	return length[0];
+}
+
 static void rna_SmokeModifier_density_grid_get(PointerRNA *ptr, float *values)
 {
 #ifdef WITH_SMOKE
@@ -189,6 +214,33 @@ static void rna_SmokeModifier_density_grid_get(PointerRNA *ptr, float *values)
 #endif
 }
 
+static void rna_SmokeModifier_velocity_grid_get(PointerRNA *ptr, float *values)
+{
+#ifdef WITH_SMOKE
+	SmokeDomainSettings *sds = (SmokeDomainSettings *)ptr->data;
+	int length[RNA_MAX_ARRAY_DIMENSION];
+	int size = rna_SmokeModifier_velocity_grid_get_length(ptr, length);
+	float *vx, *vy, *vz;
+	int i;
+
+	BLI_rw_mutex_lock(sds->fluid_mutex, THREAD_LOCK_READ);
+
+	vx = smoke_get_velocity_x(sds->fluid);
+	vy = smoke_get_velocity_y(sds->fluid);
+	vz = smoke_get_velocity_z(sds->fluid);
+
+	for (i=0; i<size; i+=3) {
+		*(values++) = *(vx++);
+		*(values++) = *(vy++);
+		*(values++) = *(vz++);
+	}
+
+	BLI_rw_mutex_unlock(sds->fluid_mutex);
+#else
+	(void)ptr;
+#endif
+}
+
 static void rna_SmokeModifier_color_grid_get(PointerRNA *ptr, float *values)
 {
 #ifdef WITH_SMOKE
@@ -453,6 +505,14 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
 	RNA_def_property_float_funcs(prop, "rna_SmokeModifier_density_grid_get", NULL, NULL);
 	RNA_def_property_ui_text(prop, "Density Grid", "Smoke density grid");
 
+	prop = RNA_def_property(srna, "velocity_grid", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_array(prop, 32);
+	RNA_def_property_flag(prop, PROP_DYNAMIC);
+	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_dynamic_array_funcs(prop, "rna_SmokeModifier_velocity_grid_get_length");
+	RNA_def_property_float_funcs(prop, "rna_SmokeModifier_velocity_grid_get", NULL, NULL);
+	RNA_def_property_ui_text(prop, "Velocity Grid", "Smoke velocity grid");
+
 	prop = RNA_def_property(srna, "flame_grid", PROP_FLOAT, PROP_NONE);
 	RNA_def_property_array(prop, 32);
 	RNA_def_property_flag(prop, PROP_DYNAMIC);




More information about the Bf-blender-cvs mailing list