Revision: 15297
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15297
Author:   nicholasbishop
Date:     2008-06-21 20:20:32 +0200 (Sat, 21 Jun 2008)

Log Message:
-----------
Displacements over subdivided edges work correctly now (both for display and 
updating the highest level.)

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
    
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
    
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/subsurf_ccg.c

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-06-21 14:31:38 UTC (rev 15296)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-06-21 18:20:32 UTC (rev 15297)
@@ -29,7 +29,9 @@
 
 struct CustomData;
 struct EditMesh;
+struct MCol;
 struct Multires;
+struct MultiresColFace;
 struct MultiresLevel;
 struct Mesh;
 struct Object;
@@ -53,7 +55,7 @@
 void multires_delete_layer(struct Mesh *me, struct CustomData *cd, const int 
type, int n);
 void multires_add_layer(struct Mesh *me, struct CustomData *cd, const int 
type, const int n);
 void multires_del_lower_customdata(struct Multires *mr, struct MultiresLevel 
*cr_lvl);
-void multires_to_mcol(struct MultiresColFace *f, MCol mcol[4]);
+void multires_to_mcol(struct MultiresColFace *f, struct MCol *mcol);
 /* After adding or removing vcolor layers, run this */
 void multires_load_cols(struct Mesh *me);
 
@@ -69,24 +71,37 @@
 
 struct DerivedMesh;
 struct MFace;
+struct MEdge;
 
+typedef struct IndexNode {
+       struct IndexNode *next, *prev;
+       int index;
+} IndexNode;
+
+void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace 
*mface,
+                         const int totvert, const int totface);
+
 /* 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 *);
+struct MEdge *MultiresDM_get_ored(struct DerivedMesh *);
+struct ListBase *MultiresDM_get_vert_face_map(struct DerivedMesh *);
 int MultiresDM_get_totlvl(struct DerivedMesh *);
 int MultiresDM_get_lvl(struct DerivedMesh *);
 int MultiresDM_get_totorfa(struct DerivedMesh *);
+int MultiresDM_get_totored(struct DerivedMesh *);
 void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct 
DerivedMesh*));
 
 /* Modifier */
 struct MDisps;
+struct MFace;
 struct MultiresModifierData;
 typedef struct MultiresDisplacer {
        struct MDisps *grid;
+       struct MFace *face;
        float mat[3][3];
-       int sides;
        int spacing;
        int sidetot;
        int sidendx;
@@ -94,6 +109,7 @@
        int invert;
        float (*orco)[3];
        float (*subco)[3];
+       float weight;
 
        int x, y, ax, ay;
 } MultiresDisplacer;
@@ -104,7 +120,9 @@
 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);
+                            const int face_index, const int invert);
+void multires_displacer_weight(MultiresDisplacer *d, const float w);
 void multires_displacer_anchor(MultiresDisplacer *d, const int type, const int 
side_index);
+void multires_displacer_anchor_edge(MultiresDisplacer *d, const int, const 
int, const int);
 void multires_displacer_jump(MultiresDisplacer *d);
 void multires_displace(MultiresDisplacer *d, float out[3]);

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-06-21 14:31:38 UTC (rev 15296)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-06-21 18:20:32 UTC (rev 15297)
@@ -42,6 +42,7 @@
 #include "BKE_displist.h"
 #include "BKE_global.h"
 #include "BKE_mesh.h"
+#include "BKE_multires.h"
 #include "BKE_utildefines.h"
 
 #include "BLI_arithb.h"
@@ -1148,9 +1149,15 @@
        int lvl, totlvl;
        float (*orco)[3];
        float (*subco)[3];
+       MEdge *ored;
        MFace *orfa;
+       int totorco;
+       int totored;
        int totorfa;
 
+       ListBase *vert_face_map;
+       IndexNode *vert_face_map_mem;
+
        void (*update)(DerivedMesh*);
 } MultiresDM;
 
@@ -1163,9 +1170,14 @@
                mrdm->update(dm);
 
        if(DM_release(dm)) {
+               MEM_freeN(mrdm->ored);
                MEM_freeN(mrdm->orfa);
                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);
                MEM_freeN(mrdm);
        }
 }
@@ -1197,8 +1209,11 @@
                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->totorco = orig->getNumVerts(orig);
                mrdm->orfa = 
