Revision: 17540
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17540
Author:   nicholasbishop
Date:     2008-11-23 03:42:32 +0100 (Sun, 23 Nov 2008)

Log Message:
-----------
Better support for triangles with the new tangent calculations.

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

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-11-23 00:18:58 UTC (rev 17539)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-11-23 02:42:32 UTC (rev 17540)
@@ -56,6 +56,7 @@
 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*));

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-11-23 00:18:58 UTC (rev 17539)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-11-23 02:42:32 UTC (rev 17540)
@@ -61,6 +61,7 @@
 
 #include <string.h>
 #include <limits.h>
+#include <math.h>
 
 typedef struct {
        DerivedMesh dm;
@@ -1160,10 +1161,9 @@
        float (*orco)[3];
        MVert *subco;
 
-       float (*norm)[3];
-
        ListBase *vert_face_map, *vert_edge_map;
        IndexNode *vert_face_map_mem, *vert_edge_map_mem;
+       int *face_offsets;
 
        Mesh *me;
        int flags;
@@ -1182,7 +1182,6 @@
        if(DM_release(dm)) {
                MEM_freeN(mrdm->subco);
                MEM_freeN(mrdm->orco);
-               MEM_freeN(mrdm->norm);
                if(mrdm->vert_face_map)
                        MEM_freeN(mrdm->vert_face_map);
                if(mrdm->vert_face_map_mem)
@@ -1191,11 +1190,13 @@
                        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);
        }
 }
 
-static void MultiresDM_calc_norm(MultiresDM *mrdm)
+/*static void MultiresDM_calc_norm(MultiresDM *mrdm)
 {
        float (*v)[3] = mrdm->orco;
        int i;
@@ -1219,7 +1220,7 @@
 
        for(i = 0; i < mrdm->me->totvert; ++i)
                Normalize(mrdm->norm[i]);
-}
+}*/
 
 DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int 
numVerts, int numEdges, int numFaces)
 {
@@ -1278,16 +1279,6 @@
        return ((MultiresDM*)dm)->me;
 }
 
-void *MultiresDM_get_vertnorm(DerivedMesh *dm)
-{
-       MultiresDM *mrdm = (MultiresDM*)dm;
-
-       if(!mrdm->norm)
-               MultiresDM_calc_norm(mrdm);
-
-       return mrdm->norm;
-}
-
 void *MultiresDM_get_orco(DerivedMesh *dm)
 {
        return ((MultiresDM*)dm)->orco;
@@ -1341,6 +1332,28 @@
        return mrdm->vert_edge_map;
 }
 
+int *MultiresDM_get_face_offsets(DerivedMesh *dm)
+{
+       MultiresDM *mrdm = (MultiresDM*)dm;
+       int i, totface, 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;
+
+               totface = dm->getNumFaces(dm);
+               mrdm->face_offsets = MEM_callocN(sizeof(int) * totface, "mrdm 
face offsets");
+               for(i = 0; i < totface; ++i) {
+                       mrdm->face_offsets[i] = accum;
+
+                       accum += (mrdm->me->mface[i].v4 ? q : t);
+               }
+       }
+
+       return mrdm->face_offsets;
+}
+
 int *MultiresDM_get_flags(DerivedMesh *dm)
 {
        return &((MultiresDM*)dm)->flags;

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-11-23 00:18:58 UTC (rev 17539)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-11-23 02:42:32 UTC (rev 17540)
@@ -537,16 +537,26 @@
        int dir[4];
 } DisplacerEdges;
 
+typedef struct DisplacerSpill {
+       /* Index of face (in base mesh), -1 for none */
+       int face;
+
+       /* Spill flag */
+       /* 1 = Negative variable axis */
+       /* 2 = Near fixed axis */
+       /* 4 = Flip axes */
+       int f;
+
+       /* Neighboring edges */
+       DisplacerEdges edges;
+} DisplacerSpill;
+
 typedef struct MultiresDisplacer {
        Mesh *me;
        MDisps *grid;
        /* To be removed */
        MFace *face;
        
-       /* For matrix calc */
-       float mat_target[3];
-       float mat_center[3];
-       float (*mat_norms)[3];
        int dm_first_base_vert_index;
 
        int spacing;
@@ -554,7 +564,6 @@
        int sidendx;
        int type;
        int invert;
-       float (*orco)[3];
        MVert *subco;
        int subco_index, face_index;
        float weight;
@@ -562,15 +571,14 @@
        /* Valence for each corner */
        int valence[4];
 
-       /* Indices of neighboring faces (or -1 for no neighbor) */
-       int face_spill_x, face_spill_y;
-       /* 1 = Negative variable axis */
-       /* 2 = Near fixed axis */
-       /* 4 = Flip axes */
-       int spill_x, spill_y;
-       /* Neighboring edges for current face and spill faces */
-       DisplacerEdges edges_primary, edges_spill_x, edges_spill_y;
+       /* Neighboring edges for current face */
+       DisplacerEdges edges_primary;
 
+       /* Neighboring faces */
+       DisplacerSpill spill_x, spill_y;
+
+       int *face_offsets;
+
        int x, y, ax, ay;
 } MultiresDisplacer;
 
