545acf667b6edff954714712c72045da93b98eb0
[blender.git] / source / blender / makesdna / DNA_view3d_types.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file DNA_view3d_types.h
29  *  \ingroup DNA
30  */
31
32 #ifndef __DNA_VIEW3D_TYPES_H__
33 #define __DNA_VIEW3D_TYPES_H__
34
35 struct ViewDepths;
36 struct Object;
37 struct Image;
38 struct SpaceLink;
39 struct BoundBox;
40 struct MovieClip;
41 struct MovieClipUser;
42 struct RenderEngine;
43 struct bGPdata;
44 struct SmoothView3DStore;
45 struct wmTimer;
46 struct Material;
47 struct GPUFX;
48 struct GPUViewport;
49
50 /* This is needed to not let VC choke on near and far... old
51  * proprietary MS extensions... */
52 #ifdef WIN32
53 #undef near
54 #undef far
55 #define near clipsta
56 #define far clipend
57 #endif
58
59 #include "DNA_defs.h"
60 #include "DNA_listBase.h"
61 #include "DNA_image_types.h"
62 #include "DNA_movieclip_types.h"
63 #include "DNA_gpu_types.h"
64
65 /* ******************************** */
66
67 /* The near/far thing is a Win EXCEPTION. Thus, leave near/far in the
68  * code, and patch for windows. */
69
70 typedef struct View3DDebug {
71         float znear, zfar;
72         char background;
73         char pad[7];
74 } View3DDebug;
75
76 /* ********************************* */
77 enum {
78         V3D_LIGHTING_FLAT   = 0,
79         V3D_LIGHTING_STUDIO = 1,
80         V3D_LIGHTING_SCENE  = 2
81 };
82
83 /* 
84  * V3D_DRAWOPTION_OBJECT_COLOR, V3D_DRAWOPTION_OBJECT_OVERLAP, 
85  * V3D_DRAWOPTION_SINGLE_COLOR, V3D_DRAWOPTION_MATERIAL_COLOR are mutual exclusive
86 */
87 enum {
88         V3D_DRAWOPTION_MATERIAL_COLOR = (0 << 0),
89         V3D_DRAWOPTION_RANDOMIZE      = (1 << 0),
90         V3D_DRAWOPTION_OBJECT_OVERLAP = (1 << 1),
91         V3D_DRAWOPTION_SINGLE_COLOR   = (1 << 2),
92         V3D_DRAWOPTION_OBJECT_COLOR   = (1 << 4),
93 };
94 #define V3D_DRAWOPTION_SOLID_COLOR_MASK (V3D_DRAWOPTION_SINGLE_COLOR | V3D_DRAWOPTION_RANDOMIZE | V3D_DRAWOPTION_OBJECT_COLOR | V3D_DRAWOPTION_MATERIAL_COLOR)
95
96 enum {
97         V3D_OVERLAY_FACE_ORIENTATION = (1 << 0),
98         V3D_OVERLAY_3DCURSOR         = (1 << 1),
99 };
100
101 typedef struct RegionView3D {
102         
103         float winmat[4][4];                     /* GL_PROJECTION matrix */
104         float viewmat[4][4];            /* GL_MODELVIEW matrix */
105         float viewinv[4][4];            /* inverse of viewmat */
106         float persmat[4][4];            /* viewmat*winmat */
107         float persinv[4][4];            /* inverse of persmat */
108         float viewcamtexcofac[4];       /* offset/scale for camera glsl texcoords */
109
110         /* viewmat/persmat multiplied with object matrix, while drawing and selection */
111         float viewmatob[4][4];
112         float persmatob[4][4];
113
114         /* user defined clipping planes */
115         float clip[6][4];
116         float clip_local[6][4]; /* clip in object space, means we can test for clipping in editmode without first going into worldspace */
117         struct BoundBox *clipbb;
118
119         struct RegionView3D *localvd; /* allocated backup of its self while in localview */
120         struct RenderEngine *render_engine;
121         struct ViewDepths *depths;
122         void *gpuoffscreen;
123
124         /* animated smooth view */
125         struct SmoothView3DStore *sms;
126         struct wmTimer *smooth_timer;
127
128
129         /* transform manipulator matrix */
130         float twmat[4][4];
131         /* min/max dot product on twmat xyz axis. */
132         float tw_axis_min[3], tw_axis_max[3];
133         float tw_axis_matrix[3][3];
134
135         float gridview;
136
137         float viewquat[4];                      /* view rotation, must be kept normalized */
138         float dist;                                     /* distance from 'ofs' along -viewinv[2] vector, where result is negative as is 'ofs' */
139         float camdx, camdy;                     /* camera view offsets, 1.0 = viewplane moves entire width/height */
140         float pixsize;                          /* runtime only */
141         float ofs[3];                           /* view center & orbit pivot, negative of worldspace location,
142                                                                  * also matches -viewinv[3][0:3] in ortho mode.*/
143         float camzoom;                          /* viewport zoom on the camera frame, see BKE_screen_view3d_zoom_to_fac */
144         char is_persp;                          /* check if persp/ortho view, since 'persp' cant be used for this since
145                                                                  * it can have cameras assigned as well. (only set in view3d_winmatrix_set) */
146         char persp;
147         char view;
148         char viewlock;
149         char viewlock_quad;                     /* options for quadview (store while out of quad view) */
150         char pad[3];
151         float ofs_lock[2];                      /* normalized offset for locked view: (-1, -1) bottom left, (1, 1) upper right */
152
153         short twdrawflag; /* XXX can easily get rid of this (Julian) */
154         short rflag;
155
156
157         /* last view (use when switching out of camera view) */
158         float lviewquat[4];
159         short lpersp, lview; /* lpersp can never be set to 'RV3D_CAMOB' */
160
161         /* active rotation from NDOF or elsewhere */
162         float rot_angle;
163         float rot_axis[3];
164
165         struct GPUFX *compositor;
166 } RegionView3D;
167
168 /* 3D ViewPort Struct */
169 typedef struct View3D {
170         struct SpaceLink *next, *prev;
171         ListBase regionbase;            /* storage of regions for inactive spaces */
172         int spacetype;
173         float blockscale;
174         short blockhandler[8];
175
176         float viewquat[4]  DNA_DEPRECATED;
177         float dist         DNA_DEPRECATED;
178
179         float bundle_size;                      /* size of bundles in reconstructed data */
180         char bundle_drawtype;           /* display style for bundle */
181         char pad[3];
182
183         unsigned int lay_prev; /* for active layer toggle */
184         unsigned int lay_used; /* used while drawing */
185         
186         short persp  DNA_DEPRECATED;
187         short view   DNA_DEPRECATED;
188         
189         struct Object *camera, *ob_centre;
190         rctf render_border;
191
192         struct View3D *localvd; /* allocated backup of its self while in localview */
193         
194         char ob_centre_bone[64];                /* optional string for armature bone to define center, MAXBONENAME */
195         
196         unsigned int lay;
197         int layact;
198         
199         /**
200          * The drawing mode for the 3d display. Set to OB_BOUNDBOX, OB_WIRE, OB_SOLID,
201          * OB_TEXTURE, OB_MATERIAL or OB_RENDER */
202         short drawtype;
203         short ob_centre_cursor;         /* optional bool for 3d cursor to define center */
204         short scenelock, around;
205         short flag, flag2;
206         
207         float lens, grid;
208         float near, far;
209         float ofs[3]  DNA_DEPRECATED;                   /* XXX deprecated */
210         float cursor[3];
211
212         short matcap_icon;                      /* icon id */
213
214         short gridlines;
215         short gridsubdiv;       /* Number of subdivisions in the grid between each highlighted grid line */
216         char gridflag;
217
218         /* transform manipulator info */
219         char twtype, _pad5, twflag;
220         
221         short flag3;
222
223         /* afterdraw, for xray & transparent */
224         struct ListBase afterdraw_transp;
225         struct ListBase afterdraw_xray;
226         struct ListBase afterdraw_xraytransp;
227
228         /* drawflags, denoting state */
229         char zbuf, transp, xray;
230
231         char multiview_eye;                             /* multiview current eye - for internal use */
232
233         char pad3[4];
234
235         /* note, 'fx_settings.dof' is currently _not_ allocated,
236          * instead set (temporarily) from camera */
237         struct GPUFXSettings fx_settings;
238
239         void *properties_storage;               /* Nkey panel stores stuff here (runtime only!) */
240         /* Allocated per view, not library data (used by matcap). */
241         struct Material *defmaterial;
242
243         /* XXX deprecated? */
244         struct bGPdata *gpd  DNA_DEPRECATED;            /* Grease-Pencil Data (annotation layers) */
245
246          /* multiview - stereo 3d */
247         short stereo3d_flag;
248         char stereo3d_camera;
249         char pad4;
250         float stereo3d_convergence_factor;
251         float stereo3d_volume_alpha;
252         float stereo3d_convergence_alpha;
253
254         /* Previous viewport draw type.
255          * Runtime-only, set in the rendered viewport toggle operator.
256          */
257         short prev_drawtype;
258         /* drawtype options (lighting, random) used for drawtype == OB_SOLID */
259         short drawtype_lighting;
260         short drawtype_options;
261         short pad5;
262
263         int overlays;
264         int pad6;
265
266         View3DDebug debug;
267 } View3D;
268
269
270 /* View3D->stereo_flag (short) */
271 #define V3D_S3D_DISPCAMERAS             (1 << 0)
272 #define V3D_S3D_DISPPLANE               (1 << 1)
273 #define V3D_S3D_DISPVOLUME              (1 << 2)
274
275 /* View3D->flag (short) */
276 /*#define V3D_DISPIMAGE         1*/ /*UNUSED*/
277 /*#define V3D_DISPBGPICS                2*/ /* UNUSED */
278 #define V3D_HIDE_HELPLINES      4
279 #define V3D_INVALID_BACKBUF     8
280
281 #define V3D_ALIGN                       1024
282 #define V3D_SELECT_OUTLINE      2048
283 #define V3D_ZBUF_SELECT         4096
284 #define V3D_GLOBAL_STATS        8192
285 #define V3D_DRAW_CENTERS        32768
286
287 /* RegionView3d->persp */
288 #define RV3D_ORTHO                              0
289 #define RV3D_PERSP                              1
290 #define RV3D_CAMOB                              2
291
292 /* RegionView3d->rflag */
293 #define RV3D_CLIPPING                           4
294 #define RV3D_NAVIGATING                         8
295 #define RV3D_GPULIGHT_UPDATE            16
296 /*#define RV3D_IS_GAME_ENGINE                   32 *//* UNUSED */
297 /**
298  * Disable zbuffer offset, skip calls to #ED_view3d_polygon_offset.
299  * Use when precise surface depth is needed and picking bias isn't, see T45434).
300  */
301 #define RV3D_ZOFFSET_DISABLED           64
302
303 /* RegionView3d->viewlock */
304 #define RV3D_LOCKED                     (1 << 0)
305 #define RV3D_BOXVIEW            (1 << 1)
306 #define RV3D_BOXCLIP            (1 << 2)
307 /* RegionView3d->viewlock_quad */
308 #define RV3D_VIEWLOCK_INIT      (1 << 7)
309
310 /* RegionView3d->view */
311 #define RV3D_VIEW_USER                   0
312 #define RV3D_VIEW_FRONT                  1
313 #define RV3D_VIEW_BACK                   2
314 #define RV3D_VIEW_LEFT                   3
315 #define RV3D_VIEW_RIGHT                  4
316 #define RV3D_VIEW_TOP                    5
317 #define RV3D_VIEW_BOTTOM                 6
318 #define RV3D_VIEW_CAMERA                 8
319
320 #define RV3D_VIEW_IS_AXIS(view) \
321         (((view) >= RV3D_VIEW_FRONT) && ((view) <= RV3D_VIEW_BOTTOM))
322
323 /* View3d->flag2 (short) */
324 #define V3D_RENDER_OVERRIDE             (1 << 2)
325 #define V3D_SOLID_TEX                   (1 << 3)
326 #define V3D_SHOW_GPENCIL                (1 << 4)
327 #define V3D_LOCK_CAMERA                 (1 << 5)
328 #define V3D_RENDER_SHADOW               (1 << 6)                /* This is a runtime only flag that's used to tell draw_mesh_object() that we're doing a shadow pass instead of a regular draw */
329 #define V3D_SHOW_RECONSTRUCTION (1 << 7)
330 #define V3D_SHOW_CAMERAPATH             (1 << 8)
331 #define V3D_SHOW_BUNDLENAME             (1 << 9)
332 #define V3D_BACKFACE_CULLING    (1 << 10)
333 #define V3D_RENDER_BORDER               (1 << 11)
334 #define V3D_SOLID_MATCAP                (1 << 12)       /* user flag */
335 #define V3D_SHOW_SOLID_MATCAP   (1 << 13)       /* runtime flag */
336 #define V3D_OCCLUDE_WIRE                (1 << 14)
337 #define V3D_SHOW_MODE_SHADE_OVERRIDE    (1 << 15)
338
339
340 /* View3d->flag3 (short) */
341 #define V3D_SHOW_WORLD                  (1 << 0)
342
343 /* View3d->debug.background */
344 enum {
345         V3D_DEBUG_BACKGROUND_NONE     = (1 << 0),
346         V3D_DEBUG_BACKGROUND_GRADIENT = (1 << 1),
347         V3D_DEBUG_BACKGROUND_WORLD    = (1 << 2),
348 };
349
350 /* View3D->around */
351 enum {
352         /* center of the bounding box */
353         V3D_AROUND_CENTER_BOUNDS        = 0,
354         /* center from the sum of all points divided by the total */
355         V3D_AROUND_CENTER_MEAN          = 3,
356         /* pivot around the 2D/3D cursor */
357         V3D_AROUND_CURSOR                       = 1,
358         /* pivot around each items own origin */
359         V3D_AROUND_LOCAL_ORIGINS        = 2,
360         /* pivot around the active items origin */
361         V3D_AROUND_ACTIVE                       = 4,
362 };
363
364 /*View3D types (only used in tools, not actually saved)*/
365 #define V3D_VIEW_STEPLEFT                1
366 #define V3D_VIEW_STEPRIGHT               2
367 #define V3D_VIEW_STEPDOWN                3
368 #define V3D_VIEW_STEPUP          4
369 #define V3D_VIEW_PANLEFT                 5
370 #define V3D_VIEW_PANRIGHT                6
371 #define V3D_VIEW_PANDOWN                 7
372 #define V3D_VIEW_PANUP                   8
373
374 /* View3d->gridflag */
375 #define V3D_SHOW_FLOOR                  1
376 #define V3D_SHOW_X                              2
377 #define V3D_SHOW_Y                              4
378 #define V3D_SHOW_Z                              8
379
380 /* Scene.orientation_type */
381 #define V3D_MANIP_GLOBAL                0
382 #define V3D_MANIP_LOCAL                 1
383 #define V3D_MANIP_NORMAL                2
384 #define V3D_MANIP_VIEW                  3
385 #define V3D_MANIP_GIMBAL                4
386 #define V3D_MANIP_CUSTOM                5
387
388 /* View3d->twflag (also) */
389 enum {
390         V3D_MANIPULATOR_DRAW        = (1 << 0),
391 };
392
393 #define RV3D_CAMZOOM_MIN -30
394 #define RV3D_CAMZOOM_MAX 600
395
396 /* #BKE_screen_view3d_zoom_to_fac() values above */
397 #define RV3D_CAMZOOM_MIN_FACTOR  0.1657359312880714853f
398 #define RV3D_CAMZOOM_MAX_FACTOR 44.9852813742385702928f
399
400 #endif
401