[Bf-blender-cvs] [e0a780d] alembic: Strand edit functions for storing edit data in the Cache Shape Key modifier and editing in hair edit mode.

Lukas Tönne noreply at git.blender.org
Tue May 5 14:41:58 CEST 2015


Commit: e0a780d9a76501744c16936448af2ab9cf6a7829
Author: Lukas Tönne
Date:   Tue May 5 14:41:04 2015 +0200
Branches: alembic
https://developer.blender.org/rBe0a780d9a76501744c16936448af2ab9cf6a7829

Strand edit functions for storing edit data in the Cache Shape Key
modifier and editing in hair edit mode.

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

M	source/blender/blenkernel/BKE_cache_library.h
M	source/blender/blenkernel/BKE_editstrands.h
M	source/blender/blenkernel/intern/cache_library.c
M	source/blender/blenkernel/intern/editstrands.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/bmesh/intern/bmesh_strands_conv.c
M	source/blender/bmesh/intern/bmesh_strands_conv.h
M	source/blender/editors/hair/CMakeLists.txt
M	source/blender/editors/hair/hair_edit.c
M	source/blender/editors/hair/hair_intern.h
A	source/blender/editors/hair/hair_object_cachelib.c
M	source/blender/editors/hair/hair_object_particles.c
M	source/blender/editors/hair/hair_undo.c
M	source/blender/editors/io/io_cache_shapekey.c
M	source/blender/editors/object/object_edit.c
M	source/blender/makesdna/DNA_cache_library_types.h

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

