Blender  V2.93
mball.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  * MetaBalls are created from a single Object (with a name without number in it),
19  * here the DispList and BoundBox also is located.
20  * All objects with the same name (but with a number in it) are added to this.
21  *
22  * texture coordinates are patched within the displist
23  */
24 
29 #include <ctype.h>
30 #include <float.h>
31 #include <math.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 
36 #include "MEM_guardedalloc.h"
37 
38 /* Allow using deprecated functionality for .blend file I/O. */
39 #define DNA_DEPRECATED_ALLOW
40 
41 #include "DNA_defaults.h"
42 #include "DNA_material_types.h"
43 #include "DNA_meta_types.h"
44 #include "DNA_object_types.h"
45 #include "DNA_scene_types.h"
46 
47 #include "BLI_blenlib.h"
48 #include "BLI_math.h"
49 #include "BLI_string_utils.h"
50 #include "BLI_utildefines.h"
51 
52 #include "BLT_translation.h"
53 
54 #include "BKE_main.h"
55 
56 #include "BKE_anim_data.h"
57 #include "BKE_curve.h"
58 #include "BKE_displist.h"
59 #include "BKE_idtype.h"
60 #include "BKE_lib_id.h"
61 #include "BKE_lib_query.h"
62 #include "BKE_material.h"
63 #include "BKE_mball.h"
64 #include "BKE_object.h"
65 #include "BKE_scene.h"
66 
67 #include "DEG_depsgraph.h"
68 
69 #include "BLO_read_write.h"
70 
71 static void metaball_init_data(ID *id)
72 {
73  MetaBall *metaball = (MetaBall *)id;
74 
76 
78 }
79 
80 static void metaball_copy_data(Main *UNUSED(bmain),
81  ID *id_dst,
82  const ID *id_src,
83  const int UNUSED(flag))
84 {
85  MetaBall *metaball_dst = (MetaBall *)id_dst;
86  const MetaBall *metaball_src = (const MetaBall *)id_src;
87 
88  BLI_duplicatelist(&metaball_dst->elems, &metaball_src->elems);
89 
90  metaball_dst->mat = MEM_dupallocN(metaball_src->mat);
91 
92  metaball_dst->editelems = NULL;
93  metaball_dst->lastelem = NULL;
94  metaball_dst->batch_cache = NULL;
95 }
96 
97 static void metaball_free_data(ID *id)
98 {
99  MetaBall *metaball = (MetaBall *)id;
100 
102 
103  MEM_SAFE_FREE(metaball->mat);
104 
105  BLI_freelistN(&metaball->elems);
106  if (metaball->disp.first) {
107  BKE_displist_free(&metaball->disp);
108  }
109 }
110 
112 {
113  MetaBall *metaball = (MetaBall *)id;
114  for (int i = 0; i < metaball->totcol; i++) {
116  }
117 }
118 
119 static void metaball_blend_write(BlendWriter *writer, ID *id, const void *id_address)
120 {
121  MetaBall *mb = (MetaBall *)id;
122  if (mb->id.us > 0 || BLO_write_is_undo(writer)) {
123  /* Clean up, important in undo case to reduce false detection of changed datablocks. */
124  BLI_listbase_clear(&mb->disp);
125  mb->editelems = NULL;
126  /* Must always be cleared (meta's don't have their own edit-data). */
127  mb->needs_flush_to_id = 0;
128  mb->lastelem = NULL;
129  mb->batch_cache = NULL;
130 
131  /* write LibData */
132  BLO_write_id_struct(writer, MetaBall, id_address, &mb->id);
133  BKE_id_blend_write(writer, &mb->id);
134 
135  /* direct data */
136  BLO_write_pointer_array(writer, mb->totcol, mb->mat);
137  if (mb->adt) {
138  BKE_animdata_blend_write(writer, mb->adt);
139  }
140 
141  LISTBASE_FOREACH (MetaElem *, ml, &mb->elems) {
142  BLO_write_struct(writer, MetaElem, ml);
143  }
144  }
145 }
146 
147 static void metaball_blend_read_data(BlendDataReader *reader, ID *id)
148 {
149  MetaBall *mb = (MetaBall *)id;
150  BLO_read_data_address(reader, &mb->adt);
151  BKE_animdata_blend_read_data(reader, mb->adt);
152 
153  BLO_read_pointer_array(reader, (void **)&mb->mat);
154 
155  BLO_read_list(reader, &(mb->elems));
156 
157  BLI_listbase_clear(&mb->disp);
158  mb->editelems = NULL;
159  /* Must always be cleared (meta's don't have their own edit-data). */
160  mb->needs_flush_to_id = 0;
161  /* mb->edit_elems.first= mb->edit_elems.last= NULL;*/
162  mb->lastelem = NULL;
163  mb->batch_cache = NULL;
164 }
165 
166 static void metaball_blend_read_lib(BlendLibReader *reader, ID *id)
167 {
168  MetaBall *mb = (MetaBall *)id;
169  for (int a = 0; a < mb->totcol; a++) {
170  BLO_read_id_address(reader, mb->id.lib, &mb->mat[a]);
171  }
172 
173  BLO_read_id_address(reader, mb->id.lib, &mb->ipo); // XXX deprecated - old animation system
174 }
175 
176 static void metaball_blend_read_expand(BlendExpander *expander, ID *id)
177 {
178  MetaBall *mb = (MetaBall *)id;
179  for (int a = 0; a < mb->totcol; a++) {
180  BLO_expand(expander, mb->mat[a]);
181  }
182 }
183 
185  .id_code = ID_MB,
186  .id_filter = FILTER_ID_MB,
187  .main_listbase_index = INDEX_ID_MB,
188  .struct_size = sizeof(MetaBall),
189  .name = "Metaball",
190  .name_plural = "metaballs",
191  .translation_context = BLT_I18NCONTEXT_ID_METABALL,
192  .flags = 0,
193 
195  .copy_data = metaball_copy_data,
196  .free_data = metaball_free_data,
197  .make_local = NULL,
198  .foreach_id = metaball_foreach_id,
199  .foreach_cache = NULL,
200  .owner_get = NULL,
201 
202  .blend_write = metaball_blend_write,
203  .blend_read_data = metaball_blend_read_data,
204  .blend_read_lib = metaball_blend_read_lib,
205  .blend_read_expand = metaball_blend_read_expand,
206 
207  .blend_read_undo_preserve = NULL,
208 
209  .lib_override_apply_post = NULL,
210 };
211 
212 /* Functions */
213 
214 MetaBall *BKE_mball_add(Main *bmain, const char *name)
215 {
216  MetaBall *mb;
217 
218  mb = BKE_id_new(bmain, ID_MB, name);
219 
220  return mb;
221 }
222 
223 /* most simple meta-element adding function
224  * don't do context manipulation here (rna uses) */
226 {
227  MetaElem *ml = MEM_callocN(sizeof(MetaElem), "metaelem");
228 
229  unit_qt(ml->quat);
230 
231  ml->rad = 2.0;
232  ml->s = 2.0;
233  ml->flag = MB_SCALE_RAD;
234 
235  switch (type) {
236  case MB_BALL:
237  ml->type = MB_BALL;
238  ml->expx = ml->expy = ml->expz = 1.0;
239 
240  break;
241  case MB_TUBE:
242  ml->type = MB_TUBE;
243  ml->expx = ml->expy = ml->expz = 1.0;
244 
245  break;
246  case MB_PLANE:
247  ml->type = MB_PLANE;
248  ml->expx = ml->expy = ml->expz = 1.0;
249 
250  break;
251  case MB_ELIPSOID:
252  ml->type = MB_ELIPSOID;
253  ml->expx = 1.2f;
254  ml->expy = 0.8f;
255  ml->expz = 1.0;
256 
257  break;
258  case MB_CUBE:
259  ml->type = MB_CUBE;
260  ml->expx = ml->expy = ml->expz = 1.0;
261 
262  break;
263  default:
264  break;
265  }
266 
267  BLI_addtail(&mb->elems, ml);
268 
269  return ml;
270 }
279 {
280  DispList *dl;
281  BoundBox *bb;
282  float *data, min[3], max[3] /*, loc[3], size[3] */;
283  int tot;
284  bool do_it = false;
285 
286  if (ob->runtime.bb == NULL) {
287  ob->runtime.bb = MEM_callocN(sizeof(BoundBox), "mb boundbox");
288  }
289  bb = ob->runtime.bb;
290 
291  /* Weird one, this. */
292  /* INIT_MINMAX(min, max); */
293  (min)[0] = (min)[1] = (min)[2] = 1.0e30f;
294  (max)[0] = (max)[1] = (max)[2] = -1.0e30f;
295 
296  dl = ob->runtime.curve_cache->disp.first;
297  while (dl) {
298  tot = dl->nr;
299  if (tot) {
300  do_it = true;
301  }
302  data = dl->verts;
303  while (tot--) {
304  /* Also weird... but longer. From utildefines. */
306  data += 3;
307  }
308  dl = dl->next;
309  }
310 
311  if (!do_it) {
312  min[0] = min[1] = min[2] = -1.0f;
313  max[0] = max[1] = max[2] = 1.0f;
314  }
315 
317 
318  bb->flag &= ~BOUNDBOX_DIRTY;
319 }
320 
323 {
324  BLI_assert(ob->type == OB_MBALL);
325 
326  if (ob->runtime.bb != NULL && (ob->runtime.bb->flag & BOUNDBOX_DIRTY) == 0) {
327  return ob->runtime.bb;
328  }
329 
330  /* This should always only be called with evaluated objects,
331  * but currently RNA is a problem here... */
332  if (ob->runtime.curve_cache != NULL) {
334  }
335 
336  return ob->runtime.bb;
337 }
338 
339 float *BKE_mball_make_orco(Object *ob, ListBase *dispbase)
340 {
341  BoundBox *bb;
342  DispList *dl;
343  float *data, *orco, *orcodata;
344  float loc[3], size[3];
345  int a;
346 
347  /* restore size and loc */
348  bb = ob->runtime.bb;
349  loc[0] = (bb->vec[0][0] + bb->vec[4][0]) / 2.0f;
350  size[0] = bb->vec[4][0] - loc[0];
351  loc[1] = (bb->vec[0][1] + bb->vec[2][1]) / 2.0f;
352  size[1] = bb->vec[2][1] - loc[1];
353  loc[2] = (bb->vec[0][2] + bb->vec[1][2]) / 2.0f;
354  size[2] = bb->vec[1][2] - loc[2];
355 
356  dl = dispbase->first;
357  orcodata = MEM_mallocN(sizeof(float[3]) * dl->nr, "MballOrco");
358 
359  data = dl->verts;
360  orco = orcodata;
361  a = dl->nr;
362  while (a--) {
363  orco[0] = (data[0] - loc[0]) / size[0];
364  orco[1] = (data[1] - loc[1]) / size[1];
365  orco[2] = (data[2] - loc[2]) / size[2];
366 
367  data += 3;
368  orco += 3;
369  }
370 
371  return orcodata;
372 }
373 
399 {
400  /* just a quick test */
401  const int len = strlen(ob->id.name);
402  return (!isdigit(ob->id.name[len - 1]));
403 }
404 
405 /* return nonzero if ob1 is a basis mball for ob */
407 {
408  int basis1nr, basis2nr;
409  char basis1name[MAX_ID_NAME], basis2name[MAX_ID_NAME];
410 
411  if (ob1->id.name[2] != ob2->id.name[2]) {
412  /* Quick return in case first char of both ID's names is not the same... */
413  return false;
414  }
415 
416  BLI_split_name_num(basis1name, &basis1nr, ob1->id.name + 2, '.');
417  BLI_split_name_num(basis2name, &basis2nr, ob2->id.name + 2, '.');
418 
419  if (STREQ(basis1name, basis2name)) {
420  return BKE_mball_is_basis(ob1);
421  }
422 
423  return false;
424 }
425 
427 {
428  for (const MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) {
429  if (ml->flag & SELECT) {
430  return true;
431  }
432  }
433  return false;
434 }
435 
436 bool BKE_mball_is_any_selected_multi(Base **bases, int bases_len)
437 {
438  for (uint base_index = 0; base_index < bases_len; base_index++) {
439  Object *obedit = bases[base_index]->object;
440  MetaBall *mb = (MetaBall *)obedit->data;
442  return true;
443  }
444  }
445  return false;
446 }
447 
449 {
450  for (const MetaElem *ml = mb->editelems->first; ml != NULL; ml = ml->next) {
451  if ((ml->flag & SELECT) == 0) {
452  return true;
453  }
454  }
455  return false;
456 }
457 
466 {
467  Scene *sce_iter = scene;
468  Base *base;
469  Object *ob;
470  MetaBall *active_mball = (MetaBall *)active_object->data;
471  int basisnr, obnr;
472  char basisname[MAX_ID_NAME], obname[MAX_ID_NAME];
473  SceneBaseIter iter;
474 
475  BLI_split_name_num(basisname, &basisnr, active_object->id.name + 2, '.');
476 
477  /* Pass depsgraph as NULL, which means we will not expand into
478  * duplis unlike when we generate the meta-ball. Expanding duplis
479  * would not be compatible when editing multiple view layers. */
480  BKE_scene_base_iter_next(NULL, &iter, &sce_iter, 0, NULL, NULL);
481  while (BKE_scene_base_iter_next(NULL, &iter, &sce_iter, 1, &base, &ob)) {
482  if (ob->type == OB_MBALL) {
483  if (ob != active_object) {
484  BLI_split_name_num(obname, &obnr, ob->id.name + 2, '.');
485 
486  /* Object ob has to be in same "group" ... it means, that it has to have
487  * same base of its name */
488  if (STREQ(obname, basisname)) {
489  MetaBall *mb = ob->data;
490 
491  /* Copy properties from selected/edited metaball */
492  mb->wiresize = active_mball->wiresize;
493  mb->rendersize = active_mball->rendersize;
494  mb->thresh = active_mball->thresh;
495  mb->flag = active_mball->flag;
496  DEG_id_tag_update(&mb->id, 0);
497  }
498  }
499  }
500  }
501 }
502 
512 {
513  Object *bob = object;
514  int basisnr, obnr;
515  char basisname[MAX_ID_NAME], obname[MAX_ID_NAME];
516 
517  BLI_split_name_num(basisname, &basisnr, object->id.name + 2, '.');
518 
519  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
520  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
521  Object *ob = base->object;
522  if ((ob->type == OB_MBALL) && !(base->flag & BASE_FROM_DUPLI)) {
523  if (ob != bob) {
524  BLI_split_name_num(obname, &obnr, ob->id.name + 2, '.');
525 
526  /* Object ob has to be in same "group" ... it means,
527  * that it has to have same base of its name. */
528  if (STREQ(obname, basisname)) {
529  if (obnr < basisnr) {
530  object = ob;
531  basisnr = obnr;
532  }
533  }
534  }
535  }
536  }
537  }
538 
539  return object;
540 }
541 
543  const MetaBall *mb, float min[3], float max[3], const float obmat[4][4], const short flag)
544 {
545  const float scale = obmat ? mat4_to_scale(obmat) : 1.0f;
546  bool changed = false;
547  float centroid[3], vec[3];
548 
549  INIT_MINMAX(min, max);
550 
551  LISTBASE_FOREACH (const MetaElem *, ml, &mb->elems) {
552  if ((ml->flag & flag) == flag) {
553  const float scale_mb = (ml->rad * 0.5f) * scale;
554 
555  if (obmat) {
556  mul_v3_m4v3(centroid, obmat, &ml->x);
557  }
558  else {
559  copy_v3_v3(centroid, &ml->x);
560  }
561 
562  /* TODO, non circle shapes cubes etc, probably nobody notices - campbell */
563  for (int i = -1; i != 3; i += 2) {
564  copy_v3_v3(vec, centroid);
565  add_v3_fl(vec, scale_mb * i);
566  minmax_v3v3_v3(min, max, vec);
567  }
568  changed = true;
569  }
570  }
571 
572  return changed;
573 }
574 
575 /* basic vertex data functions */
576 bool BKE_mball_minmax(const MetaBall *mb, float min[3], float max[3])
577 {
578  INIT_MINMAX(min, max);
579 
580  LISTBASE_FOREACH (const MetaElem *, ml, &mb->elems) {
581  minmax_v3v3_v3(min, max, &ml->x);
582  }
583 
584  return (BLI_listbase_is_empty(&mb->elems) == false);
585 }
586 
587 bool BKE_mball_center_median(const MetaBall *mb, float r_cent[3])
588 {
589  int total = 0;
590 
591  zero_v3(r_cent);
592 
593  LISTBASE_FOREACH (const MetaElem *, ml, &mb->elems) {
594  add_v3_v3(r_cent, &ml->x);
595  total++;
596  }
597 
598  if (total) {
599  mul_v3_fl(r_cent, 1.0f / (float)total);
600  }
601 
602  return (total != 0);
603 }
604 
605 bool BKE_mball_center_bounds(const MetaBall *mb, float r_cent[3])
606 {
607  float min[3], max[3];
608 
609  if (BKE_mball_minmax(mb, min, max)) {
610  mid_v3_v3v3(r_cent, min, max);
611  return true;
612  }
613 
614  return false;
615 }
616 
617 void BKE_mball_transform(MetaBall *mb, const float mat[4][4], const bool do_props)
618 {
619  float quat[4];
620  const float scale = mat4_to_scale(mat);
621  const float scale_sqrt = sqrtf(scale);
622 
623  mat4_to_quat(quat, mat);
624 
625  LISTBASE_FOREACH (MetaElem *, ml, &mb->elems) {
626  mul_m4_v3(mat, &ml->x);
627  mul_qt_qtqt(ml->quat, quat, ml->quat);
628 
629  if (do_props) {
630  ml->rad *= scale;
631  /* hrmf, probably elems shouldn't be
632  * treating scale differently - campbell */
633  if (!MB_TYPE_SIZE_SQUARED(ml->type)) {
634  mul_v3_fl(&ml->expx, scale);
635  }
636  else {
637  mul_v3_fl(&ml->expx, scale_sqrt);
638  }
639  }
640  }
641 }
642 
643 void BKE_mball_translate(MetaBall *mb, const float offset[3])
644 {
645  LISTBASE_FOREACH (MetaElem *, ml, &mb->elems) {
646  add_v3_v3(&ml->x, offset);
647  }
648 }
649 
650 /* *** select funcs *** */
652 {
653  int sel = 0;
654  LISTBASE_FOREACH (const MetaElem *, ml, mb->editelems) {
655  if (ml->flag & SELECT) {
656  sel++;
657  }
658  }
659  return sel;
660 }
661 
662 int BKE_mball_select_count_multi(Base **bases, int bases_len)
663 {
664  int sel = 0;
665  for (uint ob_index = 0; ob_index < bases_len; ob_index++) {
666  const Object *obedit = bases[ob_index]->object;
667  const MetaBall *mb = (MetaBall *)obedit->data;
668  sel += BKE_mball_select_count(mb);
669  }
670  return sel;
671 }
672 
674 {
675  bool changed = false;
676  LISTBASE_FOREACH (MetaElem *, ml, mb->editelems) {
677  if ((ml->flag & SELECT) == 0) {
678  ml->flag |= SELECT;
679  changed = true;
680  }
681  }
682  return changed;
683 }
684 
685 bool BKE_mball_select_all_multi_ex(Base **bases, int bases_len)
686 {
687  bool changed_multi = false;
688  for (uint ob_index = 0; ob_index < bases_len; ob_index++) {
689  Object *obedit = bases[ob_index]->object;
690  MetaBall *mb = obedit->data;
691  changed_multi |= BKE_mball_select_all(mb);
692  }
693  return changed_multi;
694 }
695 
697 {
698  bool changed = false;
699  LISTBASE_FOREACH (MetaElem *, ml, mb->editelems) {
700  if ((ml->flag & SELECT) != 0) {
701  ml->flag &= ~SELECT;
702  changed = true;
703  }
704  }
705  return changed;
706 }
707 
708 bool BKE_mball_deselect_all_multi_ex(Base **bases, int bases_len)
709 {
710  bool changed_multi = false;
711  for (uint ob_index = 0; ob_index < bases_len; ob_index++) {
712  Object *obedit = bases[ob_index]->object;
713  MetaBall *mb = obedit->data;
714  changed_multi |= BKE_mball_deselect_all(mb);
716  }
717  return changed_multi;
718 }
719 
721 {
722  bool changed = false;
723  LISTBASE_FOREACH (MetaElem *, ml, mb->editelems) {
724  ml->flag ^= SELECT;
725  changed = true;
726  }
727  return changed;
728 }
729 
730 bool BKE_mball_select_swap_multi_ex(Base **bases, int bases_len)
731 {
732  bool changed_multi = false;
733  for (uint ob_index = 0; ob_index < bases_len; ob_index++) {
734  Object *obedit = bases[ob_index]->object;
735  MetaBall *mb = (MetaBall *)obedit->data;
736  changed_multi |= BKE_mball_select_swap(mb);
737  }
738  return changed_multi;
739 }
740 
741 /* **** Depsgraph evaluation **** */
742 
743 /* Draw Engine */
744 
747 
749 {
750  if (mb->batch_cache) {
752  }
753 }
755 {
756  if (mb->batch_cache) {
758  }
759 }
void BKE_animdata_blend_read_data(struct BlendDataReader *reader, struct AnimData *adt)
Definition: anim_data.c:1574
void BKE_animdata_blend_write(struct BlendWriter *writer, struct AnimData *adt)
Definition: anim_data.c:1552
display list (or rather multi purpose list) stuff.
void BKE_displist_free(struct ListBase *lb)
Definition: displist.c:81
void BKE_id_blend_write(struct BlendWriter *writer, struct ID *id)
Definition: lib_id.c:2395
void * BKE_id_new(struct Main *bmain, const short type, const char *name)
Definition: lib_id.c:1177
#define BKE_LIB_FOREACHID_PROCESS(_data, _id_super, _cb_flag)
@ IDWALK_CB_USER
Definition: BKE_lib_query.h:87
General operations, lookup, etc. for materials.
General operations, lookup, etc. for blender objects.
void BKE_boundbox_init_from_minmax(struct BoundBox *bb, const float min[3], const float max[3])
Definition: object.c:3778
int BKE_scene_base_iter_next(struct Depsgraph *depsgraph, struct SceneBaseIter *iter, struct Scene **scene, int val, struct Base **base, struct Object **ob)
Definition: scene.c:2160
#define BLI_assert(a)
Definition: BLI_assert.h:58
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
Definition: BLI_listbase.h:124
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:128
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition: listbase.c:547
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
void mul_m4_v3(const float M[4][4], float r[3])
Definition: math_matrix.c:732
float mat4_to_scale(const float M[4][4])
Definition: math_matrix.c:2196
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
Definition: math_matrix.c:742
void unit_qt(float q[4])
Definition: math_rotation.c:46
void mul_qt_qtqt(float q[4], const float a[4], const float b[4])
Definition: math_rotation.c:65
void mat4_to_quat(float q[4], const float mat[4][4])
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
Definition: math_vector.c:1020
MINLINE void add_v3_fl(float r[3], float f)
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
Definition: math_vector.c:270
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
size_t BLI_split_name_num(char *left, int *nr, const char *name, const char delim)
Definition: string_utils.c:55
unsigned int uint
Definition: BLI_sys_types.h:83
#define INIT_MINMAX(min, max)
#define UNUSED(x)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define STREQ(a, b)
#define BLO_read_data_address(reader, ptr_p)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_list(BlendDataReader *reader, struct ListBase *list)
Definition: readfile.c:5654
#define BLO_read_id_address(reader, lib, id_ptr_p)
#define BLO_expand(expander, id)
void BLO_read_pointer_array(BlendDataReader *reader, void **ptr_p)
Definition: readfile.c:5727
bool BLO_write_is_undo(BlendWriter *writer)
Definition: writefile.c:1412
void BLO_write_pointer_array(BlendWriter *writer, uint num, const void *data_ptr)
Definition: writefile.c:1388
#define BLT_I18NCONTEXT_ID_METABALL
void DEG_id_tag_update(struct ID *id, int flag)
@ ID_RECALC_SELECT
Definition: DNA_ID.h:638
#define FILTER_ID_MB
Definition: DNA_ID.h:717
#define MAX_ID_NAME
Definition: DNA_ID.h:269
@ INDEX_ID_MB
Definition: DNA_ID.h:829
@ ID_MB
Definition: DNA_ID_enums.h:62
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:44
@ BASE_FROM_DUPLI
#define MB_BALL
#define MB_TUBE
#define MB_TYPE_SIZE_SQUARED(type)
#define MB_ELIPSOID
#define MB_SCALE_RAD
struct MetaBall MetaBall
#define MB_PLANE
#define MB_CUBE
Object is a sort of wrapper for general info.
@ BOUNDBOX_DIRTY
@ OB_MBALL
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
static void init_data(ModifierData *md)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
#define SELECT
Scene scene
#define sqrtf(x)
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:42
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
static void metaball_blend_write(BlendWriter *writer, ID *id, const void *id_address)
Definition: mball.c:119
bool BKE_mball_select_all_multi_ex(Base **bases, int bases_len)
Definition: mball.c:685
bool BKE_mball_is_basis(Object *ob)
Test, if ob is a basis meta-ball.
Definition: mball.c:398
int BKE_mball_select_count(const MetaBall *mb)
Definition: mball.c:651
bool BKE_mball_select_swap_multi_ex(Base **bases, int bases_len)
Definition: mball.c:730
void(* BKE_mball_batch_cache_dirty_tag_cb)(MetaBall *mb, int mode)
Definition: mball.c:745
bool BKE_mball_deselect_all(MetaBall *mb)
Definition: mball.c:696
float * BKE_mball_make_orco(Object *ob, ListBase *dispbase)
Definition: mball.c:339
BoundBox * BKE_mball_boundbox_get(Object *ob)
Definition: mball.c:322
MetaBall * BKE_mball_add(Main *bmain, const char *name)
Definition: mball.c:214
static void metaball_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int UNUSED(flag))
Definition: mball.c:80
bool BKE_mball_is_basis_for(Object *ob1, Object *ob2)
Definition: mball.c:406
bool BKE_mball_minmax_ex(const MetaBall *mb, float min[3], float max[3], const float obmat[4][4], const short flag)
Definition: mball.c:542
bool BKE_mball_center_bounds(const MetaBall *mb, float r_cent[3])
Definition: mball.c:605
int BKE_mball_select_count_multi(Base **bases, int bases_len)
Definition: mball.c:662
bool BKE_mball_is_any_unselected(const MetaBall *mb)
Definition: mball.c:448
void BKE_mball_texspace_calc(Object *ob)
Definition: mball.c:278
static void metaball_blend_read_data(BlendDataReader *reader, ID *id)
Definition: mball.c:147
void BKE_mball_translate(MetaBall *mb, const float offset[3])
Definition: mball.c:643
bool BKE_mball_is_any_selected_multi(Base **bases, int bases_len)
Definition: mball.c:436
bool BKE_mball_minmax(const MetaBall *mb, float min[3], float max[3])
Definition: mball.c:576
static void metaball_blend_read_lib(BlendLibReader *reader, ID *id)
Definition: mball.c:166
bool BKE_mball_center_median(const MetaBall *mb, float r_cent[3])
Definition: mball.c:587
void BKE_mball_batch_cache_free(MetaBall *mb)
Definition: mball.c:754
static void metaball_init_data(ID *id)
Definition: mball.c:71
bool BKE_mball_deselect_all_multi_ex(Base **bases, int bases_len)
Definition: mball.c:708
static void metaball_foreach_id(ID *id, LibraryForeachIDData *data)
Definition: mball.c:111
void(* BKE_mball_batch_cache_free_cb)(MetaBall *mb)
Definition: mball.c:746
void BKE_mball_properties_copy(Scene *scene, Object *active_object)
copy some properties from object to other meta-ball object with same base name
Definition: mball.c:465
IDTypeInfo IDType_ID_MB
Definition: mball.c:184
static void metaball_free_data(ID *id)
Definition: mball.c:97
bool BKE_mball_select_swap(MetaBall *mb)
Definition: mball.c:720
bool BKE_mball_is_any_selected(const MetaBall *mb)
Definition: mball.c:426
Object * BKE_mball_basis_find(Scene *scene, Object *object)
This function finds the basis MetaBall.
Definition: mball.c:511
void BKE_mball_transform(MetaBall *mb, const float mat[4][4], const bool do_props)
Definition: mball.c:617
bool BKE_mball_select_all(MetaBall *mb)
Definition: mball.c:673
void BKE_mball_batch_cache_dirty_tag(MetaBall *mb, int mode)
Definition: mball.c:748
static void metaball_blend_read_expand(BlendExpander *expander, ID *id)
Definition: mball.c:176
MetaElem * BKE_mball_element_add(MetaBall *mb, const int type)
Definition: mball.c:225
static float metaball(PROCESS *process, float x, float y, float z)
static unsigned a[3]
Definition: RandGen.cpp:92
#define min(a, b)
Definition: sort.c:51
struct Object * object
float vec[8][3]
ListBase disp
Definition: BKE_curve.h:49
float * verts
Definition: BKE_displist.h:74
struct DispList * next
Definition: BKE_displist.h:70
short id_code
Definition: BKE_idtype.h:120
Definition: DNA_ID.h:273
struct Library * lib
Definition: DNA_ID.h:277
int us
Definition: DNA_ID.h:293
char name[66]
Definition: DNA_ID.h:283
void * first
Definition: DNA_listBase.h:47
Definition: BKE_main.h:116
MetaElem * lastelem
float thresh
ListBase elems
float rendersize
void * batch_cache
ListBase disp
short totcol
float wiresize
struct AnimData * adt
ListBase * editelems
char needs_flush_to_id
struct Material ** mat
float expy
short type
float expx
float expz
float quat[4]
short flag
struct CurveCache * curve_cache
struct BoundBox * bb
Object_Runtime runtime
void * data
ListBase view_layers
float max
uint len