[Bf-blender-cvs] [e5a4756] gooseberry: Merge branch 'master' into gooseberry

Antony Riakiotakis noreply at git.blender.org
Tue Apr 7 14:19:40 CEST 2015


Commit: e5a47562eb55b6434b8a141f896c1ee0f89d4b25
Author: Antony Riakiotakis
Date:   Tue Apr 7 14:19:16 2015 +0200
Branches: gooseberry
https://developer.blender.org/rBe5a47562eb55b6434b8a141f896c1ee0f89d4b25

Merge branch 'master' into gooseberry

Conflicts:
	source/blender/blenkernel/intern/image.c
	source/blender/blenkernel/intern/object_dupli.c
	source/blender/blenkernel/intern/sequencer.c
	source/blender/blenloader/intern/versioning_270.c
	source/blender/editors/space_view3d/view3d_draw.c
	source/blender/editors/space_view3d/view3d_ops.c
	source/blender/makesdna/DNA_sequence_types.h
	source/blender/makesdna/DNA_view3d_types.h
	source/blender/windowmanager/CMakeLists.txt
	source/blender/windowmanager/intern/wm_operators.c
	source/blenderplayer/bad_level_call_stubs/stubs.c

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



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

diff --cc source/blender/blenkernel/BKE_sequencer.h
index 494caa2,4a45489..0e3fb5c
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@@ -223,8 -225,8 +225,9 @@@ void BKE_sequencer_base_clipboard_point
  void BKE_sequencer_base_clipboard_pointers_restore(struct ListBase *seqbase, struct Main *bmain);
  
  void BKE_sequence_free(struct Scene *scene, struct Sequence *seq);
+ void BKE_sequence_free_anim(struct Sequence *seq);
  const char *BKE_sequence_give_name(struct Sequence *seq);
 +ListBase *BKE_sequence_seqbase_get(struct Sequence *seq, int *r_offset);
  void BKE_sequence_calc(struct Scene *scene, struct Sequence *seq);
  void BKE_sequence_calc_disp(struct Scene *scene, struct Sequence *seq);
  void BKE_sequence_reload_new_file(struct Scene *scene, struct Sequence *seq, const bool lock_range);
