[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34587] trunk/blender/source: Todo issue: sculpting on deformed mesh

Sergey Sharybin g.ulairi at gmail.com
Mon Jan 31 21:02:58 CET 2011


Revision: 34587
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34587
Author:   nazgul
Date:     2011-01-31 20:02:51 +0000 (Mon, 31 Jan 2011)
Log Message:
-----------
Todo issue: sculpting on deformed mesh

Used a crazyspace approach (like in edit mode), but only modifiers with
deformMatricies are allowed atm (currently shapekeys and armature modifiers only).
All the rest modifiers had an warning message that they aren't applied because
of sculpt mode. Deformation of multires is also unsupported.

With all this restictions users will always see the actual "layer" (or maybe
mesh state would be more correct word) they are sculpting on.

Internal changes:
- All modifiers could have deformMatricies callback (the same as deformMatriciesEM but
  for non-edit mode usage)
- Added function to build crazyspace for sculpting (sculpt_get_deform_matrices), but it
  could be generalized for usage in other painting modes (particle edit mode, i.e)

Todo:
- Implement crazyspace correction to support all kinds of deformation modifiers
- Maybe deformation of multires isn't so difficult?
- And maybe we could avoid extra bad-level-stub for ED_sculpt_modifiers_changed
  without code duplicating?

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/BKE_modifier.h
    trunk/blender/source/blender/blenkernel/BKE_multires.h
    trunk/blender/source/blender/blenkernel/BKE_paint.h
    trunk/blender/source/blender/blenkernel/BKE_subsurf.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    trunk/blender/source/blender/blenlib/BLI_pbvh.h
    trunk/blender/source/blender/blenlib/intern/math_matrix.c
    trunk/blender/source/blender/blenlib/intern/pbvh.c
    trunk/blender/source/blender/editors/include/ED_sculpt.h
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt_intern.h
    trunk/blender/source/blender/editors/sculpt_paint/sculpt_undo.c
    trunk/blender/source/blender/modifiers/intern/MOD_armature.c
    trunk/blender/source/blender/modifiers/intern/MOD_array.c
    trunk/blender/source/blender/modifiers/intern/MOD_bevel.c
    trunk/blender/source/blender/modifiers/intern/MOD_boolean.c
    trunk/blender/source/blender/modifiers/intern/MOD_build.c
    trunk/blender/source/blender/modifiers/intern/MOD_cast.c
    trunk/blender/source/blender/modifiers/intern/MOD_cloth.c
    trunk/blender/source/blender/modifiers/intern/MOD_collision.c
    trunk/blender/source/blender/modifiers/intern/MOD_curve.c
    trunk/blender/source/blender/modifiers/intern/MOD_decimate.c
    trunk/blender/source/blender/modifiers/intern/MOD_displace.c
    trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c
    trunk/blender/source/blender/modifiers/intern/MOD_explode.c
    trunk/blender/source/blender/modifiers/intern/MOD_fluidsim.c
    trunk/blender/source/blender/modifiers/intern/MOD_hook.c
    trunk/blender/source/blender/modifiers/intern/MOD_lattice.c
    trunk/blender/source/blender/modifiers/intern/MOD_mask.c
    trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
    trunk/blender/source/blender/modifiers/intern/MOD_mirror.c
    trunk/blender/source/blender/modifiers/intern/MOD_multires.c
    trunk/blender/source/blender/modifiers/intern/MOD_none.c
    trunk/blender/source/blender/modifiers/intern/MOD_particleinstance.c
    trunk/blender/source/blender/modifiers/intern/MOD_particlesystem.c
    trunk/blender/source/blender/modifiers/intern/MOD_screw.c
    trunk/blender/source/blender/modifiers/intern/MOD_shapekey.c
    trunk/blender/source/blender/modifiers/intern/MOD_shrinkwrap.c
    trunk/blender/source/blender/modifiers/intern/MOD_simpledeform.c
    trunk/blender/source/blender/modifiers/intern/MOD_smoke.c
    trunk/blender/source/blender/modifiers/intern/MOD_smooth.c
    trunk/blender/source/blender/modifiers/intern/MOD_softbody.c
    trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
    trunk/blender/source/blender/modifiers/intern/MOD_subsurf.c
    trunk/blender/source/blender/modifiers/intern/MOD_surface.c
    trunk/blender/source/blender/modifiers/intern/MOD_uvproject.c
    trunk/blender/source/blender/modifiers/intern/MOD_wave.c
    trunk/blender/source/blenderplayer/bad_level_call_stubs/stubs.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2011-01-31 17:28:03 UTC (rev 34586)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2011-01-31 20:02:51 UTC (rev 34587)
