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