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:
authorCampbell Barton <ideasman42@gmail.com>2010-12-15 10:15:51 +0300
committerCampbell Barton <ideasman42@gmail.com>2010-12-15 10:15:51 +0300
commitdbd3081895b6b03c8b321803e0fe2900b7577beb (patch)
treec4e281d7eed80f1e723d519e03bb193185395925 /source/blender/editors/space_view3d
parent46ce8cdf58bdbab4074558fcbd550a3bcf55dde3 (diff)
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.
Diffstat (limited to 'source/blender/editors/space_view3d')
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c72
1 files changed, 54 insertions, 18 deletions
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index d2775d7f03d..9450a3f223a 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -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);
}