[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34803] trunk/blender/source/blender: Sculpting on deformed mesh

Sergey Sharybin g.ulairi at gmail.com
Sat Feb 12 18:51:04 CET 2011


Revision: 34803
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34803
Author:   nazgul
Date:     2011-02-12 17:51:02 +0000 (Sat, 12 Feb 2011)
Log Message:
-----------
Sculpting on deformed mesh
==========================

Removed limitation of armatured-only objects for sculpting -- now all
deformation modifiers are allowed in sculpt mode. Use crazyspace corrections
like from transformation modules was used to support all deformation modifiers.

Internal change: all crazyspace-related functions were noved to crazyspace.c

P.S. Brush could make quite unexpected deformation for meshes which are
     deformed in specified way. Got patch for this and discussing with Brecht
	 if it's really needed or maybe it could be done in better way.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/editors/include/ED_util.h
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/util/CMakeLists.txt

Added Paths:
-----------
    trunk/blender/source/blender/editors/util/crazyspace.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2011-02-12 17:28:37 UTC (rev 34802)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2011-02-12 17:51:02 UTC (rev 34803)
@@ -512,8 +512,9 @@
 int editmesh_get_first_deform_matrices(struct Scene *, struct Object *, struct EditMesh *em,
 									   float (**deformmats)[3][3], float (**deformcos)[3]);
 
-/* returns an array of deform matrices for crazyspace correction when sculpting */
-void sculpt_get_deform_matrices(struct Scene *scene, struct Object *ob,
+/* returns an array of deform matrices for crazyspace correction when sculpting,
+   and the number of modifiers left */
+int sculpt_get_deform_matrices(struct Scene *scene, struct Object *ob,
 								float (**deformmats)[3][3], float (**deformcos)[3]);
 
 void weight_to_rgb(float input, float *fr, float *fg, float *fb);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-02-12 17:28:37 UTC (rev 34802)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-02-12 17:51:02 UTC (rev 34803)
@@ -1721,12 +1721,6 @@
 			if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
 
 			if(mti->type == eModifierTypeType_OnlyDeform) {
-				if(sculpt_mode && !has_multires)
-					if(!ELEM(md->type, eModifierType_Armature, eModifierType_ShapeKey)) {
-						modifier_setError(md, "Not supported in sculpt mode.");
-						continue;
-					}
-
 				if(!deformedVerts)
 					deformedVerts = mesh_getVertexCos(me, &numVerts);
 
@@ -1780,7 +1774,7 @@
 			continue;
 		}
 		if(sculpt_mode && (!has_multires || multires_applied))
-			if(md->type != eModifierType_Armature || multires_applied) {
+			if(mti->type != eModifierTypeType_OnlyDeform || multires_applied) {
 				modifier_setError(md, "Not supported in sculpt mode.");
 				continue;
 			}
@@ -2485,105 +2479,6 @@
 	return vertexcosnos;
 }
 
-/* ********* crazyspace *************** */
-
-int editmesh_get_first_deform_matrices(Scene *scene, Object *ob, EditMesh *em, float (**deformmats)[3][3], float (**deformcos)[3])
-{
-	ModifierData *md;
-	DerivedMesh *dm;
-	int i, a, numleft = 0, numVerts = 0;
-	int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
-	float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
-
-	modifiers_clearErrors(ob);
-
-	dm = NULL;
-	md = modifiers_getVirtualModifierList(ob);
-
-	/* compute the deformation matrices and coordinates for the first
-	   modifiers with on cage editing that are enabled and support computing
-	   deform matrices */
-	for(i = 0; md && i <= cageIndex; i++, md = md->next) {
-		ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
-		if(!editmesh_modifier_is_enabled(scene, md, dm))
-			continue;
-
-		if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
-			if(!defmats) {
-				dm= editmesh_get_derived(em, NULL);
-				deformedVerts= editmesh_get_vertex_cos(em, &numVerts);
-				defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
-
-				for(a=0; a<numVerts; a++)
-					unit_m3(defmats[a]);
-			}
-
-			mti->deformMatricesEM(md, ob, em, dm, deformedVerts, defmats,
-				numVerts);
-		}
-		else
-			break;
-	}
-
-	for(; md && i <= cageIndex; md = md->next, i++)
-		if(editmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md))
-			numleft++;
-
-	if(dm)
-		dm->release(dm);
-	
-	*deformmats= defmats;
-	*deformcos= deformedVerts;
-
-	return numleft;
-}
-
-void sculpt_get_deform_matrices(Scene *scene, Object *ob, float (**deformmats)[3][3], float (**deformcos)[3])
-{
-	ModifierData *md;
-	DerivedMesh *dm;
-	int a, numVerts= 0;
-	float (*defmats)[3][3]= NULL, (*deformedVerts)[3]= NULL;
-	MultiresModifierData *mmd= get_multires_modifier(scene, ob, 0);
-	int has_multires = mmd != NULL && mmd->sculptlvl > 0;
-
-	if(has_multires) {
-		*deformmats= NULL;
-		*deformcos= NULL;
-		return;
-	}
-
-	dm= NULL;
-	md= modifiers_getVirtualModifierList(ob);
-
-	for(; md; md= md->next) {
-		ModifierTypeInfo *mti= modifierType_getInfo(md->type);
-
-		if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
-
-		if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatrices) {
-			if(!defmats) {
-				Mesh *me= (Mesh*)ob->data;
-				dm= mesh_create_derived(me, ob, NULL);
-				deformedVerts= mesh_getVertexCos(me, &numVerts);
-				defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
-
-				for(a=0; a<numVerts; a++)
-					unit_m3(defmats[a]);
-			}
-
-			mti->deformMatrices(md, ob, dm, deformedVerts, defmats, numVerts);
-		}
-	}
-
-	if(dm)
-		dm->release(dm);
-
-	*deformmats= defmats;
-	*deformcos= deformedVerts;
-}
-
 /* ******************* GLSL ******************** */
 
 void DM_add_tangent_layer(DerivedMesh *dm)