@@ -508,6 +508,10 @@
 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,
+								float (**deformmats)[3][3], float (**deformcos)[3]);
+
 void weight_to_rgb(float input, float *fr, float *fg, float *fb);
 
 /* convert layers requested by a GLSL material to actually available layers in

Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h	2011-01-31 17:28:03 UTC (rev 34586)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h	2011-01-31 20:02:51 UTC (rev 34587)
@@ -134,6 +134,12 @@
 						float (*vertexCos)[3], int numVerts,
 						int useRenderParams, int isFinalCalc);
 
+	/* Like deformMatricesEM but called from object mode (for supporting modifiers in sculpt mode) */
+	void (*deformMatrices)(
+				struct ModifierData *md, struct Object *ob,
+				struct DerivedMesh *derivedData,
+				float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
+
 	/* Like deformVerts but called during editmode (for supporting modifiers)
 	 */
 	void (*deformVertsEM)(

Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_multires.h	2011-01-31 17:28:03 UTC (rev 34586)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h	2011-01-31 20:02:51 UTC (rev 34587)
@@ -53,6 +53,7 @@
 
 struct MultiresModifierData *find_multires_modifier_before(struct Scene *scene,
 	struct ModifierData *lastmd);
+struct MultiresModifierData *get_multires_modifier(struct Scene *scene, struct Object *ob, int use_first);
 struct DerivedMesh *get_multires_dm(struct Scene *scene, struct MultiresModifierData *mmd,
 				struct Object *ob);
 void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);

Modified: trunk/blender/source/blender/blenkernel/BKE_paint.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_paint.h	2011-01-31 17:28:03 UTC (rev 34586)
+++ trunk/blender/source/blender/blenkernel/BKE_paint.h	2011-01-31 20:02:51 UTC (rev 34587)
@@ -78,8 +78,11 @@
 	/* PBVH acceleration structure */
 	struct PBVH *pbvh;
 
-	/* Used temporarily per-stroke */
-	float *vertexcosnos;
+	/* Paiting on deformed mesh */
+	int modifiers_active; /* object is deformed with some modifiers */
+	float (*orig_cos)[3]; /* coords of undeformed mesh */
+	float (*deform_cos)[3]; /* coords of deformed mesh but without stroke displacement */
+	float (*deform_imats)[3][3]; /* crazyspace deformation matricies */
 
 	/* Partial redraw */
 	int partial_redraw;
@@ -95,8 +98,6 @@
 
 	struct GPUDrawObject *drawobject;
 
-	int modifiers_active;
-
 	rcti previous_r;
 } SculptSession;
 

Modified: trunk/blender/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_subsurf.h	2011-01-31 17:28:03 UTC (rev 34586)
+++ trunk/blender/source/blender/blenkernel/BKE_subsurf.h	2011-01-31 20:02:51 UTC (rev 34587)
@@ -72,7 +72,6 @@
 	char *faceFlags;
 
 	struct PBVH *pbvh;
-	int pbvh_draw;
 	struct ListBase *fmap;
 	struct IndexNode *fmap_mem;
 

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-01-31 17:28:03 UTC (rev 34586)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-01-31 20:02:51 UTC (rev 34587)
@@ -53,6 +53,7 @@
 #include "BKE_object.h"
 #include "BKE_paint.h"
 #include "BKE_texture.h"
+#include "BKE_multires.h"
 
 
 #include "BLO_sys_types.h" // for intptr_t support
@@ -65,6 +66,8 @@
 #include "GPU_extensions.h"
 #include "GPU_material.h"
 
+#include "ED_sculpt.h" /* for ED_sculpt_modifiers_changed */
+
 ///////////////////////////////////
 ///////////////////////////////////
 
@@ -1676,7 +1679,13 @@
 	int required_mode;
 	int isPrevDeform= FALSE;
 	int skipVirtualArmature = (useDeform < 0);
