[Bf-blender-cvs] [d915e6dc8d9] blender2.8: Merge branch 'master' into blender2.8

Campbell Barton noreply at git.blender.org
Tue Sep 25 03:37:25 CEST 2018


Commit: d915e6dc8d9f99756e0b066bda075a8fe8d00dae
Author: Campbell Barton
Date:   Tue Sep 25 11:42:44 2018 +1000
Branches: blender2.8
https://developer.blender.org/rBd915e6dc8d9f99756e0b066bda075a8fe8d00dae

Merge branch 'master' into blender2.8

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



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

diff --cc source/blender/blenkernel/intern/effect.c
index e6e138f8a43,82bf65993a8..3c7065780ec
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@@ -57,9 -56,7 +57,9 @@@
  
  #include "PIL_time.h"
  
- #include "BKE_anim.h"		/* needed for where_on_path */
+ #include "BKE_anim.h"       /* needed for where_on_path */
 +#include "BKE_bvhutils.h"
 +#include "BKE_collection.h"
  #include "BKE_collision.h"
  #include "BKE_curve.h"
  #include "BKE_displist.h"
@@@ -136,124 -132,116 +137,126 @@@ PartDeflect *object_add_collision_field
  	return pd;
  }
  
 -/* ***************** PARTICLES ***************** */
 +/************************ PARTICLES ***************************/
  
 -/* -------------------------- Effectors ------------------ */
  void free_partdeflect(PartDeflect *pd)
  {
- 	if (!pd)
+ 	if (!pd) {
  		return;
- 
- 	if (pd->rng)
+ 	}
+ 	if (pd->rng) {
  		BLI_rng_free(pd->rng);
- 
+ 	}
  	MEM_freeN(pd);
  }
  
 -static EffectorCache *new_effector_cache(Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd)
 -{
 -	EffectorCache *eff = MEM_callocN(sizeof(EffectorCache), "EffectorCache");
 -	eff->scene = scene;
 -	eff->ob = ob;
 -	eff->psys = psys;
 -	eff->pd = pd;
 -	eff->frame = -1;
 -	return eff;
 -}
 -static void add_object_to_effectors(ListBase **effectors, Scene *scene, EffectorWeights *weights, Object *ob, Object *ob_src, bool for_simulation)
 -{
 -	EffectorCache *eff = NULL;
 +/******************** EFFECTOR RELATIONS ***********************/
  
 -	if (ob == ob_src) {
 -		return;
 +static void precalculate_effector(struct Depsgraph *depsgraph, EffectorCache *eff)
 +{
 +	float ctime = DEG_get_ctime(depsgraph);
- 	unsigned int cfra = (unsigned int)(ctime >= 0 ? ctime : -ctime);
- 	if (!eff->pd->rng)
++	uint cfra = (uint)(ctime >= 0 ? ctime : -ctime);
++	if (!eff->pd->rng) {
 +		eff->pd->rng = BLI_rng_new(eff->pd->seed + cfra);
- 	else
++	}
++	else {
 +		BLI_rng_srandom(eff->pd->rng, eff->pd->seed + cfra);
+ 	}
  
- 	if (eff->pd->forcefield == PFIELD_GUIDE && eff->ob->type==OB_CURVE) {
- 		Curve *cu= eff->ob->data;
 -	if (for_simulation) {
 -		if (weights->weight[ob->pd->forcefield] == 0.0f) {
 -			return;
 -		}
++	if (eff->pd->forcefield == PFIELD_GUIDE && eff->ob->type == OB_CURVE) {
++		Curve *cu = eff->ob->data;
 +		if (cu->flag & CU_PATH) {
- 			if (eff->ob->runtime.curve_cache == NULL || eff->ob->runtime.curve_cache->path==NULL || eff->ob->runtime.curve_cache->path->data==NULL)
++			if (eff->ob->runtime.curve_cache == NULL || eff->ob->runtime.curve_cache->path == NULL || eff->ob->runtime.curve_cache->path->data == NULL)
 +				BKE_displist_make_curveTypes(depsgraph, eff->scene, eff->ob, 0);
  
 -		if (ob->pd->shape == PFIELD_SHAPE_POINTS && !ob->derivedFinal) {
 -			return;
 +			if (eff->ob->runtime.curve_cache->path && eff->ob->runtime.curve_cache->path->data) {
 +				where_on_path(eff->ob, 0.0, eff->guide_loc, eff->guide_dir, NULL, &eff->guide_radius, NULL);
 +				mul_m4_v3(eff->ob->obmat, eff->guide_loc);
 +				mul_mat3_m4_v3(eff->ob->obmat, eff->guide_dir);
 +			}
  		}
  	}
 +	else if (eff->pd->shape == PFIELD_SHAPE_SURFACE) {
- 		eff->surmd = (SurfaceModifierData *)modifiers_findByType( eff->ob, eModifierType_Surface );
++		eff->surmd = (SurfaceModifierData *)modifiers_findByType(eff->ob, eModifierType_Surface);
 +		if (eff->ob->type == OB_CURVE)
 +			eff->flag |= PE_USE_NORMAL_DATA;
 +	}
 +	else if (eff->psys)
 +		psys_update_particle_tree(eff->psys, ctime);
  
 -	if (*effectors == NULL)
 -		*effectors = MEM_callocN(sizeof(ListBase), "effectors list");
 +	/* Store object velocity */
 +	if (eff->ob) {
 +		float old_vel[3];
  
 -	eff = new_effector_cache(scene, ob, NULL, ob->pd);
 +		BKE_object_where_is_calc_time(depsgraph, eff->scene, eff->ob, cfra - 1.0f);
 +		copy_v3_v3(old_vel, eff->ob->obmat[3]);
 +		BKE_object_where_is_calc_time(depsgraph, eff->scene, eff->ob, cfra);
 +		sub_v3_v3v3(eff->velocity, eff->ob->obmat[3], old_vel);
 +	}
 +}
  
 -	/* make sure imat is up to date */
 -	invert_m4_m4(ob->imat, ob->obmat);
 +static void add_effector_relation(ListBase *relations, Object *ob, ParticleSystem *psys, PartDeflect *pd)
 +{
 +	EffectorRelation *relation = MEM_callocN(sizeof(EffectorRelation), "EffectorRelation");
 +	relation->ob = ob;
 +	relation->psys = psys;
 +	relation->pd = pd;
  
 -	BLI_addtail(*effectors, eff);
 +	BLI_addtail(relations, relation);
  }
 -static void add_particles_to_effectors(ListBase **effectors, Scene *scene, EffectorWeights *weights, Object *ob, ParticleSystem *psys, ParticleSystem *psys_src, bool for_simulation)
 -{
 -	ParticleSettings *part = psys->part;
  
 -	if (!psys_check_enabled(ob, psys, G.is_rendering)) {
 -		return;
 -	}
 -	if (psys == psys_src && (part->flag & PART_SELF_EFFECT) == 0) {
 -		return;
 -	}
 -	if (part->pd && part->pd->forcefield && (!for_simulation || weights->weight[part->pd->forcefield] != 0.0f)) {
 -		if (*effectors == NULL) {
 -			*effectors = MEM_callocN(sizeof(ListBase), "effectors list");
 -		}
 -		BLI_addtail(*effectors, new_effector_cache(scene, ob, psys, part->pd));
 +static void add_effector_evaluation(ListBase **effectors, Depsgraph *depsgraph, Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd)
 +{
 +	if (*effectors == NULL) {
 +		*effectors = MEM_callocN(sizeof(ListBase), "effector effectors");
  	}
  
 -	if (part->pd2 && part->pd2->forcefield && (!for_simulation || weights->weight[part->pd2->forcefield] != 0.0f)) {
 -		if (*effectors == NULL) {
 -			*effectors = MEM_callocN(sizeof(ListBase), "effectors list");
 -		}
 -		BLI_addtail(*effectors, new_effector_cache(scene, ob, psys, part->pd2));
 -	}
 +	EffectorCache *eff = MEM_callocN(sizeof(EffectorCache), "EffectorCache");
 +	eff->depsgraph = depsgraph;
 +	eff->scene = scene;
 +	eff->ob = ob;
 +	eff->psys = psys;
 +	eff->pd = pd;
 +	eff->frame = -1;
 +	BLI_addtail(*effectors, eff);
 +
 +	precalculate_effector(depsgraph, eff);
  }
  
 -/* returns ListBase handle with objects taking part in the effecting */
 -ListBase *pdInitEffectors(
 -        Scene *scene, Object *ob_src, ParticleSystem *psys_src,
 -        EffectorWeights *weights, bool for_simulation)
 +/* Create list of effector relations in the collection or entire scene.
 + * This is used by the depsgraph to build relations, as well as faster
 + * lookup of effectors during evaluation. */
 +ListBase *BKE_effector_relations_create(
-         Depsgraph *depsgraph,
-         ViewLayer *view_layer,
-         Collection *collection)
++	Depsgraph *depsgraph,
++	ViewLayer *view_layer,
++	Collection *collection)
  {
 -	const uint layer = ob_src->lay;
 -	ListBase *effectors = NULL;
 +	Base *base = BKE_collection_or_layer_objects(view_layer, collection);
 +	const bool for_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
 +	const int base_flag = (for_render) ? BASE_ENABLED_RENDER : BASE_ENABLED_VIEWPORT;
  
 -	if (weights->group) {
 -		for (GroupObject *go = weights->group->gobject.first; go; go = go->next) {
 -			if ((go->ob->lay & layer)) {
 -				if (go->ob->pd && go->ob->pd->forcefield) {
 -					add_object_to_effectors(&effectors, scene, weights, go->ob, ob_src, for_simulation);
 -				}
 +	ListBase *relations = MEM_callocN(sizeof(ListBase), "effector relations");
  
 -				if (go->ob->particlesystem.first) {
 -					for (ParticleSystem *psys = go->ob->particlesystem.first; psys; psys = psys->next) {
 -						add_particles_to_effectors(&effectors, scene, weights, go->ob, psys, psys_src, for_simulation);
 -					}
 -				}
 -			}
 +	for (; base; base = base->next) {
 +		if (!(base->flag & base_flag)) {
 +			continue;
  		}
 -	}
 -	else {
 -		for (Base *base = scene->base.first; base; base = base->next) {
 -			if ((base->lay & layer)) {
 -				if (base->object->pd && base->object->pd->forcefield) {
 -					add_object_to_effectors(&effectors, scene, weights, base->object, ob_src, for_simulation);
 +
 +		Object *ob = base->object;
 +
 +		if (ob->pd && ob->pd->forcefield) {
 +			add_effector_relation(relations, ob, NULL, ob->pd);
 +		}
 +
 +		for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) {
 +			ParticleSettings *part = psys->part;
 +
 +			if (psys_check_enabled(ob, psys, for_render)) {
 +				if (part->pd && part->pd->forcefield) {
 +					add_effector_relation(relations, ob, psys, part->pd);
  				}
 -				if (base->object->particlesystem.first) {
 -					for (ParticleSystem *psys = base->object->particlesystem.first; psys; psys = psys->next) {
 -						add_particles_to_effectors(&effectors, scene, weights, base->object, psys, psys_src, for_simulation);
 -					}
 +				if (part->pd2 && part->pd2->forcefield) {
 +					add_effector_relation(relations, ob, psys, part->pd2);
  				}
  			}
  		}
@@@ -270,72 -269,60 +273,72 @@@ void BKE_effector_relations_free(ListBa
  	}
  }
  
 -static void precalculate_effector(EffectorCache *eff)
 +/* Create effective list of effectors from relations built beforehand. */
 +ListBase *BKE_effectors_create(
-         Depsgraph *depsgraph,
-         Object *ob_src,
-         ParticleSystem *psys_src,
-         EffectorWeights *weights)
++	Depsgraph *depsgraph,
++	Object *ob_src,
++	ParticleSystem *psys_src,
++	EffectorWeights *weights)
  {
 -	uint cfra = (uint)(eff->scene->r.cfra >= 0 ? eff->scene->r.cfra : -eff->scene->r.cfra);
 -	if (!eff->pd->rng) {
 -		eff->pd->rng = BLI_rng_new(eff->pd->seed + cfra);
 -	}
 -	else {
 -		BLI_rng_srandom(eff->pd->rng, eff->pd->seed + cfra);
 +	Scene *scene = DEG_get_evaluated_scene(depsgraph);
 +	ListBase *relations = DEG_get_effector_relations(depsgraph, weights->group);
 +	ListBase *effectors = NULL;
 +
 +	if (!relations) {
 +		return NULL;
  	}
  
 -	if (eff->pd->forcefield == PFIELD_GUIDE && eff->ob->type == OB_CURVE) {
 -		Curve *cu = eff->ob->data;
 -		if (cu->flag & CU_PATH) {
 -			if ((eff->ob->curve_cache == NULL) ||
 -			    (eff->ob->curve_cache->path == NULL) ||
 -			    (eff->ob->curve_cache->path->data == NULL))
 -			{
 -				BKE_displist_make_curveTypes(eff->scene, eff->ob, 0);
 +	for (EffectorRelation *relation = relations->first; relation; relation = relation->next) {
 +		/* Get evaluated object. */
- 		Object *ob = (Object*)DEG_get_evaluated_id(depsgraph, &relation->ob->id);
++		Object *ob = (Objec

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list