[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