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

Brecht Van Lommel brecht at blender.org
Wed Nov 25 14:11:44 CET 2009


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

Log Message:
-----------
Sculpt: Subsurf

* Now uses the CCG DerivedMesh also in object mode, used to be edit mode only.
* Create CD_ORIGINDEX layer on demand, to save memory.
* Removed ss_to_cdderivedmesh function, and instead create ccgdm and then
  convert that to cddm, to avoid code duplication.
* Added and implement DerivedMesh interface functions to obtain face grids.
* Store edge/face flags more memory efficient.
* Export CCGDerivedMesh struct in BKE_subsurf.h

Modified Paths:
--------------
    branches/sculpt25/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/sculpt25/source/blender/blenkernel/BKE_subsurf.h
    branches/sculpt25/source/blender/blenkernel/intern/DerivedMesh.c
    branches/sculpt25/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/sculpt25/source/blender/blenkernel/intern/multires.c
    branches/sculpt25/source/blender/blenkernel/intern/particle_system.c
    branches/sculpt25/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/sculpt25/source/blender/editors/mesh/editface.c
    branches/sculpt25/source/blender/editors/sculpt_paint/sculpt.c

Modified: branches/sculpt25/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/sculpt25/source/blender/blenkernel/BKE_DerivedMesh.h	2009-11-25 12:27:21 UTC (rev 24882)
+++ branches/sculpt25/source/blender/blenkernel/BKE_DerivedMesh.h	2009-11-25 13:11:44 UTC (rev 24883)
@@ -67,6 +67,16 @@
 #define SUB_ELEMS_EDGE 2
 #define SUB_ELEMS_FACE 4
 
+typedef struct DMGridData {
+	float co[3];
+	float no[3];
+} DMGridData;
+
+typedef struct DMGridAdjacency {
+	int index[4];
+	int rotation[4];
+} DMGridAdjacency;
+
 typedef struct DerivedMesh DerivedMesh;
 struct DerivedMesh {
 	/* Private DerivedMesh data, only for internal DerivedMesh use */
@@ -135,6 +145,12 @@
 	void *(*getEdgeDataArray)(DerivedMesh *dm, int type);
 	void *(*getFaceDataArray)(DerivedMesh *dm, int type);
 
+	/* optional grid access for subsurf */
+	int (*getNumGrids)(DerivedMesh *dm);
+	int (*getGridSize)(DerivedMesh *dm);
+	DMGridData **(*getGridData)(DerivedMesh *dm);
+	DMGridAdjacency *(*getGridAdjacency)(DerivedMesh *dm);
+
 	/* Iterate over each mapped vertex in the derived mesh, calling the
 	 * given function with the original vert and the mapped vert's new
 	 * coordinate and normal. For historical reasons the normal can be
@@ -189,7 +205,7 @@
 
 	/* Get the BVH used for paint modes
 	 */
-	struct PBVH *(*getPBVH)(DerivedMesh *dm);
+	struct PBVH *(*getPBVH)(struct Object *ob, DerivedMesh *dm);
 
 	/* Drawing Operations */
 

Modified: branches/sculpt25/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- branches/sculpt25/source/blender/blenkernel/BKE_subsurf.h	2009-11-25 12:27:21 UTC (rev 24882)
+++ branches/sculpt25/source/blender/blenkernel/BKE_subsurf.h	2009-11-25 13:11:44 UTC (rev 24883)
@@ -34,21 +34,60 @@
 struct EditMesh;
 struct MultiresSubsurf;
 struct SubsurfModifierData;
+struct _CCGSubsurf;
+struct _CCGVert;
+struct _CCGEdge;
+struct _CCGFace;
+struct PBVH;
+struct DMGridData;
+struct DMGridAdjacency;
 
+/**************************** External *****************************/
+
 struct DerivedMesh *subsurf_make_derived_from_derived(
                         struct DerivedMesh *dm,
                         struct SubsurfModifierData *smd,
                         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 MultiresSubsurf *ms,
-                        int useRenderParams, float (*vertCos)[3],
-                        int isFinalCalc, int editMode);
-
 void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]);
 
