Revision: 18477
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18477
Author:   ton
Date:     2009-01-13 13:32:01 +0100 (Tue, 13 Jan 2009)

Log Message:
-----------
2.5

Added poselib.c back, non functional entirely still.

Added Paths:
-----------
    branches/blender2.5/blender/source/blender/editors/armature/poselib.c

Copied: branches/blender2.5/blender/source/blender/editors/armature/poselib.c 
(from rev 18476, trunk/blender/source/blender/src/poselib.c)
===================================================================
--- branches/blender2.5/blender/source/blender/editors/armature/poselib.c       
                        (rev 0)
+++ branches/blender2.5/blender/source/blender/editors/armature/poselib.c       
2009-01-13 12:32:01 UTC (rev 18477)
@@ -0,0 +1,1322 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL 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.
+ *
+ * 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) 2007, Blender Foundation
+ * This is a new part of Blender
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+ 
+#include <stdlib.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+
+#include "DNA_listBase.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
+
+#include "BKE_action.h"
+#include "BKE_armature.h"
+#include "BKE_depsgraph.h"
+#include "BKE_ipo.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+
+#include "BKE_global.h"
+#include "BKE_utildefines.h"
+
+#include "PIL_time.h"                  /* sleep                                
*/
+
+#include "WM_types.h"
+
+#include "ED_anim_api.h"
+#include "ED_armature.h"
+#include "ED_keyframes_draw.h"
+#include "ED_keyframing.h"
+#include "ED_keyframes_edit.h"
+
+#include "armature_intern.h"
+
+/* ******* XXX ********** */
+
+static void BIF_undo_push() {}
+static void error() {}
+static int qtest() {return 0;}
+static int sbutton() {return 0;}
+static int pupmenu() {return 0;}
+static int pupmenu_col() {return 0;}
+static int extern_qread_ext() {return 0;}
+static void persptoetsen() {}
+static void headerprint() {}
+
+static void remake_action_ipos() {}
+static void verify_pchan2achan_grouping() {}
+static void action_set_activemarker() {}
+
+/* ******* XXX ********** */
+
+
+/* ************************************************************* */
+/* == POSE-LIBRARY TOOL FOR BLENDER == 
+ *     
+ * Overview: 
+ *     This tool allows animators to store a set of frequently used poses to 
dump into
+ *     the active action to help in "budget" productions to quickly block out 
new actions.
+ *     It acts as a kind of "glorified clipboard for poses", allowing for 
naming of poses.
+ *
+ * Features:
+ *     - PoseLibs are simply normal Actions
+ *     - Each "pose" is simply a set of keyframes that occur on a particular 
frame
+ *             -> a set of TimeMarkers that belong to each Action, help 
'label' where a 'pose' can be
+ *                found in the Action
+ *     - The Scrollwheel or PageUp/Down buttons when used in a special mode or 
after pressing/holding
+ *       [a modifier] key, cycles through the poses available for the active 
pose's poselib, allowing the
+ *       animator to preview what action best suits that pose
+ */
+/* ************************************************************* */
+
+/* gets list of poses in poselib as a string usable for pupmenu() */
+char *poselib_build_poses_menu (bAction *act, char title[])
+{
+       DynStr *pupds= BLI_dynstr_new();
+       TimeMarker *marker;
+       char *str;
+       char buf[64];
+       int i;
+       
+       /* add title first */
+       sprintf(buf, "%s%%t|", title);
+       BLI_dynstr_append(pupds, buf);
+       
+       /* loop through markers, adding them */
+       for (marker=act->markers.first, i=1; marker; marker=marker->next, i++) {
+               BLI_dynstr_append(pupds, marker->name);
+               
+               sprintf(buf, "%%x%d", i);
+               BLI_dynstr_append(pupds, buf);
+               
+               if (marker->next)
+                       BLI_dynstr_append(pupds, "|");
+       }
+       
+       /* convert to normal MEM_malloc'd string */
+       str= BLI_dynstr_get_cstring(pupds);
+       BLI_dynstr_free(pupds);
+       
+       return str;
+}
+
+/* gets the first available frame in poselib to store a pose on 
+ *     - frames start from 1, and a pose should occur on every frame... 0 is 
error!
+ */
+int poselib_get_free_index (bAction *act)
+{
+       TimeMarker *marker;
+       int low=0, high=0;
+       
+       /* sanity checks */
+       if (ELEM(NULL, act, act->markers.first)) return 1;
+       
+       /* loop over poses finding various values (poses are not stored in 
chronological order) */
+       for (marker= act->markers.first; marker; marker= marker->next) {
+               /* only increase low if value is 1 greater than low, to find 
"gaps" where
+                * poses were removed from the poselib
+                */
+               if (marker->frame == (low + 1)) 
+                       low++;
+               
+               /* value replaces high if it is the highest value encountered 
yet */
+               if (marker->frame > high) 
+                       high= marker->frame;
+       }
+       
+       /* - if low is not equal to high, then low+1 is a gap 
+        * - if low is equal to high, then high+1 is the next index (add at 
end) 
+        */
+       if (low < high) 
+               return (low + 1);
+       else 
+               return (high + 1);
+}
+
+/* returns the active pose for a poselib */
+TimeMarker *poselib_get_active_pose (bAction *act)
+{      
+       if ((act) && (act->active_marker))
+               return BLI_findlink(&act->markers, act->active_marker-1);
+       else
+               return NULL;
+}
+
+/* ************************************************************* */
+
+/* Initialise a new poselib (whether it is needed or not) */
+bAction *poselib_init_new (Object *ob)
+{
+       /* sanity checks - only for armatures */
+       if (ELEM(NULL, ob, ob->pose))
+               return NULL;
+       
+       /* init object's poselib action (unlink old one if there) */
+       if (ob->poselib)
+               ob->poselib->id.us--;
+       ob->poselib= add_empty_action("PoseLib");
+       
+       return ob->poselib;
+}
+
+/* Initialise a new poselib (checks if that needs to happen) */
+bAction *poselib_validate (Object *ob)
+{
+       if (ELEM(NULL, ob, ob->pose))
+               return NULL;
+       else if (ob->poselib == NULL)
+               return poselib_init_new(ob);
+       else
+               return ob->poselib;
+}
+
+
+/* This tool automagically generates/validates poselib data so that it 
corresponds to the data 
+ * in the action. This is for use in making existing actions usable as 
poselibs.
+ */
+void poselib_validate_act (bAction *act)
+{
+       ListBase keys = {NULL, NULL};
+       ActKeyColumn *ak;
+       TimeMarker *marker, *markern;
+       
+       /* validate action and poselib */
+       if (act == NULL)  {
+               error("No Action to validate");
+               return;
+       }
+       
+       /* determine which frames have keys */
+       action_to_keylist(act, &keys, NULL, NULL);
+       
+       /* for each key, make sure there is a correspnding pose */
+       for (ak= keys.first; ak; ak= ak->next) {
+               /* check if any pose matches this */
+               for (marker= act->markers.first; marker; marker= marker->next) {
+                       if (IS_EQ(marker->frame, ak->cfra)) {
+                               marker->flag = -1;
+                               break;
+                       }
+               }
+               
+               /* add new if none found */
+               if (marker == NULL) {
+                       char name[64];
+                       
+                       /* add pose to poselib */
+                       marker= MEM_callocN(sizeof(TimeMarker), "ActionMarker");
+                       
+                       strcpy(name, "Pose");
+                       BLI_strncpy(marker->name, name, sizeof(marker->name));
+                       
+                       marker->frame= (int)ak->cfra;
+                       marker->flag= -1;
+                       
+                       BLI_addtail(&act->markers, marker);
+               }
+       }
+       
+       /* remove all untagged poses (unused), and remove all tags */
+       for (marker= act->markers.first; marker; marker= markern) {
+               markern= marker->next;
+               
+               if (marker->flag != -1)
+                       BLI_freelinkN(&act->markers, marker);
+               else
+                       marker->flag = 0;
+       }
+       
+       /* free temp memory */
+       BLI_freelistN(&keys);
+       
+       BIF_undo_push("PoseLib Validate Action");
+}
+
+/* ************************************************************* */
+
+/* This function adds an ipo-curve of the right type where it's needed */
+static IpoCurve *poselib_verify_icu (Ipo *ipo, int adrcode)
+{
+       IpoCurve *icu;
+       
+       for (icu= ipo->curve.first; icu; icu= icu->next) {
+               if (icu->adrcode==adrcode) break;
+       }
+       if (icu==NULL) {
+               icu= MEM_callocN(sizeof(IpoCurve), "ipocurve");
+               
+               icu->flag |= IPO_VISIBLE|IPO_AUTO_HORIZ;
+               if (ipo->curve.first==NULL) icu->flag |= IPO_ACTIVE;    /* 
first one added active */
+               
+               icu->blocktype= ID_PO;
+               icu->adrcode= adrcode;
+               
+               set_icu_vars(icu);
+               
+               BLI_addtail(&ipo->curve, icu);
+       }
+       
+       return icu;
+}
+
+/* This tool adds the current pose to the poselib 
+ *     Note: Standard insertkey cannot be used for this due to its limitations
+ */
+void poselib_add_current_pose (Scene *scene, Object *ob, int val)
+{
+       bArmature *arm= (ob) ? ob->data : NULL;
+       bPose *pose= (ob) ? ob->pose : NULL;
+       bPoseChannel *pchan;
+       TimeMarker *marker;
+       bAction *act;
+       bActionChannel *achan;
+       IpoCurve *icu;
+       int frame;
+       char name[64];
+       
+       /* sanity check */
+       if (ELEM3(NULL, ob, arm, pose)) 
+               return;
+       
+       /* mode - add new or replace existing */
+       if (val == 0) {
+               if ((ob->poselib) && (ob->poselib->markers.first)) {
+                       val= pupmenu("PoseLib Add Current Pose%t|Add New%x1|Add 
New (Current Frame)%x3|Replace Existing%x2");
+                       if (val <= 0) return;
+               }
+               else 
+                       val= 1;
+       }
+       
+       if ((ob->poselib) && (val == 2)) {
+               char *menustr;
+               
+               /* get poselib */
+               act= ob->poselib;
+               
+               /* get the pose to replace */
+               menustr= poselib_build_poses_menu(act, "Replace PoseLib Pose");
+               val= pupmenu_col(menustr, 20);
+               if (menustr) MEM_freeN(menustr);
+               
+               if (val <= 0) return;
+               marker= BLI_findlink(&act->markers, val-1);
+               if (marker == NULL) return;
+               
+               /* get the frame from the poselib */
+               frame= marker->frame;
+       }
+       else {
+               /* get name of pose */
+               sprintf(name, "Pose");
+               if (sbutton(name, 0, sizeof(name)-1, "Name: ") == 0)
+                       return;
+                       
+               /* get/initialise poselib */
+               act= poselib_validate(ob);
+               
+               /* get frame */
+               if (val == 3)
+                       frame= CFRA;
+               else /* if (val == 1) */
+                       frame= poselib_get_free_index(act);
+               
+               /* add pose to poselib - replaces any existing pose there */
+               for (marker= act->markers.first; marker; marker= marker->next) {
+                       if (marker->frame == frame) {
+                               BLI_strncpy(marker->name, name, 
sizeof(marker->name));
+                               break;
+                       }
+               }

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