[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18135] branches/blender2.5/blender/source /blender: 2.5 - Action Editor / Animation Stuff:
Joshua Leung
aligorith at gmail.com
Mon Dec 29 02:19:27 CET 2008
Revision: 18135
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18135
Author: aligorith
Date: 2008-12-29 02:19:25 +0100 (Mon, 29 Dec 2008)
Log Message:
-----------
2.5 - Action Editor / Animation Stuff:
* Brought back clean (OKEY), sample (Shift-OKEY), and delete (XKEY/DELKEY) tools for the Action Editor.
Currently clean uses a predefined threshold (as a rna-prop, though it's still lacking the popup to set this when it is called)
* Added new file for 'destructive' keyframe operations/tools.
* Got keyframing.c compiling. Now, some of these tools need to be operatorised. Also, the API there might change when enough of the system is stable for RNA-IPO work to take place (so that it can be tested).
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/blenkernel/BKE_action.h
branches/blender2.5/blender/source/blender/blenkernel/intern/action.c
branches/blender2.5/blender/source/blender/editors/animation/anim_deps.c
branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c
branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h
branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h
branches/blender2.5/blender/source/blender/editors/include/ED_keyframing.h
branches/blender2.5/blender/source/blender/editors/space_action/action_edit_keyframes.c
branches/blender2.5/blender/source/blender/editors/space_action/action_header.c
branches/blender2.5/blender/source/blender/editors/space_action/action_intern.h
branches/blender2.5/blender/source/blender/editors/space_action/action_ops.c
branches/blender2.5/blender/source/blender/editors/space_action/action_select.c
branches/blender2.5/blender/source/blender/editors/space_outliner/space_outliner.c
branches/blender2.5/blender/source/blender/makesdna/DNA_userdef_types.h
Added Paths:
-----------
branches/blender2.5/blender/source/blender/editors/animation/keyframes_general.c
Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_action.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_action.h 2008-12-29 00:55:23 UTC (rev 18134)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_action.h 2008-12-29 01:19:25 UTC (rev 18135)
@@ -51,6 +51,7 @@
extern "C" {
#endif
+struct bAction *add_empty_action(const char name[]);
/**
* Removes and deallocates all channels from a pose.
Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/action.c 2008-12-29 00:55:23 UTC (rev 18134)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/action.c 2008-12-29 01:19:25 UTC (rev 18135)
@@ -81,6 +81,17 @@
/* ***************** Library data level operations on action ************** */
+bAction *add_empty_action(const char name[])
+{
+ bAction *act;
+
+ act= alloc_libblock(&G.main->action, ID_AC, name);
+ act->id.flag |= LIB_FAKEUSER;
+ act->id.us++;
+
+ return act;
+}
+
static void make_local_action_channels(bAction *act)
{
bActionChannel *chan;
Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_deps.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_deps.c 2008-12-29 00:55:23 UTC (rev 18134)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_deps.c 2008-12-29 01:19:25 UTC (rev 18135)
@@ -73,7 +73,7 @@
/* generic update flush, reads from context Screen (layers) and scene */
/* this is for compliancy, later it can do all windows etc */
-void ED_anim_dag_flush_update(bContext *C)
+void ED_anim_dag_flush_update(const bContext *C)
{
Scene *scene= CTX_data_scene(C);
bScreen *screen= CTX_wm_screen(C);
Modified: branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c 2008-12-29 00:55:23 UTC (rev 18134)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c 2008-12-29 01:19:25 UTC (rev 18135)
@@ -17,8 +17,7 @@
* 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 Copyright (C) 2008 Blender Foundation
*
* Contributor(s): Joshua Leung
*
@@ -30,6 +29,8 @@
#include <math.h>
#include <float.h>
+#include "MEM_guardedalloc.h"
+
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
Added: branches/blender2.5/blender/source/blender/editors/animation/keyframes_general.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframes_general.c (rev 0)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframes_general.c 2008-12-29 01:19:25 UTC (rev 18135)
@@ -0,0 +1,364 @@
+/**
+ * $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) 2008 Blender Foundation
+ * All rights reserved.
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "DNA_action_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_key_types.h"
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_action.h"
+#include "BKE_ipo.h"
+#include "BKE_key.h"
+#include "BKE_utildefines.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframing.h"
+#include "ED_keyframes_edit.h"
+
+/* This file contains code for various keyframe-editing tools which are 'destructive'
+ * (i.e. they will modify the order of the keyframes, and change the size of the array).
+ * While some of these tools may eventually be moved out into blenkernel, for now, it is
+ * fine to have these calls here.
+ *
+ * There are also a few tools here which cannot be easily coded for in the other system (yet).
+ * These may also be moved around at some point, but for now, they
+ *
+ * - Joshua Leung, Dec 2008
+ */
+
+/* **************************************************** */
+
+/* Only delete the nominated keyframe from provided ipo-curve.
+ * Not recommended to be used many times successively. For that
+ * there is delete_ipo_keys().
+ */
+void delete_icu_key(IpoCurve *icu, int index, short do_recalc)
+{
+ /* firstly check that index is valid */
+ if (index < 0)
+ index *= -1;
+ if (icu == NULL)
+ return;
+ if (index >= icu->totvert)
+ return;
+
+ /* Delete this key */
+ memmove(&icu->bezt[index], &icu->bezt[index+1], sizeof(BezTriple)*(icu->totvert-index-1));
+ icu->totvert--;
+
+ /* recalc handles - only if it won't cause problems */
+ if (do_recalc)
+ calchandles_ipocurve(icu);
+}
+
+/* Delete selected keyframes in given IPO block */
+void delete_ipo_keys(Ipo *ipo)
+{
+ IpoCurve *icu, *next;
+ int i;
+
+ if (ipo == NULL)
+ return;
+
+ for (icu= ipo->curve.first; icu; icu= next) {
+ /* store pointer to next ipo-curve, as we may delete the current one */
+ next = icu->next;
+
+ /* Delete selected BezTriples */
+ for (i=0; i<icu->totvert; i++) {
+ if (icu->bezt[i].f2 & SELECT) {
+ memmove(&icu->bezt[i], &icu->bezt[i+1], sizeof(BezTriple)*(icu->totvert-i-1));
+ icu->totvert--;
+ i--;
+ }
+ }
+
+ /* Only delete if there isn't an ipo-driver still hanging around on an empty curve */
+ if ((icu->totvert==0) && (icu->driver==NULL)) {
+ BLI_remlink(&ipo->curve, icu);
+ free_ipo_curve(icu);
+ }
+ }
+}
+
+/* ---------------- */
+
+/* duplicate selected keyframes for the given IPO block */
+void duplicate_ipo_keys(Ipo *ipo)
+{
+ IpoCurve *icu;
+ BezTriple *newbezt;
+ int i;
+
+ if (ipo == NULL)
+ return;
+
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ for (i=0; i<icu->totvert; i++) {
+ /* If a key is selected */
+ if (icu->bezt[i].f2 & SELECT) {
+ /* Expand the list */
+ newbezt = MEM_callocN(sizeof(BezTriple) * (icu->totvert+1), "beztriple");
+
+ memcpy(newbezt, icu->bezt, sizeof(BezTriple) * (i+1));
+ memcpy(newbezt+i+1, icu->bezt+i, sizeof(BezTriple));
+ memcpy(newbezt+i+2, icu->bezt+i+1, sizeof (BezTriple) *(icu->totvert-(i+1)));
+ icu->totvert++;
+
+ /* reassign pointers... (free old, and add new) */
+ MEM_freeN(icu->bezt);
+ icu->bezt=newbezt;
+
+ /* Unselect the current key*/
+ BEZ_DESEL(&icu->bezt[i]);
+ i++;
+
+ /* Select the copied key */
+ BEZ_SEL(&icu->bezt[i]);
+ }
+ }
+ }
+}
+
+/* **************************************************** */
+/* Various Tools */
+
+/* Basic IPO-Curve 'cleanup' function that removes 'double points' and unnecessary keyframes on linear-segments only */
+void clean_ipo_curve(IpoCurve *icu, float thresh)
+{
+ BezTriple *old_bezts, *bezt, *beztn;
+ BezTriple *lastb;
+ int totCount, i;
+
+ /* check if any points */
+ if ((icu == NULL) || (icu->totvert <= 1))
+ return;
+
+ /* make a copy of the old BezTriples, and clear IPO curve */
+ old_bezts = icu->bezt;
+ totCount = icu->totvert;
+ icu->bezt = NULL;
+ icu->totvert = 0;
+
+ /* now insert first keyframe, as it should be ok */
+ bezt = old_bezts;
+ insert_vert_icu(icu, bezt->vec[1][0], bezt->vec[1][1], 0);
+
+ /* Loop through BezTriples, comparing them. Skip any that do
+ * not fit the criteria for "ok" points.
+ */
+ for (i=1; i<totCount; i++) {
+ float prev[2], cur[2], next[2];
+
+ /* get BezTriples and their values */
+ if (i < (totCount - 1)) {
+ beztn = (old_bezts + (i+1));
+ next[0]= beztn->vec[1][0]; next[1]= beztn->vec[1][1];
+ }
+ else {
+ beztn = NULL;
+ next[0] = next[1] = 0.0f;
+ }
+ lastb= (icu->bezt + (icu->totvert - 1));
+ bezt= (old_bezts + i);
+
+ /* get references for quicker access */
+ prev[0] = lastb->vec[1][0]; prev[1] = lastb->vec[1][1];
+ cur[0] = bezt->vec[1][0]; cur[1] = bezt->vec[1][1];
+
+ /* check if current bezt occurs at same time as last ok */
+ if (IS_EQT(cur[0], prev[0], thresh)) {
+ /* If there is a next beztriple, and if occurs at the same time, only insert
+ * if there is a considerable distance between the points, and also if the
+ * current is further away than the next one is to the previous.
+ */
+ if (beztn && (IS_EQT(cur[0], next[0], thresh)) &&
+ (IS_EQT(next[1], prev[1], thresh)==0))
+ {
+ /* only add if current is further away from previous */
+ if (cur[1] > next[1]) {
+ if (IS_EQT(cur[1], prev[1], thresh) == 0) {
+ /* add new keyframe */
+ insert_vert_icu(icu, cur[0], cur[1], 0);
+ }
+ }
+ }
+ else {
+ /* only add if values are a considerable distance apart */
+ if (IS_EQT(cur[1], prev[1], thresh) == 0) {
+ /* add new keyframe */
+ insert_vert_icu(icu, cur[0], cur[1], 0);
+ }
+ }
+ }
+ else {
+ /* checks required are dependent on whether this is last keyframe or not */
+ if (beztn) {
+ /* does current have same value as previous and next? */
+ if (IS_EQT(cur[1], prev[1], thresh) == 0) {
+ /* add new keyframe*/
+ insert_vert_icu(icu, cur[0], cur[1], 0);
+ }
+ else if (IS_EQT(cur[1], next[1], thresh) == 0) {
+ /* add new keyframe */
+ insert_vert_icu(icu, cur[0], cur[1], 0);
+ }
+ }
+ else {
+ /* add if value doesn't equal that of previous */
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list