[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16099] branches/soc-2008-nicholasbishop/ source/blender: For file loading and mesh joining, allow single-step subdivision (same result, just faster)
Nicholas Bishop
nicholasbishop at gmail.com
Thu Aug 14 06:14:16 CEST 2008
Revision: 16099
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16099
Author: nicholasbishop
Date: 2008-08-14 06:14:13 +0200 (Thu, 14 Aug 2008)
Log Message:
-----------
For file loading and mesh joining, allow single-step subdivision (same result, just faster)
Modified Paths:
--------------
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c
branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-08-14 03:23:36 UTC (rev 16098)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-08-14 04:14:13 UTC (rev 16099)
@@ -27,50 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-struct CustomData;
-struct EditMesh;
-struct MCol;
-struct Multires;
-struct MultiresColFace;
-struct MultiresLevel;
+struct DerivedMesh;
struct Mesh;
+struct MFace;
+struct Multires;
struct Object;
-/* Level access */
-struct MultiresLevel *multires_level_n(struct Multires *mr, int n);
-
-/* Level control */
-void multires_set_level(struct Object *ob, struct Mesh *me, const int render);
-void multires_free_level(struct MultiresLevel *lvl);
-
-void multires_edge_level_update(struct Object *ob, struct Mesh *me);
-
-void multires_free(struct Multires *mr);
-struct Multires *multires_copy(struct Multires *orig);
-void multires_create(struct Object *ob, struct Mesh *me);
-
-/* CustomData */
-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, struct MCol *mcol);
-/* After adding or removing vcolor layers, run this */
-void multires_load_cols(struct Mesh *me);
-
-/* Private (used in multires-firstlevel.c) */
-void multires_level_to_mesh(struct Object *ob, struct Mesh *me, const int render);
-void multires_update_levels(struct Mesh *me, const int render);
-void multires_update_first_level(struct Mesh *me, struct EditMesh *em);
-void multires_update_customdata(struct MultiresLevel *lvl1, struct EditMesh *em, struct CustomData *src,
- struct CustomData *dst, const int type);
-void multires_customdata_to_mesh(struct Mesh *me, struct EditMesh *em,
- struct MultiresLevel *lvl, struct CustomData *src,
- struct CustomData *dst, const int type);
-
-struct DerivedMesh;
-struct MFace;
-struct MEdge;
-
typedef struct MultiresSubsurf {
struct Mesh *me;
int totlvl, lvl;
@@ -81,6 +43,8 @@
int index;
} IndexNode;
+void multires_free(struct Multires*);
+
void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface,
const int totvert, const int totface);
@@ -125,7 +89,6 @@
int x, y, ax, ay;
} MultiresDisplacer;
-
void multires_load_old(struct DerivedMesh *, struct Multires *);
void multires_force_update(struct Object *ob);
@@ -134,7 +97,8 @@
int multiresModifier_switch_level(struct Object *ob, const int);
void multiresModifier_join(struct Object *ob);
-void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob, int updateblock, int simple);
+void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob, int distance,
+ int updateblock, int simple);
void multiresModifier_setLevel(void *mmd_v, void *ob_v);
int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object *dst, struct Object *src);
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-08-14 03:23:36 UTC (rev 16098)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-08-14 04:14:13 UTC (rev 16099)
@@ -475,13 +475,8 @@
BLI_insertlinkbefore(&base->object->modifiers, md, mmd);
}
- if(mmd) {
- int i;
-
- /* TODO: subdivision should be doable in one step rather than iteratively. */
- for(i = mmd->totlvl; i < highest_lvl; ++i)
- multiresModifier_subdivide(mmd, base->object, 0, 0);
- }
+ if(mmd)
+ multiresModifier_subdivide(mmd, base->object, highest_lvl - mmd->totlvl, 0, 0);
}
base = base->next;
}
@@ -763,7 +758,7 @@
mrdm->release(mrdm);
}
-void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple)
+void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int distance, int updateblock, int simple)
{
DerivedMesh *final = NULL;
int totsubvert, totsubface, totsubedge;
@@ -771,6 +766,9 @@
MDisps *mdisps;
int i;
+ if(distance == 0)
+ return;
+
if(mmd->totlvl == multires_max_levels) {
// TODO
return;
@@ -778,8 +776,8 @@
multires_force_update(ob);
- ++mmd->lvl;
- ++mmd->totlvl;
+ mmd->lvl = mmd->totlvl;
+ mmd->totlvl += distance;
mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
if(!mdisps)
@@ -790,7 +788,7 @@
MultiresModifierData mmd_sub;
orig = CDDM_from_mesh(me, NULL);
- mmd_sub.lvl = mmd_sub.totlvl = mmd->totlvl - 1;
+ mmd_sub.lvl = mmd_sub.totlvl = mmd->lvl;
mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
totsubvert = mrdm->getNumVerts(mrdm);
totsubedge = mrdm->getNumEdges(mrdm);
@@ -798,13 +796,13 @@
orig->needsFree = 1;
orig->release(orig);
- final = multires_subdisp_pre(mrdm, 1, simple);
+ final = multires_subdisp_pre(mrdm, distance, simple);
mrdm->needsFree = 1;
+ *MultiresDM_get_flags(mrdm) |= MULTIRES_DM_UPDATE_BLOCK;
mrdm->release(mrdm);
}
for(i = 0; i < me->totface; ++i) {
- //const int totdisp = (me->mface[i].v4 ? multires_quad_tot[totlvl] : multires_tri_tot[totlvl]);
const int totdisp = multires_quad_tot[mmd->totlvl - 1];
float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps");
@@ -821,11 +819,13 @@
orig = CDDM_from_mesh(me, NULL);
- multires_subdisp(orig, me, final, mmd->totlvl - 1, mmd->totlvl, totsubvert, totsubedge, totsubface, 0);
+ multires_subdisp(orig, me, final, mmd->lvl, mmd->totlvl, totsubvert, totsubedge, totsubface, 0);
orig->needsFree = 1;
orig->release(orig);
}
+
+ mmd->lvl = mmd->totlvl;
}
void multiresModifier_setLevel(void *mmd_v, void *ob_v)
Modified: branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c 2008-08-14 03:23:36 UTC (rev 16098)
+++ branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c 2008-08-14 04:14:13 UTC (rev 16099)
@@ -7843,8 +7843,7 @@
mmd = (MultiresModifierData*)modifier_new(eModifierType_Multires);
BLI_insertlinkbefore(&ob->modifiers, md, mmd);
- for(i = 1; i < me->mr->level_count; ++i)
- multiresModifier_subdivide(mmd, ob, 1, 0);
+ multiresModifier_subdivide(mmd, ob, me->mr->level_count - 1, 1, 0);
mmd->lvl = mmd->totlvl;
orig = CDDM_from_mesh(me, NULL);
Modified: branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c 2008-08-14 03:23:36 UTC (rev 16098)
+++ branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c 2008-08-14 04:14:13 UTC (rev 16099)
@@ -1658,7 +1658,7 @@
MultiresModifierData *mmd = mmd_v;
if(mmd && ob_v) {
- multiresModifier_subdivide(mmd, ob_v, 0, mmd->simple);
+ multiresModifier_subdivide(mmd, ob_v, 1, 0, mmd->simple);
BIF_undo_push("Multires subdivide");
}
}
More information about the Bf-blender-cvs
mailing list