ClangFormat: apply to source, most of intern
[blender.git] / source / blender / blenkernel / intern / object_update.c
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
20 /** \file
21  * \ingroup bke
22  */
23
24 #include "DNA_anim_types.h"
25 #include "DNA_collection_types.h"
26 #include "DNA_constraint_types.h"
27 #include "DNA_key_types.h"
28 #include "DNA_material_types.h"
29 #include "DNA_mesh_types.h"
30 #include "DNA_scene_types.h"
31
32 #include "BLI_blenlib.h"
33 #include "BLI_utildefines.h"
34 #include "BLI_math.h"
35
36 #include "BKE_animsys.h"
37 #include "BKE_armature.h"
38 #include "BKE_action.h"
39 #include "BKE_constraint.h"
40 #include "BKE_curve.h"
41 #include "BKE_DerivedMesh.h"
42 #include "BKE_displist.h"
43 #include "BKE_editmesh.h"
44 #include "BKE_effect.h"
45 #include "BKE_image.h"
46 #include "BKE_key.h"
47 #include "BKE_layer.h"
48 #include "BKE_light.h"
49 #include "BKE_lattice.h"
50 #include "BKE_material.h"
51 #include "BKE_mball.h"
52 #include "BKE_mesh.h"
53 #include "BKE_object.h"
54 #include "BKE_particle.h"
55 #include "BKE_pointcache.h"
56 #include "BKE_scene.h"
57 #include "BKE_gpencil.h"
58
59 #include "MEM_guardedalloc.h"
60
61 #include "DEG_depsgraph.h"
62 #include "DEG_depsgraph_query.h"
63
64 /**
65  * Restore the object->data to a non-modifier evaluated state.
66  *
67  * Some changes done directly in evaluated object require them to be reset
68  * before being re-evaluated.
69  * For example, we need to call this before #BKE_mesh_new_from_object(),
70  * in case we removed/added modifiers in the evaluated object.
71  */
72 void BKE_object_eval_reset(Object *ob_eval)
73 {
74   BKE_object_free_derived_caches(ob_eval);
75 }
76
77 void BKE_object_eval_local_transform(Depsgraph *depsgraph, Object *ob)
78 {
79   DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
80
81   /* calculate local matrix */
82   BKE_object_to_mat4(ob, ob->obmat);
83 }
84
85 /* Evaluate parent */
86 /* NOTE: based on solve_parenting(), but with the cruft stripped out */
87 void BKE_object_eval_parent(Depsgraph *depsgraph, Object *ob)
88 {
89   Object *par = ob->parent;
90
91   float totmat[4][4];
92   float tmat[4][4];
93   float locmat[4][4];
94
95   DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
96
97   /* get local matrix (but don't calculate it, as that was done already!) */
98   // XXX: redundant?
99   copy_m4_m4(locmat, ob->obmat);
100
101   /* get parent effect matrix */
102   BKE_object_get_parent_matrix(ob, par, totmat);
103
104   /* total */
105   mul_m4_m4m4(tmat, totmat, ob->parentinv);
106   mul_m4_m4m4(ob->obmat, tmat, locmat);
107
108   /* origin, for help line */
109   if ((ob->partype & PARTYPE) == PARSKEL) {
110     copy_v3_v3(ob->runtime.parent_display_origin, par->obmat[3]);
111   }
112   else {
113     copy_v3_v3(ob->runtime.parent_display_origin, totmat[3]);
114   }
115 }
116
117 void BKE_object_eval_constraints(Depsgraph *depsgraph, Scene *scene, Object *ob)
118 {
119   bConstraintOb *cob;
120   float ctime = BKE_scene_frame_get(scene);
121
122   DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
123
124   /* evaluate constraints stack */
125   /* TODO: split this into:
126    * - pre (i.e. BKE_constraints_make_evalob, per-constraint (i.e.
127    * - inner body of BKE_constraints_solve),
128    * - post (i.e. BKE_constraints_clear_evalob)
129    *
130    * Not sure why, this is from Joshua - sergey
131    *
132    */
133   cob = BKE_constraints_make_evalob(depsgraph, scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
134   BKE_constraints_solve(depsgraph, &ob->constraints, cob, ctime);
135   BKE_constraints_clear_evalob(cob);
136 }
137
138 void BKE_object_eval_transform_final(Depsgraph *depsgraph, Object *ob)
139 {
140   DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
141   /* Make sure inverse matrix is always up to date. This way users of it
142    * do not need to worry about relcalculating it. */
143   invert_m4_m4(ob->imat, ob->obmat);
144   /* Set negative scale flag in object. */
145   if (is_negative_m4(ob->obmat))
146     ob->transflag |= OB_NEG_SCALE;
147   else
148     ob->transflag &= ~OB_NEG_SCALE;
149 }
150
151 void BKE_object_handle_data_update(Depsgraph *depsgraph, Scene *scene, Object *ob)
152 {
153   DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
154
155   /* includes all keys and modifiers */
156   switch (ob->type) {
157     case OB_MESH: {
158 #if 0
159       BMEditMesh *em = (ob->mode & OB_MODE_EDIT) ? BKE_editmesh_from_object(ob) : NULL;
160 #else
161       BMEditMesh *em = (ob->mode & OB_MODE_EDIT) ? ((Mesh *)ob->data)->edit_mesh : NULL;
162       if (em && em->ob != ob) {
163         em = NULL;
164       }
165 #endif
166
167       CustomData_MeshMasks cddata_masks = scene->customdata_mask;
168       CustomData_MeshMasks_update(&cddata_masks, &CD_MASK_BAREMESH);
169 #ifdef WITH_FREESTYLE
170       /* make sure Freestyle edge/face marks appear in DM for render (see T40315) */
171       if (DEG_get_mode(depsgraph) != DAG_EVAL_VIEWPORT) {
172         cddata_masks.emask |= CD_MASK_FREESTYLE_EDGE;
173         cddata_masks.pmask |= CD_MASK_FREESTYLE_FACE;
174       }
175 #endif
176       if (em) {
177         makeDerivedMesh(depsgraph, scene, ob, em, &cddata_masks); /* was CD_MASK_BAREMESH */
178       }
179       else {
180         makeDerivedMesh(depsgraph, scene, ob, NULL, &cddata_masks);
181       }
182       break;
183     }
184     case OB_ARMATURE:
185       if (ID_IS_LINKED(ob) && ob->proxy_from) {
186         if (BKE_pose_copy_result(ob->pose, ob->proxy_from->pose) == false) {
187           printf("Proxy copy error, lib Object: %s proxy Object: %s\n",
188                  ob->id.name + 2,
189                  ob->proxy_from->id.name + 2);
190         }
191       }
192       else {
193         BKE_pose_where_is(depsgraph, scene, ob);
194       }
195       break;
196
197     case OB_MBALL:
198       BKE_displist_make_mball(depsgraph, scene, ob);
199       break;
200
201     case OB_CURVE:
202     case OB_SURF:
203     case OB_FONT:
204       BKE_displist_make_curveTypes(depsgraph, scene, ob, false, false, NULL);
205       break;
206
207     case OB_LATTICE:
208       BKE_lattice_modifiers_calc(depsgraph, scene, ob);
209       break;
210   }
211
212   /* particles */
213   if (!(ob->mode & OB_MODE_EDIT) && ob->particlesystem.first) {
214     const bool use_render_params = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
215     ParticleSystem *tpsys, *psys;
216     ob->transflag &= ~OB_DUPLIPARTS;
217     psys = ob->particlesystem.first;
218     while (psys) {
219       if (psys_check_enabled(ob, psys, use_render_params)) {
220         /* check use of dupli objects here */
221         if (psys->part && (psys->part->draw_as == PART_DRAW_REND || use_render_params) &&
222             ((psys->part->ren_as == PART_DRAW_OB && psys->part->instance_object) ||
223              (psys->part->ren_as == PART_DRAW_GR && psys->part->instance_collection))) {
224           ob->transflag |= OB_DUPLIPARTS;
225         }
226
227         particle_system_update(depsgraph, scene, ob, psys, use_render_params);
228         psys = psys->next;
229       }
230       else if (psys->flag & PSYS_DELETE) {
231         tpsys = psys->next;
232         BLI_remlink(&ob->particlesystem, psys);
233         psys_free(ob, psys);
234         psys = tpsys;
235       }
236       else
237         psys = psys->next;
238     }
239   }
240   BKE_object_eval_boundbox(depsgraph, ob);
241 }
242
243 /**
244  * TODO(sergey): Ensure that bounding box is already calculated, and move this
245  * into #BKE_object_synchronize_to_original().
246  */
247 void BKE_object_eval_boundbox(Depsgraph *depsgraph, Object *object)
248 {
249   if (!DEG_is_active(depsgraph)) {
250     return;
251   }
252   Object *ob_orig = DEG_get_original_object(object);
253   BoundBox *bb = BKE_object_boundbox_get(object);
254   if (bb != NULL) {
255     if (ob_orig->runtime.bb == NULL) {
256       ob_orig->runtime.bb = MEM_mallocN(sizeof(*ob_orig->runtime.bb), __func__);
257     }
258     *ob_orig->runtime.bb = *bb;
259   }
260 }
261
262 void BKE_object_synchronize_to_original(Depsgraph *depsgraph, Object *object)
263 {
264   if (!DEG_is_active(depsgraph)) {
265     return;
266   }
267   Object *object_orig = DEG_get_original_object(object);
268   /* Base flags. */
269   object_orig->base_flag = object->base_flag;
270   /* Transformation flags. */
271   copy_m4_m4(object_orig->obmat, object->obmat);
272   copy_m4_m4(object_orig->imat, object->imat);
273   copy_m4_m4(object_orig->constinv, object->constinv);
274   object_orig->transflag = object->transflag;
275   object_orig->flag = object->flag;
276
277   /* Copy back error messages from modifiers. */
278   for (ModifierData *md = object->modifiers.first, *md_orig = object_orig->modifiers.first;
279        md != NULL && md_orig != NULL;
280        md = md->next, md_orig = md_orig->next) {
281     BLI_assert(md->type == md_orig->type && STREQ(md->name, md_orig->name));
282     MEM_SAFE_FREE(md_orig->error);
283     if (md->error != NULL) {
284       md_orig->error = BLI_strdup(md->error);
285     }
286   }
287 }
288
289 bool BKE_object_eval_proxy_copy(Depsgraph *depsgraph, Object *object)
290 {
291   /* Handle proxy copy for target, */
292   if (ID_IS_LINKED(object) && object->proxy_from) {
293     DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
294     if (object->proxy_from->proxy_group) {
295       /* Transform proxy into group space. */
296       Object *obg = object->proxy_from->proxy_group;
297       float imat[4][4];
298       invert_m4_m4(imat, obg->obmat);
299       mul_m4_m4m4(object->obmat, imat, object->proxy_from->obmat);
300       /* Should always be true. */
301       if (obg->instance_collection) {
302         add_v3_v3(object->obmat[3], obg->instance_collection->instance_offset);
303       }
304     }
305     else {
306       copy_m4_m4(object->obmat, object->proxy_from->obmat);
307     }
308     return true;
309   }
310   return false;
311 }
312
313 void BKE_object_eval_uber_transform(Depsgraph *depsgraph, Object *object)
314 {
315   BKE_object_eval_proxy_copy(depsgraph, object);
316 }
317
318 void BKE_object_batch_cache_dirty_tag(Object *ob)
319 {
320   switch (ob->type) {
321     case OB_MESH:
322       BKE_mesh_batch_cache_dirty_tag(ob->data, BKE_MESH_BATCH_DIRTY_ALL);
323       break;
324     case OB_LATTICE:
325       BKE_lattice_batch_cache_dirty_tag(ob->data, BKE_LATTICE_BATCH_DIRTY_ALL);
326       break;
327     case OB_CURVE:
328     case OB_FONT:
329     case OB_SURF:
330       BKE_curve_batch_cache_dirty_tag(ob->data, BKE_CURVE_BATCH_DIRTY_ALL);
331       break;
332     case OB_MBALL:
333       BKE_mball_batch_cache_dirty_tag(ob->data, BKE_MBALL_BATCH_DIRTY_ALL);
334       break;
335     case OB_GPENCIL:
336       BKE_gpencil_batch_cache_dirty_tag(ob->data);
337       break;
338   }
339 }
340
341 void BKE_object_eval_uber_data(Depsgraph *depsgraph, Scene *scene, Object *ob)
342 {
343   DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
344   BLI_assert(ob->type != OB_ARMATURE);
345   BKE_object_handle_data_update(depsgraph, scene, ob);
346   BKE_object_batch_cache_dirty_tag(ob);
347 }
348
349 void BKE_object_eval_ptcache_reset(Depsgraph *depsgraph, Scene *scene, Object *object)
350 {
351   DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
352   BKE_ptcache_object_reset(scene, object, PTCACHE_RESET_DEPSGRAPH);
353 }
354
355 void BKE_object_eval_transform_all(Depsgraph *depsgraph, Scene *scene, Object *object)
356 {
357   /* This mimics full transform update chain from new depsgraph. */
358   BKE_object_eval_local_transform(depsgraph, object);
359   if (object->parent != NULL) {
360     BKE_object_eval_parent(depsgraph, object);
361   }
362   if (!BLI_listbase_is_empty(&object->constraints)) {
363     BKE_object_eval_constraints(depsgraph, scene, object);
364   }
365   BKE_object_eval_uber_transform(depsgraph, object);
366   BKE_object_eval_transform_final(depsgraph, object);
367 }
368
369 void BKE_object_eval_update_shading(Depsgraph *depsgraph, Object *object)
370 {
371   DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
372   if (object->type == OB_MESH) {
373     BKE_mesh_batch_cache_dirty_tag(object->data, BKE_MESH_BATCH_DIRTY_SHADING);
374   }
375 }
376
377 void BKE_object_data_select_update(Depsgraph *depsgraph, ID *object_data)
378 {
379   DEG_debug_print_eval(depsgraph, __func__, object_data->name, object_data);
380   switch (GS(object_data->name)) {
381     case ID_ME:
382       BKE_mesh_batch_cache_dirty_tag((Mesh *)object_data, BKE_MESH_BATCH_DIRTY_SELECT);
383       break;
384     case ID_CU:
385       BKE_curve_batch_cache_dirty_tag((Curve *)object_data, BKE_CURVE_BATCH_DIRTY_SELECT);
386       break;
387     case ID_LT:
388       BKE_lattice_batch_cache_dirty_tag((struct Lattice *)object_data,
389                                         BKE_LATTICE_BATCH_DIRTY_SELECT);
390       break;
391     default:
392       break;
393   }
394 }
395
396 void BKE_object_eval_eval_base_flags(Depsgraph *depsgraph,
397                                      Scene *scene,
398                                      const int view_layer_index,
399                                      Object *object,
400                                      int base_index,
401                                      const bool is_from_set)
402 {
403   /* TODO(sergey): Avoid list lookup. */
404   BLI_assert(view_layer_index >= 0);
405   ViewLayer *view_layer = BLI_findlink(&scene->view_layers, view_layer_index);
406   BLI_assert(view_layer != NULL);
407   BLI_assert(view_layer->object_bases_array != NULL);
408   BLI_assert(base_index >= 0);
409   BLI_assert(base_index < MEM_allocN_len(view_layer->object_bases_array) / sizeof(Base *));
410   Base *base = view_layer->object_bases_array[base_index];
411   BLI_assert(base->object == object);
412
413   DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
414
415   /* Set base flags based on collection and object restriction. */
416   BKE_base_eval_flags(base);
417
418   /* For render, compute base visibility again since BKE_base_eval_flags
419    * assumed viewport visibility. Selectability does not matter here. */
420   if (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER) {
421     if (base->flag & BASE_ENABLED_RENDER) {
422       base->flag |= BASE_VISIBLE;
423     }
424     else {
425       base->flag &= ~BASE_VISIBLE;
426     }
427   }
428
429   /* Copy flags and settings from base. */
430   object->base_flag = base->flag;
431   if (is_from_set) {
432     object->base_flag |= BASE_FROM_SET;
433     object->base_flag &= ~(BASE_SELECTED | BASE_SELECTABLE);
434   }
435   object->base_local_view_bits = base->local_view_bits;
436
437   if (object->mode == OB_MODE_PARTICLE_EDIT) {
438     for (ParticleSystem *psys = object->particlesystem.first; psys != NULL; psys = psys->next) {
439       BKE_particle_batch_cache_dirty_tag(psys, BKE_PARTICLE_BATCH_DIRTY_ALL);
440     }
441   }
442
443   /* Copy base flag back to the original view layer for editing. */
444   if (DEG_is_active(depsgraph) && (view_layer == DEG_get_evaluated_view_layer(depsgraph))) {
445     Base *base_orig = base->base_orig;
446     BLI_assert(base_orig != NULL);
447     BLI_assert(base_orig->object != NULL);
448     base_orig->flag = base->flag;
449   }
450 }