private void ImportFileSelected(string path) { if (string.IsNullOrEmpty(path)) { return; } try { var json = SuperController.singleton.LoadJSON(path); if (json["AtomType"]?.Value != plugin.containingAtom.type) { SuperController.LogError($"VamTimeline: Loaded animation for {json["AtomType"]} but current atom type is {plugin.containingAtom.type}"); return; } var jc = json.AsObject; if (jc.HasKey("ControllersState")) { var controllersState = jc["ControllersState"].AsObject; foreach (var k in controllersState.Keys) { var fc = plugin.containingAtom.freeControllers.FirstOrDefault(x => x.name == k); if (fc == null) { SuperController.LogError($"VamTimeline: Loaded animation had state for controller {k} but no such controller were found on this atom."); continue; } var state = controllersState[k]; fc.currentPositionState = (FreeControllerV3.PositionState)state["currentPositionState"].AsInt; fc.transform.localPosition = AtomAnimationSerializer.DeserializeVector3(state["localPosition"].AsObject); fc.currentRotationState = (FreeControllerV3.RotationState)state["currentRotationState"].AsInt; fc.transform.localRotation = AtomAnimationSerializer.DeserializeQuaternion(state["localRotation"].AsObject); } } plugin.serializer.DeserializeAnimation(animation, json.AsObject); var lastAnimation = animation.clips.Select(c => c.animationName).LastOrDefault(); // NOTE: Because the animation instance changes, we'll end up with the _old_ "current" not being updated. if (lastAnimation != animation.current.animationName) { plugin.ChangeAnimation(lastAnimation); } else { animation.SelectAnimation(lastAnimation); } animation.Sample(); } catch (Exception exc) { SuperController.LogError($"VamTimeline.{nameof(AdvancedKeyframeToolsScreen)}.{nameof(ImportFileSelected)}: Failed to import animation: {exc}"); } }
private void ImportFileSelected(string path) { if (string.IsNullOrEmpty(path)) { return; } try { var json = SuperController.singleton.LoadJSON(path); if (json["AtomType"]?.Value != plugin.containingAtom.type) { SuperController.LogError($"VamTimeline: Loaded animation for {json["AtomType"]} but current atom type is {plugin.containingAtom.type}"); return; } var jc = json.AsObject; if (jc.HasKey("ControllersState")) { var controllersState = jc["ControllersState"].AsObject; foreach (var k in controllersState.Keys) { var fc = plugin.containingAtom.freeControllers.FirstOrDefault(x => x.name == k); if (fc == null) { SuperController.LogError($"VamTimeline: Loaded animation had state for controller {k} but no such controller were found on this atom."); continue; } var state = controllersState[k]; fc.currentPositionState = (FreeControllerV3.PositionState)state["currentPositionState"].AsInt; fc.transform.localPosition = AtomAnimationSerializer.DeserializeVector3(state["localPosition"].AsObject); fc.currentRotationState = (FreeControllerV3.RotationState)state["currentRotationState"].AsInt; fc.transform.localRotation = AtomAnimationSerializer.DeserializeQuaternion(state["localRotation"].AsObject); } } plugin.Load(jc); plugin.ChangeAnimation(jc["Clips"][0]["AnimationName"].Value); plugin.animation.Stop(); } catch (Exception exc) { SuperController.LogError($"VamTimeline.{nameof(AdvancedScreen)}.{nameof(ImportFileSelected)}: Failed to import animation: {exc}"); } }
private void ImportControllerStates(JSONClass jc) { if (jc.HasKey("ControllersState")) { var controllersState = jc["ControllersState"].AsObject; foreach (var k in controllersState.Keys) { var fc = plugin.containingAtom.freeControllers.FirstOrDefault(x => x.name == k); if (fc == null) { SuperController.LogError($"Timeline: Loaded animation had state for controller {k} but no such controller were found on this atom."); continue; } var state = controllersState[k]; fc.currentPositionState = (FreeControllerV3.PositionState)state["currentPositionState"].AsInt; fc.transform.localPosition = AtomAnimationSerializer.DeserializeVector3(state["localPosition"].AsObject); fc.currentRotationState = (FreeControllerV3.RotationState)state["currentRotationState"].AsInt; fc.transform.localRotation = AtomAnimationSerializer.DeserializeQuaternion(state["localRotation"].AsObject); } } }