fix for annoyance found when looking into bug [#25226].

Changing the edge crease median value often wouldn't result in the median value entered because of clamping from 0-1.
Now the median crease is applied by scaling the values up/down.

also add some simple checks to speed up updates,
- don't move verts or recalculate normals if only crease changes.
- don't apply crease changes if location is being edited.
This commit is contained in:
Campbell Barton 2010-12-15 07:15:51 +00:00
parent 46ce8cdf58
commit dbd3081895

@ -381,30 +381,66 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
EditMesh *em = BKE_mesh_get_editmesh(me);
EditVert *eve;
EditEdge *eed;
eve= em->verts.first;
while(eve) {
if(eve->f & SELECT) {
add_v3_v3(eve->co, median);
/* allow for some rounding error becasue of matrix transform */
if(len_v3(median) > 0.000001) {
EditVert *eve;
for(eve= em->verts.first; eve; eve= eve->next) {
if(eve->f & SELECT) {
add_v3_v3(eve->co, median);
}
}
eve= eve->next;
recalc_editnormals(em);
}
for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->f & SELECT) {
/* ensure the median can be set to zero or one */
if(ve_median[3]==0.0f) eed->crease= 0.0f;
else if(ve_median[3]==1.0f) eed->crease= 1.0f;
if(median[3] != 0.0f) {
EditEdge *eed;
const float fixed_crease= (ve_median[3] <= 0.0f ? 0.0 : (ve_median[3] >= 1.0f ? 1.0 : FLT_MAX));
if(fixed_crease != FLT_MAX) {
/* simple case */
for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->f & SELECT) {
eed->crease= fixed_crease;
}
}
}
else {
/* scale crease to target median */
float median_new= ve_median[3];
float median_orig= ve_median[3] - median[3]; /* previous median value */
/* incase of floating point error */
CLAMP(median_orig, 0.0, 1.0);
CLAMP(median_new, 0.0, 1.0);
if(median_new < median_orig) {
/* scale down */
const float sca= median_new / median_orig;
for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->f & SELECT) {
eed->crease *= sca;
CLAMP(eed->crease, 0.0, 1.0);
}
}
}
else {
eed->crease+= median[3];
CLAMP(eed->crease, 0.0, 1.0);
/* scale up */
const float sca= (1.0f - median_new) / (1.0f - median_orig);
for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->f & SELECT) {
eed->crease = 1.0f - ((1.0f - eed->crease) * sca);
CLAMP(eed->crease, 0.0, 1.0);
}
}
}
}
}
recalc_editnormals(em);
BKE_mesh_end_editmesh(me, em);
}