[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16116] branches/soc-2008-nicholasbishop/ source/blender: Added a Del Higher button to multires, removes levels higher than the currently selected one.

Nicholas Bishop nicholasbishop at gmail.com
Thu Aug 14 19:36:08 CEST 2008


Revision: 16116
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16116
Author:   nicholasbishop
Date:     2008-08-14 19:36:08 +0200 (Thu, 14 Aug 2008)

Log Message:
-----------
Added a Del Higher button to multires, removes levels higher than the currently selected one.

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/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 17:24:39 UTC (rev 16115)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-08-14 17:36:08 UTC (rev 16116)
@@ -30,7 +30,6 @@
 struct DerivedMesh;
 struct Mesh;
 struct MFace;
-struct Multires;
 struct Object;
 
 typedef struct MultiresSubsurf {
@@ -43,8 +42,6 @@
 	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);
 
@@ -89,14 +86,14 @@
 	int x, y, ax, ay;
 } MultiresDisplacer;
 
-void multires_load_old(struct DerivedMesh *, struct Multires *);
 void multires_force_update(struct Object *ob);
 
 struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*,
 						    struct Mesh *, int, int);
 
-int multiresModifier_switch_level(struct Object *ob, const int);
-void multiresModifier_join(struct Object *ob);
+int multiresModifier_switch_level(struct Object *, const int);
+void multiresModifier_join(struct Object *);
+void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
 void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob, int distance,
 				int updateblock, int simple);
 void multiresModifier_setLevel(void *mmd_v, void *ob_v);
@@ -110,3 +107,8 @@
 void multires_displacer_anchor_vert(MultiresDisplacer *d, const int);
 void multires_displacer_jump(MultiresDisplacer *d);
 void multires_displace(MultiresDisplacer *d, float out[3]);
+
+/* Related to the old multires */
+struct Multires;
+void multires_load_old(struct DerivedMesh *, struct Multires *);
+void multires_free(struct Multires*);

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-08-14 17:24:39 UTC (rev 16115)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-08-14 17:36:08 UTC (rev 16116)
@@ -758,6 +758,40 @@
 	mrdm->release(mrdm);
 }
 
+/* direction=1 for delete higher, direction=0 for lower (not implemented yet) */
+void multiresModifier_del_levels(struct MultiresModifierData *mmd, struct Object *ob, int direction)
+{
+	Mesh *me = get_mesh(ob);
+	int distance = mmd->totlvl - mmd->lvl;
+	MDisps *mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+	multires_force_update(ob);
+
+	if(mdisps && distance > 0 && direction == 1) {
+		int skip = multires_side_tot[distance] - 1;
+		int st = multires_side_tot[mmd->totlvl - 1];
+		int totdisp = multires_quad_tot[mmd->lvl - 1];
+		int i, j, x, y;
+
+		for(i = 0; i < me->totface; ++i) {
+			float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires del disps");
+			
+			for(j = 0, y = 0; y < st; y += skip) {
+				for(x = 0; x < st; x += skip) {
+					VecCopyf(disps[j], mdisps[i].disps[y * st + x]);
+					++j;
+				}
+			}
+
+			MEM_freeN(mdisps[i].disps);
+			mdisps[i].disps = disps;
+			mdisps[i].totdisp = totdisp;
+		}
+	}
+
+	mmd->totlvl = mmd->lvl;
+}
+
 void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int distance, int updateblock, int simple)
 {
 	DerivedMesh *final = NULL;
@@ -783,7 +817,7 @@
 	if(!mdisps)
 		mdisps = CustomData_add_layer(&me->fdata, CD_MDISPS, CD_DEFAULT, NULL, me->totface);
 
-	if(mdisps->disps && !updateblock) {
+	if(mdisps->disps && !updateblock && mmd->totlvl > 2) {
 		DerivedMesh *orig, *mrdm;
 		MultiresModifierData mmd_sub;
 
@@ -814,7 +848,7 @@
 	}
 
 
-	if(final && !updateblock) {
+	if(final) {
 		DerivedMesh *orig;
 
 		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 17:24:39 UTC (rev 16115)
+++ branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c	2008-08-14 17:36:08 UTC (rev 16116)
@@ -1684,6 +1684,16 @@
 	}
 }
 
+static void multiresModifier_del_higher_button(void *mmd_v, void *ob_v)
+{
+	MultiresModifierData *mmd = mmd_v;
+
+	if(mmd && ob_v) {
+		multiresModifier_del_levels(mmd, ob_v, 1);
+		BIF_undo_push("Delete higher");
+	}	       
+}
+
 static int modifier_is_fluid_particles(ModifierData *md) {
 	if(md->type == eModifierType_ParticleSystem) {
 		if(((ParticleSystemModifierData *)md)->psys->part->type == PART_FLUID)
@@ -1854,7 +1864,7 @@
 		} else if (md->type==eModifierType_Explode) {
 			height = 94;
 		} else if (md->type==eModifierType_Multires) {
-			height = 72;
+			height = 94;
 		}
 							/* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */
 		uiDefBut(block, ROUNDBOX, 0, "", x-10, y-height-2, width, height-2, NULL, 5.0, 0.0, 12, 40, ""); 
@@ -2491,6 +2501,8 @@
 			uiBlockBeginAlign(block);
 			but = uiDefBut(block,BUT,B_MODIFIER_RECALC,"Reshape", lx,(cy-=24),buttonWidth/2,19,0,0,0,0,0,"Copy vertices from another selected mesh into the current level");
 			uiButSetFunc(but, multiresModifier_reshape_button, mmd, ob);
+			but = uiDefBut(block,BUT,B_MODIFIER_RECALC,"Del Higher", lx+buttonWidth/2,cy,buttonWidth/2,19,0,0,0,0,0,"Copy vertices from another selected mesh into the current level");
+			uiButSetFunc(but, multiresModifier_del_higher_button, mmd, ob);
 		}
 
 		uiBlockEndAlign(block);





More information about the Bf-blender-cvs mailing list