[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15649] branches/soc-2008-nicholasbishop/ source/blender/blenkernel: Updating for all multires levels should work now .
Nicholas Bishop
nicholasbishop at gmail.com
Sun Jul 20 07:41:55 CEST 2008
Revision: 15649
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15649
Author: nicholasbishop
Date: 2008-07-20 07:41:55 +0200 (Sun, 20 Jul 2008)
Log Message:
-----------
Updating for all multires levels should work now.
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-07-20 05:01:29 UTC (rev 15648)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-07-20 05:41:55 UTC (rev 15649)
@@ -97,6 +97,7 @@
int MultiresDM_get_totorco(struct DerivedMesh *);
int MultiresDM_get_totored(struct DerivedMesh *);
void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
+void MultiresDM_block_update(struct DerivedMesh *);
/* Modifier */
struct MDisps;
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c 2008-07-20 05:01:29 UTC (rev 15648)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c 2008-07-20 05:41:55 UTC (rev 15649)
@@ -1170,6 +1170,7 @@
IndexNode *vert_face_map_mem;
Mesh *me;
+ int block_update;
void (*update)(DerivedMesh*);
} MultiresDM;
@@ -1179,7 +1180,7 @@
MultiresDM *mrdm = (MultiresDM*)dm;
/* Before freeing, need to update the displacement map */
- if(dm->needsFree)
+ if(dm->needsFree && !mrdm->block_update)
mrdm->update(dm);
if(DM_release(dm)) {
@@ -1269,6 +1270,7 @@
mrdm->lvl = lvl;
mrdm->totlvl = totlvl;
mrdm->subco = MEM_callocN(sizeof(float)*3*numVerts, "multires subdivided coords");
+ mrdm->block_update = 0;
MultiresDM_calc_norm(mrdm);
@@ -1358,3 +1360,8 @@
return mrdm->vert_face_map;
}
+
+void MultiresDM_block_update(DerivedMesh *dm)
+{
+ ((MultiresDM*)dm)->block_update = 1;
+}
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-07-20 05:01:29 UTC (rev 15648)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-07-20 05:41:55 UTC (rev 15649)
@@ -1403,7 +1403,7 @@
}
void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, int lvl, int totlvl,
- int totsubvert, int totsubedge, int totsubface)
+ int totsubvert, int totsubedge, int totsubface, MVert *addverts)
{
DerivedMesh *mrdm;
MultiresModifierData mmd_sub;
@@ -1585,6 +1585,11 @@
}
}
+ if(addverts) {
+ for(i = 0; i < totvert; ++i)
+ VecAddf(mvd[i].co, mvd[i].co, addverts[i].co);
+ }
+
final->needsFree = 1;
final->release(final);
mrdm->needsFree = 1;
@@ -1653,7 +1658,7 @@
orig = CDDM_from_mesh(me, NULL);
- multires_subdisp(orig, me, final, mmd->totlvl - 1, mmd->totlvl, totsubvert, totsubedge, totsubface);
+ multires_subdisp(orig, me, final, mmd->totlvl - 1, mmd->totlvl, totsubvert, totsubedge, totsubface, NULL);
orig->needsFree = 1;
orig->release(orig);
@@ -1909,6 +1914,48 @@
d.subco = MultiresDM_get_subco(dm);
+ if(lvl < totlvl) {
+ /* Propagate disps upwards */
+ Mesh *me = MultiresDM_get_mesh(dm);
+ DerivedMesh *orig = CDDM_from_mesh(me, NULL), *orig_mrdm, *final, *orig_top_mrdm;
+ MultiresModifierData mmd;
+ MVert *verts_orig, *verts_new, *orig_top_verts;
+
+ /* Regenerate the vertex coords at the top level using the unmodified disps */
+ mmd.totlvl = totlvl;
+ mmd.lvl = totlvl;
+ orig_top_mrdm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
+ MultiresDM_block_update(orig_top_mrdm);
+ orig_top_verts = CDDM_get_verts(orig_top_mrdm);
+
+ /* Regenerate the current level as a MultiresDM using the unmodified disps */
+ mmd.totlvl = totlvl;
+ mmd.lvl = lvl;
+ orig_mrdm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
+ MultiresDM_block_update(orig_mrdm);
+
+ /* Subtract the original vertex cos from the new vertex cos */
+ verts_orig = CDDM_get_verts(orig_mrdm);
+ verts_new = CDDM_get_verts(dm);
+ for(i = 0; i < dm->getNumVerts(dm); ++i)
+ VecSubf(verts_new[i].co, verts_new[i].co, verts_orig[i].co);
+
+ orig_mrdm->release(orig_mrdm);
+
+ final = multires_subdisp_pre(dm, totlvl - lvl);
+
+ // ?
+ orig->release(orig);
+ orig = CDDM_from_mesh(me, NULL);
+
+ multires_subdisp(orig, me, final, lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm),
+ dm->getNumFaces(dm), orig_top_verts);
+ orig->release(orig);
+ orig_top_mrdm->release(orig_top_mrdm);
+
+ return;
+ }
+
/* Update the current level */
for(i = 0; i < MultiresDM_get_totorfa(dm); ++i) {
const int numVerts = mface[i].v4 ? 4 : 3;
@@ -1971,15 +2018,6 @@
++mvert;
++d.subco;
}
-
- if(lvl < totlvl) {
- /* Propagate disps upwards */
- Mesh *me = MultiresDM_get_mesh(dm);
- DerivedMesh *orig = CDDM_from_mesh(me, NULL);
- multires_subdisp(orig, me, multires_subdisp_pre(dm, totlvl - lvl),
- lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm), dm->getNumFaces(dm));
- orig->release(orig);
- }
}
}
More information about the Bf-blender-cvs
mailing list