Revision: 15539
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15539
Author:   nicholasbishop
Date:     2008-07-12 05:30:49 +0200 (Sat, 12 Jul 2008)

Log Message:
-----------
* Turned off multires updates if mode isn't sculptmode
* Changed displacement matrices so that edges of faces deform more smoothly
* Force a displacement update on leaving sculptmode

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/src/sculptmode.c

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-07-12 01:53:25 UTC (rev 15538)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h   
2008-07-12 03:30:49 UTC (rev 15539)
@@ -83,6 +83,7 @@
 
 /* MultiresDM */
 struct DerivedMesh *MultiresDM_new(struct DerivedMesh*, int, int, int, int, 
int);
+void *MultiresDM_get_vertnorm(struct DerivedMesh *);
 void *MultiresDM_get_orco(struct DerivedMesh *);
 void *MultiresDM_get_subco(struct DerivedMesh *);
 struct MFace *MultiresDM_get_orfa(struct DerivedMesh *);
@@ -103,6 +104,12 @@
        struct MDisps *grid;
        struct MFace *face;
        float mat[3][3];
+       
+       /* For matrix calc */
+       float mat_target[3];
+       float mat_center[3];
+       float (*mat_norms)[3];
+
        int spacing;
        int sidetot;
        int sidendx;

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-07-12 01:53:25 UTC (rev 15538)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
   2008-07-12 03:30:49 UTC (rev 15539)
@@ -1164,6 +1164,8 @@
        int totored;
        int totorfa;
 
+       float (*norm)[3];
+
        ListBase *vert_face_map;
        IndexNode *vert_face_map_mem;
 
@@ -1183,6 +1185,7 @@
                MEM_freeN(mrdm->orfa);
                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,6 +1194,32 @@
        }
 }
 
+static void MultiresDM_calc_norm(MultiresDM *mrdm)
+{
+       float (*v)[3] = mrdm->orco;
+       int i;
+
+       mrdm->norm = MEM_callocN(sizeof(float)*3 * mrdm->totorco, "MultiresDM 
vertnorms");
+
+       for(i = 0; i < mrdm->totorfa; ++i) {
+               MFace *f = &mrdm->orfa[i];
+               float n[3];
+               if(f->v4)
+                       CalcNormFloat4(v[f->v1], v[f->v2], v[f->v3], v[f->v4], 
n);
+               else
+                       CalcNormFloat(v[f->v1], v[f->v2], v[f->v3], n);
+               
+               VecAddf(mrdm->norm[f->v1], mrdm->norm[f->v1], n);
+               VecAddf(mrdm->norm[f->v2], mrdm->norm[f->v2], n);
+               VecAddf(mrdm->norm[f->v3], mrdm->norm[f->v3], n);
+               if(f->v4)
+                       VecAddf(mrdm->norm[f->v4], mrdm->norm[f->v4], n);
+       }
+
+       for(i = 0; i < mrdm->totorco; ++i)
+               Normalize(mrdm->norm[i]);
+}
+
 DerivedMesh *MultiresDM_new(DerivedMesh *orig, int numVerts, int numEdges, int 
numFaces, int lvl, int totlvl)
 {
        MultiresDM *mrdm = MEM_callocN(sizeof(MultiresDM), "MultiresDM");
@@ -1239,11 +1268,18 @@
        mrdm->totlvl = totlvl;
        mrdm->subco = MEM_callocN(sizeof(float)*3*numVerts, "multires 
subdivided coords");
 
+       MultiresDM_calc_norm(mrdm);
+
        dm->release = MultiresDM_release;
 
        return dm;
 }
 
+void *MultiresDM_get_vertnorm(DerivedMesh *dm)
+{
+       return ((MultiresDM*)dm)->norm;
+}
+
 void *MultiresDM_get_orco(DerivedMesh *dm)
 {
        return ((MultiresDM*)dm)->orco;

Modified: 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-07-12 01:53:25 UTC (rev 15538)
+++ 
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c    
    2008-07-12 03:30:49 UTC (rev 15539)
@@ -1384,6 +1384,12 @@
        calc_face_ts_mat(out, orco[f->v1], orco[f->v2], orco[f->v3], (f->v4 ? 
orco[f->v4] : NULL));
 }
 
+static void calc_face_ts_partial(float center[3], float target[3], float 
norm[][3], float (*orco)[3], MFace *f)
+{
+       face_center(center, orco[f->v1], orco[f->v2], orco[f->v3], (f->v4 ? 
orco[f->v4] : NULL));
+       VecCopyf(target, orco[f->v1]);
+}
+
 void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob)
 {
        DerivedMesh *final = NULL;
@@ -1600,6 +1606,9 @@
                Mat3CpyMat3(d->mat, inv);
        }
 
+       calc_face_ts_partial(d->mat_center, d->mat_target, d->mat_norms, 
MultiresDM_get_orco(dm), d->face);
+       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_totlvl(dm) - 1];
        d->invert = invert;
