diff --git a/.gitattributes b/.gitattributes index ab65338..bab2c33 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,6 @@ # Normalize EOL for all files that Git considers text files. *.gd eol=lf +*.cs eol=lf *.tscn eol=lf *.cfg eol=lf *.godot eol=lf diff --git a/.github/workflows/build-on-push.yml b/.github/workflows/build-on-push.yml index 7c9c6b6..b275855 100644 --- a/.github/workflows/build-on-push.yml +++ b/.github/workflows/build-on-push.yml @@ -16,43 +16,85 @@ jobs: - name: Checkout uses: actions/checkout@v4 with: - path: demo/tilt-five-tools - - name: Create Tilt Five Tools plugin + path: src/tilt-five-tools + - name: Assemble Tilt Five Tools Plugin (GD) run: | - mkdir plugin - mkdir plugin/tilt-five-tools - mkdir plugin/tilt-five-tools/addons - cp -r demo/tilt-five-tools/addons/tiltfive_tools plugin/tilt-five-tools/addons - cp demo/tilt-five-tools/LICENSE plugin/tilt-five-tools/addons/tiltfive_tools - cp demo/tilt-five-tools/CONTRIBUTORS.md plugin/tilt-five-tools/addons/tiltfive_tools - cp demo/tilt-five-tools/VERSIONS.md plugin/tilt-five-tools/addons/tiltfive_tools - rm -rf demo/tilt-five-tools/.git - rm -rf demo/tilt-five-tools/.github - - name: Create Tilt Five Tools library artifact + mkdir plugin-gd + mkdir plugin-gd/tilt-five-tools + mkdir plugin-gd/tilt-five-tools/addons + cp -r src/tilt-five-tools/project.gd/addons/tiltfive_tools plugin-gd/tilt-five-tools/addons + cp src/tilt-five-tools/LICENSE plugin-gd/tilt-five-tools/addons/tiltfive_tools + cp src/tilt-five-tools/CONTRIBUTORS.md plugin-gd/tilt-five-tools/addons/tiltfive_tools + cp src/tilt-five-tools/VERSIONS.md plugin-gd/tilt-five-tools/addons/tiltfive_tools + - name: Assemble Tilt Five Tools Demo (GD) + run: | + mkdir demo-gd + mkdir demo-gd/tilt-five-tools-demo + cp -r src/tilt-five-tools/project.gd/. demo-gd/tilt-five-tools-demo + cp src/tilt-five-tools/LICENSE demo-gd/tilt-five-tools-demo + cp src/tilt-five-tools/CONTRIBUTORS.md demo-gd/tilt-five-tools-demo + cp src/tilt-five-tools/VERSIONS.md demo-gd/tilt-five-tools-demo + - name: Assemble Tilt Five Tools Plugin (C#) + run: | + mkdir plugin-csharp + mkdir plugin-csharp/tilt-five-tools + mkdir plugin-csharp/tilt-five-tools/addons + cp -r src/tilt-five-tools/project.csharp/addons/tiltfive_tools plugin-csharp/tilt-five-tools/addons + cp src/tilt-five-tools/LICENSE plugin-csharp/tilt-five-tools/addons/tiltfive_tools + cp src/tilt-five-tools/CONTRIBUTORS.md plugin-csharp/tilt-five-tools/addons/tiltfive_tools + cp src/tilt-five-tools/VERSIONS.md plugin-csharp/tilt-five-tools/addons/tiltfive_tools + - name: Assemble Tilt Five Tools Demo (C#) + run: | + mkdir demo-csharp + mkdir demo-csharp/tilt-five-tools-demo + cp -r src/tilt-five-tools/project.csharp/. demo-csharp/tilt-five-tools-demo + cp src/tilt-five-tools/LICENSE demo-csharp/tilt-five-tools-demo + cp src/tilt-five-tools/CONTRIBUTORS.md demo-csharp/tilt-five-tools-demo + cp src/tilt-five-tools/VERSIONS.md demo-csharp/tilt-five-tools-demo + - name: Create Tilt Five Tools library artifact (GD) + uses: actions/upload-artifact@v3 + with: + name: tilt-five-tools-gd + path: | + plugin-gd + - name: Create Tilt Five Tools demo artifact (GD) uses: actions/upload-artifact@v3 with: - name: tilt-five-tools + name: tilt-five-tools-demo-gd path: | - plugin - - name: Create Tilt Five Tools demo artifact + demo-gd + - name: Create Tilt Five Tools library artifact (C#) uses: actions/upload-artifact@v3 with: - name: tilt-five-tools-demo + name: tilt-five-tools-csharp path: | - demo + plugin-csharp + - name: Create Tilt Five Tools demo artifact (C#) + uses: actions/upload-artifact@v3 + with: + name: tilt-five-tools-demo-csharp + path: | + demo-csharp - name: Zip asset run: | - cd plugin - zip -qq -r ../tilt-five-tools.zip tilt-five-tools - cd ../demo - zip -qq -r ../tilt-five-tools-demo.zip tilt-five-tools + cd plugin-gd + zip -qq -r ../tilt-five-tools-gd.zip tilt-five-tools + cd .. + cd demo-gd + zip -qq -r ../tilt-five-tools-demo-gd.zip tilt-five-tools-demo + cd .. + cd plugin-csharp + zip -qq -r ../tilt-five-tools-csharp.zip tilt-five-tools + cd .. + cd demo-csharp + zip -qq -r ../tilt-five-tools-demo-csharp.zip tilt-five-tools-demo cd .. if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') - name: Create and upload asset uses: ncipollo/release-action@v1 with: allowUpdates: true - artifacts: "tilt-five-tools.zip,tilt-five-tools-demo.zip" + artifacts: "tilt-five-tools-gd.zip,tilt-five-tools-demo-gd.zip,tilt-five-tools-csharp.zip,tilt-five-tools-demo-csharp.zip" omitNameDuringUpdate: true omitBodyDuringUpdate: true token: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 72b9a16..19191c6 100644 --- a/README.md +++ b/README.md @@ -10,17 +10,25 @@ together with the [TiltFiveGodot4](https://github.com/GodotVR/TiltFiveGodot4) pl create Tilt Five games. -## How to Use +## Language support -The [Asset README](./addons/tiltfive_tools/README.md) contains: -- [General Concepts](./addons/tiltfive_tools/README.md#general-concepts) -- [Tool Components](./addons/tiltfive_tools/README.md#tilt-five-tool-components) -- [Frequently Asked Questions](./addons/tiltfive_tools/README.md#faq) +Tilt Five Tools has both gdscript and .NET versions with the same features. -## Demo +## How to Use (GDScript) -This repository contains a basic demo of the Tilt Five Tools features. +The [Asset README](./project.gd/addons/tiltfive_tools/README.md) contains: +- [General Concepts](./project.gd/addons/tiltfive_tools/README.md#general-concepts) +- [Tool Components](./project.gd/addons/tiltfive_tools/README.md#tilt-five-tool-components) +- [Frequently Asked Questions](./project.gd/addons/tiltfive_tools/README.md#faq) + + +## How to Use (.NET) + +The [Asset README](./project.csharp/addons/tiltfive_tools/README.md) contains: +- [General Concepts](./project.csharp/addons/tiltfive_tools/README.md#general-concepts) +- [Tool Components](./project.csharp/addons/tiltfive_tools/README.md#tilt-five-tool-components) +- [Frequently Asked Questions](./project.csharp/addons/tiltfive_tools/README.md#faq) ## Licensing diff --git a/project.csharp/.gitignore b/project.csharp/.gitignore new file mode 100644 index 0000000..7d75f70 --- /dev/null +++ b/project.csharp/.gitignore @@ -0,0 +1,7 @@ +# Godot 4+ specific ignores +.godot/ +.vs/ +.vscode/ +*.old +*.csproj +*.sln diff --git a/addons/tiltfive/CHANGES.md b/project.csharp/addons/tiltfive/CHANGES.md similarity index 100% rename from addons/tiltfive/CHANGES.md rename to project.csharp/addons/tiltfive/CHANGES.md diff --git a/addons/tiltfive/CONTRIBUTORS.md b/project.csharp/addons/tiltfive/CONTRIBUTORS.md similarity index 100% rename from addons/tiltfive/CONTRIBUTORS.md rename to project.csharp/addons/tiltfive/CONTRIBUTORS.md diff --git a/addons/tiltfive/LICENSE.txt b/project.csharp/addons/tiltfive/LICENSE.txt similarity index 100% rename from addons/tiltfive/LICENSE.txt rename to project.csharp/addons/tiltfive/LICENSE.txt diff --git a/project.csharp/addons/tiltfive/T5Def.cs b/project.csharp/addons/tiltfive/T5Def.cs new file mode 100644 index 0000000..b9ce787 --- /dev/null +++ b/project.csharp/addons/tiltfive/T5Def.cs @@ -0,0 +1,28 @@ +using Godot; +using System; + +public static class T5Def { + + public enum GameboardType + { + Unknown = 1, + LE = 2, + XE = 3, + XE_Raised = 4 + } + + // Buttons + public static StringName WAND_BUTTON_A = "button_a"; + public static StringName WAND_BUTTON_B = "button_b"; + public static StringName WAND_BUTTON_X = "button_x"; + public static StringName WAND_BUTTON_Y = "button_y"; + public static StringName WAND_BUTTON_1 = "button_1"; + public static StringName WAND_BUTTON_2 = "button_2"; + public static StringName WAND_BUTTON_STICK = "button_3"; + public static StringName WAND_BUTTON_T5 = "button_t5"; + public static StringName WAND_BUTTON_TRIGGER = "trigger_click"; + // Axis + public static StringName WAND_ANALOG_STICK = "stick"; + public static StringName WAND_ANALOG_TRIGGER = "trigger"; + +} diff --git a/project.csharp/addons/tiltfive/T5Interface.cs b/project.csharp/addons/tiltfive/T5Interface.cs new file mode 100644 index 0000000..ccf62aa --- /dev/null +++ b/project.csharp/addons/tiltfive/T5Interface.cs @@ -0,0 +1,246 @@ +using Godot; +using System; +using System.Collections.Generic; + +public partial class T5Interface : Node +{ + enum ServiceEventType + { + E_SERVICE_STOPPED = 1, + E_SERVICE_RUNNING = 2, + E_SERVICE_T5_UNAVAILABLE = 3, + E_SERVICE_T5_INCOMPATIBLE_VERSION = 4 + } + + enum GlassesEventType + { + E_GLASSES_ADDED = 1, + E_GLASSES_LOST = 2, + E_GLASSES_AVAILABLE = 3, + E_GLASSES_UNAVAILABLE = 4, + E_GLASSES_RESERVED = 5, + E_GLASSES_DROPPED = 6, + E_GLASSES_TRACKING = 7, + E_GLASSES_NOT_TRACKING = 8, + E_GLASSES_STOPPED_ON_ERROR = 9 + } + + // State of a set of glasses. + class XRRigState { + public bool available = false; + public bool attemptingToReserve = false; + public bool reserved = false; + + public T5XRRig rig; + public T5Def.GameboardType gameboardType; + + public bool CanAttemptToReserve { get { return available && !attemptingToReserve && !reserved; } } + } + + XRInterface xrInterface; + Dictionary glassesDictionary = new(); + + public T5ManagerInterface Manager { get; set; } + + public override void _EnterTree() + { + base._EnterTree(); + + xrInterface = ClassDB.Instantiate("TiltFiveXRInterface").As(); + + xrInterface.Set("application_id", T5ProjectSettings.ApplicationID); + xrInterface.Set("application_version", T5ProjectSettings.ApplicationVersion); + xrInterface.Set("trigger_click_threshold", T5ProjectSettings.TriggerClickThreshhold); + + XRServer.AddInterface(xrInterface as XRInterface); + + xrInterface.Connect("glasses_event", Callable.From(_OnGlassesEvent)); + xrInterface.Connect("service_event", Callable.From(_OnServiceEvent)); + } + + public override void _ExitTree() + { + xrInterface.Disconnect("service_event", Callable.From(_OnServiceEvent)); + xrInterface.Disconnect("glasses_event", Callable.From(_OnGlassesEvent)); + + if (xrInterface.Get("is_initialized").AsBool()) + { + xrInterface.Call("uninitialize"); + } + XRServer.RemoveInterface(xrInterface as XRInterface); + + base._ExitTree(); + } + + public override void _Ready() + { + base._Ready(); + + if(Manager == null) + { + GD.PrintErr("T5Interface does not have a manager set."); + return; + } + + if(!xrInterface.IsInitialized()) + { + xrInterface.Initialize(); + } + } + + void StartDisplay(string glassesID, T5XRRig xrRig) { + + xrInterface.Call("start_display", glassesID, xrRig, xrRig.Origin); + xrRig.Camera.Tracker = $"/user/{glassesID}/head"; + xrRig.Wand.Tracker = $"/user/{glassesID}/wand_1"; + } + + void ProcessGlasses() + { + foreach(var entry in glassesDictionary) + { + if(entry.Value.CanAttemptToReserve && Manager.ShouldUseGlasses(entry.Key)) + { + entry.Value.attemptingToReserve = true; + xrInterface.Call("reserve_glasses", entry.Key, Manager.GetUIDisplayName(entry.Key)); + } + } + } + + void _OnGlassesEvent(String glassesID, int eventNum) + { + XRRigState xrRigState; + if(!glassesDictionary.TryGetValue(glassesID, out xrRigState)) + { + xrRigState = new XRRigState(); + glassesDictionary.Add(glassesID, xrRigState); + } + + switch ((GlassesEventType)eventNum) + { + case GlassesEventType.E_GLASSES_ADDED: + { + GD.Print(glassesID, " E_GLASSES_ADDED"); + break; + } + case GlassesEventType.E_GLASSES_LOST: + { + GD.Print(glassesID, " E_GLASSES_LOST"); + break; + } + case GlassesEventType.E_GLASSES_AVAILABLE: + { + GD.Print(glassesID, " E_GLASSES_AVAILABLE"); + xrRigState.available = true; + ProcessGlasses(); + break; + } + case GlassesEventType.E_GLASSES_UNAVAILABLE: + { + GD.Print(glassesID, " E_GLASSES_UNAVAILABLE"); + xrRigState.available = false; + if(xrRigState.attemptingToReserve) + { + xrRigState.attemptingToReserve = false; + ProcessGlasses(); + } + break; + } + case GlassesEventType.E_GLASSES_RESERVED: + { + GD.Print(glassesID, " E_GLASSES_RESERVED"); + + xrRigState.reserved = true; + xrRigState.attemptingToReserve = false; + + var xrRig = Manager.CreateXRRig(glassesID); + + // instance our scene + if(xrRig != null) + { + xrRig.GlassesID = glassesID; + xrRigState.rig = xrRig; + StartDisplay(glassesID, xrRig); + } + else + { + xrInterface.Call("release_glasses", glassesID); + } + break; + } + case GlassesEventType.E_GLASSES_DROPPED: + { + GD.Print(glassesID, " E_DROPPED"); + + xrRigState.reserved = false; + xrRigState.attemptingToReserve = false; + + var xrRig = xrRigState.rig; + + if(xrRig != null) { + xrInterface.Call("stop_display", glassesID); + xrRigState.rig = null; + Manager.ReleaseXRRig(xrRig); + + } + break; + } + case GlassesEventType.E_GLASSES_TRACKING: + { + GD.Print(glassesID, " E_GLASSES_TRACKING"); + var gbt = xrInterface.Call("get_gameboard_type", glassesID).As(); + if(xrRigState.gameboardType != gbt) + { + xrRigState.gameboardType = gbt; + if(xrRigState.rig != null) + { + xrRigState.rig.GameboardType = gbt; + xrRigState.rig.GameboardSize = xrInterface.Call("get_gameboard_extents", (int)gbt).AsAabb(); + Manager.SetGameboardType(xrRigState.rig, gbt); + } + } + break; + } + case GlassesEventType.E_GLASSES_NOT_TRACKING: + { + GD.Print(glassesID, " E_GLASSES_NOT_TRACKING"); + break; + } + default: + { + GD.PrintErr(glassesID, " unknown event"); + break; + } + } + + } + + void _OnServiceEvent(int eventNum) + { + switch((ServiceEventType)eventNum) + { + case ServiceEventType.E_SERVICE_STOPPED: + { + Manager.ServiceStopped(); + break; + } + case ServiceEventType.E_SERVICE_RUNNING: + { + Manager.ServiceStarted(); + break; + } + case ServiceEventType.E_SERVICE_T5_UNAVAILABLE: + { + Manager.ServiceUnavailable(); + break; + } + case ServiceEventType.E_SERVICE_T5_INCOMPATIBLE_VERSION: + { + Manager.ServiceIncorrectVersion(); + break; + } + } + } + + +} diff --git a/project.csharp/addons/tiltfive/T5Manager.cs b/project.csharp/addons/tiltfive/T5Manager.cs new file mode 100644 index 0000000..7c981f2 --- /dev/null +++ b/project.csharp/addons/tiltfive/T5Manager.cs @@ -0,0 +1,111 @@ +using Godot; +using System; + +[GlobalClass] +public partial class T5Manager : Node, T5ManagerInterface +{ + [Signal] + public delegate void XRRigWasAddedEventHandler(T5XRRig rig); + + [Signal] + public delegate void XRRigWillBeRemovedEventHandler(T5XRRig rig); + + [Export] + public PackedScene xrRigScene; + + [Export] + public Node3D startLocation; + + Node3D rigs; + + T5Interface t5Interface; + + public override void _EnterTree() + { + base._EnterTree(); + + if (xrRigScene == null) + { + xrRigScene = (PackedScene)ResourceLoader.Load("res://addons/tiltfive/scenes/T5XRRig.tscn"); + } + + t5Interface = GetNode("/root/T5Interface"); + if (t5Interface != null) + { + t5Interface.Manager = this; + } + } + + public override void _ExitTree() + { + if(t5Interface != null) + { + t5Interface.Manager = null; + } + base._ExitTree(); + } + + public override void _Ready() + { + rigs = new Node3D(); + rigs.Name = "T5XRRigs"; + GetTree().Root.CallDeferred(MethodName.AddChild, rigs); + } + + public void ServiceStarted() + { + } + + public void ServiceStopped() + { + } + + public void ServiceUnavailable() + { + GD.PrintErr("Tilt Five Service is unavailable"); + } + + public void ServiceIncorrectVersion() + { + GD.PrintErr("Tilt Five Service version is incompatible"); + } + + public bool ShouldUseGlasses(string glassesID) + { + return true; + } + + public string GetUIDisplayName(string glassesID) + { + return T5ProjectSettings.DefaultDisplayName; + } + + public T5XRRig CreateXRRig(string glassesID) + { + var newRig = xrRigScene.Instantiate(); + newRig.Name = glassesID; + rigs.AddChild(newRig); + if(startLocation != null) + { + var origin = newRig.Origin; + origin.Transform = startLocation.Transform; + if(startLocation.IsClass("T5Gameboard")) { + var contentScale = startLocation.Get("content_scale").As(); + origin.Set("gameboard_scale", contentScale); + } + } + EmitSignal(SignalName.XRRigWasAdded, newRig); + return newRig; + } + + public void ReleaseXRRig(T5XRRig xrRig) + { + EmitSignal(SignalName.XRRigWillBeRemoved, xrRig); + rigs.RemoveChild(xrRig); + xrRig.QueueFree(); + } + + public void SetGameboardType(T5XRRig rig, T5Def.GameboardType gameboard_type) + { + } +} diff --git a/project.csharp/addons/tiltfive/T5ManagerInterface.cs b/project.csharp/addons/tiltfive/T5ManagerInterface.cs new file mode 100644 index 0000000..08c64ec --- /dev/null +++ b/project.csharp/addons/tiltfive/T5ManagerInterface.cs @@ -0,0 +1,55 @@ +// Interface for all T5Managers. Should not be used directly. +// +// Classes derived from T5ManagerBase implement these voidtions +// to customize the process of connecting the XR rigs in the scene +// to the Tilt Five glasses hardware that is found. +// +// These voidtions must be overridden +// +// create_glasses_scene +// release_glasses_scene +// get_glasses_scene_viewport +// get_glasses_scene_origin +// get_glasses_scene_camera +// get_glasses_scene_wand +// +// The derived node should be persistent. + +public interface T5ManagerInterface +{ + + // Invoked by T5Interface when the Tilt Five service has started + public void ServiceStarted(); + + // Invoked by T5Interface when the Tilt Five service has stopped + public void ServiceStopped(); + + // Invoked by T5Interface when the Tilt Five service is not available + // The driver might not be installed + public void ServiceUnavailable(); + + // Invoked by T5Interface when the Tilt Five service installed does + // not meet the minimum version requirements + public void ServiceIncorrectVersion(); + + // Invoked by the T5Interface to find out if the glasses should be used in + // game + public bool ShouldUseGlasses(string glassesID); + + // Invoked by the T5Interface to get the display name to be assigned to + // the glasses. This is the name that shows up in the Tilt Five control + // panel + public string GetUIDisplayName(string glassesID); + //return T5ProjectSettings.default_display_name + + // Invoked by the T5Interface to get the XR rig scene to be associated with + // tilt five glasses. This scene should contain a SubViewport -> T5Origin -> Camera3D and T5Controller3D(s) + public T5XRRig CreateXRRig(string glassesID); + + // Invoked by the T5Interface if the Tilt Five glasses become unavailable + public void ReleaseXRRig(T5XRRig xrRig); + + // Invoked by the T5Interface to set the gameboard type the Tilt Five glasses detected + public void SetGameboardType(T5XRRig rig, T5Def.GameboardType gameboard_type); +} + diff --git a/project.csharp/addons/tiltfive/T5ProjectSettings.cs b/project.csharp/addons/tiltfive/T5ProjectSettings.cs new file mode 100644 index 0000000..eda671d --- /dev/null +++ b/project.csharp/addons/tiltfive/T5ProjectSettings.cs @@ -0,0 +1,59 @@ +using Godot; +using System; + + +public static class T5ProjectSettings +{ + static bool isInitialized = false; + + static void DefineProjectSetting(String name, Variant.Type setting_type, PropertyHint hint, String hintString, Variant defaultValue) + { + if(!ProjectSettings.HasSetting(name)) + { + ProjectSettings.SetSetting(name, defaultValue); + } + + var propertyInfo = new Godot.Collections.Dictionary(); + + propertyInfo["name"] = name; + propertyInfo["type"] = (int)setting_type; + propertyInfo["hint"] = (int)hint; + propertyInfo["hint_string"] = hintString; + + ProjectSettings.AddPropertyInfo(propertyInfo); + ProjectSettings.SetAsBasic(name, true); + ProjectSettings.SetInitialValue(name, defaultValue); + } + + public static void setup_properties() { + if (!isInitialized) { + DefineProjectSetting("xr/tilt_five/application_id", Variant.Type.String, PropertyHint.None, "", "my.game.com"); + DefineProjectSetting("xr/tilt_five/application_version", Variant.Type.String, PropertyHint.None, "", "0.1.0"); + DefineProjectSetting("xr/tilt_five/default_display_name", Variant.Type.String, PropertyHint.None, "", "Game: Player One"); + DefineProjectSetting("xr/tilt_five/trigger_click_threshhold", Variant.Type.Float, PropertyHint.Range, "0,1,0.01", 0.3); + + isInitialized = true; + } + } + + public static String ApplicationID + { + get { setup_properties(); return ProjectSettings.GetSettingWithOverride("xr/tilt_five/application_id").AsString(); } + } + + public static String ApplicationVersion + { + get { setup_properties(); return ProjectSettings.GetSettingWithOverride("xr/tilt_five/application_version").AsString(); } + } + + public static String DefaultDisplayName + { + get { setup_properties(); return ProjectSettings.GetSettingWithOverride("xr/tilt_five/default_display_name").AsString(); } + } + + public static float TriggerClickThreshhold + { + get { setup_properties(); return (float)ProjectSettings.GetSettingWithOverride("xr/tilt_five/trigger_click_threshhold").AsDouble(); } + } +} + diff --git a/project.csharp/addons/tiltfive/assets/AutoScale.cs b/project.csharp/addons/tiltfive/assets/AutoScale.cs new file mode 100644 index 0000000..2d9910c --- /dev/null +++ b/project.csharp/addons/tiltfive/assets/AutoScale.cs @@ -0,0 +1,38 @@ +using Godot; +using System; + +public partial class AutoScale : Node3D +{ + T5OriginCS origin; + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + base._Ready(); + + var parent = GetParent(); + while(parent != null && !parent.IsClass("T5Origin3D")) + parent = parent.GetParent(); + + if(parent != null) + { + + origin = parent as T5OriginCS; + float scale = origin.GameboardScale; + Scale = new Vector3(scale, scale, scale); + origin.Connect("gameboard_scale_changed", Callable.From(OnGameboardScaleChanged)); + } + } + + public override void _ExitTree() + { + if(origin != null) + origin.Disconnect("gameboard_scale_changed", Callable.From(OnGameboardScaleChanged)); + origin = null; + base._ExitTree(); + } + + public void OnGameboardScaleChanged(float scale) + { + Scale = new Vector3(scale, scale, scale); + } +} diff --git a/addons/tiltfive/assets/T5-glasses.glb b/project.csharp/addons/tiltfive/assets/T5-glasses.glb similarity index 100% rename from addons/tiltfive/assets/T5-glasses.glb rename to project.csharp/addons/tiltfive/assets/T5-glasses.glb diff --git a/addons/tiltfive/assets/T5-glasses.glb.import b/project.csharp/addons/tiltfive/assets/T5-glasses.glb.import similarity index 100% rename from addons/tiltfive/assets/T5-glasses.glb.import rename to project.csharp/addons/tiltfive/assets/T5-glasses.glb.import diff --git a/addons/tiltfive/assets/T5-wand.glb b/project.csharp/addons/tiltfive/assets/T5-wand.glb similarity index 100% rename from addons/tiltfive/assets/T5-wand.glb rename to project.csharp/addons/tiltfive/assets/T5-wand.glb diff --git a/project.csharp/addons/tiltfive/assets/T5-wand.glb.import b/project.csharp/addons/tiltfive/assets/T5-wand.glb.import new file mode 100644 index 0000000..d1de8b3 --- /dev/null +++ b/project.csharp/addons/tiltfive/assets/T5-wand.glb.import @@ -0,0 +1,43 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bggv3rg34lcs6" +path="res://.godot/imported/T5-wand.glb-63815c4ecd00240c691007ffae3a6ad5.scn" + +[deps] + +source_file="res://addons/tiltfive/assets/T5-wand.glb" +dest_files=["res://.godot/imported/T5-wand.glb-63815c4ecd00240c691007ffae3a6ad5.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=0.5 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Black": { +"use_external/enabled": true, +"use_external/path": "res://addons/tiltfive/assets/materials/Black.tres" +}, +"White": { +"use_external/enabled": true, +"use_external/path": "res://addons/tiltfive/assets/materials/White.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/project.csharp/addons/tiltfive/assets/T5GlassesModel.tscn b/project.csharp/addons/tiltfive/assets/T5GlassesModel.tscn new file mode 100644 index 0000000..fbef794 --- /dev/null +++ b/project.csharp/addons/tiltfive/assets/T5GlassesModel.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://b1cd3jc00rhal"] + +[ext_resource type="PackedScene" uid="uid://c44ott7hdtkjs" path="res://addons/tiltfive/assets/T5-glasses.glb" id="1_22or3"] +[ext_resource type="Script" path="res://addons/tiltfive/assets/AutoScale.cs" id="2_mghk4"] + +[node name="T5-glasses" instance=ExtResource("1_22or3")] +script = ExtResource("2_mghk4") + +[node name="Cube" parent="." index="0"] +layers = 2 diff --git a/project.csharp/addons/tiltfive/assets/T5WandModel.tscn b/project.csharp/addons/tiltfive/assets/T5WandModel.tscn new file mode 100644 index 0000000..7bf98bc --- /dev/null +++ b/project.csharp/addons/tiltfive/assets/T5WandModel.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://fipea8dbocg4"] + +[ext_resource type="PackedScene" uid="uid://bggv3rg34lcs6" path="res://addons/tiltfive/assets/T5-wand.glb" id="1_rqv18"] +[ext_resource type="Script" path="res://addons/tiltfive/assets/AutoScale.cs" id="2_m6gly"] + +[node name="T5-wand" instance=ExtResource("1_rqv18")] +script = ExtResource("2_m6gly") + +[node name="Roundcube_001" parent="." index="0"] +layers = 2 diff --git a/addons/tiltfive/assets/T5_border.glb b/project.csharp/addons/tiltfive/assets/T5_border.glb similarity index 100% rename from addons/tiltfive/assets/T5_border.glb rename to project.csharp/addons/tiltfive/assets/T5_border.glb diff --git a/addons/tiltfive/assets/T5_border.glb.import b/project.csharp/addons/tiltfive/assets/T5_border.glb.import similarity index 100% rename from addons/tiltfive/assets/T5_border.glb.import rename to project.csharp/addons/tiltfive/assets/T5_border.glb.import diff --git a/addons/tiltfive/assets/T5_border_XE.glb b/project.csharp/addons/tiltfive/assets/T5_border_XE.glb similarity index 100% rename from addons/tiltfive/assets/T5_border_XE.glb rename to project.csharp/addons/tiltfive/assets/T5_border_XE.glb diff --git a/addons/tiltfive/assets/T5_border_XE.glb.import b/project.csharp/addons/tiltfive/assets/T5_border_XE.glb.import similarity index 100% rename from addons/tiltfive/assets/T5_border_XE.glb.import rename to project.csharp/addons/tiltfive/assets/T5_border_XE.glb.import diff --git a/addons/tiltfive/assets/T5_border_XE_raised.glb b/project.csharp/addons/tiltfive/assets/T5_border_XE_raised.glb similarity index 100% rename from addons/tiltfive/assets/T5_border_XE_raised.glb rename to project.csharp/addons/tiltfive/assets/T5_border_XE_raised.glb diff --git a/addons/tiltfive/assets/T5_border_XE_raised.glb.import b/project.csharp/addons/tiltfive/assets/T5_border_XE_raised.glb.import similarity index 100% rename from addons/tiltfive/assets/T5_border_XE_raised.glb.import rename to project.csharp/addons/tiltfive/assets/T5_border_XE_raised.glb.import diff --git a/addons/tiltfive/assets/board.svg b/project.csharp/addons/tiltfive/assets/board.svg similarity index 100% rename from addons/tiltfive/assets/board.svg rename to project.csharp/addons/tiltfive/assets/board.svg diff --git a/addons/tiltfive/assets/board.svg.import b/project.csharp/addons/tiltfive/assets/board.svg.import similarity index 100% rename from addons/tiltfive/assets/board.svg.import rename to project.csharp/addons/tiltfive/assets/board.svg.import diff --git a/addons/tiltfive/assets/glasses.svg b/project.csharp/addons/tiltfive/assets/glasses.svg similarity index 100% rename from addons/tiltfive/assets/glasses.svg rename to project.csharp/addons/tiltfive/assets/glasses.svg diff --git a/addons/tiltfive/assets/glasses.svg.import b/project.csharp/addons/tiltfive/assets/glasses.svg.import similarity index 100% rename from addons/tiltfive/assets/glasses.svg.import rename to project.csharp/addons/tiltfive/assets/glasses.svg.import diff --git a/addons/tiltfive/assets/materials/Black.tres b/project.csharp/addons/tiltfive/assets/materials/Black.tres similarity index 100% rename from addons/tiltfive/assets/materials/Black.tres rename to project.csharp/addons/tiltfive/assets/materials/Black.tres diff --git a/addons/tiltfive/assets/materials/T5BorderMat.tres b/project.csharp/addons/tiltfive/assets/materials/T5BorderMat.tres similarity index 100% rename from addons/tiltfive/assets/materials/T5BorderMat.tres rename to project.csharp/addons/tiltfive/assets/materials/T5BorderMat.tres diff --git a/addons/tiltfive/assets/materials/T5_border_tex.png b/project.csharp/addons/tiltfive/assets/materials/T5_border_tex.png similarity index 100% rename from addons/tiltfive/assets/materials/T5_border_tex.png rename to project.csharp/addons/tiltfive/assets/materials/T5_border_tex.png diff --git a/addons/tiltfive/assets/materials/T5_border_tex.png.import b/project.csharp/addons/tiltfive/assets/materials/T5_border_tex.png.import similarity index 100% rename from addons/tiltfive/assets/materials/T5_border_tex.png.import rename to project.csharp/addons/tiltfive/assets/materials/T5_border_tex.png.import diff --git a/addons/tiltfive/assets/materials/White.tres b/project.csharp/addons/tiltfive/assets/materials/White.tres similarity index 100% rename from addons/tiltfive/assets/materials/White.tres rename to project.csharp/addons/tiltfive/assets/materials/White.tres diff --git a/addons/tiltfive/bin/TiltFiveNative.dll b/project.csharp/addons/tiltfive/bin/TiltFiveNative.dll similarity index 100% rename from addons/tiltfive/bin/TiltFiveNative.dll rename to project.csharp/addons/tiltfive/bin/TiltFiveNative.dll diff --git a/addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll b/project.csharp/addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll similarity index 99% rename from addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll rename to project.csharp/addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll index ddb8dca..e731c80 100644 Binary files a/addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll and b/project.csharp/addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll differ diff --git a/addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll b/project.csharp/addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll similarity index 99% rename from addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll rename to project.csharp/addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll index 1f90fe7..620eaa9 100644 Binary files a/addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll and b/project.csharp/addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll differ diff --git a/project.csharp/addons/tiltfive/plugin.cfg b/project.csharp/addons/tiltfive/plugin.cfg new file mode 100644 index 0000000..3d8028a --- /dev/null +++ b/project.csharp/addons/tiltfive/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="tiltfive" +description="A plugin for interfacing with the Tilt Five AR glasses" +author="Patrick Down" +version="1.0.0" +script="plugin.cs" diff --git a/project.csharp/addons/tiltfive/plugin.cs b/project.csharp/addons/tiltfive/plugin.cs new file mode 100644 index 0000000..8839ab2 --- /dev/null +++ b/project.csharp/addons/tiltfive/plugin.cs @@ -0,0 +1,43 @@ +#if TOOLS +using Godot; +using System; + +[Tool] +public partial class plugin : EditorPlugin +{ + static bool isInitialized = false; + + private void Setup() + { + if (!isInitialized) + { + AddAutoloadSingleton("T5Interface", "res://addons/tiltfive/T5Interface.cs"); + isInitialized = true; + } + + } + + public override void _EnterTree() + { + T5ProjectSettings.setup_properties(); + Setup(); + + } + + public override void _EnablePlugin() + { + base._EnablePlugin(); + Setup(); + } + + public override void _DisablePlugin() + { + base._EnablePlugin(); + if(isInitialized) + { + RemoveAutoloadSingleton("T5Interface"); + isInitialized = false; + } + } +} +#endif diff --git a/project.csharp/addons/tiltfive/scenes/T5CameraCS.cs b/project.csharp/addons/tiltfive/scenes/T5CameraCS.cs new file mode 100644 index 0000000..19569b7 --- /dev/null +++ b/project.csharp/addons/tiltfive/scenes/T5CameraCS.cs @@ -0,0 +1,30 @@ +using Godot; +using System; + +public partial class T5CameraCS : Camera3D +{ + + public StringName Tracker { + get { + return Get("tracker").As(); + } + set { + Set("tracker", value); + } + } + + public bool getIsActive() + { + return Call("get_is_active").AsBool(); + } + + public bool getHasTrackingData() + { + return Call("get_has_tracking_data").AsBool(); + } + + public XRPose getPose() + { + return Call("get_pose").As(); + } +} diff --git a/project.csharp/addons/tiltfive/scenes/T5ControllerCS.cs b/project.csharp/addons/tiltfive/scenes/T5ControllerCS.cs new file mode 100644 index 0000000..d193560 --- /dev/null +++ b/project.csharp/addons/tiltfive/scenes/T5ControllerCS.cs @@ -0,0 +1,32 @@ +using Godot; +using System; + +[Tool] +public partial class T5ControllerCS : T5NodeCS +{ + + public void TriggerHapticPulse(float amplitude, int duration) + { + Call("trigger_haptic_pulse", amplitude, duration); + } + + public bool IsButtonPressed(StringName name) + { + return Call("is_button_pressed", name).AsBool(); + } + + public Variant GetInput(StringName name) + { + return Call("get_input", name); + } + + public float GetFloat(StringName name) + { + return Call("get_float", name).As(); + } + + public Vector2 GetVector2(StringName name) + { + return Call("get_vector2", name).As(); + } +} diff --git a/project.csharp/addons/tiltfive/scenes/T5NodeCS.cs b/project.csharp/addons/tiltfive/scenes/T5NodeCS.cs new file mode 100644 index 0000000..e9c7a80 --- /dev/null +++ b/project.csharp/addons/tiltfive/scenes/T5NodeCS.cs @@ -0,0 +1,29 @@ +using Godot; +using System; + +public partial class T5NodeCS : Node3D +{ + public StringName Tracker { + get { + return Get("tracker").As(); + } + set { + Set("tracker", value); + } + } + + public bool getIsActive() + { + return Call("get_is_active").AsBool(); + } + + public bool getHasTrackingData() + { + return Call("get_has_tracking_data").AsBool(); + } + + public XRPose getPose() + { + return Call("get_pose").As(); + } +} diff --git a/project.csharp/addons/tiltfive/scenes/T5OriginCS.cs b/project.csharp/addons/tiltfive/scenes/T5OriginCS.cs new file mode 100644 index 0000000..c1a0c36 --- /dev/null +++ b/project.csharp/addons/tiltfive/scenes/T5OriginCS.cs @@ -0,0 +1,17 @@ +using Godot; +using System; + +public partial class T5OriginCS : Node3D +{ + public float GameboardScale + { + get + { + return Get("gameboard_scale").As(); + } + set + { + Set("gameboard_scale", value); + } + } +} diff --git a/project.csharp/addons/tiltfive/scenes/T5XRRig.cs b/project.csharp/addons/tiltfive/scenes/T5XRRig.cs new file mode 100644 index 0000000..b7448dd --- /dev/null +++ b/project.csharp/addons/tiltfive/scenes/T5XRRig.cs @@ -0,0 +1,32 @@ +using Godot; +using System; + +public partial class T5XRRig : SubViewport +{ + T5OriginCS origin; + T5CameraCS camera; + T5ControllerCS wand; + + public string GlassesID { get; set; } + public T5Def.GameboardType GameboardType { get; set; } + public Aabb GameboardSize { get; set; } + public T5OriginCS Origin { get { return origin; } } + public T5CameraCS Camera{ get { return camera; } } + public T5ControllerCS Wand { get { return wand; } } + + // Called when the node enters the scene tree for the first time. + public override void _EnterTree() + { + base._EnterTree(); + + origin = GetNode("Origin"); + camera = GetNode("Origin/Camera"); + wand = GetNode("Origin/Wand_1"); + } + + // Called every frame. 'delta' is the elapsed time since the previous frame. + public override void _Process(double delta) + { + if(wand != null) wand.Visible = wand.getHasTrackingData(); + } +} diff --git a/project.csharp/addons/tiltfive/scenes/T5XRRig.tscn b/project.csharp/addons/tiltfive/scenes/T5XRRig.tscn new file mode 100644 index 0000000..82dcd91 --- /dev/null +++ b/project.csharp/addons/tiltfive/scenes/T5XRRig.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=5 format=3 uid="uid://dpbt52d0p5wjw"] + +[ext_resource type="Script" path="res://addons/tiltfive/scenes/T5XRRig.cs" id="1_rshxt"] +[ext_resource type="Script" path="res://addons/tiltfive/scenes/T5OriginCS.cs" id="2_jxn4b"] +[ext_resource type="Script" path="res://addons/tiltfive/scenes/T5CameraCS.cs" id="3_iaov5"] +[ext_resource type="Script" path="res://addons/tiltfive/scenes/T5ControllerCS.cs" id="3_olh3w"] + +[node name="T5XRRig" type="SubViewport"] +script = ExtResource("1_rshxt") + +[node name="Origin" type="T5Origin3D" parent="."] +script = ExtResource("2_jxn4b") + +[node name="Camera" type="T5Camera3D" parent="Origin"] +script = ExtResource("3_iaov5") + +[node name="Wand_1" type="T5Controller3D" parent="Origin"] +script = ExtResource("3_olh3w") diff --git a/addons/tiltfive/tiltfive.gdextension b/project.csharp/addons/tiltfive/tiltfive.gdextension similarity index 100% rename from addons/tiltfive/tiltfive.gdextension rename to project.csharp/addons/tiltfive/tiltfive.gdextension diff --git a/addons/tiltfive_tools/README.md b/project.csharp/addons/tiltfive_tools/README.md similarity index 100% rename from addons/tiltfive_tools/README.md rename to project.csharp/addons/tiltfive_tools/README.md diff --git a/project.csharp/addons/tiltfive_tools/functions/T5ToolsBoardScale.cs b/project.csharp/addons/tiltfive_tools/functions/T5ToolsBoardScale.cs new file mode 100644 index 0000000..44f3ef2 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/functions/T5ToolsBoardScale.cs @@ -0,0 +1,74 @@ +using System; +using Godot; + +public partial class T5ToolsBoardScale : Node +{ + /// + /// Origin node + /// + private T5OriginCS _origin; + + /// + /// Button triggering zoom-in + /// + [Export] + public string ZoomInButton { get; set; } = "button_a"; + + /// + /// Button triggering zoom-out + /// + [Export] + public string ZoomOutButton { get; set; } = "button_y"; + + /// + /// Minimum zoom level + /// + [Export] + public float ZoomMin { get; set; } = 4.0f; + + /// + /// Maximum zoom level + /// + [Export] + public float ZoomMax { get; set; } = 20.0f; + + /// + /// Zoom step on each button press + /// + [Export] + public float ZoomStep { get; set; } = 1.2f; + + /// + /// Called when the node is "ready" + /// + public override void _Ready() + { + // Get the origin + _origin = T5ToolsPlayer.FindInstance(this).Origin; + + // Bind to the parent wand controller inputs + var controller = GetParent(); + controller?.Connect("button_pressed", Callable.From((StringName name) => OnButtonPressed(name))); + } + + /// + /// Handle controller button presses + /// + /// Button name + private void OnButtonPressed(StringName name) + { + // Zoom in + if (name == ZoomInButton) + { + var zoom = _origin.GameboardScale; + zoom = Math.Clamp(zoom / ZoomStep, ZoomMin, ZoomMax); + _origin.GameboardScale = zoom; + } + else if (name == ZoomOutButton) + { + var zoom = _origin.GameboardScale; + zoom = Math.Clamp(zoom * ZoomStep, ZoomMin, ZoomMax); + _origin.GameboardScale = zoom; + } + } +} \ No newline at end of file diff --git a/project.csharp/addons/tiltfive_tools/functions/T5ToolsFacePlayer.cs b/project.csharp/addons/tiltfive_tools/functions/T5ToolsFacePlayer.cs new file mode 100644 index 0000000..8731515 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/functions/T5ToolsFacePlayer.cs @@ -0,0 +1,139 @@ +using Godot; + +public partial class T5ToolsFacePlayer : Node +{ + /// + /// Player camera + /// + private T5CameraCS _camera; + + /// + /// Player origin + /// + private T5OriginCS _origin; + + /// + /// Target node + /// + private Node3D _target; + + /// + /// Target node (null for parent) + /// + [Export] + public Node3D Target { get; set; } + + /// + /// Allow tilt + /// + [Export] + public bool Tilt { get; set; } + + /// + /// Scale to player + /// + [Export] + public bool PlayerScale { get; set; } = true; + + /// + /// Rotation rate + /// + [Export] + public float Rate { get; set; } = 1.0f; + + /// + /// Called when the node is "ready" + /// + public override void _Ready() + { + // Get the target + _target = Target ?? GetParentOrNull(); + if (_target == null) + { + GD.PushWarning($"T5ToolsFacePlayer<{this}>: No target node found"); + return; + } + + // Find the player + var player = FindPlayer(); + if (player == null) + return; + + // Get the camera and origin + _camera = player.Camera; + _origin = player.Origin; + + // Perform the initial facing + TargetTransform(1.0f); + } + + /// + /// Called during the processing step of the main loop + /// + /// Delta since previous process in seconds + public override void _Process(double delta) + { + TargetTransform(Rate * (float)delta); + } + + /// + /// Apply the target transform with a slew weight + /// + /// Slew weight [0=none .. 1=full] + private void TargetTransform(float weight) + { + // Get the camera position local to the target + var dirLocal = _target.ToLocal(_camera.GlobalPosition); + if (dirLocal.IsZeroApprox()) + return; + + // Get the old basis + var bOld = _target.Transform.Basis.Orthonormalized(); + + // Construct the new basis looking at the camera + var bNew = Basis.LookingAt(dirLocal, Vector3.Up, true); + + // If tilt is not permitted then snap the Y to vertical + if (!Tilt) + { + bNew.Y = Vector3.Up; + bNew.Z = bNew.X.Cross(Vector3.Up); + bNew.X = Vector3.Up.Cross(bNew.Z); + bNew = bNew.Orthonormalized(); + } + + // Blend based on weight + bNew = bOld.Slerp(bNew, weight); + + // If player-scaled then scale to counteract origin scale + if (PlayerScale) + { + var scale = _origin.GameboardScale; + bNew = bNew.Scaled(new Vector3(scale, scale, scale)); + } + + // Set the target transform + _target.Transform = _target.Transform with { Basis = bNew }; + } + + /// + /// Find the associated player + /// + /// Player node or null + private T5ToolsPlayer FindPlayer() + { + // Test if this node is a child of a character + var character = T5ToolsCharacter.FindInstance(this); + if (character != null) + return character.Player; + + // Test if this node is a child of a player + var player = T5ToolsPlayer.FindInstance(this); + if (player != null) + return player; + + // Report failure + GD.PushWarning($"T5ToolsFacePlayer<{this}>: No player found"); + return null; + } +} \ No newline at end of file diff --git a/project.csharp/addons/tiltfive_tools/functions/T5ToolsPointer.cs b/project.csharp/addons/tiltfive_tools/functions/T5ToolsPointer.cs new file mode 100644 index 0000000..5032a2a --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/functions/T5ToolsPointer.cs @@ -0,0 +1,854 @@ +using System; +using System.Collections.Generic; +using Godot; + +[Tool] +public partial class T5ToolsPointer : Node3D +{ + /// + /// Signal for pointer entered valid target + /// + /// Target node + /// Pointer location + [Signal] + public delegate void PointerEnteredEventHandler(Node3D target, Vector3 at); + + /// + /// Signal for pointer moved on valid target + /// + /// Target node + /// From location + /// To location + [Signal] + public delegate void PointerMovedEventHandler(Node3D target, Vector3 from, Vector3 to); + + /// + /// Signal for pointer exited valid target + /// + /// Target node + /// Pointer location + [Signal] + public delegate void PointerExitedEventHandler(Node3D target, Vector3 at); + + /// + /// Signal for pointer pressed on valid target + /// + /// Target node + /// Press location + [Signal] + public delegate void PointerPressedEventHandler(Node3D target, Vector3 at); + + /// + /// Signal for pointer released on valid target + /// + /// Target node + /// Release location + [Signal] + public delegate void PointerReleasedEventHandler(Node3D target, Vector3 at); + + /// + /// Signal for pointing event + /// + /// Pointer event + [Signal] + public delegate void PointingEventEventHandler(T5ToolsPointerEvent @event); + + /// + /// Default collision mask (world + 21:pointable) + /// + private const uint DefaultCollisionMask = 0b0000_0000_0001_0000_0000_0000_1111_1111; + + /// + /// Default valid mask (21:pointable) + /// + private const uint DefaultValidMask = 0b0000_0000_0001_0000_0000_0000_0000_0000; + + /// + /// Pointer length backing field + /// + private float _length = 1.0f; + + /// + /// Pointer angle backing field + /// + private float _angle = 25.0f; + + /// + /// Visible layers backing field + /// + private uint _visibleLayers = 2; + + /// + /// Arc radius backing field + /// + private float _arcRadius = 0.01f; + + /// + /// Arc pointer color backing field + /// + private Color _arcColor = new(0.0f, 0.0f, 1.0f); + + /// + /// Arc pointer hit color backing field + /// + private Color _arcHitColor = new(0.5f, 0.5f, 1.0f); + + /// + /// Target radius backing field + /// + private float _targetRadius = 0.05f; + + /// + /// Target color backing field + /// + private Color _targetColor = new(0.5f, 0.5f, 1.0f, 0.5f); + + /// + /// Collision mask backing field + /// + private uint _collisionMask = DefaultCollisionMask; + + /// + /// Valid mask backing field + /// + private uint _validMask = DefaultValidMask; + + /// + /// Collide with bodies backing field + /// + private bool _collideWithBodies = true; + + /// + /// Collide with areas backing field + /// + private bool _collideWithAreas; + + /// + /// Player + /// + private T5ToolsPlayer _player; + + /// + /// Controller + /// + private T5ControllerCS _controller; + + /// + /// Valid mask including player + /// + private uint _playerValidMask; + + /// + /// Locked target + /// + private Node3D _lockedTarget; + + /// + /// Last target + /// + private Node3D _lastTarget; + + /// + /// Last valid + /// + private bool _lastValid; + + /// + /// Last at + /// + private Vector3 _lastAt; + + /// + /// Enabled + /// + private bool _enabled; + + /// + /// RayCast node + /// + private RayCast3D _rayCast; + + /// + /// Arc Mesh instance + /// + private MeshInstance3D _arcMesh; + + /// + /// Arc cylinder mesh + /// + private CylinderMesh _arcCylinderMesh; + + /// + /// Arc material + /// + private ShaderMaterial _arcMaterial; + + /// + /// Target mesh instance + /// + private MeshInstance3D _targetMesh; + + /// + /// Target sphere mesh + /// + private SphereMesh _targetSphereMesh; + + /// + /// Target material + /// + private StandardMaterial3D _targetMaterial; + + /// + /// Pointer length + /// + [ExportGroup("General")] + [Export] + public float Length + { + get => _length; + set => SetLength(value); + } + + /// + /// Pointer angle + /// + [Export] + public float Angle + { + get => _angle; + set => SetAngle(value); + } + + /// + /// Visible layers + /// + [Export(PropertyHint.Layers3DRender)] + public uint VisibleLayers + { + get => _visibleLayers; + set => SetVisibleLayers(value); + } + + /// + /// Action button + /// + [Export] + public string Button { get; set; } = "trigger_click"; + + /// + /// Bezier strength + /// + [Export(PropertyHint.Range, "0.1,1.0,0.05")] + public float BezierStrength { get; set; } = 0.5f; + + /// + /// Arc radius + /// + [Export] + public float ArcRadius + { + get => _arcRadius; + set => SetArcRadius(value); + } + + /// + /// Arc pointer color + /// + [Export] + public Color ArcColor + { + get => _arcColor; + set => SetArcColor(value); + } + + /// + /// Arc hit color + /// + [Export] + public Color ArcHitColor + { + get => _arcHitColor; + set => SetArcHitColor(value); + } + + /// + /// Target radius + /// + [ExportGroup("Target")] + [Export] + public float TargetRadius + { + get => _targetRadius; + set => SetTargetRadius(value); + } + + /// + /// Target color + /// + [Export] + public Color TargetColor + { + get => _targetColor; + set => SetTargetColor(value); + } + + /// + /// Pointer collision mask + /// + [ExportGroup("Collision")] + [Export(PropertyHint.Layers3DPhysics)] + public uint CollisionMask + { + get => _collisionMask; + set => SetCollisionMask(value); + } + + /// + /// Pointer valid mask + /// + [Export(PropertyHint.Layers3DPhysics)] + public uint ValidMask + { + get => _validMask; + set => SetValidMask(value); + } + + /// + /// Enable pointer collision with bodies + /// + [Export] + public bool CollideWithBodies + { + get => _collideWithBodies; + set => SetCollideWithBodies(value); + } + + /// + /// Enable pointer collision with areas + /// + [Export] + public bool CollideWithAreas + { + get => _collideWithAreas; + set => SetCollideWithAreas(value); + } + + public override void _Ready() + { + // Do not initialise if in the editor + if (Engine.IsEditorHint()) + return; + + // Get the nodes + _rayCast = GetNode("RayCast"); + _arcMesh = GetNode("Arc"); + _arcMaterial = _arcMesh.MaterialOverride as ShaderMaterial; + _targetMesh = GetNode("Target"); + _targetMaterial = _targetMesh.MaterialOverride as StandardMaterial3D; + _arcCylinderMesh = _arcMesh.Mesh as CylinderMesh; + _targetSphereMesh = _targetMesh.Mesh as SphereMesh; + + // Handle visibility changes + VisibilityChanged += UpdateEnabled; + + // Find the player + _player = T5ToolsPlayer.FindInstance(this); + + // Get the parent wand controller + _controller = GetParent(); + _controller.Connect("button_pressed", Callable.From((StringName name) => OnButtonPressed(name))); + _controller.Connect("button_released", Callable.From((StringName name) => OnButtonReleased(name))); + + // Update the pointer + UpdateEnabled(); + UpdateVisibleLayers(); + UpdateRay(); + UpdateTarget(); + UpdateCollision(); + } + + /// + /// Gets the configuration warnings with this node + /// + /// Configuration warnings + public override string[] _GetConfigurationWarnings() + { + // Get the warnings + var warnings = new List(); + + // Verify the controller + if (GetParent() is not T5ControllerCS) + warnings.Add("Pointer must be a child of T5ControllerCS"); + + // Return warnings + return warnings.ToArray(); + } + + /// + /// Called during the physics processing step of the main loop + /// + /// Delta since previous process in seconds + public override void _PhysicsProcess(double delta) + { + // Do not run if in the editor + if (Engine.IsEditorHint() || !IsInsideTree()) + return; + + // Handle deletion of locked target + if (_lockedTarget != null && !GodotObject.IsInstanceValid(_lockedTarget)) + { + _lockedTarget = null; + } + + // Handle deletion of last target + if (_lastTarget != null && !GodotObject.IsInstanceValid(_lastTarget)) + { + _lastTarget = null; + VisibleMiss(); + } + + // Find the new target + Node3D newTarget = null; + var newValid = false; + var newAt = Vector3.Zero; + if (_enabled && _controller.Call("get_is_active").AsBool() && _rayCast.IsColliding()) + { + // Get the ray cast collision + newAt = _rayCast.GetCollisionPoint(); + newTarget = _lockedTarget ?? _rayCast.GetCollider() as Node3D; + + // Clear if not valid + if (newTarget != null && GodotObject.IsInstanceValid(newTarget)) + newValid = (newTarget.Get("collision_layer").As() & _playerValidMask) != 0U; + else + newTarget = null; + } + + // Skip if no current and previous targets + if (newTarget == null && _lastTarget == null) + return; + + // Handle pointer changes + if (newTarget != null && _lastTarget == null) + { + // If valid, report events on newTarget + if (newValid) + { + ReportEntered(newTarget, newAt); + ReportMoved(newTarget, newAt, newAt); + } + + // Update visible artifacts for hit + VisibleHit(newValid, newAt); + } + else if (newTarget == null) + { + // If valid, report exited _lastTarget + if (_lastValid) + ReportExited(_lastTarget, _lastAt); + + // Update visible artifacts for miss + VisibleMiss(); + } + else if (newTarget != _lastTarget) + { + // If valid, report exited _lastTarget + if (_lastValid) + ReportExited(_lastTarget, _lastAt); + + // If valid, report entered newTarget + if (newValid) + { + ReportEntered(newTarget, newAt); + ReportMoved(newTarget, newAt, newAt); + } + + // Update visible artifacts for hit + VisibleHit(newValid, newAt); + } + else if (newAt != _lastAt) + { + // If valid, report moved on target + if (newValid) + ReportMoved(newTarget, newAt, _lastAt); + + // Update visible artifacts for move + VisibleMove(newAt); + } + + // Update last values + _lastTarget = newTarget; + _lastValid = newValid; + _lastAt = newAt; + } + + /// + /// Handle setting length + /// + /// New length + private void SetLength(float length) + { + _length = length; + if (IsInsideTree()) + UpdateRay(); + } + + /// + /// Handle setting angle + /// + /// New angle + private void SetAngle(float angle) + { + _angle = angle; + if (IsInsideTree()) + UpdateRay(); + } + + /// + /// Handle setting visible layers + /// + /// New visible layers + private void SetVisibleLayers(uint visibleLayers) + { + _visibleLayers = visibleLayers; + if (IsInsideTree()) + UpdateVisibleLayers(); + } + + /// + /// Handle setting arc radius + /// + /// New arc radius + private void SetArcRadius(float arcRadius) + { + _arcRadius = arcRadius; + if (IsInsideTree()) + UpdateArc(); + } + + /// + /// Handle setting arc color + /// + /// New arc color + private void SetArcColor(Color arcColor) + { + _arcColor = arcColor; + if (IsInsideTree()) + UpdateArc(); + } + + /// + /// Handle setting arc hit color + /// + /// New arc hit color + private void SetArcHitColor(Color arcHitColor) + { + _arcHitColor = arcHitColor; + if (IsInsideTree()) + UpdateArc(); + } + + /// + /// Handle setting target radius + /// + /// New target radius + private void SetTargetRadius(float targetRadius) + { + _targetRadius = targetRadius; + if (IsInsideTree()) + UpdateTarget(); + } + + /// + /// Handle setting target color + /// + /// New target color + private void SetTargetColor(Color targetColor) + { + _targetColor = targetColor; + if (IsInsideTree()) + UpdateTarget(); + } + + /// + /// Handle setting collision mask + /// + /// New collision mask + private void SetCollisionMask(uint collisionMask) + { + _collisionMask = collisionMask; + if (IsInsideTree()) + UpdateCollision(); + } + + /// + /// Handle setting valid mask + /// + /// New valid collision mask + private void SetValidMask(uint validMask) + { + _validMask = validMask; + if (IsInsideTree()) + UpdateCollision(); + } + + /// + /// Handle setting collide with bodies + /// + /// New collide with bodies flag + private void SetCollideWithBodies(bool collideWithBodies) + { + _collideWithBodies = collideWithBodies; + if (IsInsideTree()) + UpdateCollision(); + } + + /// + /// Handle setting collide with areas + /// + /// New collide with areas flag + private void SetCollideWithAreas(bool collideWithAreas) + { + _collideWithAreas = collideWithAreas; + if (IsInsideTree()) + UpdateCollision(); + } + + /// + /// Handle updating enabled state + /// + private void UpdateEnabled() + { + _enabled = IsVisibleInTree(); + UpdateArc(); + UpdateTarget(); + } + + /// + /// Update visible layers + /// + private void UpdateVisibleLayers() + { + // Calculate the visible layers (including the player) + var layers = _visibleLayers | (_player?.GetPlayerVisibleLayer() ?? 0U); + + // Set the mesh visible layers + _arcMesh.Layers = layers; + _targetMesh.Layers = layers; + } + + /// + /// Update the ray + /// + private void UpdateRay() + { + _rayCast.RotationDegrees = _rayCast.RotationDegrees with { X = -_angle }; + _rayCast.TargetPosition = _rayCast.TargetPosition with { Z = -_length }; + UpdateArc(); + } + + /// + /// Update the arc + /// + private void UpdateArc() + { + // Update cylinder + _arcCylinderMesh.TopRadius = _arcRadius; + _arcCylinderMesh.BottomRadius = _arcRadius; + + // Update visible artifacts + if (_enabled && _lastTarget != null) + VisibleHit(_lastValid, _lastAt); + else + VisibleMiss(); + } + + /// + /// Update the pointer target + /// + private void UpdateTarget() + { + // Update sphere + _targetSphereMesh.Radius = _targetRadius; + _targetSphereMesh.Height = _targetRadius * 2.0f; + _targetMaterial.AlbedoColor = _targetColor; + } + + /// + /// Update collision settings + /// + private void UpdateCollision() + { + // Get the player-specific layer + var playerLayer = _player?.GetPlayerPhysicsLayer() ?? 0U; + + // Update the valid mask with player specific layers + _playerValidMask = _validMask | playerLayer; + + // Update the ray cast + _rayCast.CollisionMask = _collisionMask | playerLayer; + _rayCast.CollideWithBodies = _collideWithBodies; + _rayCast.CollideWithAreas = _collideWithAreas; + } + + /// + /// Update the arc active color + /// + /// Hit state + private void UpdateArcActiveColor(bool hit) + { + // Update the arc material + _arcMaterial?.SetShaderParameter("color", hit ? _arcHitColor : _arcColor); + } + + /// + /// Report pointer entered + /// + /// Target node + /// Enter position + private void ReportEntered(Node3D target, Vector3 at) + { + EmitSignal(SignalName.PointerEntered, target, at); + T5ToolsPointerEvent.Entered(_player, this, target, at); + } + + /// + /// Report pointer moved + /// + /// Target node + /// New position + /// Old position + private void ReportMoved(Node3D target, Vector3 to, Vector3 from) + { + EmitSignal(SignalName.PointerMoved, target, from, to); + T5ToolsPointerEvent.Moved(_player, this, target, to, from); + } + + /// + /// Report pointer exited + /// + /// Target node + /// Exit position + private void ReportExited(Node3D target, Vector3 at) + { + EmitSignal(SignalName.PointerExited, target, at); + T5ToolsPointerEvent.Exited(_player, this, target, at); + } + + /// + /// Report pointer pressed + /// + /// Target node + /// Pressed position + private void ReportPressed(Node3D target, Vector3 at) + { + EmitSignal(SignalName.PointerPressed, target, at); + T5ToolsPointerEvent.Pressed(_player, this, target, at); + } + + /// + /// Report pointer released + /// + /// Target node + /// Released position + private void ReportReleased(Node3D target, Vector3 at) + { + EmitSignal(SignalName.PointerReleased, target, at); + T5ToolsPointerEvent.Released(_player, this, target, at); + } + + /// + /// Update visible objects for a hit + /// + /// Valid flag + /// Hit position + private void VisibleHit(bool valid, Vector3 at) + { + // Show the target + _targetMesh.GlobalPosition = at; + _targetMesh.Visible = valid; + + // Update the arc + UpdateArcActiveColor(valid); + UpdateArcCurve(at); + } + + /// + /// Update visible objects for a move + /// + /// Hit position + private void VisibleMove(Vector3 at) + { + // Update the target + _targetMesh.GlobalPosition = at; + + // Update the arc + UpdateArcCurve(at); + } + + /// + /// Update visible objects for a miss + /// + private void VisibleMiss() + { + // Update the target + _targetMesh.Visible = false; + + // Calculate a fake "at" vector + var at = _rayCast?.ToGlobal(new Vector3(0, 0, -_length)) ?? Vector3.Zero; + + // Update the arc + UpdateArcActiveColor(false); + UpdateArcCurve(at); + } + + /// + /// Update the arc curve + /// + /// Curve target + private void UpdateArcCurve(Vector3 at) + { + var rayCastTransform = _rayCast.GlobalTransform; + var distance = at.DistanceTo(rayCastTransform.Origin); + + // Mix target up with ray cast direction + var forward = new Vector3(0.0f, -1.0f, 0.0f); + var up = (Vector3.Up + rayCastTransform.Basis.Z).Normalized(); + + var inv = _arcMesh.GlobalTransform.AffineInverse(); + var target = inv * at; + var targetUp = inv.Basis * up; + targetUp.Z -= Math.Abs(targetUp.X); + targetUp.X = 0.0f; + + _arcMaterial.SetShaderParameter("forward", forward * distance * BezierStrength); + _arcMaterial.SetShaderParameter("target", target); + _arcMaterial.SetShaderParameter("target_up", targetUp * distance * BezierStrength); + } + + /// + /// Handle wand button press + /// + /// Button name + private void OnButtonPressed(StringName name) + { + // Ignore if not the active button or no target + if (_lastTarget == null || name != Button) + return; + + // Lock the target and report the press + _lockedTarget = _lastTarget; + ReportPressed(_lockedTarget, _lastAt); + } + + private void OnButtonReleased(StringName name) + { + // Ignore if not the active button or no target + if (_lockedTarget == null || name != Button) + return; + + // Unlock the target and report the release + ReportReleased(_lockedTarget, _lastAt); + _lockedTarget = null; + } +} diff --git a/project.csharp/addons/tiltfive_tools/functions/T5ToolsPointerEvent.cs b/project.csharp/addons/tiltfive_tools/functions/T5ToolsPointerEvent.cs new file mode 100644 index 0000000..f37d2d1 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/functions/T5ToolsPointerEvent.cs @@ -0,0 +1,204 @@ +using Godot; + +/// +/// Tilt Five Tools Pointer Event +/// +public partial class T5ToolsPointerEvent : GodotObject +{ + /// + /// Types of pointer events + /// + public enum Type + { + /// + /// Pointer entered target + /// + Entered, + + /// + /// Pointer exited target + /// + Exited, + + /// + /// Pointer pressed target + /// + Pressed, + + /// + /// Pointer released target + /// + Released, + + /// + /// Pointer moved on target + /// + Moved + } + + /// + /// Initializes a new instance of the T5ToolsPointerEvent class + /// + /// Type of pointer event + /// Player + /// Pointer + /// Target + /// Position + /// Last position + public T5ToolsPointerEvent(Type eventType, T5ToolsPlayer player, Node3D pointer, Node3D target, Vector3 position, Vector3 lastPosition) + { + EventType = eventType; + Player = player; + Pointer = pointer; + Target = target; + Position = position; + LastPosition = lastPosition; + } + + /// + /// Gets the type of pointer event + /// + public Type EventType { get; init; } + + /// + /// Gets the player + /// + public T5ToolsPlayer Player { get; init; } + + /// + /// Gets the pointer + /// + public Node3D Pointer { get; init; } + + /// + /// Gets the target + /// + public Node3D Target { get; init; } + + /// + /// Gets the position + /// + public Vector3 Position { get; init; } + + /// + /// Gets the last position + /// + public Vector3 LastPosition { get; init; } + + /// + /// Report a pointer entered event + /// + /// Player + /// Pointer + /// Target + /// Entered position + public static void Entered(T5ToolsPlayer player, Node3D pointer, Node3D target, Vector3 at) + { + Report( + new T5ToolsPointerEvent( + Type.Entered, + player, + pointer, + target, + at, + at)); + } + + /// + /// Report a pointer moved event + /// + /// Player + /// Pointer + /// Target + /// To position + /// From position + public static void Moved(T5ToolsPlayer player, Node3D pointer, Node3D target, Vector3 to, Vector3 from) + { + Report( + new T5ToolsPointerEvent( + Type.Moved, + player, + pointer, + target, + to, + from)); + } + + /// + /// Report a pointer pressed event + /// + /// Player + /// Pointer + /// Target + /// Pressed position + public static void Pressed(T5ToolsPlayer player, Node3D pointer, Node3D target, Vector3 at) + { + Report( + new T5ToolsPointerEvent( + Type.Pressed, + player, + pointer, + target, + at, + at)); + } + + /// + /// Report a pointer released event + /// + /// Player + /// Pointer + /// Target + /// Released position + public static void Released(T5ToolsPlayer player, Node3D pointer, Node3D target, Vector3 at) + { + Report( + new T5ToolsPointerEvent( + Type.Released, + player, + pointer, + target, + at, + at)); + } + + /// + /// Report a pointer exited event + /// + /// Player + /// Pointer + /// Target + /// Exited position + public static void Exited(T5ToolsPlayer player, Node3D pointer, Node3D target, Vector3 last) + { + Report( + new T5ToolsPointerEvent( + Type.Exited, + player, + pointer, + target, + last, + last)); + } + + /// + /// Report pointer event + /// + /// Pointer event + public static void Report(T5ToolsPointerEvent pointerEvent) + { + if (GodotObject.IsInstanceValid(pointerEvent.Pointer)) + { + if (pointerEvent.Pointer.HasSignal("PointingEvent")) + pointerEvent.Pointer.EmitSignal("PointingEvent", pointerEvent); + } + + if (GodotObject.IsInstanceValid(pointerEvent.Target)) + { + if (pointerEvent.Target.HasSignal("PointerEvent")) + pointerEvent.Target.EmitSignal("PointerEvent", pointerEvent); + else if (pointerEvent.Target.HasMethod("PointerEvent")) + pointerEvent.Target.Call("PointerEvent", pointerEvent); + } + } +} \ No newline at end of file diff --git a/project.csharp/addons/tiltfive_tools/functions/T5ToolsVisibleToggle.cs b/project.csharp/addons/tiltfive_tools/functions/T5ToolsVisibleToggle.cs new file mode 100644 index 0000000..200e812 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/functions/T5ToolsVisibleToggle.cs @@ -0,0 +1,132 @@ +using Godot; + +public partial class T5ToolsVisibleToggle : Node +{ + /// + /// Initial Visibility + /// + public enum InitialVisibility + { + /// + /// Hide at start + /// + Hide, + + /// + /// Show at start + /// + Show, + + /// + /// No change + /// + Default + } + + /// + /// Target node + /// + private Node3D _target; + + /// + /// Toggle button (T5 menu button for default) + /// + [Export] + public string ToggleButton { get; set; } = "button_t5"; + + /// + /// Target node (null for parent) + /// + [Export] + public Node3D Target { get; set; } + + /// + /// Initial visibility + /// + [Export] + public InitialVisibility Initial { get; set; } = InitialVisibility.Hide; + + public override void _Ready() + { + // Get the target node + _target = Target ?? GetParentOrNull(); + if (_target == null) + { + GD.PushWarning($"T5ToolsVisibleToggle<{this}>: No target node found"); + return; + } + + // Subscribe to button events + var wandNode = FindWand(); + wandNode?.Connect("button_pressed", Callable.From((StringName name) => OnButtonPressed(name))); + + // Apply initial visibility + switch (Initial) + { + case InitialVisibility.Hide: + _target.Visible = false; + break; + + case InitialVisibility.Show: + _target.Visible = true; + break; + + case InitialVisibility.Default: + // No change + break; + } + } + + /// + /// Handle button presses + /// + /// Button name + private void OnButtonPressed(StringName name) + { + // Toggle visibility if toggle button pressed + if (name == ToggleButton) + _target.Visible = !_target.Visible; + } + + /// + /// Find the wand node + /// + /// Wand node or null + private T5ControllerCS FindWand() + { + // Find the player + var player = FindPlayer(); + if (player == null) + return null; + + // Find the wand + var wandNode = player.Wand; + if (wandNode != null) + return wandNode; + + // Report failure + GD.PushWarning($"T5ToolsVisibleToggle<{this}>: No wand found"); + return null; + } + + /// + /// Find the associated player + /// + /// Player node or null + private T5ToolsPlayer FindPlayer() + { + // Test if this node is a child of a character + var character = T5ToolsCharacter.FindInstance(this); + if (character != null) + return character.Player; + + // Test if this node is a child of a player + var player = T5ToolsPlayer.FindInstance(this); + if (player != null) + return player; + + // Report failure + GD.PushWarning($"T5ToolsVisibleToggle<{this}>: No player found"); + return null; + } +} \ No newline at end of file diff --git a/project.csharp/addons/tiltfive_tools/functions/board_scale.tscn b/project.csharp/addons/tiltfive_tools/functions/board_scale.tscn new file mode 100644 index 0000000..cde9401 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/functions/board_scale.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://go1j5dbhtx3l"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/functions/T5ToolsBoardScale.cs" id="1_u5ecs"] + +[node name="BoardScale" type="Node"] +script = ExtResource("1_u5ecs") diff --git a/project.csharp/addons/tiltfive_tools/functions/face_player.tscn b/project.csharp/addons/tiltfive_tools/functions/face_player.tscn new file mode 100644 index 0000000..f2c1571 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/functions/face_player.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://c21g2ifqcqkij"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/functions/T5ToolsFacePlayer.cs" id="1_3478g"] + +[node name="FacePlayer" type="Node"] +script = ExtResource("1_3478g") diff --git a/addons/tiltfive_tools/functions/pointer.gdshader b/project.csharp/addons/tiltfive_tools/functions/pointer.gdshader similarity index 100% rename from addons/tiltfive_tools/functions/pointer.gdshader rename to project.csharp/addons/tiltfive_tools/functions/pointer.gdshader diff --git a/project.csharp/addons/tiltfive_tools/functions/pointer.tscn b/project.csharp/addons/tiltfive_tools/functions/pointer.tscn new file mode 100644 index 0000000..f192ddf --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/functions/pointer.tscn @@ -0,0 +1,53 @@ +[gd_scene load_steps=7 format=3 uid="uid://bfxa4y4qa6l67"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/functions/T5ToolsPointer.cs" id="1_liqxc"] +[ext_resource type="Shader" path="res://addons/tiltfive_tools/functions/pointer.gdshader" id="5_fnea0"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_kby4w"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_fnea0") +shader_parameter/color = Color(0, 0, 1, 1) +shader_parameter/forward = Vector3(0, -0.25, 0) +shader_parameter/target = Vector3(0, -1, 1) +shader_parameter/target_up = Vector3(0, 0, -0.25) + +[sub_resource type="CylinderMesh" id="CylinderMesh_gkb5n"] +top_radius = 0.01 +bottom_radius = 0.01 +height = 1.0 +radial_segments = 8 +rings = 32 +cap_top = false + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yukef"] +resource_local_to_scene = true +transparency = 1 +blend_mode = 1 +depth_draw_mode = 1 +shading_mode = 0 +albedo_color = Color(0, 0, 0.498039, 0.498039) + +[sub_resource type="SphereMesh" id="SphereMesh_m7bus"] +radius = 0.05 +height = 0.1 +radial_segments = 12 +rings = 6 + +[node name="Pointer" type="Node3D"] +script = ExtResource("1_liqxc") + +[node name="RayCast" type="RayCast3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, 0, 0, 0) +target_position = Vector3(0, 0, -1) +collision_mask = 1048831 + +[node name="Arc" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0) +material_override = SubResource("ShaderMaterial_kby4w") +mesh = SubResource("CylinderMesh_gkb5n") + +[node name="Target" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1) +material_override = SubResource("StandardMaterial3D_yukef") +mesh = SubResource("SphereMesh_m7bus") diff --git a/project.csharp/addons/tiltfive_tools/functions/visible_toggle.tscn b/project.csharp/addons/tiltfive_tools/functions/visible_toggle.tscn new file mode 100644 index 0000000..935f8f2 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/functions/visible_toggle.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://5xntpxnp3gxe"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/functions/T5ToolsVisibleToggle.cs" id="1_y17xv"] + +[node name="VisibleToggle" type="Node"] +script = ExtResource("1_y17xv") diff --git a/project.csharp/addons/tiltfive_tools/objects/T5ToolsSceneSwitchArea.cs b/project.csharp/addons/tiltfive_tools/objects/T5ToolsSceneSwitchArea.cs new file mode 100644 index 0000000..adb122a --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/objects/T5ToolsSceneSwitchArea.cs @@ -0,0 +1,73 @@ +using System.Collections.Generic; +using Godot; + +[Tool] +public partial class T5ToolsSceneSwitchArea : Area3D +{ + /// + /// Enable flag + /// + [Export] + public bool Enabled { get; set; } = true; + + /// + /// Target scene + /// + [Export(PropertyHint.File, "*.tscn")] + public string TargetScene { get; set; } = string.Empty; + + /// + /// Target location + /// + [Export] + public string Location { get; set; } = string.Empty; + + /// + /// Called when the node is "ready" + /// + public override void _Ready() + { + base._Ready(); + + // Do not run if in the editor + if (Engine.IsEditorHint()) + return; + + // Subscribe to body entered events + BodyEntered += OnBodyEntered; + } + + /// + /// Gets the configuration warnings with this node + /// + /// Configuration warnings + public override string[] _GetConfigurationWarnings() + { + // Construct the warnings + var warnings = new List(); + + // Verify the target + if (string.IsNullOrEmpty(TargetScene)) + warnings.Add("Target scene must be specified"); + + // Return the warnings + return warnings.ToArray(); + } + + /// + /// Handle body entered + /// + /// Body entering this area + private void OnBodyEntered(Node3D body) + { + // Skip if not enabled + if (!Enabled || string.IsNullOrEmpty(TargetScene)) + return; + + // Disable to prevent repeated notifications + Enabled = false; + + // Trigger loading the scene + T5ToolsStaging.LoadScene(TargetScene, Location); + } +} \ No newline at end of file diff --git a/project.csharp/addons/tiltfive_tools/objects/T5ToolsSpectatorCamera.cs b/project.csharp/addons/tiltfive_tools/objects/T5ToolsSpectatorCamera.cs new file mode 100644 index 0000000..8309e22 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/objects/T5ToolsSpectatorCamera.cs @@ -0,0 +1,80 @@ +using Godot; + +public partial class T5ToolsSpectatorCamera : Camera3D +{ + /// + /// Vertical distance + /// + [Export] + public float Vertical { get; set; } = 0.5f; + + /// + /// Horizontal distance + /// + [Export] + public float Horizontal { get; set; } = 1.0f; + + public override void _Ready() + { + base._Ready(); + + // Subscribe to scene loaded (reset camera) + var staging = T5ToolsStaging.Instance; + if (staging != null) + staging.SceneLoaded += OnSceneLoaded; + } + + /// + /// Called during the processing step of the main loop + /// + /// Delta since previous process in seconds + public override void _Process(double delta) + { + base._Process(delta); + + // Calculate the target + var target = Target(); + + // Calculate and correct relative position + var relative = (GlobalPosition - target).Slide(Vector3.Up); + relative = relative.Normalized() * Horizontal; + relative.Y = Vertical; + + // Position and look at the target + GlobalPosition = target + relative; + LookAt(target); + } + + /// + /// Handle scene loaded + /// + /// New scene + /// Custom data + private void OnSceneLoaded(T5ToolsScene scene, Variant userData) + { + // Calculate the target + var target = Target(); + + // Position and look at the target + GlobalPosition = target + new Vector3(0, Vertical, Horizontal); + LookAt(target); + } + + /// + /// Calculate the target (average of player origins) + /// + /// Target position + private static Vector3 Target() + { + // Get the players + var players = T5ToolsStaging.Instance?.Players; + if (players == null || players.Count == 0) + return Vector3.Zero; + + // Return the average of the origins + var pos = Vector3.Zero; + foreach (var player in players) + pos += player.Origin.GlobalTransform.Origin; + return pos / players.Count; + } +} \ No newline at end of file diff --git a/project.csharp/addons/tiltfive_tools/objects/controllers/T5ToolsCharacterBodyController.cs b/project.csharp/addons/tiltfive_tools/objects/controllers/T5ToolsCharacterBodyController.cs new file mode 100644 index 0000000..1a48e9d --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/objects/controllers/T5ToolsCharacterBodyController.cs @@ -0,0 +1,418 @@ +using Godot; + +/// +/// Tilt Five Tools Controller Script for CharacterBody3D +/// +/// +/// This script provides a basic controller for a character body based on +/// a CharacterBody3D (usually with a capsule collider). This script may work in +/// some simple games; however it is intended as a starter script and advanced +/// movement will almost certainly require customization or reimplementation. +/// +/// The movement_changed signal can be used to set animations on a character +/// animation player. The primary_pressed/primary_released signals can be used +/// to detect when the primary button has been pressed - for example to implement +/// firing logic. +/// +public partial class T5ToolsCharacterBodyController : CharacterBody3D +{ + /// + /// Orientation of the controller + /// + public enum ControlOrientationMode + { + /// + /// Vertical - wand pointing forwards + /// + Vertical, + + /// + /// Horizontal - wand pointing to the left + /// + Horizontal + } + + /// + /// Control reference frame + /// + public enum ControlReferenceMode + { + /// + /// Control input relative to player + /// + Player, + + /// + /// Control input relative to world + /// + World + } + + /// + /// Movement state + /// + public enum MovementState + { + /// + /// Character is idle + /// + Idle, + + /// + /// Character is walking + /// + Walking, + + /// + /// Character is running + /// + Running, + + /// + /// Character is jumping + /// + Jumping, + + /// + /// Character is falling + /// + Falling, + + /// + /// Character has landed + /// + Landed + } + + /// + /// Signal for primary button pressed + /// + [Signal] + public delegate void PrimaryPressedEventHandler(); + + /// + /// Signal for primary button released + /// + [Signal] + public delegate void PrimaryReleasedEventHandler(); + + /// + /// Signal for button pressed + /// + /// Button name + [Signal] + public delegate void ButtonPressedEventHandler(StringName name); + + /// + /// Signal for button released + /// + /// Button name + [Signal] + public delegate void ButtonReleasedEventHandler(StringName name); + + /// + /// Signal for character movement state changed + /// + /// + [Signal] + public delegate void MovementChangedEventHandler(MovementState state); + + /// + /// Player node + /// + private T5ToolsPlayer _player; + + /// + /// Origin node + /// + private T5OriginCS _origin; + + /// + /// Camera node + /// + private T5CameraCS _camera; + + /// + /// Movement state + /// + private MovementState _state = MovementState.Idle; + + /// + /// Control vector + /// + private Vector2 _control = Vector2.Zero; + + /// + /// Jump request flag + /// + private bool _jump; + + /// + /// Center the character at the origin + /// + [ExportGroup("Centering", "Center")] + [Export] + public bool CenterCharacter { get; set; } = true; + + /// + /// Center offset + /// + [Export] + public Vector3 CenterOffset { get; set; } = new(0.0f, 2.0f, 0.0f); + + /// + /// Orientation of the controller + /// + [ExportGroup("Controls", "Control")] + [Export] + public ControlOrientationMode ControlOrientation { get; set; } = ControlOrientationMode.Vertical; + + /// + /// Control reference frame + /// + [Export] + public ControlReferenceMode ControlReference { get; set; } = ControlReferenceMode.Player; + + /// + /// Primary button + /// + [Export] + public string ControlPrimaryButton { get; set; } = "trigger_click"; + + /// + /// Jump button + /// + [Export] + public string ControlJump { get; set; } = "button_3"; + + /// + /// Movement speed + /// + [ExportGroup("Movement", "Movement")] + [Export] + public float MovementSpeed { get; set; } = 5.0f; + + /// + /// Jump velocity + /// + [Export] + public float MovementJump { get; set; } = 5.0f; + + /// + /// Flag indicating whether the player has control in the air + /// + [Export] + public bool MovementAirControl { get; set; } = true; + + /// + /// Called when the node becomes "ready" + /// + public override void _Ready() + { + // Get the player + _player = T5ToolsCharacter.FindInstance(this).Player; + _origin = _player.Origin; + _camera = _player.Camera; + + // Subscribe to player wand events + var controller = _player.Wand; + controller.Connect("button_pressed", Callable.From((StringName name) => OnButtonPressed(name))); + controller.Connect("button_released", Callable.From((StringName name) => OnButtonReleased(name))); + controller.Connect("input_vector2_changed", Callable.From((StringName name, Vector2 value) => OnInputVector2Changed(name, value))); + } + + /// + /// Called during the processing step of the main loop + /// + /// Delta since previous process in seconds + public override void _Process(double delta) + { + if (CenterCharacter) + _origin.GlobalPosition = GlobalPosition + CenterOffset; + } + + /// + /// Called during the physics processing step of the main loop + /// + /// Delta since previous process in seconds + public override void _PhysicsProcess(double delta) + { + // Always apply gravity to the player + var gravityState = PhysicsServer3D.BodyGetDirectState(GetRid()); + var gravity = gravityState.TotalGravity; + Velocity += gravity * (float)delta; + + // Handle floor state + if (IsOnFloor()) + { + // Process floor states + if (_state is MovementState.Jumping or MovementState.Falling) + { + // Landed on floor + SetState(MovementState.Landed); + } + else if (_jump) + { + // Execute jump request + SetState(MovementState.Jumping); + Velocity = Velocity with { Y = MovementJump }; + _jump = false; + } + } + else if (Velocity.Y <= 0.0f && _state != MovementState.Falling) + { + // Detect falling + SetState(MovementState.Falling); + } + + // Get the input direction and handle the movement/deceleration + var controlVel = ControlToGlobal(_control) * MovementSpeed; + var direction = controlVel.Normalized(); + + // Face in the desired direction + if (!direction.IsZeroApprox()) + LookAt(GlobalPosition + direction, Vector3.Up, true); + + // Apply the control + if (MovementAirControl || IsOnFloor()) + { + if (!direction.IsZeroApprox()) + Velocity = Velocity with + { + X = controlVel.X, + Z = controlVel.Z + }; + else + Velocity = Velocity with + { + X = Mathf.MoveToward(Velocity.X, 0.0f, MovementSpeed), + Z = Mathf.MoveToward(Velocity.Z, 0.0f, MovementSpeed) + }; + } + + // Move the character + MoveAndSlide(); + + // Handle floor states + if (IsOnFloor()) + { + // Get the ground speed + var groundSpeed = Velocity.Slide(Vector3.Up).Length(); + if (groundSpeed < MovementSpeed * 0.05f) + { + SetState(MovementState.Idle); + } + else if (groundSpeed < MovementSpeed * 0.5f) + { + SetState(MovementState.Walking); + } + else + { + SetState(MovementState.Running); + } + } + } + + /// + /// Get the current movement state + /// + /// Current movement state + public MovementState GetMovementState() => _state; + + /// + /// Set the movement state + /// + /// Movement state + private void SetState(MovementState state) + { + // Skip if no change + if (_state == state) + return; + + // Save and report the new state + _state = state; + EmitSignal(SignalName.MovementChanged, (int)_state); + } + + /// + /// Handle button presses + /// + /// Button name + private void OnButtonPressed(StringName name) + { + // Report the button press + EmitSignal(SignalName.ButtonPressed, name); + + // Handle known buttons + if (name == ControlPrimaryButton) + EmitSignal(SignalName.PrimaryPressed); + else if (name == ControlJump) + _jump = true; + } + + /// + /// Handle button releases + /// + /// Button name + private void OnButtonReleased(StringName name) + { + // Report the button release + EmitSignal(SignalName.ButtonReleased, name); + + // Handle known buttons + if (name == ControlPrimaryButton) + EmitSignal(SignalName.PrimaryReleased); + else if (name == ControlJump) + _jump = false; + } + + /// + /// Handle joystick input + /// + /// Input name + /// Input value + private void OnInputVector2Changed(StringName name, Vector2 value) + { + // Handle known joysticks + if (name == "stick") + _control = value; + } + + /// + /// Convert control input to global vector + /// + /// Control input + /// Global control vector + private Vector3 ControlToGlobal(Vector2 control) + { + // Get the oriented vector + var vec = Vector3.Zero; + switch (ControlOrientation) + { + case ControlOrientationMode.Vertical: + vec = new Vector3(control.X, 0.0f, -control.Y); + break; + + case ControlOrientationMode.Horizontal: + vec = new Vector3(-control.Y, 0.0f, -control.X); + break; + } + + // Translate to reference frame + if (ControlReference == ControlReferenceMode.Player) + { + // Get the frame Z vector (to-player, horizontal, normalized) + var frameZ = (_camera.GlobalPosition - GlobalPosition).Slide(Vector3.Up).Normalized(); + var frame = new Basis( + Vector3.Up.Cross(frameZ), + Vector3.Up, + frameZ); + + // Apply the reference frame + vec = frame * vec; + } + + // Return the vector + return vec; + } +} diff --git a/project.csharp/addons/tiltfive_tools/objects/controllers/T5ToolsRigidBodyController.cs b/project.csharp/addons/tiltfive_tools/objects/controllers/T5ToolsRigidBodyController.cs new file mode 100644 index 0000000..7981902 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/objects/controllers/T5ToolsRigidBodyController.cs @@ -0,0 +1,316 @@ +using Godot; + +/// +/// Tilt Five Tools Controller Script for RigidBody3D +/// +/// +/// This script provides a basic controller for a character body based on +/// a RigidBody3D. These are usually spheres for ball-rolling games. This script +/// may work in some simple games; however it is intended as a starter script +/// and advanced movement will almost certainly require customization or +/// reimplementation. +/// +/// The primary_pressed/primary_released signals can be used to detect when the +/// primary button has been pressed - for example to implement firing logic. +/// +public partial class T5ToolsRigidBodyController : RigidBody3D +{ + /// + /// Orientation of the controller + /// + public enum ControlOrientationMode + { + /// + /// Vertical - wand pointing forwards + /// + Vertical, + + /// + /// Horizontal - wand pointing to the left + /// + Horizontal + } + + /// + /// Control reference frame + /// + public enum ControlReferenceMode + { + /// + /// Control input relative to player + /// + Player, + + /// + /// Control input relative to world + /// + World + } + + /// + /// Signal for primary button pressed + /// + [Signal] + public delegate void PrimaryPressedEventHandler(); + + /// + /// Signal for primary button released + /// + [Signal] + public delegate void PrimaryReleasedEventHandler(); + + /// + /// Signal for button pressed + /// + /// Button name + [Signal] + public delegate void ButtonPressedEventHandler(StringName name); + + /// + /// Signal for button released + /// + /// Button name + [Signal] + public delegate void ButtonReleasedEventHandler(StringName name); + + /// + /// Player node + /// + private T5ToolsPlayer _player; + + /// + /// Origin node + /// + private T5OriginCS _origin; + + /// + /// Camera node + /// + private T5CameraCS _camera; + + /// + /// Control vector + /// + private Vector2 _control = Vector2.Zero; + + /// + /// Jump request flag + /// + private bool _jump; + + /// + /// Center the character at the origin + /// + [ExportGroup("Centering", "Center")] + [Export] + public bool CenterCharacter { get; set; } = true; + + /// + /// Center offset + /// + [Export] + public Vector3 CenterOffset { get; set; } = new(0.0f, 2.0f, 0.0f); + + /// + /// Orientation of the controller + /// + [ExportGroup("Controls", "Control")] + [Export] + public ControlOrientationMode ControlOrientation { get; set; } = ControlOrientationMode.Vertical; + + /// + /// Control reference frame + /// + [Export] + public ControlReferenceMode ControlReference { get; set; } = ControlReferenceMode.Player; + + /// + /// Primary button + /// + [Export] + public string ControlPrimaryButton { get; set; } = "trigger_click"; + + /// + /// Jump button + /// + [Export] + public string ControlJump { get; set; } = "button_3"; + + /// + /// Movement force + /// + [ExportGroup("Movement", "Movement")] + [Export] + public float MovementForce { get; set; } = 7.0f; + + /// + /// Jump velocity + /// + [Export] + public float MovementJump { get; set; } = 5.0f; + + /// + /// Flag indicating whether the player has control in the air + /// + [Export] + public bool MovementAirControl { get; set; } = true; + + /// + /// Called when the node becomes "ready" + /// + public override void _Ready() + { + // Get the player + _player = T5ToolsCharacter.FindInstance(this).Player; + _origin = _player.Origin; + _camera = _player.Camera; + + // Subscribe to player wand events + var controller = _player.Wand; + controller?.Connect("button_pressed", Callable.From((StringName name) => OnButtonPressed(name))); + controller?.Connect("button_released", Callable.From((StringName name) => OnButtonReleased(name))); + controller?.Connect("input_vector2_changed", Callable.From((StringName name, Vector2 value) => OnInputVector2Changed(name, value))); + } + + /// + /// Called during the processing step of the main loop + /// + /// Delta since previous process in seconds + public override void _Process(double delta) + { + if (CenterCharacter) + _origin.GlobalPosition = GlobalPosition + CenterOffset; + } + + /// + /// Called during the physics processing step of the main loop + /// + /// Delta since previous process in seconds + public override void _PhysicsProcess(double delta) + { + // Test if the player is on the ground + var onGround = IsOnGround(); + + // Allow jumping while on the ground + if (onGround && _jump) + { + LinearVelocity = LinearVelocity with { Y = MovementJump }; + _jump = false; + } + + // Apply movement force + if (onGround || MovementAirControl) + ApplyCentralForce( + ControlToGlobal(_control) * MovementForce); + } + + /// + /// Handle button presses + /// + /// Button name + private void OnButtonPressed(StringName name) + { + // Report the button press + EmitSignal(SignalName.ButtonPressed, name); + + // Handle known buttons + if (name == ControlPrimaryButton) + EmitSignal(SignalName.PrimaryPressed); + else if (name == ControlJump) + _jump = true; + } + + /// + /// Handle button releases + /// + /// Button name + private void OnButtonReleased(StringName name) + { + // Report the button release + EmitSignal(SignalName.ButtonReleased, name); + + // Handle known buttons + if (name == ControlPrimaryButton) + EmitSignal(SignalName.PrimaryReleased); + else if (name == ControlJump) + _jump = false; + } + + /// + /// Handle joystick input + /// + /// Input name + /// Input value + private void OnInputVector2Changed(StringName name, Vector2 value) + { + // Handle known joysticks + if (name == "stick") + _control = value; + } + + private bool IsOnGround() + { + // Probe down to see if there is any ground + var collision = new KinematicCollision3D(); + if (!TestMove(GlobalTransform, Vector3.Down * 0.1f, collision, 0.01f, false, 3)) + return false; + + // Inspect all collisions + for (var c = 0; c < collision.GetCollisionCount(); ++c) + { + // Skip if the contact is too steep to be called ground + if (collision.GetAngle(c) > Mathf.DegToRad(60.0f)) + continue; + + // Test if moving up relative to the ground + var groundVelocity = collision.GetColliderVelocity(c); + var relativeVelocity = LinearVelocity - groundVelocity; + if (relativeVelocity.Y > 0.1) + continue; + + // Found a working collision + return true; + } + + // No valid collisions + return false; + } + + /// + /// Convert control input to global vector + /// + /// Control input + /// Global control vector + private Vector3 ControlToGlobal(Vector2 control) + { + // Get the oriented vector + var vec = Vector3.Zero; + switch (ControlOrientation) + { + case ControlOrientationMode.Vertical: + vec = new Vector3(control.X, 0.0f, -control.Y); + break; + + case ControlOrientationMode.Horizontal: + vec = new Vector3(-control.Y, 0.0f, -control.X); + break; + } + + // Translate to reference frame + if (ControlReference == ControlReferenceMode.Player) + { + // Get the frame Z vector (to-player, horizontal, normalized) + var frameZ = (_camera.GlobalPosition - GlobalPosition).Slide(Vector3.Up).Normalized(); + var frame = new Basis( + Vector3.Up.Cross(frameZ), + Vector3.Up, + frameZ); + + // Apply the reference frame + vec = frame * vec; + } + + // Return the vector + return vec; + } +} diff --git a/project.csharp/addons/tiltfive_tools/objects/scene_switch_area.tscn b/project.csharp/addons/tiltfive_tools/objects/scene_switch_area.tscn new file mode 100644 index 0000000..1b97a90 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/objects/scene_switch_area.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://7tcfuro5b3kx"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/objects/T5ToolsSceneSwitchArea.cs" id="1_88fra"] + +[node name="SceneSwitchArea" type="Area3D"] +collision_layer = 0 +collision_mask = 524288 +script = ExtResource("1_88fra") diff --git a/project.csharp/addons/tiltfive_tools/objects/spectator_camera.tscn b/project.csharp/addons/tiltfive_tools/objects/spectator_camera.tscn new file mode 100644 index 0000000..c5b76b1 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/objects/spectator_camera.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=2 format=3 uid="uid://cy1vbgijgvfb0"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/objects/T5ToolsSpectatorCamera.cs" id="1_a24vv"] + +[node name="SpectatorCamera" type="Camera3D"] +cull_mask = 3 +script = ExtResource("1_a24vv") diff --git a/project.csharp/addons/tiltfive_tools/objects/viewport/T5ToolsViewport2Din3D.cs b/project.csharp/addons/tiltfive_tools/objects/viewport/T5ToolsViewport2Din3D.cs new file mode 100644 index 0000000..ff61964 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/objects/viewport/T5ToolsViewport2Din3D.cs @@ -0,0 +1,878 @@ +using System; +using Godot; +using Godot.Collections; + +/// +/// Tilt Five Tools Viewport2Din3D +/// +/// +/// This script manages a 2D scene rendered as a texture on a 3D quad. The +/// Visible and Collision layers control visibility and collision for all +/// players; however if the Viewport2Din3D is a child of a player then the +/// players visibility and collision are automatically included. This allows +/// for UIs specific to a player by adding them to the custom player scene. +/// +[Tool] +public partial class T5ToolsViewport2Din3D : Node3D +{ + /// + /// Transparency mode + /// + public enum TransparencyMode + { + /// + /// Render opaque + /// + Opaque, + + /// + /// Render transparent + /// + Transparent, + + /// + /// Render using alpha-scissor + /// + Scissor + } + + /// + /// Viewport update mode + /// + public enum ViewportUpdateMode + { + /// + /// Update once (redraw triggered if set again to UpdateOnce + /// + UpdateOnce, + + /// + /// Update on every frame + /// + UpdateAlways, + + /// + /// Update at throttled rate + /// + UpdateThrottled + } + + /// + /// State dirty flags + /// + [Flags] + private enum Dirty + { + Material = 1, + Scene = 2, + Size = 4, + Albedo = 8, + Update = 16, + Transparency = 32, + AlphaScissor = 64, + Unshaded = 128, + Filtered = 256, + Surface = 512, + Redraw = 1024, + All = 2047 + } + + /// + /// Default visual layer of 1:Everyone + /// + private const uint VisualDefault = 1U; + + /// + /// Default physics layer of 21:Pointable + /// + private const uint PhysicsDefault = 0b0000_0000_0001_0000_0000_0000_0000_0000U; + + /// + /// Physical screen size backing field + /// + private Vector2 _screenSize = new(3.0f, 2.0f); + + /// + /// Collision layer backing field + /// + private uint _collisionLayer = PhysicsDefault; + + /// + /// Scene backing field + /// + private PackedScene _scene; + + /// + /// Viewport size backing field + /// + private Vector2 _viewportSize = new(300.0f, 200.0f); + + /// + /// Viewport update mode backing field + /// + private ViewportUpdateMode _updateMode = ViewportUpdateMode.UpdateAlways; + + /// + /// Visible layers backing field + /// + private uint _visibleLayers = VisualDefault; + + /// + /// Custom material template backing field + /// + private StandardMaterial3D _material; + + /// + /// Transparent mode backing field + /// + private TransparencyMode _transparent = TransparencyMode.Transparent; + + /// + /// Alpha scissor threshold backing field + /// + private float _alphaScissorThreshold = 0.25f; + + /// + /// Unshaded backing field + /// + private bool _unshaded; + + /// + /// Filter backing field + /// + private bool _filter = true; + + /// + /// Current scene node + /// + private Node _sceneNode; + + /// + /// Viewport texture + /// + private ViewportTexture _viewportTexture; + + /// + /// Time since the last update + /// + private double _timeSinceLastUpdate; + + /// + /// Screen material + /// + private StandardMaterial3D _screenMaterial; + + /// + /// Viewport instance + /// + private SubViewport _viewport; + + /// + /// Screen mesh instance + /// + private MeshInstance3D _screenMesh; + + /// + /// Screen quad mesh + /// + private QuadMesh _screenQuadMesh; + + /// + /// Screen body + /// + private T5ToolsViewport2Din3DBody _screenBody; + + /// + /// Screen collision shape + /// + private CollisionShape3D _screenShape; + + /// + /// Screen box shape + /// + private BoxShape3D _screenBoxShape; + + /// + /// Owning player (null if global) + /// + private T5ToolsPlayer _player; + + /// + /// Dirty flags + /// + private Dirty _dirty = Dirty.All; + + /// + /// Signal when pointer event occurs + /// + /// Pointer event + [Signal] + public delegate void PointerEventEventHandler(T5ToolsPointerEvent pointerEvent); + + + /// Physical screen size property + [ExportGroup("Physics")] + [Export] + public Vector2 ScreenSize + { + get => _screenSize; + set => SetScreenSize(value); + } + + /// + /// Collision layer + /// + [Export(PropertyHint.Layers3DPhysics)] + public uint CollisionLayer + { + get => _collisionLayer; + set => SetCollisionLayer(value); + } + + /// + /// Scene property + /// + [ExportGroup("Content")] + [Export] + public PackedScene Scene + { + get => _scene; + set => SetScene(value); + } + + /// + /// Viewport size property + /// + [Export] + public Vector2 ViewportSize + { + get => _viewportSize; + set => SetViewportSize(value); + } + + /// + /// Update mode property + /// + [Export] + public ViewportUpdateMode UpdateMode + { + get => _updateMode; + set => SetUpdateMode(value); + } + + /// + /// Update throttle property + /// + [Export] + public float ThrottleFps { get; set; } = 30.0f; + + /// + /// Visible layers + /// + [ExportGroup("Rendering")] + + [Export(PropertyHint.Layers3DRender)] + public uint VisibleLayers + { + get => _visibleLayers; + set => SetVisibleLayers(value); + } + + /// + /// Custom material template + /// + [Export] + public StandardMaterial3D Material + { + get => _material; + set => SetMaterial(value); + } + + /// + /// Transparent property + /// + [Export] + public TransparencyMode Transparent + { + get => _transparent; + set => SetTransparent(value); + } + + /// + /// Alpha Scissor Threshold property (ignored when custom material provided) + /// + public float AlphaScissorThreshold + { + get => _alphaScissorThreshold; + set => SetAlphaScissorThreshold(value); + } + + /// + /// Unshaded flag (ignored when custom material provided) + /// + public bool Unshaded + { + get => _unshaded; + set => SetUnshaded(value); + } + + /// + /// Filtered flag (ignored when custom material provided) + /// + public bool Filtered + { + get => _filter; + set => SetFilter(value); + } + + /// + /// Called when the node is "ready" + /// + public override void _Ready() + { + base._Ready(); + + // Get the nodes + _viewport = GetNode("Viewport"); + _screenMesh = GetNode("Screen"); + _screenBody = GetNode("StaticBody3D"); + _screenShape = GetNode("StaticBody3D/CollisionShape3D"); + _screenQuadMesh = _screenMesh.Mesh as QuadMesh; + _screenBoxShape = _screenShape.Shape as BoxShape3D; + + // Test if the viewport is under a player + _player = T5ToolsPlayer.FindInstance(this); + + // Listen for pointer events on the screen body + var body = GetNode("StaticBody3D"); + body.PointerEvent += OnPointerEvent; + + // Update enabled based on visibility + VisibilityChanged += UpdateEnabled; + + // Apply physics properties + UpdateScreenSize(); + UpdateVisibleLayers(); + UpdateCollisionLayer(); + UpdateEnabled(); + + // Update the render objects + UpdateRender(); + } + + public override Array _GetPropertyList() + { + // Select visibility of properties + var showAlphaScissor = _material == null && _transparent == TransparencyMode.Scissor; + var showUnshaded = _material == null; + var showFilter = _material == null; + + return new Array + { + new() + { + { "name", "Rendering" }, + { "type", (int)Variant.Type.Nil }, + { "usage", (int)PropertyUsageFlags.Group } + }, + new() + { + { "name", "AlphaScissorThreshold" }, + { "type", (int)Variant.Type.Float }, + { "usage", (int)(showAlphaScissor ? PropertyUsageFlags.Default : PropertyUsageFlags.NoEditor) }, + { "hint", (int)PropertyHint.Range }, + { "hint_string", "0.0,1.0" } + }, + new() + { + { "name", "Unshaded" }, + { "type", (int)Variant.Type.Bool }, + { "usage", (int)(showUnshaded ? PropertyUsageFlags.Default : PropertyUsageFlags.NoEditor) } + }, + new() + { + { "name", "Filter" }, + { "type", (int)Variant.Type.Bool }, + { "usage", (int)(showFilter ? PropertyUsageFlags.Default : PropertyUsageFlags.NoEditor) } + } + }; + } + + /// + /// Allow revert of custom properties + /// + /// Property name + /// True if can be reverted + public override bool _PropertyCanRevert(StringName property) + { + if (property == "alpha_scissor_threshold") return true; + if (property == "unshaded") return true; + if (property == "filter") return true; + return base._PropertyCanRevert(property); + } + + /// + /// Provide revert values for custom properties + /// + /// Property name + /// Property revert value + public override Variant _PropertyGetRevert(StringName property) + { + if (property == "alpha_scissor_threshold") return 0.25f; + if (property == "unshaded") return false; + if (property == "filter") return true; + return base._PropertyGetRevert(property); + } + + /// + /// Get the 2D scene instance + /// + /// 2D scene instance + public Node GetSceneInstance() => _sceneNode; + + /// + /// Connect a 2D scene signal + /// + /// Signal name + /// Callback + /// Connection flags + public void ConnectSceneSignal(string signal, Callable callback, uint flags = 0) + { + _sceneNode?.Connect(signal, callback, flags); + } + + /// + /// Handle pointer event from screen-body + /// + /// Pointer event + private void OnPointerEvent(T5ToolsPointerEvent pointerEvent) + { + EmitSignal(SignalName.PointerEvent, pointerEvent); + } + + /// + /// Handler for input events + /// + /// Input event + public override void _Input(InputEvent @event) + { + if (@event is not InputEventMouseButton) + _viewport.PushInput(@event); + } + + public override void _Process(double delta) + { + base._Process(delta); + + // Process screen refreshing + if (Engine.IsEditorHint()) + { + _timeSinceLastUpdate += delta; + if (_timeSinceLastUpdate > 1.0) + { + _timeSinceLastUpdate = 0.0; + // Trigger material refresh + _dirty |= Dirty.Material; + UpdateRender(); + } + } + else if (_updateMode == ViewportUpdateMode.UpdateThrottled) + { + // Perform throttled updates of the viewport + _timeSinceLastUpdate += delta; + if (_timeSinceLastUpdate > 1.0 / ThrottleFps) + { + _timeSinceLastUpdate = 0.0; + // Trigger update + _viewport.RenderTargetUpdateMode = SubViewport.UpdateMode.Once; + } + } + else + { + // This is no longer needed + SetProcess(false); + } + } + + /// + /// Handle setting screen size property + /// + /// New screen size + private void SetScreenSize(Vector2 size) + { + _screenSize = size; + if (IsInsideTree()) + UpdateScreenSize(); + } + + /// + /// Handle setting collision layer property + /// + /// New collision layer + private void SetCollisionLayer(uint layer) + { + _collisionLayer = layer; + if (IsInsideTree()) + UpdateCollisionLayer(); + } + + /// + /// Handle setting scene property + /// + /// New scene + private void SetScene(PackedScene scene) + { + _scene = scene; + _dirty |= Dirty.Scene; + if (IsInsideTree()) + UpdateRender(); + } + + /// + /// Handle setting viewport size property + /// + /// New viewport size + private void SetViewportSize(Vector2 size) + { + _viewportSize = size; + _dirty |= Dirty.Size; + if (IsInsideTree()) + UpdateRender(); + } + + /// + /// Handle setting update mode property + /// + /// New update mode + private void SetUpdateMode(ViewportUpdateMode mode) + { + _updateMode = mode; + _dirty |= Dirty.Update; + if (IsInsideTree()) + UpdateRender(); + } + + /// + /// Handle setting visible layers property + /// + /// Visible layers + private void SetVisibleLayers(uint layers) + { + _visibleLayers = layers; + _dirty |= Dirty.Surface; + if (IsInsideTree()) + UpdateVisibleLayers(); + } + + /// + /// Handle setting material property + /// + /// New material + private void SetMaterial(StandardMaterial3D material) + { + _material = material; + NotifyPropertyListChanged(); + _dirty |= Dirty.Material; + if (IsInsideTree()) + UpdateRender(); + } + + /// + /// Handle setting transparency property + /// + /// New transparency mode + private void SetTransparent(TransparencyMode transparent) + { + _transparent = transparent; + NotifyPropertyListChanged(); + _dirty |= Dirty.Transparency; + if (IsInsideTree()) + UpdateRender(); + } + + /// + /// Handle setting alpha scissor threshold property + /// + /// New threshold + private void SetAlphaScissorThreshold(float threshold) + { + _alphaScissorThreshold = threshold; + _dirty |= Dirty.AlphaScissor; + if (IsInsideTree()) + UpdateRender(); + } + + /// + /// Handle setting unshaded property + /// + /// New unshaded flag + private void SetUnshaded(bool unshaded) + { + _unshaded = unshaded; + _dirty |= Dirty.Unshaded; + if (IsInsideTree()) + UpdateRender(); + } + + /// + /// Handle setting filter property + /// + /// New filter flag + private void SetFilter(bool filter) + { + _filter = filter; + _dirty |= Dirty.Filtered; + if (IsInsideTree()) + UpdateRender(); + } + + /// + /// Screen size update handler + /// + private void UpdateScreenSize() + { + _screenQuadMesh.Size = _screenSize; + _screenBody.ScreenSize = _screenSize; + _screenBoxShape.Size = new Vector3(_screenSize.X, _screenSize.Y, 0.02f); + } + + /// + /// Enabled update handler + /// + private void UpdateEnabled() + { + // Ignore if in editor + if (Engine.IsEditorHint()) + return; + + // Update the screen shape disabled flag + _screenShape.Disabled = !IsVisibleInTree(); + } + + /// + /// Collision layer update handler + /// + private void UpdateCollisionLayer() + { + // Ignore if in editor + if (Engine.IsEditorHint()) + return; + + // Calculate the collision layer + var layer = _collisionLayer; + if (_player != null) + layer |= _player.GetPlayerPhysicsLayer(); + + // Update the collision layer + _screenBody.CollisionLayer = layer; + } + + /// + /// Visible layers update handler + /// + private void UpdateVisibleLayers() + { + // Ignore if in editor + if (Engine.IsEditorHint()) + return; + + // Calculate the visible layers + var layers = _visibleLayers; + if (_player != null) + layers |= _player.GetPlayerVisibleLayer(); + + // Update the visible layers + _screenMesh.Layers = layers; + } + + /// + /// Update render objects based on dirty flags + /// + private void UpdateRender() + { + // Handle material change + if (_dirty.HasFlag(Dirty.Material)) + { + _dirty &= ~Dirty.Material; + + // Construct the new screen material + if (_material != null) + { + // Copy custom material + _screenMaterial = _material.Duplicate() as StandardMaterial3D; + } + else + { + // Create new local material + _screenMaterial = new StandardMaterial3D(); + + // Disable culling + _screenMaterial.CullMode = BaseMaterial3D.CullModeEnum.Disabled; + + // Ensure local material is configured + _dirty |= Dirty.Transparency | Dirty.AlphaScissor | Dirty.Unshaded | Dirty.Filtered; + } + + // Ensure new material renders viewport onto surface + _dirty |= Dirty.Albedo | Dirty.Surface; + } + + // If we have no screen material then skip everything else + if (_screenMaterial == null) + return; + + // Handle scene change + if (_dirty.HasFlag(Dirty.Scene)) + { + _dirty &= ~Dirty.Scene; + + // Out with the old + if (GodotObject.IsInstanceValid(_sceneNode)) + { + _viewport.RemoveChild(_sceneNode); + _sceneNode?.QueueFree(); + } + + // In with the new + if (_scene != null) + { + // Instantiate provided scene + _sceneNode = _scene.Instantiate(); + _viewport.AddChild(_sceneNode); + } + else if (_viewport.GetChildCount() > 0) + { + // Use already-provided scene + _sceneNode = _viewport.GetChild(0); + } + + // Ensure the new scene is rendered at least once + _dirty |= Dirty.Redraw; + } + + // Handle viewport size change + if (_dirty.HasFlag(Dirty.Size)) + { + _dirty &= ~Dirty.Size; + + // Update the viewport size + _viewport.Size = (Vector2I)_viewportSize; + _screenBody.ViewportSize = _viewportSize; + + // Update our viewport texture, it will have changed + _dirty |= Dirty.Albedo; + } + + // Handle albedo change + if (_dirty.HasFlag(Dirty.Albedo)) + { + _dirty &= ~Dirty.Albedo; + + // Set the screen material to use the viewport for the albedo channel + _viewportTexture = _viewport.GetTexture(); + _screenMaterial.AlbedoTexture = _viewportTexture; + } + + // Handle update mode change + if (_dirty.HasFlag(Dirty.Update)) + { + _dirty &= ~Dirty.Update; + + // Apply update rules + if (Engine.IsEditorHint() || _updateMode == ViewportUpdateMode.UpdateThrottled) + { + // Update once. Process function used for periodic updates + _viewport.RenderTargetUpdateMode = SubViewport.UpdateMode.Once; + SetProcess(true); + } + else if (_updateMode == ViewportUpdateMode.UpdateOnce) + { + // Update once. Process function not used + _viewport.RenderTargetUpdateMode = SubViewport.UpdateMode.Once; + SetProcess(false); + } + else if (_updateMode == ViewportUpdateMode.UpdateAlways) + { + // Update always. Process function not used + _viewport.RenderTargetUpdateMode = SubViewport.UpdateMode.Always; + SetProcess(false); + } + } + + // Handle transparency update + if (_dirty.HasFlag(Dirty.Transparency)) + { + _dirty &= ~Dirty.Transparency; + + // If using a temporary material then update transparency + if (_material == null) + { + // Set material transparency + _screenMaterial.Transparency = _transparent switch + { + TransparencyMode.Opaque => BaseMaterial3D.TransparencyEnum.Disabled, + TransparencyMode.Scissor => BaseMaterial3D.TransparencyEnum.AlphaScissor, + TransparencyMode.Transparent => BaseMaterial3D.TransparencyEnum.Alpha, + _ => BaseMaterial3D.TransparencyEnum.Disabled + }; + } + + // Set the viewport background transparency mode and force a redraw + _viewport.TransparentBg = _transparent != TransparencyMode.Opaque; + _dirty |= Dirty.Redraw; + } + + // Handle alpha scissor update + if (_dirty.HasFlag(Dirty.AlphaScissor)) + { + _dirty &= ~Dirty.AlphaScissor; + + // If using a temporary material with alpha-scissor then update + if (_material == null && _transparent == TransparencyMode.Scissor) + _screenMaterial.AlphaScissorThreshold = _alphaScissorThreshold; + } + + // Handle unshaded update + if (_dirty.HasFlag(Dirty.Unshaded)) + { + _dirty &= ~Dirty.Unshaded; + + // If using a temporary material with unshaded then update + if (_material == null) + _screenMaterial.ShadingMode = _unshaded ? + BaseMaterial3D.ShadingModeEnum.Unshaded : + BaseMaterial3D.ShadingModeEnum.PerPixel; + } + + // Handle filter update + if (_dirty.HasFlag(Dirty.Filtered)) + { + _dirty &= ~Dirty.Filtered; + + // If using a temporary material with filter then update + if (_material == null) + _screenMaterial.TextureFilter = _filter ? + BaseMaterial3D.TextureFilterEnum.Linear : + BaseMaterial3D.TextureFilterEnum.Nearest; + } + + // Handle surface material update + if (_dirty.HasFlag(Dirty.Surface)) + { + _dirty &= ~Dirty.Surface; + + // Set the screen to render using the new screen material + _screenMesh.SetSurfaceOverrideMaterial(0, _screenMaterial); + } + + // Handle forced redraw of the viewport + if (_dirty.HasFlag(Dirty.Redraw)) + { + _dirty &= ~Dirty.Redraw; + + // Force a redraw of the viewport + if (Engine.IsEditorHint() || _updateMode == ViewportUpdateMode.UpdateOnce) + _viewport.RenderTargetUpdateMode = SubViewport.UpdateMode.Once; + } + } +} \ No newline at end of file diff --git a/project.csharp/addons/tiltfive_tools/objects/viewport/T5ToolsViewport2Din3DBody.cs b/project.csharp/addons/tiltfive_tools/objects/viewport/T5ToolsViewport2Din3DBody.cs new file mode 100644 index 0000000..39effda --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/objects/viewport/T5ToolsViewport2Din3DBody.cs @@ -0,0 +1,336 @@ +using System.Collections.Generic; +using System.Linq; +using Godot; + +[Tool] +public partial class T5ToolsViewport2Din3DBody : StaticBody3D +{ + /// + /// Signal when pointer event occurs on body + /// + /// Pointer event + [Signal] + public delegate void PointerEventEventHandler(T5ToolsPointerEvent pointerEvent); + + /// + /// Screen size + /// + [Export] + public Vector2 ScreenSize { get; set; } = new(3.0f, 2.0f); + + /// + /// Viewport size + /// + public Vector2 ViewportSize { get; set; } = new(100.0f, 100.0f); + + /// + /// Current mouse mask + /// + private int _mouseMask; + + /// + /// Viewport node + /// + private Viewport _viewport; + + /// + /// Collision shape + /// + private CollisionShape3D _collisionShape; + + /// + /// Dictionary of pointers to touch-index + /// + private readonly Dictionary _touches = new(); + + /// + /// List of pressed pointers + /// + private readonly Dictionary _presses = new(); + + /// + /// Dominant pointer (index == 0) + /// + private Node3D _dominant; + + /// + /// Mouse pointer + /// + private Node3D _mouse; + + /// + /// Last mouse position + /// + private Vector2 _mouseLast = Vector2.Zero; + + public override void _Ready() + { + base._Ready(); + + // Get the viewport node + _viewport = GetNode("../Viewport"); + _collisionShape = GetNode("CollisionShape3D"); + + // Subscribe to pointer events + PointerEvent += OnPointerEvent; + } + + /// + /// Convert intersection point to screen coordinate + /// + /// Intersection point (global) + /// Screen X/Y position + public Vector2 GlobalToViewport(Vector3 at) + { + // Convert to local + var t = _collisionShape.GlobalTransform; + var atLocal = t.AffineInverse() * at; + + // Convert to screen-space + atLocal.X = ((atLocal.X / ScreenSize.X) + 0.5f) * ViewportSize.X; + atLocal.Y = (0.5f - (atLocal.Y / ScreenSize.Y)) * ViewportSize.Y; + + // Return screen-space position + return new Vector2(atLocal.X, atLocal.Y); + } + + /// + /// Pointer event handler + /// + /// Pointer event + private void OnPointerEvent(T5ToolsPointerEvent pointerEvent) + { + // Ignore if we have no viewport + if (!GodotObject.IsInstanceValid(_viewport)) + return; + + // Get the pointer and event type + var pointer = pointerEvent.Pointer; + var type = pointerEvent.EventType; + + // Get the touch index [0..] + var index = _touches.TryGetValue(pointer, out var touch) ? touch : -1; + + // Create a new touch-index if necessary + if (index < 0 || type == T5ToolsPointerEvent.Type.Entered) + { + // Clear any stale pointer information + _touches.Remove(pointer); + _presses.Remove(pointer); + + // Assign a new touch-index for the pointer + index = NextTouchIndex(); + _touches[pointer] = index; + + // Detect dominant pointer + if (index == 0) + _dominant = pointer; + } + + // Get the viewport positions + var at = GlobalToViewport(pointerEvent.Position); + var last = GlobalToViewport(pointerEvent.LastPosition); + + // Get/update pressed state + bool pressed; + switch (type) + { + case T5ToolsPointerEvent.Type.Pressed: + _presses[pointer] = true; + pressed = true; + break; + + case T5ToolsPointerEvent.Type.Released: + _presses.Remove(pointer); + pressed = false; + break; + + default: + pressed = _presses.ContainsKey(pointer); + break; + } + + // Dispatch touch events + switch (type) + { + case T5ToolsPointerEvent.Type.Pressed: + ReportTouchDown(index, at); + break; + + case T5ToolsPointerEvent.Type.Released: + ReportTouchUp(index, at); + break; + + case T5ToolsPointerEvent.Type.Moved: + ReportTouchMove(index, pressed, last, at); + break; + } + + // If the current mouse isn't pressed then consider switching to a new one + if (_mouse == null || !_presses.ContainsKey(_mouse)) + { + if (type == T5ToolsPointerEvent.Type.Pressed && pointer is T5ToolsPointer) + { + // Switch to pressed laser-pointer + _mouse = pointer; + } + else if (type == T5ToolsPointerEvent.Type.Exited && pointer == _mouse) + { + // Current mouse leaving, switch to dominant + _mouse = _dominant; + } + else if (_mouse == null && _dominant != null) + { + // No mouse, pick the dominant + _mouse = _dominant; + } + } + + // Fire mouse events + if (pointer == _mouse) + { + switch (type) + { + case T5ToolsPointerEvent.Type.Pressed: + ReportMouseDown(at); + break; + + case T5ToolsPointerEvent.Type.Released: + ReportMouseUp(at); + break; + + case T5ToolsPointerEvent.Type.Moved: + ReportMouseMove(pressed, last, at); + break; + } + } + + // Clear pointer information on exit + if (type == T5ToolsPointerEvent.Type.Exited) + { + // Clear pointer information + _touches.Remove(pointer); + _presses.Remove(pointer); + if (pointer == _dominant) + _dominant = null; + if (pointer == _mouse) + _mouse = null; + } + } + + /// + /// Report touch-down event + /// + /// Touch index + /// Touch position + private void ReportTouchDown(int index, Vector2 at) + { + _viewport?.PushInput(new InputEventScreenTouch + { + Index = index, + Position = at, + Pressed = true, + }); + } + + /// + /// Report touch-up event + /// + /// Touch index + /// Touch position + private void ReportTouchUp(int index, Vector2 at) + { + _viewport?.PushInput(new InputEventScreenTouch + { + Index = index, + Position = at, + Pressed = false, + }); + } + + /// + /// Report touch-move event + /// + /// Touch index + /// Pressed flag + /// From position + /// To position + private void ReportTouchMove(int index, bool pressed, Vector2 from, Vector2 to) + { + _viewport?.PushInput(new InputEventScreenDrag + { + Index = index, + Position = to, + Pressure = pressed ? 1.0f : 0.0f, + Relative = to - from, + }); + } + + /// + /// Report mouse-down event + /// + /// Mouse position + private void ReportMouseDown(Vector2 at) + { + _viewport?.PushInput(new InputEventMouseButton + { + ButtonIndex = MouseButton.Left, + Pressed = true, + Position = at, + GlobalPosition = at, + ButtonMask = MouseButtonMask.Left + }); + } + + /// + /// Report mouse-up event + /// + /// Mouse position + private void ReportMouseUp(Vector2 at) + { + _viewport?.PushInput(new InputEventMouseButton + { + ButtonIndex = MouseButton.Left, + Pressed = false, + Position = at, + GlobalPosition = at, + ButtonMask = 0 + }); + } + + /// + /// Report mouse-move event + /// + /// Pressed flag + /// From position + /// To position + private void ReportMouseMove(bool pressed, Vector2 from, Vector2 to) + { + _viewport?.PushInput(new InputEventMouseMotion + { + Position = to, + GlobalPosition = to, + Relative = to - from, + ButtonMask = pressed ? MouseButtonMask.Left : 0, + Pressure = pressed ? 1.0f : 0.0f, + }); + } + + /// + /// Find the next free touch index + /// + /// + private int NextTouchIndex() + { + // Get the current touches + var current = _touches.Values.OrderBy(x => x).ToArray(); + + // Look for a hole + for (var t = 0; t < current.Length; t++) + if (current[t] != t) + return t; + + // No hole so add to end + return current.Length; + } +} diff --git a/project.csharp/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.tscn b/project.csharp/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.tscn new file mode 100644 index 0000000..7d97688 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.tscn @@ -0,0 +1,46 @@ +[gd_scene load_steps=7 format=3 uid="uid://0l6uvyibyfq7"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/objects/viewport/T5ToolsViewport2Din3D.cs" id="1_8rlxr"] +[ext_resource type="Script" path="res://addons/tiltfive_tools/objects/viewport/T5ToolsViewport2Din3DBody.cs" id="2_ejp6h"] + +[sub_resource type="QuadMesh" id="QuadMesh_knvfo"] +resource_local_to_scene = true +size = Vector2(3, 2) + +[sub_resource type="ViewportTexture" id="ViewportTexture_0wmr2"] +viewport_path = NodePath("Viewport") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gkkvm"] +transparency = 1 +cull_mode = 2 +albedo_texture = SubResource("ViewportTexture_0wmr2") +texture_filter = 1 + +[sub_resource type="BoxShape3D" id="BoxShape3D_0qjn5"] +resource_local_to_scene = true +size = Vector3(3, 2, 0.02) + +[node name="Viewport2Din3D" type="Node3D"] +script = ExtResource("1_8rlxr") +alpha_scissor_threshold = null +unshaded = null +filter = null + +[node name="Viewport" type="SubViewport" parent="."] +disable_3d = true +transparent_bg = true +gui_embed_subwindows = true +size = Vector2i(300, 200) +render_target_update_mode = 1 + +[node name="Screen" type="MeshInstance3D" parent="."] +mesh = SubResource("QuadMesh_knvfo") +surface_material_override/0 = SubResource("StandardMaterial3D_gkkvm") + +[node name="StaticBody3D" type="StaticBody3D" parent="."] +collision_layer = 1048576 +script = ExtResource("2_ejp6h") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.01) +shape = SubResource("BoxShape3D_0qjn5") diff --git a/project.csharp/addons/tiltfive_tools/staging/T5ToolsCharacter.cs b/project.csharp/addons/tiltfive_tools/staging/T5ToolsCharacter.cs new file mode 100644 index 0000000..2a5112f --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/staging/T5ToolsCharacter.cs @@ -0,0 +1,32 @@ +using Godot; + +public partial class T5ToolsCharacter : Node3D +{ + /// + /// Player associated with this character + /// + [Export] + public T5ToolsPlayer Player { get; set; } + + /// + /// Find the T5ToolsCharacter from a child node + /// + /// Node to search from + /// Character or null + public static T5ToolsCharacter FindInstance(Node node) + { + // Walk the node tree + while (node != null) + { + // If we have the character then return it + if (node is T5ToolsCharacter character) + return character; + + // Walk up to the parent + node = node.GetParent(); + } + + // Not found + return null; + } +} \ No newline at end of file diff --git a/project.csharp/addons/tiltfive_tools/staging/T5ToolsPlayer.cs b/project.csharp/addons/tiltfive_tools/staging/T5ToolsPlayer.cs new file mode 100644 index 0000000..8b0fc06 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/staging/T5ToolsPlayer.cs @@ -0,0 +1,176 @@ +using System.Collections.Generic; +using Godot; + +/// +/// Tilt Five Tools Player Node +/// +/// +/// This node is a T5XRRig with additional capabilities to work with the +/// Tilt Five Tools Staging, Scene, and Character features. Applications should +/// create a custom player scene extending from this scene/node to customize the +/// player - for example to adjust the visible layers or add pointers. +/// +public partial class T5ToolsPlayer : T5XRRig +{ + /// + /// All players list + /// + private static readonly List Players = new(); + + // Visible layers + private uint _visibleLayers = 5; + + // Player number + private int _playerNumber = -1; + + /// + /// Player visibility layers + /// + [Export(PropertyHint.Layers3DRender)] + public uint VisibleLayers + { + get => _visibleLayers; + set => SetVisibleLayers(value); + } + + /// + /// Player number [0..3] (set by Staging on load) + /// + [Export] + public int PlayerNumber + { + get => _playerNumber; + set => SetPlayerNumber(value); + } + + /// + /// Called when the node enters the scene tree + /// + public override void _EnterTree() + { + base._EnterTree(); + + // Assign the next free player number + for (var n = 0; n < 4; ++n) + if (Players.TrueForAll(p => p._playerNumber != n)) + { + _playerNumber = n; + break; + } + + // Save as a player + Players.Add(this); + } + + /// + /// Called when the node is about to leave the scene tree + /// + public override void _ExitTree() + { + base._ExitTree(); + + // Remove from the list of players + Players.Remove(this); + } + + /// + /// Called when the node enters the scene tree for the first time. + /// + public override void _Ready() + { + base._Ready(); + + UpdateCameraCullMask(); + } + + /// + /// Get the visible layer mask associated with this player + /// + /// Player-specific visible layer + public uint GetPlayerVisibleLayer() + { + // Handle invalid player number + if (PlayerNumber < 0) + return 0; + + // Return the unique player layer [11..14] + return 1024U << PlayerNumber; + } + + /// + /// Get the physics layer mask associated with this player + /// + /// Player-specific physics layer + public uint GetPlayerPhysicsLayer() + { + // Handle invalid player number + if (PlayerNumber < 0) + return 0; + + // Return the unique player layer [11..14] + return 1024U << PlayerNumber; + } + + /// + /// Find the T5ToolsPlayer from a child node + /// + /// Node to search + /// Player instance or null + public static T5ToolsPlayer FindInstance(Node node) + { + // Search the ancestors for a player node + while (node != null) + { + // If we have the player then return it + if (node is T5ToolsPlayer player) + return player; + + // Walk up to the parent + node = node.GetParent(); + } + + // Could not find play + return null; + } + + /// + /// Convert to string + /// + /// Player-specific strong + public override string ToString() + { + return $"T5ToolsPlayer:<#{PlayerNumber}|#{GetInstanceId()}>"; + } + + /// + /// Handle setting the player visible layers + /// + /// Visible layers + private void SetVisibleLayers(uint layers) + { + _visibleLayers = layers; + if (IsInsideTree()) + UpdateCameraCullMask(); + } + + /// + /// Handle setting the player number + /// + /// Player number + private void SetPlayerNumber(int playerNumber) + { + _playerNumber = playerNumber; + if (IsInsideTree()) + UpdateCameraCullMask(); + } + + /// + /// Update the camera cull mask + /// + private void UpdateCameraCullMask() + { + // Set the camera cull mask to see the selected visible layers as well as + // the layer specific to this player. + Camera.CullMask = _visibleLayers | GetPlayerVisibleLayer(); + } +} diff --git a/project.csharp/addons/tiltfive_tools/staging/T5ToolsScene.cs b/project.csharp/addons/tiltfive_tools/staging/T5ToolsScene.cs new file mode 100644 index 0000000..32a176a --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/staging/T5ToolsScene.cs @@ -0,0 +1,250 @@ +using Godot; +using System; +using System.Collections.Generic; + +public partial class T5ToolsScene : Node3D +{ + /// + /// New Player Spawn Location + /// + public enum NewPlayerSpawn + { + /// + /// Spawn at the load location + /// + Load, + + /// + /// Near existing player (or load if none) + /// + Players + }; + + /// + /// Load spawn point + /// + private Transform3D _loadSpawn; + + /// + /// Signal emitted when the game starts to exit the scene + /// + /// Custom data + [Signal] + public delegate void ScenePreExitingEventHandler(Variant userData); + + /// + /// Signal emitted when the game exits the scene + /// + /// Custom data + [Signal] + public delegate void SceneExitingEventHandler(Variant userData); + + /// + /// Signal emitted when the game loads this scene + /// + /// Custom data + [Signal] + public delegate void SceneLoadedEventHandler(Variant userData); + + /// + /// Signal emitted when the game shows this scene + /// + /// Custom data + [Signal] + public delegate void SceneVisibleEventHandler(Variant userData); + + /// + /// Character scene + /// + [Export] + public PackedScene CharacterScene { get; set; } + + /// + /// How close to spawn characters + /// + [Export] + public float SpawnPadding { get; set; } = 1.0f; + + /// + /// Spawn location for new players + /// + [Export] + public NewPlayerSpawn SpawnLocation { get; set; } = NewPlayerSpawn.Load; + + /// + /// Array of characters + /// + public List Characters { get; } = new(); + + /// + /// Random number source + /// + private readonly Random _random = new(); + + public override void _Ready() + { + // Call the base + base._Ready(); + + SceneLoaded += OnSceneLoaded; + SceneExiting += OnSceneExiting; + } + + protected virtual void OnSceneLoaded(Variant userData) + { + // Skip if no stage, or character scene + if (T5ToolsStaging.Instance == null || CharacterScene == null) + return; + + // Get the spawn position data + var spawnPosition = userData; + if (userData.VariantType == Variant.Type.Object) + { + var obj = userData.AsGodotObject(); + if (obj.HasMethod("get_spawn_position")) + spawnPosition = obj.Call("get_spawn_position"); + } + + // Get the spawn transform + _loadSpawn = Transform3D.Identity; + switch (spawnPosition.VariantType) + { + case Variant.Type.String: + // Name of Node3D to spawn at + var node = GetNodeOrNull(spawnPosition.AsString()); + if (node != null) + _loadSpawn = node.GlobalTransform; + break; + + case Variant.Type.Vector3: + // Vector3 to spawn at + _loadSpawn = new Transform3D(Basis.Identity, spawnPosition.AsVector3()); + break; + + case Variant.Type.Transform3D: + // Transform3D to spawn at + _loadSpawn = spawnPosition.AsTransform3D(); + break; + } + + // Spawn the existing player characters + var players = T5ToolsStaging.Instance.Players; + var count = players.Count; + for (var i = 0; i < count; i++) + { + // Pick the spawn location + var location = _loadSpawn; + var offset = Vector3.Forward * SpawnPadding; + offset = offset.Rotated(Vector3.Up, Mathf.Pi * 2.0f * i / count); + location.Origin += offset; + + // Create the character + CreateCharacter(players[i], location); + } + + // Subscribe to the player change signals + T5ToolsStaging.Instance.PlayerCreated += OnPlayerCreated; + T5ToolsStaging.Instance.PlayerRemoved += OnPlayerRemoved; + } + + protected virtual void OnSceneExiting(Variant userData) + { + // Skip if no stage, or character scene + if (T5ToolsStaging.Instance == null) + return; + + // Unsubscribe from the player change signals + T5ToolsStaging.Instance.PlayerCreated -= OnPlayerCreated; + T5ToolsStaging.Instance.PlayerRemoved -= OnPlayerRemoved; + } + + /// + /// Handle new player created + /// + /// New player + protected virtual void OnPlayerCreated(T5ToolsPlayer player) + { + // Pick the base location + var location = _loadSpawn; + if (SpawnLocation == NewPlayerSpawn.Players && Characters.Count > 0) + location = Characters[_random.Next(Characters.Count)].GlobalTransform; + + // Offset the location by the spawn padding + var offset = Vector3.Forward * SpawnPadding; + offset = offset.Rotated(Vector3.Up, Mathf.Pi * 2.0f * _random.NextSingle()); + location.Origin += offset; + + // Create a new character at the location + CreateCharacter(player, location); + } + + /// + /// Handle player removed from the scene + /// + /// Removed player + protected virtual void OnPlayerRemoved(T5ToolsPlayer player) + { + // Remove the character + RemoveCharacter(player); + } + + /// + /// Create a character for the player + /// + /// Player + /// Character spawn location + protected virtual void CreateCharacter(T5ToolsPlayer player, Transform3D location) + { + // Skip if no character scene + if (CharacterScene == null) + return; + + // Construct the character + var character = CharacterScene.Instantiate(); + character.Player = player; + + // Add the character to the scene + AddChild(character); + Characters.Add(character); + + // Position the character + character.GlobalTransform = location; + } + + /// + /// Remove the character for the player + /// + /// Player + protected virtual void RemoveCharacter(T5ToolsPlayer player) + { + // Find the character + var character = GetPlayerCharacter(player); + if (character == null) + return; + + // Remove the character + Characters.Remove(character); + character.QueueFree(); + } + + /// + /// Get the character associated with a player + /// + /// Player + /// Character or null + public T5ToolsCharacter GetPlayerCharacter(T5ToolsPlayer player) + { + // Find the character + return Characters.Find(c => c.Player == player); + } + + /// + /// Get the current scene + /// + /// Current scene or null + public static T5ToolsScene GetCurrent() + { + // If we have an active stage then query it for the current scene + return T5ToolsStaging.Instance?.CurrentScene; + } +} diff --git a/project.csharp/addons/tiltfive_tools/staging/T5ToolsStaging.cs b/project.csharp/addons/tiltfive_tools/staging/T5ToolsStaging.cs new file mode 100644 index 0000000..cfe634a --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/staging/T5ToolsStaging.cs @@ -0,0 +1,262 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Godot; + +/// +/// Tilt Five Tools Staging Base +/// +/// +/// ## This node manages transitions between scenes. It can be accessed globally +/// ## using "T5ToolsStagingBase.instance". +/// +public partial class T5ToolsStaging : Node3D +{ + /// + /// Signal emitted when a player is created + /// + /// New player + [Signal] + public delegate void PlayerCreatedEventHandler(T5ToolsPlayer player); + + /// + /// Signal emitted when a player is removed + /// + /// Removed player + [Signal] + public delegate void PlayerRemovedEventHandler(T5ToolsPlayer player); + + /// + /// Signal emitted when the game starts to exit the scene + /// + /// Scene starting to exit + /// Custom data + [Signal] + public delegate void ScenePreExitingEventHandler(T5ToolsScene scene, Variant userData); + + /// + /// Signal emitted when the game exits the scene + /// + /// Scene exited + /// Custom data + [Signal] + public delegate void SceneExitingEventHandler(T5ToolsScene scene, Variant userData); + + /// + /// Signal emitted when the game loads this scene + /// + /// Scene loaded + /// Custom data + [Signal] + public delegate void SceneLoadedEventHandler(T5ToolsScene scene, Variant userData); + + /// + /// Signal emitted when the game shows this scene + /// + /// Scene visible + /// Custom data + [Signal] + public delegate void SceneVisibleEventHandler(T5ToolsScene scene, Variant userData); + + /// + /// Start scene + /// + [Export(PropertyHint.File, "*.tscn")] + public string StartScene { get; set; } = string.Empty; + + /// + /// Dictionary to hold general game-data + /// + public Godot.Collections.Dictionary Data { get; } = new(); + + /// + /// List of players + /// + public List Players { get; } = new(); + + /// + /// The current scene + /// + public T5ToolsScene CurrentScene { get; private set; } + + /// + /// The fade tween + /// + private Tween _fadeTween; + + /// + /// Fade mesh + /// + private MeshInstance3D _fadeMesh; + + /// + /// Node to hold scenes + /// + private Node3D _scene; + + /// + /// Instance of the staging + /// + public static T5ToolsStaging Instance { get; private set; } + + /// + /// Called when the node enters the scene tree for the first time. + /// + public override void _EnterTree() + { + base._EnterTree(); + + // Save as the staging instance + Instance = this; + } + + /// + /// Called when the node is about to leave the scene tree. + /// + public override void _ExitTree() + { + base._ExitTree(); + + // Clear the staging instance + Instance = null; + } + + /// + /// Called when the node is "ready". + /// + public override void _Ready() + { + base._Ready(); + + // Save nodes + _fadeMesh = GetNode("Fade"); + _scene = GetNode("Scene"); + + // Do not initialise if in the editor + if (Engine.IsEditorHint()) + return; + + // Connect T5Manager signals + var manager = GetNode("T5Manager"); + manager.XRRigWasAdded += OnXRRigWasAdded; + manager.XRRigWillBeRemoved += OnXRRigWillBeRemoved; + + // Start by loading the start scene + if (!string.IsNullOrEmpty(StartScene)) + DoLoadScene(StartScene); + } + + protected async Task DoLoadScene(string scenePath, Variant userData = new()) + { + // Log request + GD.Print($"T5ToolsStaging: Request to load {scenePath}"); + + // Start background loading of the resource + ResourceLoader.LoadThreadedRequest(scenePath); + + // Start by unloading the current scene + if (CurrentScene != null) + { + // Report about to exit the current scene + GD.Print("T5ToolsStaging: Reporting ScenePreExiting"); + EmitSignal(SignalName.ScenePreExiting, CurrentScene, userData); + CurrentScene.EmitSignal(SignalName.ScenePreExiting, userData); + + // Fade to black + GD.Print("T5ToolsStaging: Fading out"); + _fadeTween?.Kill(); + _fadeTween = GetTree().CreateTween(); + _fadeTween.TweenMethod(Callable.From((float fade) => SetFade(fade)), 0.0f, 1.0f, 1.0f); + await ToSignal(_fadeTween, "finished"); + + // Report the exit of the current scene + GD.Print("T5ToolsStaging: Reporting SceneExiting"); + EmitSignal(SignalName.SceneExiting, CurrentScene, userData); + CurrentScene.EmitSignal(SignalName.SceneExiting, userData); + + // Discard the current scene + GD.Print("T5ToolsStaging: Discarding old scene"); + _scene.RemoveChild(CurrentScene); + CurrentScene.QueueFree(); + CurrentScene = null; + + // Zero all player origins. The new scene can choose to relocate + // but its safest to just zero in case + foreach (var origin in Players.Select(p => p.Origin)) + origin.GlobalTransform = Transform3D.Identity; + } + + // Load the new scene + GD.Print("T5ToolsStaging: Loading new scene"); + var newScene = ResourceLoader.Load(scenePath); + + // Instantiate the scene + GD.Print("T5ToolsStaging: Instantiating new scene"); + CurrentScene = newScene.Instantiate(); + _scene.AddChild(CurrentScene); + + // Report the new scene is loaded + GD.Print("T5ToolsStaging: Reporting SceneLoaded"); + EmitSignal(SignalName.SceneLoaded, CurrentScene, userData); + CurrentScene.EmitSignal(SignalName.SceneLoaded, userData); + + // Fade to visible + GD.Print("T5ToolsStaging: Fading in"); + _fadeTween?.Kill(); + _fadeTween = GetTree().CreateTween(); + _fadeTween.TweenMethod(Callable.From((float fade) => SetFade(fade)), 1.0f, 0.0f, 1.0f); + await ToSignal(_fadeTween, "finished"); + + // Report the new scene is visible + GD.Print("T5ToolsStaging: Reporting SceneVisible"); + EmitSignal(SignalName.SceneVisible, CurrentScene, userData); + CurrentScene.EmitSignal(SignalName.SceneVisible, userData); + } + + private void SetFade(float fade) + { + if (fade <= 0.0f) + { + _fadeMesh.Visible = false; + } + else + { + var material = _fadeMesh.GetSurfaceOverrideMaterial(0) as ShaderMaterial; + material?.SetShaderParameter("alpha", fade); + _fadeMesh.Visible = true; + } + } + + protected void OnXRRigWasAdded(T5XRRig rig) + { + // Ignore if the rig isn't a player + if (rig is not T5ToolsPlayer player) + return; + + // Add the player + GD.Print($"T5ToolsStaging: Player {player} added"); + Players.Add(player); + EmitSignal(SignalName.PlayerCreated, player); + } + + protected void OnXRRigWillBeRemoved(T5XRRig rig) + { + // Ignore if the rig isn't a player + if (rig is not T5ToolsPlayer player) + return; + + GD.Print($"T5ToolsStaging: Player {player} removed"); + Players.Remove(player); + EmitSignal(SignalName.PlayerRemoved, player); + } + + /// + /// Load the requested scene + /// + /// Scene path + /// Custom data + public static void LoadScene(string scenePath, Variant userData = new()) + { + Instance.DoLoadScene(scenePath, userData); + } +} diff --git a/project.csharp/addons/tiltfive_tools/staging/character.tscn b/project.csharp/addons/tiltfive_tools/staging/character.tscn new file mode 100644 index 0000000..9a3e508 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/staging/character.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://co3lxjgp5ifh2"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/staging/T5ToolsCharacter.cs" id="1_e7eu0"] + +[node name="Character" type="Node3D"] +script = ExtResource("1_e7eu0") diff --git a/project.csharp/addons/tiltfive_tools/staging/player.tscn b/project.csharp/addons/tiltfive_tools/staging/player.tscn new file mode 100644 index 0000000..96b006c --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/staging/player.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://d2gkfypplc1mt"] + +[ext_resource type="PackedScene" uid="uid://dpbt52d0p5wjw" path="res://addons/tiltfive/scenes/T5XRRig.tscn" id="1_h6rdt"] +[ext_resource type="Script" path="res://addons/tiltfive_tools/staging/T5ToolsPlayer.cs" id="2_woxci"] + +[node name="Player" instance=ExtResource("1_h6rdt")] +script = ExtResource("2_woxci") + +[node name="Camera" parent="Origin" index="0"] +far = 50.0 diff --git a/project.csharp/addons/tiltfive_tools/staging/scene.tscn b/project.csharp/addons/tiltfive_tools/staging/scene.tscn new file mode 100644 index 0000000..bd78b33 --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/staging/scene.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dslrsg4cn04o4"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/staging/T5ToolsScene.cs" id="1_8rg7y"] + +[node name="Scene" type="Node3D"] +script = ExtResource("1_8rg7y") diff --git a/project.csharp/addons/tiltfive_tools/staging/staging.tscn b/project.csharp/addons/tiltfive_tools/staging/staging.tscn new file mode 100644 index 0000000..687d64c --- /dev/null +++ b/project.csharp/addons/tiltfive_tools/staging/staging.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=6 format=3 uid="uid://bsn1sd86p2h30"] + +[ext_resource type="Script" path="res://addons/tiltfive_tools/staging/T5ToolsStaging.cs" id="1_x524t"] +[ext_resource type="Script" path="res://addons/tiltfive/T5Manager.cs" id="2_1ijo2"] + +[sub_resource type="QuadMesh" id="QuadMesh_soj17"] +custom_aabb = AABB(-5000, -5000, -5000, 10000, 10000, 10000) +size = Vector2(2, 2) + +[sub_resource type="Shader" id="Shader_bwe5k"] +code = "shader_type spatial; +render_mode depth_test_disabled, skip_vertex_transform, unshaded, cull_disabled; + +uniform float alpha = 0.0; + +void vertex() { + POSITION = vec4(VERTEX.x, -VERTEX.y, 0.0, 1.0); +} + +void fragment() { + ALBEDO = vec3(0.0, 0.0, 0.0); + ALPHA = alpha; +}" + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_rf1gh"] +render_priority = 99 +shader = SubResource("Shader_bwe5k") +shader_parameter/alpha = 0.0 + +[node name="Staging" type="Node3D"] +script = ExtResource("1_x524t") + +[node name="Fade" type="MeshInstance3D" parent="."] +mesh = SubResource("QuadMesh_soj17") +surface_material_override/0 = SubResource("ShaderMaterial_rf1gh") + +[node name="T5Manager" type="Node" parent="."] +script = ExtResource("2_1ijo2") + +[node name="Scene" type="Node3D" parent="."] diff --git a/demo/README.md b/project.csharp/demo/README.md similarity index 100% rename from demo/README.md rename to project.csharp/demo/README.md diff --git a/project.csharp/demo/demo1_scene/Demo1CharacterBody.cs b/project.csharp/demo/demo1_scene/Demo1CharacterBody.cs new file mode 100644 index 0000000..b1112be --- /dev/null +++ b/project.csharp/demo/demo1_scene/Demo1CharacterBody.cs @@ -0,0 +1,66 @@ +using Godot; + +#nullable enable + +public partial class Demo1CharacterBody : T5ToolsRigidBodyController +{ + /// + /// Hit sound player + /// + private AudioStreamPlayer3D? _hitPlayer; + + /// + /// Rolling sound player + /// + private AudioStreamPlayer3D? _rollingPlayer; + + /// + /// Last hit test + /// + private bool _lastHit; + + public override void _Ready() + { + base._Ready(); + + // Get the audio nodes + _hitPlayer = GetNodeOrNull("HitPlayer"); + _rollingPlayer = GetNodeOrNull("RollingPlayer"); + } + + /// + /// Check for collisions and speed to fire sound effects + /// + /// State information + public override void _IntegrateForces(PhysicsDirectBodyState3D state) + { + // Process the contacts for hits and fastest rolling speed + var hit = false; + var speed = 0.0f; + for (var c = 0; c < state.GetContactCount(); c++) + { + // Test for a velocity striking into the contact surface + var cNorm = state.GetContactLocalNormal(c); + var cVel = state.GetContactLocalVelocityAtPosition(c); + if (cNorm.Dot(cVel) < -2.0) + hit = true; + + // Get the maximum speed at the contact point + var pos = ToLocal(state.GetContactLocalPosition(c)); + var vel = state.GetVelocityAtLocalPosition(pos); + speed = Mathf.Max(speed, vel.Length()); + } + + // Adjust rolling volume based on speed + speed = Mathf.Clamp(speed / 5.0f, 0.0f, 1.0f); + if (_rollingPlayer != null) + _rollingPlayer.VolumeDb = Mathf.LinearToDb(speed); + + // Play hit sounds on hit + if (hit && !_lastHit && _hitPlayer != null) + _hitPlayer.Play(); + + // Update the last hit + _lastHit = hit; + } +} \ No newline at end of file diff --git a/project.csharp/demo/demo1_scene/character.tscn b/project.csharp/demo/demo1_scene/character.tscn new file mode 100644 index 0000000..70ab859 --- /dev/null +++ b/project.csharp/demo/demo1_scene/character.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=8 format=3 uid="uid://cm6fdya8glspr"] + +[ext_resource type="PackedScene" uid="uid://co3lxjgp5ifh2" path="res://addons/tiltfive_tools/staging/character.tscn" id="1_cvjwm"] +[ext_resource type="Script" path="res://demo/demo1_scene/Demo1CharacterBody.cs" id="2_akva3"] +[ext_resource type="Material" uid="uid://dgutg2a2y5i1u" path="res://demo/materials/rock_triplanar.tres" id="3_taor7"] +[ext_resource type="AudioStream" uid="uid://b4vru7iyf8k8j" path="res://demo/sounds/hit.wav" id="4_b4if0"] +[ext_resource type="AudioStream" uid="uid://saisv7mndt3c" path="res://demo/sounds/rolling.wav" id="4_s823o"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_tmo6w"] + +[sub_resource type="SphereMesh" id="SphereMesh_61l81"] +material = ExtResource("3_taor7") + +[node name="Character" instance=ExtResource("1_cvjwm")] + +[node name="RigidBody3D" type="RigidBody3D" parent="." index="0" groups=["character"]] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +collision_layer = 524288 +collision_mask = 524543 +max_contacts_reported = 4 +contact_monitor = true +script = ExtResource("2_akva3") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="RigidBody3D" index="0"] +shape = SubResource("SphereShape3D_tmo6w") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="RigidBody3D" index="1"] +mesh = SubResource("SphereMesh_61l81") + +[node name="HitPlayer" type="AudioStreamPlayer3D" parent="RigidBody3D" index="2"] +stream = ExtResource("4_b4if0") +pitch_scale = 0.5 + +[node name="RollingPlayer" type="AudioStreamPlayer3D" parent="RigidBody3D" index="3"] +stream = ExtResource("4_s823o") +autoplay = true diff --git a/project.csharp/demo/demo1_scene/demo1_scene.tscn b/project.csharp/demo/demo1_scene/demo1_scene.tscn new file mode 100644 index 0000000..d619c2a --- /dev/null +++ b/project.csharp/demo/demo1_scene/demo1_scene.tscn @@ -0,0 +1,93 @@ +[gd_scene load_steps=13 format=3 uid="uid://dhx4emplyskyr"] + +[ext_resource type="PackedScene" uid="uid://dslrsg4cn04o4" path="res://addons/tiltfive_tools/staging/scene.tscn" id="1_sgtvp"] +[ext_resource type="PackedScene" uid="uid://cm6fdya8glspr" path="res://demo/demo1_scene/character.tscn" id="2_k4t3w"] +[ext_resource type="PackedScene" uid="uid://7tcfuro5b3kx" path="res://addons/tiltfive_tools/objects/scene_switch_area.tscn" id="3_d6shk"] +[ext_resource type="PackedScene" uid="uid://b427u10bfm22u" path="res://demo/demo1_scene/objects/room.tscn" id="3_ys4mn"] +[ext_resource type="PackedScene" uid="uid://7i1gebioyibk" path="res://demo/demo1_scene/objects/hall_t.tscn" id="4_r5ciq"] +[ext_resource type="PackedScene" uid="uid://b1l6rigaxg121" path="res://demo/demo1_scene/objects/hall_l.tscn" id="5_mo0dk"] +[ext_resource type="PackedScene" uid="uid://dkh6kon2qwu4t" path="res://demo/demo1_scene/objects/ramp.tscn" id="6_w4hmr"] +[ext_resource type="PackedScene" uid="uid://bcy3f76x7otpv" path="res://demo/demo1_scene/objects/hall.tscn" id="7_urkc3"] +[ext_resource type="PackedScene" uid="uid://ccjojktik2du0" path="res://demo/demo1_scene/objects/barrier.tscn" id="9_xml00"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_kjahq"] +size = Vector3(6, 2, 6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_inaen"] +size = Vector3(100, 10, 100) + +[sub_resource type="Environment" id="Environment_3o5lk"] +background_mode = 1 +ambient_light_source = 2 +ambient_light_color = Color(0.294118, 0.294118, 0.294118, 1) + +[node name="Demo1Scene" instance=ExtResource("1_sgtvp")] +CharacterScene = ExtResource("2_k4t3w") + +[node name="Map" type="Node3D" parent="." index="0"] + +[node name="Room" parent="Map" index="0" instance=ExtResource("3_ys4mn")] + +[node name="HallT" parent="Map" index="1" instance=ExtResource("4_r5ciq")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -6) + +[node name="HallL" parent="Map" index="2" instance=ExtResource("5_mo0dk")] +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, -12) + +[node name="Ramp1" parent="Map" index="3" instance=ExtResource("6_w4hmr")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7, 2, -9) + +[node name="Ramp2" parent="Map" index="4" instance=ExtResource("6_w4hmr")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, -3) + +[node name="RoomEnd" parent="Map" index="5" instance=ExtResource("3_ys4mn")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -10, 2, -12) + +[node name="Hall" parent="Map" index="6" instance=ExtResource("7_urkc3")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 10, -2, -6) + +[node name="Hall2" parent="Map" index="7" instance=ExtResource("7_urkc3")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 16, -2, -6) + +[node name="Hall3" parent="Map" index="8" instance=ExtResource("7_urkc3")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 22, -2, -6) + +[node name="Barrier" parent="Map" index="9" instance=ExtResource("9_xml00")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 1, 0, -4) + +[node name="Barrier6" parent="Map" index="10" instance=ExtResource("9_xml00")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -1.028, 0, -3.191) + +[node name="Barrier4" parent="Map" index="11" instance=ExtResource("9_xml00")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 1, 0, -10) + +[node name="Barrier5" parent="Map" index="12" instance=ExtResource("9_xml00")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -1, 0, -9) + +[node name="Barrier2" parent="Map" index="13" instance=ExtResource("9_xml00")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9, -2, -7) + +[node name="Barrier3" parent="Map" index="14" instance=ExtResource("9_xml00")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -2, -5) + +[node name="EndArea" parent="." index="1" instance=ExtResource("3_d6shk")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16, -1, -6) +TargetScene = "res://demo/main_menu/main_menu.tscn" + +[node name="CollisionShape3D" type="CollisionShape3D" parent="EndArea" index="0"] +shape = SubResource("BoxShape3D_kjahq") + +[node name="FallArea" parent="." index="2" instance=ExtResource("3_d6shk")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16, -1, -6) +TargetScene = "res://demo/main_menu/main_menu.tscn" + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FallArea" index="0"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -12, 0) +shape = SubResource("BoxShape3D_inaen") + +[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="3"] +environment = SubResource("Environment_3o5lk") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." index="4"] +transform = Transform3D(0.866025, -0.482963, 0.12941, 0, 0.258819, 0.965926, -0.5, -0.836516, 0.224144, 0, 4, 0) +shadow_enabled = true diff --git a/demo/demo1_scene/objects/barrier.tscn b/project.csharp/demo/demo1_scene/objects/barrier.tscn similarity index 100% rename from demo/demo1_scene/objects/barrier.tscn rename to project.csharp/demo/demo1_scene/objects/barrier.tscn diff --git a/demo/demo1_scene/objects/hall.tscn b/project.csharp/demo/demo1_scene/objects/hall.tscn similarity index 100% rename from demo/demo1_scene/objects/hall.tscn rename to project.csharp/demo/demo1_scene/objects/hall.tscn diff --git a/demo/demo1_scene/objects/hall_l.tscn b/project.csharp/demo/demo1_scene/objects/hall_l.tscn similarity index 100% rename from demo/demo1_scene/objects/hall_l.tscn rename to project.csharp/demo/demo1_scene/objects/hall_l.tscn diff --git a/demo/demo1_scene/objects/hall_t.tscn b/project.csharp/demo/demo1_scene/objects/hall_t.tscn similarity index 100% rename from demo/demo1_scene/objects/hall_t.tscn rename to project.csharp/demo/demo1_scene/objects/hall_t.tscn diff --git a/demo/demo1_scene/objects/ramp.tscn b/project.csharp/demo/demo1_scene/objects/ramp.tscn similarity index 100% rename from demo/demo1_scene/objects/ramp.tscn rename to project.csharp/demo/demo1_scene/objects/ramp.tscn diff --git a/demo/demo1_scene/objects/room.tscn b/project.csharp/demo/demo1_scene/objects/room.tscn similarity index 100% rename from demo/demo1_scene/objects/room.tscn rename to project.csharp/demo/demo1_scene/objects/room.tscn diff --git a/project.csharp/demo/demo2_scene/demo2_scene.tscn b/project.csharp/demo/demo2_scene/demo2_scene.tscn new file mode 100644 index 0000000..91681e8 --- /dev/null +++ b/project.csharp/demo/demo2_scene/demo2_scene.tscn @@ -0,0 +1,45 @@ +[gd_scene load_steps=7 format=3 uid="uid://iindr3g5kxxs"] + +[ext_resource type="PackedScene" uid="uid://dslrsg4cn04o4" path="res://addons/tiltfive_tools/staging/scene.tscn" id="1_tr04p"] +[ext_resource type="PackedScene" uid="uid://bs8yge8ufwxlg" path="res://demo/demo2_scene/objects/ground.tscn" id="2_u3mur"] +[ext_resource type="PackedScene" uid="uid://bbyewo00ooni6" path="res://demo/demo2_scene/objects/enemy_spawn.tscn" id="3_ya7p6"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ie4c1"] +albedo_color = Color(0, 1, 0, 1) + +[sub_resource type="SphereMesh" id="SphereMesh_h1aye"] +material = SubResource("StandardMaterial3D_ie4c1") + +[sub_resource type="Environment" id="Environment_k1jvl"] +background_mode = 1 +ambient_light_source = 2 +ambient_light_color = Color(0.294118, 0.294118, 0.294118, 1) + +[node name="Demo2Scene" instance=ExtResource("1_tr04p")] + +[node name="Map" type="Node3D" parent="." index="0"] + +[node name="Ground" parent="Map" index="0" instance=ExtResource("2_u3mur")] + +[node name="EnemySpawn" parent="Map" index="1" node_paths=PackedStringArray("Target") instance=ExtResource("3_ya7p6")] +transform = Transform3D(0.707107, 0, 0.707107, 0, 1, 0, -0.707107, 0, 0.707107, -2.4, 0, -1) +Target = NodePath("../Target") + +[node name="EnemySpawn2" parent="Map" index="2" node_paths=PackedStringArray("Target") instance=ExtResource("3_ya7p6")] +transform = Transform3D(0.707107, 0, -0.707107, 0, 1, 0, 0.707107, 0, 0.707107, 2.4, 0, -1) +Target = NodePath("../Target") + +[node name="EnemySpawn3" parent="Map" index="3" node_paths=PackedStringArray("Target") instance=ExtResource("3_ya7p6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -2.1) +Target = NodePath("../Target") + +[node name="Target" type="MeshInstance3D" parent="Map" index="4"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2.4) +mesh = SubResource("SphereMesh_h1aye") + +[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="1"] +environment = SubResource("Environment_k1jvl") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." index="2"] +transform = Transform3D(0.866025, -0.482963, 0.12941, 0, 0.258819, 0.965926, -0.5, -0.836516, 0.224144, 0, 4, 0) +shadow_enabled = true diff --git a/project.csharp/demo/demo2_scene/objects/Demo2Enemy.cs b/project.csharp/demo/demo2_scene/objects/Demo2Enemy.cs new file mode 100644 index 0000000..935263b --- /dev/null +++ b/project.csharp/demo/demo2_scene/objects/Demo2Enemy.cs @@ -0,0 +1,59 @@ +using Godot; + +#nullable enable + +public partial class Demo2Enemy : CharacterBody3D +{ + /// + /// Exiting flag + /// + private bool _exiting; + + /// + /// Move speed + /// + [Export] + public float Speed = 0.5f; + + /// + /// Target position + /// + [Export] + public Node3D? Target { get; set; } + + public override void _Ready() + { + // Subscribe to scene events + var scene = T5ToolsScene.GetCurrent(); + if (scene != null) + scene.ScenePreExiting += OnScenePreExiting; + } + + private void OnScenePreExiting(Variant userData) + { + // Set the exiting flag + _exiting = true; + } + + public override void _PhysicsProcess(double delta) + { + // Skip if no target + if (Target == null) + return; + + var dir = Target.GlobalPosition - GlobalPosition; + if (dir.Length() > 0.2) + { + dir = dir.Normalized() * Speed; + Velocity = new Vector3(dir.X, Velocity.Y - 9.8f * (float)delta, dir.Z); + MoveAndSlide(); + return; + } + + if (!_exiting) + { + T5ToolsStaging.LoadScene("res://demo/main_menu/main_menu.tscn"); + _exiting = true; + } + } +} \ No newline at end of file diff --git a/project.csharp/demo/demo2_scene/objects/Demo2EnemySpawn.cs b/project.csharp/demo/demo2_scene/objects/Demo2EnemySpawn.cs new file mode 100644 index 0000000..a5462d3 --- /dev/null +++ b/project.csharp/demo/demo2_scene/objects/Demo2EnemySpawn.cs @@ -0,0 +1,68 @@ +using System; +using Godot; + +#nullable enable + +public partial class Demo2EnemySpawn : Node3D +{ + /// + /// Random source + /// + private readonly Random _random = new(); + + /// + /// Enemy scene + /// + private PackedScene? _enemyScene; + + /// + /// Enemy spawn timer + /// + private Timer? _spawnTimer; + + /// + /// Target node + /// + [Export] + public Node3D? Target { get; set; } + + public override void _Ready() + { + // Load the enemy scene + _enemyScene = GD.Load("res://demo/demo2_scene/objects/enemy.tscn"); + + // Get the spawn timer + _spawnTimer = GetNode("SpawnTimer"); + _spawnTimer.Timeout += OnSpawnTimerTimeout; + + // Hook when the scene is comping to a close + var scene = T5ToolsScene.GetCurrent(); + if (scene != null) + scene.ScenePreExiting += OnScenePreExiting; + + // Start the timer with a random delay + var startTimer = GetTree().CreateTimer(0.1 + _random.NextSingle() * 0.9); + startTimer.Timeout += () => _spawnTimer?.Start(); + } + + private void OnScenePreExiting(Variant userData) + { + _spawnTimer?.Stop(); + } + + private void OnSpawnTimerTimeout() + { + // Skip on invalid nodes + if (_enemyScene == null || Target == null || _spawnTimer == null) + return; + + // Create the enemy + var enemy = _enemyScene.Instantiate(); + enemy.Target = Target; + AddChild(enemy); + enemy.Position = new Vector3(_random.NextSingle() * 0.8f - 0.4f, 0.0f, 0.0f); + + // Update the wait time + _spawnTimer.WaitTime = Mathf.Clamp(_spawnTimer.WaitTime - _random.NextSingle() * 0.1f, 0.3f, 1.0f); + } +} diff --git a/project.csharp/demo/demo2_scene/objects/Demo2Ground.cs b/project.csharp/demo/demo2_scene/objects/Demo2Ground.cs new file mode 100644 index 0000000..fdb2074 --- /dev/null +++ b/project.csharp/demo/demo2_scene/objects/Demo2Ground.cs @@ -0,0 +1,37 @@ +using System; +using Godot; + +#nullable enable + +public partial class Demo2Ground : StaticBody3D +{ + /// + /// Random source + /// + private readonly Random _random = new(); + + private PackedScene? _missileScene; + + public override void _Ready() + { + // Load the missile scene + _missileScene = GD.Load("res://demo/demo2_scene/objects/missile.tscn"); + } + + public void PointerEvent(T5ToolsPointerEvent evt) + { + // Ignore anything that isn't a press + if (evt.EventType != T5ToolsPointerEvent.Type.Pressed) + return; + + // Instantiate and fire the missile + var missile = _missileScene?.Instantiate(); + if (missile == null) return; + missile.Target = evt.Position; + AddChild(missile); + missile.GlobalPosition = evt.Position + new Vector3( + _random.NextSingle() * 6.0f - 3.0f, + 4.0f, + _random.NextSingle() * 6.0f - 3.0f); + } +} diff --git a/project.csharp/demo/demo2_scene/objects/Demo2Missile.cs b/project.csharp/demo/demo2_scene/objects/Demo2Missile.cs new file mode 100644 index 0000000..245d69f --- /dev/null +++ b/project.csharp/demo/demo2_scene/objects/Demo2Missile.cs @@ -0,0 +1,81 @@ +using System.Linq; +using Godot; + +#nullable enable + +public partial class Demo2Missile : Node3D +{ + /// + /// Missile mesh instance + /// + private MeshInstance3D? _meshInstance; + + /// + /// Explosion sound + /// + private AudioStreamPlayer3D? _explosionSound; + + /// + /// Missile trail particles + /// + private GpuParticles3D? _trail; + + /// + /// Missile explosion particles + /// + private GpuParticles3D? _explosion; + + /// + /// Missile speed + /// + [Export] + public float Speed { get; set; } = 3.0f; + + /// + /// Kill radius + /// + [Export] + public float Radius { get; set; } = 0.8f; + + /// + /// Missile target + /// + [Export] + public Vector3 Target { get; set; } + + public override void _Ready() + { + // Get the nodes + _meshInstance = GetNode("MeshInstance3D"); + _explosionSound = GetNode("ExplosionSound"); + _trail = GetNode("Trail"); + _explosion = GetNode("Explosion"); + } + + public override void _Process(double delta) + { + // Step towards the target + var dir = Target - GlobalPosition; + if (dir.Length() > 0.2) + { + GlobalPosition += dir.Normalized() * Speed * (float)delta; + return; + } + + // Trigger the explosion + SetProcess(false); + _meshInstance?.Hide(); + _explosionSound?.Play(); + if (_trail != null) _trail.Emitting = false; + if (_explosion != null) _explosion.Emitting = true; + + // Kill all enemies in the radius + foreach (var enemy in GetTree().GetNodesInGroup("enemy").OfType()) + if (enemy.GlobalPosition.DistanceTo(GlobalPosition) < Radius) + enemy.QueueFree(); + + // Discard the missile after 3 seconds + var dieTimer = GetTree().CreateTimer(3.0); + dieTimer.Timeout += QueueFree; + } +} \ No newline at end of file diff --git a/project.csharp/demo/demo2_scene/objects/enemy.tscn b/project.csharp/demo/demo2_scene/objects/enemy.tscn new file mode 100644 index 0000000..6eddd47 --- /dev/null +++ b/project.csharp/demo/demo2_scene/objects/enemy.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=5 format=3 uid="uid://db6geu8ku0v8p"] + +[ext_resource type="Script" path="res://demo/demo2_scene/objects/Demo2Enemy.cs" id="1_lpg1l"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_g67gl"] +radius = 0.1 +height = 0.4 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6dkt0"] +albedo_color = Color(1, 0, 0, 1) + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_mhd81"] +material = SubResource("StandardMaterial3D_6dkt0") +radius = 0.1 +height = 0.4 +radial_segments = 8 +rings = 2 + +[node name="Enemy" type="CharacterBody3D" groups=["enemy"]] +collision_layer = 256 +collision_mask = 257 +script = ExtResource("1_lpg1l") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0) +shape = SubResource("CapsuleShape3D_g67gl") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0) +mesh = SubResource("CapsuleMesh_mhd81") diff --git a/project.csharp/demo/demo2_scene/objects/enemy_spawn.tscn b/project.csharp/demo/demo2_scene/objects/enemy_spawn.tscn new file mode 100644 index 0000000..eb8c094 --- /dev/null +++ b/project.csharp/demo/demo2_scene/objects/enemy_spawn.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=3 uid="uid://bbyewo00ooni6"] + +[ext_resource type="Script" path="res://demo/demo2_scene/objects/Demo2EnemySpawn.cs" id="1_nqtbn"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gn5tm"] +albedo_color = Color(1, 0, 0, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_pxspy"] +material = SubResource("StandardMaterial3D_gn5tm") +size = Vector3(1, 0.5, 0.5) + +[node name="EnemySpawn" type="Node3D"] +script = ExtResource("1_nqtbn") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.25, 0) +mesh = SubResource("BoxMesh_pxspy") + +[node name="SpawnTimer" type="Timer" parent="."] diff --git a/project.csharp/demo/demo2_scene/objects/ground.tscn b/project.csharp/demo/demo2_scene/objects/ground.tscn new file mode 100644 index 0000000..b8de91d --- /dev/null +++ b/project.csharp/demo/demo2_scene/objects/ground.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=5 format=3 uid="uid://bs8yge8ufwxlg"] + +[ext_resource type="Script" path="res://demo/demo2_scene/objects/Demo2Ground.cs" id="1_22u36"] +[ext_resource type="Material" uid="uid://nbp8gi62cwuj" path="res://demo/materials/ground_material.tres" id="1_eguip"] + +[sub_resource type="QuadMesh" id="QuadMesh_bno31"] +material = ExtResource("1_eguip") +size = Vector2(6, 6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_vfiqj"] +size = Vector3(6, 1, 6) + +[node name="Ground" type="StaticBody3D"] +collision_layer = 1048577 +script = ExtResource("1_22u36") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) +mesh = SubResource("QuadMesh_bno31") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) +shape = SubResource("BoxShape3D_vfiqj") diff --git a/project.csharp/demo/demo2_scene/objects/missile.tscn b/project.csharp/demo/demo2_scene/objects/missile.tscn new file mode 100644 index 0000000..a3ee174 --- /dev/null +++ b/project.csharp/demo/demo2_scene/objects/missile.tscn @@ -0,0 +1,81 @@ +[gd_scene load_steps=14 format=3 uid="uid://dbflj3atv64f8"] + +[ext_resource type="Script" path="res://demo/demo2_scene/objects/Demo2Missile.cs" id="1_dktpx"] +[ext_resource type="Texture2D" uid="uid://cv1ce55bwsnnw" path="res://demo/materials/lava.jpg" id="1_nm6p4"] +[ext_resource type="AudioStream" uid="uid://c7hk1w0n7ywmd" path="res://demo/sounds/explosion.wav" id="3_fe22o"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_50oau"] +shading_mode = 0 +albedo_texture = ExtResource("1_nm6p4") +uv1_triplanar = true + +[sub_resource type="SphereMesh" id="SphereMesh_62wil"] +material = SubResource("StandardMaterial3D_50oau") +radius = 0.1 +height = 0.2 + +[sub_resource type="Gradient" id="Gradient_07teb"] +offsets = PackedFloat32Array(0, 0.183673, 0.44898, 0.770408, 1) +colors = PackedColorArray(1, 1, 1, 1, 1, 1, 0, 1, 1, 0.52549, 0, 1, 1, 0, 0, 1, 0.466667, 0, 0, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_8elqo"] +gradient = SubResource("Gradient_07teb") + +[sub_resource type="Curve" id="Curve_6tpop"] +_data = [Vector2(0, 0.610526), 0.0, 0.0, 0, 0, Vector2(0.185022, 0.894737), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_cv4no"] +curve = SubResource("Curve_6tpop") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_b4er4"] +gravity = Vector3(0, 0, 0) +scale_curve = SubResource("CurveTexture_cv4no") +color_ramp = SubResource("GradientTexture1D_8elqo") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6oukf"] +shading_mode = 0 +vertex_color_use_as_albedo = true +billboard_mode = 3 +billboard_keep_scale = true +particles_anim_h_frames = 1 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="QuadMesh" id="QuadMesh_qemb3"] +material = SubResource("StandardMaterial3D_6oukf") +size = Vector2(0.1, 0.1) + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_qhh35"] +spread = 180.0 +initial_velocity_min = 1.0 +initial_velocity_max = 2.0 +gravity = Vector3(0, 0, 0) +scale_curve = SubResource("CurveTexture_cv4no") +color_ramp = SubResource("GradientTexture1D_8elqo") + +[node name="Missile" type="Node3D"] +script = ExtResource("1_dktpx") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +cast_shadow = 0 +mesh = SubResource("SphereMesh_62wil") + +[node name="Trail" type="GPUParticles3D" parent="."] +cast_shadow = 0 +amount = 15 +randomness = 1.0 +process_material = SubResource("ParticleProcessMaterial_b4er4") +draw_pass_1 = SubResource("QuadMesh_qemb3") + +[node name="Explosion" type="GPUParticles3D" parent="."] +cast_shadow = 0 +emitting = false +amount = 70 +one_shot = true +explosiveness = 1.0 +process_material = SubResource("ParticleProcessMaterial_qhh35") +draw_pass_1 = SubResource("QuadMesh_qemb3") + +[node name="ExplosionSound" type="AudioStreamPlayer3D" parent="."] +stream = ExtResource("3_fe22o") diff --git a/project.csharp/demo/demo3_scene/character/Demo3CharacterBody.cs b/project.csharp/demo/demo3_scene/character/Demo3CharacterBody.cs new file mode 100644 index 0000000..2f7464c --- /dev/null +++ b/project.csharp/demo/demo3_scene/character/Demo3CharacterBody.cs @@ -0,0 +1,61 @@ +using Godot; + +#nullable enable + +public partial class Demo3CharacterBody : T5ToolsCharacterBodyController +{ + /// + /// Animation player + /// + private AnimationPlayer? _animation; + + public override void _Ready() + { + base._Ready(); + + // Get the animation player + _animation = GetNode("gobot/AnimationPlayer"); + + // Subscribe to movement changed events + MovementChanged += OnMovementChanged; + } + + /// + /// Handle movement changes + /// + /// + private void OnMovementChanged(MovementState state) + { + // Skip if no animation + if (_animation == null) + return; + + switch (state) + { + case MovementState.Idle: + _animation.CurrentAnimation = "Idle"; + break; + + case MovementState.Walking: + _animation.CurrentAnimation = "Walk"; + break; + + case MovementState.Running: + _animation.CurrentAnimation = "Run"; + break; + + case MovementState.Jumping: + _animation.CurrentAnimation = "Jump"; + break; + + case MovementState.Falling: + _animation.CurrentAnimation = "Fall"; + break; + + case MovementState.Landed: + _animation.CurrentAnimation = "Idle"; + break; + + } + } +} \ No newline at end of file diff --git a/project.csharp/demo/demo3_scene/character/character.tscn b/project.csharp/demo/demo3_scene/character/character.tscn new file mode 100644 index 0000000..ec68453 --- /dev/null +++ b/project.csharp/demo/demo3_scene/character/character.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=5 format=3 uid="uid://crkjxplihmj3i"] + +[ext_resource type="PackedScene" uid="uid://co3lxjgp5ifh2" path="res://addons/tiltfive_tools/staging/character.tscn" id="1_ha5qy"] +[ext_resource type="Script" path="res://demo/demo3_scene/character/Demo3CharacterBody.cs" id="2_8joj5"] +[ext_resource type="PackedScene" uid="uid://dne628fr47uug" path="res://demo/demo3_scene/character/gobot.glb" id="2_fy2fw"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_t4ulb"] +height = 1.5 + +[node name="Character" instance=ExtResource("1_ha5qy")] + +[node name="CharacterBody3D" type="CharacterBody3D" parent="." index="0"] +collision_layer = 524288 +collision_mask = 524291 +script = ExtResource("2_8joj5") + +[node name="gobot" parent="CharacterBody3D" index="0" instance=ExtResource("2_fy2fw")] + +[node name="Skeleton3D" parent="CharacterBody3D/gobot/Armature" index="0"] +bones/0/position = Vector3(0.097547, 0.267181, -0.181935) +bones/0/rotation = Quaternion(0.964598, 1.15278e-08, -4.21639e-08, -0.263726) +bones/1/position = Vector3(-0.097547, 0.115866, 0.0813449) +bones/1/rotation = Quaternion(0.452324, -3.89842e-08, -1.97717e-08, 0.891854) +bones/2/rotation = Quaternion(0.0262198, -4.36964e-08, -1.1461e-09, 0.999656) +bones/4/rotation = Quaternion(0.277943, -5.64499e-06, 9.47258e-06, 0.960598) +bones/5/rotation = Quaternion(0.546122, 9.52631e-07, -1.86441e-05, 0.837705) +bones/6/rotation = Quaternion(-0.223252, -7.33125e-08, 5.69021e-07, 0.974761) +bones/7/rotation = Quaternion(0.00312552, -1.1371e-06, 1.06962e-07, 0.999995) +bones/8/rotation = Quaternion(-0.550094, -0.643046, 0.0900143, 0.525153) +bones/16/rotation = Quaternion(-0.550094, 0.643046, -0.0900143, 0.525153) +bones/24/rotation = Quaternion(0.263986, 4.21608e-08, -1.15392e-08, 0.964526) + +[node name="AnimationPlayer" parent="CharacterBody3D/gobot" index="1"] +playback_default_blend_time = 0.2 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D" index="1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.75, 0) +shape = SubResource("CapsuleShape3D_t4ulb") + +[editable path="CharacterBody3D/gobot"] diff --git a/demo/demo3_scene/character/gobot.glb b/project.csharp/demo/demo3_scene/character/gobot.glb similarity index 100% rename from demo/demo3_scene/character/gobot.glb rename to project.csharp/demo/demo3_scene/character/gobot.glb diff --git a/demo/demo3_scene/character/gobot.glb.import b/project.csharp/demo/demo3_scene/character/gobot.glb.import similarity index 100% rename from demo/demo3_scene/character/gobot.glb.import rename to project.csharp/demo/demo3_scene/character/gobot.glb.import diff --git a/project.csharp/demo/demo3_scene/demo3_scene.tscn b/project.csharp/demo/demo3_scene/demo3_scene.tscn new file mode 100644 index 0000000..ec75b67 --- /dev/null +++ b/project.csharp/demo/demo3_scene/demo3_scene.tscn @@ -0,0 +1,173 @@ +[gd_scene load_steps=11 format=3 uid="uid://clbfq3n7oev12"] + +[ext_resource type="PackedScene" uid="uid://dslrsg4cn04o4" path="res://addons/tiltfive_tools/staging/scene.tscn" id="1_04l7y"] +[ext_resource type="Material" uid="uid://nbp8gi62cwuj" path="res://demo/materials/ground_material.tres" id="2_1k6wx"] +[ext_resource type="PackedScene" uid="uid://crkjxplihmj3i" path="res://demo/demo3_scene/character/character.tscn" id="2_swtpo"] +[ext_resource type="PackedScene" uid="uid://b4xl5ssedv1ki" path="res://demo/demo3_scene/objects/wall.tscn" id="4_7hgai"] +[ext_resource type="PackedScene" uid="uid://cvgq86n7q7to3" path="res://demo/demo3_scene/objects/block.tscn" id="5_2diow"] +[ext_resource type="PackedScene" uid="uid://c8et2rujvlweg" path="res://demo/demo3_scene/objects/ramp.tscn" id="6_ucvdf"] +[ext_resource type="PackedScene" uid="uid://x64qu8beayva" path="res://demo/demo3_scene/objects/exit_area.tscn" id="7_5o12b"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_oqjux"] +size = Vector3(24, 1, 24) + +[sub_resource type="QuadMesh" id="QuadMesh_14m0i"] +material = ExtResource("2_1k6wx") +size = Vector2(24, 24) + +[sub_resource type="Environment" id="Environment_ay2m3"] +background_mode = 1 +ambient_light_source = 2 +ambient_light_color = Color(0.294118, 0.294118, 0.294118, 1) + +[node name="Demo3Scene" instance=ExtResource("1_04l7y")] +CharacterScene = ExtResource("2_swtpo") + +[node name="Map" type="Node3D" parent="." index="0"] + +[node name="Ground" type="StaticBody3D" parent="Map" index="0"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Map/Ground" index="0"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) +shape = SubResource("BoxShape3D_oqjux") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Map/Ground" index="1"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) +mesh = SubResource("QuadMesh_14m0i") + +[node name="Perimeter" type="Node3D" parent="Map" index="1"] + +[node name="Wall1" parent="Map/Perimeter" index="0" instance=ExtResource("4_7hgai")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9, 0, -12) + +[node name="Wall2" parent="Map/Perimeter" index="1" instance=ExtResource("4_7hgai")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0, -12) + +[node name="Wall3" parent="Map/Perimeter" index="2" instance=ExtResource("4_7hgai")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, -12) + +[node name="Wall4" parent="Map/Perimeter" index="3" instance=ExtResource("4_7hgai")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9, 0, -12) + +[node name="Wall5" parent="Map/Perimeter" index="4" instance=ExtResource("4_7hgai")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 12, 0, -9) + +[node name="Wall6" parent="Map/Perimeter" index="5" instance=ExtResource("4_7hgai")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 12, 0, -3) + +[node name="Wall7" parent="Map/Perimeter" index="6" instance=ExtResource("4_7hgai")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 12, 0, 3) + +[node name="Wall8" parent="Map/Perimeter" index="7" instance=ExtResource("4_7hgai")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 12, 0, 9) + +[node name="Wall9" parent="Map/Perimeter" index="8" instance=ExtResource("4_7hgai")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 9, 0, 12) + +[node name="Wall10" parent="Map/Perimeter" index="9" instance=ExtResource("4_7hgai")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 3, 0, 12) + +[node name="Wall11" parent="Map/Perimeter" index="10" instance=ExtResource("4_7hgai")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, -3, 0, 12) + +[node name="Wall12" parent="Map/Perimeter" index="11" instance=ExtResource("4_7hgai")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, -9, 0, 12) + +[node name="Wall13" parent="Map/Perimeter" index="12" instance=ExtResource("4_7hgai")] +transform = Transform3D(1.31134e-07, 0, 1, 0, 1, 0, -1, 0, 1.31134e-07, -12, 0, 9) + +[node name="Wall14" parent="Map/Perimeter" index="13" instance=ExtResource("4_7hgai")] +transform = Transform3D(1.31134e-07, 0, 1, 0, 1, 0, -1, 0, 1.31134e-07, -12, 0, 3) + +[node name="Wall15" parent="Map/Perimeter" index="14" instance=ExtResource("4_7hgai")] +transform = Transform3D(1.31134e-07, 0, 1, 0, 1, 0, -1, 0, 1.31134e-07, -12, 0, -3) + +[node name="Wall16" parent="Map/Perimeter" index="15" instance=ExtResource("4_7hgai")] +transform = Transform3D(1.31134e-07, 0, 1, 0, 1, 0, -1, 0, 1.31134e-07, -12, 0, -9) + +[node name="Fort1" type="Node3D" parent="Map" index="2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3) + +[node name="Block1" parent="Map/Fort1" index="0" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0, 0) + +[node name="Block2" parent="Map/Fort1" index="1" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, 0) + +[node name="Block3" parent="Map/Fort1" index="2" instance=ExtResource("5_2diow")] + +[node name="Block4" parent="Map/Fort1" index="3" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0) + +[node name="Block5" parent="Map/Fort1" index="4" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0) + +[node name="Block6" parent="Map/Fort1" index="5" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) + +[node name="Ramp1" parent="Map/Fort1" index="6" instance=ExtResource("6_ucvdf")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -3, 0, 3) + +[node name="Ramp2" parent="Map/Fort1" index="7" instance=ExtResource("6_ucvdf")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 5, 0, 3) + +[node name="Ramp3" parent="Map/Fort1" index="8" instance=ExtResource("6_ucvdf")] +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 3, 1, -1) + +[node name="Ramp4" parent="Map/Fort1" index="9" instance=ExtResource("6_ucvdf")] +transform = Transform3D(1, 0, 1.74846e-07, 0, 1, 0, -1.74846e-07, 0, 1, -3, 1, 1) + +[node name="Fort2" type="Node3D" parent="Map" index="3"] +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, -3) + +[node name="Block1" parent="Map/Fort2" index="0" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0, 0) + +[node name="Block2" parent="Map/Fort2" index="1" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, 0) + +[node name="Block3" parent="Map/Fort2" index="2" instance=ExtResource("5_2diow")] + +[node name="Block4" parent="Map/Fort2" index="3" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0) + +[node name="Block5" parent="Map/Fort2" index="4" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0) + +[node name="Block6" parent="Map/Fort2" index="5" instance=ExtResource("5_2diow")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) + +[node name="Ramp1" parent="Map/Fort2" index="6" instance=ExtResource("6_ucvdf")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -3, 0, 3) + +[node name="Ramp2" parent="Map/Fort2" index="7" instance=ExtResource("6_ucvdf")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 5, 0, 3) + +[node name="Ramp3" parent="Map/Fort2" index="8" instance=ExtResource("6_ucvdf")] +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 3, 1, -1) + +[node name="Ramp4" parent="Map/Fort2" index="9" instance=ExtResource("6_ucvdf")] +transform = Transform3D(1, 0, 1.74846e-07, 0, 1, 0, -1.74846e-07, 0, 1, -3, 1, 1) + +[node name="ExitArea1" parent="Map" index="4" instance=ExtResource("7_5o12b")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, -10) +TargetScene = "res://demo/main_menu/main_menu.tscn" + +[node name="ExitArea2" parent="Map" index="5" instance=ExtResource("7_5o12b")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, -10) +TargetScene = "res://demo/main_menu/main_menu.tscn" + +[node name="ExitArea3" parent="Map" index="6" instance=ExtResource("7_5o12b")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, 10) +TargetScene = "res://demo/main_menu/main_menu.tscn" + +[node name="ExitArea4" parent="Map" index="7" instance=ExtResource("7_5o12b")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 10) +TargetScene = "res://demo/main_menu/main_menu.tscn" + +[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="1"] +environment = SubResource("Environment_ay2m3") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." index="2"] +transform = Transform3D(0.866025, -0.482963, 0.12941, 0, 0.258819, 0.965926, -0.5, -0.836516, 0.224144, 0, 4, 0) +shadow_enabled = true diff --git a/demo/demo3_scene/objects/block.tscn b/project.csharp/demo/demo3_scene/objects/block.tscn similarity index 100% rename from demo/demo3_scene/objects/block.tscn rename to project.csharp/demo/demo3_scene/objects/block.tscn diff --git a/demo/demo3_scene/objects/exit_area.tscn b/project.csharp/demo/demo3_scene/objects/exit_area.tscn similarity index 100% rename from demo/demo3_scene/objects/exit_area.tscn rename to project.csharp/demo/demo3_scene/objects/exit_area.tscn diff --git a/demo/demo3_scene/objects/ramp.tscn b/project.csharp/demo/demo3_scene/objects/ramp.tscn similarity index 100% rename from demo/demo3_scene/objects/ramp.tscn rename to project.csharp/demo/demo3_scene/objects/ramp.tscn diff --git a/demo/demo3_scene/objects/wall.tscn b/project.csharp/demo/demo3_scene/objects/wall.tscn similarity index 100% rename from demo/demo3_scene/objects/wall.tscn rename to project.csharp/demo/demo3_scene/objects/wall.tscn diff --git a/project.csharp/demo/main.tscn b/project.csharp/demo/main.tscn new file mode 100644 index 0000000..b9f4227 --- /dev/null +++ b/project.csharp/demo/main.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=3 uid="uid://cf7oa428dknbj"] + +[ext_resource type="PackedScene" uid="uid://bsn1sd86p2h30" path="res://addons/tiltfive_tools/staging/staging.tscn" id="1_jgelf"] +[ext_resource type="PackedScene" uid="uid://bvoc83idthch2" path="res://demo/player/player.tscn" id="2_mbhmd"] +[ext_resource type="PackedScene" uid="uid://cy1vbgijgvfb0" path="res://addons/tiltfive_tools/objects/spectator_camera.tscn" id="3_vyvts"] + +[node name="Main" instance=ExtResource("1_jgelf")] +StartScene = "res://demo/main_menu/main_menu.tscn" + +[node name="T5Manager" parent="." index="1"] +xrRigScene = ExtResource("2_mbhmd") + +[node name="SpectatorCamera" parent="." index="3" instance=ExtResource("3_vyvts")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0) +Vertical = 3.0 +Horizontal = 6.0 diff --git a/project.csharp/demo/main_menu/MainMenu2D.cs b/project.csharp/demo/main_menu/MainMenu2D.cs new file mode 100644 index 0000000..0b903cf --- /dev/null +++ b/project.csharp/demo/main_menu/MainMenu2D.cs @@ -0,0 +1,34 @@ +using Godot; + +#nullable enable + +public partial class MainMenu2D : Control +{ + public void OnQuitPressed() + { + GetTree().Quit(); + } + + public void OnDemoPressed(int demoNumber) + { + switch (demoNumber) + { + case 1: + T5ToolsStaging.LoadScene("res://demo/demo1_scene/demo1_scene.tscn"); + break; + + case 2: + T5ToolsStaging.LoadScene("res://demo/demo2_scene/demo2_scene.tscn"); + break; + + case 3: + T5ToolsStaging.LoadScene("res://demo/demo3_scene/demo3_scene.tscn"); + break; + + case 4: + T5ToolsStaging.LoadScene("res://demo/demo4_scene/demo4_scene.tscn"); + break; + + } + } +} \ No newline at end of file diff --git a/project.csharp/demo/main_menu/main_menu.tscn b/project.csharp/demo/main_menu/main_menu.tscn new file mode 100644 index 0000000..a16ca84 --- /dev/null +++ b/project.csharp/demo/main_menu/main_menu.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=5 format=3 uid="uid://1uyp1upvrhmd"] + +[ext_resource type="PackedScene" uid="uid://dslrsg4cn04o4" path="res://addons/tiltfive_tools/staging/scene.tscn" id="1_e4qwb"] +[ext_resource type="PackedScene" uid="uid://0l6uvyibyfq7" path="res://addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.tscn" id="2_8u0ar"] +[ext_resource type="PackedScene" uid="uid://dkjxuanprob03" path="res://demo/main_menu/main_menu_2d.tscn" id="3_s11b2"] + +[sub_resource type="Environment" id="Environment_3m4fl"] +background_mode = 1 +ambient_light_source = 2 +ambient_light_color = Color(0.294118, 0.294118, 0.294118, 1) + +[node name="MainMenuScene" instance=ExtResource("1_e4qwb")] + +[node name="Screen" parent="." index="0" instance=ExtResource("2_8u0ar")] +transform = Transform3D(1, 0, 0, 0, 0.258819, 0.965926, 0, -0.965926, 0.258819, 0, -0.4, 0) +AlphaScissorThreshold = 0.25 +Unshaded = true +Filter = null +Scene = ExtResource("3_s11b2") +UpdateMode = 2 + +[node name="WorldEnvironment" type="WorldEnvironment" parent="." index="1"] +environment = SubResource("Environment_3m4fl") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." index="2"] +transform = Transform3D(0.866025, -0.482963, 0.12941, 0, 0.258819, 0.965926, -0.5, -0.836516, 0.224144, 0, 4, 0) diff --git a/project.csharp/demo/main_menu/main_menu_2d.tscn b/project.csharp/demo/main_menu/main_menu_2d.tscn new file mode 100644 index 0000000..244d2ee --- /dev/null +++ b/project.csharp/demo/main_menu/main_menu_2d.tscn @@ -0,0 +1,106 @@ +[gd_scene load_steps=3 format=3 uid="uid://dkjxuanprob03"] + +[ext_resource type="Script" path="res://demo/main_menu/MainMenu2D.cs" id="1_o3rt2"] +[ext_resource type="Texture2D" uid="uid://crovglpkjvq4f" path="res://demo/materials/border.png" id="2_6hykq"] + +[node name="MainMenu2D" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 300.0 +offset_bottom = 200.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource("1_o3rt2") + +[node name="Background" type="NinePatchRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("2_6hykq") +patch_margin_left = 10 +patch_margin_top = 10 +patch_margin_right = 10 +patch_margin_bottom = 10 + +[node name="Margin" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="VBoxContainer" type="VBoxContainer" parent="Margin"] +layout_mode = 2 + +[node name="Title" type="Label" parent="Margin/VBoxContainer"] +layout_mode = 2 +text = "Game Title" +horizontal_alignment = 1 + +[node name="Spacing1" type="Control" parent="Margin/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Demo12" type="HBoxContainer" parent="Margin/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Demo1" type="Button" parent="Margin/VBoxContainer/Demo12"] +custom_minimum_size = Vector2(60, 0) +layout_mode = 2 +text = "Demo 1 +" + +[node name="Demo2" type="Button" parent="Margin/VBoxContainer/Demo12"] +custom_minimum_size = Vector2(60, 0) +layout_mode = 2 +text = "Demo 2 +" + +[node name="Demo34" type="HBoxContainer" parent="Margin/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Demo3" type="Button" parent="Margin/VBoxContainer/Demo34"] +custom_minimum_size = Vector2(60, 0) +layout_mode = 2 +text = "Demo 3 +" + +[node name="Demo4" type="Button" parent="Margin/VBoxContainer/Demo34"] +custom_minimum_size = Vector2(60, 0) +layout_mode = 2 +disabled = true +text = "Demo 4 +" + +[node name="Spacing2" type="Control" parent="Margin/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="HSeparator" type="HSeparator" parent="Margin/VBoxContainer"] +layout_mode = 2 + +[node name="Quit" type="HBoxContainer" parent="Margin/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Quit" type="Button" parent="Margin/VBoxContainer/Quit"] +custom_minimum_size = Vector2(60, 0) +layout_mode = 2 +text = "Quit +" + +[connection signal="pressed" from="Margin/VBoxContainer/Demo12/Demo1" to="." method="OnDemoPressed" binds= [1]] +[connection signal="pressed" from="Margin/VBoxContainer/Demo12/Demo2" to="." method="OnDemoPressed" binds= [2]] +[connection signal="pressed" from="Margin/VBoxContainer/Demo34/Demo3" to="." method="OnDemoPressed" binds= [3]] +[connection signal="pressed" from="Margin/VBoxContainer/Demo34/Demo4" to="." method="OnDemoPressed" binds= [4]] +[connection signal="pressed" from="Margin/VBoxContainer/Quit/Quit" to="." method="OnQuitPressed"] diff --git a/demo/materials/border.png b/project.csharp/demo/materials/border.png similarity index 100% rename from demo/materials/border.png rename to project.csharp/demo/materials/border.png diff --git a/demo/materials/border.png.import b/project.csharp/demo/materials/border.png.import similarity index 100% rename from demo/materials/border.png.import rename to project.csharp/demo/materials/border.png.import diff --git a/demo/materials/bricks.jpg b/project.csharp/demo/materials/bricks.jpg similarity index 100% rename from demo/materials/bricks.jpg rename to project.csharp/demo/materials/bricks.jpg diff --git a/demo/materials/bricks.jpg.import b/project.csharp/demo/materials/bricks.jpg.import similarity index 100% rename from demo/materials/bricks.jpg.import rename to project.csharp/demo/materials/bricks.jpg.import diff --git a/demo/materials/bricks_material.tres b/project.csharp/demo/materials/bricks_material.tres similarity index 100% rename from demo/materials/bricks_material.tres rename to project.csharp/demo/materials/bricks_material.tres diff --git a/demo/materials/ground.jpg b/project.csharp/demo/materials/ground.jpg similarity index 100% rename from demo/materials/ground.jpg rename to project.csharp/demo/materials/ground.jpg diff --git a/demo/materials/ground.jpg.import b/project.csharp/demo/materials/ground.jpg.import similarity index 100% rename from demo/materials/ground.jpg.import rename to project.csharp/demo/materials/ground.jpg.import diff --git a/demo/materials/ground_material.tres b/project.csharp/demo/materials/ground_material.tres similarity index 100% rename from demo/materials/ground_material.tres rename to project.csharp/demo/materials/ground_material.tres diff --git a/demo/materials/lava.jpg b/project.csharp/demo/materials/lava.jpg similarity index 100% rename from demo/materials/lava.jpg rename to project.csharp/demo/materials/lava.jpg diff --git a/demo/materials/lava.jpg.import b/project.csharp/demo/materials/lava.jpg.import similarity index 100% rename from demo/materials/lava.jpg.import rename to project.csharp/demo/materials/lava.jpg.import diff --git a/demo/materials/rock.jpg b/project.csharp/demo/materials/rock.jpg similarity index 100% rename from demo/materials/rock.jpg rename to project.csharp/demo/materials/rock.jpg diff --git a/demo/materials/rock.jpg.import b/project.csharp/demo/materials/rock.jpg.import similarity index 100% rename from demo/materials/rock.jpg.import rename to project.csharp/demo/materials/rock.jpg.import diff --git a/demo/materials/rock_triplanar.tres b/project.csharp/demo/materials/rock_triplanar.tres similarity index 100% rename from demo/materials/rock_triplanar.tres rename to project.csharp/demo/materials/rock_triplanar.tres diff --git a/project.csharp/demo/player/PopupMenu.cs b/project.csharp/demo/player/PopupMenu.cs new file mode 100644 index 0000000..26cabc1 --- /dev/null +++ b/project.csharp/demo/player/PopupMenu.cs @@ -0,0 +1,16 @@ +using Godot; + +#nullable enable + +public partial class PopupMenu : Control +{ + public void OnBackPressed() + { + T5ToolsStaging.LoadScene("res://demo/main_menu/main_menu.tscn"); + } + + public void OnQuitPressed() + { + GetTree().Quit(); + } +} \ No newline at end of file diff --git a/project.csharp/demo/player/player.tscn b/project.csharp/demo/player/player.tscn new file mode 100644 index 0000000..dfb3f56 --- /dev/null +++ b/project.csharp/demo/player/player.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=10 format=3 uid="uid://bvoc83idthch2"] + +[ext_resource type="PackedScene" uid="uid://d2gkfypplc1mt" path="res://addons/tiltfive_tools/staging/player.tscn" id="1_lf2qe"] +[ext_resource type="PackedScene" uid="uid://bfxa4y4qa6l67" path="res://addons/tiltfive_tools/functions/pointer.tscn" id="2_0h2fr"] +[ext_resource type="PackedScene" uid="uid://b1cd3jc00rhal" path="res://addons/tiltfive/assets/T5GlassesModel.tscn" id="2_plese"] +[ext_resource type="PackedScene" uid="uid://go1j5dbhtx3l" path="res://addons/tiltfive_tools/functions/board_scale.tscn" id="3_u35xw"] +[ext_resource type="PackedScene" uid="uid://fipea8dbocg4" path="res://addons/tiltfive/assets/T5WandModel.tscn" id="5_2s3x5"] +[ext_resource type="PackedScene" uid="uid://5xntpxnp3gxe" path="res://addons/tiltfive_tools/functions/visible_toggle.tscn" id="6_7aoat"] +[ext_resource type="PackedScene" uid="uid://c21g2ifqcqkij" path="res://addons/tiltfive_tools/functions/face_player.tscn" id="7_bis6y"] +[ext_resource type="PackedScene" uid="uid://bxarqaa2wmcuf" path="res://demo/player/popup_menu.tscn" id="7_tmcg0"] +[ext_resource type="PackedScene" uid="uid://0l6uvyibyfq7" path="res://addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.tscn" id="8_mq4ck"] + +[node name="Player" instance=ExtResource("1_lf2qe")] +VisibleLayers = 5 +PlayerNumber = -1 + +[node name="Origin" parent="." index="0"] +gameboard_scale = 10.0 + +[node name="T5-glasses" parent="Origin/Camera" index="0" instance=ExtResource("2_plese")] + +[node name="Pointer" parent="Origin/Wand_1" index="0" instance=ExtResource("2_0h2fr")] +Length = 10.0 + +[node name="BoardScale" parent="Origin/Wand_1" index="1" instance=ExtResource("3_u35xw")] + +[node name="T5-wand" parent="Origin/Wand_1" index="2" instance=ExtResource("5_2s3x5")] + +[node name="Menu" type="Node3D" parent="Origin" index="2"] + +[node name="Popup" parent="Origin/Menu" index="0" instance=ExtResource("8_mq4ck")] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 0.1, 0) +AlphaScissorThreshold = 0.25 +Unshaded = false +Filter = null +ScreenSize = Vector2(0.3, 0.15) +Scene = ExtResource("7_tmcg0") + +[node name="FacePlayer" parent="Origin/Menu" index="1" instance=ExtResource("7_bis6y")] + +[node name="VisibleToggle" parent="Origin/Menu" index="2" instance=ExtResource("6_7aoat")] diff --git a/project.csharp/demo/player/popup_menu.tscn b/project.csharp/demo/player/popup_menu.tscn new file mode 100644 index 0000000..63570c0 --- /dev/null +++ b/project.csharp/demo/player/popup_menu.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=3 format=3 uid="uid://bxarqaa2wmcuf"] + +[ext_resource type="Script" path="res://demo/player/PopupMenu.cs" id="1_0yybi"] +[ext_resource type="Texture2D" uid="uid://crovglpkjvq4f" path="res://demo/materials/border.png" id="1_pulmi"] + +[node name="PopupMenu" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 300.0 +offset_bottom = 150.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource("1_0yybi") + +[node name="Border" type="NinePatchRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("1_pulmi") +patch_margin_left = 10 +patch_margin_top = 10 +patch_margin_right = 10 +patch_margin_bottom = 10 + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "Game Title" +horizontal_alignment = 1 + +[node name="Spacing" type="Control" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="HSeparator" type="HSeparator" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Back" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(70, 0) +layout_mode = 2 +text = "Back +" + +[node name="Quit" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(70, 0) +layout_mode = 2 +text = "Quit +" + +[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Back" to="." method="OnBackPressed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Quit" to="." method="OnQuitPressed"] diff --git a/demo/sounds/explosion.wav b/project.csharp/demo/sounds/explosion.wav similarity index 100% rename from demo/sounds/explosion.wav rename to project.csharp/demo/sounds/explosion.wav diff --git a/demo/sounds/explosion.wav.import b/project.csharp/demo/sounds/explosion.wav.import similarity index 100% rename from demo/sounds/explosion.wav.import rename to project.csharp/demo/sounds/explosion.wav.import diff --git a/demo/sounds/hit.wav b/project.csharp/demo/sounds/hit.wav similarity index 100% rename from demo/sounds/hit.wav rename to project.csharp/demo/sounds/hit.wav diff --git a/demo/sounds/hit.wav.import b/project.csharp/demo/sounds/hit.wav.import similarity index 100% rename from demo/sounds/hit.wav.import rename to project.csharp/demo/sounds/hit.wav.import diff --git a/demo/sounds/rolling.wav b/project.csharp/demo/sounds/rolling.wav similarity index 100% rename from demo/sounds/rolling.wav rename to project.csharp/demo/sounds/rolling.wav diff --git a/demo/sounds/rolling.wav.import b/project.csharp/demo/sounds/rolling.wav.import similarity index 100% rename from demo/sounds/rolling.wav.import rename to project.csharp/demo/sounds/rolling.wav.import diff --git a/icon.png b/project.csharp/icon.png similarity index 100% rename from icon.png rename to project.csharp/icon.png diff --git a/icon.png.import b/project.csharp/icon.png.import similarity index 100% rename from icon.png.import rename to project.csharp/icon.png.import diff --git a/project.csharp/project.godot b/project.csharp/project.godot new file mode 100644 index 0000000..9b3059c --- /dev/null +++ b/project.csharp/project.godot @@ -0,0 +1,57 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="TiltFiveTools" +run/main_scene="res://demo/main.tscn" +config/features=PackedStringArray("4.2", "C#", "GL Compatibility") +config/icon="res://icon.png" + +[autoload] + +T5Interface="*res://addons/tiltfive/T5Interface.cs" + +[debug] + +settings/stdout/verbose_stdout=true + +[dotnet] + +project/assembly_name="TiltFiveTools" + +[editor_plugins] + +enabled=PackedStringArray("res://addons/tiltfive/plugin.cfg") + +[layer_names] + +3d_render/layer_1="Everyone" +3d_render/layer_2="Spectator" +3d_render/layer_3="All Players" +3d_render/layer_11="Player 1" +3d_render/layer_12="Player 2" +3d_render/layer_13="Player 3" +3d_render/layer_14="Player 4" +3d_physics/layer_1="Static World" +3d_physics/layer_2="Dynamic World" +3d_physics/layer_11="Player 1" +3d_physics/layer_12="Player 2" +3d_physics/layer_13="Player 3" +3d_physics/layer_14="Player 4" + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" + +[xr] + +shaders/enabled=true diff --git a/.gitignore b/project.gd/.gitignore similarity index 100% rename from .gitignore rename to project.gd/.gitignore diff --git a/project.gd/addons/tiltfive/CHANGES.md b/project.gd/addons/tiltfive/CHANGES.md new file mode 100644 index 0000000..53b8816 --- /dev/null +++ b/project.gd/addons/tiltfive/CHANGES.md @@ -0,0 +1,5 @@ +This document shows the history of this plugin + +1.0.0 (under development) +========================= +- Port of the TiltFive Godot plugin for Godot 4 diff --git a/project.gd/addons/tiltfive/CONTRIBUTORS.md b/project.gd/addons/tiltfive/CONTRIBUTORS.md new file mode 100644 index 0000000..bfc1b44 --- /dev/null +++ b/project.gd/addons/tiltfive/CONTRIBUTORS.md @@ -0,0 +1,8 @@ +Contributors +============ + +This plugin has been developed by: +- [Patrick H Down](https://github.com/PatrickDown) (original plugin) + +Other people who have helped out by submitting fixes, enhancements, etc are: +- [Bastiaan Olij](https://github.com/BastiaanOlij) diff --git a/project.gd/addons/tiltfive/LICENSE.txt b/project.gd/addons/tiltfive/LICENSE.txt new file mode 100644 index 0000000..a3b1de6 --- /dev/null +++ b/project.gd/addons/tiltfive/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Patrick H Down + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/addons/tiltfive/T5Def.gd b/project.gd/addons/tiltfive/T5Def.gd similarity index 100% rename from addons/tiltfive/T5Def.gd rename to project.gd/addons/tiltfive/T5Def.gd diff --git a/addons/tiltfive/T5Interface.gd b/project.gd/addons/tiltfive/T5Interface.gd similarity index 100% rename from addons/tiltfive/T5Interface.gd rename to project.gd/addons/tiltfive/T5Interface.gd diff --git a/addons/tiltfive/T5Manager.gd b/project.gd/addons/tiltfive/T5Manager.gd similarity index 100% rename from addons/tiltfive/T5Manager.gd rename to project.gd/addons/tiltfive/T5Manager.gd diff --git a/addons/tiltfive/T5ManagerBase.gd b/project.gd/addons/tiltfive/T5ManagerBase.gd similarity index 100% rename from addons/tiltfive/T5ManagerBase.gd rename to project.gd/addons/tiltfive/T5ManagerBase.gd diff --git a/addons/tiltfive/T5ProjectSettings.gd b/project.gd/addons/tiltfive/T5ProjectSettings.gd similarity index 100% rename from addons/tiltfive/T5ProjectSettings.gd rename to project.gd/addons/tiltfive/T5ProjectSettings.gd diff --git a/addons/tiltfive/T5_Icon_RGB.svg.import b/project.gd/addons/tiltfive/T5_Icon_RGB.svg.import similarity index 100% rename from addons/tiltfive/T5_Icon_RGB.svg.import rename to project.gd/addons/tiltfive/T5_Icon_RGB.svg.import diff --git a/project.gd/addons/tiltfive/assets/T5-glasses.glb b/project.gd/addons/tiltfive/assets/T5-glasses.glb new file mode 100644 index 0000000..58aa551 Binary files /dev/null and b/project.gd/addons/tiltfive/assets/T5-glasses.glb differ diff --git a/project.gd/addons/tiltfive/assets/T5-glasses.glb.import b/project.gd/addons/tiltfive/assets/T5-glasses.glb.import new file mode 100644 index 0000000..722a6ee --- /dev/null +++ b/project.gd/addons/tiltfive/assets/T5-glasses.glb.import @@ -0,0 +1,32 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c44ott7hdtkjs" +path="res://.godot/imported/T5-glasses.glb-6d0d56d53da01ab25c5e0d7abeb3b195.scn" + +[deps] + +source_file="res://addons/tiltfive/assets/T5-glasses.glb" +dest_files=["res://.godot/imported/T5-glasses.glb-6d0d56d53da01ab25c5e0d7abeb3b195.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={} +gltf/embedded_image_handling=1 diff --git a/project.gd/addons/tiltfive/assets/T5-wand.glb b/project.gd/addons/tiltfive/assets/T5-wand.glb new file mode 100644 index 0000000..2414c57 Binary files /dev/null and b/project.gd/addons/tiltfive/assets/T5-wand.glb differ diff --git a/addons/tiltfive/assets/T5-wand.glb.import b/project.gd/addons/tiltfive/assets/T5-wand.glb.import similarity index 100% rename from addons/tiltfive/assets/T5-wand.glb.import rename to project.gd/addons/tiltfive/assets/T5-wand.glb.import diff --git a/addons/tiltfive/assets/T5GlassesModel.tscn b/project.gd/addons/tiltfive/assets/T5GlassesModel.tscn similarity index 100% rename from addons/tiltfive/assets/T5GlassesModel.tscn rename to project.gd/addons/tiltfive/assets/T5GlassesModel.tscn diff --git a/addons/tiltfive/assets/T5WandModel.tscn b/project.gd/addons/tiltfive/assets/T5WandModel.tscn similarity index 100% rename from addons/tiltfive/assets/T5WandModel.tscn rename to project.gd/addons/tiltfive/assets/T5WandModel.tscn diff --git a/project.gd/addons/tiltfive/assets/T5_border.glb b/project.gd/addons/tiltfive/assets/T5_border.glb new file mode 100644 index 0000000..f630e65 Binary files /dev/null and b/project.gd/addons/tiltfive/assets/T5_border.glb differ diff --git a/project.gd/addons/tiltfive/assets/T5_border.glb.import b/project.gd/addons/tiltfive/assets/T5_border.glb.import new file mode 100644 index 0000000..ec70317 --- /dev/null +++ b/project.gd/addons/tiltfive/assets/T5_border.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://s3wiiyeuos30" +path="res://.godot/imported/T5_border.glb-c296b67b5e5121f576eaa5a4e3abd8d7.scn" + +[deps] + +source_file="res://addons/tiltfive/assets/T5_border.glb" +dest_files=["res://.godot/imported/T5_border.glb-c296b67b5e5121f576eaa5a4e3abd8d7.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Boarder Material": { +"use_external/enabled": true, +"use_external/path": "res://addons/tiltfive/assets/materials/T5BorderMat.tres" +} +} +} +gltf/embedded_image_handling=0 diff --git a/project.gd/addons/tiltfive/assets/T5_border_XE.glb b/project.gd/addons/tiltfive/assets/T5_border_XE.glb new file mode 100644 index 0000000..f10e074 Binary files /dev/null and b/project.gd/addons/tiltfive/assets/T5_border_XE.glb differ diff --git a/project.gd/addons/tiltfive/assets/T5_border_XE.glb.import b/project.gd/addons/tiltfive/assets/T5_border_XE.glb.import new file mode 100644 index 0000000..285d74f --- /dev/null +++ b/project.gd/addons/tiltfive/assets/T5_border_XE.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bvi54sixhguyl" +path="res://.godot/imported/T5_border_XE.glb-8ae44d3d0d11e4f9febaa25582a4baec.scn" + +[deps] + +source_file="res://addons/tiltfive/assets/T5_border_XE.glb" +dest_files=["res://.godot/imported/T5_border_XE.glb-8ae44d3d0d11e4f9febaa25582a4baec.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Border Material": { +"use_external/enabled": true, +"use_external/path": "res://addons/tiltfive/assets/materials/T5BorderMat.tres" +} +} +} +gltf/embedded_image_handling=0 diff --git a/project.gd/addons/tiltfive/assets/T5_border_XE_raised.glb b/project.gd/addons/tiltfive/assets/T5_border_XE_raised.glb new file mode 100644 index 0000000..9f8392d Binary files /dev/null and b/project.gd/addons/tiltfive/assets/T5_border_XE_raised.glb differ diff --git a/project.gd/addons/tiltfive/assets/T5_border_XE_raised.glb.import b/project.gd/addons/tiltfive/assets/T5_border_XE_raised.glb.import new file mode 100644 index 0000000..25a8715 --- /dev/null +++ b/project.gd/addons/tiltfive/assets/T5_border_XE_raised.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cnjvy4x25r3ae" +path="res://.godot/imported/T5_border_XE_raised.glb-b835c3500317b519c096a0e5b7317a31.scn" + +[deps] + +source_file="res://addons/tiltfive/assets/T5_border_XE_raised.glb" +dest_files=["res://.godot/imported/T5_border_XE_raised.glb-b835c3500317b519c096a0e5b7317a31.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Border Material": { +"use_external/enabled": true, +"use_external/path": "res://addons/tiltfive/assets/materials/T5BorderMat.tres" +} +} +} +gltf/embedded_image_handling=0 diff --git a/addons/tiltfive/assets/auto_scale.gd b/project.gd/addons/tiltfive/assets/auto_scale.gd similarity index 100% rename from addons/tiltfive/assets/auto_scale.gd rename to project.gd/addons/tiltfive/assets/auto_scale.gd diff --git a/project.gd/addons/tiltfive/assets/board.svg b/project.gd/addons/tiltfive/assets/board.svg new file mode 100644 index 0000000..98a3139 --- /dev/null +++ b/project.gd/addons/tiltfive/assets/board.svg @@ -0,0 +1,50 @@ + + + + + + + + + + diff --git a/project.gd/addons/tiltfive/assets/board.svg.import b/project.gd/addons/tiltfive/assets/board.svg.import new file mode 100644 index 0000000..131f8eb --- /dev/null +++ b/project.gd/addons/tiltfive/assets/board.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1k4sti7mydwh" +path="res://.godot/imported/board.svg-ece10245621dedc440b30e3a84647ba9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/tiltfive/assets/board.svg" +dest_files=["res://.godot/imported/board.svg-ece10245621dedc440b30e3a84647ba9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.gd/addons/tiltfive/assets/glasses.svg b/project.gd/addons/tiltfive/assets/glasses.svg new file mode 100644 index 0000000..d127c68 --- /dev/null +++ b/project.gd/addons/tiltfive/assets/glasses.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + diff --git a/project.gd/addons/tiltfive/assets/glasses.svg.import b/project.gd/addons/tiltfive/assets/glasses.svg.import new file mode 100644 index 0000000..fd92c68 --- /dev/null +++ b/project.gd/addons/tiltfive/assets/glasses.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://63xpi03wffd8" +path="res://.godot/imported/glasses.svg-065e492e0e832aaa5619ccaad95c9012.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/tiltfive/assets/glasses.svg" +dest_files=["res://.godot/imported/glasses.svg-065e492e0e832aaa5619ccaad95c9012.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.gd/addons/tiltfive/assets/materials/Black.tres b/project.gd/addons/tiltfive/assets/materials/Black.tres new file mode 100644 index 0000000..68eb947 --- /dev/null +++ b/project.gd/addons/tiltfive/assets/materials/Black.tres @@ -0,0 +1,6 @@ +[gd_resource type="StandardMaterial3D" format=3 uid="uid://di5e6v7te1n6w"] + +[resource] +resource_name = "Black" +albedo_color = Color(0.00392157, 0.00392157, 0.00392157, 1) +roughness = 0.693214 diff --git a/project.gd/addons/tiltfive/assets/materials/T5BorderMat.tres b/project.gd/addons/tiltfive/assets/materials/T5BorderMat.tres new file mode 100644 index 0000000..9cdce6d --- /dev/null +++ b/project.gd/addons/tiltfive/assets/materials/T5BorderMat.tres @@ -0,0 +1,6 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://df4vk6rpxs784"] + +[ext_resource type="Texture2D" uid="uid://b42436tkvdjtj" path="res://addons/tiltfive/assets/materials/T5_border_tex.png" id="1_d1o3y"] + +[resource] +albedo_texture = ExtResource("1_d1o3y") diff --git a/project.gd/addons/tiltfive/assets/materials/T5_border_tex.png b/project.gd/addons/tiltfive/assets/materials/T5_border_tex.png new file mode 100644 index 0000000..9e2ff18 Binary files /dev/null and b/project.gd/addons/tiltfive/assets/materials/T5_border_tex.png differ diff --git a/project.gd/addons/tiltfive/assets/materials/T5_border_tex.png.import b/project.gd/addons/tiltfive/assets/materials/T5_border_tex.png.import new file mode 100644 index 0000000..9a22f78 --- /dev/null +++ b/project.gd/addons/tiltfive/assets/materials/T5_border_tex.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b42436tkvdjtj" +path.s3tc="res://.godot/imported/T5_border_tex.png-f817ec4f59697917c96dd8c9cdc0b494.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://addons/tiltfive/assets/materials/T5_border_tex.png" +dest_files=["res://.godot/imported/T5_border_tex.png-f817ec4f59697917c96dd8c9cdc0b494.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/project.gd/addons/tiltfive/assets/materials/White.tres b/project.gd/addons/tiltfive/assets/materials/White.tres new file mode 100644 index 0000000..5f922b6 --- /dev/null +++ b/project.gd/addons/tiltfive/assets/materials/White.tres @@ -0,0 +1,6 @@ +[gd_resource type="StandardMaterial3D" format=3 uid="uid://rb4v56b7v6vr"] + +[resource] +resource_name = "White" +albedo_color = Color(0.905882, 0.905882, 0.905882, 1) +roughness = 0.693214 diff --git a/project.gd/addons/tiltfive/bin/TiltFiveNative.dll b/project.gd/addons/tiltfive/bin/TiltFiveNative.dll new file mode 100644 index 0000000..948345a Binary files /dev/null and b/project.gd/addons/tiltfive/bin/TiltFiveNative.dll differ diff --git a/project.gd/addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll b/project.gd/addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll new file mode 100644 index 0000000..e731c80 Binary files /dev/null and b/project.gd/addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll differ diff --git a/project.gd/addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll b/project.gd/addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll new file mode 100644 index 0000000..620eaa9 Binary files /dev/null and b/project.gd/addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll differ diff --git a/addons/tiltfive/plugin.cfg b/project.gd/addons/tiltfive/plugin.cfg similarity index 100% rename from addons/tiltfive/plugin.cfg rename to project.gd/addons/tiltfive/plugin.cfg diff --git a/addons/tiltfive/plugin.gd b/project.gd/addons/tiltfive/plugin.gd similarity index 100% rename from addons/tiltfive/plugin.gd rename to project.gd/addons/tiltfive/plugin.gd diff --git a/addons/tiltfive/scenes/T5XRRig.gd b/project.gd/addons/tiltfive/scenes/T5XRRig.gd similarity index 100% rename from addons/tiltfive/scenes/T5XRRig.gd rename to project.gd/addons/tiltfive/scenes/T5XRRig.gd diff --git a/addons/tiltfive/scenes/T5XRRig.tscn b/project.gd/addons/tiltfive/scenes/T5XRRig.tscn similarity index 100% rename from addons/tiltfive/scenes/T5XRRig.tscn rename to project.gd/addons/tiltfive/scenes/T5XRRig.tscn diff --git a/project.gd/addons/tiltfive/tiltfive.gdextension b/project.gd/addons/tiltfive/tiltfive.gdextension new file mode 100644 index 0000000..96362ae --- /dev/null +++ b/project.gd/addons/tiltfive/tiltfive.gdextension @@ -0,0 +1,22 @@ +[configuration] + +entry_symbol = "tiltfive_library_init" +compatibility_minimum = "4.1.2" + +[icons] +T5Gameboard = "res://addons/tiltfive/assets/board.svg" + +[libraries] + +windows.x86_64.debug = "res://addons/tiltfive/bin/libgdtiltfive.windows.template_debug.x86_64.dll" +windows.x86_64.release = "res://addons/tiltfive/bin/libgdtiltfive.windows.template_release.x86_64.dll" + +[dependencies] + +windows.x86_64.debug = { + "res://addons/tiltfive/bin/TiltFiveNative.dll" : "" +} +windows.x86_64.release = { + "res://addons/tiltfive/bin/TiltFiveNative.dll" : "" +} + diff --git a/project.gd/addons/tiltfive_tools/README.md b/project.gd/addons/tiltfive_tools/README.md new file mode 100644 index 0000000..c124c40 --- /dev/null +++ b/project.gd/addons/tiltfive_tools/README.md @@ -0,0 +1,187 @@ +# Tilt Five Tools + +This asset provides numerous helper scripts and nodes that work with +[TiltFiveGodot4](https://github.com/GodotVR/TiltFiveGodot4) for developing +Tilt Five experiences and games. + + +## General Concepts + +### Wand Inputs + +The Tilt Five wand is represented in Godot as a T5Controller3D. This node +emits signals when the inputs are used. + +For button presses the `button_pressed(name : String)` and +`button_released(name : String)` signals use the following names: +* "button_a" +* "button_b" +* "button_x" +* "button_y" +* "button_1" +* "button_2" +* "button_3" +* "button_t5" +* "trigger_click" + +The trigger input is reported as "trigger" in the +`input_float_changed(name : String, value : float)` signal. + +The joystick input is reported as "stick" in the +`input_vector2_changed(name : String, value : Vector2)` signal. + + +### Visual Layers + +As Tilt Five is designed to work with multiple local players, it is sometimes +necessary to limit what content is visible to the different players. This can +be achieved using visual layers and camera cull masks. The following are the +layer assignments used by Tilt Five Tools: +* [1] Visible by Everyone +* [2] Visible by Spectator +* [3] Visible by All Players +* [11] Visible to Player 1 +* [12] Visible to Player 2 +* [13] Visible to Player 3 +* [14] Visible to Player 4 + + +### Physics Layers + +Similar to Visual Layers, four physics layers are reserved for the players. + +* [11] Collision for Player 1 +* [12] Collision for Player 2 +* [13] Collision for Player 3 +* [14] Collision for Player 4 + + +### Staging + +Staging is the the infrastructure for loading and switching between game scenes. +The components are named and behave like a theater: +* Staging: The stage where scenes are loaded and played +* Scene: An environment constructed on a stage for playing in +* Player: A user playing a role in the game +* Character: A role in the game performed by a player + + +## Tilt Five Tool Components + +### Functions + +This folder contains nodes for enhancing player scenes: + +| Type | Function | +| :--- | :----------- | +| Board Scale | Support scaling the game board via wand buttons | +| Pointer | Adds a curved pointer to the wand that fires pointer events | +| Face Player | Causes the parent node to rotate to face the player | +| Visible Toggle | Toggles the parent node visibility on a wand button | + +### Objects + +This folder contains nodes to help with standard Tilt Five behavior. + +| Type | Function | +| :--- | :----------- | +| Viewport2Din3D | Render a 2D UI in 3D with support for pointer interactions | +| Scene Switch Area | An Area3D that can trigger Staging to load a different game scene | +| Spectator Camera | A spectator camera that follows the average player origin/board position | +| CharacterBody Controller | A demo controller for CharacterBody3D based characters | +| RigidBody Controller | A demo controller for RigidBody3D based characters | + + +### Staging + +This folder contains nodes for switching between different scenes. + +| Type | Function | +| :--- | :----------- | +| Staging | This manages the players, and supports switching between different game scenes | +| Scene | This is the base for creating custom game scenes | +| Player | This is the base for customizing player functionality | +| Character | this is the base for characters (player avatars) | + + +## FAQ + +### Where to Begin + +The following constructs a basic application with a cube on the board. + +1. Construct a custom "player" scene inheriting from staging/player.tscn and save it + in the game folder. This can be modified to add pointers, spectator meshes for + glasses and wands, and player-specific popup menus. +2. Construct a custom "start" scene inheriting from staging/scene.tscn and save it + in the game folder. This will contain the scene objects. Add a simple 0.1 meter + cube mesh in there to test. +3. Construct a custom "main" scene inheriting from staging/staging.tscn and save it + in the game folder. Set the "Start Scene" property to point to the custom "start" + scene. In the T5Manager node set the "Glasses Scene" to point to the custom + "player" scene. Set this "main" scene as the Godot Main Scene. + +Pressing play in Godot should start the game, load the start scene, and show the +cube in the middle of the Tilt Five game pad. + + +### Create a Popup Menu + +The following steps add a popup menu that shows when the user presses the T5 button +on the wand. + +1. Construct a new "popup menu" 2D scene and save it in the game folder. Populate + the 2D scene with suitable controls and buttons as desired for the popup menu. +2. Open the custom "player" scene and add a new Node3D called "Menu" under the + "Origin" node (which represents the center of the game-board). Under the "Menu" + node add a VisibleToggle node and a FacePlayer node. These will cause the + node to toggle visibility when the T5 Menu button (this can be customized) is + pressed, and to face towards the player. +3. Under the "Menu" node add a Viewport2Din3D called "Popup" and set its Scene to + the "popup menu" scene. Enable Unshaded otherwise the popup will use the lighting + of the stage and environment. +4. To prevent other players from seeing or interacting with the popup menu, disable + all Visible and Collision layers. The correct player-only collision and visible + layers will be enabled at runtime depending on which player pops open the menu. + + +### Scaling the World + +Many assets are designed for real-world scale; however the Tilt Five board is +only around 1 meter in size. The easiest way to solve this is to change the +"Gameboard Scale" property in the custom "player" Origin node. A value of 10 +will shrink items in the board making them 10x smaller. + + +### Creating Characters for Players + +1. Construct a new custom "character" scene inheriting from "staging/character.tscn" + and save it in the game folder. + +2. Add an appropriate character body object (E.G. CharacterBody3D or RigidBody3D) + to the scene, and add a control script to it. Two demo control scripts have + been provided to show how control can be implemented: + * objects/controllers/characterbody_controller.gd + * objects/controllers/rigidbody_controller.gd + + +### Center Game Board on Character + +The demo character body controller scripts already have an option to do this by +moving the players Origin node (the center of the game board) to match the +position of the character body. + + +### World/Player State + +The state of the world and the players can be maintained in a custom autoload +singleton script which would be accessible from everywhere. Additionally the +Staging node contains a "data" dictionary which can be used to hold any custom +information. + +The application is responsible for implementing a persistence mechanism for +save files. There are numerous articles available on implementing this feature: +* https://docs.godotengine.org/en/stable/tutorials/io/saving_games.html +* https://gdscript.com/solutions/how-to-save-and-load-godot-game-data/ +* https://www.youtube.com/watch?v=lXO5Jt957BA +* https://www.youtube.com/watch?v=mI4HfyBdV-k diff --git a/addons/tiltfive_tools/functions/board_scale.gd b/project.gd/addons/tiltfive_tools/functions/board_scale.gd similarity index 100% rename from addons/tiltfive_tools/functions/board_scale.gd rename to project.gd/addons/tiltfive_tools/functions/board_scale.gd diff --git a/addons/tiltfive_tools/functions/board_scale.tscn b/project.gd/addons/tiltfive_tools/functions/board_scale.tscn similarity index 100% rename from addons/tiltfive_tools/functions/board_scale.tscn rename to project.gd/addons/tiltfive_tools/functions/board_scale.tscn diff --git a/addons/tiltfive_tools/functions/face_player.gd b/project.gd/addons/tiltfive_tools/functions/face_player.gd similarity index 100% rename from addons/tiltfive_tools/functions/face_player.gd rename to project.gd/addons/tiltfive_tools/functions/face_player.gd diff --git a/addons/tiltfive_tools/functions/face_player.tscn b/project.gd/addons/tiltfive_tools/functions/face_player.tscn similarity index 100% rename from addons/tiltfive_tools/functions/face_player.tscn rename to project.gd/addons/tiltfive_tools/functions/face_player.tscn diff --git a/addons/tiltfive_tools/functions/pointer.gd b/project.gd/addons/tiltfive_tools/functions/pointer.gd similarity index 100% rename from addons/tiltfive_tools/functions/pointer.gd rename to project.gd/addons/tiltfive_tools/functions/pointer.gd diff --git a/project.gd/addons/tiltfive_tools/functions/pointer.gdshader b/project.gd/addons/tiltfive_tools/functions/pointer.gdshader new file mode 100644 index 0000000..5bbafe5 --- /dev/null +++ b/project.gd/addons/tiltfive_tools/functions/pointer.gdshader @@ -0,0 +1,36 @@ +shader_type spatial; +render_mode unshaded, depth_draw_always, blend_add; + +uniform vec3 color : source_color = vec3(0.0, 0.0, 1.0); +uniform vec3 forward = vec3(0.0, -0.25, 0.0); +uniform vec3 target = vec3(0.0, -1.0, 1.0); +uniform vec3 target_up = vec3(0.0, 0.0, -0.25); + +void vertex() { + // (ab)use UV.y to ramp from start to finish + float t = clamp(UV.y * 2.0, 0.0, 1.0); + float m = 1.0 - t; + + VERTEX.y = 0.0; + vec3 ov = VERTEX; + + // Rotate to face forward along path + vec3 tangent = normalize(mix(forward, -target_up, t)); + vec3 bitangent = cross(tangent, vec3(1.0, 0.0, 0.0)); + VERTEX.y = ov.y * tangent.y + ov.z * tangent.z; + VERTEX.z = ov.y * bitangent.y + ov.z * bitangent.z; + + // offset in world + float a = m * m * m; + float b = 3.0 * m * m * t; + float c = 3.0 * m * t * t; + float d = t * t * t; + + VERTEX += b * forward + c * (target + target_up) + d * target; +} + +void fragment() { + float a = clamp(UV.y * 2.0, 0.0, 1.0); + ALBEDO = color; + ALPHA = a; +} diff --git a/addons/tiltfive_tools/functions/pointer.tscn b/project.gd/addons/tiltfive_tools/functions/pointer.tscn similarity index 100% rename from addons/tiltfive_tools/functions/pointer.tscn rename to project.gd/addons/tiltfive_tools/functions/pointer.tscn diff --git a/addons/tiltfive_tools/functions/pointer_event.gd b/project.gd/addons/tiltfive_tools/functions/pointer_event.gd similarity index 100% rename from addons/tiltfive_tools/functions/pointer_event.gd rename to project.gd/addons/tiltfive_tools/functions/pointer_event.gd diff --git a/addons/tiltfive_tools/functions/visible_toggle.gd b/project.gd/addons/tiltfive_tools/functions/visible_toggle.gd similarity index 100% rename from addons/tiltfive_tools/functions/visible_toggle.gd rename to project.gd/addons/tiltfive_tools/functions/visible_toggle.gd diff --git a/addons/tiltfive_tools/functions/visible_toggle.tscn b/project.gd/addons/tiltfive_tools/functions/visible_toggle.tscn similarity index 100% rename from addons/tiltfive_tools/functions/visible_toggle.tscn rename to project.gd/addons/tiltfive_tools/functions/visible_toggle.tscn diff --git a/addons/tiltfive_tools/objects/controllers/characterbody_controller.gd b/project.gd/addons/tiltfive_tools/objects/controllers/characterbody_controller.gd similarity index 100% rename from addons/tiltfive_tools/objects/controllers/characterbody_controller.gd rename to project.gd/addons/tiltfive_tools/objects/controllers/characterbody_controller.gd diff --git a/addons/tiltfive_tools/objects/controllers/rigidbody_controller.gd b/project.gd/addons/tiltfive_tools/objects/controllers/rigidbody_controller.gd similarity index 100% rename from addons/tiltfive_tools/objects/controllers/rigidbody_controller.gd rename to project.gd/addons/tiltfive_tools/objects/controllers/rigidbody_controller.gd diff --git a/addons/tiltfive_tools/objects/scene_switch_area.gd b/project.gd/addons/tiltfive_tools/objects/scene_switch_area.gd similarity index 100% rename from addons/tiltfive_tools/objects/scene_switch_area.gd rename to project.gd/addons/tiltfive_tools/objects/scene_switch_area.gd diff --git a/addons/tiltfive_tools/objects/scene_switch_area.tscn b/project.gd/addons/tiltfive_tools/objects/scene_switch_area.tscn similarity index 100% rename from addons/tiltfive_tools/objects/scene_switch_area.tscn rename to project.gd/addons/tiltfive_tools/objects/scene_switch_area.tscn diff --git a/addons/tiltfive_tools/objects/spectator_camera.gd b/project.gd/addons/tiltfive_tools/objects/spectator_camera.gd similarity index 100% rename from addons/tiltfive_tools/objects/spectator_camera.gd rename to project.gd/addons/tiltfive_tools/objects/spectator_camera.gd diff --git a/addons/tiltfive_tools/objects/spectator_camera.tscn b/project.gd/addons/tiltfive_tools/objects/spectator_camera.tscn similarity index 100% rename from addons/tiltfive_tools/objects/spectator_camera.tscn rename to project.gd/addons/tiltfive_tools/objects/spectator_camera.tscn diff --git a/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.gd b/project.gd/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.gd similarity index 100% rename from addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.gd rename to project.gd/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.gd diff --git a/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.tscn b/project.gd/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.tscn similarity index 100% rename from addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.tscn rename to project.gd/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d.tscn diff --git a/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d_body.gd b/project.gd/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d_body.gd similarity index 100% rename from addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d_body.gd rename to project.gd/addons/tiltfive_tools/objects/viewport/viewport_2d_in_3d_body.gd diff --git a/addons/tiltfive_tools/staging/character.gd b/project.gd/addons/tiltfive_tools/staging/character.gd similarity index 100% rename from addons/tiltfive_tools/staging/character.gd rename to project.gd/addons/tiltfive_tools/staging/character.gd diff --git a/addons/tiltfive_tools/staging/character.tscn b/project.gd/addons/tiltfive_tools/staging/character.tscn similarity index 100% rename from addons/tiltfive_tools/staging/character.tscn rename to project.gd/addons/tiltfive_tools/staging/character.tscn diff --git a/addons/tiltfive_tools/staging/player.gd b/project.gd/addons/tiltfive_tools/staging/player.gd similarity index 100% rename from addons/tiltfive_tools/staging/player.gd rename to project.gd/addons/tiltfive_tools/staging/player.gd diff --git a/addons/tiltfive_tools/staging/player.tscn b/project.gd/addons/tiltfive_tools/staging/player.tscn similarity index 100% rename from addons/tiltfive_tools/staging/player.tscn rename to project.gd/addons/tiltfive_tools/staging/player.tscn diff --git a/addons/tiltfive_tools/staging/scene.gd b/project.gd/addons/tiltfive_tools/staging/scene.gd similarity index 100% rename from addons/tiltfive_tools/staging/scene.gd rename to project.gd/addons/tiltfive_tools/staging/scene.gd diff --git a/addons/tiltfive_tools/staging/scene.tscn b/project.gd/addons/tiltfive_tools/staging/scene.tscn similarity index 100% rename from addons/tiltfive_tools/staging/scene.tscn rename to project.gd/addons/tiltfive_tools/staging/scene.tscn diff --git a/addons/tiltfive_tools/staging/staging.gd b/project.gd/addons/tiltfive_tools/staging/staging.gd similarity index 100% rename from addons/tiltfive_tools/staging/staging.gd rename to project.gd/addons/tiltfive_tools/staging/staging.gd diff --git a/addons/tiltfive_tools/staging/staging.tscn b/project.gd/addons/tiltfive_tools/staging/staging.tscn similarity index 100% rename from addons/tiltfive_tools/staging/staging.tscn rename to project.gd/addons/tiltfive_tools/staging/staging.tscn diff --git a/project.gd/demo/README.md b/project.gd/demo/README.md new file mode 100644 index 0000000..aef3ff8 --- /dev/null +++ b/project.gd/demo/README.md @@ -0,0 +1,60 @@ +# Tilt Five Tools Demo + +This folder contains a demo Tilt Five application. It consists of a main menu +and a couple of demo mini-games. + + +## Top Scenes + +The "main.tscn" scene is the starting scene of the game. It extends from +Tilt Five Tools "Staging" to get scene switching and manage the players. +It is configured to: +* Load the main menu scene at start +* Use the custom "player" scene for players +* Adds a spectator camera + +The "player.tscn" scene extends from the Tilt Five Tools "Player" to get basic +player behavior, and additionally: +* Adds a Pointer to the wand +* Adds Board Scale button support to the wand +* Adds glasses and wand models for the spectator camera + + +## Main Menu + +The "main_menu.tscn" scene extends from Tilt Five Tools "Scene" and adds a +Viewport2Din3D to host the main menu UI. This UI (defined in "main_menu_2d.tscn") +provides a basic menu allowing the player to run the two demo mini-games or +to quit. + + +## Demo 1 + +The first demo mini-game shows how to handle a scene with a character avatar. +Every player has a sphere character spawned for them which they can move +around using the wand joystick and buttons. + +The "demo1_scene.tscn" scene extends from Tilt Five Tools "Scene" and: + +* Sets "character.tscn" to be loaded to make characters for each player +* Contains a basic map for the players to move around on +* Contains Scene Switch areas to reload the main menu on death or finish + +The "character.tscn" is instantiated for each player. On load it gets the +players wand and subscribes to button and joystick events to move the +players sphere body around the world. + + +## Demo 2 + +The second demo mini-game shows how to handle a scene with no character +avatars. The players have to defend a base by shooting their pointer at +the ground and firing missiles at it to destroy the enemies. + +The "demo2_scene.tscn" scene extends from Tilt Five Tools "Scene" and: + +* Contains a ground object which reacts to wand clicks by firing missiles +* Contains enemy spawn points which spawn enemies that charge the players base +* The missiles flies to the ground and explodes killing enemies in range +* The enemies move towards the player base +* If an enemy reaches the player base it triggers a reload of the main menu diff --git a/demo/demo1_scene/character.tscn b/project.gd/demo/demo1_scene/character.tscn similarity index 100% rename from demo/demo1_scene/character.tscn rename to project.gd/demo/demo1_scene/character.tscn diff --git a/demo/demo1_scene/character_body.gd b/project.gd/demo/demo1_scene/character_body.gd similarity index 100% rename from demo/demo1_scene/character_body.gd rename to project.gd/demo/demo1_scene/character_body.gd diff --git a/demo/demo1_scene/demo1_scene.tscn b/project.gd/demo/demo1_scene/demo1_scene.tscn similarity index 100% rename from demo/demo1_scene/demo1_scene.tscn rename to project.gd/demo/demo1_scene/demo1_scene.tscn diff --git a/project.gd/demo/demo1_scene/objects/barrier.tscn b/project.gd/demo/demo1_scene/objects/barrier.tscn new file mode 100644 index 0000000..fe701cb --- /dev/null +++ b/project.gd/demo/demo1_scene/objects/barrier.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=3 uid="uid://ccjojktik2du0"] + +[ext_resource type="Material" uid="uid://bjvnw1lxswc7b" path="res://demo/materials/bricks_material.tres" id="1_d6xvk"] + +[node name="Barrier" type="Node3D"] + +[node name="CSGPolygon3D" type="CSGPolygon3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 0, 1) +use_collision = true +polygon = PackedVector2Array(0, 0, 0.2, 0.8, 0.8, 0.8, 1, 0) +depth = 2.0 +material = ExtResource("1_d6xvk") diff --git a/project.gd/demo/demo1_scene/objects/hall.tscn b/project.gd/demo/demo1_scene/objects/hall.tscn new file mode 100644 index 0000000..0eff5a0 --- /dev/null +++ b/project.gd/demo/demo1_scene/objects/hall.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=6 format=3 uid="uid://bcy3f76x7otpv"] + +[ext_resource type="Material" uid="uid://bjvnw1lxswc7b" path="res://demo/materials/bricks_material.tres" id="1_14fbs"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_rtn8y"] +size = Vector3(6, 1, 6) + +[sub_resource type="QuadMesh" id="QuadMesh_bpwnf"] +material = ExtResource("1_14fbs") +size = Vector2(6, 6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_aunpy"] +size = Vector3(6, 2, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_4iol7"] +material = ExtResource("1_14fbs") +size = Vector3(6, 2, 1) + +[node name="Hall" type="Node3D"] + +[node name="Floor" type="StaticBody3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) +shape = SubResource("BoxShape3D_rtn8y") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) +mesh = SubResource("QuadMesh_bpwnf") + +[node name="LongWall1" type="StaticBody3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -2.5, 0, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="LongWall1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_aunpy") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="LongWall1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_4iol7") + +[node name="LongWall2" type="StaticBody3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 2.5, 0, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="LongWall2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_aunpy") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="LongWall2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_4iol7") diff --git a/project.gd/demo/demo1_scene/objects/hall_l.tscn b/project.gd/demo/demo1_scene/objects/hall_l.tscn new file mode 100644 index 0000000..c53cab3 --- /dev/null +++ b/project.gd/demo/demo1_scene/objects/hall_l.tscn @@ -0,0 +1,76 @@ +[gd_scene load_steps=10 format=3 uid="uid://b1l6rigaxg121"] + +[ext_resource type="Material" uid="uid://bjvnw1lxswc7b" path="res://demo/materials/bricks_material.tres" id="1_ca8l7"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_rtn8y"] +size = Vector3(6, 1, 6) + +[sub_resource type="QuadMesh" id="QuadMesh_bpwnf"] +material = ExtResource("1_ca8l7") +size = Vector2(6, 6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_aunpy"] +size = Vector3(6, 2, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_4iol7"] +material = ExtResource("1_ca8l7") +size = Vector3(6, 2, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_np702"] +size = Vector3(1, 2, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_2en0n"] +material = ExtResource("1_ca8l7") +size = Vector3(1, 2, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_10u8p"] +size = Vector3(5, 2, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_eb8v3"] +material = ExtResource("1_ca8l7") +size = Vector3(5, 2, 1) + +[node name="HallL" type="Node3D"] + +[node name="Floor" type="StaticBody3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) +shape = SubResource("BoxShape3D_rtn8y") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) +mesh = SubResource("QuadMesh_bpwnf") + +[node name="LongWall1" type="StaticBody3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -2.5, 0, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="LongWall1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_aunpy") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="LongWall1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_4iol7") + +[node name="ShortWall" type="StaticBody3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 2.5, 0, -2.5) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="ShortWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_np702") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="ShortWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_2en0n") + +[node name="MediumWall" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 2.5) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MediumWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_10u8p") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="MediumWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_eb8v3") diff --git a/project.gd/demo/demo1_scene/objects/hall_t.tscn b/project.gd/demo/demo1_scene/objects/hall_t.tscn new file mode 100644 index 0000000..4cb5c22 --- /dev/null +++ b/project.gd/demo/demo1_scene/objects/hall_t.tscn @@ -0,0 +1,69 @@ +[gd_scene load_steps=8 format=3 uid="uid://7i1gebioyibk"] + +[ext_resource type="Material" uid="uid://bjvnw1lxswc7b" path="res://demo/materials/bricks_material.tres" id="1_kt32i"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_rtn8y"] +size = Vector3(6, 1, 6) + +[sub_resource type="QuadMesh" id="QuadMesh_bpwnf"] +material = ExtResource("1_kt32i") +size = Vector2(6, 6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_aunpy"] +size = Vector3(6, 2, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_4iol7"] +material = ExtResource("1_kt32i") +size = Vector3(6, 2, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_np702"] +size = Vector3(1, 2, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_2en0n"] +material = ExtResource("1_kt32i") +size = Vector3(1, 2, 1) + +[node name="HallT" type="Node3D"] + +[node name="Floor" type="StaticBody3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) +shape = SubResource("BoxShape3D_rtn8y") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) +mesh = SubResource("QuadMesh_bpwnf") + +[node name="LongWall1" type="StaticBody3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -2.5, 0, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="LongWall1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_aunpy") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="LongWall1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_4iol7") + +[node name="ShortWall" type="StaticBody3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 2.5, 0, -2.5) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="ShortWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_np702") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="ShortWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_2en0n") + +[node name="ShortWall2" type="StaticBody3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 2.5, 0, 2.5) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="ShortWall2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_np702") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="ShortWall2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_2en0n") diff --git a/project.gd/demo/demo1_scene/objects/ramp.tscn b/project.gd/demo/demo1_scene/objects/ramp.tscn new file mode 100644 index 0000000..b099418 --- /dev/null +++ b/project.gd/demo/demo1_scene/objects/ramp.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=2 format=3 uid="uid://dkh6kon2qwu4t"] + +[ext_resource type="Material" uid="uid://bjvnw1lxswc7b" path="res://demo/materials/bricks_material.tres" id="1_skb6l"] + +[node name="Ramp" type="Node3D"] + +[node name="Floor" type="CSGPolygon3D" parent="."] +use_collision = true +polygon = PackedVector2Array(0, 0, 4, -2, 4, -3, 0, -1) +depth = 6.0 +material = ExtResource("1_skb6l") + +[node name="Wall1" type="CSGPolygon3D" parent="."] +use_collision = true +polygon = PackedVector2Array(0, 0, 0, 2, 4, 0, 4, -2) +material = ExtResource("1_skb6l") + +[node name="Wall2" type="CSGPolygon3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -5) +use_collision = true +polygon = PackedVector2Array(0, 0, 0, 2, 4, 0, 4, -2) +material = ExtResource("1_skb6l") diff --git a/project.gd/demo/demo1_scene/objects/room.tscn b/project.gd/demo/demo1_scene/objects/room.tscn new file mode 100644 index 0000000..7c43d7a --- /dev/null +++ b/project.gd/demo/demo1_scene/objects/room.tscn @@ -0,0 +1,69 @@ +[gd_scene load_steps=8 format=3 uid="uid://b427u10bfm22u"] + +[ext_resource type="Material" uid="uid://bjvnw1lxswc7b" path="res://demo/materials/bricks_material.tres" id="1_8xhw1"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_rtn8y"] +size = Vector3(6, 1, 6) + +[sub_resource type="QuadMesh" id="QuadMesh_bpwnf"] +material = ExtResource("1_8xhw1") +size = Vector2(6, 6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_sjpuw"] +size = Vector3(4, 2, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_tl7kr"] +material = ExtResource("1_8xhw1") +size = Vector3(4, 2, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_aunpy"] +size = Vector3(6, 2, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_4iol7"] +material = ExtResource("1_8xhw1") +size = Vector3(6, 2, 1) + +[node name="RoomEnd" type="Node3D"] + +[node name="Floor" type="StaticBody3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) +shape = SubResource("BoxShape3D_rtn8y") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) +mesh = SubResource("QuadMesh_bpwnf") + +[node name="MediumWall" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2.5) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MediumWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_sjpuw") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="MediumWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_tl7kr") + +[node name="LongWall1" type="StaticBody3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -2.5, 0, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="LongWall1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_aunpy") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="LongWall1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_4iol7") + +[node name="LongWall2" type="StaticBody3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 2.5, 0, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="LongWall2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_aunpy") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="LongWall2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_4iol7") diff --git a/demo/demo2_scene/demo2_scene.tscn b/project.gd/demo/demo2_scene/demo2_scene.tscn similarity index 100% rename from demo/demo2_scene/demo2_scene.tscn rename to project.gd/demo/demo2_scene/demo2_scene.tscn diff --git a/demo/demo2_scene/objects/enemy.gd b/project.gd/demo/demo2_scene/objects/enemy.gd similarity index 100% rename from demo/demo2_scene/objects/enemy.gd rename to project.gd/demo/demo2_scene/objects/enemy.gd diff --git a/demo/demo2_scene/objects/enemy.tscn b/project.gd/demo/demo2_scene/objects/enemy.tscn similarity index 100% rename from demo/demo2_scene/objects/enemy.tscn rename to project.gd/demo/demo2_scene/objects/enemy.tscn diff --git a/demo/demo2_scene/objects/enemy_spawn.gd b/project.gd/demo/demo2_scene/objects/enemy_spawn.gd similarity index 100% rename from demo/demo2_scene/objects/enemy_spawn.gd rename to project.gd/demo/demo2_scene/objects/enemy_spawn.gd diff --git a/demo/demo2_scene/objects/enemy_spawn.tscn b/project.gd/demo/demo2_scene/objects/enemy_spawn.tscn similarity index 100% rename from demo/demo2_scene/objects/enemy_spawn.tscn rename to project.gd/demo/demo2_scene/objects/enemy_spawn.tscn diff --git a/demo/demo2_scene/objects/ground.gd b/project.gd/demo/demo2_scene/objects/ground.gd similarity index 100% rename from demo/demo2_scene/objects/ground.gd rename to project.gd/demo/demo2_scene/objects/ground.gd diff --git a/demo/demo2_scene/objects/ground.tscn b/project.gd/demo/demo2_scene/objects/ground.tscn similarity index 100% rename from demo/demo2_scene/objects/ground.tscn rename to project.gd/demo/demo2_scene/objects/ground.tscn diff --git a/demo/demo2_scene/objects/missile.gd b/project.gd/demo/demo2_scene/objects/missile.gd similarity index 100% rename from demo/demo2_scene/objects/missile.gd rename to project.gd/demo/demo2_scene/objects/missile.gd diff --git a/demo/demo2_scene/objects/missile.tscn b/project.gd/demo/demo2_scene/objects/missile.tscn similarity index 100% rename from demo/demo2_scene/objects/missile.tscn rename to project.gd/demo/demo2_scene/objects/missile.tscn diff --git a/demo/demo3_scene/character/character.tscn b/project.gd/demo/demo3_scene/character/character.tscn similarity index 100% rename from demo/demo3_scene/character/character.tscn rename to project.gd/demo/demo3_scene/character/character.tscn diff --git a/demo/demo3_scene/character/character_body.gd b/project.gd/demo/demo3_scene/character/character_body.gd similarity index 100% rename from demo/demo3_scene/character/character_body.gd rename to project.gd/demo/demo3_scene/character/character_body.gd diff --git a/project.gd/demo/demo3_scene/character/gobot.glb b/project.gd/demo/demo3_scene/character/gobot.glb new file mode 100644 index 0000000..fc5b9f9 Binary files /dev/null and b/project.gd/demo/demo3_scene/character/gobot.glb differ diff --git a/project.gd/demo/demo3_scene/character/gobot.glb.import b/project.gd/demo/demo3_scene/character/gobot.glb.import new file mode 100644 index 0000000..a21e032 --- /dev/null +++ b/project.gd/demo/demo3_scene/character/gobot.glb.import @@ -0,0 +1,9032 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dne628fr47uug" +path="res://.godot/imported/gobot.glb-d25eb88e1c6f5f9931022d3016641ba9.scn" + +[deps] + +source_file="res://demo/demo3_scene/character/gobot.glb" +dest_files=["res://.godot/imported/gobot.glb-d25eb88e1c6f5f9931022d3016641ba9.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"animations": { +"Fall": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +}, +"Idle": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +}, +"Run": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +}, +"Walk": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +}, +"WallSlide": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +} +} +} +gltf/naming_version=0 +gltf/embedded_image_handling=2 diff --git a/demo/demo3_scene/demo3_scene.tscn b/project.gd/demo/demo3_scene/demo3_scene.tscn similarity index 100% rename from demo/demo3_scene/demo3_scene.tscn rename to project.gd/demo/demo3_scene/demo3_scene.tscn diff --git a/project.gd/demo/demo3_scene/objects/block.tscn b/project.gd/demo/demo3_scene/objects/block.tscn new file mode 100644 index 0000000..d59ad11 --- /dev/null +++ b/project.gd/demo/demo3_scene/objects/block.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=3 uid="uid://cvgq86n7q7to3"] + +[ext_resource type="Material" uid="uid://bjvnw1lxswc7b" path="res://demo/materials/bricks_material.tres" id="1_g8e7g"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_hocnd"] +size = Vector3(2, 1, 2) + +[sub_resource type="BoxMesh" id="BoxMesh_qfwj7"] +material = ExtResource("1_g8e7g") +size = Vector3(2, 1, 2) + +[node name="Block" type="StaticBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +shape = SubResource("BoxShape3D_hocnd") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) +mesh = SubResource("BoxMesh_qfwj7") diff --git a/project.gd/demo/demo3_scene/objects/exit_area.tscn b/project.gd/demo/demo3_scene/objects/exit_area.tscn new file mode 100644 index 0000000..376d614 --- /dev/null +++ b/project.gd/demo/demo3_scene/objects/exit_area.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=5 format=3 uid="uid://x64qu8beayva"] + +[ext_resource type="PackedScene" uid="uid://7tcfuro5b3kx" path="res://addons/tiltfive_tools/objects/scene_switch_area.tscn" id="1_8h4qn"] + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_tmsag"] +radius = 1.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ldp3t"] +transparency = 1 +blend_mode = 1 +shading_mode = 0 +albedo_color = Color(0, 0, 1, 0.247059) + +[sub_resource type="CylinderMesh" id="CylinderMesh_uoo53"] +material = SubResource("StandardMaterial3D_ldp3t") +top_radius = 1.0 +bottom_radius = 1.0 +radial_segments = 32 +rings = 1 +cap_bottom = false + +[node name="ExitArea" instance=ExtResource("1_8h4qn")] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="." index="0"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CylinderShape3D_tmsag") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="." index="1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("CylinderMesh_uoo53") diff --git a/project.gd/demo/demo3_scene/objects/ramp.tscn b/project.gd/demo/demo3_scene/objects/ramp.tscn new file mode 100644 index 0000000..a399ffe --- /dev/null +++ b/project.gd/demo/demo3_scene/objects/ramp.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://c8et2rujvlweg"] + +[ext_resource type="Material" uid="uid://bjvnw1lxswc7b" path="res://demo/materials/bricks_material.tres" id="1_obt2g"] + +[node name="Ramp" type="CSGPolygon3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, 1) +use_collision = true +polygon = PackedVector2Array(0, 0, 2, 0, 2, 1) +depth = 2.0 +material = ExtResource("1_obt2g") diff --git a/project.gd/demo/demo3_scene/objects/wall.tscn b/project.gd/demo/demo3_scene/objects/wall.tscn new file mode 100644 index 0000000..bf1ecb6 --- /dev/null +++ b/project.gd/demo/demo3_scene/objects/wall.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=3 uid="uid://b4xl5ssedv1ki"] + +[ext_resource type="Material" uid="uid://bjvnw1lxswc7b" path="res://demo/materials/bricks_material.tres" id="1_fdryp"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_fpna8"] +size = Vector3(6, 2, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_mihws"] +material = ExtResource("1_fdryp") +size = Vector3(6, 2, 1) + +[node name="Wall" type="StaticBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_fpna8") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_mihws") diff --git a/demo/main.tscn b/project.gd/demo/main.tscn similarity index 100% rename from demo/main.tscn rename to project.gd/demo/main.tscn diff --git a/demo/main_menu/main_menu.tscn b/project.gd/demo/main_menu/main_menu.tscn similarity index 100% rename from demo/main_menu/main_menu.tscn rename to project.gd/demo/main_menu/main_menu.tscn diff --git a/demo/main_menu/main_menu_2d.gd b/project.gd/demo/main_menu/main_menu_2d.gd similarity index 100% rename from demo/main_menu/main_menu_2d.gd rename to project.gd/demo/main_menu/main_menu_2d.gd diff --git a/demo/main_menu/main_menu_2d.tscn b/project.gd/demo/main_menu/main_menu_2d.tscn similarity index 100% rename from demo/main_menu/main_menu_2d.tscn rename to project.gd/demo/main_menu/main_menu_2d.tscn diff --git a/project.gd/demo/materials/border.png b/project.gd/demo/materials/border.png new file mode 100644 index 0000000..3828129 Binary files /dev/null and b/project.gd/demo/materials/border.png differ diff --git a/project.gd/demo/materials/border.png.import b/project.gd/demo/materials/border.png.import new file mode 100644 index 0000000..78ee884 --- /dev/null +++ b/project.gd/demo/materials/border.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crovglpkjvq4f" +path="res://.godot/imported/border.png-151dd966b52654ee745bff42cf857c26.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/materials/border.png" +dest_files=["res://.godot/imported/border.png-151dd966b52654ee745bff42cf857c26.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/project.gd/demo/materials/bricks.jpg b/project.gd/demo/materials/bricks.jpg new file mode 100644 index 0000000..8cb73ae Binary files /dev/null and b/project.gd/demo/materials/bricks.jpg differ diff --git a/project.gd/demo/materials/bricks.jpg.import b/project.gd/demo/materials/bricks.jpg.import new file mode 100644 index 0000000..b8d7380 --- /dev/null +++ b/project.gd/demo/materials/bricks.jpg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://brgpbfcvjlock" +path.s3tc="res://.godot/imported/bricks.jpg-ec70fca49ab9e461fe308f1c7b6f2752.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://demo/materials/bricks.jpg" +dest_files=["res://.godot/imported/bricks.jpg-ec70fca49ab9e461fe308f1c7b6f2752.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/project.gd/demo/materials/bricks_material.tres b/project.gd/demo/materials/bricks_material.tres new file mode 100644 index 0000000..b1d9aa0 --- /dev/null +++ b/project.gd/demo/materials/bricks_material.tres @@ -0,0 +1,10 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://bjvnw1lxswc7b"] + +[ext_resource type="Texture2D" uid="uid://brgpbfcvjlock" path="res://demo/materials/bricks.jpg" id="1_jse6d"] + +[resource] +albedo_texture = ExtResource("1_jse6d") +metallic_specular = 0.0 +uv1_scale = Vector3(0.5, 0.5, 0.5) +uv1_triplanar = true +texture_filter = 5 diff --git a/project.gd/demo/materials/ground.jpg b/project.gd/demo/materials/ground.jpg new file mode 100644 index 0000000..86f2115 Binary files /dev/null and b/project.gd/demo/materials/ground.jpg differ diff --git a/project.gd/demo/materials/ground.jpg.import b/project.gd/demo/materials/ground.jpg.import new file mode 100644 index 0000000..993d1af --- /dev/null +++ b/project.gd/demo/materials/ground.jpg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dt4wx8cns2h1o" +path.s3tc="res://.godot/imported/ground.jpg-29c158d9ad29882704cc1e1ab379ed5a.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://demo/materials/ground.jpg" +dest_files=["res://.godot/imported/ground.jpg-29c158d9ad29882704cc1e1ab379ed5a.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/project.gd/demo/materials/ground_material.tres b/project.gd/demo/materials/ground_material.tres new file mode 100644 index 0000000..560e58c --- /dev/null +++ b/project.gd/demo/materials/ground_material.tres @@ -0,0 +1,10 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://nbp8gi62cwuj"] + +[ext_resource type="Texture2D" uid="uid://dt4wx8cns2h1o" path="res://demo/materials/ground.jpg" id="1_nsgu0"] + +[resource] +albedo_texture = ExtResource("1_nsgu0") +metallic_specular = 0.0 +uv1_scale = Vector3(0.5, 0.5, 0.5) +uv1_triplanar = true +texture_filter = 5 diff --git a/project.gd/demo/materials/lava.jpg b/project.gd/demo/materials/lava.jpg new file mode 100644 index 0000000..53886de Binary files /dev/null and b/project.gd/demo/materials/lava.jpg differ diff --git a/project.gd/demo/materials/lava.jpg.import b/project.gd/demo/materials/lava.jpg.import new file mode 100644 index 0000000..e78ef07 --- /dev/null +++ b/project.gd/demo/materials/lava.jpg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cv1ce55bwsnnw" +path.s3tc="res://.godot/imported/lava.jpg-475ce9d15aff16558ad1e309674bb81e.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://demo/materials/lava.jpg" +dest_files=["res://.godot/imported/lava.jpg-475ce9d15aff16558ad1e309674bb81e.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/project.gd/demo/materials/rock.jpg b/project.gd/demo/materials/rock.jpg new file mode 100644 index 0000000..06c905c Binary files /dev/null and b/project.gd/demo/materials/rock.jpg differ diff --git a/project.gd/demo/materials/rock.jpg.import b/project.gd/demo/materials/rock.jpg.import new file mode 100644 index 0000000..707da93 --- /dev/null +++ b/project.gd/demo/materials/rock.jpg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://j48g8a7m4tpi" +path.s3tc="res://.godot/imported/rock.jpg-11d91a61b40461195cb1c22abe06a21d.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://demo/materials/rock.jpg" +dest_files=["res://.godot/imported/rock.jpg-11d91a61b40461195cb1c22abe06a21d.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/project.gd/demo/materials/rock_triplanar.tres b/project.gd/demo/materials/rock_triplanar.tres new file mode 100644 index 0000000..edb685a --- /dev/null +++ b/project.gd/demo/materials/rock_triplanar.tres @@ -0,0 +1,8 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dgutg2a2y5i1u"] + +[ext_resource type="Texture2D" uid="uid://j48g8a7m4tpi" path="res://demo/materials/rock.jpg" id="1_xvav2"] + +[resource] +albedo_texture = ExtResource("1_xvav2") +metallic_specular = 0.0 +uv1_triplanar = true diff --git a/demo/player/player.tscn b/project.gd/demo/player/player.tscn similarity index 100% rename from demo/player/player.tscn rename to project.gd/demo/player/player.tscn diff --git a/demo/player/popup_menu.gd b/project.gd/demo/player/popup_menu.gd similarity index 100% rename from demo/player/popup_menu.gd rename to project.gd/demo/player/popup_menu.gd diff --git a/demo/player/popup_menu.tscn b/project.gd/demo/player/popup_menu.tscn similarity index 100% rename from demo/player/popup_menu.tscn rename to project.gd/demo/player/popup_menu.tscn diff --git a/project.gd/demo/sounds/explosion.wav b/project.gd/demo/sounds/explosion.wav new file mode 100644 index 0000000..3f67da4 Binary files /dev/null and b/project.gd/demo/sounds/explosion.wav differ diff --git a/project.gd/demo/sounds/explosion.wav.import b/project.gd/demo/sounds/explosion.wav.import new file mode 100644 index 0000000..2a9cedb --- /dev/null +++ b/project.gd/demo/sounds/explosion.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c7hk1w0n7ywmd" +path="res://.godot/imported/explosion.wav-2dbf762bfdb88cadc0fca7da932fcfc0.sample" + +[deps] + +source_file="res://demo/sounds/explosion.wav" +dest_files=["res://.godot/imported/explosion.wav-2dbf762bfdb88cadc0fca7da932fcfc0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/project.gd/demo/sounds/hit.wav b/project.gd/demo/sounds/hit.wav new file mode 100644 index 0000000..be2e091 Binary files /dev/null and b/project.gd/demo/sounds/hit.wav differ diff --git a/project.gd/demo/sounds/hit.wav.import b/project.gd/demo/sounds/hit.wav.import new file mode 100644 index 0000000..d8d8afb --- /dev/null +++ b/project.gd/demo/sounds/hit.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b4vru7iyf8k8j" +path="res://.godot/imported/hit.wav-9b3442ab956c9bebe3ff2700d5f468ab.sample" + +[deps] + +source_file="res://demo/sounds/hit.wav" +dest_files=["res://.godot/imported/hit.wav-9b3442ab956c9bebe3ff2700d5f468ab.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/project.gd/demo/sounds/rolling.wav b/project.gd/demo/sounds/rolling.wav new file mode 100644 index 0000000..4224a05 Binary files /dev/null and b/project.gd/demo/sounds/rolling.wav differ diff --git a/project.gd/demo/sounds/rolling.wav.import b/project.gd/demo/sounds/rolling.wav.import new file mode 100644 index 0000000..c133f8e --- /dev/null +++ b/project.gd/demo/sounds/rolling.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://saisv7mndt3c" +path="res://.godot/imported/rolling.wav-d9daf9a9d657e3c61536a9732a5dc5a5.sample" + +[deps] + +source_file="res://demo/sounds/rolling.wav" +dest_files=["res://.godot/imported/rolling.wav-d9daf9a9d657e3c61536a9732a5dc5a5.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/project.gd/icon.png b/project.gd/icon.png new file mode 100644 index 0000000..8eb0859 Binary files /dev/null and b/project.gd/icon.png differ diff --git a/project.gd/icon.png.import b/project.gd/icon.png.import new file mode 100644 index 0000000..fb9ba01 --- /dev/null +++ b/project.gd/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btverk4mx7sii" +path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.png" +dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/project.godot b/project.gd/project.godot similarity index 100% rename from project.godot rename to project.gd/project.godot