[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