[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12836] branches/harmonic-skeleton/blender /source/blender/src: Preparing for merge:

Martin Poirier theeth at yahoo.com
Mon Dec 10 21:48:29 CET 2007


Revision: 12836
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12836
Author:   theeth
Date:     2007-12-10 21:48:28 +0100 (Mon, 10 Dec 2007)

Log Message:
-----------
Preparing for merge:

Support for separate mesh islands
Better error reporting and checking
Panelizing the UI better

Modified Paths:
--------------
    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/src/buttons_editing.c
===================================================================
--- branches/harmonic-skeleton/blender/source/blender/src/buttons_editing.c	2007-12-10 16:45:37 UTC (rev 12835)
+++ branches/harmonic-skeleton/blender/source/blender/src/buttons_editing.c	2007-12-10 20:48:28 UTC (rev 12836)
@@ -4449,7 +4449,7 @@
 	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;
+	if(uiNewPanel(curarea, block, "Skeleton Generator", "Editing", 960, 0, 318, 204)==0) return;
 	
 	uiDefBut(block, BUT, B_GEN_SKELETON, "Generate Skeleton",			1025,170,250,19, 0, 0, 0, 0, 0, "Generate Skeleton from Mesh");
 
@@ -5606,6 +5606,7 @@
 		if(G.obedit) {
 			editing_panel_mesh_tools(ob, ob->data);
 			editing_panel_mesh_tools1(ob, ob->data);
+			uiNewPanelTabbed("Mesh Tools 1", "Editing");
 			editing_panel_mesh_skgen(ob, ob->data);
 			editing_panel_mesh_uvautocalculation();
 			if (EM_texFaceCheck())

Modified: branches/harmonic-skeleton/blender/source/blender/src/editarmature.c
===================================================================
--- branches/harmonic-skeleton/blender/source/blender/src/editarmature.c	2007-12-10 16:45:37 UTC (rev 12835)
+++ branches/harmonic-skeleton/blender/source/blender/src/editarmature.c	2007-12-10 20:48:28 UTC (rev 12836)
@@ -3398,7 +3398,7 @@
 {
 	ReebArc *arc1 = NULL;
 	ReebArc *arc2 = NULL;
-	ReebNode *node1, *node2;
+	ReebNode *node1 = NULL, *node2 = NULL;
 	float limit = G.scene->toolsettings->skgen_symmetry_limit;
 	float nor[3], vec[3], p[3];
 	int i;
@@ -3424,6 +3424,12 @@
 		}
 	}
 	
+	/* shouldn't happen, but just to be sure */
+	if (node1 == NULL || node2 == NULL)
+	{
+		return;
+	}
+	
 	VecSubf(p, node1->p, node->p);
 	Crossf(vec, p, axis);
 	Crossf(nor, vec, axis);
@@ -4023,8 +4029,6 @@
 	arcBoneMap = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
 	
 	markdownSymmetry(rg);
