public static void Load() { string settingsFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "IgniteVR", "Spark"); string filename = Path.Combine(settingsFolder, "camerawrite_settings.json"); string animationsFolder = Path.Combine(settingsFolder, "Animations"); try { // general settings file if (File.Exists(filename)) { string json = File.ReadAllText(filename); instance = JsonConvert.DeserializeObject <CameraWriteSettings>(json); } else { Console.WriteLine($"Settings file doesn't exist, creating."); instance = new CameraWriteSettings(); } } catch (Exception e) { Console.WriteLine($"Error reading settings file\n{e}"); instance = new CameraWriteSettings(); } try { // animation files if (!Directory.Exists(animationsFolder)) { Console.WriteLine("Animations folder doesn't exist, creating."); Directory.CreateDirectory(animationsFolder); } animations = new Dictionary <string, AnimationKeyframes>(); string[] files = Directory.GetFiles(animationsFolder); foreach (string file in files) { string json = File.ReadAllText(file); AnimationKeyframes anim = JsonConvert.DeserializeObject <AnimationKeyframes>(json); if (anim != null) { animations[Path.GetFileNameWithoutExtension(file)] = anim; } } } catch (Exception e) { Console.WriteLine($"Error reading animation files\n{e}"); } }
public BezierSpline(AnimationKeyframes animation) { List <CameraTransform> animKeyFrames = animation.keyframes; List <CameraTransform> currentCurve = new List <CameraTransform>(); curves = new List <BezierCurve>(); // add extra handles if (animKeyFrames.Count > 2) { // split each node in a set of triplets currentCurve.Add(animKeyFrames[0]); // loop through all keyframes except first and last for (int i = 1; i < animKeyFrames.Count - 1; i++) { Vector3 dir = animKeyFrames[i + 1].Position - animKeyFrames[i - 1].Position; Quaternion rotDiff = animKeyFrames[i + 1].Rotation - animKeyFrames[i - 1].Rotation; float fovDiff = animKeyFrames[i + 1].fovy ?? 1 - animKeyFrames[i - 1].fovy ?? 1; float divisionFactor = 6; float dist1 = Vector3.Distance(animKeyFrames[i + 1].Position, animKeyFrames[i].Position); float dist2 = Vector3.Distance(animKeyFrames[i - 1].Position, animKeyFrames[i].Position); if (Math.Min(dist1, dist2) / Math.Max(dist1, dist2) < .5f) { divisionFactor = 8; } CameraTransform handle1 = new CameraTransform( animKeyFrames[i].Position - dir / divisionFactor, // Quaternion.Lerp(keyframes[i - 1].Rotation, keyframes[i].Rotation, .5f) animKeyFrames[i].Rotation - rotDiff * .25f, animKeyFrames[i].fovy ?? 1 - fovDiff / divisionFactor ); CameraTransform handle2 = new CameraTransform( animKeyFrames[i].Position + dir / divisionFactor, // Quaternion.Lerp(keyframes[i].Rotation, keyframes[i + 1].Rotation, .5f) animKeyFrames[i].Rotation + rotDiff * .25f, animKeyFrames[i].fovy ?? 1 + fovDiff / divisionFactor ); currentCurve.Add(handle1); currentCurve.Add(animKeyFrames[i]); curves.Add(new BezierCurve(currentCurve)); currentCurve.Clear(); currentCurve.Add(animKeyFrames[i]); currentCurve.Add(handle2); } // add the last keyframe currentCurve.Add(animKeyFrames[^ 1]);