[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15277] branches/soc-2008-nicholasbishop/ source/blender: Big commit with initial support for sculpting of meshes with the multires modifier .

Nicholas Bishop nicholasbishop at gmail.com
Thu Jun 19 05:13:53 CEST 2008


Revision: 15277
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15277
Author:   nicholasbishop
Date:     2008-06-19 05:13:00 +0200 (Thu, 19 Jun 2008)

Log Message:
-----------
Big commit with initial support for sculpting of meshes with the multires modifier.

With this commit, the displacement custom data is being applied to a subdivided version of the base mesh using a modification of CCGSubsurf.

Sculpting on the highest level of the multires mesh now works, with (at least) these caveats:
* Only the plain 'Draw' brush works for now
* Normals aren't being updated during sculpting, so it doesn't actually look right yet
* When displacements are applied or calculated, only interior face points are handled, so original vertices and edge vertices will look wrong after switching levels.

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_subsurf.h
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_modifier_types.h
    branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c
    branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-06-19 03:13:00 UTC (rev 15277)
@@ -66,3 +66,45 @@
 void multires_customdata_to_mesh(struct Mesh *me, struct EditMesh *em,
 				 struct MultiresLevel *lvl, struct CustomData *src,
                                  struct CustomData *dst, const int type);
+
+struct DerivedMesh;
+struct MFace;
+
+/* MultiresDM */
+struct DerivedMesh *MultiresDM_new(struct DerivedMesh*, int, int, int, int, int);
+void *MultiresDM_get_orco(struct DerivedMesh *);
+void *MultiresDM_get_subco(struct DerivedMesh *);
+struct MFace *MultiresDM_get_orfa(struct DerivedMesh *);
+int MultiresDM_get_totlvl(struct DerivedMesh *);
+int MultiresDM_get_lvl(struct DerivedMesh *);
+int MultiresDM_get_totorfa(struct DerivedMesh *);
+void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
+
+/* Modifier */
+struct MDisps;
+struct MultiresModifierData;
+typedef struct MultiresDisplacer {
+	struct MDisps *grid;
+	float mat[3][3];
+	int sides;
+	int spacing;
+	int sidetot;
+	int sidendx;
+	int type;
+	int invert;
+	float (*orco)[3];
+	float (*subco)[3];
+
+	int x, y, ax, ay;
+} MultiresDisplacer;
+
+struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*, int, int);
+
+void multiresModifier_subdivide(void *mmd_v, void *ob_v);
+void multiresModifier_setLevel(void *mmd_v, void *ob_v);
+
+void multires_displacer_init(MultiresDisplacer *d, struct DerivedMesh *dm,
+			     const int face_index, const int sides, const int invert);
+void multires_displacer_anchor(MultiresDisplacer *d, const int type, const int side_index);
+void multires_displacer_jump(MultiresDisplacer *d);
+void multires_displace(MultiresDisplacer *d, float out[3]);

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_subsurf.h	2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_subsurf.h	2008-06-19 03:13:00 UTC (rev 15277)
@@ -32,6 +32,7 @@
 struct Object;
 struct DerivedMesh;
 struct EditMesh;
+struct MultiresModifierData;
 struct SubsurfModifierData;
 
 struct DerivedMesh *subsurf_make_derived_from_derived(
@@ -40,6 +41,13 @@
                         int useRenderParams, float (*vertCos)[3],
                         int isFinalCalc, int editMode);
 
+struct DerivedMesh *subsurf_make_derived_from_derived_with_multires(
+                        struct DerivedMesh *dm,
+                        struct SubsurfModifierData *smd,
+			struct MultiresModifierData *mmd,
+                        int useRenderParams, float (*vertCos)[3],
+                        int isFinalCalc, int editMode);
+
 void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]);
 
 #endif

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/DerivedMesh.c	2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/DerivedMesh.c	2008-06-19 03:13:00 UTC (rev 15277)
@@ -1838,6 +1838,9 @@
 	if(G.f & G_VERTEXPAINT || G.f & G_WEIGHTPAINT)
 		mask |= CD_MASK_MCOL;
 
+	if(G.f & G_SCULPTMODE)
+		mask |= CD_MASK_MDISPS;
+
 	return mask;
 }
 

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-06-19 03:13:00 UTC (rev 15277)
@@ -1141,3 +1141,122 @@
 	return ((CDDerivedMesh*)dm)->mface;
 }
 
