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