[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24886] branches/sculpt25/source/blender: Sculpt: Multires

Brecht Van Lommel brecht at blender.org
Wed Nov 25 15:07:12 CET 2009


Revision: 24886
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24886
Author:   blendix
Date:     2009-11-25 15:07:12 +0100 (Wed, 25 Nov 2009)

Log Message:
-----------
Sculpt: Multires

* Displacement coordinates are now stored differently, as a grid per
  face corner. This means there is duplication of coordinates, especially
  at low subdivision levels, but the simpler implementation justifies it
  I think.
* ToDo: conversion of existing multires files (2.4x or 2.5x), loading them
  may even crash now.
* Editmode preservation/interpolation code also has not been updated yet.

* Multires now works on the CCGDerivedMesh grids instead of CDDerivedMesh,
  which should be more memory efficient.
* There are still bad memory peaks (if you're using 32bit) when subdividing
  or propagating displacements. Though at least there should be no huge
  memory blocks allocated, which windows is now to have trouble with.
* Still found some weird spike artifacts at lower multires levels, some also
  happening before this commit. Perhaps computation of tangents needs to be
  tweaked more.

* Multires modifier now has viewport, sculpt and render levels. Also the
  levels have been made consistent with subsurf, previously the same level
  of subdivision was one less for multires.
* Both multires and subsurf modifier now can have their subdivision level
  set to 0 for no subdivision.

Modified Paths:
--------------
    branches/sculpt25/source/blender/blenkernel/BKE_modifier.h
    branches/sculpt25/source/blender/blenkernel/BKE_multires.h
    branches/sculpt25/source/blender/blenkernel/intern/DerivedMesh.c
    branches/sculpt25/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/sculpt25/source/blender/blenkernel/intern/customdata.c
    branches/sculpt25/source/blender/blenkernel/intern/displist.c
    branches/sculpt25/source/blender/blenkernel/intern/lattice.c
    branches/sculpt25/source/blender/blenkernel/intern/modifier.c
    branches/sculpt25/source/blender/blenkernel/intern/multires.c
    branches/sculpt25/source/blender/blenloader/intern/readfile.c
    branches/sculpt25/source/blender/blenloader/intern/writefile.c
    branches/sculpt25/source/blender/editors/object/object_modifier.c
    branches/sculpt25/source/blender/editors/sculpt_paint/sculpt.c
    branches/sculpt25/source/blender/makesdna/DNA_modifier_types.h
    branches/sculpt25/source/blender/makesrna/intern/rna_modifier.c

Modified: branches/sculpt25/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- branches/sculpt25/source/blender/blenkernel/BKE_modifier.h	2009-11-25 13:40:43 UTC (rev 24885)
+++ branches/sculpt25/source/blender/blenkernel/BKE_modifier.h	2009-11-25 14:07:12 UTC (rev 24886)
@@ -228,7 +228,7 @@
 	 *
 	 * This function is optional (assumes never disabled if not present).
 	 */
-	int (*isDisabled)(struct ModifierData *md);
+	int (*isDisabled)(struct ModifierData *md, int userRenderParams);
 
 	/* Add the appropriate relations to the DEP graph depending on the
 	 * modifier data. 

Modified: branches/sculpt25/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/sculpt25/source/blender/blenkernel/BKE_multires.h	2009-11-25 13:40:43 UTC (rev 24885)
+++ branches/sculpt25/source/blender/blenkernel/BKE_multires.h	2009-11-25 14:07:12 UTC (rev 24886)
@@ -39,23 +39,6 @@
 	int local_mmd;
 } MultiresSubsurf;
 
-/* MultiresDM */
-struct Object *MultiresDM_get_object(struct DerivedMesh *dm);
-struct Mesh *MultiresDM_get_mesh(struct DerivedMesh *dm);
-struct DerivedMesh *MultiresDM_new(struct MultiresSubsurf *, struct DerivedMesh*, int, int, int);
-void *MultiresDM_get_vertnorm(struct DerivedMesh *);
-void *MultiresDM_get_orco(struct DerivedMesh *);
-struct MVert *MultiresDM_get_subco(struct DerivedMesh *);
-struct ListBase *MultiresDM_get_vert_face_map(struct DerivedMesh *);
-struct ListBase *MultiresDM_get_vert_edge_map(struct DerivedMesh *);
-int *MultiresDM_get_face_offsets(struct DerivedMesh *);
-int MultiresDM_get_totlvl(struct DerivedMesh *);
-int MultiresDM_get_lvl(struct DerivedMesh *);
-void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
-
-/* The displacements will only be updated when
-   the MultiresDM has been marked as modified */
-void MultiresDM_mark_as_modified(struct DerivedMesh *);
 void multires_mark_as_modified(struct Object *ob);
 
 void multires_force_update(struct Object *ob);
@@ -64,10 +47,9 @@
 						    struct Object *, int, int);
 
 struct MultiresModifierData *find_multires_modifier(struct Object *ob);