MEM_dupallocN(CustomData_get_layer(&orig->faceData, CD_MFACE));
                mrdm->totorfa = orig->getNumFaces(orig);
+               mrdm->ored = 
MEM_dupallocN(CustomData_get_layer(&orig->edgeData, CD_MEDGE));
+               mrdm->totored = orig->getNumEdges(orig);
        }
        else
                DM_init(dm, numVerts, numEdges, numFaces);
@@ -1241,6 +1256,16 @@
        return ((MultiresDM*)dm)->totorfa;
 }
 
+MEdge *MultiresDM_get_ored(DerivedMesh *dm)
+{
+       return ((MultiresDM*)dm)->ored;
+}
+
+int MultiresDM_get_totored(struct DerivedMesh *dm)
+{
+       return ((MultiresDM*)dm)->totored;
+}
+
 int MultiresDM_get_totlvl(DerivedMesh *dm)
 {
        return ((MultiresDM*)dm)->totlvl;
@@ -1260,3 +1285,14 @@
 {
        ((MultiresDM*)dm)->update = update;
 }
+
+ListBase *MultiresDM_get_vert_face_map(DerivedMesh *dm)
+{
+       MultiresDM *mrdm = (MultiresDM*)dm;
+
+       if(!mrdm->vert_face_map)
+               create_vert_face_map(&mrdm->vert_face_map, 
&mrdm->vert_face_map_mem, mrdm->orfa,
+                                    mrdm->totorco, mrdm->totorfa);
+
+       return mrdm->vert_face_map;
+}

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-06-21 14:31:38 UTC (rev 15296)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-06-21 18:20:32 UTC (rev 15297)
@@ -1309,6 +1309,24 @@
        }
 }
 
+void create_vert_face_map(ListBase **map, IndexNode **mem, const MFace *mface, 
const int totvert, const int totface)
+{
+       int i,j;
+       IndexNode *node = NULL;
+       
+       (*map) = MEM_callocN(sizeof(ListBase) * totvert, "vert face map");
+       (*mem) = MEM_callocN(sizeof(IndexNode) * totface*4, "vert face map 
mem");
+       node = *mem;
+       
+       /* Find the users */
+       for(i = 0; i < totface; ++i){
+               for(j = 0; j < (mface[i].v4?4:3); ++j, ++node) {
+                       node->index = i;
+                       BLI_addtail(&(*map)[((unsigned int*)(&mface[i]))[j]], 
node);
+               }
+       }
+}
+
 /* MULTIRES MODIFIER */
 static const int multires_max_levels = 13;
 static const int multires_quad_tot[] = {4, 9, 25, 81, 289, 1089, 4225, 16641, 
66049, 263169, 1050625, 4198401, 16785409};
@@ -1414,29 +1432,31 @@
 }
 
 void multires_displacer_init(MultiresDisplacer *d, DerivedMesh *dm,
-                            const int face_index, const int sides, const int 
invert)
+                            const int face_index, const int invert)
 {
-       MFace *face;
        float inv[3][3];
 
-       face = MultiresDM_get_orfa(dm) + face_index;
+       d->face = MultiresDM_get_orfa(dm) + face_index;
        /* Get the multires grid from customdata and calculate the TS matrix */
        d->grid = (MDisps*)dm->getFaceDataArray(dm, CD_MDISPS);
        if(d->grid)
                d->grid += face_index;
-       d->subco = MultiresDM_get_subco(dm);
-       calc_face_ts_mat_dm(d->mat, MultiresDM_get_orco(dm), face);
+       calc_face_ts_mat_dm(d->mat, MultiresDM_get_orco(dm), d->face);
        if(invert) {
                Mat3Inv(inv, d->mat);
                Mat3CpyMat3(d->mat, inv);
        }
 
-       d->sides = sides;
        d->spacing = pow(2, MultiresDM_get_totlvl(dm) - MultiresDM_get_lvl(dm));
        d->sidetot = multires_side_tot[MultiresDM_get_totlvl(dm) - 1];
        d->invert = invert;
 }
 
+void multires_displacer_weight(MultiresDisplacer *d, const float w)
+{
+       d->weight = w;
+}
+
 void multires_displacer_anchor(MultiresDisplacer *d, const int type, const int 
side_index)
 {
        d->sidendx = side_index;
@@ -1476,6 +1496,46 @@
        d->ay = d->y;
 }
 
