[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12638] branches/harmonic-skeleton/blender /source/blender: Adding subdivisions by correlation.

Martin Poirier theeth at yahoo.com
Tue Nov 20 23:25:25 CET 2007


Revision: 12638
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12638
Author:   theeth
Date:     2007-11-20 23:25:25 +0100 (Tue, 20 Nov 2007)

Log Message:
-----------
Adding subdivisions by correlation.

This is much nicer than subdivision by angle but is somewhat less intuitive for users.

Added Bucket arc iterator, removing a lot of weird duplicated code in skeleton generator.

Modified Paths:
--------------
    branches/harmonic-skeleton/blender/source/blender/blenkernel/BKE_blender.h
    branches/harmonic-skeleton/blender/source/blender/blenloader/intern/readfile.c
    branches/harmonic-skeleton/blender/source/blender/include/reeb.h
    branches/harmonic-skeleton/blender/source/blender/makesdna/DNA_scene_types.h
    branches/harmonic-skeleton/blender/source/blender/src/buttons_editing.c
    branches/harmonic-skeleton/blender/source/blender/src/editarmature.c
    branches/harmonic-skeleton/blender/source/blender/src/reeb.c

Modified: branches/harmonic-skeleton/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- branches/harmonic-skeleton/blender/source/blender/blenkernel/BKE_blender.h	2007-11-20 19:12:42 UTC (rev 12637)
+++ branches/harmonic-skeleton/blender/source/blender/blenkernel/BKE_blender.h	2007-11-20 22:25:25 UTC (rev 12638)
@@ -44,7 +44,7 @@
 struct MemFile;
 
 #define BLENDER_VERSION			245
-#define BLENDER_SUBVERSION		8
+#define BLENDER_SUBVERSION		9
 
 #define BLENDER_MINVERSION		240
 #define BLENDER_MINSUBVERSION	0

Modified: branches/harmonic-skeleton/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/harmonic-skeleton/blender/source/blender/blenloader/intern/readfile.c	2007-11-20 19:12:42 UTC (rev 12637)
+++ branches/harmonic-skeleton/blender/source/blender/blenloader/intern/readfile.c	2007-11-20 22:25:25 UTC (rev 12638)
@@ -6768,7 +6768,7 @@
 			}
 		}
 		
-		if (main->versionfile < 245 || main->subversionfile < 8)
+		if (main->versionfile < 245 || main->subversionfile < 9)
 		{
 			/* initialize skeleton generation toolsettings */
 			for(sce=main->scene.first; sce; sce = sce->id.next)
@@ -6779,10 +6779,13 @@
 				sce->toolsettings->skgen_angle_limit	 		= 45.0f;
 				sce->toolsettings->skgen_length_ratio			= 1.3f;
 				sce->toolsettings->skgen_length_limit			= 1.5f;
+				sce->toolsettings->skgen_correlation_limit		= 0.98f;
 				sce->toolsettings->skgen_postpro = SKGEN_SMOOTH;
 				sce->toolsettings->skgen_postpro_passes = 1;
-				sce->toolsettings->skgen_options = SKGEN_FILTER_INTERNAL|SKGEN_FILTER_EXTERNAL|SKGEN_REPOSITION|SKGEN_CUT_LENGTH|SKGEN_CUT_ANGLE;
-
+				sce->toolsettings->skgen_options = SKGEN_FILTER_INTERNAL|SKGEN_FILTER_EXTERNAL|SKGEN_REPOSITION|SKGEN_CUT_LENGTH|SKGEN_SUB_CORRELATION;
+				sce->toolsettings->skgen_subdivisions[0] = SKGEN_SUB_LENGTH;
+				sce->toolsettings->skgen_subdivisions[1] = SKGEN_SUB_CORRELATION;
+				sce->toolsettings->skgen_subdivisions[2] = SKGEN_SUB_ANGLE;
 			}
 		}
 	}

Modified: branches/harmonic-skeleton/blender/source/blender/include/reeb.h
===================================================================
--- branches/harmonic-skeleton/blender/source/blender/include/reeb.h	2007-11-20 19:12:42 UTC (rev 12637)
+++ branches/harmonic-skeleton/blender/source/blender/include/reeb.h	2007-11-20 22:25:25 UTC (rev 12638)
@@ -74,6 +74,14 @@
 	int flags;
 } ReebArc;
 
+typedef struct ReebArcIterator {
+	struct ReebArc	*arc;
+	int index;
+	int start;
+	int end;
+	int stride;
+} ReebArcIterator;
+
 struct EditMesh;
 
 void weightToHarmonic(struct EditMesh *em);
