[Bf-blender-cvs] [bb0e137] object_nodes: Merge branch 'master' into object_nodes

Lukas Tönne noreply at git.blender.org
Thu Dec 31 12:36:08 CET 2015


Commit: bb0e1375b131b86f0f31b2a537a21ec765ee07f0
Author: Lukas Tönne
Date:   Thu Dec 31 12:04:51 2015 +0100
Branches: object_nodes
https://developer.blender.org/rBbb0e1375b131b86f0f31b2a537a21ec765ee07f0

Merge branch 'master' into object_nodes

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



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

diff --cc source/blender/blenkernel/intern/smoke.c
index a347eba,29ae04b..4ea5fbb
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@@ -2405,75 -2499,100 +2499,100 @@@ static void update_flowsfluids(Scene *s
  		MEM_freeN(emaps);
  }
  
+ typedef struct UpdateEffectorsData {
+ 	Scene *scene;
+ 	SmokeDomainSettings *sds;
+ 	ListBase *effectors;
+ 
+ 	float *density;
+ 	float *fuel;
+ 	float *force_x;
+ 	float *force_y;
+ 	float *force_z;
+ 	float *velocity_x;
+ 	float *velocity_y;
+ 	float *velocity_z;
+ 	unsigned char *obstacle;
+ } UpdateEffectorsData;
+ 
+ static void update_effectors_task_cb(void *userdata, void *UNUSED(userdata_chunk), int x)
+ {
+ 	UpdateEffectorsData *data = userdata;
+ 	SmokeDomainSettings *sds = data->sds;
+ 
+ 	for (int y = 0; y < sds->res[1]; y++) {
+ 		for (int z = 0; z < sds->res[2]; z++)
+ 		{
+ 			EffectedPoint epoint;
+ 			float mag;
+ 			float voxelCenter[3] = {0, 0, 0}, vel[3] = {0, 0, 0}, retvel[3] = {0, 0, 0};
+ 			const unsigned int index = smoke_get_index(x, sds->res[0], y, sds->res[1], z);
+ 
+ 			if (((data->fuel ? MAX2(data->density[index], data->fuel[index]) : data->density[index]) < FLT_EPSILON) ||
+ 			    data->obstacle[index])
+ 			{
+ 				continue;
+ 			}
+ 
+ 			vel[0] = data->velocity_x[index];
+ 			vel[1] = data->velocity_y[index];
+ 			vel[2] = data->velocity_z[index];
+ 
+ 			/* convert vel to global space */
+ 			mag = len_v3(vel);
+ 			mul_mat3_m4_v3(sds->obmat, vel);
+ 			normalize_v3(vel);
+ 			mul_v3_fl(vel, mag);
+ 
+ 			voxelCenter[0] = sds->p0[0] + sds->cell_size[0] * ((float)(x + sds->res_min[0]) + 0.5f);
+ 			voxelCenter[1] = sds->p0[1] + sds->cell_size[1] * ((float)(y + sds->res_min[1]) + 0.5f);
+ 			voxelCenter[2] = sds->p0[2] + sds->cell_size[2] * ((float)(z + sds->res_min[2]) + 0.5f);
+ 			mul_m4_v3(sds->obmat, voxelCenter);
+ 
+ 			pd_point_from_loc(data->scene, voxelCenter, vel, index, &epoint);
+ 			pdDoEffectors(data->effectors, NULL, sds->effector_weights, &epoint, retvel, NULL);
+ 
+ 			/* convert retvel to local space */
+ 			mag = len_v3(retvel);
+ 			mul_mat3_m4_v3(sds->imat, retvel);
+ 			normalize_v3(retvel);
+ 			mul_v3_fl(retvel, mag);
+ 
+ 			// TODO dg - do in force!
+ 			data->force_x[index] = min_ff(max_ff(-1.0f, retvel[0] * 0.2f), 1.0f);
+ 			data->force_y[index] = min_ff(max_ff(-1.0f, retvel[1] * 0.2f), 1.0f);
+ 			data->force_z[index] = min_ff(max_ff(-1.0f, retvel[2] * 0.2f), 1.0f);
+ 		}
+ 	}
+ }
+ 
  static void update_effectors(Scene *scene, Object *ob, SmokeDomainSettings *sds, float UNUSED(dt))
  {
 -	ListBase *effectors;
 +	EffectorContext *effectors;
  	/* make sure smoke flow influence is 0.0f */
  	sds->effector_weights->weight[PFIELD_SMOKEFLOW] = 0.0f;
  	effectors = pdInitEffectors(scene, ob, NULL, sds->effector_weights, true);
  
- 	if (effectors)
- 	{
- 		float *density = smoke_get_density(sds->fluid);
- 		float *fuel = smoke_get_fuel(sds->fluid);
- 		float *force_x = smoke_get_force_x(sds->fluid);
- 		float *force_y = smoke_get_force_y(sds->fluid);
- 		float *force_z = smoke_get_force_z(sds->fluid);
- 		float *velocity_x = smoke_get_velocity_x(sds->fluid);
- 		float *velocity_y = smoke_get_velocity_y(sds->fluid);
- 		float *velocity_z = smoke_get_velocity_z(sds->fluid);
- 		unsigned char *obstacle = smoke_get_obstacle(sds->fluid);
- 		int x;
- 
+ 	if (effectors) {
  		// precalculate wind forces
- #pragma omp parallel for schedule(static)
- 		for (x = 0; x < sds->res[0]; x++)
- 		{
- 			int y, z;
- 			for (y = 0; y < sds->res[1]; y++)
- 				for (z = 0; z < sds->res[2]; z++)
- 				{
- 					EffectedPoint epoint;
- 					float mag;
- 					float voxelCenter[3] = {0, 0, 0}, vel[3] = {0, 0, 0}, retvel[3] = {0, 0, 0};
- 					unsigned int index = smoke_get_index(x, sds->res[0], y, sds->res[1], z);
- 
- 					if (((fuel ? MAX2(density[index], fuel[index]) : density[index]) < FLT_EPSILON) || obstacle[index])
- 						continue;
- 
- 					vel[0] = velocity_x[index];
- 					vel[1] = velocity_y[index];
- 					vel[2] = velocity_z[index];
- 
- 					/* convert vel to global space */
- 					mag = len_v3(vel);
- 					mul_mat3_m4_v3(sds->obmat, vel);
- 					normalize_v3(vel);
- 					mul_v3_fl(vel, mag);
- 
- 					voxelCenter[0] = sds->p0[0] + sds->cell_size[0] * ((float)(x + sds->res_min[0]) + 0.5f);
- 					voxelCenter[1] = sds->p0[1] + sds->cell_size[1] * ((float)(y + sds->res_min[1]) + 0.5f);
- 					voxelCenter[2] = sds->p0[2] + sds->cell_size[2] * ((float)(z + sds->res_min[2]) + 0.5f);
- 					mul_m4_v3(sds->obmat, voxelCenter);
- 
- 					pd_point_from_loc(scene, voxelCenter, vel, index, &epoint);
- 					pdDoEffectors(effectors, NULL, sds->effector_weights, &epoint, retvel, NULL);
- 
- 					/* convert retvel to local space */
- 					mag = len_v3(retvel);
- 					mul_mat3_m4_v3(sds->imat, retvel);
- 					normalize_v3(retvel);
- 					mul_v3_fl(retvel, mag);
- 
- 					// TODO dg - do in force!
- 					force_x[index] = min_ff(max_ff(-1.0f, retvel[0] * 0.2f), 1.0f);
- 					force_y[index] = min_ff(max_ff(-1.0f, retvel[1] * 0.2f), 1.0f);
- 					force_z[index] = min_ff(max_ff(-1.0f, retvel[2] * 0.2f), 1.0f);
- 				}
- 		}
+ 		UpdateEffectorsData data;
+ 		data.scene = scene;
+ 		data.sds = sds;
+ 		data.effectors = effectors;
+ 		data.density = smoke_get_density(sds->fluid);
+ 		data.fuel = smoke_get_fuel(sds->fluid);
+ 		data.force_x = smoke_get_force_x(sds->fluid);
+ 		data.force_y = smoke_get_force_y(sds->fluid);
+ 		data.force_z = smoke_get_force_z(sds->fluid);
+ 		data.velocity_x = smoke_get_velocity_x(sds->fluid);
+ 		data.velocity_y = smoke_get_velocity_y(sds->fluid);
+ 		data.velocity_z = smoke_get_velocity_z(sds->fluid);
+ 		data.obstacle = smoke_get_obstacle(sds->fluid);
+ 
+ 		BLI_task_parallel_range_ex(0, sds->res[0], &data, NULL, 0, update_effectors_task_cb, true, false);
  	}
  
 -	pdEndEffectors(&effectors);
 +	pdEndEffectors(effectors);
  }
  
  static void step(Scene *scene, Object *ob, SmokeModifierData *smd, DerivedMesh *domain_dm, float fps, bool for_render)




More information about the Bf-blender-cvs mailing list