Merge branch 'master' into soc-2019-openxr
[blender.git] / source / blender / blenkernel / BKE_global.h
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  */
19 #ifndef __BKE_GLOBAL_H__
20 #define __BKE_GLOBAL_H__
21
22 /** \file
23  * \ingroup bke
24  * \section aboutglobal Global settings
25  *   Global settings, handles, pointers. This is the root for finding
26  *   any data in Blender. This block is not serialized, but built anew
27  *   for every fresh Blender run.
28  */
29
30 #include "DNA_listBase.h"
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 struct Main;
37
38 typedef struct Global {
39
40   /** Active pointers. */
41   struct Main *main;
42
43   /** Strings: last saved */
44   char ima[1024], lib[1024]; /* 1024 = FILE_MAX */
45
46   /** When set: `G_MAIN->name` contains valid relative base path. */
47   bool relbase_valid;
48   bool file_loaded;
49   bool save_over;
50
51   /** Strings of recent opened files. */
52   struct ListBase recent_files;
53
54   /** Has escape been pressed or Ctrl+C pressed in background mode, used for render quit. */
55   bool is_break;
56
57   bool background;
58   bool factory_startup;
59
60   short moving;
61
62   /** To indicate render is busy, prevent renderwindow events etc. */
63   bool is_rendering;
64
65   /**
66    * Debug value, can be set from the UI and python, used for testing nonstandard features.
67    * DO NOT abuse it with generic checks like `if (G.debug_value > 0)`. Do not use it as bitflags.
68    * Only precise specific values should be checked for, to avoid unpredictable side-effects.
69    * Please document here the value(s) you are using (or a range of values reserved to some area).
70    *   * -16384 and below: Reserved for python (add-ons) usage.
71    *   *     -1: Disable faster motion paths computation (since 08/2018).
72    *   * 1 - 30: EEVEE debug/stats values (01/2018).
73    *   *    101: Enable UI debug drawing of fullscreen area's corner widget (10/2014).
74    *   *    527: Old mysterious switch in behavior of MeshDeform modifier (before 04/2010).
75    *   *    666: Use quicker batch delete for outliners' delete hierarchy (01/2019).
76    *   *    777: Enable UI node panel's sockets polling (11/2011).
77    *   *    799: Enable some mysterious new depsgraph behavior (05/2015).
78    *   *   1112: Disable new Cloth internal springs handling (09/2014).
79    *   *   1234: Disable new dyntopo code fixing skinny faces generation (04/2015).
80    *   * 16384 and above: Reserved for python (add-ons) usage.
81    */
82   short debug_value;
83
84   /** Saved to the blend file as #FileGlobal.globalf,
85    * however this is now only used for runtime options. */
86   int f;
87
88   struct {
89     /** Logging vars (different loggers may use). */
90     int level;
91     /** FILE handle or use stderr (we own this so close when done). */
92     void *file;
93   } log;
94
95   /** debug flag, #G_DEBUG, #G_DEBUG_PYTHON & friends, set python or command line args */
96   int debug;
97
98   /** This variable is written to / read from #FileGlobal.fileflags */
99   int fileflags;
100
101   /** Message to use when auto execution fails. */
102   char autoexec_fail[200];
103 } Global;
104
105 /* **************** GLOBAL ********************* */
106
107 /** #Global.f */
108 enum {
109   G_FLAG_RENDER_VIEWPORT = (1 << 0),
110   G_FLAG_PICKSEL = (1 << 2),
111   /** Support simulating events (for testing). */
112   G_FLAG_EVENT_SIMULATE = (1 << 3),
113   G_FLAG_USERPREF_NO_SAVE_ON_EXIT = (1 << 4),
114
115   G_FLAG_SCRIPT_AUTOEXEC = (1 << 13),
116   /** When this flag is set ignore the prefs #USER_SCRIPT_AUTOEXEC_DISABLE. */
117   G_FLAG_SCRIPT_OVERRIDE_PREF = (1 << 14),
118   G_FLAG_SCRIPT_AUTOEXEC_FAIL = (1 << 15),
119   G_FLAG_SCRIPT_AUTOEXEC_FAIL_QUIET = (1 << 16),
120 };
121
122 /** Don't overwrite these flags when reading a file. */
123 #define G_FLAG_ALL_RUNTIME \
124   (G_FLAG_SCRIPT_AUTOEXEC | G_FLAG_SCRIPT_OVERRIDE_PREF | G_FLAG_EVENT_SIMULATE | \
125    G_FLAG_USERPREF_NO_SAVE_ON_EXIT)
126
127 /** Flags to read from blend file. */
128 #define G_FLAG_ALL_READFILE 0
129
130 /** #Global.debug */
131 enum {
132   G_DEBUG = (1 << 0), /* general debug flag, print more info in unexpected cases */
133   G_DEBUG_FFMPEG = (1 << 1),
134   G_DEBUG_PYTHON = (1 << 2),                /* extra python info */
135   G_DEBUG_EVENTS = (1 << 3),                /* input/window/screen events */
136   G_DEBUG_HANDLERS = (1 << 4),              /* events handling */
137   G_DEBUG_WM = (1 << 5),                    /* operator, undo */
138   G_DEBUG_JOBS = (1 << 6),                  /* jobs time profiling */
139   G_DEBUG_FREESTYLE = (1 << 7),             /* freestyle messages */
140   G_DEBUG_DEPSGRAPH_BUILD = (1 << 8),       /* depsgraph construction messages */
141   G_DEBUG_DEPSGRAPH_EVAL = (1 << 9),        /* depsgraph evaluation messages */
142   G_DEBUG_DEPSGRAPH_TAG = (1 << 10),        /* depsgraph tagging messages */
143   G_DEBUG_DEPSGRAPH_TIME = (1 << 11),       /* depsgraph timing statistics and messages */
144   G_DEBUG_DEPSGRAPH_NO_THREADS = (1 << 12), /* single threaded depsgraph */
145   G_DEBUG_DEPSGRAPH_PRETTY = (1 << 13),     /* use pretty colors in depsgraph messages */
146   G_DEBUG_DEPSGRAPH = (G_DEBUG_DEPSGRAPH_BUILD | G_DEBUG_DEPSGRAPH_EVAL | G_DEBUG_DEPSGRAPH_TAG |
147                        G_DEBUG_DEPSGRAPH_TIME),
148   G_DEBUG_SIMDATA = (1 << 14),               /* sim debug data display */
149   G_DEBUG_GPU_MEM = (1 << 15),               /* gpu memory in status bar */
150   G_DEBUG_GPU = (1 << 16),                   /* gpu debug */
151   G_DEBUG_IO = (1 << 17),                    /* IO Debugging (for Collada, ...)*/
152   G_DEBUG_GPU_SHADERS = (1 << 18),           /* GLSL shaders */
153   G_DEBUG_GPU_FORCE_WORKAROUNDS = (1 << 19), /* force gpu workarounds bypassing detections. */
154   G_DEBUG_XR = (1 << 20),                    /* XR/OpenXR messages */
155 };
156
157 #define G_DEBUG_ALL \
158   (G_DEBUG | G_DEBUG_FFMPEG | G_DEBUG_PYTHON | G_DEBUG_EVENTS | G_DEBUG_WM | G_DEBUG_JOBS | \
159    G_DEBUG_FREESTYLE | G_DEBUG_DEPSGRAPH | G_DEBUG_GPU_MEM | G_DEBUG_IO | G_DEBUG_GPU_SHADERS)
160
161 /** #Global.fileflags */
162 enum {
163   G_FILE_AUTOPACK = (1 << 0),
164   G_FILE_COMPRESS = (1 << 1),
165
166   G_FILE_USERPREFS = (1 << 9),
167   G_FILE_NO_UI = (1 << 10),
168
169   /* Bits 11 to 22 (inclusive) are deprecated & need to be cleared */
170
171   /** On read, use #FileGlobal.filename instead of the real location on-disk,
172    * needed for recovering temp files so relative paths resolve */
173   G_FILE_RECOVER = (1 << 23),
174   /** On write, remap relative file paths to the new file location. */
175   G_FILE_RELATIVE_REMAP = (1 << 24),
176   /** On write, make backup `.blend1`, `.blend2` ... files, when the users preference is enabled */
177   G_FILE_HISTORY = (1 << 25),
178   /** BMesh option to save as older mesh format */
179   /* #define G_FILE_MESH_COMPAT       (1 << 26) */
180   /** On write, restore paths after editing them (G_FILE_RELATIVE_REMAP) */
181   G_FILE_SAVE_COPY = (1 << 27),
182   /* #define G_FILE_GLSL_NO_ENV_LIGHTING (1 << 28) */ /* deprecated */
183 };
184
185 /** Don't overwrite these flags when reading a file. */
186 #define G_FILE_FLAG_ALL_RUNTIME (G_FILE_NO_UI | G_FILE_RELATIVE_REMAP | G_FILE_SAVE_COPY)
187
188 /** ENDIAN_ORDER: indicates what endianness the platform where the file was written had. */
189 #if !defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)
190 #  error Either __BIG_ENDIAN__ or __LITTLE_ENDIAN__ must be defined.
191 #endif
192
193 #define L_ENDIAN 1
194 #define B_ENDIAN 0
195
196 #ifdef __BIG_ENDIAN__
197 #  define ENDIAN_ORDER B_ENDIAN
198 #else
199 #  define ENDIAN_ORDER L_ENDIAN
200 #endif
201
202 /** #Global.moving, signals drawing in (3d) window to denote transform */
203 enum {
204   G_TRANSFORM_OBJ = (1 << 0),
205   G_TRANSFORM_EDIT = (1 << 1),
206   G_TRANSFORM_SEQ = (1 << 2),
207   G_TRANSFORM_FCURVES = (1 << 3),
208   G_TRANSFORM_WM = (1 << 4),
209 };
210
211 /** Defined in blender.c */
212 extern Global G;
213
214 /**
215  * Stupid macro to hide the few *valid* usages of `G.main` (from startup/exit code e.g.),
216  * helps with cleanup task.
217  */
218 #define G_MAIN (G).main
219
220 #ifdef __cplusplus
221 }
222 #endif
223
224 #endif