-
-	exportGraph(rg, -1);
 	
 	for (arc = rg->arcs.first; arc; arc = arc->next) 
 	{
@@ -4178,14 +4182,19 @@
 
 	setcursor_space(SPACE_VIEW3D, CURSOR_WAIT);
 
-	weightFromDistance(em);
+	if (weightFromDistance(em) == 0)
+	{
+		error("No selected vertex\n");
+		return;
+	}
+	
 	weightToHarmonic(em);
 		
 	renormalizeWeight(em, 1.0f);
 
-#ifdef DEBUG_REEB
+//#ifdef DEBUG_REEB
 	weightToVCol(em);
-#endif
+//#endif
 	
 	rg = generateReebGraph(em, G.scene->toolsettings->skgen_resolution);
 
@@ -4238,8 +4247,6 @@
 	
 	sortArcs(rg);
 	
-//	exportGraph(rg, -1);
-
 	generateSkeletonFromReebGraph(rg);
 
 	freeGraph(rg);

Modified: branches/harmonic-skeleton/blender/source/blender/src/reeb.c
===================================================================
--- branches/harmonic-skeleton/blender/source/blender/src/reeb.c	2007-12-10 16:45:37 UTC (rev 12835)
+++ branches/harmonic-skeleton/blender/source/blender/src/reeb.c	2007-12-10 20:48:28 UTC (rev 12836)
@@ -428,7 +428,7 @@
 void postprocessGraph(ReebGraph *rg, char mode)
 {
 	ReebArc *arc;
-	float fac1, fac2, fac3;
+	float fac1 = 0, fac2 = 1, fac3 = 0;
 
 	switch(mode)
 	{
@@ -919,6 +919,7 @@
 
 void exportGraph(ReebGraph *rg, int count)
 {
+#ifdef DEBUG_REEB
 	ReebArc *arc;
 	char filename[128];
 	FILE *f;
@@ -948,6 +949,7 @@
 	}	
 	
 	fclose(f);
+#endif
 }
 
 /***************************************** MAIN ALGORITHM **********************************************/
@@ -1710,7 +1712,7 @@
 
 int weightFromDistance(EditMesh *em)
 {
-	EditVert *eve, *current_eve = NULL;
+	EditVert *eve;
 	int totedge = 0;
 	int vCount = 0;
 	
@@ -1726,95 +1728,110 @@
 		return 0;
 	}
 
-	/* Initialize vertice flags and find selected vertex */
-	for(eve = em->verts.first; eve; eve = eve->next)
+	/* Initialize vertice flags and find at least one selected vertex */
+	for(eve = em->verts.first; eve && vCount == 0; eve = eve->next)
 	{
 		eve->f1 = 0;
-		if (current_eve == NULL && eve->f & SELECT)
+		if (eve->f & SELECT)
 		{
-			current_eve = eve;
-			eve->f1 = 1;
 			vCount = 1;
 		}
 	}
-
-	if (current_eve != NULL)
+	
+	if (vCount == 0)
 	{
-		EditEdge *eed = NULL;
-		EditEdge *select_eed = NULL;
-		EditEdge **edges = NULL;
-		float	 currentWeight = 0;
-		int 	 eIndex = 0;
-		
-		edges = MEM_callocN(totedge * sizeof(EditEdge*), "Edges");
-		
-		/* Calculate edge weight and initialize edge flags */
-		for(eed= em->edges.first; eed; eed= eed->next)
+		return 0; /* no selected vert, failure */
+	}
+	else
+	{
+		EditVert *eve, *current_eve = NULL;
+		/* Apply dijkstra spf for each selected vert */
+		for(eve = em->verts.first; eve; eve = eve->next)
 		{
-			eed->tmp.fp = VecLenf(eed->v1->co, eed->v2->co);
-			eed->f1 = 0;
-		}
-		
-		do {
-			int i;
-			
-			current_eve->f1 = 1; /* mark vertex as selected */
-			
-			/* Add all new edges connected to current_eve to the list */
-			NextEdgeForVert(NULL, NULL); // Reset next edge
-			for(eed = NextEdgeForVert(em, current_eve); eed; eed = NextEdgeForVert(em, current_eve))
-			{ 
-				if (eed->f1 == 0)
-				{
-					edges[eIndex] = eed;
-					eed->f1 = 1;
-					eIndex++;
-				}
-			}
-			
-			/* Find next shortest edge */
-			select_eed = NULL;
-			for(i = 0; i < eIndex; i++)
+			if (eve->f & SELECT)
 			{
-				eed = edges[i];
+				current_eve = eve;
+				eve->f1 = 1;
 				
-				if (eed->f1 != 2 && (eed->v1->f1 == 0 || eed->v2->f1 == 0)) /* eed is not selected yet and leads to a new node */
 				{
-					float newWeight = 0;
-					if (eed->v1->f1 == 1)
+					EditEdge *eed = NULL;
+					EditEdge *select_eed = NULL;
+					EditEdge **edges = NULL;
+					float	 currentWeight = 0;
+					int 	 eIndex = 0;
+					
+					edges = MEM_callocN(totedge * sizeof(EditEdge*), "Edges");
+					
+					/* Calculate edge weight and initialize edge flags */
+					for(eed= em->edges.first; eed; eed= eed->next)
 					{
-						newWeight = eed->v1->tmp.fp + eed->tmp.fp;
+						eed->tmp.fp = VecLenf(eed->v1->co, eed->v2->co);
+						eed->f1 = 0;
 					}
-					else
-					{
-						newWeight = eed->v2->tmp.fp + eed->tmp.fp;
-					}
 					
-					if (select_eed == NULL || newWeight < currentWeight) /* no selected edge or current smaller than selected */
-					{
-						currentWeight = newWeight;
-						select_eed = eed;
-					}
+					do {
+						int i;
+						
+						current_eve->f1 = 1; /* mark vertex as selected */
+						
+						/* Add all new edges connected to current_eve to the list */
+						NextEdgeForVert(NULL, NULL); // Reset next edge
+						for(eed = NextEdgeForVert(em, current_eve); eed; eed = NextEdgeForVert(em, current_eve))
+						{ 
+							if (eed->f1 == 0)
+							{
+								edges[eIndex] = eed;
+								eed->f1 = 1;
+								eIndex++;
+							}
+						}
+						
+						/* Find next shortest edge */
+						select_eed = NULL;
+						for(i = 0; i < eIndex; i++)
+						{
+							eed = edges[i];
+							
+							if (eed->f1 != 2 && (eed->v1->f1 == 0 || eed->v2->f1 == 0)) /* eed is not selected yet and leads to a new node */
+							{
+								float newWeight = 0;
+								if (eed->v1->f1 == 1)
+								{
+									newWeight = eed->v1->tmp.fp + eed->tmp.fp;
+								}
+								else
+								{
+									newWeight = eed->v2->tmp.fp + eed->tmp.fp;
+								}
+								
+								if (select_eed == NULL || newWeight < currentWeight) /* no selected edge or current smaller than selected */
+								{
+									currentWeight = newWeight;
+									select_eed = eed;
+								}
+							}
+						}
+						
+						if (select_eed != NULL)
+						{
+							select_eed->f1 = 2;
+							
+							if (select_eed->v1->f1 == 0) /* v1 is the new vertex */
+							{
+								current_eve = select_eed->v1;
+							}
+							else /* otherwise, it's v2 */
+							{
+								current_eve = select_eed->v2;
+							}				
+							current_eve->tmp.fp = currentWeight;
+						}
+					} while (select_eed != NULL);
+					
+					MEM_freeN(edges);
 				}
 			}
-			
-			if (select_eed != NULL)
-			{
-				select_eed->f1 = 2;
-				
-				if (select_eed->v1->f1 == 0) /* v1 is the new vertex */
-				{
-					current_eve = select_eed->v1;
-				}
-				else /* otherwise, it's v2 */
-				{
-					current_eve = select_eed->v2;
-				}				
-				current_eve->tmp.fp = currentWeight;
-			}
-		} while (select_eed != NULL);
-		
-		MEM_freeN(edges);
+		}
 	}
 
 	return 1;





More information about the Bf-blender-cvs mailing list