Revision: 19486
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19486
Author:   aligorith
Date:     2009-04-01 00:36:13 +0200 (Wed, 01 Apr 2009)

Log Message:
-----------
Animato - Support for 'BuiltIn' and 'Relative' Keying Sets  

When inserting keyframes in the 3D-View (support will be extended to other 
editors in due course) using the IKEY hotkey, the menu which appears will now 
consist of 3 parts: 
* 'Active Keying Set' - this option allows you to use the user-defined 
KeyingSet which is active for the current scene (i.e. the one seen in the 
TimeLine/Outliner headers)
* User defined Keying Sets - a list of all such available KeyingSets is 
included, and entries can be chosen from there
* Built-In Keying Sets - see later...

To achieve this, several changes needed to be made first:
* Added support for 'relative' in addition to 'absolute' Keying Sets. Relative 
Keying Sets are Keying Sets which operate on data from the current context 
(i.e. a 'location' KeyingSet will add location keyframes for selected 
objects/bones/nodes as opposed to location keyframes for some particular 
object). The is a tentative 'templates' requirement system here, which still 
needs to be fully fleshed out.
* Added support for builtin Keying Sets (i.e. 'Location', 'Rotation', 
'Scaling', and 'LocRot' as a few initial demonstrations), which replaces the 
temporary Insert Keyframe operator for the 3D-View (IKEY). These are 
effectively relative Keying Set definitions which are included in Blender by 
default and stored in a list separate from user-defined ones. Volunteer help in 
defining a few more of these for other editors will be welcome soon.
* Removed/replaced much of the crappy temporary Keyframing operator code, 
though a few tweaks could still be done.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_constraint.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/constraint.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c
    branches/blender2.5/blender/source/blender/editors/animation/anim_ops.c
    branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
    branches/blender2.5/blender/source/blender/editors/include/ED_keyframing.h
    branches/blender2.5/blender/source/blender/editors/object/object_ops.c
    branches/blender2.5/blender/source/blender/editors/space_outliner/outliner.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_scene_types.h
    
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_init_exit.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_constraint.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_constraint.h      
2009-03-31 22:34:34 UTC (rev 19485)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_constraint.h      
2009-03-31 22:36:13 UTC (rev 19486)
@@ -110,11 +110,13 @@
 /* Constraint function prototypes */
 void unique_constraint_name(struct bConstraint *con, struct ListBase *list);
 
-void free_constraints(struct ListBase *conlist);
+void free_constraints(struct ListBase *list);
 void copy_constraints(struct ListBase *dst, struct ListBase *src);
 void relink_constraints(struct ListBase *list);
 void free_constraint_data(struct bConstraint *con);
 
+struct bConstraint *constraints_get_active(struct ListBase *list);
+
 /* Constraints + Proxies function prototypes */
 void extract_proxylocal_constraints(struct ListBase *dst, struct ListBase 
*src);
 short proxylocked_constraints_owner(struct Object *ob, struct bPoseChannel 
*pchan);

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c     
2009-03-31 22:34:34 UTC (rev 19485)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/anim_sys.c     
2009-03-31 22:36:13 UTC (rev 19486)
@@ -4,6 +4,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <stddef.h>
 
 #include "MEM_guardedalloc.h"
 
@@ -238,6 +239,9 @@
        /* add KeyingSet to list */
        BLI_addtail(list, ks);
        
+       /* make sure KeyingSet has a unique name (this helps with 
identification) */
+       BLI_uniquename(list, ks, "Keying Set", offsetof(KeyingSet, name), 64);
+       
        /* return new KeyingSet for further editing */
        return ks;
 }

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/constraint.c   
2009-03-31 22:34:34 UTC (rev 19485)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/constraint.c   
2009-03-31 22:36:13 UTC (rev 19486)
@@ -3203,17 +3203,16 @@
 }
 
 /* Free all constraints from a constraint-stack */
-void free_constraints (ListBase *conlist)
+void free_constraints (ListBase *list)
 {
        bConstraint *con;
        
        /* Free constraint data and also any extra data */
-       for (con= conlist->first; con; con= con->next) {
+       for (con= list->first; con; con= con->next)
                free_constraint_data(con);
-       }
        
        /* Free the whole list */
-       BLI_freelistN(conlist);
+       BLI_freelistN(list);
 }
 
 /* Reassign links that constraints have to other data (called during file 
loading?) */
@@ -3266,6 +3265,23 @@
        }
 }
 
