Welcome to mirror list, hosted at ThFree Co, Russian Federation.

DNA_constraint_types.h « makesdna « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 04887f1223c19c491e3fb0a3282cc49ab3742395 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
/* SPDX-License-Identifier: GPL-2.0-or-later
 * Copyright 2001-2002 NaN Holding BV. All rights reserved. */

/** \file
 * \ingroup DNA
 * Constraint DNA data.
 */

#pragma once

#include "DNA_ID.h"
#include "DNA_defs.h"
#include "DNA_listBase.h"

#ifdef __cplusplus
extern "C" {
#endif

struct Action;
struct Ipo;
struct Text;

/* channels reside in Object or Action (ListBase) constraintChannels */
/* XXX: deprecated... old AnimSys. */
typedef struct bConstraintChannel {
  struct bConstraintChannel *next, *prev;
  struct Ipo *ipo;
  short flag;
  char name[30];
} bConstraintChannel;

/* A Constraint */
typedef struct bConstraint {
  struct bConstraint *next, *prev;

  /** Constraint data (a valid constraint type). */
  void *data;
  /** Constraint type. */
  short type;
  /** Flag - General Settings. */
  short flag;

  /** Space that owner should be evaluated in. */
  char ownspace;
  /** Space that target should be evaluated in (only used if 1 target). */
  char tarspace;

  /* An "expand" bit for each of the constraint's (sub)panels (uiPanelDataExpansion). */
  short ui_expand_flag;

  /** Object to use as target for Custom Space of owner. */
  struct Object *space_object;
  /** Subtarget for Custom Space of owner - pchan or vgroup name, MAX_ID_NAME-2. */
  char space_subtarget[64];

  /** Constraint name, MAX_NAME. */
  char name[64];

  /** Amount of influence exerted by constraint (0.0-1.0). */
  float enforce;
  /** Point along `subtarget` bone where the actual target is. 0=head (default for all), 1=tail. */
  float headtail;

  /* old animation system, deprecated for 2.5. */
  /** Local influence ipo or driver */
  struct Ipo *ipo DNA_DEPRECATED;

  /* Below are read-only fields that are set at runtime
   * by the solver for use in the GE (only IK at the moment). */
  /** Residual error on constraint expressed in blender unit. */
  float lin_error;
  /** Residual error on constraint expressed in radiant. */
  float rot_error;
} bConstraint;

/* Multiple-target constraints --------------------- */

/* This struct defines a constraint target.
 * It is used during constraint solving regardless of how many targets the
 * constraint has.
 */
typedef struct bConstraintTarget {
  struct bConstraintTarget *next, *prev;

  /** Object to use as target. */
  struct Object *tar;
  /** Subtarget - pchan or vgroup name, MAX_ID_NAME-2. */
  char subtarget[64];

  /** Matrix used during constraint solving - should be cleared before each use. */
  float matrix[4][4];

  /** Space that target should be evaluated in (overrides bConstraint->tarspace). */
  short space;
  /** Runtime settings (for editor, etc.). */
  short flag;
  /** Type of target (eConstraintObType). */
  short type;
  /** Rotation order for target (as defined in BLI_math.h). */
  short rotOrder;
  /** Weight for armature deform. */
  float weight;
  char _pad[4];
} bConstraintTarget;

/* bConstraintTarget -> flag */
typedef enum eConstraintTargetFlag {
  /** Temporary target-struct that needs to be freed after use. */
  CONSTRAINT_TAR_TEMP = (1 << 0),
  /** Temporary target for the custom space reference. */
  CONSTRAINT_TAR_CUSTOM_SPACE = (1 << 1),
} eConstraintTargetFlag;

/* bConstraintTarget/bConstraintOb -> type */
typedef enum eConstraintObType {
  /** string is "" */
  CONSTRAINT_OBTYPE_OBJECT = 1,
  /** string is bone-name */
  CONSTRAINT_OBTYPE_BONE = 2,
  /** string is vertex-group name */
  CONSTRAINT_OBTYPE_VERT = 3,
  /** string is vertex-group name - is not available until curves get vgroups */
  /* CONSTRAINT_OBTYPE_CV = 4, */ /* UNUSED */
} eConstraintObType;

/* Python Script Constraint */
typedef struct bPythonConstraint {
  /** Text-buffer (containing script) to execute. */
  struct Text *text;
  /** 'id-properties' used to store custom properties for constraint. */
  IDProperty *prop;

  /** General settings/state indicators accessed by bitmapping. */
  int flag;
  /** Number of targets - usually only 1-3 are needed. */
  int tarnum;

  /** A list of targets that this constraint has (bConstraintTarget-s). */
  ListBase targets;

  /**
   * Target from previous implementation
   * (version-patch sets this to NULL on file-load).
   */
  struct Object *tar;
  /**
   * Subtarget from previous implementation
   * (version-patch sets this to "" on file-load), MAX_ID_NAME-2.
   */
  char subtarget[64];
} bPythonConstraint;

/* Inverse-Kinematics (IK) constraint
 * This constraint supports a variety of mode determine by the type field
 * according to eConstraint_IK_Type.
 * Some fields are used by all types, some are specific to some types
 * This is indicated in the comments for each field
 */
typedef struct bKinematicConstraint {
  /** All: target object in case constraint needs a target. */
  struct Object *tar;
  /** All: Maximum number of iterations to try. */
  short iterations;
  /** All & CopyPose: some options Like CONSTRAINT_IK_TIP. */
  short flag;
  /** All: index to rootbone, if zero go all the way to mother bone. */
  short rootbone;
  /** CopyPose: for auto-ik, maximum length of chain. */
  short max_rootbone;
  /** All: String to specify sub-object target, MAX_ID_NAME-2. */
  char subtarget[64];
  /** All: Pole vector target. */
  struct Object *poletar;
  /** All: Pole vector sub-object target, MAX_ID_NAME-2. */
  char polesubtarget[64];
  /** All: Pole vector rest angle. */
  float poleangle;
  /** All: Weight of constraint in IK tree. */
  float weight;
  /** CopyPose: Amount of rotation a target applies on chain. */
  float orientweight;
  /** CopyPose: for target-less IK. */
  float grabtarget[3];
  /** Sub-type of IK constraint: #eConstraint_IK_Type. */
  short type;
  /** Distance: how to limit in relation to clamping sphere: LIMITDIST_... */
  short mode;
  /** Distance: distance (radius of clamping sphere) from target. */
  float dist;
} bKinematicConstraint;

typedef enum eConstraint_IK_Type {
  /** 'standard' IK constraint: match position and/or orientation of target */
  CONSTRAINT_IK_COPYPOSE = 0,
  /** maintain distance with target */
  CONSTRAINT_IK_DISTANCE = 1,
} eConstraint_IK_Type;

/* Spline IK Constraint
 * Aligns 'n' bones to the curvature defined by the curve,
 * with the chain ending on the bone that owns this constraint,
 * and starting on the nth parent.
 */
typedef struct bSplineIKConstraint {
  /* target(s) */
  /** Curve object (with follow path enabled) which drives the bone chain. */
  struct Object *tar;

  /* binding details */
  /**
   * Array of numpoints items,
   * denoting parametric positions along curve that joints should follow.
   */
  float *points;
  /** Number of points to bound in points array. */
  short numpoints;
  /** Number of bones ('n') that are in the chain. */
  short chainlen;

  /* settings */
  /** General settings for constraint. */
  short flag;
  /** Method used for determining the x & z scaling of the bones. */
  short xzScaleMode;
  /** Method used for determining the y scaling of the bones. */
  short yScaleMode;
  short _pad[3];

  /* volume preservation settings */
  float bulge;
  float bulge_min;
  float bulge_max;
  float bulge_smooth;
} bSplineIKConstraint;

/* Armature Constraint */
typedef struct bArmatureConstraint {
  /** General settings/state indicators accessed by bitmapping. */
  int flag;
  char _pad[4];

  /** A list of targets that this constraint has (bConstraintTarget-s). */
  ListBase targets;
} bArmatureConstraint;

/* Single-target subobject constraints --------------------- */

/* Track To Constraint */
typedef struct bTrackToConstraint {
  struct Object *tar;
  /**
   * NOTE(@theeth): I'll be using reserved1 and reserved2 as Track and Up flags,
   * not sure if that's what they were intended for anyway.
   * Not sure either if it would create backward incompatibility if I were to rename them.
   */
  int reserved1;
  int reserved2;
  int flags;
  char _pad[4];
  /** MAX_ID_NAME-2. */
  char subtarget[64];
} bTrackToConstraint;

/* Copy Rotation Constraint */
typedef struct bRotateLikeConstraint {
  struct Object *tar;
  int flag;
  char euler_order;
  char mix_mode;
  char _pad[2];
  /** MAX_ID_NAME-2. */
  char subtarget[64];
} bRotateLikeConstraint;

/* Copy Location Constraint */
typedef struct bLocateLikeConstraint {
  struct Object *tar;
  int flag;
  int reserved1;
  /** MAX_ID_NAME-2. */
  char subtarget[64];
} bLocateLikeConstraint;

/* Copy Scale Constraint */
typedef struct bSizeLikeConstraint {
  struct Object *tar;
  int flag;
  float power;
  /** MAX_ID_NAME-2. */
  char subtarget[64];
} bSizeLikeConstraint;

/* Maintain Volume Constraint */
typedef struct bSameVolumeConstraint {
  char free_axis;
  char mode;
  char _pad[2];
  float volume;
} bSameVolumeConstraint;

/* Copy Transform Constraint */
typedef struct bTransLikeConstraint {
  struct Object *tar;
  int flag;
  char mix_mode;
  char _pad[3];
  /** MAX_ID_NAME-2. */
  char subtarget[64];
} bTransLikeConstraint;

/* Floor Constraint */
typedef struct bMinMaxConstraint {
  struct Object *tar;
  int minmaxflag;
  float offset;
  int flag;
  /** MAX_ID_NAME-2. */
  char subtarget[64];
  int _pad;
} bMinMaxConstraint;

/* Action Constraint */
typedef struct bActionConstraint {
  struct Object *tar;
  /** What transform 'channel' drives the result. */
  short type;
  /** Was used in versions prior to the Constraints recode. */
  short local;
  int start;
  int end;
  float min;
  float max;
  int flag;
  char mix_mode;
  char _pad[3];
  float eval_time; /* Only used when flag ACTCON_USE_EVAL_TIME is set. */
  struct bAction *act;
  /** MAX_ID_NAME-2. */
  char subtarget[64];
} bActionConstraint;

/* Locked Axis Tracking constraint */
typedef struct bLockTrackConstraint {
  struct Object *tar;
  int trackflag;
  int lockflag;
  /** MAX_ID_NAME-2. */
  char subtarget[64];
} bLockTrackConstraint;

/* Damped Tracking constraint */
typedef struct bDampTrackConstraint {
  struct Object *tar;
  int trackflag;
  char _pad[4];
  /** MAX_ID_NAME-2. */
  char subtarget[64];
} bDampTrackConstraint;

/* Follow Path constraints */
typedef struct bFollowPathConstraint {
  /** Must be path object. */
  struct Object *tar;

  /** Offset in time on the path (in frames), when NOT using 'fixed position'. */
  float offset;
  /** Parametric offset factor defining position along path, when using 'fixed position'. */
  float offset_fac;

  int followflag;

  short trackflag;
  short upflag;
} bFollowPathConstraint;

/* Stretch to constraint */
typedef struct bStretchToConstraint {
  struct Object *tar;
  int flag;
  int volmode;
  int plane;
  float orglength;
  float bulge;
  float bulge_min;
  float bulge_max;
  float bulge_smooth;
  /** MAX_ID_NAME-2. */
  char subtarget[64];
} bStretchToConstraint;

/* Rigid Body constraint */
typedef struct bRigidBodyJointConstraint {
  struct Object *tar;
  struct Object *child;
  int type;
  float pivX;
  float pivY;
  float pivZ;
  float axX;
  float axY;
  float axZ;
  float minLimit[6];
  float maxLimit[6];
  float extraFz;
  short flag;
  char _pad[6];
} bRigidBodyJointConstraint;

/* Clamp-To Constraint */
typedef struct bClampToConstraint {
  /** 'target' must be a curve. */
  struct Object *tar;
  /** Which axis/plane to compare owner's location on. */
  int flag;
  /** For legacy reasons, this is flag2. used for any extra settings. */
  int flag2;
} bClampToConstraint;

/* Child Of Constraint */
typedef struct bChildOfConstraint {
  /** Object which will act as parent (or target comes from). */
  struct Object *tar;
  /** Settings. */
  int flag;
  char _pad[4];
  /** Parent-inverse matrix to use. */
  float invmat[4][4];
  /** String to specify a subobject target, MAX_ID_NAME-2. */
  char subtarget[64];
} bChildOfConstraint;

/* Generic Transform->Transform Constraint */
typedef struct bTransformConstraint {
  /** Target (i.e. 'driver' object/bone). */
  struct Object *tar;
  /** MAX_ID_NAME-2. */
  char subtarget[64];

  /** Can be loc(0), rot(1) or size(2). */
  short from, to;
  /** Defines which target-axis deform is copied by each owner-axis. */
  char map[3];
  /** Extrapolate motion? if 0, confine to ranges. */
  char expo;

  /** Input rotation type - uses the same values as driver targets. */
  char from_rotation_mode;
  /** Output euler order override. */
  char to_euler_order;

  /** Mixing modes for location, rotation, and scale. */
  char mix_mode_loc;
  char mix_mode_rot;
  char mix_mode_scale;

  char _pad[3];

  /** From_min/max defines range of target transform. */
  float from_min[3];
  /** To map on to to_min/max range. */
  float from_max[3];
  /** Range of motion on owner caused by target. */
  float to_min[3];
  float to_max[3];

  /** From_min/max defines range of target transform. */
  float from_min_rot[3];
  /** To map on to to_min/max range. */
  float from_max_rot[3];
  /** Range of motion on owner caused by target. */
  float to_min_rot[3];
  float to_max_rot[3];

  /** From_min/max defines range of target transform. */
  float from_min_scale[3];
  /** To map on to to_min/max range. */
  float from_max_scale[3];
  /** Range of motion on owner caused by target. */
  float to_min_scale[3];
  float to_max_scale[3];
} bTransformConstraint;

/* Pivot Constraint */
typedef struct bPivotConstraint {
  /* Pivot Point:
   * Either target object + offset, or just offset is used
   */
  /** Target object (optional). */
  struct Object *tar;
  /** Subtarget name (optional), MAX_ID_NAME-2. */
  char subtarget[64];
  /** Offset from the target to use, regardless of whether it exists. */
  float offset[3];

  /* Rotation-driven activation:
   * This option provides easier one-stop setups for foot-rolls.
   */
  /** Rotation axes to consider for this (#ePivotConstraint_Axis). */
  short rotAxis;

  /* General flags */
  /** #ePivotConstraint_Flag. */
  short flag;
} bPivotConstraint;

/* transform limiting constraints - zero target ---------------------------- */
/* Limit Location Constraint */
typedef struct bLocLimitConstraint {
  float xmin, xmax;
  float ymin, ymax;
  float zmin, zmax;
  short flag;
  short flag2;
} bLocLimitConstraint;

/* Limit Rotation Constraint */
typedef struct bRotLimitConstraint {
  float xmin, xmax;
  float ymin, ymax;
  float zmin, zmax;
  short flag;
  short flag2;
  char euler_order;
  char _pad[3];
} bRotLimitConstraint;

/* Limit Scale Constraint */
typedef struct bSizeLimitConstraint {
  float xmin, xmax;
  float ymin, ymax;
  float zmin, zmax;
  short flag;
  short flag2;
} bSizeLimitConstraint;

/* Limit Distance Constraint */
typedef struct bDistLimitConstraint {
  struct Object *tar;
  /** MAX_ID_NAME-2. */
  char subtarget[64];

  /** Distance (radius of clamping sphere) from target. */
  float dist;
  /** Distance from clamping-sphere to start applying 'fade'. */
  float soft;

  /** Settings. */
  short flag;
  /** How to limit in relation to clamping sphere. */
  short mode;
  char _pad[4];
} bDistLimitConstraint;

/* ShrinkWrap Constraint */
typedef struct bShrinkwrapConstraint {
  struct Object *target;
  /** Distance to kept from target. */
  float dist;
  /** Shrink type (look on MOD shrinkwrap for values). */
  short shrinkType;
  /** Axis to project/constrain. */
  char projAxis;
  /** Space to project axis in. */
  char projAxisSpace;
  /** Distance to search. */
  float projLimit;
  /** Inside/outside/on surface (see MOD shrinkwrap). */
  char shrinkMode;
  /** Options. */
  char flag;
  /** Axis to align to normal. */
  char trackAxis;
  char _pad;
} bShrinkwrapConstraint;

/* Follow Track constraints */
typedef struct bFollowTrackConstraint {
  struct MovieClip *clip;
  /** MAX_NAME. */
  char track[64];
  int flag;
  int frame_method;
  /** MAX_NAME. */
  char object[64];
  struct Object *camera;
  struct Object *depth_ob;
} bFollowTrackConstraint;

/* Camera Solver constraints */
typedef struct bCameraSolverConstraint {
  struct MovieClip *clip;
  int flag;
  char _pad[4];
} bCameraSolverConstraint;

/* Camera Solver constraints */
typedef struct bObjectSolverConstraint {
  struct MovieClip *clip;
  int flag;
  char _pad[4];
  /** MAX_NAME. */
  char object[64];
  /** Parent-inverse matrix to use. */
  float invmat[4][4];
  struct Object *camera;
} bObjectSolverConstraint;

/* Transform matrix cache constraint */
typedef struct bTransformCacheConstraint {
  struct CacheFile *cache_file;
  /** FILE_MAX. */
  char object_path[1024];

  /* Runtime. */
  struct CacheReader *reader;
  char reader_object_path[1024];
} bTransformCacheConstraint;

/* ------------------------------------------ */

/* bConstraint->type
 * - Do not ever change the order of these, or else files could get
 *   broken as their correct value cannot be resolved
 */
typedef enum eBConstraint_Types {
  /** Invalid/legacy constraint */
  CONSTRAINT_TYPE_NULL = 0,
  /** Unimplemented non longer :) - during constraints recode, Aligorith */
  CONSTRAINT_TYPE_CHILDOF = 1,
  CONSTRAINT_TYPE_TRACKTO = 2,
  CONSTRAINT_TYPE_KINEMATIC = 3,
  CONSTRAINT_TYPE_FOLLOWPATH = 4,
  /** Unimplemented no longer :) - Aligorith */
  CONSTRAINT_TYPE_ROTLIMIT = 5,
  /** Unimplemented no longer :) - Aligorith */
  CONSTRAINT_TYPE_LOCLIMIT = 6,
  /** Unimplemented no longer :) - Aligorith */
  CONSTRAINT_TYPE_SIZELIMIT = 7,
  CONSTRAINT_TYPE_ROTLIKE = 8,
  CONSTRAINT_TYPE_LOCLIKE = 9,
  CONSTRAINT_TYPE_SIZELIKE = 10,
  /** Unimplemented no longer :) - Aligorith. Scripts */
  CONSTRAINT_TYPE_PYTHON = 11,
  CONSTRAINT_TYPE_ACTION = 12,
  /** New Tracking constraint that locks an axis in place - theeth */
  CONSTRAINT_TYPE_LOCKTRACK = 13,
  /** limit distance */
  CONSTRAINT_TYPE_DISTLIMIT = 14,
  /** claiming this to be mine :) is in tuhopuu bjornmose */
  CONSTRAINT_TYPE_STRETCHTO = 15,
  /** floor constraint */
  CONSTRAINT_TYPE_MINMAX = 16,
  /* CONSTRAINT_TYPE_DEPRECATED = 17 */
  /** clampto constraint */
  CONSTRAINT_TYPE_CLAMPTO = 18,
  /** transformation (loc/rot/size -> loc/rot/size) constraint */
  CONSTRAINT_TYPE_TRANSFORM = 19,
  /** shrinkwrap (loc/rot) constraint */
  CONSTRAINT_TYPE_SHRINKWRAP = 20,
  /** New Tracking constraint that minimizes twisting */
  CONSTRAINT_TYPE_DAMPTRACK = 21,
  /** Spline-IK - Align 'n' bones to a curve */
  CONSTRAINT_TYPE_SPLINEIK = 22,
  /** Copy transform matrix */
  CONSTRAINT_TYPE_TRANSLIKE = 23,
  /** Maintain volume during scaling */
  CONSTRAINT_TYPE_SAMEVOL = 24,
  /** Pivot Constraint */
  CONSTRAINT_TYPE_PIVOT = 25,
  /** Follow Track Constraint */
  CONSTRAINT_TYPE_FOLLOWTRACK = 26,
  /** Camera Solver Constraint */
  CONSTRAINT_TYPE_CAMERASOLVER = 27,
  /** Object Solver Constraint */
  CONSTRAINT_TYPE_OBJECTSOLVER = 28,
  /** Transform Cache Constraint */
  CONSTRAINT_TYPE_TRANSFORM_CACHE = 29,
  /** Armature Deform Constraint */
  CONSTRAINT_TYPE_ARMATURE = 30,

  /* NOTE: no constraints are allowed to be added after this */
  NUM_CONSTRAINT_TYPES,
} eBConstraint_Types;

/* bConstraint->flag */
/* flags 0x2 (1 << 1) and 0x8 (1 << 3) were used in past */
/* flag 0x20 (1 << 5) was used to indicate that a constraint was evaluated
 *                  using a 'local' hack for posebones only. */
typedef enum eBConstraint_Flags {
#ifdef DNA_DEPRECATED_ALLOW
  /* Expansion for old box constraint layouts. Just for versioning. */
  CONSTRAINT_EXPAND_DEPRECATED = (1 << 0),
#endif
  /* pre-check for illegal object name or bone name */
  CONSTRAINT_DISABLE = (1 << 2),
  /* to indicate which Ipo should be shown, maybe for 3d access later too */
  CONSTRAINT_ACTIVE = (1 << 4),
  /* to indicate that the owner's space should only be changed into ownspace, but not out of it */
  CONSTRAINT_SPACEONCE = (1 << 6),
  /* influence ipo is on constraint itself, not in action channel */
  CONSTRAINT_OWN_IPO = (1 << 7),
  /* indicates that constraint is temporarily disabled (only used in GE) */
  CONSTRAINT_OFF = (1 << 9),
  /* use bbone curve shape when calculating headtail values (also used by dependency graph!) */
  CONSTRAINT_BBONE_SHAPE = (1 << 10),
  /* That constraint has been inserted in local override (i.e. it can be fully edited!). */
  CONSTRAINT_OVERRIDE_LIBRARY_LOCAL = (1 << 11),
  /* use full transformation (not just segment locations) - only set at runtime. */
  CONSTRAINT_BBONE_SHAPE_FULL = (1 << 12),
} eBConstraint_Flags;

/* bConstraint->ownspace/tarspace */
typedef enum eBConstraint_SpaceTypes {
  /** Default for all - world-space. */
  CONSTRAINT_SPACE_WORLD = 0,
  /** For all - custom space. */
  CONSTRAINT_SPACE_CUSTOM = 5,
  /**
   * For objects (relative to parent/without parent influence),
   * for bones (along normals of bone, without parent/rest-positions).
   */
  CONSTRAINT_SPACE_LOCAL = 1,
  /** For posechannels - pose space. */
  CONSTRAINT_SPACE_POSE = 2,
  /** For posechannels - local with parent. */
  CONSTRAINT_SPACE_PARLOCAL = 3,
  /** For posechannels - local converted to the owner bone orientation. */
  CONSTRAINT_SPACE_OWNLOCAL = 6,
  /** For files from between 2.43-2.46 (should have been parlocal). */
  CONSTRAINT_SPACE_INVALID = 4, /* do not exchange for anything! */
} eBConstraint_SpaceTypes;

/* Common enum for constraints that support override. */
typedef enum eConstraint_EulerOrder {
  /** Automatic euler mode. */
  CONSTRAINT_EULER_AUTO = 0,

  /** Explicit euler rotation modes - must sync with BLI_math_rotation.h defines. */
  CONSTRAINT_EULER_XYZ = 1,
  CONSTRAINT_EULER_XZY = 2,
  CONSTRAINT_EULER_YXZ = 3,
  CONSTRAINT_EULER_YZX = 4,
  CONSTRAINT_EULER_ZXY = 5,
  CONSTRAINT_EULER_ZYX = 6,
} eConstraint_EulerOrder;

/* -------------------------------------- */

/** #bRotateLikeConstraint.flag */
typedef enum eCopyRotation_Flags {
  ROTLIKE_X = (1 << 0),
  ROTLIKE_Y = (1 << 1),
  ROTLIKE_Z = (1 << 2),
  ROTLIKE_X_INVERT = (1 << 4),
  ROTLIKE_Y_INVERT = (1 << 5),
  ROTLIKE_Z_INVERT = (1 << 6),
#ifdef DNA_DEPRECATED_ALLOW
  ROTLIKE_OFFSET = (1 << 7),
#endif
} eCopyRotation_Flags;

/** #bRotateLikeConstraint.mix_mode */
typedef enum eCopyRotation_MixMode {
  /* Replace rotation channel values. */
  ROTLIKE_MIX_REPLACE = 0,
  /* Legacy Offset mode - don't use. */
  ROTLIKE_MIX_OFFSET = 1,
  /* Add Euler components together. */
  ROTLIKE_MIX_ADD = 2,
  /* Multiply the copied rotation on the left. */
  ROTLIKE_MIX_BEFORE = 3,
  /* Multiply the copied rotation on the right. */
  ROTLIKE_MIX_AFTER = 4,
} eCopyRotation_MixMode;

/** #bLocateLikeConstraint.flag */
typedef enum eCopyLocation_Flags {
  LOCLIKE_X = (1 << 0),
  LOCLIKE_Y = (1 << 1),
  LOCLIKE_Z = (1 << 2),
  /** LOCLIKE_TIP is a deprecated option... use headtail=1.0f instead */
  LOCLIKE_TIP = (1 << 3),
  LOCLIKE_X_INVERT = (1 << 4),
  LOCLIKE_Y_INVERT = (1 << 5),
  LOCLIKE_Z_INVERT = (1 << 6),
  LOCLIKE_OFFSET = (1 << 7),
} eCopyLocation_Flags;

/** #bSizeLikeConstraint.flag */
typedef enum eCopyScale_Flags {
  SIZELIKE_X = (1 << 0),
  SIZELIKE_Y = (1 << 1),
  SIZELIKE_Z = (1 << 2),
  SIZELIKE_OFFSET = (1 << 3),
  SIZELIKE_MULTIPLY = (1 << 4),
  SIZELIKE_UNIFORM = (1 << 5),
} eCopyScale_Flags;

/** #bTransLikeConstraint.flag */
typedef enum eCopyTransforms_Flags {
  /* Remove shear from the target matrix. */
  TRANSLIKE_REMOVE_TARGET_SHEAR = (1 << 0),
} eCopyTransforms_Flags;

/** #bTransLikeConstraint.mix_mode */
typedef enum eCopyTransforms_MixMode {
  /* Replace rotation channel values. */
  TRANSLIKE_MIX_REPLACE = 0,
  /* Multiply the copied transformation on the left, with anti-shear scale handling. */
  TRANSLIKE_MIX_BEFORE = 1,
  /* Multiply the copied transformation on the right, with anti-shear scale handling. */
  TRANSLIKE_MIX_AFTER = 2,
  /* Multiply the copied transformation on the left, handling loc/rot/scale separately. */
  TRANSLIKE_MIX_BEFORE_SPLIT = 3,
  /* Multiply the copied transformation on the right, handling loc/rot/scale separately. */
  TRANSLIKE_MIX_AFTER_SPLIT = 4,
  /* Multiply the copied transformation on the left, using simple matrix multiplication. */
  TRANSLIKE_MIX_BEFORE_FULL = 5,
  /* Multiply the copied transformation on the right, using simple matrix multiplication. */
  TRANSLIKE_MIX_AFTER_FULL = 6,
} eCopyTransforms_MixMode;

/* bTransformConstraint.to/from */
typedef enum eTransform_ToFrom {
  TRANS_LOCATION = 0,
  TRANS_ROTATION = 1,
  TRANS_SCALE = 2,
} eTransform_ToFrom;

/** #bTransformConstraint.mix_mode_loc */
typedef enum eTransform_MixModeLoc {
  /* Add component values together (default). */
  TRANS_MIXLOC_ADD = 0,
  /* Replace component values. */
  TRANS_MIXLOC_REPLACE = 1,
} eTransform_MixModeLoc;

/** #bTransformConstraint.mix_mode_rot */
typedef enum eTransform_MixModeRot {
  /* Add component values together (default). */
  TRANS_MIXROT_ADD = 0,
  /* Replace component values. */
  TRANS_MIXROT_REPLACE = 1,
  /* Multiply the generated rotation on the left. */
  TRANS_MIXROT_BEFORE = 2,
  /* Multiply the generated rotation on the right. */
  TRANS_MIXROT_AFTER = 3,
} eTransform_MixModeRot;

/** #bTransformConstraint.mix_mode_scale */
typedef enum eTransform_MixModeScale {
  /* Replace component values (default). */
  TRANS_MIXSCALE_REPLACE = 0,
  /* Multiply component values together. */
  TRANS_MIXSCALE_MULTIPLY = 1,
} eTransform_MixModeScale;

/** #bSameVolumeConstraint.free_axis */
typedef enum eSameVolume_Axis {
  SAMEVOL_X = 0,
  SAMEVOL_Y = 1,
  SAMEVOL_Z = 2,
} eSameVolume_Axis;

/** #bSameVolumeConstraint.mode */
typedef enum eSameVolume_Mode {
  /* Strictly maintain the volume, overriding non-free axis scale. */
  SAMEVOL_STRICT = 0,
  /* Maintain the volume when scale is uniform, pass non-uniform other axis scale through. */
  SAMEVOL_UNIFORM = 1,
  /* Maintain the volume when scaled only on the free axis, pass other axis scale through. */
  SAMEVOL_SINGLE_AXIS = 2,
} eSameVolume_Mode;

/** #bActionConstraint.flag */
typedef enum eActionConstraint_Flags {
  /* Bones use "object" part of target action, instead of "same bone name" part */
  ACTCON_BONE_USE_OBJECT_ACTION = (1 << 0),
  /* Ignore the transform of 'tar' and use 'eval_time' instead: */
  ACTCON_USE_EVAL_TIME = (1 << 1),
} eActionConstraint_Flags;

/** #bActionConstraint.mix_mode */
typedef enum eActionConstraint_MixMode {
  /* Multiply the action transformation on the right. */
  ACTCON_MIX_AFTER_FULL = 0,
  /* Multiply the action transformation on the left. */
  ACTCON_MIX_BEFORE_FULL = 3,
  /* Multiply the action transformation on the right, with anti-shear scale handling. */
  ACTCON_MIX_AFTER = 1,
  /* Multiply the action transformation on the left, with anti-shear scale handling. */
  ACTCON_MIX_BEFORE = 2,
  /* Separately combine Translation, Rotation and Scale, with rotation on the right. */
  ACTCON_MIX_AFTER_SPLIT = 4,
  /* Separately combine Translation, Rotation and Scale, with rotation on the left. */
  ACTCON_MIX_BEFORE_SPLIT = 5,
} eActionConstraint_MixMode;

/* Locked-Axis Values (Locked Track) */
typedef enum eLockAxis_Modes {
  LOCK_X = 0,
  LOCK_Y = 1,
  LOCK_Z = 2,
} eLockAxis_Modes;

/* Up-Axis Values (TrackTo and Locked Track) */
typedef enum eUpAxis_Modes {
  UP_X = 0,
  UP_Y = 1,
  UP_Z = 2,
} eUpAxis_Modes;

/* Tracking axis (TrackTo, Locked Track, Damped Track) and minmax (floor) constraint */
typedef enum eTrackToAxis_Modes {
  TRACK_X = 0,
  TRACK_Y = 1,
  TRACK_Z = 2,
  TRACK_nX = 3,
  TRACK_nY = 4,
  TRACK_nZ = 5,
} eTrackToAxis_Modes;

/* Shrinkwrap flags */
typedef enum eShrinkwrap_Flags {
  /* Also ray-cast in the opposite direction. */
  CON_SHRINKWRAP_PROJECT_OPPOSITE = (1 << 0),
  /* Invert the cull mode when projecting opposite. */
  CON_SHRINKWRAP_PROJECT_INVERT_CULL = (1 << 1),
  /* Align the specified axis to the target normal. */
  CON_SHRINKWRAP_TRACK_NORMAL = (1 << 2),

  /* Ignore front faces in project; same value as MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE */
  CON_SHRINKWRAP_PROJECT_CULL_FRONTFACE = (1 << 3),
  /* Ignore back faces in project; same value as MOD_SHRINKWRAP_CULL_TARGET_BACKFACE */
  CON_SHRINKWRAP_PROJECT_CULL_BACKFACE = (1 << 4),
} eShrinkwrap_Flags;

#define CON_SHRINKWRAP_PROJECT_CULL_MASK \
  (CON_SHRINKWRAP_PROJECT_CULL_FRONTFACE | CON_SHRINKWRAP_PROJECT_CULL_BACKFACE)

/* FollowPath flags */
typedef enum eFollowPath_Flags {
  FOLLOWPATH_FOLLOW = (1 << 0),
  FOLLOWPATH_STATIC = (1 << 1),
  FOLLOWPATH_RADIUS = (1 << 2),
} eFollowPath_Flags;

/* bTrackToConstraint->flags */
typedef enum eTrackTo_Flags {
  TARGET_Z_UP = (1 << 0),
} eTrackTo_Flags;

/* Stretch To Constraint -> volmode */
typedef enum eStretchTo_VolMode {
  VOLUME_XZ = 0,
  VOLUME_X = 1,
  VOLUME_Z = 2,
  NO_VOLUME = 3,
} eStretchTo_VolMode;

/* Stretch To Constraint -> plane mode */
typedef enum eStretchTo_PlaneMode {
  PLANE_X = 0,
  SWING_Y = 1,
  PLANE_Z = 2,
} eStretchTo_PlaneMode;

/* Clamp-To Constraint ->flag */
typedef enum eClampTo_Modes {
  CLAMPTO_AUTO = 0,
  CLAMPTO_X = 1,
  CLAMPTO_Y = 2,
  CLAMPTO_Z = 3,
} eClampTo_Modes;

/* ClampTo Constraint ->flag2 */
typedef enum eClampTo_Flags {
  CLAMPTO_CYCLIC = (1 << 0),
} eClampTo_Flags;

/* bKinematicConstraint->flag */
typedef enum eKinematic_Flags {
  CONSTRAINT_IK_TIP = (1 << 0),
  CONSTRAINT_IK_ROT = (1 << 1),
  /* targetless */
  CONSTRAINT_IK_AUTO = (1 << 2),
  /* autoik */
  CONSTRAINT_IK_TEMP = (1 << 3),
  CONSTRAINT_IK_STRETCH = (1 << 4),
  CONSTRAINT_IK_POS = (1 << 5),
  CONSTRAINT_IK_SETANGLE = (1 << 6),
  CONSTRAINT_IK_GETANGLE = (1 << 7),
  /* limit axis */
  CONSTRAINT_IK_NO_POS_X = (1 << 8),
  CONSTRAINT_IK_NO_POS_Y = (1 << 9),
  CONSTRAINT_IK_NO_POS_Z = (1 << 10),
  CONSTRAINT_IK_NO_ROT_X = (1 << 11),
  CONSTRAINT_IK_NO_ROT_Y = (1 << 12),
  CONSTRAINT_IK_NO_ROT_Z = (1 << 13),
  /* axis relative to target */
  CONSTRAINT_IK_TARGETAXIS = (1 << 14),
} eKinematic_Flags;

/* bSplineIKConstraint->flag */
typedef enum eSplineIK_Flags {
  /* chain has been attached to spline */
  CONSTRAINT_SPLINEIK_BOUND = (1 << 0),
  /* root of chain is not influenced by the constraint */
  CONSTRAINT_SPLINEIK_NO_ROOT = (1 << 1),
#ifdef DNA_DEPRECATED_ALLOW
  /* bones in the chain should not scale to fit the curve */
  CONSTRAINT_SPLINEIK_SCALE_LIMITED = (1 << 2),
#endif
  /* evenly distribute the bones along the path regardless of length */
  CONSTRAINT_SPLINEIK_EVENSPLITS = (1 << 3),
  /* don't adjust the x and z scaling of the bones by the curve radius */
  CONSTRAINT_SPLINEIK_NO_CURVERAD = (1 << 4),

  /* for "volumetric" xz scale mode, limit the minimum or maximum scale values */
  CONSTRAINT_SPLINEIK_USE_BULGE_MIN = (1 << 5),
  CONSTRAINT_SPLINEIK_USE_BULGE_MAX = (1 << 6),

  /* apply volume preservation over original scaling of the bone */
  CONSTRAINT_SPLINEIK_USE_ORIGINAL_SCALE = (1 << 7),
} eSplineIK_Flags;

/* bSplineIKConstraint->xzScaleMode */
typedef enum eSplineIK_XZScaleModes {
  /* no x/z scaling */
  CONSTRAINT_SPLINEIK_XZS_NONE = 0,
  /* bones in the chain should take their x/z scales from the original scaling */
  CONSTRAINT_SPLINEIK_XZS_ORIGINAL = 1,
  /* x/z scales are the inverse of the y-scale */
  CONSTRAINT_SPLINEIK_XZS_INVERSE = 2,
  /* x/z scales are computed using a volume preserving technique (from Stretch To constraint) */
  CONSTRAINT_SPLINEIK_XZS_VOLUMETRIC = 3,
} eSplineIK_XZScaleModes;

/* bSplineIKConstraint->yScaleMode */
typedef enum eSplineIK_YScaleModes {
  /* no y scaling */
  CONSTRAINT_SPLINEIK_YS_NONE = 0,
  /* bones in the chain should be scaled to fit the length of the curve */
  CONSTRAINT_SPLINEIK_YS_FIT_CURVE = 1,
  /* bones in the chain should take their y scales from the original scaling */
  CONSTRAINT_SPLINEIK_YS_ORIGINAL = 2,
} eSplineIK_YScaleModes;

/* bArmatureConstraint -> flag */
typedef enum eArmature_Flags {
  /** use dual quaternion blending */
  CONSTRAINT_ARMATURE_QUATERNION = (1 << 0),
  /** use envelopes */
  CONSTRAINT_ARMATURE_ENVELOPE = (1 << 1),
  /** use current bone location */
  CONSTRAINT_ARMATURE_CUR_LOCATION = (1 << 2),
} eArmature_Flags;

/* MinMax (floor) flags */
typedef enum eFloor_Flags {
  /* MINMAX_STICKY = (1 << 0), */ /* Deprecated. */
  /* MINMAX_STUCK = (1 << 1), */  /* Deprecated. */
  MINMAX_USEROT = (1 << 2),
} eFloor_Flags;

/* transform limiting constraints -> flag2 */
typedef enum eTransformLimits_Flags2 {
  /* not used anymore - for older Limit Location constraints only */
  /* LIMIT_NOPARENT = (1 << 0), */ /* UNUSED */
  /* for all Limit constraints - allow to be used during transform? */
  LIMIT_TRANSFORM = (1 << 1),
} eTransformLimits_Flags2;

/* transform limiting constraints -> flag (own flags). */
typedef enum eTransformLimits_Flags {
  LIMIT_XMIN = (1 << 0),
  LIMIT_XMAX = (1 << 1),
  LIMIT_YMIN = (1 << 2),
  LIMIT_YMAX = (1 << 3),
  LIMIT_ZMIN = (1 << 4),
  LIMIT_ZMAX = (1 << 5),
} eTransformLimits_Flags;

/* limit rotation constraint -> flag (own flags). */
typedef enum eRotLimit_Flags {
  LIMIT_XROT = (1 << 0),
  LIMIT_YROT = (1 << 1),
  LIMIT_ZROT = (1 << 2),
} eRotLimit_Flags;

/* distance limit constraint */
/* bDistLimitConstraint->flag */
typedef enum eDistLimit_Flag {
  /* "soft" cushion effect when reaching the limit sphere */ /* NOT IMPLEMENTED! */
  LIMITDIST_USESOFT = (1 << 0),
  /* as for all Limit constraints - allow to be used during transform? */
  LIMITDIST_TRANSFORM = (1 << 1),
} eDistLimit_Flag;

/* bDistLimitConstraint->mode */
typedef enum eDistLimit_Modes {
  LIMITDIST_INSIDE = 0,
  LIMITDIST_OUTSIDE = 1,
  LIMITDIST_ONSURFACE = 2,
} eDistLimit_Modes;

/* python constraint -> flag */
typedef enum ePyConstraint_Flags {
  PYCON_USETARGETS = (1 << 0),
  PYCON_SCRIPTERROR = (1 << 1),
} ePyConstraint_Flags;

/* ChildOf Constraint -> flag */
typedef enum eChildOf_Flags {
  CHILDOF_LOCX = (1 << 0),
  CHILDOF_LOCY = (1 << 1),
  CHILDOF_LOCZ = (1 << 2),
  CHILDOF_ROTX = (1 << 3),
  CHILDOF_ROTY = (1 << 4),
  CHILDOF_ROTZ = (1 << 5),
  CHILDOF_SIZEX = (1 << 6),
  CHILDOF_SIZEY = (1 << 7),
  CHILDOF_SIZEZ = (1 << 8),
  CHILDOF_ALL = 511,
  /* Temporary flag used by the Set Inverse operator. */
  CHILDOF_SET_INVERSE = (1 << 9),
} eChildOf_Flags;

/* Pivot Constraint */
/* Restrictions for Pivot Constraint axis to consider for enabling constraint */
typedef enum ePivotConstraint_Axis {
  /* do not consider this activity-clamping */
  PIVOTCON_AXIS_NONE = -1,

  /* consider -ve x-axis rotations */
  PIVOTCON_AXIS_X_NEG = 0,
  /* consider -ve y-axis rotations */
  PIVOTCON_AXIS_Y_NEG = 1,
  /* consider -ve z-axis rotations */
  PIVOTCON_AXIS_Z_NEG = 2,

  /* consider +ve x-axis rotations */
  PIVOTCON_AXIS_X = 3,
  /* consider +ve y-axis rotations */
  PIVOTCON_AXIS_Y = 4,
  /* consider +ve z-axis rotations */
  PIVOTCON_AXIS_Z = 5,
} ePivotConstraint_Axis;

/* settings for Pivot Constraint in general */
typedef enum ePivotConstraint_Flag {
  /* offset is to be interpreted as being a fixed-point in space */
  PIVOTCON_FLAG_OFFSET_ABS = (1 << 0),
  /* rotation-based activation uses negative rotation to drive result */
  PIVOTCON_FLAG_ROTACT_NEG = (1 << 1),
} ePivotConstraint_Flag;

typedef enum eFollowTrack_Flags {
  FOLLOWTRACK_ACTIVECLIP = (1 << 0),
  FOLLOWTRACK_USE_3D_POSITION = (1 << 1),
  FOLLOWTRACK_USE_UNDISTORTION = (1 << 2),
} eFollowTrack_Flags;

typedef enum eFollowTrack_FrameMethod {
  FOLLOWTRACK_FRAME_STRETCH = 0,
  FOLLOWTRACK_FRAME_FIT = 1,
  FOLLOWTRACK_FRAME_CROP = 2,
} eFollowTrack_FrameMethod;

/* CameraSolver Constraint -> flag */
typedef enum eCameraSolver_Flags {
  CAMERASOLVER_ACTIVECLIP = (1 << 0),
} eCameraSolver_Flags;

/* ObjectSolver Constraint -> flag */
typedef enum eObjectSolver_Flags {
  OBJECTSOLVER_ACTIVECLIP = (1 << 0),
  /* Temporary flag used by the Set Inverse operator. */
  OBJECTSOLVER_SET_INVERSE = (1 << 1),
} eObjectSolver_Flags;

/* ObjectSolver Constraint -> flag */
typedef enum eStretchTo_Flags {
  STRETCHTOCON_USE_BULGE_MIN = (1 << 0),
  STRETCHTOCON_USE_BULGE_MAX = (1 << 1),
} eStretchTo_Flags;

#ifdef __cplusplus
}
#endif