@@ -585,6 +593,7 @@
        ListBase *emap = MultiresDM_get_vert_edge_map(dm);
        IndexNode *n;
        int i, end = f->v4 ? 4 : 3;
+       int offset = dm->getNumVerts(dm) - d->me->totvert - d->me->totedge * 
d->interior_st;
 
        for(i = 0; i < end; ++i) {
                int vcur = mface_v(f, i);
@@ -602,7 +611,7 @@
                                        de->dir[i] = -1;
                                        de->base[i] += d->interior_st - 1;
                                }
-                               de->base[i] += d->me->totface * d->interior_st 
* d->interior_st;
+                               de->base[i] += offset;
                                break;
                        }
                }
@@ -628,9 +637,11 @@
        ListBase *map = MultiresDM_get_vert_face_map(dm);
        IndexNode *n1, *n2;
        int v4 = d->face->v4 ? d->face->v4 : d->face->v1;
-       int crn[2];
+       int crn[2], lv;
 
-       d->face_spill_x = d->face_spill_y = -1;
+       memset(&d->spill_x, 0, sizeof(DisplacerSpill));
+       memset(&d->spill_y, 0, sizeof(DisplacerSpill));
+       d->spill_x.face = d->spill_y.face = -1;
 
        for(n1 = map[d->face->v3].first; n1; n1 = n1->next) {
                if(n1->index == d->face_index)
@@ -638,60 +649,62 @@
 
                for(n2 = map[d->face->v2].first; n2; n2 = n2->next) {
                        if(n1->index == n2->index)
-                               d->face_spill_x = n1->index;
+                               d->spill_x.face = n1->index;
                }
                for(n2 = map[v4].first; n2; n2 = n2->next) {
                        if(n1->index == n2->index)
-                               d->face_spill_y = n1->index;
+                               d->spill_y.face = n1->index;
                }
        }
 
