DepsGraph: Multi ViewLayer Selection
[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 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[4];
142
143   /** Axis aligned boundbox (in localspace). */
144   struct BoundBox *bb;
145
146   /**
147    * Original mesh pointer, before object->data was changed to point
148    * to mesh_eval.
149    * Is assigned by dependency graph's copy-on-write evaluation.
150    */
151   struct Mesh *mesh_orig;
152   /**
153    * Mesh structure created during object evaluation.
154    * It has all modifiers applied.
155    */
156   struct Mesh *mesh_eval;
157   /**
158    * Mesh structure created during object evaluation.
159    * It has deforemation only modifiers applied on it.
160    */
161   struct Mesh *mesh_deform_eval;
162
163   /** Runtime evaluated curve-specific data, not stored in the file. */
164   struct CurveCache *curve_cache;
165
166   /** Runtime grease pencil drawing data */
167   struct GpencilBatchCache *gpencil_cache;
168 } Object_Runtime;
169
170 typedef struct Object {
171   ID id;
172   /** Animation data (must be immediately after id for utilities to use it). */
173   struct AnimData *adt;
174   /** Runtime (must be immediately after id for utilities to use it). */
175   struct DrawDataList drawdata;
176
177   struct SculptSession *sculpt;
178
179   short type, partype;
180   /** Can be vertexnrs. */
181   int par1, par2, par3;
182   /** String describing subobject info, MAX_ID_NAME-2. */
183   char parsubstr[64];
184   struct Object *parent, *track;
185   /* if ob->proxy (or proxy_group), this object is proxy for object ob->proxy */
186   /* proxy_from is set in target back to the proxy. */
187   struct Object *proxy, *proxy_group, *proxy_from;
188   /** Old animation system, deprecated for 2.5. */
189   struct Ipo *ipo DNA_DEPRECATED;
190   /* struct Path *path; */
191   struct bAction *action DNA_DEPRECATED;  // XXX deprecated... old animation system
192   struct bAction *poselib;
193   /** Pose data, armature objects only. */
194   struct bPose *pose;
195   /** Pointer to objects data - an 'ID' or NULL. */
196   void *data;
197
198   /** Grease Pencil data. */
199   struct bGPdata *gpd
200       DNA_DEPRECATED;  // XXX deprecated... replaced by gpencil object, keep for readfile
201
202   /** Settings for visualization of object-transform animation. */
203   bAnimVizSettings avs;
204   /** Motion path cache for this object. */
205   bMotionPath *mpath;
206   void *_pad0;
207
208   ListBase constraintChannels DNA_DEPRECATED;  // XXX deprecated... old animation system
209   ListBase effect DNA_DEPRECATED;              // XXX deprecated... keep for readfile
210   /** List of bDeformGroup (vertex groups) names and flag only. */
211   ListBase defbase;
212   /** List of ModifierData structures. */
213   ListBase modifiers;
214   /** List of GpencilModifierData structures. */
215   ListBase greasepencil_modifiers;
216   /** List of facemaps. */
217   ListBase fmaps;
218   /** List of viewport effects. Actually only used by grease pencil. */
219   ListBase shader_fx;
220
221   /** Local object mode. */
222   int mode;
223   int restore_mode;
224
225   /* materials */
226   /** Material slots. */
227   struct Material **mat;
228   /** A boolean field, with each byte 1 if corresponding material is linked to object. */
229   char *matbits;
230   /** Copy of mesh, curve & meta struct member of same name (keep in sync). */
231   int totcol;
232   /** Currently selected material in the UI. */
233   int actcol;
234
235   /* rot en drot have to be together! (transform('r' en 's')) */
236   float loc[3], dloc[3];
237   /** Scale (can be negative). */
238   float scale[3];
239   /** DEPRECATED, 2.60 and older only. */
240   float dsize[3] DNA_DEPRECATED;
241   /** Ack!, changing. */
242   float dscale[3];
243   /** Euler rotation. */
244   float rot[3], drot[3];
245   /** Quaternion rotation. */
246   float quat[4], dquat[4];
247   /** Axis angle rotation - axis part. */
248   float rotAxis[3], drotAxis[3];
249   /** Axis angle rotation - angle part. */
250   float rotAngle, drotAngle;
251   /** Final worldspace matrix with constraints & animsys applied. */
252   float obmat[4][4];
253   /** Inverse result of parent, so that object doesn't 'stick' to parent. */
254   float parentinv[4][4];
255   /** Inverse result of constraints.
256    * doesn't include effect of parent or object local transform. */
257   float constinv[4][4];
258   /**
259    * Inverse matrix of 'obmat' for any other use than rendering!
260    *
261    * \note this isn't assured to be valid as with 'obmat',
262    * before using this value you should do...
263    * invert_m4_m4(ob->imat, ob->obmat);
264    */
265   float imat[4][4];
266
267   /* Previously 'imat' was used at render time, but as other places use it too
268    * the interactive ui of 2.5 creates problems. So now only 'imat_ren' should
269    * be used when ever the inverse of ob->obmat * re->viewmat is needed! - jahka
270    */
271   float imat_ren[4][4];
272
273   /** Copy of Base's layer in the scene. */
274   unsigned int lay DNA_DEPRECATED;
275
276   /** Copy of Base. */
277   short flag;
278   /** Deprecated, use 'matbits'. */
279   short colbits DNA_DEPRECATED;
280
281   /** Transformation settings and transform locks . */
282   short transflag, protectflag;
283   short trackflag, upflag;
284   /** Used for DopeSheet filtering settings (expanded/collapsed). */
285   short nlaflag;
286
287   char _pad1;
288   char duplicator_visibility_flag;
289
290   /* Depsgraph */
291   /** Used by depsgraph, flushed from base. */
292   short base_flag;
293   /** Used by viewport, synced from base. */
294   unsigned short base_local_view_bits;
295
296   /** Collision mask settings */
297   unsigned short col_group, col_mask;
298
299   /** Rotation mode - uses defines set out in DNA_action_types.h for PoseChannel rotations.... */
300   short rotmode;
301
302   /** Bounding box use for drawing. */
303   char boundtype;
304   /** Bounding box type used for collision. */
305   char collision_boundtype;
306
307   /** Viewport draw extra settings. */
308   short dtx;
309   /** Viewport draw type. */
310   char dt;
311   char empty_drawtype;
312   float empty_drawsize;
313   /** Dupliface scale. */
314   float instance_faces_scale;
315
316   /** Custom index, for renderpasses. */
317   short index;
318   /** Current deformation group, note: index starts at 1. */
319   unsigned short actdef;
320   /** Current face map, note: index starts at 1. */
321   unsigned short actfmap;
322   char _pad2[2];
323   /** Object color (in most cases the material color is used for drawing). */
324   float color[4];
325
326   /** Softbody settings. */
327   short softflag;
328
329   /** For restricting view, select, render etc. accessible in outliner. */
330   char restrictflag;
331
332   /** Flag for pinning. */
333   char shapeflag;
334   /** Current shape key for menu or pinned. */
335   short shapenr;
336
337   char _pad3[2];
338
339   /** Object constraints. */
340   ListBase constraints;
341   ListBase nlastrips DNA_DEPRECATED;  // XXX deprecated... old animation system
342   ListBase hooks DNA_DEPRECATED;      // XXX deprecated... old animation system
343   /** Particle systems. */
344   ListBase particlesystem;
345
346   /** Particle deflector/attractor/collision data. */
347   struct PartDeflect *pd;
348   /** If exists, saved in file. */
349   struct SoftBody *soft;
350   /** Object duplicator for group. */
351   struct Collection *instance_collection;
352
353   /** If fluidsim enabled, store additional settings. */
354   struct FluidsimSettings *fluidsimSettings;
355
356   struct DerivedMesh *derivedDeform, *derivedFinal;
357
358   ListBase pc_ids;
359
360   /** Settings for Bullet rigid body. */
361   struct RigidBodyOb *rigidbody_object;
362   /** Settings for Bullet constraint. */
363   struct RigidBodyCon *rigidbody_constraint;
364
365   /** Offset for image empties. */
366   float ima_ofs[2];
367   /** Must be non-null when object is an empty image. */
368   ImageUser *iuser;
369   char empty_image_visibility_flag;
370   char empty_image_depth;
371   char empty_image_flag;
372   char _pad8[5];
373
374   /** Contains data for levels of detail. */
375   ListBase lodlevels;
376   LodLevel *currentlod;
377
378   struct PreviewImage *preview;
379
380   /** Runtime evaluation data (keep last). */
381   Object_Runtime runtime;
382 } Object;
383
384 /* Warning, this is not used anymore because hooks are now modifiers */
385 typedef struct ObHook {
386   struct ObHook *next, *prev;
387
388   struct Object *parent;
389   /** Matrix making current transform unmodified. */
390   float parentinv[4][4];
391   /** Temp matrix while hooking. */
392   float mat[4][4];
393   /** Visualization of hook. */
394   float cent[3];
395   /** If not zero, falloff is distance where influence zero. */
396   float falloff;
397
398   /** MAX_NAME. */
399   char name[64];
400
401   int *indexar;
402   /** Curindex is cache for fast lookup. */
403   int totindex, curindex;
404   /** Active is only first hook, for button menu. */
405   short type, active;
406   float force;
407 } ObHook;
408
409 /* **************** OBJECT ********************* */
410
411 /* used many places... should be specialized  */
412 #define SELECT 1
413
414 /* type */
415 enum {
416   OB_EMPTY = 0,
417   OB_MESH = 1,
418   OB_CURVE = 2,
419   OB_SURF = 3,
420   OB_FONT = 4,
421   OB_MBALL = 5,
422
423   OB_LAMP = 10,
424   OB_CAMERA = 11,
425
426   OB_SPEAKER = 12,
427   OB_LIGHTPROBE = 13,
428
429   OB_LATTICE = 22,
430
431   OB_ARMATURE = 25,
432
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) (ELEM(_type, OB_MESH, OB_LATTICE, OB_GPENCIL))
443 #define OB_TYPE_SUPPORT_EDITMODE(_type) \
444   (ELEM(_type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE))
445 #define OB_TYPE_SUPPORT_PARVERT(_type) (ELEM(_type, OB_MESH, OB_SURF, OB_CURVE, OB_LATTICE))
446
447 /** Matches #OB_TYPE_SUPPORT_EDITMODE. */
448 #define OB_DATA_SUPPORT_EDITMODE(_type) (ELEM(_type, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR))
449
450 /* is this ID type used as object data */
451 #define OB_DATA_SUPPORT_ID(_id_type) \
452   (ELEM(_id_type, ID_ME, ID_CU, ID_MB, ID_LA, ID_SPK, ID_LP, ID_CA, ID_LT, ID_GD, ID_AR))
453
454 #define OB_DATA_SUPPORT_ID_CASE \
455 ID_ME: \
456 case ID_CU: \
457 case ID_MB: \
458 case ID_LA: \
459 case ID_SPK: \
460 case ID_LP: \
461 case ID_CA: \
462 case ID_LT: \
463 case ID_GD: \
464 case ID_AR
465
466 /* partype: first 4 bits: type */
467 enum {
468   PARTYPE = (1 << 4) - 1,
469   PAROBJECT = 0,
470   PARSKEL = 4,
471   PARVERT1 = 5,
472   PARVERT3 = 6,
473   PARBONE = 7,
474
475 };
476
477 /* (short) transflag */
478 enum {
479   OB_TRANSFLAG_UNUSED_0 = 1 << 0, /* cleared */
480   OB_TRANSFLAG_UNUSED_1 = 1 << 1, /* cleared */
481   OB_NEG_SCALE = 1 << 2,
482   OB_TRANSFLAG_UNUSED_3 = 1 << 3, /* cleared */
483   OB_DUPLIVERTS = 1 << 4,
484   OB_DUPLIROT = 1 << 5,
485   OB_TRANSFLAG_UNUSED_6 = 1 << 6, /* cleared */
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_TRANSFLAG_UNUSED_12 = 1 << 12, /* cleared */
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 /* **************** BASE ********************* */
577
578 /* base->flag_legacy */
579 enum {
580   BA_WAS_SEL = (1 << 1),
581   /* NOTE: BA_HAS_RECALC_DATA can be re-used later if freed in readfile.c. */
582   // BA_HAS_RECALC_OB = (1 << 2),  /* DEPRECATED */
583   // BA_HAS_RECALC_DATA =  (1 << 3),  /* DEPRECATED */
584   /** DEPRECATED, was runtime only, but was reusing an older flag. */
585   BA_SNAP_FIX_DEPS_FIASCO = (1 << 2),
586 };
587
588 /* NOTE: this was used as a proper setting in past, so nullify before using */
589 #define BA_TEMP_TAG (1 << 5)
590
591 /* #define BA_FROMSET          (1 << 7) */ /*UNUSED*/
592
593 #define BA_TRANSFORM_CHILD (1 << 8)   /* child of a transformed object */
594 #define BA_TRANSFORM_PARENT (1 << 13) /* parent of a transformed object */
595
596 #define OB_FROMDUPLI (1 << 9)
597 #define OB_DONE (1 << 10) /* unknown state, clear before use */
598 #ifdef DNA_DEPRECATED_ALLOW
599 #  define OB_FLAG_UNUSED_11 (1 << 11) /* cleared */
600 #  define OB_FLAG_UNUSED_12 (1 << 12) /* cleared */
601 #endif
602
603 /* ob->restrictflag */
604 enum {
605   OB_RESTRICT_VIEW = 1 << 0,
606   OB_RESTRICT_SELECT = 1 << 1,
607   OB_RESTRICT_RENDER = 1 << 2,
608 };
609
610 /* ob->shapeflag */
611 enum {
612   OB_SHAPE_LOCK = 1 << 0,
613 #ifdef DNA_DEPRECATED_ALLOW
614   OB_SHAPE_FLAG_UNUSED_1 = 1 << 1, /* cleared */
615 #endif
616   OB_SHAPE_EDIT_MODE = 1 << 2,
617 };
618
619 /* ob->nlaflag */
620 enum {
621   OB_ADS_UNUSED_1 = 1 << 0, /* cleared */
622   OB_ADS_UNUSED_2 = 1 << 1, /* cleared */
623   /* object-channel expanded status */
624   OB_ADS_COLLAPSED = 1 << 10,
625   /* object's ipo-block */
626   OB_ADS_SHOWIPO = 1 << 11,
627   /* object's constraint channels */
628   OB_ADS_SHOWCONS = 1 << 12,
629   /* object's material channels */
630   OB_ADS_SHOWMATS = 1 << 13,
631   /* object's marticle channels */
632   OB_ADS_SHOWPARTS = 1 << 14,
633 };
634
635 /* ob->protectflag */
636 enum {
637   OB_LOCK_LOCX = 1 << 0,
638   OB_LOCK_LOCY = 1 << 1,
639   OB_LOCK_LOCZ = 1 << 2,
640   OB_LOCK_LOC = OB_LOCK_LOCX | OB_LOCK_LOCY | OB_LOCK_LOCZ,
641   OB_LOCK_ROTX = 1 << 3,
642   OB_LOCK_ROTY = 1 << 4,
643   OB_LOCK_ROTZ = 1 << 5,
644   OB_LOCK_ROT = OB_LOCK_ROTX | OB_LOCK_ROTY | OB_LOCK_ROTZ,
645   OB_LOCK_SCALEX = 1 << 6,
646   OB_LOCK_SCALEY = 1 << 7,
647   OB_LOCK_SCALEZ = 1 << 8,
648   OB_LOCK_SCALE = OB_LOCK_SCALEX | OB_LOCK_SCALEY | OB_LOCK_SCALEZ,
649   OB_LOCK_ROTW = 1 << 9,
650   OB_LOCK_ROT4D = 1 << 10,
651 };
652
653 /* ob->duplicator_visibility_flag */
654 enum {
655   OB_DUPLI_FLAG_VIEWPORT = 1 << 0,
656   OB_DUPLI_FLAG_RENDER = 1 << 1,
657 };
658
659 /* ob->empty_image_depth */
660 #define OB_EMPTY_IMAGE_DEPTH_DEFAULT 0
661 #define OB_EMPTY_IMAGE_DEPTH_FRONT 1
662 #define OB_EMPTY_IMAGE_DEPTH_BACK 2
663
664 /** #Object.empty_image_visibility_flag */
665 enum {
666   OB_EMPTY_IMAGE_HIDE_PERSPECTIVE = 1 << 0,
667   OB_EMPTY_IMAGE_HIDE_ORTHOGRAPHIC = 1 << 1,
668   OB_EMPTY_IMAGE_HIDE_BACK = 1 << 2,
669   OB_EMPTY_IMAGE_HIDE_FRONT = 1 << 3,
670 };
671
672 /** #Object.empty_image_flag */
673 enum {
674   OB_EMPTY_IMAGE_USE_ALPHA_BLEND = 1 << 0,
675 };
676
677 #define MAX_DUPLI_RECUR 8
678
679 #ifdef __cplusplus
680 }
681 #endif
682
683 #endif