+	MultiresModifierData *mmd= get_multires_modifier(scene, ob, 0);
+	int has_multires = mmd != NULL, multires_applied = 0;
+	int sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt;
 
+	if(mmd && !mmd->sculptlvl)
+		has_multires = 0;
+
 	if(!skipVirtualArmature) {
 		firstmd = modifiers_getVirtualModifierList(ob);
 	}
@@ -1714,6 +1723,12 @@
 			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);
 
@@ -1759,13 +1774,18 @@
 		ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
 		md->scene= scene;
-		
+
 		if(!modifier_isEnabled(scene, md, required_mode)) continue;
 		if(mti->type == eModifierTypeType_OnlyDeform && !useDeform) continue;
 		if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
 			modifier_setError(md, "Modifier requires original data, bad stack position.");
 			continue;
 		}
+		if(sculpt_mode && (!has_multires || multires_applied))
+			if(md->type != eModifierType_Armature || multires_applied) {
+				modifier_setError(md, "Not supported in sculpt mode.");
+				continue;
+			}
 		if(needMapping && !modifier_supportsMapping(md)) continue;
 		if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
 
@@ -1928,6 +1948,9 @@
 		/* grab modifiers until index i */
 		if((index >= 0) && (modifiers_indexInObject(ob, md) >= index))
 			break;
+
+		if(sculpt_mode && md->type == eModifierType_Multires)
+			multires_applied = 1;
 	}
 
 	for(md=firstmd; md; md=md->next)
@@ -2222,14 +2245,9 @@
 		ob->derivedDeform->release(ob->derivedDeform);
 		ob->derivedDeform= NULL;
 	}
-	/* we free pbvh on changes, except during sculpt since it can't deal with
-	   changing PVBH node organization, we hope topology does not change in
-	   the meantime .. weak */
-	if(ob->sculpt && ob->sculpt->pbvh) {
-		if(!ob->sculpt->cache) {
-			BLI_pbvh_free(ob->sculpt->pbvh);
-			ob->sculpt->pbvh= NULL;
-		}
+
+	if(ob->sculpt) {
+		ED_sculpt_modifiers_changed(ob);
 	}
 }
 
@@ -2523,6 +2541,51 @@
 	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= getMeshDerivedMesh(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/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-01-31 17:28:03 UTC (rev 34586)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-01-31 20:02:51 UTC (rev 34587)
@@ -76,6 +76,7 @@
 	/* Cached */
 	struct PBVH *pbvh;
 	int pbvh_draw;
+
 	/* Mesh connectivity */
 	struct ListBase *fmap;
 	struct IndexNode *fmap_mem;
@@ -222,6 +223,17 @@
 		cddm->pbvh_draw = can_pbvh_draw(ob, dm);
 		BLI_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert,
 				   me->totface, me->totvert);
+
+		if(ob->sculpt->modifiers_active) {
+			float (*vertCos)[3];
+			int totvert;
+
+			totvert= dm->getNumVerts(dm);
+			vertCos= MEM_callocN(3*totvert*sizeof(float), "cdDM_getPBVH vertCos");
+			dm->getVertCos(dm, vertCos);
+			BLI_pbvh_apply_vertCos(cddm->pbvh, vertCos);
+			MEM_freeN(vertCos);
+		}
 	}
 
 	return cddm->pbvh;

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2011-01-31 17:28:03 UTC (rev 34586)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2011-01-31 20:02:51 UTC (rev 34587)
@@ -92,8 +92,10 @@
 	return NULL;
 }
 
-/* used for applying scale on mdisps layer and syncing subdivide levels when joining objects */
-static MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob)
+/* used for applying scale on mdisps layer and syncing subdivide levels when joining objects
+   use_first - return first multires modifier if all multires'es are disabled
+*/
+MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob, int use_first)
 {
 	ModifierData *md;
 	MultiresModifierData *mmd= NULL, *firstmmd= NULL;
@@ -111,7 +113,7 @@
 		}
 	}
 
-	if(!mmd) {
+	if(!mmd && use_first) {
 		/* active multires have not been found
 		   try to use first one */
 		return firstmmd;
@@ -1568,8 +1570,8 @@
 
 static void multires_sync_levels(Scene *scene, Object *ob, Object *to_ob)
 {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list