[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15539] branches/soc-2008-nicholasbishop/ source/blender: * Turned off multires updates if mode isn't sculptmode
Nicholas Bishop
nicholasbishop at gmail.com
Sat Jul 12 05:30:57 CEST 2008
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;
More information about the Bf-blender-cvs
mailing list