Revision: 24510
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24510
Author:   campbellbarton
Date:     2009-11-11 20:58:30 +0100 (Wed, 11 Nov 2009)

Log Message:
-----------
object.constraints.add()/remove()/active, same for PoseChannel

modified internal api for minimal rna wrapper functions.

TODO
- missing updates for pose channels
- typecheck for pose/object constraints

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_constraint.h
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/editors/include/ED_object.h
    trunk/blender/source/blender/editors/object/object_constraint.c
    trunk/blender/source/blender/editors/object/object_relations.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/makesrna/intern/rna_internal.h
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/makesrna/intern/rna_object_api.c
    trunk/blender/source/blender/makesrna/intern/rna_pose.c
    trunk/blender/source/blender/makesrna/intern/rna_pose_api.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c

Modified: trunk/blender/source/blender/blenkernel/BKE_constraint.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_constraint.h    2009-11-11 
19:12:52 UTC (rev 24509)
+++ trunk/blender/source/blender/blenkernel/BKE_constraint.h    2009-11-11 
19:58:30 UTC (rev 24510)
@@ -102,6 +102,9 @@
 bConstraintTypeInfo *constraint_get_typeinfo(struct bConstraint *con);
 bConstraintTypeInfo *get_constraint_typeinfo(int type);
 
+struct bConstraint *add_ob_constraint(struct Object *ob, const char *name, 
short type);
+struct bConstraint *add_pose_constraint(struct Object *ob, struct bPoseChannel 
*pchan, const char *name, short type);
+
 /* 
---------------------------------------------------------------------------- */
 /* Useful macros for testing various common flag combinations */
 

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c 2009-11-11 
19:12:52 UTC (rev 24509)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c 2009-11-11 
19:58:30 UTC (rev 24510)
@@ -3601,6 +3601,91 @@
                return NULL;
 }
 
+/* Creates a new constraint, initialises its data, and returns it */
+static bConstraint *add_new_constraint_internal(const char *name, short type)
+{
+       bConstraint *con;
+       bConstraintTypeInfo *cti;
+
+       con = MEM_callocN(sizeof(bConstraint), "Constraint");
+
+       /* Set up a generic constraint datablock */
+       con->type = type;
+       con->flag |= CONSTRAINT_EXPAND;
+       con->enforce = 1.0f;
+
+       /* Load the data for it */
+       cti = constraint_get_typeinfo(con);
+       if (cti) {
+               con->data = MEM_callocN(cti->size, cti->structName);
+
+               /* only constraints that change any settings need this */
+               if (cti->new_data)
+                       cti->new_data(con->data);
+
+               /* set the name based on the type of constraint */
+               name= name ? name : cti->name;
+       }
+       else
+               name= name ? name : "Const";
+
+       strcpy(con->name, name);
+
+       return con;
+}
+
+/* if pchan is not NULL then assume we're adding a pose constraint */
+static bConstraint *add_new_constraint(Object *ob, bPoseChannel *pchan, const 
char *name, short type)
+{
+       bConstraint *con;
+       ListBase *list;
+
+       con= add_new_constraint_internal(name, type);
+
+       if(pchan)       list= &pchan->constraints;
+       else            list= &ob->constraints;
+
+       if (list) {
+               bConstraint *coniter;
+
+               /* add new constraint to end of list of constraints before 
ensuring that it has a unique name
+                * (otherwise unique-naming code will fail, since it assumes 
element exists in list)
+                */
+               BLI_addtail(list, con);
+               unique_constraint_name(con, list);
+
+               /* if the target list is a list on some PoseChannel belonging 
to a proxy-protected
+                * Armature layer, we must tag newly added constraints with a 
flag which allows them
+                * to persist after proxy syncing has been done
+                */
+               if (proxylocked_constraints_owner(ob, pchan))
+                       con->flag |= CONSTRAINT_PROXY_LOCAL;
+
+               /* make this constraint the active one
+                *      - since constraint was added at end of stack, we can 
just go
+                *        through deactivating all previous ones
+                */
+               con->flag |= CONSTRAINT_ACTIVE;
+               for (coniter= con->prev; coniter; coniter= coniter->prev)
+                       coniter->flag &= ~CONSTRAINT_ACTIVE;
+       }
+
+       return con;
+}
+
+bConstraint *add_pose_constraint(Object *ob, bPoseChannel *pchan, const char 
*name, short type)
+{
+       if(pchan==NULL)
+               return NULL;
+
+       return add_new_constraint(ob, pchan, name, type);
+}
+
+bConstraint *add_ob_constraint(Object *ob, const char *name, short type)
+{
+       return add_new_constraint(ob, NULL, name, type);
+}
+
 /* ************************* General Constraints API 
************************** */
 /* The functions here are called by various parts of Blender. Very few (should 
be none if possible)
  * constraint-specific code should occur here.

Modified: trunk/blender/source/blender/editors/include/ED_object.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_object.h    2009-11-11 
19:12:52 UTC (rev 24509)
+++ trunk/blender/source/blender/editors/include/ED_object.h    2009-11-11 
19:58:30 UTC (rev 24510)
@@ -91,9 +91,6 @@
 int object_data_is_libdata(struct Object *ob);
 
 /* constraints */
