Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/armature/editarmature_generate.c')
-rw-r--r--source/blender/editors/armature/editarmature_generate.c92
1 files changed, 46 insertions, 46 deletions
diff --git a/source/blender/editors/armature/editarmature_generate.c b/source/blender/editors/armature/editarmature_generate.c
index 57843265496..f0135676523 100644
--- a/source/blender/editors/armature/editarmature_generate.c
+++ b/source/blender/editors/armature/editarmature_generate.c
@@ -38,7 +38,7 @@ void setBoneRollFromNormal(EditBone *bone, const float no[3], float UNUSED(invma
copy_v3_v3(normal, no);
mul_m3_v3(tmat, normal);
-
+
bone->roll = ED_armature_ebone_roll_to_vector(bone, normal, false);
}
}
@@ -46,46 +46,46 @@ void setBoneRollFromNormal(EditBone *bone, const float no[3], float UNUSED(invma
float calcArcCorrelation(BArcIterator *iter, int start, int end, float v0[3], float n[3])
{
int len = 2 + abs(end - start);
-
+
if (len > 2) {
float avg_t = 0.0f;
float s_t = 0.0f;
float s_xyz = 0.0f;
int i;
-
+
/* First pass, calculate average */
for (i = start; i <= end; i++) {
float v[3];
-
+
IT_peek(iter, i);
sub_v3_v3v3(v, iter->p, v0);
avg_t += dot_v3v3(v, n);
}
-
+
avg_t /= dot_v3v3(n, n);
avg_t += 1.0f; /* adding start (0) and end (1) values */
avg_t /= len;
-
+
/* Second pass, calculate s_xyz and s_t */
for (i = start; i <= end; i++) {
float v[3], d[3];
float dt;
-
+
IT_peek(iter, i);
sub_v3_v3v3(v, iter->p, v0);
project_v3_v3v3(d, v, n);
sub_v3_v3(v, d);
-
+
dt = len_v3(d) - avg_t;
-
+
s_t += dt * dt;
s_xyz += dot_v3v3(v, v);
}
-
+
/* adding start(0) and end(1) values to s_t */
s_t += (avg_t * avg_t) + (1 - avg_t) * (1 - avg_t);
-
- return 1.0f - s_xyz / s_t;
+
+ return 1.0f - s_xyz / s_t;
}
else {
return 1.0f;
@@ -100,30 +100,30 @@ int nextFixedSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int sta
float *v1, *v2;
float length_threshold;
int i;
-
+
if (stroke_length == 0) {
current_length = 0;
IT_peek(iter, start);
v1 = iter->p;
-
+
for (i = start + 1; i <= end; i++) {
IT_peek(iter, i);
v2 = iter->p;
stroke_length += len_v3v3(v1, v2);
-
+
v1 = v2;
}
-
+
n = 0;
current_length = 0;
}
-
+
n++;
-
+
length_threshold = n * stroke_length / toolsettings->skgen_subdivision_number;
-
+
IT_peek(iter, start);
v1 = iter->p;
@@ -138,12 +138,12 @@ int nextFixedSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int sta
copy_v3_v3(p, v2);
return i;
}
-
+
v1 = v2;
}
-
+
stroke_length = 0;
-
+
return -1;
}
int nextAdaptativeSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int start, int end, float head[3], float p[3])
@@ -152,7 +152,7 @@ int nextAdaptativeSubdivision(ToolSettings *toolsettings, BArcIterator *iter, in
float *start_p;
float n[3];
int i;
-
+
IT_peek(iter, start);
start_p = iter->p;
@@ -167,7 +167,7 @@ int nextAdaptativeSubdivision(ToolSettings *toolsettings, BArcIterator *iter, in
return i - 1;
}
}
-
+
return -1;
}
@@ -176,37 +176,37 @@ int nextLengthSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int st
float lengthLimit = toolsettings->skgen_length_limit;
int same = 1;
int i;
-
+
i = start + 1;
while (i <= end) {
float *vec0;
float *vec1;
-
+
IT_peek(iter, i - 1);
vec0 = iter->p;
IT_peek(iter, i);
vec1 = iter->p;
-
+
/* If lengthLimit hits the current segment */
if (len_v3v3(vec1, head) > lengthLimit) {
if (same == 0) {
float dv[3], off[3];
float a, b, c, f;
-
+
/* Solve quadratic distance equation */
sub_v3_v3v3(dv, vec1, vec0);
a = dot_v3v3(dv, dv);
-
+
sub_v3_v3v3(off, vec0, head);
b = 2 * dot_v3v3(dv, off);
-
+
c = dot_v3v3(off, off) - (lengthLimit * lengthLimit);
-
+
f = (-b + sqrtf(b * b - 4 * a * c)) / (2 * a);
-
+
//printf("a %f, b %f, c %f, f %f\n", a, b, c, f);
-
+
if (isnan(f) == 0 && f < 1.0f) {
copy_v3_v3(p, dv);
mul_v3_fl(p, f);
@@ -218,15 +218,15 @@ int nextLengthSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int st
}
else {
float dv[3];
-
+
sub_v3_v3v3(dv, vec1, vec0);
normalize_v3(dv);
-
+
copy_v3_v3(p, dv);
mul_v3_fl(p, lengthLimit);
add_v3_v3(p, head);
}
-
+
return i - 1; /* restart at lower bound */
}
else {
@@ -234,7 +234,7 @@ int nextLengthSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int st
same = 0; // Reset same
}
}
-
+
return -1;
}
@@ -249,18 +249,18 @@ EditBone *subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *U
int bone_start = 0;
int end = iter->length;
int index;
-
+
IT_head(iter);
-
+
parent = ED_armature_ebone_add(arm, "Bone");
copy_v3_v3(parent->head, iter->p);
-
+
if (iter->size > FLT_EPSILON) {
parent->rad_head = iter->size * size_buffer;
}
-
+
normal = iter->no;
-
+
index = next_subdividion(toolsettings, iter, bone_start, end, parent->head, parent->tail);
while (index != -1) {
IT_peek(iter, index);
@@ -269,7 +269,7 @@ EditBone *subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *U
copy_v3_v3(child->head, parent->tail);
child->parent = parent;
child->flag |= BONE_CONNECTED;
-
+
if (iter->size > FLT_EPSILON) {
child->rad_head = iter->size * size_buffer;
parent->rad_tail = iter->size * size_buffer;
@@ -287,19 +287,19 @@ EditBone *subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *U
index = next_subdividion(toolsettings, iter, bone_start, end, parent->head, parent->tail);
}
-
+
iter->tail(iter);
copy_v3_v3(parent->tail, iter->p);
if (iter->size > FLT_EPSILON) {
parent->rad_tail = iter->size * size_buffer;
}
-
+
/* fix last bone */
mul_m4_v3(invmat, parent->tail);
mul_m4_v3(invmat, parent->head);
setBoneRollFromNormal(parent, iter->no, invmat, tmat);
lastBone = parent;
-
+
return lastBone;
}