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 
17 /** \file
18  * \ingroup RNA
19  */
20 
21 #include <stdlib.h>
22 
23 #include "BLI_path_util.h"
24 #include "BLI_utildefines.h"
25 
26 #include "RNA_define.h"
27 #include "RNA_enum_types.h"
28 
29 #include "rna_internal.h"
30 
31 #include "DNA_object_types.h"
32 
33 #include "DEG_depsgraph.h"
34 
35 #define STATS_MAX_SIZE 16384
36 
37 #ifdef RNA_RUNTIME
38 
39 #  ifdef WITH_PYTHON
40 #    include "BPY_extern.h"
41 #  endif
42 
43 #  include "BLI_iterator.h"
44 #  include "BLI_math.h"
45 
46 #  include "RNA_access.h"
47 
48 #  include "BKE_duplilist.h"
49 #  include "BKE_object.h"
50 #  include "BKE_scene.h"
51 
52 #  include "DEG_depsgraph_build.h"
53 #  include "DEG_depsgraph_debug.h"
54 #  include "DEG_depsgraph_query.h"
55 
56 #  include "MEM_guardedalloc.h"
57 
58 /* **************** Object Instance **************** */
59 
rna_DepsgraphObjectInstance_object_get(PointerRNA * ptr)60 static PointerRNA rna_DepsgraphObjectInstance_object_get(PointerRNA *ptr)
61 {
62   BLI_Iterator *iterator = ptr->data;
63   return rna_pointer_inherit_refine(ptr, &RNA_Object, iterator->current);
64 }
65 
rna_DepsgraphObjectInstance_is_instance_get(PointerRNA * ptr)66 static int rna_DepsgraphObjectInstance_is_instance_get(PointerRNA *ptr)
67 {
68   BLI_Iterator *iterator = ptr->data;
69   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
70   return (deg_iter->dupli_object_current != NULL);
71 }
72 
rna_DepsgraphObjectInstance_instance_object_get(PointerRNA * ptr)73 static PointerRNA rna_DepsgraphObjectInstance_instance_object_get(PointerRNA *ptr)
74 {
75   BLI_Iterator *iterator = ptr->data;
76   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
77   Object *instance_object = NULL;
78   if (deg_iter->dupli_object_current != NULL) {
79     instance_object = deg_iter->dupli_object_current->ob;
80   }
81   return rna_pointer_inherit_refine(ptr, &RNA_Object, instance_object);
82 }
83 
rna_DepsgraphObjectInstance_show_self_get(PointerRNA * ptr)84 static bool rna_DepsgraphObjectInstance_show_self_get(PointerRNA *ptr)
85 {
86   BLI_Iterator *iterator = ptr->data;
87   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
88   int ob_visibility = BKE_object_visibility(iterator->current, deg_iter->eval_mode);
89   return (ob_visibility & OB_VISIBLE_SELF) != 0;
90 }
91 
rna_DepsgraphObjectInstance_show_particles_get(PointerRNA * ptr)92 static bool rna_DepsgraphObjectInstance_show_particles_get(PointerRNA *ptr)
93 {
94   BLI_Iterator *iterator = ptr->data;
95   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
96   int ob_visibility = BKE_object_visibility(iterator->current, deg_iter->eval_mode);
97   return (ob_visibility & OB_VISIBLE_PARTICLES) != 0;
98 }
99 
rna_DepsgraphObjectInstance_parent_get(PointerRNA * ptr)100 static PointerRNA rna_DepsgraphObjectInstance_parent_get(PointerRNA *ptr)
101 {
102   BLI_Iterator *iterator = ptr->data;
103   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
104   Object *dupli_parent = NULL;
105   if (deg_iter->dupli_object_current != NULL) {
106     dupli_parent = deg_iter->dupli_parent;
107   }
108   return rna_pointer_inherit_refine(ptr, &RNA_Object, dupli_parent);
109 }
110 
rna_DepsgraphObjectInstance_particle_system_get(PointerRNA * ptr)111 static PointerRNA rna_DepsgraphObjectInstance_particle_system_get(PointerRNA *ptr)
112 {
113   BLI_Iterator *iterator = ptr->data;
114   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
115   struct ParticleSystem *particle_system = NULL;
116   if (deg_iter->dupli_object_current != NULL) {
117     particle_system = deg_iter->dupli_object_current->particle_system;
118   }
119   return rna_pointer_inherit_refine(ptr, &RNA_ParticleSystem, particle_system);
120 }
121 
rna_DepsgraphObjectInstance_persistent_id_get(PointerRNA * ptr,int * persistent_id)122 static void rna_DepsgraphObjectInstance_persistent_id_get(PointerRNA *ptr, int *persistent_id)
123 {
124   BLI_Iterator *iterator = ptr->data;
125   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
126   if (deg_iter->dupli_object_current != NULL) {
127     memcpy(persistent_id,
128            deg_iter->dupli_object_current->persistent_id,
129            sizeof(deg_iter->dupli_object_current->persistent_id));
130   }
131   else {
132     memset(persistent_id, 0, sizeof(deg_iter->dupli_object_current->persistent_id));
133   }
134 }
135 
rna_DepsgraphObjectInstance_random_id_get(PointerRNA * ptr)136 static unsigned int rna_DepsgraphObjectInstance_random_id_get(PointerRNA *ptr)
137 {
138   BLI_Iterator *iterator = ptr->data;
139   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
140   if (deg_iter->dupli_object_current != NULL) {
141     return deg_iter->dupli_object_current->random_id;
142   }
143   else {
144     return 0;
145   }
146 }
147 
rna_DepsgraphObjectInstance_matrix_world_get(PointerRNA * ptr,float * mat)148 static void rna_DepsgraphObjectInstance_matrix_world_get(PointerRNA *ptr, float *mat)
149 {
150   BLI_Iterator *iterator = ptr->data;
151   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
152   if (deg_iter->dupli_object_current != NULL) {
153     copy_m4_m4((float(*)[4])mat, deg_iter->dupli_object_current->mat);
154   }
155   else {
156     /* We can return actual object's matrix here, no reason to return identity matrix
157      * when this is not actually an instance... */
158     Object *ob = (Object *)iterator->current;
159     copy_m4_m4((float(*)[4])mat, ob->obmat);
160   }
161 }
162 
rna_DepsgraphObjectInstance_orco_get(PointerRNA * ptr,float * orco)163 static void rna_DepsgraphObjectInstance_orco_get(PointerRNA *ptr, float *orco)
164 {
165   BLI_Iterator *iterator = ptr->data;
166   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
167   if (deg_iter->dupli_object_current != NULL) {
168     copy_v3_v3(orco, deg_iter->dupli_object_current->orco);
169   }
170   else {
171     zero_v3(orco);
172   }
173 }
174 
rna_DepsgraphObjectInstance_uv_get(PointerRNA * ptr,float * uv)175 static void rna_DepsgraphObjectInstance_uv_get(PointerRNA *ptr, float *uv)
176 {
177   BLI_Iterator *iterator = ptr->data;
178   DEGObjectIterData *deg_iter = (DEGObjectIterData *)iterator->data;
179   if (deg_iter->dupli_object_current != NULL) {
180     copy_v2_v2(uv, deg_iter->dupli_object_current->uv);
181   }
182   else {
183     zero_v2(uv);
184   }
185 }
186 
187 /* ******************** Sorted  ***************** */
188 
rna_Depsgraph_mode_get(PointerRNA * ptr)189 static int rna_Depsgraph_mode_get(PointerRNA *ptr)
190 {
191   Depsgraph *depsgraph = ptr->data;
192   return DEG_get_mode(depsgraph);
193 }
194 
195 /* ******************** Updates ***************** */
196 
rna_DepsgraphUpdate_id_get(PointerRNA * ptr)197 static PointerRNA rna_DepsgraphUpdate_id_get(PointerRNA *ptr)
198 {
199   return rna_pointer_inherit_refine(ptr, &RNA_ID, ptr->data);
200 }
201 
rna_DepsgraphUpdate_is_updated_transform_get(PointerRNA * ptr)202 static bool rna_DepsgraphUpdate_is_updated_transform_get(PointerRNA *ptr)
203 {
204   ID *id = ptr->data;
205   return ((id->recalc & ID_RECALC_TRANSFORM) != 0);
206 }
207 
rna_DepsgraphUpdate_is_updated_shading_get(PointerRNA * ptr)208 static bool rna_DepsgraphUpdate_is_updated_shading_get(PointerRNA *ptr)
209 {
210   ID *id = ptr->data;
211   return ((id->recalc & ID_RECALC_SHADING) != 0);
212 }
213 
rna_DepsgraphUpdate_is_updated_geometry_get(PointerRNA * ptr)214 static bool rna_DepsgraphUpdate_is_updated_geometry_get(PointerRNA *ptr)
215 {
216   ID *id = ptr->data;
217   if (id->recalc & ID_RECALC_GEOMETRY) {
218     return true;
219   }
220   if (GS(id->name) != ID_OB) {
221     return false;
222   }
223   Object *object = (Object *)id;
224   ID *data = object->data;
225   if (data == NULL) {
226     return false;
227   }
228   return ((data->recalc & ID_RECALC_ALL) != 0);
229 }
230 
231 /* **************** Depsgraph **************** */
232 
rna_Depsgraph_debug_relations_graphviz(Depsgraph * depsgraph,const char * filename)233 static void rna_Depsgraph_debug_relations_graphviz(Depsgraph *depsgraph, const char *filename)
234 {
235   FILE *f = fopen(filename, "w");
236   if (f == NULL) {
237     return;
238   }
239   DEG_debug_relations_graphviz(depsgraph, f, "Depsgraph");
240   fclose(f);
241 }
242 
rna_Depsgraph_debug_stats_gnuplot(Depsgraph * depsgraph,const char * filename,const char * output_filename)243 static void rna_Depsgraph_debug_stats_gnuplot(Depsgraph *depsgraph,
244                                               const char *filename,
245                                               const char *output_filename)
246 {
247   FILE *f = fopen(filename, "w");
248   if (f == NULL) {
249     return;
250   }
251   DEG_debug_stats_gnuplot(depsgraph, f, "Timing Statistics", output_filename);
252   fclose(f);
253 }
254 
rna_Depsgraph_debug_tag_update(Depsgraph * depsgraph)255 static void rna_Depsgraph_debug_tag_update(Depsgraph *depsgraph)
256 {
257   DEG_graph_tag_relations_update(depsgraph);
258 }
259 
rna_Depsgraph_debug_stats(Depsgraph * depsgraph,char * result)260 static void rna_Depsgraph_debug_stats(Depsgraph *depsgraph, char *result)
261 {
262   size_t outer, ops, rels;
263   DEG_stats_simple(depsgraph, &outer, &ops, &rels);
264   BLI_snprintf(result,
265                STATS_MAX_SIZE,
266                "Approx %zu Operations, %zu Relations, %zu Outer Nodes",
267                ops,
268                rels,
269                outer);
270 }
271 
rna_Depsgraph_update(Depsgraph * depsgraph,Main * bmain,ReportList * reports)272 static void rna_Depsgraph_update(Depsgraph *depsgraph, Main *bmain, ReportList *reports)
273 {
274   if (DEG_is_evaluating(depsgraph)) {
275     BKE_report(reports, RPT_ERROR, "Dependency graph update requested during evaluation");
276     return;
277   }
278 
279 #  ifdef WITH_PYTHON
280   /* Allow drivers to be evaluated */
281   BPy_BEGIN_ALLOW_THREADS;
282 #  endif
283 
284   BKE_scene_graph_update_tagged(depsgraph, bmain);
285 
286 #  ifdef WITH_PYTHON
287   BPy_END_ALLOW_THREADS;
288 #  endif
289 }
290 
291 /* Iteration over objects, simple version */
292 
rna_Depsgraph_objects_begin(CollectionPropertyIterator * iter,PointerRNA * ptr)293 static void rna_Depsgraph_objects_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
294 {
295   iter->internal.custom = MEM_callocN(sizeof(BLI_Iterator), __func__);
296   DEGObjectIterData *data = MEM_callocN(sizeof(DEGObjectIterData), __func__);
297 
298   data->graph = (Depsgraph *)ptr->data;
299   data->flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_VISIBLE |
300                DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET;
301 
302   ((BLI_Iterator *)iter->internal.custom)->valid = true;
303   DEG_iterator_objects_begin(iter->internal.custom, data);
304   iter->valid = ((BLI_Iterator *)iter->internal.custom)->valid;
305 }
306 
rna_Depsgraph_objects_next(CollectionPropertyIterator * iter)307 static void rna_Depsgraph_objects_next(CollectionPropertyIterator *iter)
308 {
309   DEG_iterator_objects_next(iter->internal.custom);
310   iter->valid = ((BLI_Iterator *)iter->internal.custom)->valid;
311 }
312 
rna_Depsgraph_objects_end(CollectionPropertyIterator * iter)313 static void rna_Depsgraph_objects_end(CollectionPropertyIterator *iter)
314 {
315   DEG_iterator_objects_end(iter->internal.custom);
316   MEM_freeN(((BLI_Iterator *)iter->internal.custom)->data);
317   MEM_freeN(iter->internal.custom);
318 }
319 
rna_Depsgraph_objects_get(CollectionPropertyIterator * iter)320 static PointerRNA rna_Depsgraph_objects_get(CollectionPropertyIterator *iter)
321 {
322   Object *ob = ((BLI_Iterator *)iter->internal.custom)->current;
323   return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, ob);
324 }
325 
326 /* Iteration over objects, extended version
327  *
328  * Contains extra information about duplicator and persistent ID.
329  */
330 
331 /* XXX Ugly python seems to query next item of an iterator before using current one (see T57558).
332  * This forces us to use that nasty ping-pong game between two sets of iterator data,
333  * so that previous one remains valid memory for python to access to. Yuck.
334  */
335 typedef struct RNA_Depsgraph_Instances_Iterator {
336   BLI_Iterator iterators[2];
337   DEGObjectIterData deg_data[2];
338   DupliObject dupli_object_current[2];
339   int counter;
340 } RNA_Depsgraph_Instances_Iterator;
341 
rna_Depsgraph_object_instances_begin(CollectionPropertyIterator * iter,PointerRNA * ptr)342 static void rna_Depsgraph_object_instances_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
343 {
344   RNA_Depsgraph_Instances_Iterator *di_it = iter->internal.custom = MEM_callocN(sizeof(*di_it),
345                                                                                 __func__);
346 
347   DEGObjectIterData *data = &di_it->deg_data[0];
348   data->graph = (Depsgraph *)ptr->data;
349   data->flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET |
350                DEG_ITER_OBJECT_FLAG_VISIBLE | DEG_ITER_OBJECT_FLAG_DUPLI;
351 
352   di_it->iterators[0].valid = true;
353   DEG_iterator_objects_begin(&di_it->iterators[0], data);
354   iter->valid = di_it->iterators[0].valid;
355 }
356 
rna_Depsgraph_object_instances_next(CollectionPropertyIterator * iter)357 static void rna_Depsgraph_object_instances_next(CollectionPropertyIterator *iter)
358 {
359   RNA_Depsgraph_Instances_Iterator *di_it = (RNA_Depsgraph_Instances_Iterator *)
360                                                 iter->internal.custom;
361 
362   /* We need to copy current iterator status to next one being worked on. */
363   di_it->iterators[(di_it->counter + 1) % 2] = di_it->iterators[di_it->counter % 2];
364   di_it->deg_data[(di_it->counter + 1) % 2] = di_it->deg_data[di_it->counter % 2];
365   di_it->counter++;
366 
367   di_it->iterators[di_it->counter % 2].data = &di_it->deg_data[di_it->counter % 2];
368   DEG_iterator_objects_next(&di_it->iterators[di_it->counter % 2]);
369   /* Dupli_object_current is also temp memory generated during the iterations,
370    * it may be freed when last item has been iterated,
371    * so we have same issue as with the iterator itself:
372    * we need to keep a local copy, which memory remains valid a bit longer,
373    * for Python accesses to work. */
374   if (di_it->deg_data[di_it->counter % 2].dupli_object_current != NULL) {
375     di_it->dupli_object_current[di_it->counter % 2] =
376         *di_it->deg_data[di_it->counter % 2].dupli_object_current;
377     di_it->deg_data[di_it->counter % 2].dupli_object_current =
378         &di_it->dupli_object_current[di_it->counter % 2];
379   }
380   iter->valid = di_it->iterators[di_it->counter % 2].valid;
381 }
382 
rna_Depsgraph_object_instances_end(CollectionPropertyIterator * iter)383 static void rna_Depsgraph_object_instances_end(CollectionPropertyIterator *iter)
384 {
385   RNA_Depsgraph_Instances_Iterator *di_it = (RNA_Depsgraph_Instances_Iterator *)
386                                                 iter->internal.custom;
387   DEG_iterator_objects_end(&di_it->iterators[0]);
388   DEG_iterator_objects_end(&di_it->iterators[1]);
389   MEM_freeN(di_it);
390 }
391 
rna_Depsgraph_object_instances_get(CollectionPropertyIterator * iter)392 static PointerRNA rna_Depsgraph_object_instances_get(CollectionPropertyIterator *iter)
393 {
394   RNA_Depsgraph_Instances_Iterator *di_it = (RNA_Depsgraph_Instances_Iterator *)
395                                                 iter->internal.custom;
396   BLI_Iterator *iterator = &di_it->iterators[di_it->counter % 2];
397   return rna_pointer_inherit_refine(&iter->parent, &RNA_DepsgraphObjectInstance, iterator);
398 }
399 
400 /* Iteration over evaluated IDs */
401 
rna_Depsgraph_ids_begin(CollectionPropertyIterator * iter,PointerRNA * ptr)402 static void rna_Depsgraph_ids_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
403 {
404   iter->internal.custom = MEM_callocN(sizeof(BLI_Iterator), __func__);
405   DEGIDIterData *data = MEM_callocN(sizeof(DEGIDIterData), __func__);
406 
407   data->graph = (Depsgraph *)ptr->data;
408 
409   ((BLI_Iterator *)iter->internal.custom)->valid = true;
410   DEG_iterator_ids_begin(iter->internal.custom, data);
411   iter->valid = ((BLI_Iterator *)iter->internal.custom)->valid;
412 }
413 
rna_Depsgraph_ids_next(CollectionPropertyIterator * iter)414 static void rna_Depsgraph_ids_next(CollectionPropertyIterator *iter)
415 {
416   DEG_iterator_ids_next(iter->internal.custom);
417   iter->valid = ((BLI_Iterator *)iter->internal.custom)->valid;
418 }
419 
rna_Depsgraph_ids_end(CollectionPropertyIterator * iter)420 static void rna_Depsgraph_ids_end(CollectionPropertyIterator *iter)
421 {
422   DEG_iterator_ids_end(iter->internal.custom);
423   MEM_freeN(((BLI_Iterator *)iter->internal.custom)->data);
424   MEM_freeN(iter->internal.custom);
425 }
426 
rna_Depsgraph_ids_get(CollectionPropertyIterator * iter)427 static PointerRNA rna_Depsgraph_ids_get(CollectionPropertyIterator *iter)
428 {
429   ID *id = ((BLI_Iterator *)iter->internal.custom)->current;
430   return rna_pointer_inherit_refine(&iter->parent, &RNA_ID, id);
431 }
432 
rna_Depsgraph_updates_begin(CollectionPropertyIterator * iter,PointerRNA * ptr)433 static void rna_Depsgraph_updates_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
434 {
435   iter->internal.custom = MEM_callocN(sizeof(BLI_Iterator), __func__);
436   DEGIDIterData *data = MEM_callocN(sizeof(DEGIDIterData), __func__);
437 
438   data->graph = (Depsgraph *)ptr->data;
439   data->only_updated = true;
440 
441   ((BLI_Iterator *)iter->internal.custom)->valid = true;
442   DEG_iterator_ids_begin(iter->internal.custom, data);
443   iter->valid = ((BLI_Iterator *)iter->internal.custom)->valid;
444 }
445 
rna_Depsgraph_updates_get(CollectionPropertyIterator * iter)446 static PointerRNA rna_Depsgraph_updates_get(CollectionPropertyIterator *iter)
447 {
448   ID *id = ((BLI_Iterator *)iter->internal.custom)->current;
449   return rna_pointer_inherit_refine(&iter->parent, &RNA_DepsgraphUpdate, id);
450 }
451 
rna_Depsgraph_id_eval_get(Depsgraph * depsgraph,ID * id_orig)452 static ID *rna_Depsgraph_id_eval_get(Depsgraph *depsgraph, ID *id_orig)
453 {
454   return DEG_get_evaluated_id(depsgraph, id_orig);
455 }
456 
rna_Depsgraph_id_type_updated(Depsgraph * depsgraph,int id_type)457 static bool rna_Depsgraph_id_type_updated(Depsgraph *depsgraph, int id_type)
458 {
459   return DEG_id_type_updated(depsgraph, id_type);
460 }
461 
rna_Depsgraph_scene_get(PointerRNA * ptr)462 static PointerRNA rna_Depsgraph_scene_get(PointerRNA *ptr)
463 {
464   Depsgraph *depsgraph = (Depsgraph *)ptr->data;
465   Scene *scene = DEG_get_input_scene(depsgraph);
466   PointerRNA newptr;
467   RNA_pointer_create(&scene->id, &RNA_Scene, scene, &newptr);
468   return newptr;
469 }
470 
rna_Depsgraph_view_layer_get(PointerRNA * ptr)471 static PointerRNA rna_Depsgraph_view_layer_get(PointerRNA *ptr)
472 {
473   Depsgraph *depsgraph = (Depsgraph *)ptr->data;
474   Scene *scene = DEG_get_input_scene(depsgraph);
475   ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
476   PointerRNA newptr;
477   RNA_pointer_create(&scene->id, &RNA_ViewLayer, view_layer, &newptr);
478   return newptr;
479 }
480 
rna_Depsgraph_scene_eval_get(PointerRNA * ptr)481 static PointerRNA rna_Depsgraph_scene_eval_get(PointerRNA *ptr)
482 {
483   Depsgraph *depsgraph = (Depsgraph *)ptr->data;
484   Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
485   return rna_pointer_inherit_refine(ptr, &RNA_Scene, scene_eval);
486   PointerRNA newptr;
487   RNA_pointer_create(&scene_eval->id, &RNA_Scene, scene_eval, &newptr);
488   return newptr;
489 }
490 
rna_Depsgraph_view_layer_eval_get(PointerRNA * ptr)491 static PointerRNA rna_Depsgraph_view_layer_eval_get(PointerRNA *ptr)
492 {
493   Depsgraph *depsgraph = (Depsgraph *)ptr->data;
494   Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
495   ViewLayer *view_layer_eval = DEG_get_evaluated_view_layer(depsgraph);
496   PointerRNA newptr;
497   RNA_pointer_create(&scene_eval->id, &RNA_ViewLayer, view_layer_eval, &newptr);
498   return newptr;
499 }
500 
501 #else
502 
rna_def_depsgraph_instance(BlenderRNA * brna)503 static void rna_def_depsgraph_instance(BlenderRNA *brna)
504 {
505   StructRNA *srna;
506   PropertyRNA *prop;
507 
508   srna = RNA_def_struct(brna, "DepsgraphObjectInstance", NULL);
509   RNA_def_struct_ui_text(
510       srna,
511       "Dependency Graph Object Instance",
512       "Extended information about dependency graph object iterator "
513       "(WARNING: all data here is *evaluated* one, not original .blend IDs...)");
514 
515   prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
516   RNA_def_property_struct_type(prop, "Object");
517   RNA_def_property_ui_text(prop, "Object", "Evaluated object the iterator points to");
518   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
519   RNA_def_property_pointer_funcs(prop, "rna_DepsgraphObjectInstance_object_get", NULL, NULL, NULL);
520 
521   prop = RNA_def_property(srna, "show_self", PROP_BOOLEAN, PROP_NONE);
522   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
523   RNA_def_property_ui_text(
524       prop, "Show Self", "The object geometry itself should be visible in the render");
525   RNA_def_property_boolean_funcs(prop, "rna_DepsgraphObjectInstance_show_self_get", NULL);
526 
527   prop = RNA_def_property(srna, "show_particles", PROP_BOOLEAN, PROP_NONE);
528   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
529   RNA_def_property_ui_text(
530       prop, "Show Particles", "Particles part of the object should be visible in the render");
531   RNA_def_property_boolean_funcs(prop, "rna_DepsgraphObjectInstance_show_particles_get", NULL);
532 
533   prop = RNA_def_property(srna, "is_instance", PROP_BOOLEAN, PROP_NONE);
534   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
535   RNA_def_property_ui_text(
536       prop, "Is Instance", "Denotes if the object is generated by another object");
537   RNA_def_property_boolean_funcs(prop, "rna_DepsgraphObjectInstance_is_instance_get", NULL);
538 
539   prop = RNA_def_property(srna, "instance_object", PROP_POINTER, PROP_NONE);
540   RNA_def_property_struct_type(prop, "Object");
541   RNA_def_property_ui_text(
542       prop, "Instance Object", "Evaluated object which is being instanced by this iterator");
543   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
544   RNA_def_property_pointer_funcs(
545       prop, "rna_DepsgraphObjectInstance_instance_object_get", NULL, NULL, NULL);
546 
547   prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
548   RNA_def_property_struct_type(prop, "Object");
549   RNA_def_property_ui_text(
550       prop, "Parent", "If the object is an instance, the parent object that generated it");
551   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
552   RNA_def_property_pointer_funcs(prop, "rna_DepsgraphObjectInstance_parent_get", NULL, NULL, NULL);
553 
554   prop = RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
555   RNA_def_property_struct_type(prop, "ParticleSystem");
556   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
557   RNA_def_property_ui_text(
558       prop, "Particle System", "Evaluated particle system that this object was instanced from");
559   RNA_def_property_pointer_funcs(
560       prop, "rna_DepsgraphObjectInstance_particle_system_get", NULL, NULL, NULL);
561 
562   prop = RNA_def_property(srna, "persistent_id", PROP_INT, PROP_NONE);
563   RNA_def_property_ui_text(
564       prop,
565       "Persistent ID",
566       "Persistent identifier for inter-frame matching of objects with motion blur");
567   RNA_def_property_array(prop, MAX_DUPLI_RECUR);
568   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
569   RNA_def_property_int_funcs(prop, "rna_DepsgraphObjectInstance_persistent_id_get", NULL, NULL);
570 
571   prop = RNA_def_property(srna, "random_id", PROP_INT, PROP_UNSIGNED);
572   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
573   RNA_def_property_ui_text(
574       prop, "Dupli random id", "Random id for this instance, typically for randomized shading");
575   RNA_def_property_int_funcs(prop, "rna_DepsgraphObjectInstance_random_id_get", NULL, NULL);
576 
577   prop = RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX);
578   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
579   RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
580   RNA_def_property_ui_text(prop, "Generated Matrix", "Generated transform matrix in world space");
581   RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_matrix_world_get", NULL, NULL);
582 
583   prop = RNA_def_property(srna, "orco", PROP_FLOAT, PROP_TRANSLATION);
584   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
585   RNA_def_property_array(prop, 3);
586   RNA_def_property_ui_text(
587       prop, "Generated Coordinates", "Generated coordinates in parent object space");
588   RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_orco_get", NULL, NULL);
589 
590   prop = RNA_def_property(srna, "uv", PROP_FLOAT, PROP_NONE);
591   RNA_def_property_ui_text(prop, "UV Coordinates", "UV coordinates in parent object space");
592   RNA_def_property_array(prop, 2);
593   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
594   RNA_def_property_float_funcs(prop, "rna_DepsgraphObjectInstance_uv_get", NULL, NULL);
595 }
596 
rna_def_depsgraph_update(BlenderRNA * brna)597 static void rna_def_depsgraph_update(BlenderRNA *brna)
598 {
599   StructRNA *srna;
600   PropertyRNA *prop;
601 
602   srna = RNA_def_struct(brna, "DepsgraphUpdate", NULL);
603   RNA_def_struct_ui_text(srna, "Dependency Graph Update", "Information about ID that was updated");
604 
605   prop = RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE);
606   RNA_def_property_struct_type(prop, "ID");
607   RNA_def_property_ui_text(prop, "ID", "Updated datablock");
608   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
609   RNA_def_property_pointer_funcs(prop, "rna_DepsgraphUpdate_id_get", NULL, NULL, NULL);
610 
611   /* Use term 'is_updated' instead of 'is_dirty' here because this is a signal
612    * that users of the depsgraph may want to update their data (render engines for eg). */
613 
614   prop = RNA_def_property(srna, "is_updated_transform", PROP_BOOLEAN, PROP_NONE);
615   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
616   RNA_def_property_ui_text(prop, "Transform", "Object transformation is updated");
617   RNA_def_property_boolean_funcs(prop, "rna_DepsgraphUpdate_is_updated_transform_get", NULL);
618 
619   prop = RNA_def_property(srna, "is_updated_geometry", PROP_BOOLEAN, PROP_NONE);
620   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
621   RNA_def_property_ui_text(prop, "Geometry", "Object geometry is updated");
622   RNA_def_property_boolean_funcs(prop, "rna_DepsgraphUpdate_is_updated_geometry_get", NULL);
623 
624   prop = RNA_def_property(srna, "is_updated_shading", PROP_BOOLEAN, PROP_NONE);
625   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
626   RNA_def_property_ui_text(prop, "Shading", "Object shading is updated");
627   RNA_def_property_boolean_funcs(prop, "rna_DepsgraphUpdate_is_updated_shading_get", NULL);
628 }
629 
rna_def_depsgraph(BlenderRNA * brna)630 static void rna_def_depsgraph(BlenderRNA *brna)
631 {
632   StructRNA *srna;
633   FunctionRNA *func;
634   PropertyRNA *parm;
635   PropertyRNA *prop;
636 
637   static EnumPropertyItem enum_depsgraph_mode_items[] = {
638       {DAG_EVAL_VIEWPORT, "VIEWPORT", 0, "Viewport", "Viewport non-rendered mode"},
639       {DAG_EVAL_RENDER, "RENDER", 0, "Render", "Render"},
640       {0, NULL, 0, NULL, NULL},
641   };
642 
643   srna = RNA_def_struct(brna, "Depsgraph", NULL);
644   RNA_def_struct_ui_text(srna, "Dependency Graph", "");
645 
646   prop = RNA_def_enum(srna, "mode", enum_depsgraph_mode_items, 0, "Mode", "Evaluation mode");
647   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
648   RNA_def_property_enum_funcs(prop, "rna_Depsgraph_mode_get", NULL, NULL);
649 
650   /* Debug helpers. */
651 
652   func = RNA_def_function(
653       srna, "debug_relations_graphviz", "rna_Depsgraph_debug_relations_graphviz");
654   parm = RNA_def_string_file_path(
655       func, "filename", NULL, FILE_MAX, "File Name", "Output path for the graphviz debug file");
656   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
657 
658   func = RNA_def_function(srna, "debug_stats_gnuplot", "rna_Depsgraph_debug_stats_gnuplot");
659   parm = RNA_def_string_file_path(
660       func, "filename", NULL, FILE_MAX, "File Name", "Output path for the gnuplot debug file");
661   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
662   parm = RNA_def_string_file_path(func,
663                                   "output_filename",
664                                   NULL,
665                                   FILE_MAX,
666                                   "Output File Name",
667                                   "File name where gnuplot script will save the result");
668   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
669 
670   func = RNA_def_function(srna, "debug_tag_update", "rna_Depsgraph_debug_tag_update");
671 
672   func = RNA_def_function(srna, "debug_stats", "rna_Depsgraph_debug_stats");
673   RNA_def_function_ui_description(func, "Report the number of elements in the Dependency Graph");
674   /* weak!, no way to return dynamic string type */
675   parm = RNA_def_string(func, "result", NULL, STATS_MAX_SIZE, "result", "");
676   RNA_def_parameter_flags(parm, PROP_THICK_WRAP, 0); /* needed for string return value */
677   RNA_def_function_output(func, parm);
678 
679   /* Updates. */
680 
681   func = RNA_def_function(srna, "update", "rna_Depsgraph_update");
682   RNA_def_function_ui_description(
683       func,
684       "Re-evaluate any modified data-blocks, for example for animation or modifiers. "
685       "This invalidates all references to evaluated data-blocks from this dependency graph.");
686   RNA_def_function_flag(func, FUNC_USE_MAIN | FUNC_USE_REPORTS);
687 
688   /* Queries for original datablockls (the ones depsgraph is built for). */
689 
690   prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
691   RNA_def_property_struct_type(prop, "Scene");
692   RNA_def_property_pointer_funcs(prop, "rna_Depsgraph_scene_get", NULL, NULL, NULL);
693   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
694   RNA_def_property_ui_text(prop, "Scene", "Original scene dependency graph is built for");
695 
696   prop = RNA_def_property(srna, "view_layer", PROP_POINTER, PROP_NONE);
697   RNA_def_property_struct_type(prop, "ViewLayer");
698   RNA_def_property_pointer_funcs(prop, "rna_Depsgraph_view_layer_get", NULL, NULL, NULL);
699   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
700   RNA_def_property_ui_text(
701       prop, "View Layer", "Original view layer dependency graph is built for");
702 
703   /* Queries for evaluated datablockls (the ones depsgraph is evaluating). */
704 
705   func = RNA_def_function(srna, "id_eval_get", "rna_Depsgraph_id_eval_get");
706   parm = RNA_def_pointer(
707       func, "id", "ID", "", "Original ID to get evaluated complementary part for");
708   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
709   parm = RNA_def_pointer(func, "id_eval", "ID", "", "Evaluated ID for the given original one");
710   RNA_def_function_return(func, parm);
711 
712   func = RNA_def_function(srna, "id_type_updated", "rna_Depsgraph_id_type_updated");
713   parm = RNA_def_enum(func, "id_type", rna_enum_id_type_items, 0, "ID Type", "");
714   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
715   parm = RNA_def_boolean(func,
716                          "updated",
717                          false,
718                          "Updated",
719                          "True if any datablock with this type was added, updated or removed");
720   RNA_def_function_return(func, parm);
721 
722   prop = RNA_def_property(srna, "scene_eval", PROP_POINTER, PROP_NONE);
723   RNA_def_property_struct_type(prop, "Scene");
724   RNA_def_property_pointer_funcs(prop, "rna_Depsgraph_scene_eval_get", NULL, NULL, NULL);
725   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
726   RNA_def_property_ui_text(prop, "Scene", "Original scene dependency graph is built for");
727 
728   prop = RNA_def_property(srna, "view_layer_eval", PROP_POINTER, PROP_NONE);
729   RNA_def_property_struct_type(prop, "ViewLayer");
730   RNA_def_property_pointer_funcs(prop, "rna_Depsgraph_view_layer_eval_get", NULL, NULL, NULL);
731   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
732   RNA_def_property_ui_text(
733       prop, "View Layer", "Original view layer dependency graph is built for");
734 
735   /* Iterators. */
736 
737   prop = RNA_def_property(srna, "ids", PROP_COLLECTION, PROP_NONE);
738   RNA_def_property_struct_type(prop, "ID");
739   RNA_def_property_collection_funcs(prop,
740                                     "rna_Depsgraph_ids_begin",
741                                     "rna_Depsgraph_ids_next",
742                                     "rna_Depsgraph_ids_end",
743                                     "rna_Depsgraph_ids_get",
744                                     NULL,
745                                     NULL,
746                                     NULL,
747                                     NULL);
748   RNA_def_property_ui_text(prop, "IDs", "All evaluated datablocks");
749 
750   prop = RNA_def_property(srna, "objects", PROP_COLLECTION, PROP_NONE);
751   RNA_def_property_struct_type(prop, "Object");
752   RNA_def_property_collection_funcs(prop,
753                                     "rna_Depsgraph_objects_begin",
754                                     "rna_Depsgraph_objects_next",
755                                     "rna_Depsgraph_objects_end",
756                                     "rna_Depsgraph_objects_get",
757                                     NULL,
758                                     NULL,
759                                     NULL,
760                                     NULL);
761   RNA_def_property_ui_text(prop, "Objects", "Evaluated objects in the dependency graph");
762 
763   prop = RNA_def_property(srna, "object_instances", PROP_COLLECTION, PROP_NONE);
764   RNA_def_property_struct_type(prop, "DepsgraphObjectInstance");
765   RNA_def_property_collection_funcs(prop,
766                                     "rna_Depsgraph_object_instances_begin",
767                                     "rna_Depsgraph_object_instances_next",
768                                     "rna_Depsgraph_object_instances_end",
769                                     "rna_Depsgraph_object_instances_get",
770                                     NULL,
771                                     NULL,
772                                     NULL,
773                                     NULL);
774   RNA_def_property_ui_text(prop,
775                            "Object Instances",
776                            "All object instances to display or render "
777                            "(WARNING: only use this as an iterator, never as a sequence, "
778                            "and do not keep any references to its items)");
779 
780   prop = RNA_def_property(srna, "updates", PROP_COLLECTION, PROP_NONE);
781   RNA_def_property_struct_type(prop, "DepsgraphUpdate");
782   RNA_def_property_collection_funcs(prop,
783                                     "rna_Depsgraph_updates_begin",
784                                     "rna_Depsgraph_ids_next",
785                                     "rna_Depsgraph_ids_end",
786                                     "rna_Depsgraph_updates_get",
787                                     NULL,
788                                     NULL,
789                                     NULL,
790                                     NULL);
791   RNA_def_property_ui_text(prop, "Updates", "Updates to datablocks");
792 }
793 
RNA_def_depsgraph(BlenderRNA * brna)794 void RNA_def_depsgraph(BlenderRNA *brna)
795 {
796   rna_def_depsgraph_instance(brna);
797   rna_def_depsgraph_update(brna);
798   rna_def_depsgraph(brna);
799 }
800 
801 #endif
802