diff options
Diffstat (limited to 'source/blender/editors/armature/editarmature_generate.c')
-rw-r--r-- | source/blender/editors/armature/editarmature_generate.c | 92 |
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; } |