diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2015-06-08 16:28:25 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2015-06-08 16:28:25 +0300 |
commit | 7fe46cdecb96bb445e20e8c6e333285332126780 (patch) | |
tree | 15524a7cad3ab8f8656adf03ecebec86746f47bf /source/blender/blenkernel | |
parent | c5ea1d47e830265aa347e4a50e72da000c063adb (diff) | |
parent | bcfe38aa037e2fcf1c41a3a85895c1482e21e0aa (diff) |
Merge branch 'master' into gooseberry
Conflicts:
source/blender/blenkernel/intern/key.c
source/blender/blenlib/intern/path_util.c
source/blender/editors/object/object_shapekey.c
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_key.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/key.c | 24 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 81 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/smoke.c | 2 |
8 files changed, 115 insertions, 17 deletions
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h index 3335a6c5b56..1e9e392406b 100644 --- a/source/blender/blenkernel/BKE_key.h +++ b/source/blender/blenkernel/BKE_key.h @@ -83,6 +83,7 @@ float *BKE_key_evaluate_particles_ex( float *BKE_key_evaluate_particles( struct Object *ob, struct ParticleSystem *psys, float cfra, int *r_totelem); +struct Key **BKE_key_from_object_p(struct Object *ob); struct Key *BKE_key_from_object(struct Object *ob); struct KeyBlock *BKE_keyblock_from_object(struct Object *ob); struct KeyBlock *BKE_keyblock_from_object_reference(struct Object *ob); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 0465a354f9f..9482ec778d3 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -217,7 +217,9 @@ int BKE_object_obdata_texspace_get(struct Object *ob, short **r_texflag, float * int BKE_object_insert_ptcache(struct Object *ob); void BKE_object_delete_ptcache(struct Object *ob, int index); -struct KeyBlock *BKE_object_insert_shape_key(struct Object *ob, const char *name, const bool from_mix); +struct KeyBlock *BKE_object_shapekey_insert(struct Object *ob, const char *name, const bool from_mix); +bool BKE_object_shapekey_remove(struct Main *bmain, struct Object *ob, struct KeyBlock *kb); +bool BKE_object_shapekey_free(struct Main *bmain, struct Object *ob); bool BKE_object_flag_test_recursive(const struct Object *ob, short flag); diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 5da63b3441e..9f83ffa2577 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -4368,8 +4368,10 @@ void BKE_curve_transform_ex(Curve *cu, float mat[4][4], const bool do_keys, cons } else { i = nu->pntsu * nu->pntsv; - for (bp = nu->bp; i--; bp++) + for (bp = nu->bp; i--; bp++) { mul_m4_v3(mat, bp->vec); + bp->radius *= unit_scale; + } } } diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index a8c562029b6..09934c872f7 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -3394,9 +3394,11 @@ static ImBuf *load_image_single( flag |= imbuf_alpha_flags_for_image(ima); imapf = BLI_findlink(&ima->packedfiles, view_id); - ibuf = IMB_ibImageFromMemory( - (unsigned char *)imapf->packedfile->data, imapf->packedfile->size, flag, - ima->colorspace_settings.name, "<packed data>"); + if (imapf->packedfile) { + ibuf = IMB_ibImageFromMemory( + (unsigned char *)imapf->packedfile->data, imapf->packedfile->size, flag, + ima->colorspace_settings.name, "<packed data>"); + } } else { ImageUser iuser_t; diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index 7afcfdbd2f2..092dd90041f 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -2122,25 +2122,37 @@ float *BKE_key_evaluate_particles(Object *ob, ParticleSystem *psys, float cfra, return BKE_key_evaluate_particles_ex(ob, psys, cfra, r_totelem, NULL, 0); } -Key *BKE_key_from_object(Object *ob) +Key **BKE_key_from_object_p(Object *ob) { - if (ob == NULL) return NULL; - + if (ob == NULL) + return NULL; + if (ob->type == OB_MESH) { Mesh *me = ob->data; - return me->key; + return &me->key; } else if (ELEM(ob->type, OB_CURVE, OB_SURF)) { Curve *cu = ob->data; - return cu->key; + return &cu->key; } else if (ob->type == OB_LATTICE) { Lattice *lt = ob->data; - return lt->key; + return <->key; } return NULL; } +Key *BKE_key_from_object(Object *ob) +{ + Key **key_p; + key_p = BKE_key_from_object_p(ob); + if (key_p) { + return *key_p; + } + + return NULL; +} + KeyBlock *BKE_keyblock_add(Key *key, const char *name) { KeyBlock *kb; diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 4bf18e0eb4c..9e159fa5852 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1109,7 +1109,7 @@ bNodeTree *ntreeAddTree(Main *bmain, const char *name, const char *idname) * copying for internal use (threads for eg), where you wont want it to modify the * scene data. */ -static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, Main *bmain, bool do_id_user, bool do_make_extern, bool copy_previews) +static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, Main *bmain, bool skip_database, bool do_id_user, bool do_make_extern, bool copy_previews) { bNodeTree *newtree; bNode *node /*, *nnode */ /* UNUSED */, *last; @@ -1119,7 +1119,7 @@ static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, Main *bmain, bool do_ if (ntree == NULL) return NULL; /* is ntree part of library? */ - if (bmain && BLI_findindex(&bmain->nodetree, ntree) >= 0) { + if (bmain && !skip_database && BLI_findindex(&bmain->nodetree, ntree) >= 0) { newtree = BKE_libblock_copy(&ntree->id); } else { @@ -1211,7 +1211,7 @@ static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, Main *bmain, bool do_ bNodeTree *ntreeCopyTree_ex(bNodeTree *ntree, Main *bmain, const bool do_id_user) { - return ntreeCopyTree_internal(ntree, bmain, do_id_user, true, true); + return ntreeCopyTree_internal(ntree, bmain, false, do_id_user, true, true); } bNodeTree *ntreeCopyTree(bNodeTree *ntree) { @@ -1980,7 +1980,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree) /* Make full copy. * Note: previews are not copied here. */ - ltree = ntreeCopyTree_internal(ntree, NULL, false, false, false); + ltree = ntreeCopyTree_internal(ntree, G.main, true, false, false, false); ltree->flag |= NTREE_IS_LOCALIZED; for (node = ltree->nodes.first; node; node = node->next) { diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 5595d824ed0..9a9f176dc46 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -3405,7 +3405,7 @@ static KeyBlock *insert_curvekey(Object *ob, const char *name, const bool from_m return kb; } -KeyBlock *BKE_object_insert_shape_key(Object *ob, const char *name, const bool from_mix) +KeyBlock *BKE_object_shapekey_insert(Object *ob, const char *name, const bool from_mix) { switch (ob->type) { case OB_MESH: @@ -3421,6 +3421,85 @@ KeyBlock *BKE_object_insert_shape_key(Object *ob, const char *name, const bool f } +bool BKE_object_shapekey_free(Main *bmain, Object *ob) +{ + Key **key_p, *key; + + key_p = BKE_key_from_object_p(ob); + if (ELEM(NULL, key_p, *key_p)) { + return false; + } + + key = *key_p; + *key_p = NULL; + + BKE_libblock_free_us(bmain, key); + + return false; +} + +bool BKE_object_shapekey_remove(Main *bmain, Object *ob, KeyBlock *kb) +{ + KeyBlock *rkb; + Key *key = BKE_key_from_object(ob); + short kb_index; + + if (key == NULL) { + return false; + } + + kb_index = BLI_findindex(&key->block, kb); + BLI_assert(kb_index != -1); + + for (rkb = key->block.first; rkb; rkb = rkb->next) { + if (rkb->relative == kb_index) { + /* remap to the 'Basis' */ + rkb->relative = 0; + } + else if (rkb->relative >= kb_index) { + /* Fix positional shift of the keys when kb is deleted from the list */ + rkb->relative -= 1; + } + } + + BLI_remlink(&key->block, kb); + key->totkey--; + if (key->refkey == kb) { + key->refkey = key->block.first; + + if (key->refkey) { + /* apply new basis key on original data */ + switch (ob->type) { + case OB_MESH: + BKE_keyblock_convert_to_mesh(key->refkey, ob->data); + break; + case OB_CURVE: + case OB_SURF: + BKE_keyblock_convert_to_curve(key->refkey, ob->data, BKE_curve_nurbs_get(ob->data)); + break; + case OB_LATTICE: + BKE_keyblock_convert_to_lattice(key->refkey, ob->data); + break; + } + } + } + + if (kb->data) { + MEM_freeN(kb->data); + } + MEM_freeN(kb); + + if (ob->shapenr > 1) { + ob->shapenr--; + } + + if (key->totkey == 0) { + BKE_object_shapekey_free(bmain, ob); + } + + return true; +} + bool BKE_object_flag_test_recursive(const Object *ob, short flag) { if (ob->flag & flag) { diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index f66a25288b3..6a0af3ed118 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -269,7 +269,7 @@ static void smoke_set_domain_from_derivedmesh(SmokeDomainSettings *sds, Object * } /* apply object scale */ for (i = 0; i < 3; i++) { - size[i] = fabs(size[i] * ob->size[i]); + size[i] = fabsf(size[i] * ob->size[i]); } copy_v3_v3(sds->global_size, size); copy_v3_v3(sds->dp0, min); |