+/* finds the 'active' constraint in a constraint stack */
+bConstraint *constraints_get_active (ListBase *list)
+{
+       bConstraint *con;
+       
+       /* search for the first constraint with the 'active' flag set */
+       if (list) {
+               for (con= list->first; con; con= con->next) {
+                       if (con->flag & CONSTRAINT_ACTIVE)
+                               return con;
+               }
+       }
+       
+       /* no active constraint found */
+       return NULL;
+}
+
 /* -------- Constraints and Proxies ------- */
 
 /* Rescue all constraints tagged as being CONSTRAINT_PROXY_LOCAL (i.e. added 
to bone that's proxy-synced in this file) */

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c       
2009-03-31 22:34:34 UTC (rev 19485)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/fcurve.c       
2009-03-31 22:36:13 UTC (rev 19486)
@@ -177,7 +177,7 @@
        float xminv=999999999.0f, xmaxv=-999999999.0f;
        float yminv=999999999.0f, ymaxv=-999999999.0f;
        short foundvert=0;
-       int i;
+       unsigned int i;
        
        if (fcu->totvert) {
                if (fcu->bezt) {
@@ -418,7 +418,7 @@
 void testhandles_fcurve (FCurve *fcu)
 {
        BezTriple *bezt;
-       int a;
+       unsigned int a;
 
        /* only beztriples have handles (bpoints don't though) */
        if ELEM(NULL, fcu, fcu->bezt)
@@ -475,7 +475,7 @@
                /* currently, will only be needed when there are beztriples */
                if (fcu->bezt) {
                        BezTriple *bezt;
-                       int a;
+                       unsigned int a;
                        
                        /* loop over ALL points to adjust position in array and 
recalculate handles */
                        for (a=0, bezt=fcu->bezt; a < fcu->totvert; a++, 
bezt++) {
@@ -509,7 +509,7 @@
 /* This function tests if any BezTriples are out of order, thus requiring a 
sort */
 short test_time_fcurve (FCurve *fcu)
 {
-       int a;
+       unsigned int a;
        
        /* sanity checks */
        if (fcu == NULL)
@@ -895,7 +895,8 @@
 {
        BezTriple *bezt, *prevbezt, *lastbezt;
        float v1[2], v2[2], v3[2], v4[2], opl[32], dx, fac;
-       int a, b;
+       unsigned int a;
+       int b;
        float cvalue = 0.0f;
        
        /* get pointers */

Modified: 
branches/blender2.5/blender/source/blender/editors/animation/anim_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_ops.c     
2009-03-31 22:34:34 UTC (rev 19485)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_ops.c     
2009-03-31 22:36:13 UTC (rev 19486)
@@ -380,8 +380,9 @@
                // XXX this is used all over... maybe for screen instead?
        WM_operatortype_append(ANIM_OT_insert_keyframe);
        WM_operatortype_append(ANIM_OT_delete_keyframe);
-       WM_operatortype_append(ANIM_OT_insert_keyframe_old);
-       WM_operatortype_append(ANIM_OT_delete_keyframe_old);
+       WM_operatortype_append(ANIM_OT_insert_keyframe_menu);
+       //WM_operatortype_append(ANIM_OT_delete_keyframe_menu);
+       WM_operatortype_append(ANIM_OT_delete_keyframe_old); // xxx remove?
        
        WM_operatortype_append(ANIM_OT_keyingset_add_new);
        WM_operatortype_append(ANIM_OT_keyingset_add_destination);

Modified: 
branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframing.c   
2009-03-31 22:34:34 UTC (rev 19485)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframing.c   
2009-03-31 22:36:13 UTC (rev 19486)
@@ -61,10 +61,10 @@
                
                /* general data/destination-source settings */
        ID *id;                                 /* id-block this comes from */
-       char *rna_path;                 /* base path to use */  // xxx.... 
maybe we don't need this?
        
                /* specific cases */
-       bPoseChannel *pchan;    /* only needed when doing recalcs... */
+       bPoseChannel *pchan;    
+       bConstraint *con;
 } bCommonKeySrc;
 
 /* ******************************************* */
@@ -867,7 +867,7 @@
 }
 
 /* ******************************************* */
-/* KEYINGSETS */
+/* KEYING SETS - EDITING API  */
 
 /* Operators ------------------------------------------- */
 
@@ -1042,16 +1042,9 @@
 }
 
 
-
 /* ******************************************* */
-/* KEYFRAME MODIFICATION */
+/* KEYING SETS - BUILTIN */
 
-/* mode for commonkey_modifykey */
-enum {
-       COMMONKEY_MODE_INSERT = 0,
-       COMMONKEY_MODE_DELETE,
-} eCommonModifyKey_Modes;
-
 #if 0 // XXX old keyingsets code based on adrcodes... to be restored in due 
course
 
 /* --------- KeyingSet Adrcode Getters ------------ */
@@ -1570,229 +1563,319 @@
 } eKS_Contexts;
 
 
-/* ---------------- KeyingSet Tools ------------------- */
+#endif // XXX old keyingsets code based on adrcodes... to be restored in due 
course
 
-/* helper for commonkey_context_get() -  get keyingsets for 3d-view */
-static void commonkey_context_getv3d (const bContext *C, ListBase *sources, 
bKeyingContext **ksc)
+/* Macros for Declaring KeyingSets ------------------- */
+
+/* A note about this system for declaring built-in Keying Sets:
+ *     One may ask, "What is the purpose of all of these macros and static 
arrays?" and 
+ *     "Why not call the KeyingSets API defined in BKE_animsys.h?". The answer 
is two-fold.
+ *     
+ *     1) Firstly, we use static arrays of struct definitions instead of 
function calls, as
+ *        it reduces the start-up overhead and allocated-memory footprint of 
Blender. If we called
+ *        the KeyingSets API to build these sets, the overhead of checking for 
unique names, allocating
+ *        memory for each and every path and KeyingSet, scattered around in 
RAM, all of which would increase
+ *        the startup time (which is totally unacceptable) and could lead to 
fragmentation+slower access times.
+ *     2) Since we aren't using function calls, we need a nice way of defining 
these KeyingSets in a way which
+ *        is easily readable and less prone to breakage from changes to the 
underlying struct definitions. Further,
+ *        adding additional entries SHOULD NOT require custom code to be 
written to access these new entries/sets. 
+ *        Therefore, here we have a system with nice, human-readable 
statements via macros, and static arrays which
+ *        are linked together using more special macros + struct definitions, 
allowing for such a generic + simple
+ *        initialisation function (init_builtin_keyingsets()) compared with 
that of something like the Nodes system.
+ */
+
+/* Struct type for declaring builtin KeyingSets in as entries in static 
arrays*/
+typedef struct bBuiltinKeyingSet {
+       KeyingSet ks;                   /* the KeyingSet to build */
+       int tot;                                /* the total number of paths 
defined */
+       KS_Path paths[64];              /* the paths for the KeyingSet to use */
+} bBuiltinKeyingSet;
+
+       /* WARNING: the following macros must be kept in sync with the 
+        * struct definitions in DNA_anim_types.h! 
+        */
+
+/* macro for defining a builtin KeyingSet */
+#define BI_KS_DEFINE(name, keyingflag) \
+       {NULL, NULL, {NULL, NULL}, name, KEYINGSET_BUILTIN, keyingflag}
+       
+/* macro to start defining paths for a builtin KeyingSet */
+#define BI_KS_PATHS_BEGIN(tot) \
+       tot, {
+       
+/* macro to finish defining paths for a builtin KeyingSet */
+#define BI_KS_PATHS_END \
+       }
+       
+/* macro for defining a builtin KeyingSet's path */
+#define BI_KSP_DEFINE(id_type, templates, prop_path, array_index, flag, 
groupflag) \
+       {NULL, NULL, NULL, "", id_type, templates, prop_path, array_index, 
flag, groupflag}
+       
+/* ---- */
+
+/* Struct type for finding all the arrays of builtin KeyingSets */
+typedef struct bBuiltinKSContext {
+       bBuiltinKeyingSet *bks;         /* array of KeyingSet definitions */
+       int tot;                                        /* number of KeyingSets 
in this array */
+} bBuiltinKSContext;
+
+/* macro for defining builtin KeyingSet sets 
+ * NOTE: all the arrays of sets must follow this naming convention!
+ */

@@ 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