-int multiresModifier_switch_level(struct Object *, const int);
 void multiresModifier_join(struct Object *);
 void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
-void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob, int distance,
+void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob,
 				int updateblock, int simple);
 int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object *dst, struct Object *src);
 

Modified: branches/sculpt25/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/sculpt25/source/blender/blenkernel/intern/DerivedMesh.c	2009-11-25 13:40:43 UTC (rev 24885)
+++ branches/sculpt25/source/blender/blenkernel/intern/DerivedMesh.c	2009-11-25 14:07:12 UTC (rev 24886)
@@ -1535,7 +1535,7 @@
 	md->scene= scene;
 	
 	if (!(md->mode&eModifierMode_Realtime)) return NULL;
-	if (mti->isDisabled && mti->isDisabled(md)) return NULL;
+	if (mti->isDisabled && mti->isDisabled(md, 0)) return NULL;
 
 	if (mti->type==eModifierTypeType_OnlyDeform) {
 		int numVerts;

Modified: branches/sculpt25/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/sculpt25/source/blender/blenkernel/intern/cdderivedmesh.c	2009-11-25 13:40:43 UTC (rev 24885)
+++ branches/sculpt25/source/blender/blenkernel/intern/cdderivedmesh.c	2009-11-25 14:07:12 UTC (rev 24886)
@@ -1810,215 +1810,3 @@
 	return ((CDDerivedMesh*)dm)->mface;
 }
 
