[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24764] trunk/blender/source/blender: * New option on modifiers that don't change topology: Apply as Shape

Matt Ebb matt at mke3.net
Sun Nov 22 14:44:09 CET 2009


Revision: 24764
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24764
Author:   broken
Date:     2009-11-22 14:44:09 +0100 (Sun, 22 Nov 2009)

Log Message:
-----------
* New option on modifiers that don't change topology: Apply as Shape

Rather than applying the modifier to the object data, it will create a new shape 
with the deformed vertices in there. Only mesh at the moment, other object 
types on the todo.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/BKE_key.h
    trunk/blender/source/blender/blenkernel/BKE_modifier.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/key.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/editors/include/ED_object.h
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/editors/object/object_shapekey.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2009-11-22 13:15:36 UTC (rev 24763)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2009-11-22 13:44:09 UTC (rev 24764)
@@ -54,6 +54,7 @@
 struct Scene;
 struct Mesh;
 struct EditMesh;
+struct KeyBlock;
 struct ModifierData;
 struct MCol;
 struct ColorBand;
@@ -318,6 +319,10 @@
  */
 void DM_to_mesh(DerivedMesh *dm, struct Mesh *me);
 
+/* utility function to convert a DerivedMesh to a shape key block 
+ */
+void DM_to_meshkey(DerivedMesh *dm, struct Mesh *me, struct KeyBlock *kb);
+
 /* set the CD_FLAG_NOCOPY flag in custom data layers where the mask is
  * zero for the layer type, so only layer types specified by the mask
  * will be copied

Modified: trunk/blender/source/blender/blenkernel/BKE_key.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_key.h	2009-11-22 13:15:36 UTC (rev 24763)
+++ trunk/blender/source/blender/blenkernel/BKE_key.h	2009-11-22 13:44:09 UTC (rev 24764)
@@ -59,6 +59,7 @@
 float *do_ob_key(struct Scene *scene, struct Object *ob);
 
 struct Key *ob_get_key(struct Object *ob);
+struct KeyBlock *add_keyblock(struct Scene *scene, struct Key *key);
 struct KeyBlock *ob_get_keyblock(struct Object *ob);
 struct KeyBlock *ob_get_reference_keyblock(struct Object *ob);
 struct KeyBlock *key_get_keyblock(struct Key *key, int index);

Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h	2009-11-22 13:15:36 UTC (rev 24763)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h	2009-11-22 13:44:09 UTC (rev 24764)
@@ -281,6 +281,7 @@
 int           modifier_supportsMapping(struct ModifierData *md);
 int           modifier_couldBeCage(struct ModifierData *md);
 int           modifier_isDeformer(struct ModifierData *md);
+int			  modifier_sameTopology(ModifierData *md);
 int           modifier_isEnabled(struct ModifierData *md, int required_mode);
 void          modifier_setError(struct ModifierData *md, char *format, ...);
 

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-11-22 13:15:36 UTC (rev 24763)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-11-22 13:44:09 UTC (rev 24764)
@@ -277,6 +277,26 @@
 	*me = tmp;
 }
 
+void DM_to_meshkey(DerivedMesh *dm, Mesh *me, KeyBlock *kb)
+{
+	int a, totvert = dm->getNumVerts(dm);
+	float *fp;
+	MVert *mvert;
+	
+	if(totvert==0 || me->totvert==0 || me->totvert!=totvert) return;
+	
+	if(kb->data) MEM_freeN(kb->data);
+	kb->data= MEM_callocN(me->key->elemsize*me->totvert, "kb->data");
+	kb->totelem= totvert;
+	
+	fp= kb->data;
+	mvert=dm->getVertDataArray(dm, CD_MVERT);
+	
+	for(a=0; a<kb->totelem; a++, fp+=3, mvert++) {
+		VECCOPY(fp, mvert->co);
+	}
+}
+
 void DM_set_only_copy(DerivedMesh *dm, CustomDataMask mask)
 {
 	CustomData_set_only_copy(&dm->vertData, mask);

Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c	2009-11-22 13:15:36 UTC (rev 24763)
+++ trunk/blender/source/blender/blenkernel/intern/key.c	2009-11-22 13:44:09 UTC (rev 24764)
@@ -1395,6 +1395,49 @@
 	return NULL;
 }
 
+KeyBlock *add_keyblock(Scene *scene, Key *key)
+{
+	KeyBlock *kb;
+	float curpos= -0.1;
+	int tot;
+	
+	kb= key->block.last;
+	if(kb) curpos= kb->pos;
+	
+	kb= MEM_callocN(sizeof(KeyBlock), "Keyblock");
+	BLI_addtail(&key->block, kb);
+	kb->type= KEY_CARDINAL;
+	
+	tot= BLI_countlist(&key->block);
+	if(tot==1) strcpy(kb->name, "Basis");
+	else sprintf(kb->name, "Key %d", tot-1);
+	
+	// XXX this is old anim system stuff? (i.e. the 'index' of the shapekey)
+	kb->adrcode= tot-1;
+	
+	key->totkey++;
+	if(key->totkey==1) key->refkey= kb;
+	
+	kb->slidermin= 0.0f;
+	kb->slidermax= 1.0f;
+	
+	// XXX kb->pos is the confusing old horizontal-line RVK crap in old IPO Editor...
+	if(key->type == KEY_RELATIVE) 
+		kb->pos= curpos+0.1;
+	else {
+#if 0 // XXX old animation system
+		curpos= bsystem_time(scene, 0, (float)CFRA, 0.0);
+		if(calc_ipo_spec(key->ipo, KEY_SPEED, &curpos)==0) {
+			curpos /= 100.0;
+		}
+		kb->pos= curpos;
+		
+		sort_keys(key);
+#endif // XXX old animation system
+	}
+	return kb;
+}
+
 /* only the active keyblock */
 KeyBlock *ob_get_keyblock(Object *ob) 
 {

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2009-11-22 13:15:36 UTC (rev 24763)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2009-11-22 13:44:09 UTC (rev 24764)
@@ -8924,6 +8924,12 @@
 			modifier_supportsMapping(md));	
 }
 