@@ -85,6 +93,10 @@
 
 #define OTHER_NODE(arc, node) ((arc->v1 == node) ? arc->v2 : arc->v1)
 
+void initArcIterator(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
+void initArcIterator2(struct ReebArcIterator *iter, struct ReebArc *arc, int start, int end);
+struct EmbedBucket * nextBucket(struct ReebArcIterator *iter);
+
 int subtreeDepth(ReebNode *node);
 int countConnectedArcs(ReebGraph *rg, ReebNode *node);
 int hasAdjacencyList(ReebGraph *rg); 

Modified: branches/harmonic-skeleton/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/harmonic-skeleton/blender/source/blender/makesdna/DNA_scene_types.h	2007-11-20 19:12:42 UTC (rev 12637)
+++ branches/harmonic-skeleton/blender/source/blender/makesdna/DNA_scene_types.h	2007-11-20 22:25:25 UTC (rev 12638)
@@ -370,10 +370,13 @@
 	float skgen_length_ratio;
 	float skgen_length_limit;
 	float skgen_angle_limit;
+	float skgen_correlation_limit;
 	short skgen_options;
 	char  skgen_postpro;
 	char  skgen_postpro_passes;
+	char  skgen_subdivisions[3];
 	
+	char pad3[1];
 } ToolSettings;
 
 /* Used by all brushes to store their properties, which can be directly set
@@ -682,8 +685,13 @@
 #define	SKGEN_SYMMETRY			8
 #define	SKGEN_CUT_LENGTH		16
 #define	SKGEN_CUT_ANGLE			32
-#define	SKGEN_LENGTH_FIRST		64
+#define	SKGEN_CUT_CORRELATION	64
 
+#define	SKGEN_SUB_LENGTH		0
+#define	SKGEN_SUB_ANGLE			1
+#define	SKGEN_SUB_CORRELATION	2
+#define	SKGEN_SUB_TOTAL			3
+
 /* toolsettings->skgen_postpro */
 #define SKGEN_SMOOTH			0
 #define SKGEN_AVERAGE			1

Modified: branches/harmonic-skeleton/blender/source/blender/src/buttons_editing.c
===================================================================
--- branches/harmonic-skeleton/blender/source/blender/src/buttons_editing.c	2007-11-20 19:12:42 UTC (rev 12637)
+++ branches/harmonic-skeleton/blender/source/blender/src/buttons_editing.c	2007-11-20 22:25:25 UTC (rev 12638)
@@ -4418,56 +4418,73 @@
 	unique_vertexgroup_name((bDeformGroup*)datav, OBACT);
 }
 
