Blender  V2.93
object_update.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) 20014 by Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include "DNA_anim_types.h"
25 #include "DNA_collection_types.h"
26 #include "DNA_constraint_types.h"
27 #include "DNA_gpencil_types.h"
28 #include "DNA_key_types.h"
29 #include "DNA_material_types.h"
30 #include "DNA_mesh_types.h"
31 #include "DNA_modifier_types.h"
32 #include "DNA_scene_types.h"
33 
34 #include "BLI_blenlib.h"
35 #include "BLI_math.h"
36 #include "BLI_threads.h"
37 #include "BLI_utildefines.h"
38 
39 #include "BKE_DerivedMesh.h"
40 #include "BKE_action.h"
41 #include "BKE_armature.h"
42 #include "BKE_constraint.h"
43 #include "BKE_curve.h"
44 #include "BKE_displist.h"
45 #include "BKE_editmesh.h"
46 #include "BKE_effect.h"
47 #include "BKE_gpencil.h"
48 #include "BKE_gpencil_modifier.h"
49 #include "BKE_hair.h"
50 #include "BKE_image.h"
51 #include "BKE_key.h"
52 #include "BKE_lattice.h"
53 #include "BKE_layer.h"
54 #include "BKE_light.h"
55 #include "BKE_material.h"
56 #include "BKE_mball.h"
57 #include "BKE_mesh.h"
58 #include "BKE_object.h"
59 #include "BKE_particle.h"
60 #include "BKE_pointcache.h"
61 #include "BKE_pointcloud.h"
62 #include "BKE_scene.h"
63 #include "BKE_volume.h"
64 
65 #include "MEM_guardedalloc.h"
66 
67 #include "DEG_depsgraph.h"
68 #include "DEG_depsgraph_query.h"
69 
79 {
81 }
82 
84 {
85  DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
86 
87  /* calculate local matrix */
88  BKE_object_to_mat4(ob, ob->obmat);
89 }
90 
91 /* Evaluate parent */
92 /* NOTE: based on solve_parenting(), but with the cruft stripped out */
94 {
95  Object *par = ob->parent;
96 
97  float totmat[4][4];
98  float tmat[4][4];
99  float locmat[4][4];
100 
101  DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
102 
103  /* get local matrix (but don't calculate it, as that was done already!) */
104  /* XXX: redundant? */
105  copy_m4_m4(locmat, ob->obmat);
106 
107  /* get parent effect matrix */
108  BKE_object_get_parent_matrix(ob, par, totmat);
109 
110  /* total */
111  mul_m4_m4m4(tmat, totmat, ob->parentinv);
112  mul_m4_m4m4(ob->obmat, tmat, locmat);
113 
114  /* origin, for help line */
115  if ((ob->partype & PARTYPE) == PARSKEL) {
117  }
118  else {
119  copy_v3_v3(ob->runtime.parent_display_origin, totmat[3]);
120  }
121 }
122 
124 {
125  bConstraintOb *cob;
126  float ctime = BKE_scene_frame_get(scene);
127 
128  DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
129 
130  /* evaluate constraints stack */
131  /* TODO: split this into:
132  * - pre (i.e. BKE_constraints_make_evalob, per-constraint (i.e.
133  * - inner body of BKE_constraints_solve),
134  * - post (i.e. BKE_constraints_clear_evalob)
135  *
136  * Not sure why, this is from Joshua - sergey
137  *
138  */
140  BKE_constraints_solve(depsgraph, &ob->constraints, cob, ctime);
142 }
143 
145 {
146  DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
147  /* Make sure inverse matrix is always up to date. This way users of it
148  * do not need to worry about recalculating it. */
149  invert_m4_m4_safe(ob->imat, ob->obmat);
150  /* Set negative scale flag in object. */
151  if (is_negative_m4(ob->obmat)) {
152  ob->transflag |= OB_NEG_SCALE;
153  }
154  else {
155  ob->transflag &= ~OB_NEG_SCALE;
156  }
157 
158  /* Assign evaluated version. */
159  if ((ob->type == OB_GPENCIL) && (ob->runtime.gpd_eval != NULL)) {
160  ob->data = ob->runtime.gpd_eval;
161  }
162 }
163 
165 {
166  DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
167 
168  /* includes all keys and modifiers */
169  switch (ob->type) {
170  case OB_MESH: {
171 #if 0
173 #else
174  BMEditMesh *em = (ob->mode & OB_MODE_EDIT) ? ((Mesh *)ob->data)->edit_mesh : NULL;
175 #endif
176 
179  /* Custom attributes should not be removed automatically. They might be used by the render
180  * engine or scripts. They can still be removed explicitly using geometry nodes. */
181  cddata_masks.vmask |= CD_MASK_PROP_ALL;
182  cddata_masks.emask |= CD_MASK_PROP_ALL;
183  cddata_masks.fmask |= CD_MASK_PROP_ALL;
184  cddata_masks.pmask |= CD_MASK_PROP_ALL;
185  cddata_masks.lmask |= CD_MASK_PROP_ALL;
186  /* Make sure Freestyle edge/face marks appear in DM for render (see T40315).
187  * Due to Line Art implementation, edge marks should also be shown in viewport. */
188 #ifdef WITH_FREESTYLE
189  cddata_masks.emask |= CD_MASK_FREESTYLE_EDGE;
190  cddata_masks.pmask |= CD_MASK_FREESTYLE_FACE;
191  cddata_masks.vmask |= CD_MASK_MDEFORMVERT;
192 #endif
194  /* Always compute UVs, vertex colors as orcos for render. */
195  cddata_masks.lmask |= CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL;
196  cddata_masks.vmask |= CD_MASK_ORCO | CD_MASK_PROP_COLOR;
197  }
198  if (em) {
199  makeDerivedMesh(depsgraph, scene, ob, em, &cddata_masks); /* was CD_MASK_BAREMESH */
200  }
201  else {
202  makeDerivedMesh(depsgraph, scene, ob, NULL, &cddata_masks);
203  }
204  break;
205  }
206  case OB_ARMATURE:
207  if (ID_IS_LINKED(ob) && ob->proxy_from) {
208  if (BKE_pose_copy_result(ob->pose, ob->proxy_from->pose) == false) {
209  printf("Proxy copy error, lib Object: %s proxy Object: %s\n",
210  ob->id.name + 2,
211  ob->proxy_from->id.name + 2);
212  }
213  }
214  else {
216  }
217  break;
218 
219  case OB_MBALL:
221  break;
222 
223  case OB_CURVE:
224  case OB_SURF:
225  case OB_FONT: {
226  bool for_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
227  BKE_displist_make_curveTypes(depsgraph, scene, ob, for_render, false);
228  break;
229  }
230 
231  case OB_LATTICE:
233  break;
234  case OB_GPENCIL: {
238  break;
239  }
240  case OB_HAIR:
242  break;
243  case OB_POINTCLOUD:
245  break;
246  case OB_VOLUME:
248  break;
249  }
250 
251  /* particles */
252  if (!(ob->mode & OB_MODE_EDIT) && ob->particlesystem.first) {
253  const bool use_render_params = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
254  ParticleSystem *tpsys, *psys;
255  ob->transflag &= ~OB_DUPLIPARTS;
256  psys = ob->particlesystem.first;
257  while (psys) {
258  if (psys_check_enabled(ob, psys, use_render_params)) {
259  /* check use of dupli objects here */
260  if (psys->part && (psys->part->draw_as == PART_DRAW_REND || use_render_params) &&
261  ((psys->part->ren_as == PART_DRAW_OB && psys->part->instance_object) ||
262  (psys->part->ren_as == PART_DRAW_GR && psys->part->instance_collection))) {
263  ob->transflag |= OB_DUPLIPARTS;
264  }
265 
266  particle_system_update(depsgraph, scene, ob, psys, use_render_params);
267  psys = psys->next;
268  }
269  else if (psys->flag & PSYS_DELETE) {
270  tpsys = psys->next;
271  BLI_remlink(&ob->particlesystem, psys);
272  psys_free(ob, psys);
273  psys = tpsys;
274  }
275  else {
276  psys = psys->next;
277  }
278  }
279  }
280 }
281 
283 static void object_sync_boundbox_to_original(Object *object_orig, Object *object_eval)
284 {
285  BoundBox *bb = BKE_object_boundbox_get(object_eval);
286  if (bb != NULL) {
287  if (object_orig->runtime.bb == NULL) {
288  object_orig->runtime.bb = MEM_mallocN(sizeof(*object_orig->runtime.bb), __func__);
289  }
290  *object_orig->runtime.bb = *bb;
291  }
292 }
293 
295 {
296  if (!DEG_is_active(depsgraph)) {
297  return;
298  }
299  Object *object_orig = DEG_get_original_object(object);
300  /* Base flags. */
301  object_orig->base_flag = object->base_flag;
302  /* Transformation flags. */
303  copy_m4_m4(object_orig->obmat, object->obmat);
304  copy_m4_m4(object_orig->imat, object->imat);
305  copy_m4_m4(object_orig->constinv, object->constinv);
306  object_orig->transflag = object->transflag;
307  object_orig->flag = object->flag;
308 
309  /* Copy back error messages from modifiers. */
310  for (ModifierData *md = object->modifiers.first, *md_orig = object_orig->modifiers.first;
311  md != NULL && md_orig != NULL;
312  md = md->next, md_orig = md_orig->next) {
313  BLI_assert(md->type == md_orig->type && STREQ(md->name, md_orig->name));
314  MEM_SAFE_FREE(md_orig->error);
315  if (md->error != NULL) {
316  md_orig->error = BLI_strdup(md->error);
317  }
318  }
319 
320  object_sync_boundbox_to_original(object_orig, object);
321 }
322 
324 {
325  /* Handle proxy copy for target, */
326  if (ID_IS_LINKED(object) && object->proxy_from) {
327  DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
328  if (object->proxy_from->proxy_group) {
329  /* Transform proxy into group space. */
330  Object *obg = object->proxy_from->proxy_group;
331  float imat[4][4];
332  invert_m4_m4(imat, obg->obmat);
333  mul_m4_m4m4(object->obmat, imat, object->proxy_from->obmat);
334  /* Should always be true. */
335  if (obg->instance_collection) {
337  }
338  }
339  else {
340  copy_m4_m4(object->obmat, object->proxy_from->obmat);
341  }
342  return true;
343  }
344  return false;
345 }
346 
348 {
350 }
351 
353 {
354  switch (ob->type) {
355  case OB_MESH:
357  break;
358  case OB_LATTICE:
360  break;
361  case OB_CURVE:
362  case OB_FONT:
363  case OB_SURF:
365  break;
366  case OB_MBALL:
368  break;
369  case OB_GPENCIL:
371  break;
372  case OB_HAIR:
374  break;
375  case OB_POINTCLOUD:
377  break;
378  case OB_VOLUME:
380  break;
381  }
382 }
383 
385 {
386  DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
387  BLI_assert(ob->type != OB_ARMATURE);
390 }
391 
393 {
394  DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
396 }
397 
399 {
400  /* This mimics full transform update chain from new depsgraph. */
402  if (object->parent != NULL) {
404  }
405  if (!BLI_listbase_is_empty(&object->constraints)) {
407  }
410 }
411 
413 {
414  DEG_debug_print_eval(depsgraph, __func__, object_data->name, object_data);
415  switch (GS(object_data->name)) {
416  case ID_ME:
418  break;
419  case ID_CU:
421  break;
422  case ID_LT:
423  BKE_lattice_batch_cache_dirty_tag((struct Lattice *)object_data,
425  break;
426  default:
427  break;
428  }
429 }
430 
432 {
433  DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
434  if (object->type == OB_MESH && !object->runtime.is_data_eval_owned) {
435  Mesh *mesh_input = (Mesh *)object->runtime.data_orig;
436  Mesh_Runtime *mesh_runtime = &mesh_input->runtime;
437  BLI_mutex_lock(mesh_runtime->eval_mutex);
439  BLI_mutex_unlock(mesh_runtime->eval_mutex);
440  }
441  else {
443  }
444 }
445 
447  Scene *scene,
448  const int view_layer_index,
449  Object *object,
450  int base_index,
451  const bool is_from_set)
452 {
453  /* TODO(sergey): Avoid list lookup. */
454  BLI_assert(view_layer_index >= 0);
455  ViewLayer *view_layer = BLI_findlink(&scene->view_layers, view_layer_index);
456  BLI_assert(view_layer != NULL);
457  BLI_assert(view_layer->object_bases_array != NULL);
458  BLI_assert(base_index >= 0);
459  BLI_assert(base_index < MEM_allocN_len(view_layer->object_bases_array) / sizeof(Base *));
460  Base *base = view_layer->object_bases_array[base_index];
461  BLI_assert(base->object == object);
462 
463  DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
464 
465  /* Set base flags based on collection and object restriction. */
466  BKE_base_eval_flags(base);
467 
468  /* For render, compute base visibility again since BKE_base_eval_flags
469  * assumed viewport visibility. Select-ability does not matter here. */
471  if (base->flag & BASE_ENABLED_RENDER) {
472  base->flag |= BASE_VISIBLE_DEPSGRAPH;
473  }
474  else {
475  base->flag &= ~BASE_VISIBLE_DEPSGRAPH;
476  }
477  }
478 
479  /* Copy flags and settings from base. */
480  object->base_flag = base->flag;
481  if (is_from_set) {
482  object->base_flag |= BASE_FROM_SET;
483  object->base_flag &= ~(BASE_SELECTED | BASE_SELECTABLE);
484  }
485  object->base_local_view_bits = base->local_view_bits;
486  object->runtime.local_collections_bits = base->local_collections_bits;
487 
488  if (object->mode == OB_MODE_PARTICLE_EDIT) {
489  for (ParticleSystem *psys = object->particlesystem.first; psys != NULL; psys = psys->next) {
491  }
492  }
493 
494  /* Copy base flag back to the original view layer for editing. */
496  Base *base_orig = base->base_orig;
497  BLI_assert(base_orig != NULL);
498  BLI_assert(base_orig->object != NULL);
499  base_orig->flag = base->flag;
500  }
501 }
void makeDerivedMesh(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct BMEditMesh *em, const struct CustomData_MeshMasks *dataMask)
Blender kernel action and pose functionality.
bool BKE_pose_copy_result(struct bPose *to, struct bPose *from)
Definition: action.c:1701
void BKE_pose_where_is(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob)
Definition: armature.c:2739
void BKE_constraints_solve(struct Depsgraph *depsgraph, struct ListBase *conlist, struct bConstraintOb *cob, float ctime)
Definition: constraint.c:6177
struct bConstraintOb * BKE_constraints_make_evalob(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, void *subdata, short datatype)
Definition: constraint.c:133
void BKE_constraints_clear_evalob(struct bConstraintOb *cob)
Definition: constraint.c:211
@ BKE_CURVE_BATCH_DIRTY_SELECT
Definition: BKE_curve.h:287
@ BKE_CURVE_BATCH_DIRTY_ALL
Definition: BKE_curve.h:286
void BKE_curve_batch_cache_dirty_tag(struct Curve *cu, int mode)
Definition: curve.c:5618
void CustomData_MeshMasks_update(CustomData_MeshMasks *mask_dst, const CustomData_MeshMasks *mask_src)
Definition: customdata.c:76
const CustomData_MeshMasks CD_MASK_BAREMESH
Definition: customdata.c:1919
display list (or rather multi purpose list) stuff.
void BKE_displist_make_curveTypes(struct Depsgraph *depsgraph, const struct Scene *scene, struct Object *ob, const bool for_render, const bool for_orco)
void BKE_displist_make_mball(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob)
Definition: displist.c:685
BMEditMesh * BKE_editmesh_from_object(struct Object *ob)
Return the BMEditMesh for a given object.
Definition: editmesh.c:85
void BKE_gpencil_batch_cache_dirty_tag(struct bGPdata *gpd)
Definition: gpencil.c:343
void BKE_gpencil_update_layer_transforms(const struct Depsgraph *depsgraph, struct Object *ob)
void BKE_gpencil_prepare_eval_data(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob)
void BKE_gpencil_modifiers_calc(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob)
General operations for hairs.
void BKE_hair_data_update(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *object)
Definition: hair.c:395
void BKE_hair_batch_cache_dirty_tag(struct Hair *hair, int mode)
Definition: hair.c:413
@ BKE_HAIR_BATCH_DIRTY_ALL
Definition: BKE_hair.h:52
@ BKE_LATTICE_BATCH_DIRTY_SELECT
Definition: BKE_lattice.h:91
@ BKE_LATTICE_BATCH_DIRTY_ALL
Definition: BKE_lattice.h:90
void BKE_lattice_modifiers_calc(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob)
Definition: lattice.c:542
void BKE_lattice_batch_cache_dirty_tag(struct Lattice *lt, int mode)
Definition: lattice.c:793
void BKE_base_eval_flags(struct Base *base)
Definition: layer.c:1831
General operations, lookup, etc. for blender lights.
General operations, lookup, etc. for materials.
void BKE_mball_batch_cache_dirty_tag(struct MetaBall *mb, int mode)
Definition: mball.c:748
@ BKE_MBALL_BATCH_DIRTY_ALL
Definition: BKE_mball.h:82
void BKE_mesh_batch_cache_dirty_tag(struct Mesh *me, eMeshBatchDirtyMode mode)
Definition: mesh_runtime.c:251
@ BKE_MESH_BATCH_DIRTY_ALL
@ BKE_MESH_BATCH_DIRTY_SELECT
General operations, lookup, etc. for blender objects.
void BKE_object_get_parent_matrix(struct Object *ob, struct Object *par, float r_parentmat[4][4])
Definition: object.c:3494
void BKE_object_to_mat4(struct Object *ob, float r_mat[4][4])
Definition: object.c:3234
void BKE_object_free_derived_caches(struct Object *ob)
Definition: object.c:1719
struct BoundBox * BKE_object_boundbox_get(struct Object *ob)
Definition: object.c:3817
void particle_system_update(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct ParticleSystem *psys, const bool use_render_params)
void BKE_particle_batch_cache_dirty_tag(struct ParticleSystem *psys, int mode)
Definition: particle.c:5243
void psys_free(struct Object *ob, struct ParticleSystem *psys)
Definition: particle.c:1070
bool psys_check_enabled(struct Object *ob, struct ParticleSystem *psys, const bool use_render_params)
Definition: particle.c:789
@ BKE_PARTICLE_BATCH_DIRTY_ALL
Definition: BKE_particle.h:620
int BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode)
Definition: pointcache.c:2953
#define PTCACHE_RESET_DEPSGRAPH
General operations for point-clouds.
void BKE_pointcloud_data_update(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *object)
Definition: pointcloud.cc:396
void BKE_pointcloud_batch_cache_dirty_tag(struct PointCloud *pointcloud, int mode)
Definition: pointcloud.cc:424
@ BKE_POINTCLOUD_BATCH_DIRTY_ALL
float BKE_scene_frame_get(const struct Scene *scene)
Volume datablock.
void BKE_volume_batch_cache_dirty_tag(struct Volume *volume, int mode)
Definition: volume.cc:1121
@ BKE_VOLUME_BATCH_DIRTY_ALL
Definition: BKE_volume.h:64
void BKE_volume_data_update(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *object)
Definition: volume.cc:1075
#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
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:133
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
Definition: math_matrix.c:262
bool invert_m4_m4(float R[4][4], const float A[4][4])
Definition: math_matrix.c:1278
void copy_m4_m4(float m1[4][4], const float m2[4][4])
Definition: math_matrix.c:95
void invert_m4_m4_safe(float Ainv[4][4], const float A[4][4])
Definition: math_matrix.c:3246
bool is_negative_m4(const float mat[4][4])
Definition: math_matrix.c:2590
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
Definition: string.c:70
void BLI_mutex_lock(ThreadMutex *mutex)
Definition: threads.cc:401
void BLI_mutex_unlock(ThreadMutex *mutex)
Definition: threads.cc:406
#define STREQ(a, b)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:51
bool DEG_is_active(const struct Depsgraph *depsgraph)
Definition: depsgraph.cc:331
@ DAG_EVAL_RENDER
Definition: DEG_depsgraph.h:62
void DEG_debug_print_eval(struct Depsgraph *depsgraph, const char *function_name, const char *object_name, const void *object_address)
eEvaluationMode DEG_get_mode(const Depsgraph *graph)
struct Object * DEG_get_original_object(struct Object *object)
struct ViewLayer * DEG_get_evaluated_view_layer(const struct Depsgraph *graph)
#define ID_IS_LINKED(_id)
Definition: DNA_ID.h:426
@ ID_ME
Definition: DNA_ID_enums.h:60
@ ID_LT
Definition: DNA_ID_enums.h:66
@ ID_CU
Definition: DNA_ID_enums.h:61
Object groups, one object can be in many groups at once.
@ CONSTRAINT_OBTYPE_OBJECT
#define CD_MASK_PROP_COLOR
#define CD_MASK_ORCO
#define CD_MASK_MDEFORMVERT
#define CD_MASK_MLOOPCOL
#define CD_MASK_PROP_ALL
#define CD_MASK_FREESTYLE_FACE
#define CD_MASK_MLOOPUV
#define CD_MASK_FREESTYLE_EDGE
@ BASE_FROM_SET
@ BASE_SELECTABLE
@ BASE_ENABLED_RENDER
@ BASE_VISIBLE_DEPSGRAPH
@ BASE_SELECTED
@ OB_MODE_PARTICLE_EDIT
@ OB_MODE_EDIT
@ OB_NEG_SCALE
@ OB_DUPLIPARTS
@ PARSKEL
@ PARTYPE
@ OB_LATTICE
@ OB_MBALL
@ OB_SURF
@ OB_FONT
@ OB_ARMATURE
@ OB_MESH
@ OB_POINTCLOUD
@ OB_HAIR
@ OB_VOLUME
@ OB_CURVE
@ OB_GPENCIL
#define PART_DRAW_OB
#define PART_DRAW_REND
#define PSYS_DELETE
#define PART_DRAW_GR
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
Scene scene
const Depsgraph * depsgraph
#define GS(x)
Definition: iris.c:241
size_t(* MEM_allocN_len)(const void *vmemh)
Definition: mallocn.c:40
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
void BKE_object_select_update(Depsgraph *depsgraph, Object *object)
void BKE_object_eval_reset(Object *ob_eval)
Definition: object_update.c:78
void BKE_object_eval_parent(Depsgraph *depsgraph, Object *ob)
Definition: object_update.c:93
void BKE_object_eval_local_transform(Depsgraph *depsgraph, Object *ob)
Definition: object_update.c:83
void BKE_object_eval_uber_transform(Depsgraph *depsgraph, Object *object)
void BKE_object_batch_cache_dirty_tag(Object *ob)
void BKE_object_sync_to_original(Depsgraph *depsgraph, Object *object)
void BKE_object_eval_constraints(Depsgraph *depsgraph, Scene *scene, Object *ob)
bool BKE_object_eval_proxy_copy(Depsgraph *depsgraph, Object *object)
void BKE_object_eval_uber_data(Depsgraph *depsgraph, Scene *scene, Object *ob)
void BKE_object_data_select_update(Depsgraph *depsgraph, ID *object_data)
void BKE_object_eval_eval_base_flags(Depsgraph *depsgraph, Scene *scene, const int view_layer_index, Object *object, int base_index, const bool is_from_set)
void BKE_object_eval_transform_all(Depsgraph *depsgraph, Scene *scene, Object *object)
static void object_sync_boundbox_to_original(Object *object_orig, Object *object_eval)
void BKE_object_eval_transform_final(Depsgraph *depsgraph, Object *ob)
void BKE_object_handle_data_update(Depsgraph *depsgraph, Scene *scene, Object *ob)
void BKE_object_eval_ptcache_reset(Depsgraph *depsgraph, Scene *scene, Object *object)
short flag
struct Object * object
unsigned short local_view_bits
unsigned short local_collections_bits
struct Base * base_orig
float instance_offset[3]
Definition: DNA_ID.h:273
char name[66]
Definition: DNA_ID.h:283
void * first
Definition: DNA_listBase.h:47
Mesh_Runtime runtime
float parent_display_origin[3]
struct bGPdata * gpd_eval
struct ID * data_orig
struct BoundBox * bb
struct Object * proxy_group
short partype
ListBase particlesystem
short transflag
ListBase constraints
struct Collection * instance_collection
short base_flag
struct bPose * pose
ListBase modifiers
struct Object * proxy_from
float constinv[4][4]
float imat[4][4]
float parentinv[4][4]
Object_Runtime runtime
float obmat[4][4]
struct Object * parent
void * data
struct Collection * instance_collection
struct Object * instance_object
ParticleSettings * part
struct ParticleSystem * next
struct CustomData_MeshMasks customdata_mask
ListBase view_layers
struct Base ** object_bases_array