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