@@ -1738,8 +1747,26 @@
        else
                VecCopyf(disp, data);
 
-       Mat3MulVecfl(d->mat, disp);
+       {
+               float mat[3][3], inv[3][3];
+               float n1[3], n2[3], norm[3];
+               float l1 = d->y / (1.0 * d->sidetot);
+               float l2 = d->x / (1.0 * d->sidetot);
 
+               VecLerpf(n1, d->mat_norms[d->face->v1], 
d->mat_norms[d->face->v4], l1);
+               VecLerpf(n2, d->mat_norms[d->face->v2], 
d->mat_norms[d->face->v3], l1);
+               VecLerpf(norm, n1, n2, l2);
+
+               calc_ts_mat(mat, d->mat_center, d->mat_target, norm);
+               if(d->invert) {
+                       Mat3Inv(inv, mat);
+                       Mat3CpyMat3(mat, inv);
+               }
+                       
+
+               Mat3MulVecfl(mat, disp);
+       }
+
        if(d->invert) {
                VecCopyf(data, disp);
                
@@ -1780,6 +1807,8 @@
        MFace *mface;
        int i;
 
+       if(!(G.f & G_SCULPTMODE)) return;
+
        mdisps = dm->getFaceDataArray(dm, CD_MDISPS);
 
        if(mdisps) {

Modified: branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c    
2008-07-12 01:53:25 UTC (rev 15538)
+++ branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c    
2008-07-12 03:30:49 UTC (rev 15539)
@@ -65,6 +65,7 @@
 #include "BKE_main.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
+#include "BKE_multires.h"
 #include "BKE_sculpt.h"
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
@@ -112,13 +113,6 @@
  *
  */
 
-/* Used by vertex_users to store face indices in a list */
-typedef struct IndexNode {
-       struct IndexNode* next,* prev;
-       int Index;
-} IndexNode;
-
-
 /* ActiveData stores an Index into the mvert array of Mesh, plus Fade, which
    stores how far the vertex is from the brush center, scaled to the range 
[0,1]. */
 typedef struct ActiveData {
@@ -234,7 +228,7 @@
        /* Find the users */
        for(i=0; i<ss->totface; ++i){
                for(j=0; j<(ss->mface[i].v4?4:3); ++j, ++node) {
-                       node->Index=i;
+                       node->index=i;
                        BLI_addtail(&ss->vertex_users[((unsigned 
int*)(&ss->mface[i]))[j]], node);
                }
        }
@@ -525,7 +519,7 @@
        }
 
        while(node){
-               f= &ss->mface[node->Index];
+               f= &ss->mface[node->index];
                
                if(f->v4) {
                        skip= (f->v1==vert?2:
@@ -1114,8 +1108,8 @@
                while(face){
                        float *fn = NULL;
                        if(ss->face_normals)
-                               fn = &ss->face_normals[face->Index*3];
-                       add_face_normal(&norm, ss->mvert, 
&ss->mface[face->Index], fn);
+                               fn = &ss->face_normals[face->index*3];
+                       add_face_normal(&norm, ss->mvert, 
&ss->mface[face->index], fn);
                        face= face->next;
                }
                Normalize(&norm.x);
@@ -1863,13 +1857,16 @@
 void set_sculptmode(void)
 {
        if(G.f & G_SCULPTMODE) {
-               Mesh *me= get_mesh(OBACT);
+               Object *ob = OBACT;
+               Mesh *me= get_mesh(ob);
+
+               multires_force_update(ob);
                
                G.f &= ~G_SCULPTMODE;
 
                sculptsession_free(G.scene);
                if(me && me->pv) 
-                       mesh_pmv_off(OBACT, me);
+                       mesh_pmv_off(ob, me);
        } 
        else {
                G.f |= G_SCULPTMODE;


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

Reply via email to