5b38875caa6355fc4eb04fb2b8e30bba33ac28df
[blender.git] / source / blender / makesdna / DNA_object_types.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
20 /** \file
21  * \ingroup DNA
22  * \brief Object is a sort of wrapper for general info.
23  */
24
25 #ifndef __DNA_OBJECT_TYPES_H__
26 #define __DNA_OBJECT_TYPES_H__
27
28 #include "DNA_object_enums.h"
29
30 #include "DNA_defs.h"
31 #include "DNA_listBase.h"
32 #include "DNA_ID.h"
33 #include "DNA_action_types.h" /* bAnimVizSettings */
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 struct AnimData;
40 struct BoundBox;
41 struct DerivedMesh;
42 struct FluidsimSettings;
43 struct GpencilBatchCache;
44 struct Ipo;
45 struct Material;
46 struct Object;
47 struct PartDeflect;
48 struct ParticleSystem;
49 struct Path;
50 struct RigidBodyOb;
51 struct SculptSession;
52 struct SoftBody;
53 struct bGPdata;
54
55 /* Vertex Groups - Name Info */
56 typedef struct bDeformGroup {
57         struct bDeformGroup *next, *prev;
58         /** MAX_VGROUP_NAME. */
59         char name[64];
60         /* need this flag for locking weights */
61         char flag, _pad0[7];
62 } bDeformGroup;
63
64 /* Face Maps*/
65 typedef struct bFaceMap {
66         struct bFaceMap *next, *prev;
67         /** MAX_VGROUP_NAME. */
68         char name[64];
69         char flag;
70         char _pad0[7];
71 } bFaceMap;
72
73 #define MAX_VGROUP_NAME 64
74
75 /* bDeformGroup->flag */
76 #define DG_LOCK_WEIGHT 1
77
78 /**
79  * The following illustrates the orientation of the
80  * bounding box in local space
81  *
82  * <pre>
83  *
84  * Z  Y
85  * | /
86  * |/
87  * .-----X
88  *     2----------6
89  *    /|         /|
90  *   / |        / |
91  *  1----------5  |
92  *  |  |       |  |
93  *  |  3-------|--7
94  *  | /        | /
95  *  |/         |/
96  *  0----------4
97  * </pre>
98  */
99 typedef struct BoundBox {
100         float vec[8][3];
101         int flag;
102         char _pad0[4];
103 } BoundBox;
104
105 /* boundbox flag */
106 enum {
107         BOUNDBOX_DISABLED = (1 << 0),
108         BOUNDBOX_DIRTY  = (1 << 1),
109 };
110
111 typedef struct LodLevel {
112         struct LodLevel *next, *prev;
113         struct Object *source;
114         int flags;
115         float distance;
116         char _pad0[4];
117         int obhysteresis;
118 } LodLevel;
119
120 /* Forward declaration for cache bbone deformation information.
121  *
122  * TODO(sergey): Consider moving it to more appropriate place. */
123 struct ObjectBBoneDeform;
124
125 /* Not saved in file! */
126 typedef struct Object_Runtime {
127         /**
128          * The custom data layer mask that was last used
129          * to calculate mesh_eval and mesh_deform_eval.
130          */
131         uint64_t last_data_mask;
132
133         /** Did last modifier stack generation need mapping support? */
134         char last_need_mapping;
135
136         char _pad0[3];
137
138         /** Only used for drawing the parent/child help-line. */
139         float parent_origin_eval[3];
140
141
142         /** Axis aligned boundbox (in localspace). */
143         struct BoundBox *bb;
144
145         /**
146          * Original mesh pointer, before object->data was changed to point
147          * to mesh_eval.
148          * Is assigned by dependency graph's copy-on-write evaluation.
149          */
150         struct Mesh *mesh_orig;
151         /**
152          * Mesh structure created during object evaluation.
153          * It has all modifiers applied.
154          */
155         struct Mesh *mesh_eval;
156         /**
157          * Mesh structure created during object evaluation.
158          * It has deforemation only modifiers applied on it.
159          */
160         struct Mesh *mesh_deform_eval;
161
162         /** Runtime evaluated curve-specific data, not stored in the file. */
163         struct CurveCache *curve_cache;
164
165         /** Runtime grease pencil drawing data */
166         struct GpencilBatchCache *gpencil_cache;
167
168         struct ObjectBBoneDeform *cached_bbone_deformation;
169
170 } Object_Runtime;
171
172 typedef struct Object {
173         ID id;
174         /** Animation data (must be immediately after id for utilities to use it). */
175         struct AnimData *adt;
176         /** Runtime (must be immediately after id for utilities to use it). */
177         struct DrawDataList drawdata;
178
179         struct SculptSession *sculpt;
180
181         short type, partype;
182         /** Can be vertexnrs. */
183         int par1, par2, par3;
184         /** String describing subobject info, MAX_ID_NAME-2. */
185         char parsubstr[64];
186         struct Object *parent, *track;
187         /* if ob->proxy (or proxy_group), this object is proxy for object ob->proxy */
188         /* proxy_from is set in target back to the proxy. */
189         struct Object *proxy, *proxy_group, *proxy_from;
190         /** Old animation system, deprecated for 2.5. */
191         struct Ipo *ipo  DNA_DEPRECATED;
192         /* struct Path *path; */
193         struct bAction *action  DNA_DEPRECATED;  // XXX deprecated... old animation system
194         struct bAction *poselib;
195         /** Pose data, armature objects only. */
196         struct bPose *pose;
197         /** Pointer to objects data - an 'ID' or NULL. */
198         void *data;
199
200         /** Grease Pencil data. */
201         struct bGPdata *gpd;
202
203         /** Settings for visualization of object-transform animation. */
204         bAnimVizSettings avs;
205         /** Motion path cache for this object. */
206         bMotionPath *mpath;
207         void *_pad0;
208
209         ListBase constraintChannels  DNA_DEPRECATED; // XXX deprecated... old animation system
210         ListBase effect  DNA_DEPRECATED;             // XXX deprecated... keep for readfile
211         /** List of bDeformGroup (vertex groups) names and flag only. */
212         ListBase defbase;
213         /** List of ModifierData structures. */
214         ListBase modifiers;
215         /** List of GpencilModifierData structures. */
216         ListBase greasepencil_modifiers;
217         /** List of facemaps. */
218         ListBase fmaps;
219         /** List of viewport effects. Actually only used by grease pencil. */
220         ListBase shader_fx;
221
222         /** Local object mode. */
223         int mode;
224         int restore_mode;
225
226         /* materials */
227         /** Material slots. */
228         struct Material **mat;
229         /** A boolean field, with each byte 1 if corresponding material is linked to object. */
230         char *matbits;
231         /** Copy of mesh, curve & meta struct member of same name (keep in sync). */
232         int totcol;
233         /** Currently selected material in the UI. */
234         int actcol;
235
236         /* rot en drot have to be together! (transform('r' en 's')) */
237         float loc[3], dloc[3];
238         /** Scale (can be negative). */
239         float scale[3];
240         /** DEPRECATED, 2.60 and older only. */
241         float dsize[3] DNA_DEPRECATED ;
242         /** Ack!, changing. */
243         float dscale[3];
244         /** Euler rotation. */
245         float rot[3], drot[3];
246         /** Quaternion rotation. */
247         float quat[4], dquat[4];
248         /** Axis angle rotation - axis part. */
249         float rotAxis[3], drotAxis[3];
250         /** Axis angle rotation - angle part. */
251         float rotAngle, drotAngle;
252         /** Final worldspace matrix with constraints & animsys applied. */
253         float obmat[4][4];
254         /** Inverse result of parent, so that object doesn't 'stick' to parent. */
255         float parentinv[4][4];
256         /** Inverse result of constraints.
257          * doesn't include effect of parent or object local transform. */
258         float constinv[4][4];
259         /**
260          * Inverse matrix of 'obmat' for any other use than rendering!
261          *
262          * \note this isn't assured to be valid as with 'obmat',
263          * before using this value you should do...
264          * invert_m4_m4(ob->imat, ob->obmat);
265          */
266         float imat[4][4];
267
268         /* Previously 'imat' was used at render time, but as other places use it too
269          * the interactive ui of 2.5 creates problems. So now only 'imat_ren' should
270          * be used when ever the inverse of ob->obmat * re->viewmat is needed! - jahka
271          */
272         float imat_ren[4][4];
273
274         /** Copy of Base's layer in the scene. */
275         unsigned int lay DNA_DEPRECATED;
276
277         /** Copy of Base. */
278         short flag;
279         /** Deprecated, use 'matbits'. */
280         short colbits DNA_DEPRECATED;
281
282         /** Transformation settings and transform locks . */
283         short transflag, protectflag;
284         short trackflag, upflag;
285         /** Used for DopeSheet filtering settings (expanded/collapsed). */
286         short nlaflag;
287
288         char _pad1;
289         char duplicator_visibility_flag;
290
291         /* Depsgraph */
292         /** Used by depsgraph, flushed from base. */
293         short base_flag;
294         /** Used by viewport, synced from base. */
295         unsigned short base_local_view_bits;
296
297         /** Collision mask settings */
298         unsigned short col_group, col_mask;
299
300         /** Rotation mode - uses defines set out in DNA_action_types.h for PoseChannel rotations.... */
301         short rotmode;
302
303         /** Bounding box use for drawing. */
304         char boundtype;
305         /** Bounding box type used for collision. */
306         char collision_boundtype;
307
308         /** Viewport draw extra settings. */
309         short dtx;
310         /** Viewport draw type. */
311         char dt;
312         char empty_drawtype;
313         float empty_drawsize;
314         /** Dupliface scale. */
315         float instance_faces_scale;
316
317         /** Custom index, for renderpasses. */
318         short index;
319         /** Current deformation group, note: index starts at 1. */
320         unsigned short actdef;
321         /** Current face map, note: index starts at 1. */
322         unsigned short actfmap;
323         char _pad2[2];
324         /** Object color (in most cases the material color is used for drawing). */
325         float color[4];
326
327         /** Softbody settings. */
328         short softflag;
329
330         /** For restricting view, select, render etc. accessible in outliner. */
331         char restrictflag;
332
333         /** Flag for pinning. */
334         char  shapeflag;
335         /** Current shape key for menu or pinned. */
336         short shapenr;
337
338         char _pad3[2];
339
340         /** Smoothresh is phong interpolation ray_shadow correction in render. */
341         float smoothresh;
342
343         char _pad4[4];
344
345         /** Object constraints. */
346         ListBase constraints;
347         ListBase nlastrips  DNA_DEPRECATED;                     // XXX deprecated... old animation system
348         ListBase hooks  DNA_DEPRECATED;                         // XXX deprecated... old animation system
349         /** Particle systems. */
350         ListBase particlesystem;
351
352         /** Particle deflector/attractor/collision data. */
353         struct PartDeflect *pd;
354         /** If exists, saved in file. */
355         struct SoftBody *soft;
356         /** Object duplicator for group. */
357         struct Collection *instance_collection;
358
359         /** If fluidsim enabled, store additional settings. */
360         struct FluidsimSettings *fluidsimSettings;
361
362         struct DerivedMesh *derivedDeform, *derivedFinal;
363
364         ListBase pc_ids;
365
366         /** Settings for Bullet rigid body. */
367         struct RigidBodyOb *rigidbody_object;
368         /** Settings for Bullet constraint. */
369         struct RigidBodyCon *rigidbody_constraint;
370
371         /** Offset for image empties. */
372         float ima_ofs[2];
373         /** Must be non-null when object is an empty image. */
374         ImageUser *iuser;
375         char empty_image_visibility_flag;
376         char empty_image_depth;
377         char _pad8[2];
378
379         int select_id;
380
381         /** Contains data for levels of detail. */
382         ListBase lodlevels;
383         LodLevel *currentlod;
384
385         struct PreviewImage *preview;
386
387         /** Runtime evaluation data (keep last). */
388         Object_Runtime runtime;
389 } Object;
390
391 /* Warning, this is not used anymore because hooks are now modifiers */
392 typedef struct ObHook {
393         struct ObHook *next, *prev;
394
395         struct Object *parent;
396         /** Matrix making current transform unmodified. */
397         float parentinv[4][4];
398         /** Temp matrix while hooking. */
399         float mat[4][4];
400         /** Visualization of hook. */
401         float cent[3];
402         /** If not zero, falloff is distance where influence zero. */
403         float falloff;
404
405         /** MAX_NAME. */
406         char name[64];
407
408         int *indexar;
409         /** Curindex is cache for fast lookup. */
410         int totindex, curindex;
411         /** Active is only first hook, for button menu. */
412         short type, active;
413         float force;
414 } ObHook;
415
416 /* **************** OBJECT ********************* */
417
418 /* used many places... should be specialized  */
419 #define SELECT          1
420
421 /* type */
422 enum {
423         OB_EMPTY      = 0,
424         OB_MESH       = 1,
425         OB_CURVE      = 2,
426         OB_SURF       = 3,
427         OB_FONT       = 4,
428         OB_MBALL      = 5,
429
430         OB_LAMP       = 10,
431         OB_CAMERA     = 11,
432
433         OB_SPEAKER    = 12,
434         OB_LIGHTPROBE = 13,
435
436 /*      OB_WAVE       = 21, */
437         OB_LATTICE    = 22,
438
439 /* 23 and 24 are for life and sector (old file compat.) */
440         OB_ARMATURE   = 25,
441 /* Grease Pencil object used in 3D view but not used for annotation in 2D */
442         OB_GPENCIL  = 26,
443
444         OB_TYPE_MAX,
445 };
446
447 /* check if the object type supports materials */
448 #define OB_TYPE_SUPPORT_MATERIAL(_type) \
449         (((_type) >= OB_MESH && (_type) <= OB_MBALL) || ((_type) == OB_GPENCIL))
450 #define OB_TYPE_SUPPORT_VGROUP(_type) \
451         (ELEM(_type, OB_MESH, OB_LATTICE, OB_GPENCIL))
452 #define OB_TYPE_SUPPORT_EDITMODE(_type) \
453         (ELEM(_type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE))
454 #define OB_TYPE_SUPPORT_PARVERT(_type) \
455         (ELEM(_type, OB_MESH, OB_SURF, OB_CURVE, OB_LATTICE))
456
457 /** Matches #OB_TYPE_SUPPORT_EDITMODE. */
458 #define OB_DATA_SUPPORT_EDITMODE(_type) \
459         (ELEM(_type, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR))
460
461 /* is this ID type used as object data */
462 #define OB_DATA_SUPPORT_ID(_id_type) \
463         (ELEM(_id_type, ID_ME, ID_CU, ID_MB, ID_LA, ID_SPK, ID_LP, ID_CA, ID_LT, ID_GD, ID_AR))
464
465 #define OB_DATA_SUPPORT_ID_CASE \
466         ID_ME: case ID_CU: case ID_MB: case ID_LA: case ID_SPK: case ID_LP: case ID_CA: case ID_LT: case ID_GD: case ID_AR
467
468 /* partype: first 4 bits: type */
469 enum {
470         PARTYPE       = (1 << 4) - 1,
471         PAROBJECT     = 0,
472 #ifdef DNA_DEPRECATED
473         PARCURVE      = 1,  /* Deprecated. */
474 #endif
475         PARKEY        = 2,  /* XXX Unused, deprecated? */
476
477         PARSKEL       = 4,
478         PARVERT1      = 5,
479         PARVERT3      = 6,
480         PARBONE       = 7,
481
482         PAR_DEPRECATED = 16,
483 };
484
485 /* (short) transflag */
486 enum {
487         OB_TRANSFLAG_DEPRECATED_0 = 1 << 0,
488         OB_TRANSFLAG_DEPRECATED_1 = 1 << 1,
489         OB_NEG_SCALE        = 1 << 2,
490         OB_TRANSFLAG_DEPRECATED_3 = 1 << 3,
491         OB_DUPLIVERTS       = 1 << 4,
492         OB_DUPLIROT         = 1 << 5,
493         OB_TRANSFLAG_DEPRECATED_4 = 1 << 6,
494         /* runtime, calculate derivedmesh for dupli before it's used */
495         OB_DUPLICALCDERIVED = 1 << 7,
496         OB_DUPLICOLLECTION  = 1 << 8,
497         OB_DUPLIFACES       = 1 << 9,
498         OB_DUPLIFACES_SCALE = 1 << 10,
499         OB_DUPLIPARTS       = 1 << 11,
500         OB_TRANSLFAG_DEPRECATED_2 = 1 << 12,
501         /* runtime constraints disable */
502         OB_NO_CONSTRAINTS   = 1 << 13,
503         /* hack to work around particle issue */
504         OB_NO_PSYS_UPDATE   = 1 << 14,
505
506         OB_DUPLI = OB_DUPLIVERTS | OB_DUPLICOLLECTION | OB_DUPLIFACES | OB_DUPLIPARTS,
507 };
508
509 /* (short) trackflag / upflag */
510 enum {
511         OB_POSX = 0,
512         OB_POSY = 1,
513         OB_POSZ = 2,
514         OB_NEGX = 3,
515         OB_NEGY = 4,
516         OB_NEGZ = 5,
517 };
518
519 /* dt: no flags */
520 enum {
521         OB_BOUNDBOX  = 1,
522         OB_WIRE      = 2,
523         OB_SOLID     = 3,
524         OB_MATERIAL  = 4,
525         OB_TEXTURE   = 5,
526         OB_RENDER    = 6,
527 };
528
529 /* dtx: flags (short) */
530 enum {
531         OB_DRAWBOUNDOX    = 1 << 0,
532         OB_AXIS           = 1 << 1,
533         OB_TEXSPACE       = 1 << 2,
534         OB_DRAWNAME       = 1 << 3,
535         OB_DRAWIMAGE      = 1 << 4,
536         /* for solid+wire display */
537         OB_DRAWWIRE       = 1 << 5,
538         /* for overdraw s*/
539         OB_DRAWXRAY       = 1 << 6,
540         /* enable transparent draw */
541         OB_DRAWTRANSP     = 1 << 7,
542         OB_DRAW_ALL_EDGES = 1 << 8,  /* only for meshes currently */
543         OB_DRAW_NO_SHADOW_CAST = 1 << 9,
544 };
545
546 /* empty_drawtype: no flags */
547 enum {
548         OB_ARROWS        = 1,
549         OB_PLAINAXES     = 2,
550         OB_CIRCLE        = 3,
551         OB_SINGLE_ARROW  = 4,
552         OB_CUBE          = 5,
553         OB_EMPTY_SPHERE  = 6,
554         OB_EMPTY_CONE    = 7,
555         OB_EMPTY_IMAGE   = 8,
556 };
557
558 /* gpencil add types */
559 enum {
560         GP_EMPTY = 0,
561         GP_STROKE = 1,
562         GP_MONKEY = 2,
563 };
564
565 /* boundtype */
566 enum {
567         OB_BOUND_BOX           = 0,
568         OB_BOUND_SPHERE        = 1,
569         OB_BOUND_CYLINDER      = 2,
570         OB_BOUND_CONE          = 3,
571         OB_BOUND_TRIANGLE_MESH = 4,
572         OB_BOUND_CONVEX_HULL   = 5,
573 /*      OB_BOUND_DYN_MESH      = 6, */ /*UNUSED*/
574         OB_BOUND_CAPSULE       = 7,
575 };
576
577 /* lod flags */
578 enum {
579         OB_LOD_USE_MESH         = 1 << 0,
580         OB_LOD_USE_MAT          = 1 << 1,
581         OB_LOD_USE_HYST         = 1 << 2,
582 };
583
584
585 /* **************** BASE ********************* */
586
587 /* also needed for base!!!!! or rather, they interfere....*/
588 /* base->flag and ob->flag */
589 enum {
590         BA_WAS_SEL = (1 << 1),
591         /* NOTE: BA_HAS_RECALC_DATA can be re-used later if freed in readfile.c. */
592         // BA_HAS_RECALC_OB = (1 << 2),  /* DEPRECATED */
593         // BA_HAS_RECALC_DATA =  (1 << 3),  /* DEPRECATED */
594         /** DEPRECATED, was runtime only, but was reusing an older flag. */
595         BA_SNAP_FIX_DEPS_FIASCO = (1 << 2),
596 };
597
598         /* NOTE: this was used as a proper setting in past, so nullify before using */
599 #define BA_TEMP_TAG         (1 << 5)
600
601 /* #define BA_FROMSET          (1 << 7) */ /*UNUSED*/
602
603 #define BA_TRANSFORM_CHILD  (1 << 8)  /* child of a transformed object */
604 #define BA_TRANSFORM_PARENT (1 << 13)  /* parent of a transformed object */
605
606 #define OB_FROMDUPLI        (1 << 9)
607 #define OB_DONE             (1 << 10)  /* unknown state, clear before use */
608 #ifdef DNA_DEPRECATED_ALLOW
609 #  define OB_FLAG_DEPRECATED_11        (1 << 11)  /* cleared */
610 #  define OB_FLAG_DEPRECATED_12        (1 << 12)  /* cleared */
611 #endif
612
613 /* ob->restrictflag */
614 enum {
615         OB_RESTRICT_VIEW    = 1 << 0,
616         OB_RESTRICT_SELECT  = 1 << 1,
617         OB_RESTRICT_RENDER  = 1 << 2,
618 };
619
620 /* ob->shapeflag */
621 enum {
622         OB_SHAPE_LOCK       = 1 << 0,
623 #ifdef DNA_DEPRECATED_ALLOW
624         OB_SHAPE_FLAG_DEPRECATED_1   = 1 << 1,  /* cleared */
625 #endif
626         OB_SHAPE_EDIT_MODE  = 1 << 2,
627 };
628
629 /* ob->nlaflag */
630 enum {
631         /* WARNING: flags (1 << 0) and (1 << 1) were from old animsys */
632         /* object-channel expanded status */
633         OB_ADS_COLLAPSED    = 1 << 10,
634         /* object's ipo-block */
635         OB_ADS_SHOWIPO      = 1 << 11,
636         /* object's constraint channels */
637         OB_ADS_SHOWCONS     = 1 << 12,
638         /* object's material channels */
639         OB_ADS_SHOWMATS     = 1 << 13,
640         /* object's marticle channels */
641         OB_ADS_SHOWPARTS    = 1 << 14,
642 };
643
644 /* ob->protectflag */
645 enum {
646         OB_LOCK_LOCX    = 1 << 0,
647         OB_LOCK_LOCY    = 1 << 1,
648         OB_LOCK_LOCZ    = 1 << 2,
649         OB_LOCK_LOC     = OB_LOCK_LOCX | OB_LOCK_LOCY | OB_LOCK_LOCZ,
650         OB_LOCK_ROTX    = 1 << 3,
651         OB_LOCK_ROTY    = 1 << 4,
652         OB_LOCK_ROTZ    = 1 << 5,
653         OB_LOCK_ROT     = OB_LOCK_ROTX | OB_LOCK_ROTY | OB_LOCK_ROTZ,
654         OB_LOCK_SCALEX  = 1 << 6,
655         OB_LOCK_SCALEY  = 1 << 7,
656         OB_LOCK_SCALEZ  = 1 << 8,
657         OB_LOCK_SCALE   = OB_LOCK_SCALEX | OB_LOCK_SCALEY | OB_LOCK_SCALEZ,
658         OB_LOCK_ROTW    = 1 << 9,
659         OB_LOCK_ROT4D   = 1 << 10,
660 };
661
662 /* ob->duplicator_visibility_flag */
663 enum {
664         OB_DUPLI_FLAG_VIEWPORT = 1 << 0,
665         OB_DUPLI_FLAG_RENDER   = 1 << 1,
666 };
667
668 /* ob->empty_image_depth */
669 #define OB_EMPTY_IMAGE_DEPTH_DEFAULT 0
670 #define OB_EMPTY_IMAGE_DEPTH_FRONT 1
671 #define OB_EMPTY_IMAGE_DEPTH_BACK 2
672
673 /** #Object.empty_image_visibility_flag */
674 enum {
675         OB_EMPTY_IMAGE_HIDE_PERSPECTIVE  = 1 << 0,
676         OB_EMPTY_IMAGE_HIDE_ORTHOGRAPHIC = 1 << 1,
677         OB_EMPTY_IMAGE_HIDE_BACK         = 1 << 2,
678         OB_EMPTY_IMAGE_HIDE_FRONT        = 1 << 3,
679 };
680
681 #define MAX_DUPLI_RECUR 8
682
683 #ifdef __cplusplus
684 }
685 #endif
686
687 #endif