[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