Modified: trunk/blender/source/blender/editors/include/ED_util.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_util.h	2011-02-12 17:28:37 UTC (rev 34802)
+++ trunk/blender/source/blender/editors/include/ED_util.h	2011-02-12 17:51:02 UTC (rev 34803)
@@ -28,12 +28,15 @@
 #ifndef ED_UTIL_H
 #define ED_UTIL_H
 
+struct Scene;
 struct Object;
 struct bContext;
 struct ARegion;
 struct uiBlock;
 struct wmOperator;
 struct wmOperatorType;
+struct EditMesh;
+struct Mesh;
 
 /* ed_util.c */
 
@@ -73,6 +76,15 @@
 void	undo_editmode_clear			(void);
 void	undo_editmode_step			(struct bContext *C, int step);
 
+/* crazyspace.c */
+float *crazyspace_get_mapped_editverts(struct Scene *scene, struct Object *obedit);
+void crazyspace_set_quats_editmesh(struct EditMesh *em, float *origcos, float *mappedcos, float *quats);
+void crazyspace_set_quats_mesh(struct Mesh *me, float *origcos, float *mappedcos, float *quats);
+int editmesh_get_first_deform_matrices(struct Scene *scene, struct Object *ob, struct EditMesh *em, float (**deformmats)[3][3], float (**deformcos)[3]);
+int sculpt_get_first_deform_matrices(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]);
+void crazyspace_build_sculpt(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]);
+
+
 /* ************** XXX OLD CRUFT WARNING ************* */
 
 void apply_keyb_grid(int shift, int ctrl, float *val, float fac1, float fac2, float fac3, int invert);

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2011-02-12 17:28:37 UTC (rev 34802)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2011-02-12 17:51:02 UTC (rev 34803)
@@ -66,6 +66,7 @@
 #include "WM_types.h"
 #include "ED_screen.h"
 #include "ED_view3d.h"
+#include "ED_util.h" /* for crazyspace correction */
 #include "paint_intern.h"
 #include "sculpt_intern.h"
 
@@ -169,7 +170,7 @@
 		if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
 		if(md->type==eModifierType_ShapeKey) continue;
 