+/**************************** Internal *****************************/
+
+typedef struct CCGDerivedMesh {
+	DerivedMesh dm;
+
+	struct _CCGSubSurf *ss;
+	int freeSS;
+	int drawInteriorEdges, useSubsurfUv;
+
+	struct {int startVert; struct _CCGVert *vert;} *vertMap;
+	struct {int startVert; int startEdge; struct _CCGEdge *edge;} *edgeMap;
+	struct {int startVert; int startEdge;
+	        int startFace; struct _CCGFace *face;} *faceMap;
+
+	short *edgeFlags;
+	char *faceFlags;
+
+	struct PBVH *pbvh;
+
+	struct DMGridData **gridData;
+	struct DMGridAdjacency *gridAdjacency;
+	struct _CCGFace **gridFaces;
+
+	struct {
+		struct MultiresModifierData *mmd;
+		int local_mmd;
+
+		int lvl, totlvl;
+		float (*orco)[3];
+
+		Object *ob;
+		int modified;
+
+		void (*update)(DerivedMesh*);
+	} multires;
+} CCGDerivedMesh;
+
 #endif
 

Modified: branches/sculpt25/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/sculpt25/source/blender/blenkernel/intern/DerivedMesh.c	2009-11-25 12:27:21 UTC (rev 24882)
+++ branches/sculpt25/source/blender/blenkernel/intern/DerivedMesh.c	2009-11-25 13:11:44 UTC (rev 24883)
@@ -1886,7 +1886,7 @@
 
 				mask &= ~CD_MASK_ORCO;
 				DM_set_only_copy(orcodm, mask);
-				ndm = mti->applyModifier(md, ob, orcodm, useRenderParams, !inputVertexCos);
+				ndm = mti->applyModifier(md, ob, orcodm, useRenderParams, 0);
 
 				if(ndm) {
 					/* if the modifier returned a new dm, release the old one */

Modified: branches/sculpt25/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/sculpt25/source/blender/blenkernel/intern/cdderivedmesh.c	2009-11-25 12:27:21 UTC (rev 24882)
+++ branches/sculpt25/source/blender/blenkernel/intern/cdderivedmesh.c	2009-11-25 13:11:44 UTC (rev 24883)
@@ -184,21 +184,21 @@
 	if(!cddm->fmap) {
 		create_vert_face_map(&cddm->fmap, &cddm->fmap_mem, cddm->mface,
 				     dm->getNumVerts(dm), dm->getNumFaces(dm));
-		printf("rebuild fmap\n");
 	}
 
 	return cddm->fmap;
 }
 
-static struct PBVH *cdDM_getPBVH(DerivedMesh *dm)
+static struct PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
 
-	if(!cddm->pbvh) {
+	if(!cddm->pbvh && ob->type == OB_MESH) {
+		Mesh *me= ob->data;
+
 		cddm->pbvh = BLI_pbvh_new();
-		BLI_pbvh_build(cddm->pbvh, cddm->mface, cddm->mvert,
-			       dm->getNumFaces(dm), dm->getNumVerts(dm));
-		printf("rebuild pbvh\n");
+		BLI_pbvh_build(cddm->pbvh, me->mface, me->mvert,
+			       me->totface, me->totvert);
 	}
 
 	return cddm->pbvh;
@@ -1627,6 +1627,11 @@
 	int numEdges = source->numEdgeData;
 	int numFaces = source->numFaceData;
 
+	/* ensure these are created if they are made on demand */
+	source->getVertDataArray(source, CD_ORIGINDEX);
+	source->getEdgeDataArray(source, CD_ORIGINDEX);
+	source->getFaceDataArray(source, CD_ORIGINDEX);
+
 	/* this initializes dm, and copies all non mvert/medge/mface layers */
 	DM_from_template(dm, source, numVerts, numEdges, numFaces);
 	dm->deformedOnly = source->deformedOnly;

Modified: branches/sculpt25/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/sculpt25/source/blender/blenkernel/intern/multires.c	2009-11-25 12:27:21 UTC (rev 24882)
+++ branches/sculpt25/source/blender/blenkernel/intern/multires.c	2009-11-25 13:11:44 UTC (rev 24883)
@@ -193,7 +193,7 @@
 	if(simple)
 		smd.subdivType = ME_SIMPLE_SUBSURF;
 
-	final = subsurf_make_derived_from_derived_with_multires(mrdm, &smd, NULL, 0, NULL, 0, 0);
+	final = NULL; // XXX subsurf_make_derived_from_derived_with_multires(mrdm, &smd, NULL, 0, NULL, 0, 0);
 
 	return final;
 }
@@ -1247,7 +1247,7 @@
 	smd.levels = smd.renderLevels = mmd->lvl - 1;
 	smd.flags |= eSubsurfModifierFlag_SubsurfUv;
 
