GPU: Fix huge performance regression regarding instancing
[blender.git] / source / blender / makesrna / intern / rna_context.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
17 /** \file
18  * \ingroup RNA
19  */
20
21 #include <stdlib.h>
22
23 #include "DNA_ID.h"
24 #include "DNA_userdef_types.h"
25
26 #include "BLI_utildefines.h"
27 #include "BKE_context.h"
28
29 #include "RNA_access.h"
30 #include "RNA_define.h"
31 #include "RNA_enum_types.h"
32
33 #include "rna_internal.h" /* own include */
34
35 const EnumPropertyItem rna_enum_context_mode_items[] = {
36     {CTX_MODE_EDIT_MESH, "EDIT_MESH", 0, "Mesh Edit", ""},
37     {CTX_MODE_EDIT_CURVE, "EDIT_CURVE", 0, "Curve Edit", ""},
38     {CTX_MODE_EDIT_SURFACE, "EDIT_SURFACE", 0, "Surface Edit", ""},
39     {CTX_MODE_EDIT_TEXT, "EDIT_TEXT", 0, "Edit Edit", ""},
40     /* PARSKEL reuse will give issues */
41     {CTX_MODE_EDIT_ARMATURE, "EDIT_ARMATURE", 0, "Armature Edit", ""},
42     {CTX_MODE_EDIT_METABALL, "EDIT_METABALL", 0, "Metaball Edit", ""},
43     {CTX_MODE_EDIT_LATTICE, "EDIT_LATTICE", 0, "Lattice Edit", ""},
44     {CTX_MODE_POSE, "POSE", 0, "Pose ", ""},
45     {CTX_MODE_SCULPT, "SCULPT", 0, "Sculpt", ""},
46     {CTX_MODE_PAINT_WEIGHT, "PAINT_WEIGHT", 0, "Weight Paint", ""},
47     {CTX_MODE_PAINT_VERTEX, "PAINT_VERTEX", 0, "Vertex Paint", ""},
48     {CTX_MODE_PAINT_TEXTURE, "PAINT_TEXTURE", 0, "Texture Paint", ""},
49     {CTX_MODE_PARTICLE, "PARTICLE", 0, "Particle", ""},
50     {CTX_MODE_OBJECT, "OBJECT", 0, "Object", ""},
51     {CTX_MODE_PAINT_GPENCIL, "PAINT_GPENCIL", 0, "Grease Pencil Paint", ""},
52     {CTX_MODE_EDIT_GPENCIL, "EDIT_GPENCIL", 0, "Grease Pencil Edit", ""},
53     {CTX_MODE_SCULPT_GPENCIL, "SCULPT_GPENCIL", 0, "Grease Pencil Sculpt", ""},
54     {CTX_MODE_WEIGHT_GPENCIL, "WEIGHT_GPENCIL", 0, "Grease Pencil Weight Paint", ""},
55     {0, NULL, 0, NULL, NULL},
56 };
57
58 #ifdef RNA_RUNTIME
59
60 #  ifdef WITH_PYTHON
61 #    include "BPY_extern.h"
62 #  endif
63
64 #  include "RE_engine.h"
65
66 static PointerRNA rna_Context_manager_get(PointerRNA *ptr)
67 {
68   bContext *C = (bContext *)ptr->data;
69   return rna_pointer_inherit_refine(ptr, &RNA_WindowManager, CTX_wm_manager(C));
70 }
71
72 static PointerRNA rna_Context_window_get(PointerRNA *ptr)
73 {
74   bContext *C = (bContext *)ptr->data;
75   return rna_pointer_inherit_refine(ptr, &RNA_Window, CTX_wm_window(C));
76 }
77
78 static PointerRNA rna_Context_workspace_get(PointerRNA *ptr)
79 {
80   bContext *C = (bContext *)ptr->data;
81   return rna_pointer_inherit_refine(ptr, &RNA_WorkSpace, CTX_wm_workspace(C));
82 }
83
84 static PointerRNA rna_Context_screen_get(PointerRNA *ptr)
85 {
86   bContext *C = (bContext *)ptr->data;
87   return rna_pointer_inherit_refine(ptr, &RNA_Screen, CTX_wm_screen(C));
88 }
89
90 static PointerRNA rna_Context_area_get(PointerRNA *ptr)
91 {
92   bContext *C = (bContext *)ptr->data;
93   PointerRNA newptr;
94   RNA_pointer_create((ID *)CTX_wm_screen(C), &RNA_Area, CTX_wm_area(C), &newptr);
95   return newptr;
96 }
97
98 static PointerRNA rna_Context_space_data_get(PointerRNA *ptr)
99 {
100   bContext *C = (bContext *)ptr->data;
101   PointerRNA newptr;
102   RNA_pointer_create((ID *)CTX_wm_screen(C), &RNA_Space, CTX_wm_space_data(C), &newptr);
103   return newptr;
104 }
105
106 static PointerRNA rna_Context_region_get(PointerRNA *ptr)
107 {
108   bContext *C = (bContext *)ptr->data;
109   PointerRNA newptr;
110   RNA_pointer_create((ID *)CTX_wm_screen(C), &RNA_Region, CTX_wm_region(C), &newptr);
111   return newptr;
112 }
113
114 static PointerRNA rna_Context_region_data_get(PointerRNA *ptr)
115 {
116   bContext *C = (bContext *)ptr->data;
117
118   /* only exists for one space still, no generic system yet */
119   if (CTX_wm_view3d(C)) {
120     PointerRNA newptr;
121     RNA_pointer_create((ID *)CTX_wm_screen(C), &RNA_RegionView3D, CTX_wm_region_data(C), &newptr);
122     return newptr;
123   }
124
125   return PointerRNA_NULL;
126 }
127
128 static PointerRNA rna_Context_gizmo_group_get(PointerRNA *ptr)
129 {
130   bContext *C = (bContext *)ptr->data;
131   PointerRNA newptr;
132   RNA_pointer_create(NULL, &RNA_GizmoGroup, CTX_wm_gizmo_group(C), &newptr);
133   return newptr;
134 }
135
136 static PointerRNA rna_Context_main_get(PointerRNA *ptr)
137 {
138   bContext *C = (bContext *)ptr->data;
139   return rna_pointer_inherit_refine(ptr, &RNA_BlendData, CTX_data_main(C));
140 }
141
142 static PointerRNA rna_Context_scene_get(PointerRNA *ptr)
143 {
144   bContext *C = (bContext *)ptr->data;
145   return rna_pointer_inherit_refine(ptr, &RNA_Scene, CTX_data_scene(C));
146 }
147
148 static PointerRNA rna_Context_view_layer_get(PointerRNA *ptr)
149 {
150   bContext *C = (bContext *)ptr->data;
151   Scene *scene = CTX_data_scene(C);
152   PointerRNA scene_ptr;
153
154   RNA_id_pointer_create(&scene->id, &scene_ptr);
155   return rna_pointer_inherit_refine(&scene_ptr, &RNA_ViewLayer, CTX_data_view_layer(C));
156 }
157
158 static void rna_Context_engine_get(PointerRNA *ptr, char *value)
159 {
160   bContext *C = (bContext *)ptr->data;
161   RenderEngineType *engine_type = CTX_data_engine_type(C);
162   strcpy(value, engine_type->idname);
163 }
164
165 static int rna_Context_engine_length(PointerRNA *ptr)
166 {
167   bContext *C = (bContext *)ptr->data;
168   RenderEngineType *engine_type = CTX_data_engine_type(C);
169   return strlen(engine_type->idname);
170 }
171
172 static PointerRNA rna_Context_collection_get(PointerRNA *ptr)
173 {
174   bContext *C = (bContext *)ptr->data;
175   return rna_pointer_inherit_refine(ptr, &RNA_Collection, CTX_data_collection(C));
176 }
177
178 static PointerRNA rna_Context_layer_collection_get(PointerRNA *ptr)
179 {
180   bContext *C = (bContext *)ptr->data;
181   ptr->owner_id = &CTX_data_scene(C)->id;
182   return rna_pointer_inherit_refine(ptr, &RNA_LayerCollection, CTX_data_layer_collection(C));
183 }
184
185 static PointerRNA rna_Context_tool_settings_get(PointerRNA *ptr)
186 {
187   bContext *C = (bContext *)ptr->data;
188   ptr->owner_id = &CTX_data_scene(C)->id;
189   return rna_pointer_inherit_refine(ptr, &RNA_ToolSettings, CTX_data_tool_settings(C));
190 }
191
192 static PointerRNA rna_Context_preferences_get(PointerRNA *UNUSED(ptr))
193 {
194   PointerRNA newptr;
195   RNA_pointer_create(NULL, &RNA_Preferences, &U, &newptr);
196   return newptr;
197 }
198
199 static int rna_Context_mode_get(PointerRNA *ptr)
200 {
201   bContext *C = (bContext *)ptr->data;
202   return CTX_data_mode_enum(C);
203 }
204
205 static struct Depsgraph *rna_Context_evaluated_depsgraph_get(bContext *C)
206 {
207   struct Depsgraph *depsgraph;
208
209 #  ifdef WITH_PYTHON
210   /* Allow drivers to be evaluated */
211   BPy_BEGIN_ALLOW_THREADS;
212 #  endif
213
214   depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
215
216 #  ifdef WITH_PYTHON
217   BPy_END_ALLOW_THREADS;
218 #  endif
219
220   return depsgraph;
221 }
222
223 #else
224
225 void RNA_def_context(BlenderRNA *brna)
226 {
227   StructRNA *srna;
228   PropertyRNA *prop;
229
230   FunctionRNA *func;
231   PropertyRNA *parm;
232
233   srna = RNA_def_struct(brna, "Context", NULL);
234   RNA_def_struct_ui_text(srna, "Context", "Current windowmanager and data context");
235   RNA_def_struct_sdna(srna, "bContext");
236
237   /* WM */
238   prop = RNA_def_property(srna, "window_manager", PROP_POINTER, PROP_NONE);
239   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
240   RNA_def_property_struct_type(prop, "WindowManager");
241   RNA_def_property_pointer_funcs(prop, "rna_Context_manager_get", NULL, NULL, NULL);
242
243   prop = RNA_def_property(srna, "window", PROP_POINTER, PROP_NONE);
244   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
245   RNA_def_property_struct_type(prop, "Window");
246   RNA_def_property_pointer_funcs(prop, "rna_Context_window_get", NULL, NULL, NULL);
247
248   prop = RNA_def_property(srna, "workspace", PROP_POINTER, PROP_NONE);
249   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
250   RNA_def_property_struct_type(prop, "WorkSpace");
251   RNA_def_property_pointer_funcs(prop, "rna_Context_workspace_get", NULL, NULL, NULL);
252
253   prop = RNA_def_property(srna, "screen", PROP_POINTER, PROP_NONE);
254   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
255   RNA_def_property_struct_type(prop, "Screen");
256   RNA_def_property_pointer_funcs(prop, "rna_Context_screen_get", NULL, NULL, NULL);
257
258   prop = RNA_def_property(srna, "area", PROP_POINTER, PROP_NONE);
259   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
260   RNA_def_property_struct_type(prop, "Area");
261   RNA_def_property_pointer_funcs(prop, "rna_Context_area_get", NULL, NULL, NULL);
262
263   prop = RNA_def_property(srna, "space_data", PROP_POINTER, PROP_NONE);
264   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
265   RNA_def_property_struct_type(prop, "Space");
266   RNA_def_property_pointer_funcs(prop, "rna_Context_space_data_get", NULL, NULL, NULL);
267
268   prop = RNA_def_property(srna, "region", PROP_POINTER, PROP_NONE);
269   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
270   RNA_def_property_struct_type(prop, "Region");
271   RNA_def_property_pointer_funcs(prop, "rna_Context_region_get", NULL, NULL, NULL);
272
273   prop = RNA_def_property(srna, "region_data", PROP_POINTER, PROP_NONE);
274   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
275   RNA_def_property_struct_type(prop, "RegionView3D");
276   RNA_def_property_pointer_funcs(prop, "rna_Context_region_data_get", NULL, NULL, NULL);
277
278   prop = RNA_def_property(srna, "gizmo_group", PROP_POINTER, PROP_NONE);
279   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
280   RNA_def_property_struct_type(prop, "GizmoGroup");
281   RNA_def_property_pointer_funcs(prop, "rna_Context_gizmo_group_get", NULL, NULL, NULL);
282
283   /* Data */
284   prop = RNA_def_property(srna, "blend_data", PROP_POINTER, PROP_NONE);
285   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
286   RNA_def_property_struct_type(prop, "BlendData");
287   RNA_def_property_pointer_funcs(prop, "rna_Context_main_get", NULL, NULL, NULL);
288
289   prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
290   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
291   RNA_def_property_struct_type(prop, "Scene");
292   RNA_def_property_pointer_funcs(prop, "rna_Context_scene_get", NULL, NULL, NULL);
293
294   prop = RNA_def_property(srna, "view_layer", PROP_POINTER, PROP_NONE);
295   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
296   RNA_def_property_struct_type(prop, "ViewLayer");
297   RNA_def_property_pointer_funcs(prop, "rna_Context_view_layer_get", NULL, NULL, NULL);
298
299   prop = RNA_def_property(srna, "engine", PROP_STRING, PROP_NONE);
300   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
301   RNA_def_property_string_funcs(prop, "rna_Context_engine_get", "rna_Context_engine_length", NULL);
302
303   prop = RNA_def_property(srna, "collection", PROP_POINTER, PROP_NONE);
304   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
305   RNA_def_property_struct_type(prop, "Collection");
306   RNA_def_property_pointer_funcs(prop, "rna_Context_collection_get", NULL, NULL, NULL);
307
308   prop = RNA_def_property(srna, "layer_collection", PROP_POINTER, PROP_NONE);
309   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
310   RNA_def_property_struct_type(prop, "LayerCollection");
311   RNA_def_property_pointer_funcs(prop, "rna_Context_layer_collection_get", NULL, NULL, NULL);
312
313   prop = RNA_def_property(srna, "tool_settings", PROP_POINTER, PROP_NONE);
314   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
315   RNA_def_property_struct_type(prop, "ToolSettings");
316   RNA_def_property_pointer_funcs(prop, "rna_Context_tool_settings_get", NULL, NULL, NULL);
317
318   prop = RNA_def_property(srna, "preferences", PROP_POINTER, PROP_NONE);
319   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
320   RNA_def_property_struct_type(prop, "Preferences");
321   RNA_def_property_pointer_funcs(prop, "rna_Context_preferences_get", NULL, NULL, NULL);
322
323   prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
324   RNA_def_property_enum_items(prop, rna_enum_context_mode_items);
325   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
326   RNA_def_property_enum_funcs(prop, "rna_Context_mode_get", NULL, NULL);
327
328   func = RNA_def_function(srna, "evaluated_depsgraph_get", "rna_Context_evaluated_depsgraph_get");
329   RNA_def_function_ui_description(
330       func,
331       "Get the dependency graph for the current scene and view layer, to access to data-blocks "
332       "with animation and modifiers applied. If any data-blocks have been edited, the dependency "
333       "graph will be updated. This invalidates all references to evaluated data-blocks from the "
334       "dependency graph.");
335   parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "Evaluated dependency graph");
336   RNA_def_function_return(func, parm);
337 }
338
339 #endif