+void multires_displacer_anchor_edge(MultiresDisplacer *d, int v1, int v2, int 
x)
+{
+       const int mov = d->spacing * x;
+
+       d->type = 4;
+
+       if(v1 == d->face->v1) {
+               d->x = 0;
+               d->y = 0;
+               if(v2 == d->face->v2)
+                       d->x += mov;
+               else
+                       d->y += mov;
+       }
+       else if(v1 == d->face->v2) {
+               d->x = d->sidetot - 1;
+               d->y = 0;
+               if(v2 == d->face->v1)
+                       d->x -= mov;
+               else
+                       d->y += mov;
+       }
+       else if(v1 == d->face->v3) {
+               d->x = d->sidetot - 1;
+               d->y = d->sidetot - 1;
+               if(v2 == d->face->v2)
+                       d->y -= mov;
+               else
+                       d->x -= mov;
+       }
+       else if(v1 == d->face->v4) {
+               d->x = 0;
+               d->y = d->sidetot - 1;
+               if(v2 == d->face->v3)
+                       d->x += mov;
+               else
+                       d->y -= mov;
+       }
+}
+
 void multires_displacer_jump(MultiresDisplacer *d)
 {
        if(d->sidendx == 0) {
@@ -1505,10 +1565,8 @@
 
        data = d->grid->disps[d->y * d->sidetot + d->x];
 
-       if(d->invert) {
+       if(d->invert)
                VecSubf(disp, co, *d->subco);
-               ++d->subco;
-       }
        else
                VecCopyf(disp, data);
 
@@ -1518,8 +1576,11 @@
                VecCopyf(data, disp);
                
        }
-       else
+       else {
+               if(d->type == 4)
+                       VecMulf(disp, d->weight);
                VecAddf(co, co, disp);
+       }
 
        if(d->type == 2) {
                if(d->sidendx == 0)
@@ -1547,6 +1608,7 @@
 {
        MDisps *mdisps;
        MVert *mvert;
+       MEdge *medge;
        MFace *mface;
        int i;
 
@@ -1557,29 +1619,34 @@
        
        if(mdisps) {
                MultiresDisplacer d;
-               float (*subco)[3] = MultiresDM_get_subco(dm);
+               const int gridFaces = 
multires_side_tot[MultiresDM_get_totlvl(dm) - 2] - 1;
+               const int edgeSize = 
multires_side_tot[MultiresDM_get_totlvl(dm) - 1] - 1;
+               ListBase *map = MultiresDM_get_vert_face_map(dm);
+               int S, x, y;
                
                mvert = CDDM_get_verts(dm);
+               medge = MultiresDM_get_ored(dm);
                mface = MultiresDM_get_orfa(dm);
 
+               d.subco = MultiresDM_get_subco(dm);
+
                /* For now just handle top-level sculpts */
                for(i = 0; i < MultiresDM_get_totorfa(dm); ++i) {
-                       int gridFaces = 
multires_side_tot[MultiresDM_get_totlvl(dm) - 2] - 1;
                        const int numVerts = mface[i].v4 ? 4 : 3;
-                       int S, x, y;
                        
                        // convert from mvert->co to disps
-                       multires_displacer_init(&d, dm, i, numVerts, 1);
-                       d.subco = subco;
+                       multires_displacer_init(&d, dm, i, 1);
                        multires_displacer_anchor(&d, 1, 0);
                        multires_displace(&d, mvert->co);
                        ++mvert;
+                       ++d.subco;
 
                        for(S = 0; S < numVerts; ++S) {
                                multires_displacer_anchor(&d, 2, S);
                                for(x = 1; x < gridFaces; ++x) {
                                        multires_displace(&d, mvert->co);
                                        ++mvert;
+                                       ++d.subco;
                                }
                        }
 
@@ -1589,12 +1656,30 @@
                                        for(x = 1; x < gridFaces; x++) {
                                                multires_displace(&d, 
mvert->co);
                                                ++mvert;
+                                               ++d.subco;
                                        }
                                        multires_displacer_jump(&d);
                                }
                        }
+               }
 
-                       subco = d.subco;
+               for(i = 0; i < MultiresDM_get_totored(dm); ++i) {

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