-	result = subsurf_make_derived_from_derived_with_multires(dm, &smd, &ms, useRenderParams, NULL, isFinalCalc, 0);
+	result = NULL; // XXX subsurf_make_derived_from_derived_with_multires(dm, &smd, &ms, useRenderParams, NULL, isFinalCalc, 0);
 	for(i = 0; i < result->getNumVerts(result); ++i)
 		MultiresDM_get_subco(result)[i] = CDDM_get_verts(result)[i];
 	multiresModifier_disp_run(result, MultiresDM_get_subco(result), 0);

Modified: branches/sculpt25/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- branches/sculpt25/source/blender/blenkernel/intern/particle_system.c	2009-11-25 12:27:21 UTC (rev 24882)
+++ branches/sculpt25/source/blender/blenkernel/intern/particle_system.c	2009-11-25 13:11:44 UTC (rev 24883)
@@ -287,12 +287,12 @@
 		if(psys->part->from == PART_FROM_VERT) {
 			totdmelem= dm->getNumVerts(dm);
 			totelem= me->totvert;
-			origindex= DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+			origindex= dm->getVertDataArray(dm, CD_ORIGINDEX);
 		}
 		else { /* FROM_FACE/FROM_VOLUME */
 			totdmelem= dm->getNumFaces(dm);
 			totelem= me->totface;
-			origindex= DM_get_face_data_layer(dm, CD_ORIGINDEX);
+			origindex= dm->getFaceDataArray(dm, CD_ORIGINDEX);
 		}
 	
 		nodedmelem= MEM_callocN(sizeof(LinkNode)*totdmelem, "psys node elems");
@@ -948,7 +948,8 @@
 	if(totpart==0)
 		return 0;
 
-	if (!finaldm->deformedOnly && !CustomData_has_layer( &finaldm->faceData, CD_ORIGINDEX ) ) {
+	if (!finaldm->deformedOnly && !finaldm->getFaceDataArray(finaldm, CD_ORIGINDEX)) {
+		printf("Can't create particles with the current modifier stack, disable destructive modifiers\n");
 // XXX		error("Can't paint with the current modifier stack, disable destructive modifiers");
 		return 0;
 	}

Modified: branches/sculpt25/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/sculpt25/source/blender/blenkernel/intern/subsurf_ccg.c	2009-11-25 12:27:21 UTC (rev 24882)
+++ branches/sculpt25/source/blender/blenkernel/intern/subsurf_ccg.c	2009-11-25 13:11:44 UTC (rev 24883)
@@ -53,11 +53,12 @@
 #include "BKE_subsurf.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_edgehash.h"
 #include "BLI_editVert.h"
-#include "BLI_math.h"
 #include "BLI_linklist.h"
+#include "BLI_math.h"
 #include "BLI_memarena.h"
-#include "BLI_edgehash.h"
+#include "BLI_pbvh.h"
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
@@ -68,25 +69,6 @@
 
 #include "CCGSubSurf.h"
 
-typedef struct _VertData {
-	float co[3];
-	float no[3];
-} VertData;
-
-struct CCGDerivedMesh {
-	DerivedMesh dm;
-
-	CCGSubSurf *ss;
-	int drawInteriorEdges, useSubsurfUv;
-
-	struct {int startVert; CCGVert *vert;} *vertMap;
-	struct {int startVert; int startEdge; CCGEdge *edge;} *edgeMap;
-	struct {int startVert; int startEdge;
-	        int startFace; CCGFace *face;} *faceMap;
-};
-
-typedef struct CCGDerivedMesh CCGDerivedMesh;
-
 static int ccgDM_getVertMapIndex(CCGSubSurf *ss, CCGVert *v);
 static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e);
 static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f);
@@ -136,7 +118,7 @@
 	} else {
 		ifc.vertUserSize = ifc.edgeUserSize = ifc.faceUserSize = 8;
 	}
-	ifc.vertDataSize = sizeof(VertData);
+	ifc.vertDataSize = sizeof(DMGridData);
 
 	if (useArena) {
 		CCGAllocatorIFC allocatorIFC;
@@ -156,7 +138,7 @@
 		ccgSubSurf_setUseAgeCounts(ccgSS, 1, 8, 8, 8);
 	}
 
-	ccgSubSurf_setCalcVertexNormals(ccgSS, 1, BLI_STRUCT_OFFSET(VertData, no));
+	ccgSubSurf_setCalcVertexNormals(ccgSS, 1, BLI_STRUCT_OFFSET(DMGridData, no));
 
 	return ccgSS;
 }
@@ -340,7 +322,7 @@
 	if(!dmtface || !tface)
 		return;
 
-	/* create a CCGSubsurf from uv's */
+	/* create a CCGSubSurf from uv's */
 	uvss = _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss), 0, 1, 0);
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list