Following on from my commit to introduce frame ranges for FModifiers,
those frame ranges can now have blend in/out values. By setting a
blendin or blendout value, you're specifying the number of frames for
the modifier's "full influence" to take effect or fade out relative to
the start/end frames.
The "full influence" above needs a little clarification.
When the "use influence" setting is enabled, "full influence" is taken
from the "influence" slider (a new setting). Otherwise, it uses 1.0
(i.e. unmodified influence, same as old behaviour before the
introduction of influence controls). The influence slider basically
says how much the modifier's effects are allowed to contribute to the
final result.
---
Notes:
- This opt-in "Use Influence" approach is really forced upon us
because there are heaps of old files for which we cannot easily
version patch without spending some effort going through all the data
in the file, hunting out the F-Modifiers.
- interpf() seems to use a backwards order compared to everything else
Using this feature, it is now possible to for example have different
noise-profiles for different parts of a curve, which makes it possible
to do animate camera shake for example.
Or perhaps, for having greater control of mixing and matching
different parts of F-Modifier effects, such as combining several
generator modifiers to get multi-case functions for instance.
See http://aligorith.blogspot.com/2011/06/gsoc11-fmodifier-range-
masks.html for details.
Not really a "bug", but it was on my todo anyways. Based on patch
[#26508] by Campbell, with a few modifications including extending
this to the Action/DopeSheet editor too.
in RNA as "translation" values, which implies dimensionality is
incorrect here as F-Curves do not specifically "know" about the type
of the data they affect
While doing some animation work over the past few days, I found that
it would be useful to be able to tag keyframes as a another type yet:
"jitter" for fill-in secondary motion (i.e. blinks/hand-keyed camera
shake). Of course, what you really use these for is up to you, but
this is one more option when you need it :)
The problem was flag-enums were being treated as regular enums, a default value of 0 was using the first enum item, whereas with flag enums we want to be able to use 0 as a default value to specify all flags are off.
(rna flags were not available when this was originally written)
action.fcurves.add(frame, val, 1,1,1) --> .add(frame, val, {'REPLACE', 'NEEDED', 'FAST'})
Setting the group for F-Curves from the Py-API (i.e. to move F-Curves
from one group to another) was failing. After debugging this, this
functionality should now work correctly, while still prohibiting the
setting of groups on "F-Curves that aren't in actions" (i.e. driver-
fcurves)...
this missed some cases, now also disallow ints to be wrapped as floats.
This commit also exposed a number of cases where ints/floats were incorrectly wrapped.
Bugs like [#25416] wont slip through the cracks anymore.
only tags the ID and does the actual flush/update delayed, before the next
redraw. For objects the update was already delayed, just flushing wasn't
yet.
This should help performance in python and animation editors, by making
calls to RNA property update quicker. Still need to add calls in a few
places where this was previously avoided due to bad performance.
... fails if there were no keyframes in the curve yet. Was a missing null-check for case when no keyframe array is created.
Also, changed the description for the "replace" arg to better reflect what it really does.
Buttons for editing RNA paths/array index for F-Curves that aren't working are now actually functional. This means that when invalid paths are present, they can be manually fixed up.
- some remove() functions took an int argument rather then the item to remove.
- disallow None argument.
- raise an error if the item isnt in the collection.
These are not animated and are best not change names like this too late in the release.
ActionGroup.selected -> select: boolean Action Group is selected
BezierSplinePoint.hidden -> hide: boolean Visibility status
BezierSplinePoint.selected_control_point -> select_control_point: boolean Control point selection status
BezierSplinePoint.selected_handle1 -> select_left_handle: boolean Handle 1 selection status
BezierSplinePoint.selected_handle2 -> select_right_handle: boolean Handle 2 selection status
Bone.restrict_select -> hide_select: boolean Bone is able to be selected
Bone.selected -> select: boolean
CurveMapPoint.selected -> select: boolean Selection state of the curve point
EditBone.restrict_select -> hide_select: boolean Bone is able to be selected
EditBone.selected -> select: boolean
EditBone.selected_head -> select_head: boolean
EditBone.selected_tail -> select_tail: boolean
EditBone.locked -> lock: boolean Bone is not able to be transformed when in Edit Mode
EditBone.hidden -> hide: boolean Bone is not visible when in Edit Mode
NEGATE * FCurve.disabled -> enabled: boolean F-Curve could not be evaluated in past, so should be skipped when evaluating
FCurve.locked -> lock: boolean F-Curve's settings cannot be edited
FCurve.muted -> mute: boolean F-Curve is not evaluated
FCurve.selected -> select: boolean F-Curve is selected for editing
NEGATE * FCurve.visible -> hide: boolean F-Curve and its keyframes are shown in the Graph Editor graphs
FCurveSample.selected -> select: boolean Selection status
GPencilFrame.selected -> select: boolean Frame is selected for editing in the DopeSheet
GPencilLayer.locked -> lock: boolean Protect layer from further editing and/or frame changes
GPencilLayer.selected -> select: boolean Layer is selected for editing in the DopeSheet
Keyframe.selected -> select: boolean Control point selection status
Keyframe.selected_handle1 -> select_left_handle: boolean Handle 1 selection status
Keyframe.selected_handle2 -> select_right_handle: boolean Handle 2 selection status
MeshEdge.selected -> select: boolean
MeshEdge.hidden -> hide: boolean
MeshFace.hidden -> hide: boolean
MeshFace.selected -> select: boolean
MeshVertex.hidden -> hide: boolean
MeshVertex.selected -> select: boolean
MotionPathVert.selected -> select: boolean Path point is selected for editing
NlaStrip.selected -> select: boolean NLA Strip is selected
NlaTrack.locked -> lock: boolean NLA Track is locked
NlaTrack.muted -> mute: boolean NLA Track is not evaluated
NlaTrack.selected -> select: boolean NLA Track is selected
Object.restrict_render -> hide_render: boolean Restrict renderability
Object.restrict_select -> hide_select: boolean Restrict selection in the viewport
Object.restrict_view -> hide: boolean Restrict visibility in the viewport
Object.selected -> select: boolean Object selection state
ObjectBase.selected -> select: boolean Object base selection state
PoseBone.selected -> select: boolean
Sequence.right_handle_selected -> select_right_handle: boolean
Sequence.selected -> select: boolean
SplinePoint.selected -> select_control_point: boolean Selection status
TimelineMarker.selected -> select: boolean Marker selection state
Sequence.left_handle_selected -> select_left_handle: boolean
ActionGroup.locked -> lock: boolean Action Group is locked
Bone.hidden -> hide: boolean Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes)
SplinePoint.hidden -> hide: boolean Visibility status
FModifier.muted -> mute: boolean F-Curve Modifier will not be evaluated
note: rebaned uv_select to select_uv
- Added an optional string arg to struct.keyframe_insert() and struct.keyframe_delete() for the name of the group to add the keyframes to (for newly created F-Curves), instead of doing this as post process.
- Added error prints to the RNA function for setting an F-Curve's group. The old way of setting the groups afterwards couldn't be used anymore, since there was no way to find the action the F-Curve belonged to. This is necessary if the F-Curve list is to be kept in a valid state, since adding to any random group that may not be in the same Action does not work well. There were other issues with the list being iterated over changing while it was still being iterated over too...
TODO:
Find a way to allow the iterator there to still work ok?
create_mesh, create_dupli_list, make_display_list and is_visible.
This is done in order to make these context independent as the RNA API should
be as much as possible, and to fix#21297 and #21719, where there was an
assumption from these functions that there is a scene in the context, which
does not work for external render engines exporting in a separate thread.
Also avoided using context in a number of other functions, ideally only UI/WM
type functions should use context.
I've updated the scripts in trunk, but the addons and external ones in
development will need updates too.
* Fixed all the dangerous code added in 27907. Using the code there, scripters could corrupt animation files in ways which would render them useless, with channels not appearing in any animation editors, and others not getting evaluated at all.
* Partial fix of bug 21818, by disabling destructive replacement of keyframes. Will followup this commit with a more comprehensive commit which gets rid of the rest of the problems, by incorporating some requests from Durian team.
* Fixed problems with users being able to see+edit the name of the active Keying Set in the Scene buttons. There is still a bug though with the list widget given how the indices are now interpreted...
This commit started out aiming to make the "Stepped" F-Modifier (committed last night) even more useful, but ended up fixing a few other finer-points of how F-Modifiers work.
Firstly, the new stuff:
I've addded options to the Stepped F-Modifier to not affect frames before and/or after specified values, and renamed the 'start offset' to 'offset' for clarity.
The main objective of this is to allow Stepped F-Modifiers to only affect certain time ranges, so that by layering/using multiple instances of the F-Modifier, it can be possible to have multiple stepping-sizes.
This allows for effects like:
http://www.pasteall.org/blend/2230
or in words, it provides a convenient mechanism for animators to specify whether sections of the animation is shown "on twos", "fours", or even "forty-second-ths plus a smidgen", as can be easily done with 2D.
Assorted changes to support this:
* Properly fixed up how F-Modifiers that work with time, evaluate the time to evaluate the curve at. Now layered time effects like this should be possible in a much nicer way.
* Added proper value range validation/clamping to many properties. There are still a lot more that need checking, but at least more properties now do "the right thing".
* Copy/Paste operators for F-Modifiers
Available in Graph and NLA Editors. Use the Copy/Paste buttons beside the 'Add Modifier' buttons.
Copy copies all the modifiers of the ACTIVE F-Curve or Strip depending on the editor.
Paste pastes modifiers from the buffer to all the selected F-Curves or Strips, adding the new modifiers to the ends of each list.
* 'Stepped Interpolation' F-Modifier
This modifier holds each interpolated value from the F-Curve for several frames without changing the timing.
This allows to preview motions 'on-twos' for example without altering the timing, or having to go through setting heaps of keyframes. In this case, Andy wanted to use this for CG <-> StopMo.