-/* Multires DerivedMesh, extends CDDM */
-typedef struct MultiresDM {
-	CDDerivedMesh cddm;
-
-	MultiresModifierData *mmd;
-	int local_mmd;
-
-	int lvl, totlvl;
-	float (*orco)[3];
-	MVert *subco;
-
-	ListBase *vert_face_map, *vert_edge_map;
-	IndexNode *vert_face_map_mem, *vert_edge_map_mem;
-	int *face_offsets;
-
-	Object *ob;
-	int modified;
-
-	void (*update)(DerivedMesh*);
-} MultiresDM;
-
-static void MultiresDM_release(DerivedMesh *dm)
-{
-	MultiresDM *mrdm = (MultiresDM*)dm;
-	int mvert_layer;
-
-	/* Before freeing, need to update the displacement map */
-	if(dm->needsFree && mrdm->modified) {
-		/* Check that mmd still exists */
-		if(!mrdm->local_mmd && BLI_findindex(&mrdm->ob->modifiers, mrdm->mmd) < 0)
-			mrdm->mmd = NULL;
-		if(mrdm->mmd)
-			mrdm->update(dm);
-	}
-
-	/* If the MVert data is being used as the sculpt undo store, don't free it */
-	mvert_layer = CustomData_get_layer_index(&dm->vertData, CD_MVERT);
-	if(mvert_layer != -1) {
-		CustomDataLayer *cd = &dm->vertData.layers[mvert_layer];
-		if(mrdm->mmd && cd->data == mrdm->mmd->undo_verts)
-			cd->flag |= CD_FLAG_NOFREE;
-	}
-
-	if(DM_release(dm)) {
-		cdDM_free_internal(&mrdm->cddm);
-		MEM_freeN(mrdm->subco);
-		MEM_freeN(mrdm->orco);
-		if(mrdm->vert_face_map)
-			MEM_freeN(mrdm->vert_face_map);
-		if(mrdm->vert_face_map_mem)
-			MEM_freeN(mrdm->vert_face_map_mem);
-		if(mrdm->vert_edge_map)
-			MEM_freeN(mrdm->vert_edge_map);
-		if(mrdm->vert_edge_map_mem)
-			MEM_freeN(mrdm->vert_edge_map_mem);
-		if(mrdm->face_offsets)
-			MEM_freeN(mrdm->face_offsets);
-		MEM_freeN(mrdm);
-	}
-}
-
-DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts, int numEdges, int numFaces)
-{
-	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;
-
-	mrdm->mmd = ms->mmd;
-	mrdm->ob = ms->ob;
-	mrdm->local_mmd = ms->local_mmd;
-
-	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)
-			copy_v3_v3(mrdm->orco[i], mvert[i].co);
-	}
-	else
-		DM_init(dm, numVerts, numEdges, numFaces);
-
-	if(!CustomData_get_layer(&dm->vertData, CD_ORIGINDEX))
-		CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, numVerts);
-	if(!CustomData_get_layer(&dm->edgeData, CD_ORIGINDEX))
-		CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
-	if(!CustomData_get_layer(&dm->faceData, CD_ORIGINDEX))
-		CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, 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 = ms->mmd->lvl;
-	mrdm->totlvl = ms->mmd->totlvl;
-	mrdm->subco = MEM_callocN(sizeof(MVert)*numVerts, "multires subdivided verts");
-	mrdm->modified = 0;
-
-	dm->release = MultiresDM_release;
-
-	return dm;
-}
-
-Mesh *MultiresDM_get_mesh(DerivedMesh *dm)
-{
-	return get_mesh(((MultiresDM*)dm)->ob);
-}
-
-Object *MultiresDM_get_object(DerivedMesh *dm)
-{
-	return ((MultiresDM*)dm)->ob;
-}
-
-void *MultiresDM_get_orco(DerivedMesh *dm)
-{
-	return ((MultiresDM*)dm)->orco;
-
-}
-
-MVert *MultiresDM_get_subco(DerivedMesh *dm)
-{
-	return ((MultiresDM*)dm)->subco;
-}
-
-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;
-}
-
-ListBase *MultiresDM_get_vert_face_map(DerivedMesh *dm)
-{
-	MultiresDM *mrdm = (MultiresDM*)dm;
-	Mesh *me = mrdm->ob->data;
-
-	if(!mrdm->vert_face_map)
-		create_vert_face_map(&mrdm->vert_face_map, &mrdm->vert_face_map_mem, me->mface,
-				     me->totvert, me->totface);
-
-	return mrdm->vert_face_map;
-}
-
-ListBase *MultiresDM_get_vert_edge_map(DerivedMesh *dm)
-{
-	MultiresDM *mrdm = (MultiresDM*)dm;
-	Mesh *me = mrdm->ob->data;
-
-	if(!mrdm->vert_edge_map)
-		create_vert_edge_map(&mrdm->vert_edge_map, &mrdm->vert_edge_map_mem, me->medge,
-				     me->totvert, me->totedge);
-
-	return mrdm->vert_edge_map;
-}
-
-int *MultiresDM_get_face_offsets(DerivedMesh *dm)
-{
-	MultiresDM *mrdm = (MultiresDM*)dm;
-	Mesh *me = mrdm->ob->data;
-	int i, accum = 0;
-
-	if(!mrdm->face_offsets) {
-		int len = (int)pow(2, mrdm->lvl - 2) - 1;
-		int area = len * len;
-		int t = 1 + len * 3 + area * 3, q = t + len + area;
-
-		mrdm->face_offsets = MEM_callocN(sizeof(int) * me->totface, "mrdm face offsets");
-		for(i = 0; i < me->totface; ++i) {
-			mrdm->face_offsets[i] = accum;
-
-			accum += (me->mface[i].v4 ? q : t);
-		}
-	}
-
-	return mrdm->face_offsets;
-}
-
-void MultiresDM_mark_as_modified(DerivedMesh *dm)
-{
-	((MultiresDM*)dm)->modified = 1;
-}

Modified: branches/sculpt25/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/sculpt25/source/blender/blenkernel/intern/customdata.c	2009-11-25 13:40:43 UTC (rev 24885)
+++ branches/sculpt25/source/blender/blenkernel/intern/customdata.c	2009-11-25 14:07:12 UTC (rev 24886)
@@ -381,6 +381,7 @@
 		osf[i] = default_osf;
 }
 
+#if 0
 /* Adapted from sculptmode.c */
 static void mdisps_bilinear(float out[3], float (*disps)[3], int st, float u, float v)
 {
@@ -426,9 +427,12 @@
 
 	add_v3_v3v3(out, d2[0], d2[1]);
 }
+#endif
 
 static void layerSwap_mdisps(void *data, int *ci)
 {
+	// XXX
+#if 0
 	MDisps *s = data;
 	float (*d)[3] = NULL;
 	int x, y, st;
@@ -447,11 +451,14 @@
 	if(s->disps)
 		MEM_freeN(s->disps);
 	s->disps = d;
+#endif
 }
 
 static void layerInterp_mdisps(void **sources, float *weights, float *sub_weights,
 			       int count, void *dest)
 {
+	// XXX
+#if 0
 	MDisps *d = dest;
 	MDisps *s = NULL;
 	int st, stl;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list