tornavis/source/blender/makesdna/DNA_constraint_types.h

362 lines
9.3 KiB
C
Raw Normal View History

2002-10-12 13:37:38 +02:00
/**
* $Id$
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
* Constraint DNA data
*/
#ifndef DNA_CONSTRAINT_TYPES_H
#define DNA_CONSTRAINT_TYPES_H
#include "DNA_ID.h"
#include "DNA_ipo_types.h"
#include "DNA_object_types.h"
struct Action;
/* channels reside in Object or Action (ListBase) constraintChannels */
2002-10-12 13:37:38 +02:00
typedef struct bConstraintChannel{
struct bConstraintChannel *next, *prev;
Ipo *ipo;
short flag;
char name[30];
} bConstraintChannel;
typedef struct bConstraint{
struct bConstraint *next, *prev;
void *data; /* Constraint data (a valid constraint type) */
short type; /* Constraint type */
2002-10-12 13:37:38 +02:00
short flag; /* Flag */
short reserved1;
char name[30]; /* Constraint name */
float enforce;
} bConstraint;
/* Single-target subobject constraints */
typedef struct bKinematicConstraint{
Object *tar;
short iterations; /* Maximum number of iterations to try */
Integration of new IK lib features in Armature Poses. Best is to forget yesterday's commit and old docs. New docs are underway... Here's how IK works now; - IK chains can go all the way to the furthest parent Bone. Disregarding the old option "IK to Parent" and disgregarding whether a Bone has an offset to its parent (offsets now work for IK, so you can also make T-bones). - The old "IK to Parent" option now only does what it should do: it denotes whether a Bone is directly connected to a Parent Bone, or not. In the UI and in code this option is now called "Connected". - You can also define yourself which Bone will become the "Root" for an IK chain. This can be any Parent of the IK tip (where the IK constraint is). By default it goes all the way, unless you set a value for the new IK Constraint Panel option "Chain Lenght". - "Tree IK" now is detected automatic, when multiple IK Roots are on the same Bone, and when there's a branched structure. Multiple IK's on a single chain (no branches) is still executed as usual, doing the IK's sequentially. - Note: Branched structures, with _partial_ overlapping IK chains, that don't share the same Root will possibly disconnect branches. - When you select a Bone with IK, it now draws a yellow dashed line to its Root. - The IK options "Location Weight" and "Rotation Weight" are relative, in case there's a Tree IK structure. These weights cannot be set to zero. To animate or disable IK Targets, use the "Influence" slider. - This new IK is backwards and upwards compatible for Blender files. Of course, the new features won't show in older Blender binaries! :) Other changes & notes; - In PoseMode, the Constraint Panel now also draws in Editing Buttons, next to the Bones Panel. - IK Constraint Panel was redesigned... it's still a bit squished - Buttons "No X DoF" is now called "Lock X". This to follow convention to name options positive. - Added Undo push for Make/Clear Parent in Editmode Armature - Use CTRL+P "Make Parent" on a single selected Bone to make it become connected (ALT+P had already "Disconnect"). On todo next; Visualizing & review of Bone DoF limits and stiffness
2005-08-28 14:23:06 +02:00
short flag; /* Like CONSTRAINT_IK_TIP */
int rootbone; /* index to rootbone, if zero go all the way to mother bone */
2002-10-12 13:37:38 +02:00
char subtarget[32]; /* String to specify sub-object target */
float weight; /* Weight of goal in IK tree */
float orientweight; /* Amount of rotation a target applies on chain */
float grabtarget[3]; /* for target-less IK */
int pad;
2002-10-12 13:37:38 +02:00
} bKinematicConstraint;
typedef struct bTrackToConstraint{
Object *tar;
int reserved1; /* I'll be using reserved1 and reserved2 as Track and Up flags, not sure if that's what they were intented for anyway. Not sure either if it would create backward incompatibility if I were to rename them. - theeth*/
int reserved2;
int flags;
int pad;
2002-10-12 13:37:38 +02:00
char subtarget[32];
} bTrackToConstraint;
typedef struct bRotateLikeConstraint{
Object *tar;
int flag;
int reserved1;
char subtarget[32];
} bRotateLikeConstraint;
typedef struct bLocateLikeConstraint{
Object *tar;
int flag;
int reserved1;
char subtarget[32];
} bLocateLikeConstraint;
typedef struct bMinMaxConstraint{
Object *tar;
int minmaxflag;
float offset;
int flag;
short sticky, stuck, pad1, pad2; /* for backward compatability */
float cache[3];
char subtarget[32];
} bMinMaxConstraint;
typedef struct bSizeLikeConstraint{
Object *tar;
int flag;
int reserved1;
char subtarget[32];
} bSizeLikeConstraint;
2002-10-12 13:37:38 +02:00
typedef struct bActionConstraint{
Object *tar;
short type;
short local;
int start;
int end;
2002-10-12 13:37:38 +02:00
float min;
float max;
int pad;
2002-10-12 13:37:38 +02:00
struct bAction *act;
char subtarget[32];
} bActionConstraint;
/* Locked Axis Tracking constraint */
typedef struct bLockTrackConstraint{
Object *tar;
int trackflag;
int lockflag;
char subtarget[32];
} bLockTrackConstraint;
/* Follow Path constraints */
2002-10-12 13:37:38 +02:00
typedef struct bFollowPathConstraint{
Object *tar; /* Must be path object */
float offset; /* Offset in time on the path (in frame) */
int followflag;
int trackflag;
int upflag;
2002-10-12 13:37:38 +02:00
} bFollowPathConstraint;
/* Distance Limiting constraints */
typedef struct bDistanceLimitConstraint{
Object *tar;
char subtarget[32];
float pad1;
float pad2;
float distance;
float offset[3];
} bDistanceLimitConstraint;
2002-10-12 13:37:38 +02:00
/* Zero-target constraints */
typedef struct bRotationConstraint{
float xmin, xmax;
float ymin, ymax;
float zmin, zmax;
} bRotationConstraint;
/* Stretch to constraint */
typedef struct bStretchToConstraint{
Object *tar;
int volmode;
int plane;
float orglength;
float bulge;
char subtarget[32];
} bStretchToConstraint;
/* transform limiting constraints - zero target */
typedef struct bLocLimitConstraint{
float xmin, xmax;
float ymin, ymax;
float zmin, zmax;
short flag;
short flag2;
} bLocLimitConstraint;
typedef struct bRotLimitConstraint{
float xmin, xmax;
float ymin, ymax;
float zmin, zmax;
short flag;
short pad1;
} bRotLimitConstraint;
typedef struct bSizeLimitConstraint{
float xmin, xmax;
float ymin, ymax;
float zmin, zmax;
short flag;
short pad1;
} bSizeLimitConstraint;
/* Rigid Body constraint */
typedef struct bRigidBodyJointConstraint{
Object *tar;
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;
short pad;
short pad1;
short pad2;
} bRigidBodyJointConstraint;
/* ClampTo Constraint */
typedef struct bClampToConstraint {
Object *tar; /* 'target' must be a curve */
int flag; /* which plane to find object on */
int pad;
} bClampToConstraint;
2002-10-12 13:37:38 +02:00
/* bConstraint.type */
#define CONSTRAINT_TYPE_NULL 0
#define CONSTRAINT_TYPE_CHILDOF 1 /* Unimplemented */
#define CONSTRAINT_TYPE_TRACKTO 2
#define CONSTRAINT_TYPE_KINEMATIC 3
#define CONSTRAINT_TYPE_FOLLOWPATH 4
#define CONSTRAINT_TYPE_ROTLIMIT 5 /* Unimplemented no longer :) - Aligorith */
#define CONSTRAINT_TYPE_LOCLIMIT 6 /* Unimplemented no longer :) - Aligorith */
#define CONSTRAINT_TYPE_SIZELIMIT 7 /* Unimplemented no longer :) - Aligorith */
2002-10-12 13:37:38 +02:00
#define CONSTRAINT_TYPE_ROTLIKE 8
#define CONSTRAINT_TYPE_LOCLIKE 9
#define CONSTRAINT_TYPE_SIZELIKE 10
2002-10-12 13:37:38 +02:00
#define CONSTRAINT_TYPE_PYTHON 11 /* Unimplemented */
#define CONSTRAINT_TYPE_ACTION 12
#define CONSTRAINT_TYPE_LOCKTRACK 13 /* New Tracking constraint that locks an axis in place - theeth */
#define CONSTRAINT_TYPE_DISTANCELIMIT 14
#define CONSTRAINT_TYPE_STRETCHTO 15 /* claiming this to be mine :) is in tuhopuu bjornmose */
#define CONSTRAINT_TYPE_MINMAX 16 /* floor constraint */
#define CONSTRAINT_TYPE_RIGIDBODYJOINT 17 /* rigidbody constraint */
#define CONSTRAINT_TYPE_CLAMPTO 18 /* clampto constraint */
2002-10-12 13:37:38 +02:00
/* bConstraint.flag */
/* expand for UI */
#define CONSTRAINT_EXPAND 0x01
/* pre-check for illegal object name or bone name */
#define CONSTRAINT_DISABLE 0x04
/* flags 0x2 and 0x8 were used in past, skip this */
/* to indicate which Ipo should be shown, maybe for 3d access later too */
#define CONSTRAINT_ACTIVE 0x10
/* only for Pose, evaluates constraints in posechannel local space */
#define CONSTRAINT_LOCAL 0x20
Result of 2 weeks of quiet coding work in Greece :) Aim was to get a total refresh of the animation system. This is needed because; - we need to upgrade it with 21st century features - current code is spaghetti/hack combo, and hides good design - it should become lag-free with using dependency graphs A full log, with complete code API/structure/design explanation will follow, that's a load of work... so here below the list with hot changes; - The entire object update system (matrices, geometry) is now centralized. Calls to where_is_object and makeDispList are forbidden, instead we tag objects 'changed' and let the depgraph code sort it out - Removed all old "Ika" code - Depgraph is aware of all relationships, including meta balls, constraints, bevelcurve, and so on. - Made depgraph aware of relation types and layers, to do smart flushing of 'changed' events. Nothing gets calculated too often! - Transform uses depgraph to detect changes - On frame-advance, depgraph flushes animated changes Armatures; Almost all armature related code has been fully built from scratch. It now reveils the original design much better, with a very clean implementation, lag free without even calculating each Bone more than once. Result is quite a speedup yes! Important to note is; 1) Armature is data containing the 'rest position' 2) Pose is the changes of rest position, and always on object level. That way more Objects can use same Pose. Also constraints are in Pose 3) Actions only contain the Ipos to change values in Poses. - Bones draw unrotated now - Drawing bones speedup enormously (10-20 times) - Bone selecting in EditMode, selection state is saved for PoseMode, and vice-versa - Undo in editmode - Bone renaming does vertexgroups, constraints, posechannels, actions, for all users of Armature in entire file - Added Bone renaming in NKey panel - Nkey PoseMode shows eulers now - EditMode and PoseMode now have 'active' bone too (last clicked) - Parenting in EditMode' CTRL+P, ALT+P, with nice options! - Pose is added in Outliner now, with showing that constraints are in the Pose, not Armature - Disconnected IK solving from constraints. It's a separate phase now, on top of the full Pose calculations - Pose itself has a dependency graph too, so evaluation order is lag free. TODO NOW; - Rotating in Posemode has incorrect inverse transform (Martin will fix) - Python Bone/Armature/Pose API disabled... needs full recode too (wait for my doc!) - Game engine will need upgrade too - Depgraph code needs revision, cleanup, can be much faster! (But, compliments for Jean-Luc, it works like a charm!) - IK changed, it now doesnt use previous position to advance to next position anymore. That system looks nice (no flips) but is not well suited for NLA and background render. TODO LATER; We now can do loadsa new nifty features as well; like: - Kill PoseMode (can be option for armatures itself) - Make B-Bones (Bezier, Bspline, like for spines) - Move all silly button level edit to 3d window (like CTRL+I = add IK) - Much better & informative drawing - Fix action/nla editors - Put all ipos in Actions (object, mesh key, lamp color) - Add hooks - Null bones - Much more advanced constraints... Bugfixes; - OGL render (view3d header) had wrong first frame on anim render - Ipo 'recording' mode had wrong playback speed - Vertex-key mode now sticks to show 'active key', until frame change -Ton-
2005-07-03 19:35:38 +02:00
2002-10-12 13:37:38 +02:00
/* bConstraintChannel.flag */
#define CONSTRAINT_CHANNEL_SELECT 0x01
#define CONSTRAINT_CHANNEL_PROTECTED 0x02
2002-10-12 13:37:38 +02:00
/**
* The flags for ROTLIKE, LOCLIKE and SIZELIKE should be kept identical
* (that is, same effect, different name). It simplifies the Python API access a lot.
*/
/* bRotateLikeConstraint.flag */
#define ROTLIKE_X 0x01
#define ROTLIKE_Y 0x02
#define ROTLIKE_Z 0x04
#define ROTLIKE_X_INVERT 0x10
#define ROTLIKE_Y_INVERT 0x20
#define ROTLIKE_Z_INVERT 0x40
#define ROTLIKE_OFFSET 0x80
2002-10-12 13:37:38 +02:00
/* bLocateLikeConstraint.flag */
#define LOCLIKE_X 0x01
#define LOCLIKE_Y 0x02
#define LOCLIKE_Z 0x04
#define LOCLIKE_TIP 0x08
#define LOCLIKE_X_INVERT 0x10
#define LOCLIKE_Y_INVERT 0x20
#define LOCLIKE_Z_INVERT 0x40
#define LOCLIKE_OFFSET 0x80
/* bSizeLikeConstraint.flag */
#define SIZELIKE_X 0x01
#define SIZELIKE_Y 0x02
#define SIZELIKE_Z 0x04
#define SIZELIKE_OFFSET 0x80
/* Axis flags */
#define LOCK_X 0x00
#define LOCK_Y 0x01
#define LOCK_Z 0x02
#define UP_X 0x00
#define UP_Y 0x01
#define UP_Z 0x02
#define TRACK_X 0x00
#define TRACK_Y 0x01
#define TRACK_Z 0x02
#define TRACK_nX 0x03
#define TRACK_nY 0x04
#define TRACK_nZ 0x05
/* bTrackToConstraint->flags */
#define TARGET_Z_UP 0x01
#define VOLUME_XZ 0x00
#define VOLUME_X 0x01
#define VOLUME_Z 0x02
#define NO_VOLUME 0x03
#define PLANE_X 0x00
#define PLANE_Y 0x01
#define PLANE_Z 0x02
#define CLAMPTO_AUTO 0
#define CLAMPTO_X 1
#define CLAMPTO_Y 2
#define CLAMPTO_Z 3
/* bKinematicConstraint->flag */
#define CONSTRAINT_IK_TIP 1
#define CONSTRAINT_IK_ROT 2
#define CONSTRAINT_IK_AUTO 4
#define CONSTRAINT_IK_TEMP 8
#define CONSTRAINT_IK_STRETCH 16
#define CONSTRAINT_IK_POS 32
/* MinMax (floor) flags */
#define MINMAX_STICKY 0x01
#define MINMAX_STUCK 0x02
#define MINMAX_USEROT 0x04
/* transform limiting constraints -> flag */
#define LIMIT_XMIN 0x01
#define LIMIT_XMAX 0x02
#define LIMIT_YMIN 0x04
#define LIMIT_YMAX 0x08
#define LIMIT_ZMIN 0x10
#define LIMIT_ZMAX 0x20
#define LIMIT_XROT 0x01
#define LIMIT_YROT 0x02
#define LIMIT_ZROT 0x04
#define LIMIT_NOPARENT 0x01
#define CONSTRAINT_DRAW_PIVOT 0x40
/* important: these defines need to match up with PHY_DynamicTypes headerfile */
#define CONSTRAINT_RB_BALL 1
#define CONSTRAINT_RB_HINGE 2
#define CONSTRAINT_RB_VEHICLE 11
#define CONSTRAINT_RB_GENERIC6DOF 12
2002-10-12 13:37:38 +02:00
#endif