diff --git a/source/blender/blenkernel/BKE_cache_library.h b/source/blender/blenkernel/BKE_cache_library.h
index 435cd7b..6c27fe6 100644
--- a/source/blender/blenkernel/BKE_cache_library.h
+++ b/source/blender/blenkernel/BKE_cache_library.h
@@ -174,9 +174,10 @@ struct CacheModifier *BKE_cache_modifier_copy(struct CacheLibrary *cachelib, str
 void BKE_cache_modifier_foreachIDLink(struct CacheLibrary *cachelib, struct CacheModifier *md, CacheModifier_IDWalkFunc walk, void *userdata);
 
 bool BKE_cache_modifier_find_object(struct DupliCache *dupcache, struct Object *ob, struct DupliObjectData **r_data);
-bool BKE_cache_modifier_find_strands(struct DupliCache *dupcache, struct Object *ob, int hair_system, struct DupliObjectData **r_data, struct Strands **r_strands);
+bool BKE_cache_modifier_find_strands(struct DupliCache *dupcache, struct Object *ob, int hair_system, struct DupliObjectData **r_data, struct Strands **r_strands, const char **r_name);
 
 struct KeyBlock *BKE_cache_modifier_strands_key_insert_key(struct StrandsKeyCacheModifier *md, struct Strands *strands, const char *name, const bool from_mix);
+bool BKE_cache_modifier_strands_key_get(struct Object *ob, struct StrandsKeyCacheModifier **r_skmd, struct DerivedMesh **r_dm, struct Strands **r_strands, struct DupliObjectData **r_dobdata, const char **r_name);
 
 /* ========================================================================= */
 
diff --git a/source/blender/blenkernel/BKE_editstrands.h b/source/blender/blenkernel/BKE_editstrands.h
index 01082a0..0638e79 100644
--- a/source/blender/blenkernel/BKE_editstrands.h
+++ b/source/blender/blenkernel/BKE_editstrands.h
@@ -41,7 +41,9 @@
 
 struct BMesh;
 struct DerivedMesh;
+struct Key;
 struct Object;
+struct Strands;
 
 typedef struct BMEditStrands {
 	struct BMesh *bm;
@@ -88,6 +90,12 @@ void BKE_editstrands_free_locations(BMEditStrandsLocations locs);
 void BKE_editstrands_solve_constraints(struct Object *ob, struct BMEditStrands *es, BMEditStrandsLocations orig);
 void BKE_editstrands_ensure(struct BMEditStrands *es);
 
+
+/* === cache shape key conversion === */
+
+struct BMesh *BKE_cache_strands_to_bmesh(struct Strands *strands, struct Key *key, int act_key_nr, struct DerivedMesh *dm);
+struct Strands *BKE_cache_strands_from_bmesh(struct BMEditStrands *edit, struct Key *key, struct DerivedMesh *dm);
+
 /* === particle conversion === */
 
 struct BMesh *BKE_particles_to_bmesh(struct Object *ob, struct ParticleSystem *psys);
diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index f187282..6fff160 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -57,6 +57,7 @@
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_editstrands.h"
 #include "BKE_effect.h"
 #include "BKE_global.h"
 #include "BKE_group.h"
@@ -848,7 +849,7 @@ bool BKE_cache_modifier_find_object(DupliCache *dupcache, Object *ob, DupliObjec
 	return true;
 }
 
-bool BKE_cache_modifier_find_strands(DupliCache *dupcache, Object *ob, int hair_system, DupliObjectData **r_data, Strands **r_strands)
+bool BKE_cache_modifier_find_strands(DupliCache *dupcache, Object *ob, int hair_system, DupliObjectData **r_data, Strands **r_strands, const char **r_name)
 {
 	DupliObjectData *dobdata;
 	ParticleSystem *psys;
@@ -877,6 +878,7 @@ bool BKE_cache_modifier_find_strands(DupliCache *dupcache, Object *ob, int hair_
 	
 	if (r_data) *r_data = dobdata;
 	if (r_strands) *r_strands = strands;
+	if (r_name) *r_name = psys->name;
 	return true;
 }
 
@@ -951,7 +953,7 @@ static void hairsim_process(HairSimCacheModifier *hsmd, CacheProcessContext *ctx
 //	if (eval_mode != CACHE_LIBRARY_EVAL_REALTIME)
 //		return;
 	
-	if (!BKE_cache_modifier_find_strands(data->dupcache, ob, hsmd->hair_system, NULL, &strands))
+	if (!BKE_cache_modifier_find_strands(data->dupcache, ob, hsmd->hair_system, NULL, &strands, NULL))
 		return;
 	
 	/* Note: motion state data should always be created regardless of actual sim.
@@ -1179,7 +1181,7 @@ static void shrinkwrap_process(ShrinkWrapCacheModifier *smd, CacheProcessContext
 	
 	ShrinkWrapCacheData shrinkwrap;
 	
-	if (!BKE_cache_modifier_find_strands(data->dupcache, ob, smd->hair_system, NULL, &strands))
+	if (!BKE_cache_modifier_find_strands(data->dupcache, ob, smd->hair_system, NULL, &strands, NULL))
 		return;
 	if (!BKE_cache_modifier_find_object(data->dupcache, smd->target, &target_data))
 		return;
@@ -1230,11 +1232,19 @@ static void strandskey_init(StrandsKeyCacheModifier *skmd)
 static void strandskey_copy(StrandsKeyCacheModifier *skmd, StrandsKeyCacheModifier *tskmd)
 {
 	tskmd->key = BKE_key_copy(skmd->key);
+	
+	tskmd->edit = NULL;
 }
 
 static void strandskey_free(StrandsKeyCacheModifier *skmd)
 {
 	BKE_key_free(skmd->key);
+	
+	if (skmd->edit) {
+		BKE_editstrands_free(skmd->edit);
+		MEM_freeN(skmd->edit);
+		skmd->edit = NULL;
+	}
 }
 
 static void strandskey_foreach_id_link(StrandsKeyCacheModifier *skmd, CacheLibrary *cachelib, CacheModifier_IDWalkFunc walk, void *userdata)
@@ -1249,7 +1259,7 @@ static void strandskey_process(StrandsKeyCacheModifier *skmd, CacheProcessContex
 	KeyBlock *actkb;
 	float *shape;
 	
-	if (!BKE_cache_modifier_find_strands(data->dupcache, ob, skmd->hair_system, NULL, &strands))
+	if (!BKE_cache_modifier_find_strands(data->dupcache, ob, skmd->hair_system, NULL, &strands, NULL))
 		return;
 	
 	actkb = BLI_findlink(&skmd->key->block, skmd->shapenr);
@@ -1319,6 +1329,35 @@ KeyBlock *BKE_cache_modifier_strands_key_insert_key(StrandsKeyCacheModifier *skm
 	return kb;
 }
 
+bool BKE_cache_modifier_strands_key_get(Object *ob, StrandsKeyCacheModifier **r_skmd, DerivedMesh **r_dm, Strands **r_strands, DupliObjectData **r_dobdata, const char **r_name)
+{
+	CacheLibrary *cachelib = ob->cache_library;
+	CacheModifier *md;
+	
+	if (!cachelib)
+		return false;
+	
+	/* ignore when the object is not actually using the cachelib */
+	if (!((ob->transflag & OB_DUPLIGROUP) && ob->dup_group && ob->dup_cache))
+		return false;
+	
+	for (md = cachelib->modifiers.first; md; md = md->next) {
+		if (md->type == eCacheModifierType_StrandsKey) {
+			StrandsKeyCacheModifier *skmd = (StrandsKeyCacheModifier *)md;
+			DupliObjectData *dobdata;
+			
+			if (BKE_cache_modifier_find_strands(ob->dup_cache, skmd->object, skmd->hair_system, &dobdata, r_strands, r_name)) {
+				if (r_skmd) *r_skmd = skmd;
+				if (r_dm) *r_dm = dobdata->dm;
+				if (r_dobdata) *r_dobdata = dobdata;
+				return true;
+			}
+		}
+	}
+	
+	return false;
+}
+
 void BKE_cache_modifier_init(void)
 {
 	cache_modifier_type_set(eCacheModifierType_HairSimulation, &cacheModifierType_HairSimulation);
diff --git a/source/blender/blenkernel/intern/editstrands.c b/source/blender/blenkernel/intern/editstrands.c
index 642eee3..741af51 100644
--- a/source/blender/blenkernel/intern/editstrands.c
+++ b/source/blender/blenkernel/intern/editstrands.c
@@ -34,12 +34,15 @@
 #include "BLI_math.h"
 #include "BLI_mempool.h"
 
+#include "DNA_cache_library_types.h"
 #include "DNA_customdata_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_particle_types.h"
+#include "DNA_strands_types.h"
 
 #include "BKE_bvhutils.h"
+#include "BKE_cache_library.h"
 #include "BKE_customdata.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_DerivedMesh.h"
@@ -78,10 +81,20 @@ BMEditStrands *BKE_editstrands_copy(BMEditStrands *es)
  */
 BMEditStrands *BKE_editstrands_from_object(Object *ob)
 {
-	ParticleSystem *psys = psys_get_current(ob);
-	if (psys) {
-		return psys->hairedit;
+	{
+		ParticleSystem *psys = psys_get_current(ob);
+		if (psys && psys->hairedit)
+			return psys->hairedit;
 	}
+	
+	{
+		StrandsKeyCacheModifier *skmd;
+		if (BKE_cache_modifier_strands_key_get(ob, &skmd, NULL, NULL, NULL, NULL)) {
+			if (skmd->edit)
+				return skmd->edit;
+		}
+	}
+	
 	return NULL;
 }
 
@@ -161,6 +174,43 @@ void BKE_editstrands_ensure(BMEditStrands *es)
 }
 
 
+/* === cache shape key conversion === */
+
+BMesh *BKE_cache_strands_to_bmesh(struct Strands *strands, struct Key *key, int act_key_nr, DerivedMesh *dm)
+{
+	const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_STRANDS(strands);
+	BMesh *bm;
+	
+	DM_ensure_tessface(dm);
+	
+	bm = BM_mesh_create(&allocsize);
+	BM_strands_bm_from_strands(bm, strands, key, dm, true, act_key_nr);
+	editstrands_calc_segment_lengths(bm);
+	
+	return bm;
+}
+
+struct Strands *BKE_cache_strands_from_bmesh(BMEditStrands *edit, struct Key *key, DerivedMesh *dm)
+{
+	BMesh *bm = edit ? edit->bm : NULL;
+	Strands *strands = NULL;
+	
+	if (bm && dm) {
+		BVHTreeFromMesh bvhtree = {NULL};
+		
+		DM_ensure_tessface(dm);
+		
+		bvhtree_from_mesh_faces(&bvhtree, dm, 0.0, 2, 6);
+		
+		strands = BM_strands_bm_to_strands(bm, strands, key, dm, &bvhtree);
+		
+		free_bvhtree_from_mesh(&bvhtree);
+	}
+	
+	return strands;
+}
+
+
 /* === particle conversion === */
 
 BMesh *BKE_particles_to_bmesh(Object *ob, ParticleSystem *psys)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 4fbb0fc..8b311be 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2054,6 +2054,11 @@ static void direct_link_cache_modifiers(FileData *fd, ListBase *modifiers)
 					direct_link_curvemapping(fd, hsmd->sim_params.goal_stiffness_mapping);
 				break;
 			}
+			case eCacheModifierType_StrandsKey: {
+				StrandsKeyCacheModifier *skmd = (StrandsKeyCacheModifier *)md;
+				skmd->edit = NULL;
+				break;
+			}
 		}
 	}
 }
diff --git a/source/blender/bmesh/intern/bmesh_strands_conv.c b/source/blender/bmesh/intern/bmesh_strands_conv.c
index 3e63dd2..821c372 100644
--- a/source/blender/bmesh/intern/bmesh_strands_conv.c
+++ b/source/blender/bmesh/intern/bmesh_strands_conv.c
@@ -26,20 +26,24 @@
  * BM mesh conversion functions.
  */
 
+#include "DNA_cache_library_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_object_types.h"
 #include "DNA_particle_types.h"
 #include "DNA_key_types.h"
+#include "DNA_strands_types.h"
 
 #include "MEM_guardedalloc.h"
 
 #include "BLI_listbase.h"
 #include "BLI_math.h"
 
+#includ

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list