|  | @@ -514,6 +514,12 @@ void* laget_FirstDriverPage(void* unused, void* unused2){
 | 
	
		
			
				|  |  |  void* laget_CurrentRackPage(laRackPageCollection* c){
 | 
	
		
			
				|  |  |      return c->CurrentPage;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +void* laget_CurrentAnimationAction(laAnimation* a){
 | 
	
		
			
				|  |  | +    return a->CurrentAction;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +void* laset_CurrentAnimationAction(laAnimation* a, laAction* c){
 | 
	
		
			
				|  |  | +    memAssignRef(a,&a->CurrentAction,c);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void laset_WindowColorSpace(laWindow* w, int space){
 | 
	
		
			
				|  |  |      w->OutputColorSpace=space; if(w->win) laRedrawCurrentWindow();
 | 
	
	
		
			
				|  | @@ -826,6 +832,10 @@ laPropContainer* tnsget_ObjectType(tnsObject* o){
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +int laget_AnimationActionCurrentFrame(laAction* aa){
 | 
	
		
			
				|  |  | +    return (aa->PlayHead*(real)aa->FrameCount+0.5);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void lareset_Main(void* Unused){
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -1003,12 +1013,7 @@ void la_RegisterInternalProps(){
 | 
	
		
			
				|  |  |              laAddSubGroup(p, "input_mapping", "Input Mapping", "Input mapping page collection","la_input_mapping_collection",0,0,0,offsetof(LA,InputMapping),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
	
		
			
				|  |  |              laAddSubGroup(p, "drivers", "Drivers", "Driver page collection","la_driver_collection",0,0,0,offsetof(LA,Drivers),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            laAddSubGroup(p, "actions", "Actions", "All animation actions","la_animation_action",0,0,0,-1,0,0,0,0,0,0,offsetof(LA,Actions),0);
 | 
	
		
			
				|  |  | -            laAddFloatProperty(p, "animation_play_head","Play Head","Animation viewer global playhead",0,0,"s",0,0,0.1,0,0,offsetof(LA,AnimationPlayHead),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  | -            ep=laAddEnumProperty(p, "animation_play_status", "Play Status", "Animation viewer global play status", 0,0,0,0,0,offsetof(LA, AnimationPlayStatus),0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  | -            laAddEnumItemAs(ep, "PAUSED", "Paused", "Animation is playing", LA_ANIMATION_STATUS_PAUSED, U'⏸');
 | 
	
		
			
				|  |  | -            laAddEnumItemAs(ep, "PLAY_FWD", "Playing", "File data is untouched", LA_ANIMATION_STATUS_PLAY_FWD,U'▶');
 | 
	
		
			
				|  |  | -            laAddEnumItemAs(ep, "PLAY_REV", "Reversing", "File data is untouched", LA_ANIMATION_STATUS_PLAY_REV,U'◀');
 | 
	
		
			
				|  |  | +            laAddSubGroup(p, "animation", "Animation", "Animation data","la_animation",0,0,0,offsetof(LA,Animation),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              laAddStringProperty(p, "identifier", "Identifier", "Identifier", 0,0,0,0,0,0,0,laget_MainIdentifier, 0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
 | 
	
		
			
				|  |  |              laAddSubGroup(p, "test_ucn", "TEST UCN", "---", "udf_content_node",0,0,0,offsetof(LA, TEST_Link), 0,0,0,0,0,0,0,0);
 | 
	
	
		
			
				|  | @@ -1407,12 +1412,38 @@ void la_RegisterInternalProps(){
 | 
	
		
			
				|  |  |              laAddStringProperty(p, "rename", "Rename", "Rename", 0,0,0,0,0,offsetof(laProp, Identifier), 0,0,0,laread_DetachedPropRename, 0);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        p = laAddPropertyContainer("la_animation", "Animation", "Animation data",0,0,sizeof(laAnimation),0,0,1);{
 | 
	
		
			
				|  |  | +            laAddSubGroup(p, "actions", "Actions", "All animation actions","la_animation_action",0,0,0,-1,0,laget_CurrentAnimationAction,0,laset_CurrentAnimationAction,0,0,offsetof(laAnimation,Actions),0);
 | 
	
		
			
				|  |  | +            laAddSubGroup(p, "current_action", "Current Action", "Current action","la_animation_action",0,0,0,offsetof(laAnimation,CurrentAction),0,0,0,0,0,0,0,LA_UDF_REFER);
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            laAddFloatProperty(p, "play_head","Play Head","Animation viewer global playhead",0,0,"s",0,0,0.1,0,0,offsetof(laAnimation,PlayHead),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  | +            ep=laAddEnumProperty(p, "play_status", "Play Status", "Animation viewer global play status", 0,0,0,0,0,offsetof(laAnimation, PlayStatus),0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  | +            laAddEnumItemAs(ep, "PAUSED", "Paused", "Animation is playing", LA_ANIMATION_STATUS_PAUSED, U'⏸');
 | 
	
		
			
				|  |  | +            laAddEnumItemAs(ep, "PLAY_FWD", "Playing", "File data is untouched", LA_ANIMATION_STATUS_PLAY_FWD,U'▶');
 | 
	
		
			
				|  |  | +            laAddEnumItemAs(ep, "PLAY_REV", "Reversing", "File data is untouched", LA_ANIMATION_STATUS_PLAY_REV,U'◀');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          p = laAddPropertyContainer("la_animation_action", "Action", "Animation action",0,0,sizeof(laAction),0,0,1);{
 | 
	
		
			
				|  |  |              laAddStringProperty(p,"name","Name","Name of the action",0,0,0,0,1,offsetof(laAction,Name),0,0,0,0,LA_AS_IDENTIFIER);
 | 
	
		
			
				|  |  |              laAddSubGroup(p, "channels", "Channels", "Action channels", "la_animation_channel",0,0,0,-1,0,0,0,0,0,0,offsetof(laAction, Channels),0);
 | 
	
		
			
				|  |  | -            laAddFloatProperty(p, "length","Length","Length of the action in seconds",0,0,"s",40,0,0.1,5,0,offsetof(laAction,Length),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  | -            laAddFloatProperty(p, "play_head","Play Head","PlayHead position",0,0,"s",30,0,0.1,5,0,offsetof(laAction,PlayHead),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  | +            laAddFloatProperty(p, "length","Length","Length of the action in seconds",0,0,"s",30,0,0.1,5,0,offsetof(laAction,Length),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  | +            laAddFloatProperty(p, "play_head","Play Head","Play Head position",0,0,0,1.0,0,0.01,0,0,offsetof(laAction,PlayHead),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  | +            laAddFloatProperty(p, "offset","Offset","Play head offset from global timing",0,0,0,1.0,0,0.01,0,0,offsetof(laAction,Offset),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  |              laAddIntProperty(p, "frame_count","Frame Count","Total frame count in the whole length of the action",0,0,0,0,0,0,120,0,offsetof(laAction,FrameCount),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  | +            laAddIntProperty(p, "current_frame","Current Frame","Current frame in this action",0,0,0,0,0,0,0,0,0,laget_AnimationActionCurrentFrame,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
 | 
	
		
			
				|  |  | +            ep = laAddEnumProperty(p, "mute", "Mute", "Mute this action", 0,0,0,0,0,offsetof(laAction, Mute),0,0,0,0,0,0,0,0,0,0);{
 | 
	
		
			
				|  |  | +                laAddEnumItemAs(ep, "NONE", "None", "Not muted", 0,U'M');
 | 
	
		
			
				|  |  | +                laAddEnumItemAs(ep, "MUTE", "Mute", "Muted", 1,U'🄼');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            ep = laAddEnumProperty(p, "solo", "Solo", "Solo play this action", 0,0,0,0,0,offsetof(laAction, Solo),0,0,0,0,0,0,0,0,0,0);{
 | 
	
		
			
				|  |  | +                laAddEnumItemAs(ep, "NONE", "None", "Play this action with", 0,U'S');
 | 
	
		
			
				|  |  | +                laAddEnumItemAs(ep, "SOLO", "Solo", "Solo play", 1,U'🅂');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            ep = laAddEnumProperty(p, "play_mode", "Play Mode", "How to play this action", 0,0,0,0,0,offsetof(laAction, PlayMode),0,0,0,0,0,0,0,0,0,0);{
 | 
	
		
			
				|  |  | +                laAddEnumItemAs(ep, "REPEAT", "Repeat", "Play action in repeat", LA_ANIMATION_PLAY_MODE_REPEAT, U'⮆');
 | 
	
		
			
				|  |  | +                laAddEnumItemAs(ep, "HOLD", "Hold", "Hold end values when time is outside time range", LA_ANIMATION_PLAY_MODE_HOLD,U'⭲');
 | 
	
		
			
				|  |  | +                laAddEnumItemAs(ep, "BOUNCE", "Bounce", "Play action back and forth", LA_ANIMATION_PLAY_MODE_BOUNCE,U'⮀');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          p = laAddPropertyContainer("la_animation_channel", "Channel", "Animation channel",0,0,sizeof(laAnimationChannel),0,0,1);{
 | 
	
		
			
				|  |  |              laAddSubGroup(p, "keys", "Keys", "Key Frames", "la_animation_key",0,0,0,-1,0,0,0,0,0,0,offsetof(laAnimationChannel, Keys),0);
 |