From f57b4512af51010bcd21d11f39b5f915f9b3b3f3 Mon Sep 17 00:00:00 2001 From: spatialfree Date: Wed, 15 Jul 2020 14:32:16 -0700 Subject: [PATCH] Looper animation system for asset space *jank design --- Assets/Scenes/Main.unity | 2 +- Assets/Scripts/AssetSpace.cs | 141 +++++++++++++++++++---------------- 2 files changed, 78 insertions(+), 65 deletions(-) diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index e1e5c10..d47b59e 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -260,7 +260,7 @@ MonoBehaviour: type: 3} meshToolEraser: {fileID: -2868880653068191277, guid: dc6240c783ee7974e8811c10e071e0cc, type: 3} - scene: 1 + scene: 0 --- !u!1 &162671503 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/AssetSpace.cs b/Assets/Scripts/AssetSpace.cs index 63dfcbc..9f8160b 100644 --- a/Assets/Scripts/AssetSpace.cs +++ b/Assets/Scripts/AssetSpace.cs @@ -1,5 +1,6 @@ using UnityEngine; using System; +using System.Linq; using System.IO; using System.Collections; using System.Collections.Generic; @@ -14,6 +15,14 @@ public class AssetSpace public List loadedNames = new List(); public Dictionary assets = new Dictionary(); + // Animation + // Some discrete number of steps (frames) + // That are lerped through (one loop) + int frames = 24; + float loopTimeScale = 6f; + + float loopTime = 0; // 0-1 + public void Init(PolyVector polyVector) { // Update Mesh Dictionary @@ -21,7 +30,7 @@ public class AssetSpace loadedNames.Clear(); assets.Clear(); - string[] filePaths = Directory.GetFiles(folderPath, "*.pixelgon", SearchOption.TopDirectoryOnly); + string[] filePaths = Directory.GetFiles(folderPath, "*.json", SearchOption.TopDirectoryOnly); for (int i = 0; i < filePaths.Length; i++) { name = Path.GetFileNameWithoutExtension(filePaths[i]); @@ -30,8 +39,8 @@ public class AssetSpace Mesh mesh = new Mesh(); mesh = polyVector.ToMesh(pgon.vectors); Asset asset = new Asset(); - asset.pos = Vector3.zero; - asset.rot = Quaternion.identity; + asset.pos = Enumerable.Repeat(Vector3.zero, frames).ToArray(); + asset.rot = Enumerable.Repeat(Quaternion.identity, frames).ToArray(); asset.mesh = mesh; assets.Add(name, asset); } @@ -40,57 +49,41 @@ public class AssetSpace } string held = null; - Vector3 grabOffset; - // Vector3 oldCursorPos; Quaternion oldOffConRot; public void Frame(Input input, Render render) { + // Looper + loopTime += Time.deltaTime / loopTimeScale; + if (loopTime >= 1) { loopTime = 0; } + + float frameDelta = loopTime * (frames - 1); // 0.1 * 24 = 2.4 + int currentFrame = Mathf.FloorToInt(frameDelta); // 2.4 -> 2 (for index) + frameDelta = frameDelta - currentFrame; // 2.4 - 2 = 0.4 (for lerp delta t) + + Vector3 cursorPos = input.stretchCursor; - // instead of a rigid uniform list - // make it a space where you can lay things out - float closest = 1000f; - for (int i = 0; i < loadedNames.Count; i++) - { - Asset asset = assets[loadedNames[i]]; - Graphics.DrawMesh(asset.mesh, - asset.pos, asset.rot, - render.polyVector.matVector, 0 - ); - - if (input.mainCon.trigger.down) - { - float reachDist = Vector3.Distance(asset.pos, cursorPos); - if (reachDist < closest) - { - held = loadedNames[i]; - closest = reachDist; - grabOffset = asset.pos - cursorPos; - } - } - } - - if (input.mainCon.trigger.held) { if (held != null) { - if (input.mainCon.one.up) + Asset asset = assets[held]; + + if (input.mainCon.one.down) { - grabOffset = assets[held].pos - cursorPos; + // switch to pixelgon scene to edit } - if (input.mainCon.one.held) - { - Quaternion rotDelta = input.offCon.physical.Rot() * Quaternion.Inverse(oldOffConRot); - assets[held].rot = rotDelta * assets[held].rot; - // assets[held].rot *= Quaternion.LookRotation(cursorPos - assets[held].pos) * - // Quaternion.Inverse(Quaternion.LookRotation(oldCursorPos - assets[held].pos)); + asset.pos[currentFrame] = cursorPos; - } - else - { - assets[held].pos = cursorPos + grabOffset; - } + asset.pos[frames - 1] = Vector3.Lerp(asset.pos[0], asset.pos[frames - 2], 0.5f); + + // Quaternion rotDelta = input.offCon.physical.Rot() * Quaternion.Inverse(oldOffConRot); + // assets[held].rot = rotDelta * assets[held].rot; + + Graphics.DrawMesh(asset.mesh, + cursorPos, asset.rot[currentFrame], + render.polyVector.matVector, 0 + ); } } else @@ -98,27 +91,47 @@ public class AssetSpace held = null; } + float closest = 1000f; + int closestIndex = -1; + for (int i = 0; i < loadedNames.Count; i++) + { + Asset asset = assets[loadedNames[i]]; + + Vector3 assetPos = Vector3.Lerp(asset.pos[currentFrame], asset.pos[currentFrame + 1], frameDelta); + Quaternion assetRot = Quaternion.Lerp(asset.rot[currentFrame], asset.rot[currentFrame + 1], frameDelta); + + if (loadedNames[i] != held) + { + Graphics.DrawMesh(asset.mesh, + assetPos, assetRot, + render.polyVector.matVector, 0 + ); + } + + float reachDist = Vector3.Distance(assetPos, cursorPos); + if (reachDist < closest) + { + closest = reachDist; + closestIndex = i; + } + } + + if (closestIndex > -1) + { + if (input.mainCon.trigger.down) + { + held = loadedNames[closestIndex]; + + Asset asset = assets[held]; + for (int i = 0; i < asset.pos.Length; i++) + { + asset.pos[i] = cursorPos; + } + } + } + + oldOffConRot = input.offCon.physical.Rot(); - // oldCursorPos = cursorPos; - - // where to store persistent position and rotation? - // needs to be saved in the .pixelgon file then - // can assetspace have its own save file instead? - // store the name pos and rotation ++animationPath - // Later you can have multiple persistent spaces - - - // stream lining features *just manually do it in the unity inspector for now - // and switch to editing a certain object - // buttons in the oriel? - - // set name - // asset names (no renaming just save new or over, manually delete the deprecated) - // save - // load - - // recordable motion paths - // control over time } public void Save(Pixelgon pixelgon) @@ -184,6 +197,6 @@ public class AssetSpace public class Asset { public Mesh mesh; - public Vector3 pos; - public Quaternion rot; + public Vector3[] pos; + public Quaternion[] rot; } \ No newline at end of file