-struct bConstraint *add_new_constraint(short type);
-void add_constraint_to_object(struct bConstraint *con, struct Object *ob);
-
 struct ListBase *get_active_constraints(struct Object *ob);
 struct bConstraint *get_active_constraint(struct Object *ob);
 

Modified: trunk/blender/source/blender/editors/object/object_constraint.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_constraint.c     
2009-11-11 19:12:52 UTC (rev 24509)
+++ trunk/blender/source/blender/editors/object/object_constraint.c     
2009-11-11 19:58:30 UTC (rev 24510)
@@ -187,56 +187,6 @@
 #endif
 }
 
-/* Creates a new constraint, initialises its data, and returns it */
-bConstraint *add_new_constraint (short type)
-{
-       bConstraint *con;
-       bConstraintTypeInfo *cti;
-
-       con = MEM_callocN(sizeof(bConstraint), "Constraint");
-       
-       /* Set up a generic constraint datablock */
-       con->type = type;
-       con->flag |= CONSTRAINT_EXPAND;
-       con->enforce = 1.0f;
-       
-       /* Load the data for it */
-       cti = constraint_get_typeinfo(con);
-       if (cti) {
-               con->data = MEM_callocN(cti->size, cti->structName);
-               
-               /* only constraints that change any settings need this */
-               if (cti->new_data)
-                       cti->new_data(con->data);
-                       
-               /* set the name based on the type of constraint */
-               strcpy(con->name, cti->name); 
-       }
-       else
-               strcpy(con->name, "Const");
-       
-       return con;
-}
-
-/* Adds the given constraint to the Object-level set of constraints for the 
given Object */
-void add_constraint_to_object (bConstraint *con, Object *ob)
-{
-       ListBase *list;
-       list = &ob->constraints;
-       
-       if (list) {
-               unique_constraint_name(con, list);
-               BLI_addtail(list, con);
-               
-               if (proxylocked_constraints_owner(ob, NULL))
-                       con->flag |= CONSTRAINT_PROXY_LOCAL;
-               
-               con->flag |= CONSTRAINT_ACTIVE;
-               for (con= con->prev; con; con= con->prev)
-                       con->flag &= ~CONSTRAINT_ACTIVE;
-       }
-}
-
 /* helper function for add_constriant - sets the last target for the active 
constraint */
 static void set_constraint_nth_target (bConstraint *con, Object *target, char 
subtarget[], int index)
 {
@@ -1076,9 +1026,14 @@
 static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, 
ListBase *list, int type, short setTarget)
 {
        Scene *scene= CTX_data_scene(C);
-       bPoseChannel *pchan= get_active_posechannel(ob);
+       bPoseChannel *pchan;
        bConstraint *con;
        
+       if(list == &ob->constraints)
+               pchan= NULL;
+       else
+               pchan= get_active_posechannel(ob);
+
        /* check if constraint to be added is valid for the given constraints 
stack */
        if (type == CONSTRAINT_TYPE_NULL) {
                return OPERATOR_CANCELLED;
@@ -1097,33 +1052,11 @@
        }
        
        /* create a new constraint of the type requried, and add it to the 
active/given constraints list */
-       con = add_new_constraint(type);
+       if(pchan)
+               con = add_pose_constraint(ob, pchan, NULL, type);
+       else
+               con = add_ob_constraint(ob, NULL, type);
        
-       if (list) {
-               bConstraint *coniter; 
-               
-               /* add new constraint to end of list of constraints before 
ensuring that it has a unique name 
-                * (otherwise unique-naming code will fail, since it assumes 
element exists in list)
-                */
-               BLI_addtail(list, con);
-               unique_constraint_name(con, list);
-               
-               /* if the target list is a list on some PoseChannel belonging 
to a proxy-protected 
-                * Armature layer, we must tag newly added constraints with a 
flag which allows them
-                * to persist after proxy syncing has been done
-                */
-               if (proxylocked_constraints_owner(ob, pchan))
-                       con->flag |= CONSTRAINT_PROXY_LOCAL;
-               
-               /* make this constraint the active one 
-                *      - since constraint was added at end of stack, we can 
just go 
-                *        through deactivating all previous ones
-                */
-               con->flag |= CONSTRAINT_ACTIVE;
-               for (coniter= con->prev; coniter; coniter= coniter->prev)
-                       coniter->flag &= ~CONSTRAINT_ACTIVE;
-       }
-       
        /* get the first selected object/bone, and make that the target
         *      - apart from the buttons-window add buttons, we shouldn't add 
in this way
         */

Modified: trunk/blender/source/blender/editors/object/object_relations.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_relations.c      
2009-11-11 19:12:52 UTC (rev 24509)
+++ trunk/blender/source/blender/editors/object/object_relations.c      
2009-11-11 19:58:30 UTC (rev 24510)
@@ -608,14 +608,11 @@
                                        bFollowPathConstraint *data;
                                        float cmat[4][4], vec[3];
                                        
-                                       con = 
add_new_constraint(CONSTRAINT_TYPE_FOLLOWPATH);
-                                       strcpy (con->name, "AutoPath");
+                                       con = add_ob_constraint(ob, "AutoPath", 
CONSTRAINT_TYPE_FOLLOWPATH);
                                        
                                        data = con->data;
                                        data->tar = par;
                                        
-                                       add_constraint_to_object(con, ob);
-                                       
                                        get_constraint_target_matrix(scene, 
con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, scene->r.cfra - 
give_timeoffset(ob));
                                        sub_v3_v3v3(vec, ob->obmat[3], cmat[3]);
                                        
@@ -923,8 +920,7 @@
 
                CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
                        if(ob!=obact) {
-                               con = 
add_new_constraint(CONSTRAINT_TYPE_TRACKTO);
-                               strcpy (con->name, "AutoTrack");
+                               con = add_ob_constraint(ob, "AutoTrack", 
CONSTRAINT_TYPE_TRACKTO);
 
                                data = con->data;
                                data->tar = obact;
@@ -935,8 +931,6 @@
                                        data->reserved1 = TRACK_nZ;
                                        data->reserved2 = UP_Y;
                                }
-
-                               add_constraint_to_object(con, ob);
                        }
                }
                CTX_DATA_END;
@@ -947,8 +941,7 @@
 
                CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
                        if(ob!=obact) {
-                               con = 
add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK);
-                               strcpy (con->name, "AutoTrack");
+                               con = add_ob_constraint(ob, "AutoTrack", 
CONSTRAINT_TYPE_LOCKTRACK);
 
                                data = con->data;
                                data->tar = obact;
@@ -959,8 +952,6 @@
                                        data->trackflag = TRACK_nZ;
                                        data->lockflag = LOCK_Y;
                                }
-
-                               add_constraint_to_object(con, ob);
                        }
                }
                CTX_DATA_END;

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c      
2009-11-11 19:12:52 UTC (rev 24509)

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to