+int modifier_sameTopology(ModifierData *md)
+{
+	ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+	return ( mti->type == eModifierTypeType_OnlyDeform || mti->type == eModifierTypeType_Nonconstructive);
+}
+
 void modifier_setError(ModifierData *md, char *format, ...)
 {
 	char buffer[2048];

Modified: trunk/blender/source/blender/editors/include/ED_object.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_object.h	2009-11-22 13:15:36 UTC (rev 24763)
+++ trunk/blender/source/blender/editors/include/ED_object.h	2009-11-22 13:44:09 UTC (rev 24764)
@@ -114,12 +114,17 @@
 void curve_to_key(struct Curve *cu, struct KeyBlock *kb, struct ListBase *nurb);
 
 /* object_modifier.c */
+enum {
+	MODIFIER_APPLY_DATA=1,
+	MODIFIER_APPLY_SHAPE,
+} eModifier_Apply_Mode;
+
 struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Scene *scene, struct Object *ob, int type);
 int ED_object_modifier_remove(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md);
 int ED_object_modifier_move_down(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
 int ED_object_modifier_move_up(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
 int ED_object_modifier_convert(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md);
-int ED_object_modifier_apply(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md);
+int ED_object_modifier_apply(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md, int mode);
 int ED_object_modifier_copy(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
 
 #endif /* ED_OBJECT_H */

Modified: trunk/blender/source/blender/editors/interface/interface_templates.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_templates.c	2009-11-22 13:15:36 UTC (rev 24763)
+++ trunk/blender/source/blender/editors/interface/interface_templates.c	2009-11-22 13:44:09 UTC (rev 24764)
@@ -656,7 +656,7 @@
 		uiLayout *box;
 
 		box= uiLayoutBox(column);
-		row= uiLayoutRow(box, 1);
+		row= uiLayoutRow(box, 0);
 
 		if(!isVirtual && (md->type!=eModifierType_Collision) && (md->type!=eModifierType_Surface)) {
 			/* only here obdata, the rest of modifiers is ob level */
@@ -669,9 +669,13 @@
 					if(ELEM3(psys->part->ren_as, PART_DRAW_PATH, PART_DRAW_GR, PART_DRAW_OB) && psys->pathcache)
 						uiItemO(row, "Convert", 0, "OBJECT_OT_modifier_convert");
 			}
-			else
-				uiItemO(row, "Apply", 0, "OBJECT_OT_modifier_apply");
+			else 
+				uiItemEnumO(row, "Apply", 0, "OBJECT_OT_modifier_apply", "apply_as", MODIFIER_APPLY_DATA);
 			
+			if (modifier_sameTopology(md))
+				uiItemEnumO(row, "Apply as Shape", 0, "OBJECT_OT_modifier_apply", "apply_as", MODIFIER_APPLY_SHAPE);
+			
+			
 			uiBlockClearButLock(block);
 			uiBlockSetButLock(block, ob && ob->id.lib, ERROR_LIBDATA_MESSAGE);
 

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c	2009-11-22 13:15:36 UTC (rev 24763)
+++ trunk/blender/source/blender/editors/object/object_modifier.c	2009-11-22 13:44:09 UTC (rev 24764)
@@ -33,6 +33,7 @@
 
 #include "DNA_action_types.h"
 #include "DNA_curve_types.h"
+#include "DNA_key_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
@@ -51,6 +52,7 @@
 #include "BKE_DerivedMesh.h"
 #include "BKE_effect.h"
 #include "BKE_global.h"
+#include "BKE_key.h"
 #include "BKE_lattice.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
@@ -66,6 +68,7 @@
 #include "RNA_enum_types.h"
 
 #include "ED_armature.h"
+#include "ED_object.h"
 #include "ED_screen.h"
 
 #include "WM_api.h"
@@ -328,7 +331,7 @@
 	return 1;
 }
 
-int ED_object_modifier_apply(ReportList *reports, Scene *scene, Object *ob, ModifierData *md)
+int ED_object_modifier_apply(ReportList *reports, Scene *scene, Object *ob, ModifierData *md, int mode)
 {
 	DerivedMesh *dm;
 	Mesh *me = ob->data;
@@ -346,27 +349,64 @@
 		BKE_report(reports, RPT_INFO, "Applied modifier was not first, result may not be as expected.");
 
 	if (ob->type==OB_MESH) {
-		if(me->key) {
-			BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
-			return 0;
+		if (mode == MODIFIER_APPLY_SHAPE) {
+			Key *key=me->key;
+			KeyBlock *kb;
+			int newkey=0;
+			
+			if(!modifier_sameTopology(md)) {
+				BKE_report(reports, RPT_ERROR, "Only deforming modifiers can be applied to Shapes");
+				return 0;
+			}
+			mesh_pmv_off(ob, me);
+			
+			dm = mesh_create_derived_for_modifier(scene, ob, md);
+			if (!dm) {
+				BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply");
+				return 0;
+			}
+			
+			if(key == NULL) {
+				key= me->key= add_key((ID *)me);
+				key->type= KEY_RELATIVE;
+				newkey= 1;
+			}
+			kb= add_keyblock(scene, key);
+			
+			if (newkey) {
+				/* if that was the first key block added, then it was the basis.
+				 * Initialise it with the mesh, and add another for the modifier */
+				mesh_to_key(me, kb);
+				kb= add_keyblock(scene, key);
+			}

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list