Revision: 17153
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17153
Author: theeth
Date: 2008-10-22 00:38:32 +0200 (Wed, 22 Oct 2008)
Log Message:
-----------
Fixed Subdivision method (subdivide in a set number of bones).
Subdivision method cleanup (reuse more code)
Modified Paths:
--------------
branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h
branches/etch-a-ton/source/blender/src/drawview.c
branches/etch-a-ton/source/blender/src/editarmature_sketch.c
Modified: branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h
2008-10-21 20:21:48 UTC (rev 17152)
+++ branches/etch-a-ton/source/blender/makesdna/DNA_scene_types.h
2008-10-21 22:38:32 UTC (rev 17153)
@@ -440,10 +440,11 @@
/* Skeleton Sketching */
char bone_sketching;
+ char skgen_subdivision_number;
/* Alt+RMB option */
char edge_mode;
- char pad3[3];
+ char pad3[2];
} ToolSettings;
/* Used by all brushes to store their properties, which can be directly set
@@ -846,6 +847,7 @@
#define SKGEN_CUT_LENGTH 8
#define SKGEN_CUT_ANGLE 16
#define SKGEN_CUT_CORRELATION 32
+#define SKGEN_CUT_FIXED 64
#define SKGEN_SUB_LENGTH 0
#define SKGEN_SUB_ANGLE 1
Modified: branches/etch-a-ton/source/blender/src/drawview.c
===================================================================
--- branches/etch-a-ton/source/blender/src/drawview.c 2008-10-21 20:21:48 UTC
(rev 17152)
+++ branches/etch-a-ton/source/blender/src/drawview.c 2008-10-21 22:38:32 UTC
(rev 17153)
@@ -2317,6 +2317,9 @@
uiDefButBitS(block, TOG, SKGEN_CUT_CORRELATION, B_DIFF,
"Correlation", 10, 135, 60, 19, &G.scene->toolsettings->skgen_options, 0, 0,
0, 0, "Subdivide arcs based on
correlation");
uiDefButF(block, NUM, B_DIFF,
"T:", 70, 135, 90, 19,
&G.scene->toolsettings->skgen_correlation_limit,0.0, 1.0, 0.01, 0, "Specify
the threshold correlation for subdivision");
+ uiDefButBitS(block, TOG, SKGEN_CUT_FIXED, B_DIFF,
"Fixed", 10, 115, 60, 19, &G.scene->toolsettings->skgen_options,
0, 0, 0, 0, "Subdivide arcs based on a
fixed number of bones");
+ uiDefButC(block, NUM, B_DIFF,
"N:", 70, 115, 90, 19,
&G.scene->toolsettings->skgen_subdivision_number,0, 100, 1, 0, "Specify the
bones to subdivide into");
+
uiBlockEndAlign(block);
if(yco < 0) uiNewPanelHeight(block, height-yco);
Modified: branches/etch-a-ton/source/blender/src/editarmature_sketch.c
===================================================================
--- branches/etch-a-ton/source/blender/src/editarmature_sketch.c
2008-10-21 20:21:48 UTC (rev 17152)
+++ branches/etch-a-ton/source/blender/src/editarmature_sketch.c
2008-10-21 22:38:32 UTC (rev 17153)
@@ -118,9 +118,12 @@
/******************** PROTOTYPES ******************************/
+typedef int(NextSubdivisionFunc)(SK_Stroke*, int, int, float[3], float[3]);
+
void sk_freeStroke(SK_Stroke *stk);
void sk_freeSketch(SK_Sketch *sketch);
+int nextFixedSubdivision(SK_Stroke *stk, int start, int end, float head[3],
float p[3]);
int nextLengthSubdivision(SK_Stroke *stk, int start, int end, float head[3],
float p[3]);
int nextCorrelationSubdivision(SK_Stroke *stk, int start, int end, float
head[3], float p[3]);
@@ -673,73 +676,29 @@
// glEnd();
}
-
-int drawStrokeByCorrelation(SK_Stroke *stk, int start, int end)
+void drawSubdividedStrokeBy(SK_Stroke *stk, int start, int end,
NextSubdivisionFunc next_subdividion)
{
- if (G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION)
- {
- float head[3], tail[3];
- int bone_start = start;
- int index;
+ float head[3], tail[3];
+ int bone_start = start;
+ int index;
- VECCOPY(head, stk->points[start].p);
-
- glColor3f(0, 1, 1);
- glBegin(GL_POINTS);
-
- index = nextCorrelationSubdivision(stk, bone_start, end, head,
tail);
- while (index != -1)
- {
- glVertex3fv(tail);
-
- VECCOPY(head, tail);
- bone_start = index; // start next bone from current
index
-
- index = nextCorrelationSubdivision(stk, bone_start,
end, head, tail);
- }
-
- glEnd();
-
- return 1;
- }
- else
+ VECCOPY(head, stk->points[start].p);
+
+ glColor3f(0, 1, 1);
+ glBegin(GL_POINTS);
+
+ index = next_subdividion(stk, bone_start, end, head, tail);
+ while (index != -1)
{
- return 0;
- }
-}
-
-int drawStrokeByLength(SK_Stroke *stk, int start, int end)
-{
- if (G.scene->toolsettings->skgen_options & SKGEN_CUT_LENGTH)
- {
- float head[3], tail[3];
- int bone_start = start;
- int index;
-
- VECCOPY(head, stk->points[start].p);
+ glVertex3fv(tail);
- glColor3f(0, 1, 1);
- glBegin(GL_POINTS);
-
- index = nextLengthSubdivision(stk, bone_start, end, head, tail);
- while (index != -1)
- {
- glVertex3fv(tail);
-
- VECCOPY(head, tail);
- bone_start = index; // start next bone from current
index
+ VECCOPY(head, tail);
+ bone_start = index; // start next bone from current index
- index = nextLengthSubdivision(stk, bone_start, end,
head, tail);
- }
-
- glEnd();
-
- return 1;
+ index = next_subdividion(stk, bone_start, end, head, tail);
}
- else
- {
- return 0;
- }
+
+ glEnd();
}
void sk_drawStrokeSubdivision(SK_Stroke *stk)
@@ -759,16 +718,21 @@
}
else
{
- int done = 0;
-
if (i - head_index > 1)
{
- done = drawStrokeByCorrelation(stk,
head_index, i);
-
- if (done == 0)
+ if
(G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION)
{
- done = drawStrokeByLength(stk,
head_index, i);
+ drawSubdividedStrokeBy(stk,
head_index, i, nextCorrelationSubdivision);
}
+ else if
(G.scene->toolsettings->skgen_options & SKGEN_CUT_LENGTH)
+ {
+ drawSubdividedStrokeBy(stk,
head_index, i, nextLengthSubdivision);
+ }
+ else if
(G.scene->toolsettings->skgen_options & SKGEN_CUT_FIXED)
+ {
+ drawSubdividedStrokeBy(stk,
head_index, i, nextFixedSubdivision);
+ }
+
}
head_index = i;
@@ -1311,70 +1275,64 @@
}
}
-int nextCorrelationSubdivision(SK_Stroke *stk, int start, int end, float
head[3], float p[3])
+int nextFixedSubdivision(SK_Stroke *stk, int start, int end, float head[3],
float p[3])
{
- float correlation_threshold =
G.scene->toolsettings->skgen_correlation_limit;
- float n[3];
+ static float stroke_length = 0;
+ static float current_length;
+ static char n;
+ float length_threshold;
int i;
- for (i = start + 2; i < end; i++)
+ if (stroke_length == 0)
{
- /* Calculate normal */
- VecSubf(n, stk->points[i].p, head);
+ current_length = 0;
+ for (i = start + 1; i < end; i++)
+ {
+ stroke_length += VecLenf(stk->points[i].p,
stk->points[i - 1].p);
+ }
+
+ n = 0;
+ current_length = 0;
+ }
+
+ n++;
+
+ length_threshold = n * stroke_length /
G.scene->toolsettings->skgen_subdivision_number;
+
+ for (i = start + 1; i < end; i++)
+ {
+ current_length += VecLenf(stk->points[i].p, stk->points[i -
1].p);
- if (calcStrokeCorrelation(stk, start, i, stk->points[start].p,
n) < correlation_threshold)
+ if (current_length >= length_threshold)
{
- VECCOPY(p, stk->points[i - 1].p);
- return i - 1;
+ VECCOPY(p, stk->points[i].p);
+ return i;
}
}
+ stroke_length = 0;
+
return -1;
}
-
-EditBone * subdivideStrokeByCorrelation(SK_Stroke *stk, int start, int end,
float invmat[][4], float tmat[][3])
+int nextCorrelationSubdivision(SK_Stroke *stk, int start, int end, float
head[3], float p[3])
{
- bArmature *arm= G.obedit->data;
- EditBone *lastBone = NULL;
+ float correlation_threshold =
G.scene->toolsettings->skgen_correlation_limit;
+ float n[3];
+ int i;
- if (G.scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION)
+ for (i = start + 2; i <= end; i++)
{
- EditBone *child = NULL;
- EditBone *parent = NULL;
- int bone_start = start;
- int index;
+ /* Calculate normal */
+ VecSubf(n, stk->points[i].p, head);
- parent = addEditBone("Bone", &G.edbo, arm);
- VECCOPY(parent->head, stk->points[start].p);
-
- index = nextCorrelationSubdivision(stk, bone_start, end,
parent->head, parent->tail);
- while (index != -1)
+ if (calcStrokeCorrelation(stk, start, i, stk->points[start].p,
n) < correlation_threshold)
{
- setBoneRollFromPoint(parent, &stk->points[end], invmat,
tmat);
-
- Mat4MulVecfl(invmat, parent->head); /* going to next
bone, fix previous head */
-
- child = addEditBone("Bone", &G.edbo, arm);
- VECCOPY(child->head, parent->tail);
- child->parent = parent;
- child->flag |= BONE_CONNECTED;
-
- parent = child; // new child is next parent
- bone_start = index; // start next bone from current
index
-
- index = nextCorrelationSubdivision(stk, bone_start,
end, parent->head, parent->tail);
+ VECCOPY(p, stk->points[i - 1].p);
+ return i - 1;
}
-
- VECCOPY(parent->tail, stk->points[end].p);
-
- setBoneRollFromPoint(parent, &stk->points[end], invmat, tmat);
-
- Mat4MulVecfl(invmat, parent->head);
- Mat4MulVecfl(invmat, parent->tail);
- lastBone = parent;
}
- return lastBone;
+ return -1;
}
int nextLengthSubdivision(SK_Stroke *stk, int start, int end, float head[3],
float p[3])
@@ -1384,7 +1342,7 @@
int i;
i = start + 1;
- while (i < end)
+ while (i <= end)
{
float *vec0 = stk->points[i - 1].p;
float *vec1 = stk->points[i].p;
@@ -1445,50 +1403,47 @@
return -1;
}
-EditBone * subdivideStrokeByLength(SK_Stroke *stk, int start, int end, float
invmat[][4], float tmat[][3])
+EditBone * subdivideStrokeBy(SK_Stroke *stk, int start, int end, float
invmat[][4], float tmat[][3], NextSubdivisionFunc next_subdividion)
{
- bArmature *arm= G.obedit->data;
+ bArmature *arm = G.obedit->data;
EditBone *lastBone = NULL;
+ EditBone *child = NULL;
+ EditBone *parent = NULL;
+ int bone_start = start;
+ int index;
- if (G.scene->toolsettings->skgen_options & SKGEN_CUT_LENGTH)
+ parent = addEditBone("Bone", &G.edbo, arm);
+ VECCOPY(parent->head, stk->points[start].p);
+
+ index = next_subdividion(stk, bone_start, end, parent->head,
parent->tail);
+ while (index != -1)
{
- EditBone *child = NULL;
- EditBone *parent = NULL;
- int bone_start = start;
- int index;
+ setBoneRollFromPoint(parent, &stk->points[index], invmat, tmat);
+ Mat4MulVecfl(invmat, parent->head); /* going to next bone, fix
previous head */
+
+ child = addEditBone("Bone", &G.edbo, arm);
+ VECCOPY(child->head, parent->tail);
+ child->parent = parent;
+ child->flag |= BONE_CONNECTED;
- parent = addEditBone("Bone", &G.edbo, arm);
- VECCOPY(parent->head, stk->points[start].p);
-
- index = nextLengthSubdivision(stk, bone_start, end,
parent->head, parent->tail);
- while (index != -1)
- {
- setBoneRollFromPoint(parent, &stk->points[index],
invmat, tmat);
- Mat4MulVecfl(invmat, parent->head); /* going to next
bone, fix previous head */
+ parent = child; // new child is next parent
+ bone_start = index; // start next bone from current index
- child = addEditBone("Bone", &G.edbo, arm);
- VECCOPY(child->head, parent->tail);
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs