利用者:Koilz/2.66.00 code review NLA Editor
目次
- 1 13.03.16: NLA Editor
- 2 13.03.20: problems
- 3 13.03.21: what do people do
- 4 13.03.16: Nla Editor vs Composer
- 5 13.03.16: NlaTest
- 6 13.03.20: NlaStrips
- 7 13.03.20: Sync Action Length
- 8 13.03.20: copy set new NlaStrip Action
- 9 13.03.20: no track
- 10 13.03.20: auto sync length
- 11 13.03.20: stack interpolation
- 12 13.03.20: Blend
- 13 13.03.22: mesh blend
- 14 13.03.22: blend
- 15 13.03.22: blend replace
- 16 13.03.22: tweak blend tab
- 17 13.03.24: Auto blend
- 18 :::::::: code ::::::::
- 19 13.03.16: c data
- 20 13.03.19: python data
- 21 13.03.19: c operators
13.03.16: NLA Editor
Nla Editor: None Linear Animation Editor.
these are some idears.
13.03.20: problems
make new action from current action
- this can be done.
auto sync length
- bool switch: auto sync length.
- bool switch: sync all strips with same action.
- problems with strips being to big.
blend interpolation
- not sure how it does it at the moment. but will need support for multiple strips.
change object
- should be ok.
smooth transition
- not sure about this yet. todo with transition between strips.
13.03.21: what do people do
- first usually, make an animation on the timeline, then freeze it.
- edit strip.
- duplicate strip.
- rename strip.
- bool switch: auto sync length.
- bool switch: sync all strips with same action.
- make new strip action from strip action.
- copy object[A].action to object[B].action then delete object[A].action.
- auto snap enum.
- folder feature, dont know what for: (00:00 youtube /watch?v=IBRqmeErOHU)
- its better for repetative game animations. or loop, like bird wings. or loop background animation.
- blend is used to blend animations. walk + duck = walk to duck walk. (5:00 & 9:00 & 10:20: youtube /watch?v=x2kkOROZPvE)
- repeats good.
- copy paste.
- mabey good to add code to move keyframe point in nlastrip tweak mode, like dopesheet editor.
13.03.16: Nla Editor vs Composer
With composers X is time. Y can have multiple modes.
Y Main
- Y is usually a sound effect, like a type of synth, for example a cat or dog sound.
- Moving the data block to the different track would change the sound of the notes.
Y Edit
- Composers usually have edit mode also, if its a MIDI, this is change the pitch of the notes.
- If its a raw sound signal, sometimes you can draw the signal.
- In this mode will not see any other data block.
NlaStrips are animation keyframes in a block.
Nla Editor in Main mode doesnt require an Y property.
- Sometimmes you may want to overlap animations or just move them about.
- So its better to keep it free from Y.
- Though it shouldnt be ruled out, mabey it code have different Main_modes.
13.03.16: NlaTest
I made two NlaStrips by by adding keyingsets then pressing freeze to turn them into NlaStrips.
Then i duplicated them.
NlaTracks
- NlaTrack
- NlaTrack.001
- NlaTrack.002
- NlaTrack.003
NlaStrips
- A
- A.001
- A.002
- A.003
- A..
- B
- B.001
- B.002
- B.003
- B..
Actions
- CubeAction
- CubeAction.001
Actions are the keyframes.
Transitional strips to process outer keyframes.
13.03.20: NlaStrips
The NlaStrips have Actions.
NlaTrack > NlaStrip > Action > Keyframes
When you duplicate the Strip it uses the same action.
To edit the keyframes of a NlaStrip enter Tweak Mode (TAB).
If you modify the action keyframes of one strip the other strips are modified.
13.03.20: Sync Action Length
You can sync the NlaStrip length with: Header: Edit: Sync Action Length.
This will set strip length for the strips selected.
13.03.20: copy set new NlaStrip Action
Make a NlaStrip Action unique (copy set).
- Properties: Animation Data: Brows Action to be linked.
- select the action you want to copy.
- this will add the action.keyframes to the timeline.
- press Properties: Animation Data: [+].
- this will make a new action with the same keyframes.
- press snowflake.
13.03.20: no track
13.03.20: auto sync length
auto sync length
- bool switch: auto sync length.
- bool switch: sync all strips with same action.
- problems with strips being to big.
bool switch: auto sync length.
comes with problems.
after editing if the strip maybe too big.
so two options, jump track, or be passive, this would be a bool switch.
if passive the track would be processed like an overlapping action.
13.03.20: stack interpolation
i think this is how to process multiple propeties.
this would be after each fcurve interpolation.
13.03.20: Blend
Not sure about this yet.
This is when keyframes Blend/interpolation.
Automaticly setup when NlaStrips overlap.
When blend is used on an NlaStrip, the NlaTrack becomes dominate.
So the next strip must be on the same track (mabey loop bug).
13.03.22: mesh blend
NLA Editor: Properties: Active Strip
Extrapolation and Blend, this is for mesh blending.
By default its on Replace.
Add will usually make the mesh bigger because there are two meshes it add them together.
Subtract will shrink the mesh.
Playback Settings:
Reversed, will play the strip backwards.
13.03.22: blend
lets say im auto blending these.
[ cube up ] bottom_left to bottom_right.
[cuberight] bottom_right to top_right.
with [ cube up ] blend starts at bottom and goes to top. 0 - 1.
with [cuberight] blend starts at top and goes to bottom. 1 - 0.
the auto blend creates a curve motion.
13.03.22: blend replace
move
- 2 keyframes
- Time 00.00 - 20.00
- X Location 0.0 - 5.0
- Y Location 0.0 - 0.0
- Z Location 0.0 - 0.0
- Auto Blend In/Out: off
- Blend In: 0.000
- Blend Out: 0.000
top
- 2 keyframes
- Time 05.00 - 15.00
- Z location 3.0 - 3.0
- Auto Blend In/Out: off
- Blend In: 5.000
- Blend Out: 5.000
time
- at time 0, 'move' has 1.0 influence.
- at time 5, 'top' starts to blend in.
- at time 10, 'top' replaces 'move'. 'top' has 1.0 influence, 'move' has 0.0 influence.
- at time 15, 'top' blends out and 'move' has 1.0 influence.
13.03.22: tweak blend tab
the nlastrip_action and nla_blend tabs would be shown in tweak mode (TAB).
nla00: the tracks would show strips for all objects in the scene.
with this one, be easier to change strip object.
nla01: object seperated version.
13.03.24: Auto blend
These work good.
The second one, 'left' is blending 'right' and 'right.001' at the same time.
:::::::: code ::::::::
13.03.16: c data
Note that keyframes and drivers are Fcurves (AnimData.drivers).
- Fcurves have a funny IO using ChannelDrivers and rna_path.
- BezTriple is the keyframe array.
Heres some branches not all.
----------------------------------------------------------------
AnimData
bAction *action; // bAction action /* active action - acts as the 'tweaking track' for the NLA */
/* temp-storage for the 'real' active action (i.e. the one used before the tweaking-action */
/* took over to be edited in the Animation Editors) */
bAction *tmpact; // bAction temp action
ListBase nla_tracks; // NlaTracks tracks /* nla-tracks */
NlaStrip *actstrip; // NlaStrip strip /* active NLA-strip (only set/used during tweaking, so no need to worry about dangling pointers) */
bAction
ListBase curves; // FCurve curves /* function-curves (FCurve) */
ListBase groups; // bActionGroup groups /* groups of function-curves (bActionGroup) */
NlaTrack
struct NlaTrack *next, *prev; // NlaTrack* next, prev
ListBase strips; // bActionStrips strips /* bActionStrips in this track */
char name[64]; // char name
NlaStrip
struct NlaStrip *next, *prev; // NlaStrip* next, prev
ListBase strips; // (NlaStrip,bActionStrips) strips /* 'Child' strips (used for 'meta' strips) */
bAction *act; // bAction* act /* Action that is referenced by this strip (strip is 'user' of the action) */
ListBase fcurves; // FCurve fcurves /* F-Curves for controlling this strip's influence and timing */ // TODO: move out?
char name[64]; // char name /* User-Visible Identifier for Strip */
float influence; // float influence /* Influence of strip */
float strip_time; // float strip_time /* Current 'time' within action being used (automatically evaluated, but can be overridden) */
float start, end; // float start, end /* extents of the strip */
float actstart, actend; // float actstart, actend /* range of the action to use */
float repeat; // float repeat /* The number of times to repeat the action range (only when no F-Curves) */
float scale; // float scale /* The amount the action range is scaled by (only when no F-Curves) */
float blendin, blendout; // float blendin, blendout /* strip blending length (only used when there are no F-Curves) */
short blendmode; // short blendmode /* strip blending mode (layer-based mixing) */
----------------------------------------------------------------
----------------------------------------------------------------
source/blender/makesdna/DNA_anim_types.h
FModifier
FMod_Generator
FMod_FunctionGenerator
FCM_EnvelopeData
FMod_Envelope
FMod_Cycles
FMod_Python
FMod_Limits
FMod_Noise
FMod_Stepped
DriverTarget
DriverVar
ChannelDriver
FPoint
FCurve
AnimMapPair
AnimMapper
NlaStrip
NlaTrack
KS_Path
KeyingSet
AnimOverride
AnimData
IdAdtTemplate
source/blender/makesdna/DNA_action_types.h
bMotionPathVert
bMotionPath
bAnimVizSettings
bPoseChannel
bPose
bIKParam
bItasc
bActionGroup
bAction
bDopeSheet
SpaceAction
bActionChannel
----------------------------------------------------------------
Python
----------------------------------------------------------------
bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].
bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].strips['A.002'].
--------
>>> bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].strips['A.002'].action
bpy.data.actions['CubeAction']
>>> bpy.data.actions['CubeAction'].fcurves[0].color
Color((0.0, 0.0, 0.0))
>>> bpy.data.actions['CubeAction'].fcurves[0].keyframe_points[0].co
Vector((7.0, -3.0))
>>> bpy.data.actions['CubeAction'].fcurves[0].keyframe_points[0].handle_left
Vector((2.05462646484375, -3.0))
>>> bpy.data.actions['CubeAction'].fcurves[0].keyframe_points[0].handle_right
Vector((11.94537353515625, -3.0))
--------
'CubeAction' has 3 keyframes.
>>> bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[0].co
Vector((7.0, 0.0))
>>> bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[1].co
Vector((20.0, 0.0))
>>> bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[2].co
Vector((59.0, 0.0))
>>> bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[3].co
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
IndexError: bpy_prop_collection[index]: index 3 out of range, size 3
----------------------------------------------------------------
13.03.19: python data
----------------------------------------------------------------
objects
nla_tracks
strips
action
group
channels
keyframe_points
action
group
channels
keyframe_points
----------------------------------------------------------------
----------------------------------------------------------------
# object track strip action
>>> bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].strips['A'].action
bpy.data.actions['CubeAction']
# first keyframe position
>>> bpy.data.actions['CubeAction'].frame_range[0]
7.0
# last keyframe position
>>> bpy.data.actions['CubeAction'].frame_range[1]
59.0
# channels
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8]
bpy.data.actions['CubeAction.002']...FCurve
channels are keying sets like LocRotScale
so channel[8] is 'Z Scale'
# type
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].type
'KEYFRAME'
# keyframe extrapolation
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].extrapolation
'CONSTANT'
# keyframe points
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1]
bpy.data.actions['CubeAction.002']...Keyframe
# point interpolation
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].interpolation
'BEZIER'
# point position
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].co
Vector((221.0, 1.0))
# point handle left
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].handle_left
Vector((202.65066528320312, 1.0))
# point handle right
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].handle_right
Vector((239.34933471679688, 1.0))
# point selected
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].select_control_point
True
# point handle selected
>>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].select_left_handle
True
----------------------------------------------------------------
13.03.19: c operators
// space_ops.c
----------------------------------------------------------------
/* view */
NLA_OT_properties
/* channels */
NLA_OT_channels_click
NLA_OT_tracks_add
NLA_OT_delete_tracks
/* select */
NLA_OT_click_select
NLA_OT_select_border
NLA_OT_select_all_toggle
NLA_OT_select_leftright
/* view */
NLA_OT_view_all
NLA_OT_view_selected
/* edit */
NLA_OT_tweakmode_enter
NLA_OT_tweakmode_exit // nla_edit.c
ot->exec = nlaedit_disable_tweakmode_exec; // nla_edit.c
ot->poll = nlaop_poll_tweakmode_on; // nla_edit.c
NLA_OT_actionclip_add
NLA_OT_transition_add
NLA_OT_soundclip_add
NLA_OT_meta_add
NLA_OT_meta_remove
NLA_OT_duplicate // nla_edit.c
ot->exec = nlaedit_duplicate_exec; // nla_edit.c
ot->poll = nlaop_poll_tweakmode_off; // nla_edit.c
NLA_OT_delete
NLA_OT_split
NLA_OT_mute_toggle
NLA_OT_swap
NLA_OT_move_up
NLA_OT_move_down
NLA_OT_action_sync_length // nla_edit.c
ot->exec = nlaedit_sync_actlen_exec; // nla_edit.c
ot->poll = ED_operator_nla_active; // nla_edit.c
NLA_OT_apply_scale
NLA_OT_clear_scale
NLA_OT_snap
NLA_OT_fmodifier_add
NLA_OT_fmodifier_copy
NLA_OT_fmodifier_paste
----------------------------------------------------------------