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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2011-03-03 16:26:55 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-03-03 16:26:55 +0300
commit36db7f8eb74924e832f752ee2e1382cca9bf0a62 (patch)
treeacabc363b2c5048802b623d3915cc29c7727cab1 /source/blender/editors/mesh
parent2f741e4dde0398b85d14a88b73ab317567eb799b (diff)
Fix #26261: blend from shape operator "add" option was not working correct.
Diffstat (limited to 'source/blender/editors/mesh')
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 81b1c0919ee..e22dab2f3c8 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -5204,8 +5204,8 @@ static int blend_from_shape_exec(bContext *C, wmOperator *op)
Key *key= me->key;
EditMesh *em= BKE_mesh_get_editmesh(me);
EditVert *eve;
- KeyBlock *kb;
- float *data, co[3];
+ KeyBlock *kb, *refkb= NULL;
+ float *data, *refdata= NULL, co[3];
float blend= RNA_float_get(op->ptr, "blend");
int shape= RNA_enum_get(op->ptr, "shape");
int add= RNA_boolean_get(op->ptr, "add");
@@ -5214,17 +5214,28 @@ static int blend_from_shape_exec(bContext *C, wmOperator *op)
if(key && (kb= BLI_findlink(&key->block, shape))) {
data= kb->data;
+ if(add) {
+ refkb= BLI_findlink(&key->block, kb->relative);
+ if(refkb)
+ refdata = refkb->data;
+ }
+
for(eve=em->verts.first; eve; eve=eve->next){
if(eve->f & SELECT) {
if(eve->keyindex >= 0 && eve->keyindex < kb->totelem) {
- VECCOPY(co, data + eve->keyindex*3);
+ copy_v3_v3(co, data + eve->keyindex*3);
if(add) {
- mul_v3_fl(co, blend);
- add_v3_v3(eve->co, co);
+ /* in add mode, we add relative shape key offset */
+ if(refdata && eve->keyindex < refkb->totelem)
+ sub_v3_v3v3(co, co, refdata + eve->keyindex*3);
+
+ madd_v3_v3fl(eve->co, co, blend);
}
- else
+ else {
+ /* in blend mode, we interpolate to the shape key */
interp_v3_v3v3(eve->co, eve->co, co, blend);
+ }
blended= 1;
}