+/* Multires DerivedMesh, extends CDDM */
+typedef struct MultiresDM {
+	CDDerivedMesh cddm;
+
+	int lvl, totlvl;
+	float (*orco)[3];
+	float (*subco)[3];
+	MFace *orfa;
+	int totorfa;
+
+	void (*update)(DerivedMesh*);
+} MultiresDM;
+
+static void MultiresDM_release(DerivedMesh *dm)
+{
+	MultiresDM *mrdm = (MultiresDM*)dm;
+
+	/* Before freeing, need to update the displacement map */
+	if(dm->needsFree)
+		mrdm->update(dm);
+
+	if(DM_release(dm)) {
+		MEM_freeN(mrdm->orfa);
+		MEM_freeN(mrdm->subco);
+		MEM_freeN(mrdm->orco);
+		MEM_freeN(mrdm);
+	}
+}
+
+DerivedMesh *MultiresDM_new(DerivedMesh *orig, int numVerts, int numEdges, int numFaces, int lvl, int totlvl)
+{
+	MultiresDM *mrdm = MEM_callocN(sizeof(MultiresDM), "MultiresDM");
+	CDDerivedMesh *cddm = cdDM_create("MultiresDM CDDM");
+	DerivedMesh *dm = NULL;
+
+	mrdm->cddm = *cddm;
+	MEM_freeN(cddm);
+	dm = &mrdm->cddm.dm;
+
+	if(dm) {
+		MDisps *disps;
+		MVert *mvert;
+		int i;
+
+		DM_from_template(dm, orig, numVerts, numEdges, numFaces);
+		CustomData_free_layers(&dm->faceData, CD_MDISPS, numFaces);
+
+		disps = CustomData_get_layer(&orig->faceData, CD_MDISPS);
+		if(disps)
+			CustomData_add_layer(&dm->faceData, CD_MDISPS, CD_REFERENCE, disps, numFaces);
+
+
+		mvert = CustomData_get_layer(&orig->vertData, CD_MVERT);
+		mrdm->orco = MEM_callocN(sizeof(float) * 3 * orig->getNumVerts(orig), "multires orco");
+		for(i = 0; i < orig->getNumVerts(orig); ++i)
+			VecCopyf(mrdm->orco[i], mvert[i].co);
+		mrdm->orfa = MEM_dupallocN(CustomData_get_layer(&orig->faceData, CD_MFACE));
+		mrdm->totorfa = orig->getNumFaces(orig);
+	}
+	else
+		DM_init(dm, numVerts, numEdges, numFaces);
+
+	CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, numVerts);
+	CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
+	CustomData_add_layer(&dm->faceData, CD_MFACE, CD_CALLOC, NULL, numFaces);
+
+	mrdm->cddm.mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
+	mrdm->cddm.medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
+	mrdm->cddm.mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
+
+	mrdm->lvl = lvl;
+	mrdm->totlvl = totlvl;
+	mrdm->subco = MEM_callocN(sizeof(float)*3*numVerts, "multires subdivided coords");
+
+	dm->release = MultiresDM_release;
+
+	return dm;
+}
+
+void *MultiresDM_get_orco(DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->orco;
+
+}
+
+void *MultiresDM_get_subco(DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->subco;
+}
+
+MFace *MultiresDM_get_orfa(DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->orfa;
+}
+
+int MultiresDM_get_totorfa(struct DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->totorfa;
+}
+
+int MultiresDM_get_totlvl(DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->totlvl;
+}
+
+int MultiresDM_get_lvl(DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->lvl;
+}
+
+void MultiresDM_set_orco(DerivedMesh *dm, float (*orco)[3])
+{
+	((MultiresDM*)dm)->orco = orco;
+}
+
+void MultiresDM_set_update(DerivedMesh *dm, void (*update)(DerivedMesh*))
+{
+	((MultiresDM*)dm)->update = update;
+}

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c	2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c	2008-06-19 03:13:00 UTC (rev 15277)
@@ -361,7 +361,8 @@
 void layerCopy_mdisps(const void *source, void *dest, int count)
 {
 	int i;
-	MDisps *s = source, *d = dest;
+	const MDisps *s = source;
+	MDisps *d = dest;
 
 	for(i = 0; i < count; ++i) {
 		if(s[i].disps)
@@ -375,8 +376,9 @@
 	MDisps *d = data;
 
 	for(i = 0; i < count; ++i) {
-		if(d->disps)
-			MEM_freeN(d->disps);
+		if(d[i].disps)
+			MEM_freeN(d[i].disps);
+		d[i].disps = NULL;
 	}
 }
 
@@ -492,14 +494,14 @@
 const CustomDataMask CD_MASK_MESH =
 	CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
 	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL |
-	CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
+	CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
 const CustomDataMask CD_MASK_EDITMESH =
 	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
-	CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
+	CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
 const CustomDataMask CD_MASK_DERIVEDMESH =
 	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
 	CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
-	CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO;
+	CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_MDISPS;
 
 static const LayerTypeInfo *layerType_getInfo(int type)
 {

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c	2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c	2008-06-19 03:13:00 UTC (rev 15277)
@@ -86,6 +86,7 @@
 #include "BKE_booleanops.h"
 #include "BKE_displist.h"
 #include "BKE_modifier.h"
+#include "BKE_multires.h"
 #include "BKE_lattice.h"
 #include "BKE_library.h"
 #include "BKE_subsurf.h"
@@ -7022,7 +7023,13 @@
 static DerivedMesh *multiresModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm,
 						   int useRenderParams, int isFinalCalc)
 {
-	return dm;
+	MultiresModifierData *mmd = (MultiresModifierData*)md;
+
+	/* TODO: for now just skip a level1 mesh */
+	if(mmd->lvl == 1)
+		return dm;
+
+	return multires_dm_create_from_derived(mmd, dm, useRenderParams, isFinalCalc);
 }
 
 /***/

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-06-19 03:13:00 UTC (rev 15277)
@@ -32,6 +32,7 @@
 #include "DNA_key_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list