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