diff options
author | Joshua Leung <aligorith@gmail.com> | 2007-01-16 01:37:36 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2007-01-16 01:37:36 +0300 |
commit | 09bd5599393280536d0680ef3d879dd51f37ba2d (patch) | |
tree | 3aa0b1ab1ca58539542ec8fba7c424e7f6e5709f /source/blender/src/editipo_mods.c | |
parent | 71a503f31d9d15ae6e1a2f7d579bd28c677b4dd3 (diff) |
== Action Editor ==
Final tweaks to Snapping and Mirroring tools:
* Snap To Nearest Marker
* Mirror Values of Horizontal Axis
* Mirror Over Selected Marker
Diffstat (limited to 'source/blender/src/editipo_mods.c')
-rw-r--r-- | source/blender/src/editipo_mods.c | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/source/blender/src/editipo_mods.c b/source/blender/src/editipo_mods.c index 9c2aba3aa8b..8889a482c2d 100644 --- a/source/blender/src/editipo_mods.c +++ b/source/blender/src/editipo_mods.c @@ -564,6 +564,14 @@ static int snap_bezier_cframe(BezTriple *bezt) return 0; } +static int snap_bezier_nearmarker(BezTriple *bezt) +{ + if(bezt->f2 & SELECT) + bezt->vec[1][0]= (float)find_nearest_marker_time(bezt->vec[1][0]); + + return 0; +} + void snap_ipo_keys(Ipo *ipo, short snaptype) { switch (snaptype) { @@ -573,6 +581,9 @@ void snap_ipo_keys(Ipo *ipo, short snaptype) case 2: /* snap to current frame */ ipo_keys_bezier_loop(ipo, snap_bezier_cframe, calchandles_ipocurve); break; + case 3: /* snap to nearest marker */ + ipo_keys_bezier_loop(ipo, snap_bezier_nearmarker, calchandles_ipocurve); + break; default: /* just in case */ ipo_keys_bezier_loop(ipo, snap_bezier_nearest, calchandles_ipocurve); break; @@ -603,15 +614,80 @@ static int mirror_bezier_yaxis(BezTriple *bezt) return 0; } +static int mirror_bezier_xaxis(BezTriple *bezt) +{ + float diff; + + if(bezt->f2 & SELECT) { + diff= (0.0f - bezt->vec[1][1]); + bezt->vec[1][1]= (0.0f + diff); + } + + return 0; +} + +static int mirror_bezier_marker(BezTriple *bezt) +{ + static TimeMarker *marker; + static short initialised = 0; + float diff; + + /* In order for this mirror function to work without + * any extra arguments being added, we use the case + * of bezt==NULL to denote that we should find the + * marker to mirror over. The static pointer is safe + * to use this way, as it will be set to null after + * each cycle in which this is called. + */ + + if (bezt) { + /* mirroring time */ + if((bezt->f2 & SELECT) && (marker)) { + diff= (marker->frame - bezt->vec[1][0]); + bezt->vec[1][0]= (marker->frame + diff); + } + } + else { + /* initialisation time */ + if (initialised) { + /* reset everything for safety */ + marker = NULL; + initialised = 0; + } + else { + /* try to find a marker */ + for (marker= G.scene->markers.first; marker; marker=marker->next) { + if (marker->flag & SELECT) { + initialised = 1; + break; + } + } + + if (initialised == 0) + marker = NULL; + } + } + + return 0; +} + void mirror_ipo_keys(Ipo *ipo, short mirror_type) { switch (mirror_type) { case 1: /* mirror over current frame */ ipo_keys_bezier_loop(ipo, mirror_bezier_cframe, calchandles_ipocurve); break; - case 2: /* snap over frame 0 */ + case 2: /* mirror over frame 0 */ ipo_keys_bezier_loop(ipo, mirror_bezier_yaxis, calchandles_ipocurve); break; + case 3: /* mirror over value 0 */ + ipo_keys_bezier_loop(ipo, mirror_bezier_xaxis, calchandles_ipocurve); + break; + case 4: /* mirror over marker */ + mirror_bezier_marker(NULL); + ipo_keys_bezier_loop(ipo, mirror_bezier_marker, calchandles_ipocurve); + mirror_bezier_marker(NULL); + break; default: /* just in case */ ipo_keys_bezier_loop(ipo, mirror_bezier_yaxis, calchandles_ipocurve); break; |