-       if(d->face_spill_x != -1) {
+       if(d->spill_x.face != -1) {
                /* Neighbor of v2/v3 found, find flip and orientation */
-               find_face_corners(&mface[d->face_spill_x], d->face->v2, 
d->face->v3, crn);
+               find_face_corners(&mface[d->spill_x.face], d->face->v2, 
d->face->v3, crn);
+               lv = mface[d->spill_x.face].v4 ? 3 : 2;
 
-               if(crn[0] == 0 && crn[1] == 3)
-                       d->spill_x = 0+2+0;
-               else if(crn[0] == 3 && crn[1] == 0)
-                       d->spill_x = 1+2+0;
+               if(crn[0] == 0 && crn[1] == lv)
+                       d->spill_x.f = 0+2+0;
+               else if(crn[0] == lv && crn[1] == 0)
+                       d->spill_x.f = 1+2+0;
                else if(crn[0] == 1 && crn[1] == 0)
-                       d->spill_x = 1+2+4;
+                       d->spill_x.f = 1+2+4;
                else if(crn[0] == 0 && crn[1] == 1)
-                       d->spill_x = 0+2+4;
+                       d->spill_x.f = 0+2+4;
                else if(crn[0] == 2 && crn[1] == 1)
-                       d->spill_x = 1+0+0;
+                       d->spill_x.f = 1+0+0;
                else if(crn[0] == 1 && crn[1] == 2)
-                       d->spill_x = 0+0+0;
+                       d->spill_x.f = 0+0+0;
                else if(crn[0] == 3 && crn[1] == 2)
-                       d->spill_x = 0+0+4;
+                       d->spill_x.f = 0+0+4;
                else if(crn[0] == 2 && crn[1] == 3)
-                       d->spill_x = 1+0+4;
+                       d->spill_x.f = 1+0+4;
 
-               find_displacer_edges(d, dm, &d->edges_spill_x, 
&mface[d->face_spill_x]);
+               find_displacer_edges(d, dm, &d->spill_x.edges, 
&mface[d->spill_x.face]);
        }
 
-       if(d->face_spill_y != -1) {
+       if(d->spill_y.face != -1) {
                /* Neighbor of v3/v4 found, find flip and orientation */
-               find_face_corners(&mface[d->face_spill_y], d->face->v3, v4, 
crn);
+               find_face_corners(&mface[d->spill_y.face], d->face->v3, v4, 
crn);
+               lv = mface[d->spill_y.face].v4 ? 3 : 2;
 
                if(crn[0] == 1 && crn[1] == 0)
-                       d->spill_y = 1+2+0;
+                       d->spill_y.f = 1+2+0;
                else if(crn[0] == 0 && crn[1] == 1)
-                       d->spill_y = 0+2+0;
+                       d->spill_y.f = 0+2+0;
                else if(crn[0] == 2 && crn[1] == 1)
-                       d->spill_y = 1+0+4;
+                       d->spill_y.f = 1+0+4;
                else if(crn[0] == 1 && crn[1] == 2)
-                       d->spill_y = 0+0+4;
+                       d->spill_y.f = 0+0+4;
                else if(crn[0] == 3 && crn[1] == 2)
-                       d->spill_y = 0+0+0;
+                       d->spill_y.f = 0+0+0;
                else if(crn[0] == 2 && crn[1] == 3)
-                       d->spill_y = 1+0+0;
-               else if(crn[0] == 0 && crn[1] == 3)
-                       d->spill_y = 0+2+4;
-               else if(crn[0] == 3 && crn[1] == 0)
-                       d->spill_y = 1+2+4;
+                       d->spill_y.f = 1+0+0;
+               else if(crn[0] == 0 && crn[1] == lv)
+                       d->spill_y.f = 0+2+4;
+               else if(crn[0] == lv && crn[1] == 0)
+                       d->spill_y.f = 1+2+4;
 
-               find_displacer_edges(d, dm, &d->edges_spill_y, 
&mface[d->face_spill_y]);
+               find_displacer_edges(d, dm, &d->spill_y.edges, 
&mface[d->spill_y.face]);
        }
 }
 
@@ -699,9 +712,11 @@
 {
        int i;
 
+       d->valence[3] = -1;
+
        /* Set the vertex valence for the corners */
        for(i = 0; i < (d->face->v4 ? 4 : 3); ++i)
-               d->valence[i] = 
BLI_countlist(&MultiresDM_get_vert_edge_map(dm)[((unsigned*)(&d->face->v1))[i]]);
+               d->valence[i] = 
BLI_countlist(&MultiresDM_get_vert_edge_map(dm)[mface_v(d->face, i)]);
 }
 
 static void multires_displacer_init(MultiresDisplacer *d, DerivedMesh *dm,
@@ -712,13 +727,12 @@
        d->me = me;
        d->face = me->mface + face_index;
        d->face_index = face_index;
+       d->face_offsets = MultiresDM_get_face_offsets(dm);
        /* Get the multires grid from customdata */
        d->grid = CustomData_get_layer(&me->fdata, CD_MDISPS);
        if(d->grid)
                d->grid += face_index;
 
-       d->mat_norms = MultiresDM_get_vertnorm(dm);
-
        d->spacing = pow(2, MultiresDM_get_totlvl(dm) - MultiresDM_get_lvl(dm));
        d->sidetot = multires_side_tot[MultiresDM_get_lvl(dm) - 1];
        d->interior_st = d->sidetot - 2;
@@ -778,41 +792,55 @@
 
 static void multires_displacer_anchor_edge(MultiresDisplacer *d, int v1, int 
v2, int x)
 {
-       const int mov = x;
-
        d->type = 4;
 
        if(v1 == d->face->v1) {
                d->x = 0;
                d->y = 0;
                if(v2 == d->face->v2)
-                       d->x += mov;
+                       d->x += x;
+               else if(v2 == d->face->v3) {
+                       if(x < d->sidetot / 2)
+                               d->y = x;
+                       else {
+                               d->x = x;
+                               d->y = d->sidetot - 1;
+                       }
+               }
                else
-                       d->y += mov;
+                       d->y += x;
        }
        else if(v1 == d->face->v2) {
                d->x = d->sidetot - 1;
                d->y = 0;
                if(v2 == d->face->v1)
-                       d->x -= mov;
+                       d->x -= x;
                else
-                       d->y += mov;
+                       d->y += x;
        }
        else if(v1 == d->face->v3) {
                d->x = d->sidetot - 1;
                d->y = d->sidetot - 1;
                if(v2 == d->face->v2)
-                       d->y -= mov;

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