-		if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatrices)
+		if(mti->type==eModifierTypeType_OnlyDeform)
 			return 1;
 	}
 
@@ -2642,7 +2643,7 @@
 			if(ss->kb) ss->orig_cos = key_to_vertcos(ob, ss->kb);
 			else ss->orig_cos = mesh_getVertexCos(ob->data, NULL);
 
-			sculpt_get_deform_matrices(scene, ob, &ss->deform_imats, &ss->deform_cos);
+			crazyspace_build_sculpt(scene, ob, &ss->deform_imats, &ss->deform_cos);
 			BLI_pbvh_apply_vertCos(ss->pbvh, ss->deform_cos);
 
 			for(a = 0; a < ((Mesh*)ob->data)->totvert; ++a)

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2011-02-12 17:28:37 UTC (rev 34802)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2011-02-12 17:51:02 UTC (rev 34803)
@@ -85,6 +85,7 @@
 #include "ED_types.h"
 #include "ED_uvedit.h"
 #include "ED_curve.h" /* for ED_curve_editnurbs */
+#include "ED_util.h"  /* for crazyspace correction */
 
 #include "UI_view2d.h"
 
@@ -1940,147 +1941,6 @@
 	}
 }
 
-/* *********************** CrazySpace correction. Now without doing subsurf optimal ****************** */
-
-static void make_vertexcos__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
-{
-	float *vec = userData;
-
-	vec+= 3*index;
-	VECCOPY(vec, co);
-}
-
-static int modifiers_disable_subsurf_temporary(Object *ob)
-{
-	ModifierData *md;
-	int disabled = 0;
-
-	for(md=ob->modifiers.first; md; md=md->next)
-		if(md->type==eModifierType_Subsurf)
-			if(md->mode & eModifierMode_OnCage) {
-				md->mode ^= eModifierMode_DisableTemporary;
-				disabled= 1;
-			}
-
-	return disabled;
-}
-
-/* disable subsurf temporal, get mapped cos, and enable it */
-static float *get_crazy_mapped_editverts(TransInfo *t)
-{
-	Mesh *me= t->obedit->data;
-	DerivedMesh *dm;
-	float *vertexcos;
-
-	/* disable subsurf temporal, get mapped cos, and enable it */
-	if(modifiers_disable_subsurf_temporary(t->obedit)) {
-		/* need to make new derivemesh */
-		makeDerivedMesh(t->scene, t->obedit, me->edit_mesh, CD_MASK_BAREMESH);
-	}
-
-	/* now get the cage */
-	dm= editmesh_get_derived_cage(t->scene, t->obedit, me->edit_mesh, CD_MASK_BAREMESH);
-
-	vertexcos= MEM_mallocN(3*sizeof(float)*me->edit_mesh->totvert, "vertexcos map");
-	dm->foreachMappedVert(dm, make_vertexcos__mapFunc, vertexcos);
-
-	dm->release(dm);
-
-	/* set back the flag, no new cage needs to be built, transform does it */
-	modifiers_disable_subsurf_temporary(t->obedit);
-
-	return vertexcos;
-}
-
-#define TAN_MAKE_VEC(a, b, c)	a[0]= b[0] + 0.2f*(b[0]-c[0]); a[1]= b[1] + 0.2f*(b[1]-c[1]); a[2]= b[2] + 0.2f*(b[2]-c[2])
-static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3, float *def1, float *def2, float *def3)
-{
-	float vecu[3], vecv[3];
-	float q1[4], q2[4];
-
-	TAN_MAKE_VEC(vecu, v1, v2);
-	TAN_MAKE_VEC(vecv, v1, v3);
-	tri_to_quat( q1,v1, vecu, vecv);
-
-	TAN_MAKE_VEC(vecu, def1, def2);
-	TAN_MAKE_VEC(vecv, def1, def3);
-	tri_to_quat( q2,def1, vecu, vecv);
-
-	sub_qt_qtqt(quat, q2, q1);
-}
-#undef TAN_MAKE_VEC
-
-static void set_crazyspace_quats(EditMesh *em, float *origcos, float *mappedcos, float *quats)
-{
-	EditVert *eve, *prev;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list