diff options
Diffstat (limited to 'source/blender/blenkernel/intern/mball.c')
-rw-r--r-- | source/blender/blenkernel/intern/mball.c | 720 |
1 files changed, 361 insertions, 359 deletions
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 6a28c341fac..8ab042d5446 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -63,37 +63,38 @@ /** Free (or release) any data used by this mball (does not free the mball itself). */ void BKE_mball_free(MetaBall *mb) { - BKE_animdata_free((ID *)mb, false); + BKE_animdata_free((ID *)mb, false); - BKE_mball_batch_cache_free(mb); + BKE_mball_batch_cache_free(mb); - MEM_SAFE_FREE(mb->mat); + MEM_SAFE_FREE(mb->mat); - BLI_freelistN(&mb->elems); - if (mb->disp.first) BKE_displist_free(&mb->disp); + BLI_freelistN(&mb->elems); + if (mb->disp.first) + BKE_displist_free(&mb->disp); } void BKE_mball_init(MetaBall *mb) { - BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(mb, id)); + BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(mb, id)); - mb->size[0] = mb->size[1] = mb->size[2] = 1.0; - mb->texflag = MB_AUTOSPACE; + mb->size[0] = mb->size[1] = mb->size[2] = 1.0; + mb->texflag = MB_AUTOSPACE; - mb->wiresize = 0.4f; - mb->rendersize = 0.2f; - mb->thresh = 0.6f; + mb->wiresize = 0.4f; + mb->rendersize = 0.2f; + mb->thresh = 0.6f; } MetaBall *BKE_mball_add(Main *bmain, const char *name) { - MetaBall *mb; + MetaBall *mb; - mb = BKE_libblock_alloc(bmain, ID_MB, name, 0); + mb = BKE_libblock_alloc(bmain, ID_MB, name, 0); - BKE_mball_init(mb); + BKE_mball_init(mb); - return mb; + return mb; } /** @@ -104,76 +105,79 @@ MetaBall *BKE_mball_add(Main *bmain, const char *name) * * \param flag: Copying options (see BKE_library.h's LIB_ID_COPY_... flags for more). */ -void BKE_mball_copy_data(Main *UNUSED(bmain), MetaBall *mb_dst, const MetaBall *mb_src, const int UNUSED(flag)) +void BKE_mball_copy_data(Main *UNUSED(bmain), + MetaBall *mb_dst, + const MetaBall *mb_src, + const int UNUSED(flag)) { - BLI_duplicatelist(&mb_dst->elems, &mb_src->elems); + BLI_duplicatelist(&mb_dst->elems, &mb_src->elems); - mb_dst->mat = MEM_dupallocN(mb_src->mat); + mb_dst->mat = MEM_dupallocN(mb_src->mat); - mb_dst->editelems = NULL; - mb_dst->lastelem = NULL; - mb_dst->batch_cache = NULL; + mb_dst->editelems = NULL; + mb_dst->lastelem = NULL; + mb_dst->batch_cache = NULL; } MetaBall *BKE_mball_copy(Main *bmain, const MetaBall *mb) { - MetaBall *mb_copy; - BKE_id_copy(bmain, &mb->id, (ID **)&mb_copy); - return mb_copy; + MetaBall *mb_copy; + BKE_id_copy(bmain, &mb->id, (ID **)&mb_copy); + return mb_copy; } void BKE_mball_make_local(Main *bmain, MetaBall *mb, const bool lib_local) { - BKE_id_make_local_generic(bmain, &mb->id, true, lib_local); + BKE_id_make_local_generic(bmain, &mb->id, true, lib_local); } /* most simple meta-element adding function * don't do context manipulation here (rna uses) */ MetaElem *BKE_mball_element_add(MetaBall *mb, const int type) { - MetaElem *ml = MEM_callocN(sizeof(MetaElem), "metaelem"); + MetaElem *ml = MEM_callocN(sizeof(MetaElem), "metaelem"); - unit_qt(ml->quat); + unit_qt(ml->quat); - ml->rad = 2.0; - ml->s = 2.0; - ml->flag = MB_SCALE_RAD; + ml->rad = 2.0; + ml->s = 2.0; + ml->flag = MB_SCALE_RAD; - switch (type) { - case MB_BALL: - ml->type = MB_BALL; - ml->expx = ml->expy = ml->expz = 1.0; + switch (type) { + case MB_BALL: + ml->type = MB_BALL; + ml->expx = ml->expy = ml->expz = 1.0; - break; - case MB_TUBE: - ml->type = MB_TUBE; - ml->expx = ml->expy = ml->expz = 1.0; + break; + case MB_TUBE: + ml->type = MB_TUBE; + ml->expx = ml->expy = ml->expz = 1.0; - break; - case MB_PLANE: - ml->type = MB_PLANE; - ml->expx = ml->expy = ml->expz = 1.0; + break; + case MB_PLANE: + ml->type = MB_PLANE; + ml->expx = ml->expy = ml->expz = 1.0; - break; - case MB_ELIPSOID: - ml->type = MB_ELIPSOID; - ml->expx = 1.2f; - ml->expy = 0.8f; - ml->expz = 1.0; + break; + case MB_ELIPSOID: + ml->type = MB_ELIPSOID; + ml->expx = 1.2f; + ml->expy = 0.8f; + ml->expz = 1.0; - break; - case MB_CUBE: - ml->type = MB_CUBE; - ml->expx = ml->expy = ml->expz = 1.0; + break; + case MB_CUBE: + ml->type = MB_CUBE; + ml->expx = ml->expy = ml->expz = 1.0; - break; - default: - break; - } + break; + default: + break; + } - BLI_addtail(&mb->elems, ml); + BLI_addtail(&mb->elems, ml); - return ml; + return ml; } /** Compute bounding box of all MetaElems/MetaBalls. * @@ -183,95 +187,96 @@ MetaElem *BKE_mball_element_add(MetaBall *mb, const int type) */ void BKE_mball_texspace_calc(Object *ob) { - DispList *dl; - BoundBox *bb; - float *data, min[3], max[3] /*, loc[3], size[3] */; - int tot; - bool do_it = false; - - if (ob->runtime.bb == NULL) { - ob->runtime.bb = MEM_callocN(sizeof(BoundBox), "mb boundbox"); - } - bb = ob->runtime.bb; - - /* Weird one, this. */ -/* INIT_MINMAX(min, max); */ - (min)[0] = (min)[1] = (min)[2] = 1.0e30f; - (max)[0] = (max)[1] = (max)[2] = -1.0e30f; - - dl = ob->runtime.curve_cache->disp.first; - while (dl) { - tot = dl->nr; - if (tot) do_it = true; - data = dl->verts; - while (tot--) { - /* Also weird... but longer. From utildefines. */ - minmax_v3v3_v3(min, max, data); - data += 3; - } - dl = dl->next; - } - - if (!do_it) { - min[0] = min[1] = min[2] = -1.0f; - max[0] = max[1] = max[2] = 1.0f; - } - - BKE_boundbox_init_from_minmax(bb, min, max); - - bb->flag &= ~BOUNDBOX_DIRTY; + DispList *dl; + BoundBox *bb; + float *data, min[3], max[3] /*, loc[3], size[3] */; + int tot; + bool do_it = false; + + if (ob->runtime.bb == NULL) { + ob->runtime.bb = MEM_callocN(sizeof(BoundBox), "mb boundbox"); + } + bb = ob->runtime.bb; + + /* Weird one, this. */ + /* INIT_MINMAX(min, max); */ + (min)[0] = (min)[1] = (min)[2] = 1.0e30f; + (max)[0] = (max)[1] = (max)[2] = -1.0e30f; + + dl = ob->runtime.curve_cache->disp.first; + while (dl) { + tot = dl->nr; + if (tot) + do_it = true; + data = dl->verts; + while (tot--) { + /* Also weird... but longer. From utildefines. */ + minmax_v3v3_v3(min, max, data); + data += 3; + } + dl = dl->next; + } + + if (!do_it) { + min[0] = min[1] = min[2] = -1.0f; + max[0] = max[1] = max[2] = 1.0f; + } + + BKE_boundbox_init_from_minmax(bb, min, max); + + bb->flag &= ~BOUNDBOX_DIRTY; } /** Return or compute bbox for given metaball object. */ BoundBox *BKE_mball_boundbox_get(Object *ob) { - BLI_assert(ob->type == OB_MBALL); + BLI_assert(ob->type == OB_MBALL); - if (ob->runtime.bb != NULL && (ob->runtime.bb->flag & BOUNDBOX_DIRTY) == 0) { - return ob->runtime.bb; - } + if (ob->runtime.bb != NULL && (ob->runtime.bb->flag & BOUNDBOX_DIRTY) == 0) { + return ob->runtime.bb; + } - /* This should always only be called with evaluated objects, but currently RNA is a problem here... */ - if (ob->runtime.curve_cache != NULL) { - BKE_mball_texspace_calc(ob); - } + /* This should always only be called with evaluated objects, but currently RNA is a problem here... */ + if (ob->runtime.curve_cache != NULL) { + BKE_mball_texspace_calc(ob); + } - return ob->runtime.bb; + return ob->runtime.bb; } float *BKE_mball_make_orco(Object *ob, ListBase *dispbase) { - BoundBox *bb; - DispList *dl; - float *data, *orco, *orcodata; - float loc[3], size[3]; - int a; + BoundBox *bb; + DispList *dl; + float *data, *orco, *orcodata; + float loc[3], size[3]; + int a; - /* restore size and loc */ - bb = ob->runtime.bb; - loc[0] = (bb->vec[0][0] + bb->vec[4][0]) / 2.0f; - size[0] = bb->vec[4][0] - loc[0]; - loc[1] = (bb->vec[0][1] + bb->vec[2][1]) / 2.0f; - size[1] = bb->vec[2][1] - loc[1]; - loc[2] = (bb->vec[0][2] + bb->vec[1][2]) / 2.0f; - size[2] = bb->vec[1][2] - loc[2]; + /* restore size and loc */ + bb = ob->runtime.bb; + loc[0] = (bb->vec[0][0] + bb->vec[4][0]) / 2.0f; + size[0] = bb->vec[4][0] - loc[0]; + loc[1] = (bb->vec[0][1] + bb->vec[2][1]) / 2.0f; + size[1] = bb->vec[2][1] - loc[1]; + loc[2] = (bb->vec[0][2] + bb->vec[1][2]) / 2.0f; + size[2] = bb->vec[1][2] - loc[2]; - dl = dispbase->first; - orcodata = MEM_mallocN(sizeof(float) * 3 * dl->nr, "MballOrco"); + dl = dispbase->first; + orcodata = MEM_mallocN(sizeof(float) * 3 * dl->nr, "MballOrco"); - data = dl->verts; - orco = orcodata; - a = dl->nr; - while (a--) { - orco[0] = (data[0] - loc[0]) / size[0]; - orco[1] = (data[1] - loc[1]) / size[1]; - orco[2] = (data[2] - loc[2]) / size[2]; + data = dl->verts; + orco = orcodata; + a = dl->nr; + while (a--) { + orco[0] = (data[0] - loc[0]) / size[0]; + orco[1] = (data[1] - loc[1]) / size[1]; + orco[2] = (data[2] - loc[2]) / size[2]; - data += 3; - orco += 3; - } + data += 3; + orco += 3; + } - return orcodata; + return orcodata; } /* Note on mball basis stuff 2.5x (this is a can of worms) @@ -285,7 +290,6 @@ float *BKE_mball_make_orco(Object *ob, ListBase *dispbase) * - Campbell */ - /** \brief Test, if Object *ob is basic MetaBall. * * It test last character of Object ID name. If last character @@ -293,64 +297,63 @@ float *BKE_mball_make_orco(Object *ob, ListBase *dispbase) */ bool BKE_mball_is_basis(Object *ob) { - /* just a quick test */ - const int len = strlen(ob->id.name); - return (!isdigit(ob->id.name[len - 1])); + /* just a quick test */ + const int len = strlen(ob->id.name); + return (!isdigit(ob->id.name[len - 1])); } /* return nonzero if ob1 is a basis mball for ob */ bool BKE_mball_is_basis_for(Object *ob1, Object *ob2) { - int basis1nr, basis2nr; - char basis1name[MAX_ID_NAME], basis2name[MAX_ID_NAME]; + int basis1nr, basis2nr; + char basis1name[MAX_ID_NAME], basis2name[MAX_ID_NAME]; - if (ob1->id.name[2] != ob2->id.name[2]) { - /* Quick return in case first char of both ID's names is not the same... */ - return false; - } + if (ob1->id.name[2] != ob2->id.name[2]) { + /* Quick return in case first char of both ID's names is not the same... */ + return false; + } - BLI_split_name_num(basis1name, &basis1nr, ob1->id.name + 2, '.'); - BLI_split_name_num(basis2name, &basis2nr, ob2->id.name + 2, '.'); + BLI_split_name_num(basis1name, &basis1nr, ob1->id.name + 2, '.'); + BLI_split_name_num(basis2name, &basis2nr, ob2->id.name + 2, '.'); - if (STREQ(basis1name, basis2name)) { - return BKE_mball_is_basis(ob1); - } - else { - return false; - } + if (STREQ(basis1name, basis2name)) { + return BKE_mball_is_basis(ob1); + } + else { + return false; + } } bool BKE_mball_is_any_selected(const MetaBall *mb) { - for (const MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) { - if (ml->flag & SELECT) { - return true; - } - } - return false; + for (const MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) { + if (ml->flag & SELECT) { + return true; + } + } + return false; } - bool BKE_mball_is_any_selected_multi(Base **bases, int bases_len) { - for (uint base_index = 0; base_index < bases_len; base_index++) { - Object *obedit = bases[base_index]->object; - MetaBall *mb = (MetaBall *)obedit->data; - if (BKE_mball_is_any_selected(mb)) { - return true; - } - } - return false; + for (uint base_index = 0; base_index < bases_len; base_index++) { + Object *obedit = bases[base_index]->object; + MetaBall *mb = (MetaBall *)obedit->data; + if (BKE_mball_is_any_selected(mb)) { + return true; + } + } + return false; } bool BKE_mball_is_any_unselected(const MetaBall *mb) { - for (const MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) { - if ((ml->flag & SELECT) == 0) { - return true; - } - } - return false; + for (const MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) { + if ((ml->flag & SELECT) == 0) { + return true; + } + } + return false; } /* \brief copy some properties from object to other metaball object with same base name @@ -361,40 +364,40 @@ bool BKE_mball_is_any_unselected(const MetaBall *mb) * because this metaball influence polygonisation of metaballs. */ void BKE_mball_properties_copy(Scene *scene, Object *active_object) { - Scene *sce_iter = scene; - Base *base; - Object *ob; - MetaBall *active_mball = (MetaBall *)active_object->data; - int basisnr, obnr; - char basisname[MAX_ID_NAME], obname[MAX_ID_NAME]; - SceneBaseIter iter; - - BLI_split_name_num(basisname, &basisnr, active_object->id.name + 2, '.'); - - /* Pass depsgraph as NULL, which means we will not expand into - * duplis unlike when we generate the mball. Expanding duplis - * would not be compatible when editing multiple view layers. */ - BKE_scene_base_iter_next(NULL, &iter, &sce_iter, 0, NULL, NULL); - while (BKE_scene_base_iter_next(NULL, &iter, &sce_iter, 1, &base, &ob)) { - if (ob->type == OB_MBALL) { - if (ob != active_object) { - BLI_split_name_num(obname, &obnr, ob->id.name + 2, '.'); - - /* Object ob has to be in same "group" ... it means, that it has to have - * same base of its name */ - if (STREQ(obname, basisname)) { - MetaBall *mb = ob->data; - - /* Copy properties from selected/edited metaball */ - mb->wiresize = active_mball->wiresize; - mb->rendersize = active_mball->rendersize; - mb->thresh = active_mball->thresh; - mb->flag = active_mball->flag; - DEG_id_tag_update(&mb->id, 0); - } - } - } - } + Scene *sce_iter = scene; + Base *base; + Object *ob; + MetaBall *active_mball = (MetaBall *)active_object->data; + int basisnr, obnr; + char basisname[MAX_ID_NAME], obname[MAX_ID_NAME]; + SceneBaseIter iter; + + BLI_split_name_num(basisname, &basisnr, active_object->id.name + 2, '.'); + + /* Pass depsgraph as NULL, which means we will not expand into + * duplis unlike when we generate the mball. Expanding duplis + * would not be compatible when editing multiple view layers. */ + BKE_scene_base_iter_next(NULL, &iter, &sce_iter, 0, NULL, NULL); + while (BKE_scene_base_iter_next(NULL, &iter, &sce_iter, 1, &base, &ob)) { + if (ob->type == OB_MBALL) { + if (ob != active_object) { + BLI_split_name_num(obname, &obnr, ob->id.name + 2, '.'); + + /* Object ob has to be in same "group" ... it means, that it has to have + * same base of its name */ + if (STREQ(obname, basisname)) { + MetaBall *mb = ob->data; + + /* Copy properties from selected/edited metaball */ + mb->wiresize = active_mball->wiresize; + mb->rendersize = active_mball->rendersize; + mb->thresh = active_mball->thresh; + mb->flag = active_mball->flag; + DEG_id_tag_update(&mb->id, 0); + } + } + } + } } /** \brief This function finds basic MetaBall. @@ -408,234 +411,233 @@ void BKE_mball_properties_copy(Scene *scene, Object *active_object) */ Object *BKE_mball_basis_find(Scene *scene, Object *basis) { - Object *bob = basis; - int basisnr, obnr; - char basisname[MAX_ID_NAME], obname[MAX_ID_NAME]; + Object *bob = basis; + int basisnr, obnr; + char basisname[MAX_ID_NAME], obname[MAX_ID_NAME]; - BLI_split_name_num(basisname, &basisnr, basis->id.name + 2, '.'); + BLI_split_name_num(basisname, &basisnr, basis->id.name + 2, '.'); - for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - Object *ob = base->object; - if ((ob->type == OB_MBALL) && !(base->flag & BASE_FROM_DUPLI)) { - if (ob != bob) { - BLI_split_name_num(obname, &obnr, ob->id.name + 2, '.'); + for (ViewLayer *view_layer = scene->view_layers.first; view_layer; + view_layer = view_layer->next) { + for (Base *base = view_layer->object_bases.first; base; base = base->next) { + Object *ob = base->object; + if ((ob->type == OB_MBALL) && !(base->flag & BASE_FROM_DUPLI)) { + if (ob != bob) { + BLI_split_name_num(obname, &obnr, ob->id.name + 2, '.'); - /* object ob has to be in same "group" ... it means, that it has to have same base of its name */ - if (STREQ(obname, basisname)) { - if (obnr < basisnr) { - basis = ob; - basisnr = obnr; - } - } - } - } - } - } + /* object ob has to be in same "group" ... it means, that it has to have same base of its name */ + if (STREQ(obname, basisname)) { + if (obnr < basisnr) { + basis = ob; + basisnr = obnr; + } + } + } + } + } + } - return basis; + return basis; } bool BKE_mball_minmax_ex( - const MetaBall *mb, float min[3], float max[3], - const float obmat[4][4], const short flag) + const MetaBall *mb, float min[3], float max[3], const float obmat[4][4], const short flag) { - const float scale = obmat ? mat4_to_scale(obmat) : 1.0f; - bool changed = false; - float centroid[3], vec[3]; + const float scale = obmat ? mat4_to_scale(obmat) : 1.0f; + bool changed = false; + float centroid[3], vec[3]; - INIT_MINMAX(min, max); + INIT_MINMAX(min, max); - for (const MetaElem *ml = mb->elems.first; ml; ml = ml->next) { - if ((ml->flag & flag) == flag) { - const float scale_mb = (ml->rad * 0.5f) * scale; - int i; + for (const MetaElem *ml = mb->elems.first; ml; ml = ml->next) { + if ((ml->flag & flag) == flag) { + const float scale_mb = (ml->rad * 0.5f) * scale; + int i; - if (obmat) { - mul_v3_m4v3(centroid, obmat, &ml->x); - } - else { - copy_v3_v3(centroid, &ml->x); - } + if (obmat) { + mul_v3_m4v3(centroid, obmat, &ml->x); + } + else { + copy_v3_v3(centroid, &ml->x); + } - /* TODO, non circle shapes cubes etc, probably nobody notices - campbell */ - for (i = -1; i != 3; i += 2) { - copy_v3_v3(vec, centroid); - add_v3_fl(vec, scale_mb * i); - minmax_v3v3_v3(min, max, vec); - } - changed = true; - } - } + /* TODO, non circle shapes cubes etc, probably nobody notices - campbell */ + for (i = -1; i != 3; i += 2) { + copy_v3_v3(vec, centroid); + add_v3_fl(vec, scale_mb * i); + minmax_v3v3_v3(min, max, vec); + } + changed = true; + } + } - return changed; + return changed; } - /* basic vertex data functions */ bool BKE_mball_minmax(const MetaBall *mb, float min[3], float max[3]) { - INIT_MINMAX(min, max); + INIT_MINMAX(min, max); - for (const MetaElem *ml = mb->elems.first; ml; ml = ml->next) { - minmax_v3v3_v3(min, max, &ml->x); - } + for (const MetaElem *ml = mb->elems.first; ml; ml = ml->next) { + minmax_v3v3_v3(min, max, &ml->x); + } - return (BLI_listbase_is_empty(&mb->elems) == false); + return (BLI_listbase_is_empty(&mb->elems) == false); } bool BKE_mball_center_median(const MetaBall *mb, float r_cent[3]) { - int total = 0; + int total = 0; - zero_v3(r_cent); + zero_v3(r_cent); - for (const MetaElem *ml = mb->elems.first; ml; ml = ml->next) { - add_v3_v3(r_cent, &ml->x); - total++; - } + for (const MetaElem *ml = mb->elems.first; ml; ml = ml->next) { + add_v3_v3(r_cent, &ml->x); + total++; + } - if (total) { - mul_v3_fl(r_cent, 1.0f / (float)total); - } + if (total) { + mul_v3_fl(r_cent, 1.0f / (float)total); + } - return (total != 0); + return (total != 0); } bool BKE_mball_center_bounds(const MetaBall *mb, float r_cent[3]) { - float min[3], max[3]; + float min[3], max[3]; - if (BKE_mball_minmax(mb, min, max)) { - mid_v3_v3v3(r_cent, min, max); - return true; - } + if (BKE_mball_minmax(mb, min, max)) { + mid_v3_v3v3(r_cent, min, max); + return true; + } - return false; + return false; } void BKE_mball_transform(MetaBall *mb, float mat[4][4], const bool do_props) { - float quat[4]; - const float scale = mat4_to_scale(mat); - const float scale_sqrt = sqrtf(scale); + float quat[4]; + const float scale = mat4_to_scale(mat); + const float scale_sqrt = sqrtf(scale); - mat4_to_quat(quat, mat); + mat4_to_quat(quat, mat); - for (MetaElem *ml = mb->elems.first; ml; ml = ml->next) { - mul_m4_v3(mat, &ml->x); - mul_qt_qtqt(ml->quat, quat, ml->quat); + for (MetaElem *ml = mb->elems.first; ml; ml = ml->next) { + mul_m4_v3(mat, &ml->x); + mul_qt_qtqt(ml->quat, quat, ml->quat); - if (do_props) { - ml->rad *= scale; - /* hrmf, probably elems shouldn't be - * treating scale differently - campbell */ - if (!MB_TYPE_SIZE_SQUARED(ml->type)) { - mul_v3_fl(&ml->expx, scale); - } - else { - mul_v3_fl(&ml->expx, scale_sqrt); - } - } - } + if (do_props) { + ml->rad *= scale; + /* hrmf, probably elems shouldn't be + * treating scale differently - campbell */ + if (!MB_TYPE_SIZE_SQUARED(ml->type)) { + mul_v3_fl(&ml->expx, scale); + } + else { + mul_v3_fl(&ml->expx, scale_sqrt); + } + } + } } void BKE_mball_translate(MetaBall *mb, const float offset[3]) { - for (MetaElem *ml = mb->elems.first; ml; ml = ml->next) { - add_v3_v3(&ml->x, offset); - } + for (MetaElem *ml = mb->elems.first; ml; ml = ml->next) { + add_v3_v3(&ml->x, offset); + } } /* *** select funcs *** */ int BKE_mball_select_count(const MetaBall *mb) { - int sel = 0; - for (const MetaElem *ml = mb->editelems->first; ml; ml = ml->next) { - if (ml->flag & SELECT) { - sel++; - } - } - return sel; + int sel = 0; + for (const MetaElem *ml = mb->editelems->first; ml; ml = ml->next) { + if (ml->flag & SELECT) { + sel++; + } + } + return sel; } int BKE_mball_select_count_multi(Base **bases, int bases_len) { - int sel = 0; - for (uint ob_index = 0; ob_index < bases_len; ob_index++) { - const Object *obedit = bases[ob_index]->object; - const MetaBall *mb = (MetaBall *)obedit->data; - sel += BKE_mball_select_count(mb); - } - return sel; + int sel = 0; + for (uint ob_index = 0; ob_index < bases_len; ob_index++) { + const Object *obedit = bases[ob_index]->object; + const MetaBall *mb = (MetaBall *)obedit->data; + sel += BKE_mball_select_count(mb); + } + return sel; } bool BKE_mball_select_all(MetaBall *mb) { - bool changed = false; - for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) { - if ((ml->flag & SELECT) == 0) { - ml->flag |= SELECT; - changed = true; - } - } - return changed; + bool changed = false; + for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) { + if ((ml->flag & SELECT) == 0) { + ml->flag |= SELECT; + changed = true; + } + } + return changed; } bool BKE_mball_select_all_multi_ex(Base **bases, int bases_len) { - bool changed_multi = false; - for (uint ob_index = 0; ob_index < bases_len; ob_index++) { - Object *obedit = bases[ob_index]->object; - MetaBall *mb = obedit->data; - changed_multi |= BKE_mball_select_all(mb); - } - return changed_multi; + bool changed_multi = false; + for (uint ob_index = 0; ob_index < bases_len; ob_index++) { + Object *obedit = bases[ob_index]->object; + MetaBall *mb = obedit->data; + changed_multi |= BKE_mball_select_all(mb); + } + return changed_multi; } bool BKE_mball_deselect_all(MetaBall *mb) { - bool changed = false; - for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) { - if ((ml->flag & SELECT) != 0) { - ml->flag &= ~SELECT; - changed = true; - } - } - return changed; + bool changed = false; + for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) { + if ((ml->flag & SELECT) != 0) { + ml->flag &= ~SELECT; + changed = true; + } + } + return changed; } bool BKE_mball_deselect_all_multi_ex(Base **bases, int bases_len) { - bool changed_multi = false; - for (uint ob_index = 0; ob_index < bases_len; ob_index++) { - Object *obedit = bases[ob_index]->object; - MetaBall *mb = obedit->data; - changed_multi |= BKE_mball_deselect_all(mb); - DEG_id_tag_update(&mb->id, ID_RECALC_SELECT); - } - return changed_multi; + bool changed_multi = false; + for (uint ob_index = 0; ob_index < bases_len; ob_index++) { + Object *obedit = bases[ob_index]->object; + MetaBall *mb = obedit->data; + changed_multi |= BKE_mball_deselect_all(mb); + DEG_id_tag_update(&mb->id, ID_RECALC_SELECT); + } + return changed_multi; } bool BKE_mball_select_swap(MetaBall *mb) { - bool changed = false; - for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) { - ml->flag ^= SELECT; - changed = true; - } - return changed; + bool changed = false; + for (MetaElem *ml = mb->editelems->first; ml; ml = ml->next) { + ml->flag ^= SELECT; + changed = true; + } + return changed; } bool BKE_mball_select_swap_multi_ex(Base **bases, int bases_len) { - bool changed_multi = false; - for (uint ob_index = 0; ob_index < bases_len; ob_index++) { - Object *obedit = bases[ob_index]->object; - MetaBall *mb = (MetaBall *)obedit->data; - changed_multi |= BKE_mball_select_swap(mb); - } - return changed_multi; + bool changed_multi = false; + for (uint ob_index = 0; ob_index < bases_len; ob_index++) { + Object *obedit = bases[ob_index]->object; + MetaBall *mb = (MetaBall *)obedit->data; + changed_multi |= BKE_mball_select_swap(mb); + } + return changed_multi; } /* **** Depsgraph evaluation **** */ @@ -647,13 +649,13 @@ void (*BKE_mball_batch_cache_free_cb)(MetaBall *mb) = NULL; void BKE_mball_batch_cache_dirty_tag(MetaBall *mb, int mode) { - if (mb->batch_cache) { - BKE_mball_batch_cache_dirty_tag_cb(mb, mode); - } + if (mb->batch_cache) { + BKE_mball_batch_cache_dirty_tag_cb(mb, mode); + } } void BKE_mball_batch_cache_free(MetaBall *mb) { - if (mb->batch_cache) { - BKE_mball_batch_cache_free_cb(mb); - } + if (mb->batch_cache) { + BKE_mball_batch_cache_free_cb(mb); + } } |