diff --cc source/blender/blenkernel/CMakeLists.txt
index 636a4cd,67c8f0f..fb87aa8
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@@ -217,8 -211,9 +217,10 @@@ set(SR
  	BKE_depsgraph.h
  	BKE_displist.h
  	BKE_dynamicpaint.h
+ 	BKE_editmesh.h
+ 	BKE_editmesh_bvh.h
  	BKE_effect.h
 +	BKE_facemap.h
  	BKE_fcurve.h
  	BKE_fluidsim.h
  	BKE_font.h
@@@ -271,11 -267,8 +274,9 @@@
  	BKE_softbody.h
  	BKE_sound.h
  	BKE_speaker.h
 +	BKE_strands.h
  	BKE_subsurf.h
  	BKE_suggestions.h
- 	BKE_editmesh.h
- 	BKE_editmesh_bvh.h
  	BKE_text.h
  	BKE_texture.h
  	BKE_tracking.h
diff --cc source/blender/blenkernel/intern/object_dupli.c
index 9dccda9,8abe4bd..7ec0a8d
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@@ -1324,405 -1237,7 +1324,405 @@@ int count_duplilist(Object *ob
  	return 1;
  }
  
 +/* ------------------------------------------------------------------------- */
 +
 +static void dupli_cache_calc_boundbox(DupliObjectData *data)
 +{
 +	float min[3], max[3];
 +	
 +	if (data->dm) {
 +		INIT_MINMAX(min, max);
 +		data->dm->getMinMax(data->dm, min, max);
 +	}
 +	else {
 +		zero_v3(min);
 +		zero_v3(max);
 +	}
 +	
 +	BKE_boundbox_init_from_minmax(&data->bb, min, max);
 +}
 +
 +static bool UNUSED_FUNCTION(dupli_object_data_strands_unique_name)(ListBase *lb, DupliObjectDataStrands *link)
 +{
 +	if (lb && link) {
 +		return BLI_uniquename(lb, link, DATA_("Strands"), '.', offsetof(DupliObjectDataStrands, name), sizeof(link->name));
 +	}
 +	return false;
 +}
 +
 +void BKE_dupli_object_data_init(DupliObjectData *data, Object *ob)
 +{
 +	data->ob = ob;
 +	
 +	data->dm = NULL;
 +	BLI_listbase_clear(&data->strands);
 +	
 +	memset(&data->bb, 0, sizeof(data->bb));
 +	dupli_cache_calc_boundbox(data);
 +}
 +
 +void BKE_dupli_object_data_clear(DupliObjectData *data)
 +{
 +	DupliObjectDataStrands *link;
 +	
 +	if (data->dm) {
 +		/* we lock DMs in the cache to prevent freeing outside,
 +		 * now allow releasing again
 +		 */
 +		data->dm->needsFree = true;
 +		data->dm->release(data->dm);
 +	}
 +	
 +	for (link = data->strands.first; link; link = link->next) {
 +		if (link->strands)
 +			BKE_strands_free(link->strands);
 +	}
 +	BLI_freelistN(&data->strands);
 +}
 +
 +void BKE_dupli_object_data_set_mesh(DupliObjectData *data, DerivedMesh *dm)
 +{
 +	if (data->dm) {
 +		/* we lock DMs in the cache to prevent freeing outside,
 +		 * now allow releasing again
 +		 */
 +		data->dm->needsFree = true;
 +		data->dm->release(data->dm);
 +	}
 +	
 +	data->dm = dm;
 +	/* we own this dm now and need to protect it until we free it ourselves */
 +	dm->needsFree = false;
 +	
 +	dupli_cache_calc_boundbox(data);
 +}
 +
 +void BKE_dupli_object_data_add_strands(DupliObjectData *data, const char *name, Strands *strands)
 +{
 +	DupliObjectDataStrands *link = NULL;
 +	for (link = data->strands.first; link; link = link->next) {
 +		if (STREQ(link->name, name))
 +			break;
 +	}
 +	
 +	if (!link) {
 +		link = MEM_callocN(sizeof(DupliObjectDataStrands), "strands link");
 +		BLI_strncpy(link->name, name, sizeof(link->name));
 +		link->strands = strands;
 +		
 +		BLI_addtail(&data->strands, link);
 +	}
 +	else {
 +		if (link->strands && link->strands != strands)
 +			BKE_strands_free(link->strands);
 +		link->strands = strands;
 +	}
 +	
 +	dupli_cache_calc_boundbox(data);
 +}
 +
 +Strands *BKE_dupli_object_data_find_strands(DupliObjectData *data, const char *name)
 +{
 +	DupliObjectDataStrands *link;
 +	for (link = data->strands.first; link; link = link->next) {
 +		if (STREQ(link->name, name))
 +			return link->strands;
 +	}
 +	return NULL;
 +}
 +
 +/* ------------------------------------------------------------------------- */
 +
 +static void dupli_object_data_free(DupliObjectData *data)
 +{
 +	BKE_dupli_object_data_clear(data);
 +	MEM_freeN(data);
 +}
 +
 +static void dupli_object_free(DupliObject *dob)
 +{
 +	MEM_freeN(dob);
 +}
 +
 +DupliCache *BKE_dupli_cache_new(void)
 +{
 +	DupliCache *dupcache = MEM_callocN(sizeof(DupliCache), "dupli object cache");
 +	
 +	dupcache->ghash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "dupli object data hash");
 +	
 +	return dupcache;
 +}
 +
 +void BKE_dupli_cache_free(DupliCache *dupcache)
 +{
 +	BKE_dupli_cache_clear(dupcache);
 +	
 +	BLI_ghash_free(dupcache->ghash, NULL, (GHashValFreeFP)dupli_object_data_free);
 +	MEM_freeN(dupcache);
 +}
 +
 +void BKE_dupli_cache_clear(DupliCache *dupcache)
 +{
 +	DupliObject *dob, *dob_next;
 +	for (dob = dupcache->duplilist.first; dob; dob = dob_next) {
 +		dob_next = dob->next;
 +		
 +		dupli_object_free(dob);
 +	}
 +	BLI_listbase_clear(&dupcache->duplilist);
 +	
 +	BLI_ghash_clear(dupcache->ghash, NULL, (GHashValFreeFP)dupli_object_data_free);
 +}
 +
 +void BKE_dupli_cache_clear_instances(DupliCache *dupcache)
 +{
 +	DupliObject *dob, *dob_next;
 +	for (dob = dupcache->duplilist.first; dob; dob = dob_next) {
 +		dob_next = dob->next;
 +		
 +		dupli_object_free(dob);
 +	}
 +	BLI_listbase_clear(&dupcache->duplilist);
 +}
 +
 +static DupliObjectData *dupli_cache_add_object_data(DupliCache *dupcache, Object *ob)
 +{
 +	DupliObjectData *data = MEM_callocN(sizeof(DupliObjectData), "dupli object data");
 +	
 +	data->ob = ob;
 +	BLI_ghash_insert(dupcache->ghash, data->ob, data);
 +	return data;
 +}
 +
 +static DupliObject *dupli_cache_add_object(DupliCache *dupcache)
 +{
 +	DupliObject *dob = MEM_callocN(sizeof(DupliObject), "dupli object");
 +	
 +	unit_m4(dob->mat);
 +	
 +	BLI_addtail(&dupcache->duplilist, dob);
 +	return dob;
 +}
 +
 +static int count_hair_verts(ParticleSystem *psys)
 +{
 +	int numverts = 0;
 +	int p;
 +	for (p = 0; p < psys->totpart; ++p) {
 +		numverts += psys->particles[p].totkey;
 +	}
 +	return numverts;
 +}
 +
 +void BKE_dupli_cache_from_group(Scene *scene, Group *group, CacheLibrary *cachelib, DupliCache *dupcache, EvaluationContext *eval_ctx)
 +{
 +	DupliObject *dob;
 +	
 +	BKE_dupli_cache_clear(dupcache);
 +	
 +	if (!(group && cachelib))
 +		return;
 +	
 +	{
 +		/* copy duplilist to the cache */
 +		ListBase *duplilist = group_duplilist(eval_ctx, scene, group);
 +		dupcache->duplilist = *duplilist;
 +		MEM_freeN(duplilist);
 +	}
 +	
 +	for (dob = dupcache->duplilist.first; dob; dob = dob->next) {
 +		DupliObjectData *data = BKE_dupli_cache_find_data(dupcache, dob->ob);
 +		if (!data) {
 +			ParticleSystem *psys;
 +			
 +			data = dupli_cache_add_object_data(dupcache, dob->ob);
 +			
 +			if (cachelib->data_types & CACHE_TYPE_DERIVED_MESH) {
 +				if (dob->ob->type == OB_MESH) {
 +					DerivedMesh *dm;
 +					
 +					if (eval_ctx->mode == DAG_EVAL_RENDER) {
 +						dm = mesh_create_derived_render(scene, dob->ob, CD_MASK_BAREMESH);
 +					}
 +					else {
 +						dm = mesh_create_derived_view(scene, dob->ob, CD_MASK_BAREMESH);
 +					}
 +					
 +					if (dm)
 +						BKE_dupli_object_data_set_mesh(data, dm);
 +				}
 +			}
 +			
 +			for (psys = dob->ob->particlesystem.first; psys; psys = psys->next) {
 +				if (cachelib->data_types & CACHE_TYPE_HAIR) {
 +					if (psys->part && psys->part->type == PART_HAIR) {
 +						int numstrands = psys->totpart;
 +						int numverts = count_hair_verts(psys);
 +						ParticleData *pa;
 +						HairKey *hkey;
 +						int p, k;
 +						
 +						Strands *strands = BKE_strands_new(numstrands, numverts);
 +						StrandsCurve *scurve = strands->curves;
 +						StrandsVertex *svert = strands->verts;
 +						
 +						for (p = 0, pa = psys->particles; p < psys->totpart; ++p, ++pa) {
 +							scurve->numverts = pa->totkey;
 +							
 +							for (k = 0, hkey = pa->hair; k < pa->totkey; ++k, ++hkey) {
 +								copy_v3_v3(svert->co, hkey->co);
 +								svert->time = hkey->time;
 +								svert->weight = hkey->weight;
 +								
 +								++svert;
 +							}
 +							
 +							++scurve;
 +						}
 +						
 +						BKE_dupli_object_data_add_strands(data, psys->name, strands);
 +					}
 +				}
 +			}
 +		}
 +	}
 +}
 +
 +/* ------------------------------------------------------------------------- */
 +
 +void BKE_object_dupli_cache_update(Scene *scene, Object *ob, EvaluationContext *eval_ctx, float frame)
 +{
 +	const eCacheLibrary_EvalMode eval_mode = eval_ctx->mode == DAG_EVAL_RENDER ? CACHE_LIBRARY_EVAL_RENDER : CACHE_LIBRARY_EVAL_REALTIME;
 +	
 +	bool is_dupligroup = (ob->transflag & OB_DUPLIGROUP) && ob->dup_group;
 +	bool is_cached = ob->cache_library && (ob->cache_library->source_mode == CACHE_LIBRARY_SOURCE_CACHE || ob->cache_library->display_mode == CACHE_LIBRARY_DISPLAY_RESULT);
 +	
 +	/* cache is a group duplicator feature only */
 +	if (is_dupligroup && is_cached) {
 +		
 +		if (ob->dup_cache && !(ob->dup_cache->flag & DUPCACHE_FLAG_DIRTY)) {
 +			/* skip if cache is valid */
 +		}
 +		else {
 +			if (G.debug & G_DEBUG)
 +				printf("Update dupli cache for object '%s'\n", ob->id.name+2);
 +			
 +			if (ob->dup_cache) {
 +				BKE_dupli_cache_clear(ob->dup_cache);
 +			}
 +			else {
 +				ob->dup_cache = BKE_dupli_cache_new();
 +			}
 +			
 +			/* skip reading when the cachelib is baking, avoids unnecessary memory allocation */
 +			if (!(ob->cache_library->flag & CACHE_LIBRARY_BAKING)) {
 +				/* TODO at this point we could apply animation offset */
 +				BKE_cache_read_dupli_cache(ob->cache_library, ob->dup_cache, scene, ob->dup_group, frame, eval_mode);
 +			}
 +			
 +			ob->dup_cache->flag &= ~DUPCACHE_FL

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list