-static void skgen_reorder(void *arg1, void *arg2)
+static void skgen_reorder(void *option, void *arg2)
 {
-	G.scene->toolsettings->skgen_options ^= SKGEN_LENGTH_FIRST;
+	char tmp;
+	switch ((int)option)
+	{
+		case 0:
+			tmp = G.scene->toolsettings->skgen_subdivisions[0];
+			G.scene->toolsettings->skgen_subdivisions[0] = G.scene->toolsettings->skgen_subdivisions[1];
+			G.scene->toolsettings->skgen_subdivisions[1] = tmp;
+			break;
+		case 1:
+			tmp = G.scene->toolsettings->skgen_subdivisions[2];
+			G.scene->toolsettings->skgen_subdivisions[2] = G.scene->toolsettings->skgen_subdivisions[1];
+			G.scene->toolsettings->skgen_subdivisions[1] = tmp;
+			break;
+		case 2:
+			tmp = G.scene->toolsettings->skgen_subdivisions[0];
+			G.scene->toolsettings->skgen_subdivisions[0] = G.scene->toolsettings->skgen_subdivisions[2];
+			G.scene->toolsettings->skgen_subdivisions[2] = G.scene->toolsettings->skgen_subdivisions[1];
+			G.scene->toolsettings->skgen_subdivisions[1] = tmp;
+			break;
+	}
 }
 
 static void editing_panel_mesh_skgen(Object *ob, Mesh *me)
 {
 	uiBlock *block;
 	uiBut *but;
+	int i;
 
 	block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_skgen", UI_EMBOSS, UI_HELV, curarea->win);
 	if(uiNewPanel(curarea, block, "Skeleton Generation", "Editing", 960, 0, 318, 204)==0) return;
 	
-	uiDefBut(block, BUT, B_GEN_SKELETON, "Generate Skeleton",			1025,160,250,39, 0, 0, 0, 0, 0, "Generate Skeleton from Mesh");
+	uiDefBut(block, BUT, B_GEN_SKELETON, "Generate Skeleton",			1025,170,250,19, 0, 0, 0, 0, 0, "Generate Skeleton from Mesh");
 
 	uiBlockBeginAlign(block);
-	uiDefButS(block, NUM, B_DIFF, "Resolution:",							1025,130,250,19, &G.scene->toolsettings->skgen_resolution,10.0,1000.0, 0, 0,		"Specifies the resolution of the graph's embedding");
-	uiDefButBitS(block, TOG, SKGEN_FILTER_INTERNAL, B_DIFF, "Filter In",	1025,110, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter internal small arcs from graph");
-	uiDefButF(block, NUM, B_DIFF, 							"Thresh:",		1111,110,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering internal arcs");
-	uiDefButBitS(block, TOG, SKGEN_FILTER_EXTERNAL, B_DIFF, "Filter Ex",	1025, 90, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter external small arcs from graph");
-	uiDefButF(block, NUM, B_DIFF, 							"Thresh:",		1111, 90,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering external arcs");
+	uiDefButS(block, NUM, B_DIFF, "Resolution:",							1025,150,250,19, &G.scene->toolsettings->skgen_resolution,10.0,1000.0, 0, 0,		"Specifies the resolution of the graph's embedding");
+	uiDefButBitS(block, TOG, SKGEN_FILTER_INTERNAL, B_DIFF, "Filter In",	1025,130, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter internal small arcs from graph");
+	uiDefButF(block, NUM, B_DIFF, 							"Thresh:",		1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering internal arcs");
+	uiDefButBitS(block, TOG, SKGEN_FILTER_EXTERNAL, B_DIFF, "Filter Ex",	1025,110, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter external small arcs from graph");
+	uiDefButF(block, NUM, B_DIFF, 							"Thresh:",		1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering external arcs");
 
-	but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, VICON_MOVE_DOWN, 		1025, 70, 16, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Change the order the subdivisions algorithm are applied");
-	uiButSetFunc(but, skgen_reorder, NULL, NULL);
-	if (G.scene->toolsettings->skgen_options & SKGEN_LENGTH_FIRST)
+	for(i = 0; i < SKGEN_SUB_TOTAL; i++)
 	{
-		uiDefButBitS(block, TOG, SKGEN_CUT_LENGTH, B_DIFF, 		"Length",		1041, 70, 67,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Subdivide arcs based on embedding");
-		uiDefButF(block, NUM, B_DIFF, 							"Thresh:",		1111, 70, 82,19, &G.scene->toolsettings->skgen_length_ratio,1.0, 4.0, 10, 0,		"Specify the ratio limit between straight arc and embeddings to trigger equal subdivisions");
-		uiDefButF(block, NUM, B_DIFF, 							"Len:",			1193, 70, 82,19, &G.scene->toolsettings->skgen_length_limit,0.1,50.0, 10, 0,		"Maximum length of the bones when subdividing");
+		int y = 90 - 20 * i;
+		
+		but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, VICON_MOVE_DOWN, 		1025, y, 16, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Change the order the subdivisions algorithm are applied");
+		uiButSetFunc(but, skgen_reorder, (void *)i, NULL);
+		
+		switch(G.scene->toolsettings->skgen_subdivisions[i])
+		{
+			case SKGEN_SUB_LENGTH:
+				uiDefButBitS(block, TOG, SKGEN_CUT_LENGTH, B_DIFF, 		"Length",		1041, y, 67,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,				"Subdivide arcs based on embedding length");
+				uiDefButF(block, NUM, B_DIFF, 							"Thresh:",		1111, y, 82,19, &G.scene->toolsettings->skgen_length_ratio,1.0, 4.0, 10, 0,		"Specify the ratio limit between straight arc and embeddings to trigger equal subdivisions");
+				uiDefButF(block, NUM, B_DIFF, 							"Len:",			1193, y, 82,19, &G.scene->toolsettings->skgen_length_limit,0.1,50.0, 10, 0,		"Maximum length of the bones when subdividing");
+				break;
+			case SKGEN_SUB_ANGLE:
+				uiDefButBitS(block, TOG, SKGEN_CUT_ANGLE, B_DIFF, 		"Angle",		1041, y, 67,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Subdivide arcs based on angle");

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list