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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to