From de61fd395996c1583c94c6d1e82153991274a2d1 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 17 Nov 2024 11:52:14 +0100 Subject: [PATCH 01/38] implement retarders --- Mapify/Components/Retarder.cs | 47 +++++++++++++++++++ .../SceneInitializers/Railway/TrackSetup.cs | 15 ++++++ MapifyEditor/Trackage/Track.cs | 8 ++++ 3 files changed, 70 insertions(+) create mode 100644 Mapify/Components/Retarder.cs diff --git a/Mapify/Components/Retarder.cs b/Mapify/Components/Retarder.cs new file mode 100644 index 00000000..0a33b0cd --- /dev/null +++ b/Mapify/Components/Retarder.cs @@ -0,0 +1,47 @@ +using System.Linq; +using UnityEngine; + +namespace Mapify.Components +{ + public class Retarder: MonoBehaviour + { + private float maxSpeed; // meter per second + private RailTrack railTrack; + private float brakeForce; //Newton + + private bool hasBeenSetup = false; + + public void Setup(float maxSpeed_, RailTrack railTrack_, float brakeForce_) + { + maxSpeed = maxSpeed_; + railTrack = railTrack_; + brakeForce = brakeForce_; + + hasBeenSetup = true; + } + + private void Awake() + { + if (!hasBeenSetup) + { + Mapify.LogError($"{nameof(Retarder)} on {gameObject.name} has not been setup yet"); + Destroy(this); + } + } + + private void FixedUpdate() + { + foreach (var car in railTrack.onTrackBogies.Select(bogie => bogie._car)) + { + if(car.GetAbsSpeed() <= maxSpeed) { return; } + + var forwardSpeed = car.GetForwardSpeed(); + var force3D = car.transform.forward * (-brakeForce * Mathf.Sign(forwardSpeed)); + car.rb.AddForce(force3D); + + Mapify.LogDebugExtreme(() => $"{nameof(Retarder)} force {force3D}"); + Mapify.LogDebugExtreme(() => $"{nameof(Retarder)} forwardSpeed {forwardSpeed}"); + } + } + } +} diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index ad8dd746..188f9f8f 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.Linq; +using Mapify.Components; using Mapify.Editor; +using Mapify.Patches; using Mapify.Utils; using UnityEngine; @@ -40,9 +42,21 @@ private static void CreateRailTracks(IEnumerable tracks) railTrack.dontChange = false; railTrack.age = (int)track.age; railTrack.ApplyRailType(); + + if (!track.isRetarder) continue; + CreateRetarder(track, railTrack); } } + private static void CreateRetarder(Track track, RailTrack railTrack) + { + Mapify.LogDebug(() => $"{nameof(CreateRetarder)}: adding {nameof(Retarder)} on track {track.name}"); + var retarder = track.gameObject.AddComponent(); + //convert to meter per second + var retarderMaxSpeedMS = track.retarderMaxSpeedKMH / 3.6f; + retarder.Setup(retarderMaxSpeedMS, railTrack, track.retarderBrakeForce); + } + private static void CreateJunctions() { foreach (Switch sw in Object.FindObjectsOfType()) @@ -56,6 +70,7 @@ private static void CreateJunctions() foreach (Transform child in prefabCloneTransform) child.transform.position += offset; prefabCloneTransform.SetPositionAndRotation(swTransform.position, swTransform.rotation); + Junction junction = inJunction.GetComponent(); junction.selectedBranch = sw.IsLeft ? sw.defaultState == Switch.StandSide.THROUGH diff --git a/MapifyEditor/Trackage/Track.cs b/MapifyEditor/Trackage/Track.cs index 7cf715d6..06aa69b8 100644 --- a/MapifyEditor/Trackage/Track.cs +++ b/MapifyEditor/Trackage/Track.cs @@ -3,6 +3,7 @@ using Mapify.Editor.Utils; using UnityEditor; using UnityEngine; +using UnityEngine.Serialization; namespace Mapify.Editor { @@ -44,6 +45,13 @@ public class Track : MonoBehaviour [Tooltip("The purpose of this track")] public TrackType trackType; + [Tooltip("A retarder is a device used to reduce the speed of freight cars")] + public bool isRetarder; + [Tooltip("The retarder will activate when the speed of the car is above this limit (km/h)")] + public float retarderMaxSpeedKMH = 10.0f; + [Tooltip("The maximum brake force of the retarder, in Newtons")] + public float retarderBrakeForce = 50000f; + #if UNITY_EDITOR [Header("Editor Visualization")] [SerializeField] From 316d11b39e9a174424db170a2afc52d657d2264a Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:14:59 +0100 Subject: [PATCH 02/38] hump yard automatic switches --- Mapify/Components/SwitchController.cs | 128 ++++++++++++++++ Mapify/Mapify.cs | 10 ++ Mapify/Mapify.csproj | 7 +- .../SceneInitializers/Railway/TrackSetup.cs | 7 +- Mapify/Utils/Extensions.cs | 16 ++ Mapify/Utils/PathFinder.cs | 139 ++++++++++++++++++ Mapify/Utils/RailTrackExtensions.cs | 71 +++++++++ MapifyEditor/Trackage/SwitchControllerPls.cs | 11 ++ 8 files changed, 386 insertions(+), 3 deletions(-) create mode 100644 Mapify/Components/SwitchController.cs create mode 100644 Mapify/Utils/PathFinder.cs create mode 100644 Mapify/Utils/RailTrackExtensions.cs create mode 100644 MapifyEditor/Trackage/SwitchControllerPls.cs diff --git a/Mapify/Components/SwitchController.cs b/Mapify/Components/SwitchController.cs new file mode 100644 index 00000000..372d586e --- /dev/null +++ b/Mapify/Components/SwitchController.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management.Instrumentation; +using System.Runtime.InteropServices; +using Mapify.Editor; +using Mapify.Utils; +using UnityEngine; + +namespace Mapify.Components +{ + public class SwitchController: MonoBehaviour + { + // public Track DetectorTrack; + private Junction rootJunction; + + private bool hasBeenSetup = false; + + public void Setup(Junction junction) + { + // DetectorTrack = detectorTrack; + rootJunction = junction; + + hasBeenSetup = true; + } + + private void Start() + { + if (!hasBeenSetup) + { + Mapify.LogError($"{nameof(SwitchController)} on {gameObject.name} has not been setup yet"); + Destroy(this); + } + } + + private void Update() + { + int track = -1; + + if (Input.GetKeyDown(KeyCode.Keypad1)) + { + track = 1; + } + if (Input.GetKeyDown(KeyCode.Keypad2)) + { + track = 2; + } + if (Input.GetKeyDown(KeyCode.Keypad3)) + { + track = 3; + } + if (Input.GetKeyDown(KeyCode.Keypad4)) + { + track = 4; + } + + if (track == -1) { return; } + + SetSwitches((byte)track); + } + + // set the switches, so that they form a path to trackNumber + private void SetSwitches(byte trackNumber) + { + //TODO + var stationID = "station"; + var yardID = "B"; + + var goal = RailTrackRegistry.Instance.GetRailTrack(stationID, yardID, trackNumber); + + if (goal == null) + { + Mapify.LogError($"{nameof(SetSwitches)}: could not find track {stationID}/{yardID}/{trackNumber}"); + return; + } + + var start = rootJunction.inBranch.track; + var path = PathFinder.FindPath(start, goal); + + if (!path.Any()) + { + Mapify.LogError($"{nameof(SetSwitches)}: could not find path from {start.name} to {goal.name}"); + return; + } + + Mapify.LogDebug($"{nameof(SetSwitches)}: path:"); + for (var index = 1; index < path.Count; index++) + { + var track = path[index]; + Mapify.LogDebug($"{track.name}"); + + //if the track has an inJunction, it is a switch + if (track.inJunction == null) continue; + + var previousTrack = path[index - 1]; + + var outBranches = track.inJunction.outBranches; + var outBranchNumber = GetBranchForTrack(outBranches, previousTrack); + + if(track.inJunction.selectedBranch == outBranchNumber){ continue; } + + track.inJunction.SwitchTo(outBranchNumber, Junction.SwitchMode.REGULAR); + } + } + + /// Returns the index of the branch that connects to the track + private int GetBranchForTrack(List outBranches, RailTrack track) + { + for (int branchIndex = 0; branchIndex < outBranches.Count; branchIndex++) + { + if (outBranches[branchIndex].track.outBranch.track == track) + { + return branchIndex; + } + } + + Mapify.LogError($"{nameof(GetBranchForTrack)}: track {track} was not found in outBranches"); + + Mapify.LogDebug("outbranch tracks:"); + foreach (var branch in outBranches) + { + Mapify.LogDebug(branch.track.outBranch.track.name); + } + + return 0; + } + } +} diff --git a/Mapify/Mapify.cs b/Mapify/Mapify.cs index 068ddac3..5b3fd9c7 100644 --- a/Mapify/Mapify.cs +++ b/Mapify/Mapify.cs @@ -57,12 +57,22 @@ private static void Patch() #region Logging + public static void LogDebugExtreme(object msg) + { + LogDebugExtreme(() => msg); + } + public static void LogDebugExtreme(Func resolver) { if (Settings.ExtremelyVerboseLogging) LogDebug(resolver); } + public static void LogDebug(object msg) + { + LogDebug(() => msg); + } + public static void LogDebug(Func resolver) { if (Settings.VerboseLogging) diff --git a/Mapify/Mapify.csproj b/Mapify/Mapify.csproj index 350321be..125ba6a8 100644 --- a/Mapify/Mapify.csproj +++ b/Mapify/Mapify.csproj @@ -12,7 +12,7 @@ - + @@ -36,10 +36,11 @@ - + + @@ -62,6 +63,7 @@ + @@ -71,6 +73,7 @@ + diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 188f9f8f..178e5859 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -2,7 +2,6 @@ using System.Linq; using Mapify.Components; using Mapify.Editor; -using Mapify.Patches; using Mapify.Utils; using UnityEngine; @@ -82,6 +81,12 @@ private static void CreateJunctions() foreach (Junction.Branch branch in junction.outBranches) branch.track.generateColliders = true; prefabClone.SetActive(true); + + if (sw.TryGetComponent(typeof(SwitchControllerPls), out Component scp)) + { + var sc = prefabClone.AddComponent(); + sc.Setup(junction); + } } } diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 4e7a1edd..1b136844 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; using CommandTerminal; using DV.JObjectExtstensions; using DV.PointSet; @@ -218,6 +219,21 @@ public static void SetBasicMapInfo(this SaveGameData saveGameData, BasicMapInfo saveGameData.SetJObject(SAVE_KEY_NAME, JObject.FromObject(basicMapInfo)); } + public static RailTrack GetRailTrack(this RailTrackRegistry registry, string stationID, string yardID, byte trackNumber) + { + var query = $"[{stationID}]_[{yardID}-{trackNumber:D2}"; + + return registry.AllTracks.FirstOrDefault(track => track.name.Contains(query)); + } + + public static void SwitchTo(this Junction junction, int branchNumber, Junction.SwitchMode switchMode) + { + Mapify.LogDebug($"junction {junction.name} switch to {branchNumber}"); + + junction.selectedBranch = branchNumber - 1; + junction.Switch(switchMode); + } + #endregion #region Mapify diff --git a/Mapify/Utils/PathFinder.cs b/Mapify/Utils/PathFinder.cs new file mode 100644 index 00000000..7078a1bd --- /dev/null +++ b/Mapify/Utils/PathFinder.cs @@ -0,0 +1,139 @@ +using System.Collections.Generic; +using System.Linq; +using Priority_Queue; +// using UnityAsync; + +// Source, by WallyCZ: +// https://github.com/WallyCZ/DVRouteManager/blob/master/DVRouteManager/PathFinder.cs + +namespace Mapify.Utils +{ + public static class PathFinder + { + // Heuristic that computes approximate distance between two rails + private static float Heuristic(RailTrack a, RailTrack b) + { + return (a.transform.position - b.transform.position).sqrMagnitude; //we don't need exact distance because that result is used only as a priority + } + + public struct JunctionSetting + { + public Junction junction; + public int outBranchNr; + } + + private class RailTrackNode : GenericPriorityQueueNode + { + public RailTrack track; + + public RailTrackNode(RailTrack track) + { + this.track = track; + } + } + + // Return a List of Locations representing the found path + public static List FindPath(RailTrack start, RailTrack goal) + { + var path = new List(); + var cameFrom = Astar(start, goal); + + var current = goal; + + // travel backwards through the path + while (!current.Equals(start)) + { + if (!cameFrom.ContainsKey(current)) + { + Mapify.LogError($"cameFrom does not contain current {current.logicTrack.ID.FullID}"); + return null; + } + + path.Add(current); + current = cameFrom[current]; + } + + if (path.Count > 0) + { + path.Add(start); + } + + return path; + } + + /// + /// A* search + /// + private static Dictionary Astar(RailTrack start, RailTrack goal) + { + var cameFrom = new Dictionary(); + var costSoFar = new Dictionary(); + + var queue = new GenericPriorityQueue(10000); + queue.Enqueue(new RailTrackNode(start), 0.0); + + cameFrom.Add(start, start); + costSoFar.Add(start, 0.0); + + while (queue.Count > 0) + { + var current = queue.Dequeue().track; + + cameFrom.TryGetValue(current, out var prev); + + var debug = $"ID: {current.logicTrack.ID.FullID} Prev: {prev?.logicTrack.ID.FullID}"; + + var neighbors = new List(); + + if (current.outIsConnected) + { + neighbors.AddRange(current.GetAllOutBranches().Select(b => b.track)); + } + + if (current.inIsConnected) + { + neighbors.AddRange(current.GetAllInBranches().Select(b => b.track)); + } + + // var branches = DumpNodes(neighbors, current); + // debug += "\n" + $"all branches: {branches}"; + + Mapify.LogDebugExtreme(debug); + + foreach (var neighbor in neighbors) + { + //if we could go through junction directly (without reversing) + if (!current.CanGoToDirectly(prev, neighbor)) + { + Mapify.LogDebugExtreme($"{neighbor.logicTrack.ID.FullID} reverse needed"); + continue; + } + + // compute exact cost + var newCost = costSoFar[current] + neighbor.logicTrack.length; + +// If there's no cost assigned to the neighbor yet, or if the new +// cost is lower than the assigned one, add newCost for this neighbor + if (costSoFar.ContainsKey(neighbor) && !(newCost < costSoFar[neighbor])) continue; + + // If we're replacing the previous cost, remove it + if (costSoFar.ContainsKey(neighbor)) + { + costSoFar.Remove(neighbor); + cameFrom.Remove(neighbor); + } + + Mapify.LogDebugExtreme($"neighbor {neighbor.logicTrack.ID.FullID} update {newCost}"); + + costSoFar.Add(neighbor, newCost); + cameFrom.Add(neighbor, current); + var priority = newCost + Heuristic(neighbor, goal) + / 20.0f; //convert distance to time (t = s / v) + queue.Enqueue(new RailTrackNode(neighbor), priority); + } + } + + return cameFrom; + } + } +} diff --git a/Mapify/Utils/RailTrackExtensions.cs b/Mapify/Utils/RailTrackExtensions.cs new file mode 100644 index 00000000..d6c4cc65 --- /dev/null +++ b/Mapify/Utils/RailTrackExtensions.cs @@ -0,0 +1,71 @@ +using System.Linq; + +namespace Mapify.Utils +{ + // Source, by WallyCZ: + // https://github.com/WallyCZ/DVRouteManager/blob/master/DVRouteManager/PathFinder.cs + + public static class RailTrackExtensions + { + /// + /// If we can go through junction without reversing + /// + private static bool CanGoThroughJunctionDirectly(this RailTrack current, Junction junction, RailTrack from, RailTrack to) + { + var fromIsOutBranch = junction != null && junction.outBranches.Any(b => b.track == from); + + if (fromIsOutBranch) + { + return false; + } + + var currentIsOutBranch = junction != null && junction.outBranches.Any(b => b.track == current); + + if (currentIsOutBranch) + { + return junction.inBranch.track == to; + } + + return true; + } + + public static bool CanGoToDirectly(this RailTrack current, RailTrack from, RailTrack to) + { + Junction reversingJunction; + return CanGoToDirectly(current, from, to, out reversingJunction); + } + + public static bool CanGoToDirectly(this RailTrack current, RailTrack from, RailTrack to, out Junction reversingJunction) + { + reversingJunction = null; + + var isInJuction = current.inIsConnected && current.GetAllInBranches().Any(b => b.track == to); + var isOutJuction = current.outIsConnected && current.GetAllOutBranches().Any(b => b.track == to); + + if (current.inIsConnected) + { + if (isInJuction && CanGoThroughJunctionDirectly(current, current.inJunction, from, to)) + return true; + } + + if (current.outIsConnected) + { + if (isOutJuction && CanGoThroughJunctionDirectly(current, current.outJunction, from, to)) + return true; + + } + + if (isInJuction) + { + reversingJunction = current.inJunction; + } + + if (isOutJuction) + { + reversingJunction = current.outJunction; + } + + return false; + } + } +} diff --git a/MapifyEditor/Trackage/SwitchControllerPls.cs b/MapifyEditor/Trackage/SwitchControllerPls.cs new file mode 100644 index 00000000..78c41471 --- /dev/null +++ b/MapifyEditor/Trackage/SwitchControllerPls.cs @@ -0,0 +1,11 @@ +using UnityEngine; + +namespace Mapify.Editor +{ + public class SwitchControllerPls: MonoBehaviour + { + //TODO validate has component + public Switch RootSwitch; + public Track DetectorTrack; + } +} From f88cbc97bf2eb58cb0d39d9360ecbab2da35fc01 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:24:52 +0100 Subject: [PATCH 03/38] [Track tools] add option to disable track previews --- .../TrackToolsWindowDrawing/CreatePreviews.cs | 2 ++ MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs | 14 +++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs index 42e2c4b8..d632c10d 100644 --- a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs +++ b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs @@ -23,6 +23,8 @@ private void CreatePiecePreviews() return; } + if (!_drawTrackPreviews) { return; } + if (_drawNewPreview) { AttachPoint ap = new AttachPoint( diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs index c3b3832f..9c63a4c3 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs @@ -17,6 +17,7 @@ public partial class TrackToolsWindow // Settings. private bool _showSettings = false; + private bool _drawTrackPreviews = true; private bool _drawNewPreview = true; private bool _performanceMode = false; private bool _zTestTrack = true; @@ -87,9 +88,16 @@ private void DrawSettingsFoldout() { EditorGUI.indentLevel++; - _drawNewPreview = EditorGUILayout.Toggle( - new GUIContent("New track preview", "Show or hide the new track preview"), - _drawNewPreview); + _drawTrackPreviews = EditorGUILayout.Toggle( + new GUIContent("Track previews", "Show or hide the track previews"), + _drawTrackPreviews); + + if (_drawTrackPreviews) + { + _drawNewPreview = EditorGUILayout.Toggle( + new GUIContent("New track preview", "Show or hide the new track preview"), + _drawNewPreview); + } _performanceMode = EditorGUILayout.Toggle( new GUIContent("Performance mode", "Reduces redraw frequency"), From f24c67d33d26d234ac0b96d118234de2b4a2c0a3 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 19 Nov 2024 15:08:10 +0100 Subject: [PATCH 04/38] Implemented custom switches --- .../SceneInitializers/Railway/TrackSetup.cs | 137 ++++++++++++++++-- Mapify/Utils/Extensions.cs | 44 ++++++ .../Validators/Railway/SwitchValidator.cs | 17 ++- MapifyEditor/Trackage/CustomSwitch.cs | 19 +++ MapifyEditor/Trackage/Switch.cs | 60 +------- MapifyEditor/Trackage/SwitchBase.cs | 57 ++++++++ MapifyEditor/Trackage/Track.cs | 6 +- 7 files changed, 258 insertions(+), 82 deletions(-) create mode 100644 MapifyEditor/Trackage/CustomSwitch.cs create mode 100644 MapifyEditor/Trackage/SwitchBase.cs diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 178e5859..6a1bf899 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -2,6 +2,7 @@ using System.Linq; using Mapify.Components; using Mapify.Editor; +using Mapify.Editor.Utils; using Mapify.Utils; using UnityEngine; @@ -10,12 +11,14 @@ namespace Mapify.SceneInitializers.Railway [SceneSetupPriority(int.MinValue)] public class TrackSetup : SceneSetup { + private const string IN_JUNCTION_NAME = "in_junction"; + public override void Run() { Track[] tracks = Object.FindObjectsOfType().Where(t => !t.IsSwitch).ToArray(); Mapify.LogDebug(() => "Creating RailTracks"); - CreateRailTracks(tracks); + CreateRailTracks(tracks, false); Mapify.LogDebug(() => "Creating Junctions"); CreateJunctions(); @@ -29,22 +32,28 @@ public override void Run() RailManager.TestConnections(); } - private static void CreateRailTracks(IEnumerable tracks) + private static List CreateRailTracks(IEnumerable tracks, bool setActive) { - foreach (Track track in tracks) + return tracks.Select(track => CreateRailTrack(track, setActive)).ToList(); + } + + private static RailTrack CreateRailTrack(Track track, bool setActive) + { + track.gameObject.SetActive(setActive); + if (!track.IsSwitch && !track.IsTurntable) + track.name = track.LogicName; + var railTrack = track.gameObject.AddComponent(); + railTrack.generateColliders = !track.IsTurntable; + railTrack.dontChange = false; + railTrack.age = (int)track.age; + railTrack.ApplyRailType(); + + if (track.isRetarder) { - track.gameObject.SetActive(false); - if (!track.IsSwitch && !track.IsTurntable) - track.name = track.LogicName; - RailTrack railTrack = track.gameObject.AddComponent(); - railTrack.generateColliders = !track.IsTurntable; - railTrack.dontChange = false; - railTrack.age = (int)track.age; - railTrack.ApplyRailType(); - - if (!track.isRetarder) continue; CreateRetarder(track, railTrack); } + + return railTrack; } private static void CreateRetarder(Track track, RailTrack railTrack) @@ -57,6 +66,105 @@ private static void CreateRetarder(Track track, RailTrack railTrack) } private static void CreateJunctions() + { + CreateCustomSwitches(); + CreateVanillaSwitches(); + } + + private static void CreateCustomSwitches() + { + foreach (var customSwitch in Object.FindObjectsOfType()) + { + CreateCustomSwitch(customSwitch); + } + } + + private static void CreateCustomSwitch(CustomSwitch customSwitch) + { + var vanillaAsset = customSwitch.standSide == CustomSwitch.StandSide.LEFT ? VanillaAsset.SwitchLeft : VanillaAsset.SwitchRight; + + var prefabClone = AssetCopier.Instantiate(vanillaAsset); + prefabClone.transform.SetPositionAndRotation(customSwitch.transform.position, customSwitch.transform.rotation); + + //Junction + var inJunction = prefabClone.GetComponentInChildren(); + inJunction.selectedBranch = customSwitch.defaultBranch; + + DestroyPrefabTracks(prefabClone); + CreateNewTracks(customSwitch, prefabClone, inJunction); + SetupGraphical(prefabClone); + } + + private static void DestroyPrefabTracks(GameObject prefabClone) + { + // must be destroyed inmediately to prevent: + // "Junction 'in_junction' doesn't have track '[track diverging]' assigned" + // from RailManager.TestConnections + Object.DestroyImmediate(prefabClone.FindChildByName("[track through]")); + Object.DestroyImmediate(prefabClone.FindChildByName("[track diverging]")); + } + + private static void CreateNewTracks(CustomSwitch customSwitch, GameObject prefabClone, Junction switchJunction) + { + var railTracksInSwitch = CreateRailTracks( + customSwitch.gameObject + .GetComponentsInChildren(), true + ); + + railTracksInSwitch = railTracksInSwitch + .OrderBy(track => track.gameObject.name) + .ToList(); + + if (!railTracksInSwitch.Any()) + { + Mapify.LogError($"{nameof(CreateCustomSwitches)}: {nameof(railTracksInSwitch)} is empty"); + return; + } + + switchJunction.outBranches = new List(); + + foreach (var t in railTracksInSwitch) + { + t.transform.SetParent(prefabClone.transform, true); + + t.inBranch = new Junction.Branch(); + t.inBranch.track = null; + t.inJunction = switchJunction; + + switchJunction.outBranches.Add(new Junction.Branch(t, true)); + } + + //track before the switch + switchJunction.inBranch = switchJunction.FindClosestBranch(railTracksInSwitch[0].curve[0].transform.position); + + //connect the track before the switch to the switch + if (switchJunction.inBranch.first) + { + switchJunction.inBranch.track.inJunction = switchJunction; + } + else + { + switchJunction.inBranch.track.outJunction = switchJunction; + } + + if (switchJunction.inBranch == null) + { + Mapify.LogError($"{nameof(CreateNewTracks)}: inBranch is null"); + } + } + + private static void SetupGraphical(GameObject prefabClone) + { + var graphical = prefabClone.FindChildByName("Graphical"); + string[] toDelete = {"ballast", "anchors", "sleepers", "rails_static", "rails_moving"}; + foreach (var child in graphical.transform.GetChildren()) + { + if (!toDelete.Contains(child.name)) continue; + Object.Destroy(child.gameObject); + } + } + + private static void CreateVanillaSwitches() { foreach (Switch sw in Object.FindObjectsOfType()) { @@ -64,7 +172,7 @@ private static void CreateJunctions() VanillaAsset vanillaAsset = sw.GetComponent().asset; GameObject prefabClone = AssetCopier.Instantiate(vanillaAsset, false); Transform prefabCloneTransform = prefabClone.transform; - Transform inJunction = prefabCloneTransform.Find("in_junction"); + Transform inJunction = prefabCloneTransform.Find(IN_JUNCTION_NAME); Vector3 offset = prefabCloneTransform.position - inJunction.position; foreach (Transform child in prefabCloneTransform) child.transform.position += offset; @@ -82,6 +190,7 @@ private static void CreateJunctions() branch.track.generateColliders = true; prefabClone.SetActive(true); + //TODO add this to CustomSwitch too? if (sw.TryGetComponent(typeof(SwitchControllerPls), out Component scp)) { var sc = prefabClone.AddComponent(); diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 1b136844..49c7e0d5 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -13,6 +13,7 @@ using Mapify.Map; using Newtonsoft.Json.Linq; using UnityEngine; +using Object = UnityEngine.Object; namespace Mapify.Utils { @@ -234,6 +235,49 @@ public static void SwitchTo(this Junction junction, int branchNumber, Junction.S junction.Switch(switchMode); } + public static Junction.Branch FindClosestBranch(this Junction junction, Vector3 fromPoint, float maxRange = 5f) + { + var closestDistance = float.PositiveInfinity; + + RailTrack track = null; + var first = false; + + foreach (var foundTrack in Resources.FindObjectsOfTypeAll()) + { + // skip the tracks in the junction + if(junction.outBranches.Any(branch => branch.track == foundTrack)) continue; + + if (!foundTrack.curve || foundTrack.curve.pointCount < 2) continue; + + var firstPoint = foundTrack.curve[0]; + + var distanceToFirst = Vector3.SqrMagnitude(fromPoint - firstPoint.position); + if (distanceToFirst < maxRange * (double) maxRange && distanceToFirst < (double) closestDistance) + { + closestDistance = distanceToFirst; + track = foundTrack; + first = true; + } + + var lastPoint = foundTrack.curve.Last(); + var distanceToLast = Vector3.SqrMagnitude(fromPoint - lastPoint.position); + if (distanceToLast < maxRange * (double) maxRange && distanceToLast < (double) closestDistance) + { + closestDistance = distanceToLast; + track = foundTrack; + first = false; + } + } + + if (track == null) + { + Mapify.LogError($"Failed to find closest branch for {junction.name}"); + return null; + } + + return new Junction.Branch(track, first); + } + #endregion #region Mapify diff --git a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs index bfd52493..f1efe9c6 100644 --- a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs @@ -10,14 +10,17 @@ public class SwitchValidator : Validator { protected override IEnumerator Validate(Scenes scenes) { - foreach (Switch sw in scenes.railwayScene.GetAllComponents()) + foreach (var switch_ in scenes.railwayScene.GetAllComponents()) { - Track divergingTrack = sw.DivergingTrack; - Track throughTrack = sw.ThroughTrack; - divergingTrack.Snap(); - throughTrack.Snap(); - if (!divergingTrack.isInSnapped || !divergingTrack.isOutSnapped || !throughTrack.isInSnapped || !throughTrack.isOutSnapped) - yield return Result.Error("Switches must have a track attached to all points", sw); + foreach (var track in switch_.GetComponentsInChildren()) + { + track.Snap(); + + if (track.isInSnapped && track.isOutSnapped) continue; + + yield return Result.Error("Switches must have a track attached to all points", switch_); + break; + } } } } diff --git a/MapifyEditor/Trackage/CustomSwitch.cs b/MapifyEditor/Trackage/CustomSwitch.cs new file mode 100644 index 00000000..91c22e9c --- /dev/null +++ b/MapifyEditor/Trackage/CustomSwitch.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +namespace Mapify.Editor +{ + public class CustomSwitch: SwitchBase + { + public enum StandSide + { + LEFT, + RIGHT + } + + [Tooltip("Which way the switch should be flipped by default")] + public int defaultBranch = 0; + + [Tooltip("Which side of the switch the stand will appear on")] + public StandSide standSide; + } +} diff --git a/MapifyEditor/Trackage/Switch.cs b/MapifyEditor/Trackage/Switch.cs index 7dce3ff0..752ee456 100644 --- a/MapifyEditor/Trackage/Switch.cs +++ b/MapifyEditor/Trackage/Switch.cs @@ -10,7 +10,7 @@ namespace Mapify.Editor { [RequireComponent(typeof(VanillaObject))] - public class Switch : MonoBehaviour + public class Switch : SwitchBase { public enum StandSide { @@ -20,68 +20,12 @@ public enum StandSide [Tooltip("Which side of the switch the stand will appear on")] public StandSide standSide; + [Tooltip("Which way the switch should be flipped by default")] public StandSide defaultState; public Track ThroughTrack => transform.Find("[track through]").GetComponent(); public Track DivergingTrack => transform.Find("[track diverging]").GetComponent(); public bool IsLeft => DivergingTrack.Curve.Last().localPosition.x < 0; - - private void OnDrawGizmos() - { - if (transform.DistToSceneCamera() >= Track.SNAP_UPDATE_RANGE_SQR) - return; - Snap(); - } - - public void Snap() - { -#if UNITY_EDITOR - BezierPoint[] bezierPoints = FindObjectsOfType(); - GameObject[] selectedObjects = Selection.gameObjects; - bool isSelected = selectedObjects.Contains(gameObject); - TrySnap(bezierPoints, isSelected, 0); - TrySnap(bezierPoints, isSelected, 1); - TrySnap(bezierPoints, isSelected, 2); -#endif - } - - private void TrySnap(IEnumerable points, bool move, byte which) - { - Transform reference; - switch (which) - { - case 0: - reference = transform; - break; - case 1: - reference = DivergingTrack.Curve.Last().transform; - break; - case 2: - reference = ThroughTrack.Curve.Last().transform; - break; - default: - throw new ArgumentOutOfRangeException(nameof(which)); - } - - Vector3 pos = reference.position; - Vector3 closestPos = Vector3.zero; - float closestDist = float.MaxValue; - foreach (BezierPoint otherBP in points) - { - if (otherBP.Curve().GetComponentInParent() == this) continue; - Vector3 otherPos = otherBP.transform.position; - float dist = Mathf.Abs(Vector3.Distance(otherPos, pos)); - if (dist > Track.SNAP_RANGE || dist >= closestDist) continue; - if (otherBP.GetComponentInParent().IsSwitch) continue; - closestPos = otherPos; - closestDist = dist; - } - - if (closestDist >= float.MaxValue) return; - - if (move) - transform.position = closestPos + (transform.position - reference.position); - } } } diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs new file mode 100644 index 00000000..ee28afc3 --- /dev/null +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using System.Linq; +using Mapify.Editor.Utils; +using UnityEditor; +using UnityEngine; + +namespace Mapify.Editor +{ + public abstract class SwitchBase: MonoBehaviour + { + public Track[] Tracks => gameObject.GetComponentsInChildren(); + + protected void Snap() + { +#if UNITY_EDITOR + BezierPoint[] bezierPoints = FindObjectsOfType(); + GameObject[] selectedObjects = Selection.gameObjects; + bool isSelected = selectedObjects.Contains(gameObject); + + TrySnap(bezierPoints, isSelected, transform); + foreach (var track in Tracks) + { + TrySnap(bezierPoints, isSelected, track.Curve.Last().transform); + } +#endif + } + + private void TrySnap(IEnumerable points, bool move, Transform reference) + { + var referencePosition = reference.position; + var closestPos = Vector3.zero; + var closestDist = float.MaxValue; + + foreach (var otherPoint in points) + { + if (otherPoint.Curve().GetComponentInParent() == this) continue; + + var otherPosition = otherPoint.transform.position; + var dist = Mathf.Abs(Vector3.Distance(otherPosition, referencePosition)); + + if (dist > Track.SNAP_RANGE || dist >= closestDist) continue; + + var aTrack = otherPoint.GetComponentInParent(); + if (aTrack.IsSwitch) continue; + + closestPos = otherPosition; + closestDist = dist; + } + + if (closestDist >= float.MaxValue) return; + + if (move) { + transform.position = closestPos + (transform.position - reference.position); + } + } + } +} diff --git a/MapifyEditor/Trackage/Track.cs b/MapifyEditor/Trackage/Track.cs index 06aa69b8..bafe354d 100644 --- a/MapifyEditor/Trackage/Track.cs +++ b/MapifyEditor/Trackage/Track.cs @@ -69,12 +69,12 @@ public BezierCurve Curve { } } - private Switch _parentSwitch; + private SwitchBase _parentSwitch; - private Switch ParentSwitch { + private SwitchBase ParentSwitch { get { if (_parentSwitch) return _parentSwitch; - return _parentSwitch = GetComponentInParent(); + return _parentSwitch = GetComponentInParent(); } } From 597a2850b355df3348cb17a4d64f243d07121671 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:10:08 +0100 Subject: [PATCH 05/38] make the visual part of the switch work with switches that have more than 2 branches --- Mapify/Mapify.csproj | 1 + Mapify/Patches/VisualSwitchPatch.cs | 75 +++++++++++++++++++ .../SceneInitializers/Railway/TrackSetup.cs | 3 +- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 Mapify/Patches/VisualSwitchPatch.cs diff --git a/Mapify/Mapify.csproj b/Mapify/Mapify.csproj index 125ba6a8..c8763a63 100644 --- a/Mapify/Mapify.csproj +++ b/Mapify/Mapify.csproj @@ -59,6 +59,7 @@ + diff --git a/Mapify/Patches/VisualSwitchPatch.cs b/Mapify/Patches/VisualSwitchPatch.cs new file mode 100644 index 00000000..1a204982 --- /dev/null +++ b/Mapify/Patches/VisualSwitchPatch.cs @@ -0,0 +1,75 @@ +using System.Collections; +using HarmonyLib; +using UnityEngine; + +namespace Mapify.Patches +{ + /// + /// Makes the visual part of the switch work with switches that have more than 2 branches. + /// + [HarmonyPatch(typeof(VisualSwitch), nameof(VisualSwitch.PlayAnimation))] + public class VisualSwitch_PlayAnimation_Patch + { + private static readonly int Speed = Animator.StringToHash("speed"); + private const int ANIMATION_LAYER = 0; + private const string STATE_NAME = "junction"; + + private static bool Prefix(VisualSwitch __instance) + { + if (__instance.junction.outBranches.Count <= 2) return true; + + if (!(bool)(Object)__instance.animator) return false; + + __instance.EnableAnimator(); + + var previousTime = __instance.animator.GetCurrentAnimatorStateInfo(ANIMATION_LAYER).normalizedTime; + var newTime = map( + __instance.junction.selectedBranch, + 0, __instance.junction.outBranches.Count - 1, + 0, 1 + ); + + var playForward = newTime > previousTime; + + // set animation direction + var speed = playForward ? __instance.speedMult : -__instance.speedMult; + __instance.animator.SetFloat(Speed, speed); + + // play animation + __instance.animator.Play(STATE_NAME, ANIMATION_LAYER, previousTime); + + __instance.StopAllCoroutines(); + var routine = Pause(newTime, playForward, __instance.animator); + __instance.StartCoroutine(routine); + + return false; + } + + private static IEnumerator Pause(float pauseTime, bool playForward, Animator animator) + { + if (playForward) + { + while (animator.GetCurrentAnimatorStateInfo(ANIMATION_LAYER).normalizedTime < pauseTime) + { + yield return null; + } + } + else + { + while (animator.GetCurrentAnimatorStateInfo(ANIMATION_LAYER).normalizedTime > pauseTime) + { + yield return null; + } + } + + // pause + animator.SetFloat(Speed, 0); + + Mapify.Log($"{nameof(Pause)} {animator.GetCurrentAnimatorStateInfo(ANIMATION_LAYER).normalizedTime} PAUSED"); + } + + private static float map(float value, float in_min, float in_max, float out_min, float out_max) { + return (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } + } +} diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 6a1bf899..a406f865 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -81,7 +81,8 @@ private static void CreateCustomSwitches() private static void CreateCustomSwitch(CustomSwitch customSwitch) { - var vanillaAsset = customSwitch.standSide == CustomSwitch.StandSide.LEFT ? VanillaAsset.SwitchLeft : VanillaAsset.SwitchRight; + // we use SwitchRight because with SwitchLeft the animation would be mirrored + var vanillaAsset = customSwitch.standSide == CustomSwitch.StandSide.LEFT ? VanillaAsset.SwitchRightOuterSign : VanillaAsset.SwitchRight; var prefabClone = AssetCopier.Instantiate(vanillaAsset); prefabClone.transform.SetPositionAndRotation(customSwitch.transform.position, customSwitch.transform.rotation); From 4e6664e881dedc4afffddf2ca68777372285f34d Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Thu, 21 Nov 2024 17:19:09 +0100 Subject: [PATCH 06/38] label cars with the comms radio for the hump yard --- Mapify/CarLabeler/CreateLabel.cs | 137 ++++++++++++++++++++ Mapify/CarLabeler/SelectStation.cs | 50 +++++++ Mapify/CarLabeler/SelectTrack.cs | 61 +++++++++ Mapify/CarLabeler/SelectYard.cs | 59 +++++++++ Mapify/CarLabeler/Start.cs | 32 +++++ Mapify/CarLabeler/SubState.cs | 22 ++++ Mapify/CarLabeler/YardDestination.cs | 66 ++++++++++ Mapify/Map/MapLifeCycle.cs | 1 + Mapify/Mapify.cs | 2 +- Mapify/Mapify.csproj | 1 + Mapify/Patches/CommsRadioControllerPatch.cs | 37 ++++++ Mapify/Settings.cs | 2 + Mapify/Utils/Extensions.cs | 29 ++++- Mapify/Utils/Misc.cs | 11 ++ info.json | 3 +- 15 files changed, 509 insertions(+), 4 deletions(-) create mode 100644 Mapify/CarLabeler/CreateLabel.cs create mode 100644 Mapify/CarLabeler/SelectStation.cs create mode 100644 Mapify/CarLabeler/SelectTrack.cs create mode 100644 Mapify/CarLabeler/SelectYard.cs create mode 100644 Mapify/CarLabeler/Start.cs create mode 100644 Mapify/CarLabeler/SubState.cs create mode 100644 Mapify/CarLabeler/YardDestination.cs create mode 100644 Mapify/Utils/Misc.cs diff --git a/Mapify/CarLabeler/CreateLabel.cs b/Mapify/CarLabeler/CreateLabel.cs new file mode 100644 index 00000000..4c120184 --- /dev/null +++ b/Mapify/CarLabeler/CreateLabel.cs @@ -0,0 +1,137 @@ +using CommsRadioAPI; +using DV; +using UnityEngine; + +namespace Mapify.CarLabeler +{ + public class CreateLabel: SubState + { + private TrainCar pointedCar; + private RaycastHit[] hits = new RaycastHit[5]; + + private static bool isSetup; + private static GameObject trainHighlighter; + private static Material selectionMaterial; + private static MeshRenderer trainHighlighterRender; + + public CreateLabel(YardDestination aDestination) : + base(aDestination, + $"Point at a car and click to label it.\n" + + $"{aDestination.StationName()}-{aDestination.YardID}-{aDestination.TrackNumber}" + ) + { + if(isSetup) return; + DoSetup(); + } + + private static void DoSetup() + { + var deleter = (CommsRadioCarDeleter)ControllerAPI.GetVanillaMode(VanillaMode.Clear); + + if (deleter == null) + { + Mapify.LogError($"{nameof(CreateLabel)}: Could not get deleter"); + return; + } + + trainHighlighter = deleter.trainHighlighter; + selectionMaterial = deleter.selectionMaterial; + trainHighlighterRender = deleter.trainHighlighterRender; + + isSetup = true; + } + + public override AStateBehaviour OnAction(CommsRadioUtility utility, InputAction action) + { + switch (action) + { + case InputAction.Activate: + MarkCar(utility); + goto default; //C#, why... + default: + return new CreateLabel(destination); + } + } + + private void MarkCar(CommsRadioUtility utility) + { + if (pointedCar == null){ + utility.PlaySound(VanillaSoundCommsRadio.Warning); + return; + } + + var labelComponent = pointedCar.gameObject.GetComponent(); + if (labelComponent == null) + { + labelComponent = pointedCar.gameObject.AddComponent(); + } + + labelComponent.Setup(destination); + utility.PlaySound(VanillaSoundCommsRadio.Confirm); + } + + public override AStateBehaviour OnUpdate(CommsRadioUtility utility) + { + TrainCar car = null; + + // Why does the direction need to be downward? I would expect forward. + if(Physics.RaycastNonAlloc(utility.SignalOrigin.position, -utility.SignalOrigin.up, hits, maxDistance: 100f) > 0) + { + foreach (var hit in hits) + { + if (hit.transform == null) continue; + + car = TrainCar.Resolve(hit.transform.root); + if (car == null) continue; + + Mapify.LogDebug($"hit car {car.gameObject.name}"); + Mapify.LogDebug($"layer: {car.gameObject.layer}"); + break; + } + } + + PointToCar(car, utility); + return this; + } + + private void PointToCar(TrainCar car, CommsRadioUtility utility) + { + if (pointedCar == car) return; + + pointedCar = car; + ClearHighlightCar(); + + if (pointedCar == null) return; + + HighlightCar(pointedCar); + utility.PlaySound(VanillaSoundCommsRadio.HoverOver); + } + + private static void HighlightCar(TrainCar car) + { + Mapify.LogDebug($"{nameof(HighlightCar)}: {car}"); + + trainHighlighterRender.material = selectionMaterial; + var transform = trainHighlighter.transform; + var bounds = car.Bounds; + var vector3_1 = bounds.size + CommsRadioCarDeleter.HIGHLIGHT_BOUNDS_EXTENSION; + transform.localScale = vector3_1; + var vector3_2 = car.transform.up * (trainHighlighter.transform.localScale.y / 2f); + var forward = car.transform.forward; + bounds = car.Bounds; + double z = bounds.center.z; + var vector3_3 = forward * (float) z; + trainHighlighter.transform.SetPositionAndRotation(car.transform.position + vector3_2 + vector3_3, car.transform.rotation); + trainHighlighter.SetActive(true); + trainHighlighter.transform.SetParent(car.transform, true); + } + + private static void ClearHighlightCar() + { + Mapify.LogDebug($"{nameof(ClearHighlightCar)}"); + + trainHighlighter.SetActive(false); + trainHighlighter.transform.SetParent(null); + } + } +} diff --git a/Mapify/CarLabeler/SelectStation.cs b/Mapify/CarLabeler/SelectStation.cs new file mode 100644 index 00000000..647d8f12 --- /dev/null +++ b/Mapify/CarLabeler/SelectStation.cs @@ -0,0 +1,50 @@ +using CommsRadioAPI; + +namespace Mapify.CarLabeler +{ + public class SelectStation: SubState + { + public SelectStation(YardDestination aDestination) : + base(aDestination, $"station:\n{aDestination.StationName()}" + ) + {} + + public override AStateBehaviour OnAction(CommsRadioUtility utility, InputAction action) + { + switch (action) + { + case InputAction.Activate: + utility.PlaySound(VanillaSoundCommsRadio.Confirm); + return new SelectYard(destination); + case InputAction.Up: + utility.PlaySound(VanillaSoundCommsRadio.Switch); + return NextOrPreviousStation(1); + case InputAction.Down: + utility.PlaySound(VanillaSoundCommsRadio.Switch); + return NextOrPreviousStation(-1); + default: + return new SelectStation(destination); + } + } + + private AStateBehaviour NextOrPreviousStation(int stationIndexDelta) + { + var allStations = StationController.allStations; + var stationIndex = 0; + + for (int index = 0; index < allStations.Count; index++) + { + if (allStations[index].stationInfo.YardID != destination.StationID) continue; + + stationIndex = index; + break; + } + + stationIndex = Utils.Misc.BetterModulo(stationIndex + stationIndexDelta, allStations.Count); + + destination.StationID = allStations[stationIndex].stationInfo.YardID; + + return new SelectStation(destination); + } + } +} diff --git a/Mapify/CarLabeler/SelectTrack.cs b/Mapify/CarLabeler/SelectTrack.cs new file mode 100644 index 00000000..ebfd38f8 --- /dev/null +++ b/Mapify/CarLabeler/SelectTrack.cs @@ -0,0 +1,61 @@ +using System.Linq; +using CommsRadioAPI; +using Mapify.Utils; + +namespace Mapify.CarLabeler +{ + public class SelectTrack: SubState + { + public SelectTrack(YardDestination aDestination) : + base(aDestination, $"track: {aDestination.TrackNumber}" + ) + {} + + public override AStateBehaviour OnAction(CommsRadioUtility utility, InputAction action) + { + switch (action) + { + case InputAction.Activate: + utility.PlaySound(VanillaSoundCommsRadio.Confirm); + return new CreateLabel(destination); + case InputAction.Up: + utility.PlaySound(VanillaSoundCommsRadio.Switch); + return NextOrPreviousTrack(1); + case InputAction.Down: + utility.PlaySound(VanillaSoundCommsRadio.Switch); + return NextOrPreviousTrack(-1); + default: + return new SelectTrack(destination); + } + } + + private AStateBehaviour NextOrPreviousTrack(int trackIndexDelta) + { + //TODO cache this + var yardTracks = RailTrackRegistry.Instance + .GetTrackNumbersOfSubYard(destination.StationID, destination.YardID) + .ToList(); + + Mapify.LogDebug("yardTracks:"); + foreach (var track in yardTracks) + { + Mapify.LogDebug(track); + } + + var trackIndex = 0; + + for (int index = 0; index < yardTracks.Count; index++) + { + if (yardTracks[index] != destination.TrackNumber) continue; + + trackIndex = index; + break; + } + + trackIndex = Utils.Misc.BetterModulo(trackIndex + trackIndexDelta, yardTracks.Count); + destination.TrackNumber = yardTracks[trackIndex]; + + return new SelectTrack(destination); + } + } +} diff --git a/Mapify/CarLabeler/SelectYard.cs b/Mapify/CarLabeler/SelectYard.cs new file mode 100644 index 00000000..47f205c4 --- /dev/null +++ b/Mapify/CarLabeler/SelectYard.cs @@ -0,0 +1,59 @@ +using System.Linq; +using CommsRadioAPI; +using Mapify.Utils; + +namespace Mapify.CarLabeler +{ + public class SelectYard: SubState + { + public SelectYard(YardDestination aDestination) : + base(aDestination, $"yard: {aDestination.YardID}" + ) + {} + + public override AStateBehaviour OnAction(CommsRadioUtility utility, InputAction action) + { + switch (action) + { + case InputAction.Activate: + utility.PlaySound(VanillaSoundCommsRadio.Confirm); + return new SelectTrack(destination); + case InputAction.Up: + utility.PlaySound(VanillaSoundCommsRadio.Switch); + return NextOrPreviousYard(1); + case InputAction.Down: + utility.PlaySound(VanillaSoundCommsRadio.Switch); + return NextOrPreviousYard(-1); + default: + return new SelectYard(destination); + } + } + + private AStateBehaviour NextOrPreviousYard(int yardIndexDelta) + { + //TODO cache this + var stationYards = RailTrackRegistry.Instance.GetSubYardIDsOfYard(destination.StationID).ToList(); + + Mapify.LogDebug("stationYards:"); + foreach (var yard in stationYards) + { + Mapify.LogDebug(yard); + } + + var yardIndex = 0; + + for (int index = 0; index < stationYards.Count; index++) + { + if (stationYards[index] != destination.YardID) continue; + + yardIndex = index; + break; + } + + yardIndex = Utils.Misc.BetterModulo(yardIndex + yardIndexDelta, stationYards.Count); + destination.YardID = stationYards[yardIndex]; + + return new SelectYard(destination); + } + } +} diff --git a/Mapify/CarLabeler/Start.cs b/Mapify/CarLabeler/Start.cs new file mode 100644 index 00000000..703c1457 --- /dev/null +++ b/Mapify/CarLabeler/Start.cs @@ -0,0 +1,32 @@ +using CommsRadioAPI; + +namespace Mapify.CarLabeler +{ + public class Start: AStateBehaviour + { + public Start() : base(new CommsRadioState( + titleText: SubState.LABELER_TITLE, + contentText: "enable yard car labeler?" + )) + {} + + public override AStateBehaviour OnAction(CommsRadioUtility utility, InputAction action) + { + switch (action) + { + case InputAction.Activate: + utility.PlaySound(VanillaSoundCommsRadio.ModeEnter); + return new SelectStation(SetupDestination()); + default: + return new Start(); + } + } + + private static YardDestination SetupDestination() + { + var aDestination = Mapify.Settings.lastUsedLabel; + YardDestination.Validate(ref aDestination); + return aDestination; + } + } +} diff --git a/Mapify/CarLabeler/SubState.cs b/Mapify/CarLabeler/SubState.cs new file mode 100644 index 00000000..ac6ddfb0 --- /dev/null +++ b/Mapify/CarLabeler/SubState.cs @@ -0,0 +1,22 @@ +using CommsRadioAPI; +using DV; + +namespace Mapify.CarLabeler +{ + public abstract class SubState: AStateBehaviour + { + public const string LABELER_TITLE = "car labeler"; + + protected YardDestination destination; + + protected SubState(YardDestination aDestination, string contentText_) : + base(new CommsRadioState( + titleText: LABELER_TITLE, + buttonBehaviour: ButtonBehaviourType.Override, + contentText: contentText_ + )) + { + destination = aDestination; + } + } +} diff --git a/Mapify/CarLabeler/YardDestination.cs b/Mapify/CarLabeler/YardDestination.cs new file mode 100644 index 00000000..a887dfda --- /dev/null +++ b/Mapify/CarLabeler/YardDestination.cs @@ -0,0 +1,66 @@ +using System.Linq; +using Mapify.Utils; +using UnityEngine; + +namespace Mapify.CarLabeler +{ + public class YardDestinationComponent : MonoBehaviour + { + public YardDestination d; + + public void Setup(YardDestination other) + { + d = new YardDestination + { + StationID = other.StationID, + YardID = other.YardID, + TrackNumber = other.TrackNumber + }; + } + } + + public class YardDestination + { + // identifies a station + public string StationID; + // identifies a yard in a station + public string YardID; + // identifies a track in a yard in a station + public int TrackNumber; + + public string StationName() + { + var stationController = StationController.GetStationByYardID(StationID); + return stationController == null ? "NULL" : stationController.stationInfo.Name; + } + + /// + /// if any of the fields are invalid, set them to something valid + /// + public static void Validate(ref YardDestination aDestination) + { + if (aDestination == null) + { + aDestination = new YardDestination(); + } + + //TODO stations/yards without tracks? + if (StationController.GetStationByYardID(aDestination.StationID) == null) + { + aDestination.StationID = StationController.allStations.Select(station => station.stationInfo.YardID).FirstOrDefault(); + } + + var stationYardIDs = RailTrackRegistry.Instance.GetSubYardIDsOfYard(aDestination.StationID).ToList(); + if (!stationYardIDs.Contains(aDestination.YardID)) + { + aDestination.YardID = stationYardIDs.FirstOrDefault(); + } + + var yardTrackNumbers = RailTrackRegistry.Instance.GetTrackNumbersOfSubYard(aDestination.StationID, aDestination.YardID).ToList(); + if (!yardTrackNumbers.Contains(aDestination.TrackNumber)) + { + aDestination.TrackNumber = yardTrackNumbers.FirstOrDefault(); + } + } + } +} diff --git a/Mapify/Map/MapLifeCycle.cs b/Mapify/Map/MapLifeCycle.cs index ebe42ebc..2dac8cd1 100644 --- a/Mapify/Map/MapLifeCycle.cs +++ b/Mapify/Map/MapLifeCycle.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; +using CommsRadioAPI; using DV.CashRegister; using DV.Utils; using Mapify.Editor; diff --git a/Mapify/Mapify.cs b/Mapify/Mapify.cs index 5b3fd9c7..2529c11d 100644 --- a/Mapify/Mapify.cs +++ b/Mapify/Mapify.cs @@ -12,7 +12,7 @@ namespace Mapify public static class Mapify { private static UnityModManager.ModEntry ModEntry { get; set; } - private static Settings Settings; + public static Settings Settings { get; private set; } private const string LOCALE_FILE = "locale.csv"; internal static Harmony Harmony { get; private set; } diff --git a/Mapify/Mapify.csproj b/Mapify/Mapify.csproj index c8763a63..c73fd408 100644 --- a/Mapify/Mapify.csproj +++ b/Mapify/Mapify.csproj @@ -47,6 +47,7 @@ + diff --git a/Mapify/Patches/CommsRadioControllerPatch.cs b/Mapify/Patches/CommsRadioControllerPatch.cs index cd6acde4..4a258116 100644 --- a/Mapify/Patches/CommsRadioControllerPatch.cs +++ b/Mapify/Patches/CommsRadioControllerPatch.cs @@ -1,7 +1,10 @@ using System.Linq; +using CommsRadioAPI; using DV; using HarmonyLib; +using Mapify.CarLabeler; using Mapify.Map; +using UnityEngine; namespace Mapify.Patches { @@ -19,4 +22,38 @@ private static void Postfix(CommsRadioController __instance) __instance.allModes = __instance.allModes.Where(mode => mode.GetType() != typeof(CommsRadioCrewVehicle)).ToList(); } } + + /// + /// Create the yard car labeler mode in the comms radio + /// + [HarmonyPatch(typeof(CommsRadioController), nameof(CommsRadioController.Start))] + public static class CommsRadioController_Start_Patch + { + private static bool isRadioSetup = false; + + private static void Postfix() + { + if (isRadioSetup) return; + + CommsRadioMode.Create(new Start(), laserColor: Color.blue); + isRadioSetup = true; + } + } + + /// + /// By default, scrolling down activates the 'up' button and scrolling up activates the 'down' button. This patch corrects this. + /// + [HarmonyPatch(typeof(CommsRadioController), nameof(CommsRadioController.OnScrolled))] + public static class CommsRadioController_OnScrolled_Patch + { + private static bool Prefix(CommsRadioController __instance, ScrollAction direction) + { + if (direction.IsPositive()) + __instance.OnActionA(); + else + __instance.OnActionB(); + + return false; + } + } } diff --git a/Mapify/Settings.cs b/Mapify/Settings.cs index ab66e682..2bae7ec6 100644 --- a/Mapify/Settings.cs +++ b/Mapify/Settings.cs @@ -11,6 +11,8 @@ public class Settings : UnityModManager.ModSettings public bool VerboseLogging; public bool ExtremelyVerboseLogging; + public CarLabeler.YardDestination lastUsedLabel; + public void Draw(UnityModManager.ModEntry modEntry) { #region Hidden Settings diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 49c7e0d5..3566baf7 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; -using System.Runtime.InteropServices; using CommandTerminal; using DV.JObjectExtstensions; using DV.PointSet; @@ -13,7 +12,6 @@ using Mapify.Map; using Newtonsoft.Json.Linq; using UnityEngine; -using Object = UnityEngine.Object; namespace Mapify.Utils { @@ -227,6 +225,33 @@ public static RailTrack GetRailTrack(this RailTrackRegistry registry, string sta return registry.AllTracks.FirstOrDefault(track => track.name.Contains(query)); } + /// + /// Returns the subyard IDs of all subyards in the yard(station) with ID yardID + /// + public static IEnumerable GetSubYardIDsOfYard(this RailTrackRegistry registry, string yardID) + { + return registry.AllTracks + .Select(railTrack => railTrack.logicTrack.ID) + .Where(ID => ID.yardId == yardID) + .Select(ID => ID.subYardId) + .Distinct(); + } + + /// + /// Returns the track numbers of all track in the subyard with ID subYardID in the yard(station) with yardID + /// + public static IEnumerable GetTrackNumbersOfSubYard(this RailTrackRegistry registry, string yardID, string subYardID) + { + return registry.AllTracks + .Select(railTrack => railTrack.logicTrack.ID) + .Where(ID => ID.yardId == yardID && + ID.subYardId == subYardID) + .Select(ID => ID.orderNumber) + .Where(trackNumberString => trackNumberString != "") + .Select(int.Parse) + .Distinct(); + } + public static void SwitchTo(this Junction junction, int branchNumber, Junction.SwitchMode switchMode) { Mapify.LogDebug($"junction {junction.name} switch to {branchNumber}"); diff --git a/Mapify/Utils/Misc.cs b/Mapify/Utils/Misc.cs new file mode 100644 index 00000000..2e476b30 --- /dev/null +++ b/Mapify/Utils/Misc.cs @@ -0,0 +1,11 @@ +namespace Mapify.Utils +{ + public static class Misc + { + // modulo operator but it works for negative numbers + // https://stackoverflow.com/a/1082938 + public static int BetterModulo(int x, int m) { + return (x%m + m)%m; + } + } +} diff --git a/info.json b/info.json index 2543bede..55b68775 100644 --- a/info.json +++ b/info.json @@ -6,5 +6,6 @@ "EntryMethod": "Mapify.Mapify.Load", "ManagerVersion": "0.27.13", "HomePage": "https://www.nexusmods.com/derailvalley/mods/593", - "Repository": "https://raw.githubusercontent.com/Insprill/dv-mapify/master/repository.json" + "Repository": "https://raw.githubusercontent.com/Insprill/dv-mapify/master/repository.json", + "Requirements": ["CommsRadioAPI-1.0.3"] } From 8193d134ab169180d9c22c1b752702cb109ac398 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 22 Nov 2024 11:53:37 +0100 Subject: [PATCH 07/38] build 99 compatibility --- Mapify/AssetCopiers/RailwayCopier.cs | 6 +++--- Mapify/Patches/MapMarkersControllerPatch.cs | 18 ++++++++++++++++++ Mapify/Patches/RailTrackPatch.cs | 13 +++++++++++++ Mapify/Patches/WorldMapPatch.cs | 17 ----------------- .../GameContent/GameSceneSetup.cs | 12 ++++++++++-- .../GameContent/StationSetup.cs | 4 ++-- .../Railway/RailwaySceneInitializer.cs | 5 ++++- Mapify/SceneInitializers/Railway/TrackSetup.cs | 10 ++++++++-- MapifyEditor/Vanilla/VanillaAsset.cs | 2 ++ 9 files changed, 60 insertions(+), 27 deletions(-) create mode 100644 Mapify/Patches/MapMarkersControllerPatch.cs delete mode 100644 Mapify/Patches/WorldMapPatch.cs diff --git a/Mapify/AssetCopiers/RailwayCopier.cs b/Mapify/AssetCopiers/RailwayCopier.cs index b0fe9e10..ce9a0527 100644 --- a/Mapify/AssetCopiers/RailwayCopier.cs +++ b/Mapify/AssetCopiers/RailwayCopier.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using DV; using Mapify.Editor; using Mapify.Editor.Utils; using Mapify.Utils; @@ -10,7 +11,7 @@ public class RailwayCopier : AssetCopier { protected override IEnumerator<(VanillaAsset, GameObject)> ToSave(GameObject gameObject) { - if (gameObject.name != "[railway]") + if (gameObject.name != WorldData.RAILWAY_ROOT) yield break; for (int i = 0; i < gameObject.transform.childCount; i++) @@ -25,8 +26,7 @@ public class RailwayCopier : AssetCopier visual.localPosition = visual.localPosition.AddY(2.5f); Transform colliders = bridge.FindChildByName("colliders").transform; colliders.localPosition = colliders.localPosition.AddY(2.5f); - GameObject rail = bridge.FindChildByName("TurntableRail"); - yield return (VanillaAsset.TurntableTrack, rail); + yield return (VanillaAsset.TurntableTrack, child); yield return (VanillaAsset.TurntableBridge, bridge); continue; case "TurntableControlPanel": diff --git a/Mapify/Patches/MapMarkersControllerPatch.cs b/Mapify/Patches/MapMarkersControllerPatch.cs new file mode 100644 index 00000000..6909fb49 --- /dev/null +++ b/Mapify/Patches/MapMarkersControllerPatch.cs @@ -0,0 +1,18 @@ +using HarmonyLib; +using Mapify.Editor.Utils; +using Mapify.Map; +using Mapify.SceneInitializers.GameContent; + +namespace Mapify.Patches +{ + [HarmonyPatch(typeof(MapMarkersController), nameof(MapMarkersController.Awake))] + public static class MapMarkersController_Awake_Patch + { + private static void Postfix(MapMarkersController __instance) + { + if (!Maps.IsDefaultMap) { + WorldMapSetup.UpdateMap(__instance.transform.FindChildByName("MapPaper")); + } + } + } +} diff --git a/Mapify/Patches/RailTrackPatch.cs b/Mapify/Patches/RailTrackPatch.cs index db918ad4..afb54e95 100644 --- a/Mapify/Patches/RailTrackPatch.cs +++ b/Mapify/Patches/RailTrackPatch.cs @@ -3,6 +3,7 @@ using System.Reflection.Emit; using HarmonyLib; using Mapify.Editor; +using Mapify.Map; namespace Mapify.Patches { @@ -59,4 +60,16 @@ private static bool Prefix(Junction.Branch branch) return branch != null; } } + + /// + /// This function throws a NullReferenceException on custom maps. It doesn't look critical so let's just skip it for now. + /// + // [HarmonyPatch(typeof(RailTrack), nameof(RailTrack.WarnIfConnectionsAreDisjoint))] + // public static class RailTrack_WarnIfConnectionsAreDisjoint_Patch + // { + // private static bool Prefix() + // { + // return Maps.IsDefaultMap; + // } + // } } diff --git a/Mapify/Patches/WorldMapPatch.cs b/Mapify/Patches/WorldMapPatch.cs deleted file mode 100644 index d7313483..00000000 --- a/Mapify/Patches/WorldMapPatch.cs +++ /dev/null @@ -1,17 +0,0 @@ -using HarmonyLib; -using Mapify.Map; -using Mapify.SceneInitializers.GameContent; - -namespace Mapify.Patches -{ - [HarmonyPatch(typeof(WorldMap), nameof(WorldMap.Awake))] - public static class WorldMap_Awake_Patch - { - private static void Postfix(WorldMap __instance) - { - if (!Maps.IsDefaultMap) { - WorldMapSetup.UpdateMap(__instance.transform); - } - } - } -} diff --git a/Mapify/SceneInitializers/GameContent/GameSceneSetup.cs b/Mapify/SceneInitializers/GameContent/GameSceneSetup.cs index b0e19d2d..46995e2f 100644 --- a/Mapify/SceneInitializers/GameContent/GameSceneSetup.cs +++ b/Mapify/SceneInitializers/GameContent/GameSceneSetup.cs @@ -1,4 +1,5 @@ -using DV.Shops; +using System; +using DV.Shops; using DV.WeatherSystem; using Mapify.Editor; using Mapify.SceneInitializers.Vanilla.GameContent; @@ -28,7 +29,14 @@ public override void Run() if (!ShouldEnable(gameObject)) continue; - gameObject.SetActive(true); + try + { + gameObject.SetActive(true); + } + catch (NullReferenceException e) + { + Mapify.LogError($"{nameof(GameSceneSetup)}.{nameof(Run)}: SetActive on gameObject {gameObject.name} failed: {e}"); + } } // I'm not sure where vanilla creates this because it doesn't have auto create enabled, nor is it in any of the four main scenes, or created in code. diff --git a/Mapify/SceneInitializers/GameContent/StationSetup.cs b/Mapify/SceneInitializers/GameContent/StationSetup.cs index 5acb0a68..097aa3cb 100644 --- a/Mapify/SceneInitializers/GameContent/StationSetup.cs +++ b/Mapify/SceneInitializers/GameContent/StationSetup.cs @@ -105,9 +105,9 @@ private static void SetupTeleportAnchor(Station station) Transform teleportAnchor = station.gameObject.NewChild("TeleportAnchor").transform; teleportAnchor.position = station.teleportLocation.position; teleportAnchor.rotation = station.teleportLocation.rotation; - StationTeleporter teleporter = teleportAnchor.gameObject.AddComponent(); + StationFastTravelDestination teleporter = teleportAnchor.gameObject.AddComponent(); teleporter.playerTeleportAnchor = teleportAnchor; - teleporter.playerTeleportMapMarkerAnchor = teleportAnchor; + teleporter.mapMarkerAnchor = teleportAnchor; } private static void SetupLocomotiveSpawners(Station station) diff --git a/Mapify/SceneInitializers/Railway/RailwaySceneInitializer.cs b/Mapify/SceneInitializers/Railway/RailwaySceneInitializer.cs index 8e023fcc..f2252743 100644 --- a/Mapify/SceneInitializers/Railway/RailwaySceneInitializer.cs +++ b/Mapify/SceneInitializers/Railway/RailwaySceneInitializer.cs @@ -1,4 +1,5 @@ using System.Linq; +using DV; using Mapify.Utils; using UnityEngine; using UnityEngine.SceneManagement; @@ -12,7 +13,9 @@ public RailwaySceneInitializer(Scene scene) : base(scene) public override void Run() { - Transform railwayParent = WorldMover.OriginShiftParent.gameObject.NewChild("[railway]").transform; + Transform railwayParent = WorldMover.OriginShiftParent.gameObject.NewChild(WorldData.RAILWAY_ROOT).transform; + WorldData.Instance._trackRootParent = railwayParent; + foreach (Transform transform in scene.GetRootGameObjects().Select(go => go.transform)) transform.SetParent(railwayParent); base.Run(); diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index ad8dd746..6d6afa5d 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using DV; using Mapify.Editor; using Mapify.Utils; using UnityEngine; @@ -56,16 +57,21 @@ private static void CreateJunctions() foreach (Transform child in prefabCloneTransform) child.transform.position += offset; prefabCloneTransform.SetPositionAndRotation(swTransform.position, swTransform.rotation); + Junction junction = inJunction.GetComponent(); - junction.selectedBranch = sw.IsLeft + junction.selectedBranch = (byte) (sw.IsLeft ? sw.defaultState == Switch.StandSide.THROUGH ? 1 : 0 : sw.defaultState == Switch.StandSide.THROUGH ? 0 - : 1; + : 1 + ); + foreach (Junction.Branch branch in junction.outBranches) branch.track.generateColliders = true; + + prefabClone.transform.SetParent(WorldData.Instance.TrackRootParent); prefabClone.SetActive(true); } } diff --git a/MapifyEditor/Vanilla/VanillaAsset.cs b/MapifyEditor/Vanilla/VanillaAsset.cs index 6c6850ac..7ebddc36 100644 --- a/MapifyEditor/Vanilla/VanillaAsset.cs +++ b/MapifyEditor/Vanilla/VanillaAsset.cs @@ -73,6 +73,8 @@ public enum VanillaAsset #region Stores + //TODO update this, add new items + Store = 80, StoreMesh = 81, StoreItemBoombox = 82, From 02030d96ef13fde1720305925d67dfb850c306bf Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 22 Nov 2024 12:00:45 +0100 Subject: [PATCH 08/38] update cargo enum #79 --- Mapify/Patches/RailTrackPatch.cs | 1 - MapifyEditor/Cargo/Cargo.cs | 34 +++++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/Mapify/Patches/RailTrackPatch.cs b/Mapify/Patches/RailTrackPatch.cs index afb54e95..9c729591 100644 --- a/Mapify/Patches/RailTrackPatch.cs +++ b/Mapify/Patches/RailTrackPatch.cs @@ -3,7 +3,6 @@ using System.Reflection.Emit; using HarmonyLib; using Mapify.Editor; -using Mapify.Map; namespace Mapify.Patches { diff --git a/MapifyEditor/Cargo/Cargo.cs b/MapifyEditor/Cargo/Cargo.cs index b6701b59..1ceeaac6 100644 --- a/MapifyEditor/Cargo/Cargo.cs +++ b/MapifyEditor/Cargo/Cargo.cs @@ -13,24 +13,38 @@ public enum Cargo Logs = 60, Boards = 61, Plywood = 62, + Sleepers = 63, Wheat = 80, Corn = 81, + SunflowerSeeds = 82, + Flour = 83, Pigs = 100, Cows = 101, - Chickens = 102, + Poultry = 102, Sheep = 103, Goats = 104, + Fish = 105, Bread = 120, DairyProducts = 121, MeatProducts = 122, CannedFood = 123, CatFood = 124, + TemperateFruits = 125, + Vegetables = 126, + Milk = 127, + Eggs = 128, + Cotton = 129, + Wool = 130, + TropicalFruits = 131, SteelRolls = 140, SteelBillets = 141, SteelSlabs = 142, SteelBentPlates = 143, SteelRails = 144, ScrapMetal = 150, + ScrapWood = 151, + WoodChips = 152, + ScrapContainers = 153, ElectronicsIskar = 160, ElectronicsKrugmann = 161, ElectronicsAAG = 162, @@ -54,6 +68,11 @@ public enum Cargo ImportedNewCars = 261, Tractors = 262, Excavators = 263, + MiningTrucks = 264, + CityBuses = 265, + SemiTrailers = 266, + CraneParts = 267, + Trams = 268, Alcohol = 280, Acetylene = 281, CryoOxygen = 282, @@ -62,12 +81,22 @@ public enum Cargo Nitrogen = 285, Ammonia = 286, SodiumHydroxide = 287, + AmmoniumNitrate = 288, SpentNuclearFuel = 300, Ammunition = 301, Biohazard = 302, Tanks = 320, MilitaryTrucks = 321, MilitarySupplies = 322, + AttackHelicopters = 323, + Missiles = 324, + MilitaryCars = 325, + TrainPartsDE2 = 340, + TrainPartsDE6 = 341, + TrainPartsDH4 = 342, + TrainPartsDM3 = 343, + TrainPartsS060 = 344, + TrainPartsS282A = 345, EmptySunOmni = 900, EmptyIskar = 901, EmptyObco = 902, @@ -79,7 +108,6 @@ public enum Cargo EmptyNovae = 908, EmptyTraeg = 909, EmptyChemlek = 910, - EmptyNeoGamma = 911, - Passengers = 1000 + EmptyNeoGamma = 911 } } From 2f15398df343873d4f66d2fd8310dfbf7d0ae888 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 22 Nov 2024 12:36:11 +0100 Subject: [PATCH 09/38] build 99 part 2 --- Mapify/Patches/RailTrackPatch.cs | 17 ++++++------ .../GameContent/GameSceneSetup.cs | 9 +------ .../GameContent/StationSetup.cs | 26 ++++++++++++++++++- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/Mapify/Patches/RailTrackPatch.cs b/Mapify/Patches/RailTrackPatch.cs index 9c729591..8e45fe5b 100644 --- a/Mapify/Patches/RailTrackPatch.cs +++ b/Mapify/Patches/RailTrackPatch.cs @@ -3,6 +3,7 @@ using System.Reflection.Emit; using HarmonyLib; using Mapify.Editor; +using Mapify.Map; namespace Mapify.Patches { @@ -63,12 +64,12 @@ private static bool Prefix(Junction.Branch branch) /// /// This function throws a NullReferenceException on custom maps. It doesn't look critical so let's just skip it for now. /// - // [HarmonyPatch(typeof(RailTrack), nameof(RailTrack.WarnIfConnectionsAreDisjoint))] - // public static class RailTrack_WarnIfConnectionsAreDisjoint_Patch - // { - // private static bool Prefix() - // { - // return Maps.IsDefaultMap; - // } - // } + [HarmonyPatch(typeof(RailTrack), nameof(RailTrack.WarnIfConnectionsAreDisjoint))] + public static class RailTrack_WarnIfConnectionsAreDisjoint_Patch + { + private static bool Prefix() + { + return Maps.IsDefaultMap; + } + } } diff --git a/Mapify/SceneInitializers/GameContent/GameSceneSetup.cs b/Mapify/SceneInitializers/GameContent/GameSceneSetup.cs index 46995e2f..cc9739fa 100644 --- a/Mapify/SceneInitializers/GameContent/GameSceneSetup.cs +++ b/Mapify/SceneInitializers/GameContent/GameSceneSetup.cs @@ -29,14 +29,7 @@ public override void Run() if (!ShouldEnable(gameObject)) continue; - try - { - gameObject.SetActive(true); - } - catch (NullReferenceException e) - { - Mapify.LogError($"{nameof(GameSceneSetup)}.{nameof(Run)}: SetActive on gameObject {gameObject.name} failed: {e}"); - } + gameObject.SetActive(true); } // I'm not sure where vanilla creates this because it doesn't have auto create enabled, nor is it in any of the four main scenes, or created in code. diff --git a/Mapify/SceneInitializers/GameContent/StationSetup.cs b/Mapify/SceneInitializers/GameContent/StationSetup.cs index 097aa3cb..2e57e326 100644 --- a/Mapify/SceneInitializers/GameContent/StationSetup.cs +++ b/Mapify/SceneInitializers/GameContent/StationSetup.cs @@ -1,13 +1,17 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using System.Reflection; using DV.Teleporters; using DV.ThingTypes; using DV.Utils; using HarmonyLib; using Mapify.Editor; +using Mapify.Map; using Mapify.SceneInitializers.Railway; using Mapify.Utils; using UnityEngine; +using Track = DV.Logic.Job.Track; +using WarehouseMachine = DV.Logic.Job.WarehouseMachine; namespace Mapify.SceneInitializers.GameContent { @@ -45,6 +49,26 @@ public override void Run() stations.SetActive(true); SingletonBehaviour.Instance.gameObject.SetActive(true); + + // var logicController = SingletonBehaviour.Instance; + // logicController.gameObject.SetActive(true); + // + // foreach (var railTrack in SingletonBehaviour.Instance.AllTracks) + // { + // if (railTrack.logicTrack != null) continue; + // + // Mapify.LogError($"{nameof(railTrack.logicTrack)} of {nameof(RailTrack)} {railTrack.name} was null"); + // railTrack.logicTrack = new Track(0); + // } + // + // foreach (var controller in WarehouseMachineController.allControllers) + // { + // if(controller.warehouseMachine != null) continue; + // + // Mapify.LogError($"{nameof(controller.warehouseMachine)} of {nameof(WarehouseMachineController)} {controller.name} was null"); + // controller.warehouseMachine = new WarehouseMachine(new Track(0), new List()); + // } + } private static void SetupJobBookletSpawnSurface(Station station, StationController stationController) From b8cc76a2f49ece560591dd63dbb531efb5575ad8 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 22 Nov 2024 14:14:59 +0100 Subject: [PATCH 10/38] delete obsolete mapify.unitypackage --- mapify.unitypackage | Bin 623337 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mapify.unitypackage diff --git a/mapify.unitypackage b/mapify.unitypackage deleted file mode 100644 index ac3a170a333c7c04a05ef032e6d84ff6a19c8604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 623337 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

%rl@6v-XzNkc<}T@%-eFR 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

d(V?kSO(q)wV$wsh)F=um?W

8IljL-XN%WY2O_^qQ?lmLcU6YXc?GX8fP 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

;madOTRJi(-6BFzKQ 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

H;@TAxt0+j^ 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

Nha?~A75^ZQ~ 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

&O0 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

(2kQ^@{dM}M3r(Wrw2ylqP z;x|(|71e%>dl=~Dy%phD^aVUjJDKvFKyKaFlv- d{%vm@)!?z`V+^Wu=I7!wmYC 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 From 9a1773e21bbf6427fd1754df2bc88c4cc68dbc2c Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sat, 23 Nov 2024 11:38:27 +0100 Subject: [PATCH 11/38] rm commented code --- .../GameContent/StationSetup.cs | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/Mapify/SceneInitializers/GameContent/StationSetup.cs b/Mapify/SceneInitializers/GameContent/StationSetup.cs index 2e57e326..5a6ede14 100644 --- a/Mapify/SceneInitializers/GameContent/StationSetup.cs +++ b/Mapify/SceneInitializers/GameContent/StationSetup.cs @@ -49,26 +49,6 @@ public override void Run() stations.SetActive(true); SingletonBehaviour.Instance.gameObject.SetActive(true); - - // var logicController = SingletonBehaviour.Instance; - // logicController.gameObject.SetActive(true); - // - // foreach (var railTrack in SingletonBehaviour.Instance.AllTracks) - // { - // if (railTrack.logicTrack != null) continue; - // - // Mapify.LogError($"{nameof(railTrack.logicTrack)} of {nameof(RailTrack)} {railTrack.name} was null"); - // railTrack.logicTrack = new Track(0); - // } - // - // foreach (var controller in WarehouseMachineController.allControllers) - // { - // if(controller.warehouseMachine != null) continue; - // - // Mapify.LogError($"{nameof(controller.warehouseMachine)} of {nameof(WarehouseMachineController)} {controller.name} was null"); - // controller.warehouseMachine = new WarehouseMachine(new Track(0), new List()); - // } - } private static void SetupJobBookletSpawnSurface(Station station, StationController stationController) From 72181d23d4ca6bfb18d9a4d0b48452ffe36bcca0 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 1 Dec 2024 17:39:57 +0100 Subject: [PATCH 12/38] delete unused dll meta files --- .../Assets/Mapify/Scripts/OsmSharp.dll.meta | 33 ------------------- .../Mapify/Scripts/protobuf-net.dll.meta | 33 ------------------- 2 files changed, 66 deletions(-) delete mode 100644 PackageBuilder/Assets/Mapify/Scripts/OsmSharp.dll.meta delete mode 100644 PackageBuilder/Assets/Mapify/Scripts/protobuf-net.dll.meta diff --git a/PackageBuilder/Assets/Mapify/Scripts/OsmSharp.dll.meta b/PackageBuilder/Assets/Mapify/Scripts/OsmSharp.dll.meta deleted file mode 100644 index 9142f0ad..00000000 --- a/PackageBuilder/Assets/Mapify/Scripts/OsmSharp.dll.meta +++ /dev/null @@ -1,33 +0,0 @@ -fileFormatVersion: 2 -guid: b868070355200e2449668298f608d7bd -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: diff --git a/PackageBuilder/Assets/Mapify/Scripts/protobuf-net.dll.meta b/PackageBuilder/Assets/Mapify/Scripts/protobuf-net.dll.meta deleted file mode 100644 index eb9ab9b7..00000000 --- a/PackageBuilder/Assets/Mapify/Scripts/protobuf-net.dll.meta +++ /dev/null @@ -1,33 +0,0 @@ -fileFormatVersion: 2 -guid: 5bc816fcb3d84e24091f0fcb4c990584 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: From e3ae55cd31f4dea2103e2ddd8ad2807567416e42 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Mon, 2 Dec 2024 16:03:45 +0100 Subject: [PATCH 13/38] track tools: implement custom switch --- .../BuildUpdaters/Railway/SwitchUpdater.cs | 6 +- .../Validators/Railway/SwitchValidator.cs | 10 +- MapifyEditor/Tools/ToolEnums.cs | 14 +- .../Tools/TrackToolsCreator.Previews.cs | 58 +++- MapifyEditor/Tools/TrackToolsCreator.cs | 171 ++++++---- MapifyEditor/Tools/TrackToolsHelper.cs | 37 +-- MapifyEditor/Tools/TrackToolsWindow.cs | 24 +- .../TrackToolsWindowDrawing/CreatePreviews.cs | 292 ++++++++---------- .../Tools/TrackToolsWindowGUI/Creation.cs | 56 +++- .../Tools/TrackToolsWindowGUI/Other.cs | 65 +++- .../Tools/TrackToolsWindowGUI/Selection.cs | 4 +- MapifyEditor/Trackage/CustomSwitch.cs | 5 +- MapifyEditor/Trackage/SwitchBase.cs | 87 +++--- MapifyEditor/Trackage/Track.cs | 11 +- .../Trackage/{Switch.cs => VanillaSwitch.cs} | 14 +- MapifyEditor/Utils/Extensions.cs | 6 - 16 files changed, 499 insertions(+), 361 deletions(-) rename MapifyEditor/Trackage/{Switch.cs => VanillaSwitch.cs} (67%) diff --git a/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs b/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs index 12b46810..78018e8f 100644 --- a/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs +++ b/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs @@ -7,14 +7,14 @@ public class SwitchUpdater : BuildUpdater { protected override void Update(Scenes scenes) { - foreach (Switch sw in scenes.railwayScene.GetAllComponents()) + foreach (VanillaSwitch sw in scenes.railwayScene.GetAllComponents()) { VanillaObject vanillaObject = sw.GetComponent(); vanillaObject.asset = sw.IsLeft - ? sw.standSide == Switch.StandSide.DIVERGING + ? sw.standSide == VanillaSwitch.StandSide.DIVERGING ? VanillaAsset.SwitchLeft : VanillaAsset.SwitchLeftOuterSign - : sw.standSide == Switch.StandSide.DIVERGING + : sw.standSide == VanillaSwitch.StandSide.DIVERGING ? VanillaAsset.SwitchRight : VanillaAsset.SwitchRightOuterSign; } diff --git a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs index f1efe9c6..df38cf25 100644 --- a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs @@ -1,5 +1,6 @@ #if UNITY_EDITOR using System.Collections.Generic; +using System.Linq; using Mapify.Editor; using Mapify.Editor.Utils; using Mapify.Editor.Validators; @@ -12,7 +13,12 @@ protected override IEnumerator Validate(Scenes scenes) { foreach (var switch_ in scenes.railwayScene.GetAllComponents()) { - foreach (var track in switch_.GetComponentsInChildren()) + if (switch_.Tracks.Length < 2) + { + yield return Result.Error("Switches must have at least 2 branches", switch_); + } + + foreach (var track in switch_.Tracks) { track.Snap(); @@ -21,6 +27,8 @@ protected override IEnumerator Validate(Scenes scenes) yield return Result.Error("Switches must have a track attached to all points", switch_); break; } + + //TODO valideer dat de tracks met de [0] aan elkaar zitten } } } diff --git a/MapifyEditor/Tools/ToolEnums.cs b/MapifyEditor/Tools/ToolEnums.cs index 1e3ccaa0..5484a97c 100644 --- a/MapifyEditor/Tools/ToolEnums.cs +++ b/MapifyEditor/Tools/ToolEnums.cs @@ -12,6 +12,12 @@ public enum TrackOrientation Right } + public enum SwitchType + { + Vanilla, + Custom + } + public enum SwitchPoint { Joint, @@ -85,14 +91,14 @@ public static SwitchPoint NextPoint(SwitchPoint switchPoint) return SwitchPoint.Joint; } - public static Switch.StandSide FlipStand(Switch.StandSide standSide) + public static VanillaSwitch.StandSide FlipStand(VanillaSwitch.StandSide standSide) { - if (standSide == Switch.StandSide.THROUGH) + if (standSide == VanillaSwitch.StandSide.THROUGH) { - return Switch.StandSide.DIVERGING; + return VanillaSwitch.StandSide.DIVERGING; } - return Switch.StandSide.THROUGH; + return VanillaSwitch.StandSide.THROUGH; } } } diff --git a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs index c58482f5..57787287 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs @@ -65,7 +65,7 @@ public static Vector3[] PreviewArcCurve(Vector3 attachPoint, Vector3 handlePosit return lines.ToArray(); } - public static Vector3[][] PreviewSwitch(Switch prefab, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint, + public static Vector3[][] PreviewSwitch(VanillaSwitch prefab, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint, int samples = 8) { var curves = TrackToolsHelper.GetSwitchBeziers(prefab, attachPoint, handlePosition, connectingPoint); @@ -77,7 +77,47 @@ public static Vector3[][] PreviewSwitch(Switch prefab, Vector3 attachPoint, Vect }; } - public static Vector3[][] PreviewYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewCustomSwitch(Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, int connectingPoint, float radius, float arc, float endGrade, + int samples = 8) + { + //TODO connectingPoint + + var curves = new Vector3[switchBranchesCount][]; + var length = radius * arc * Mathf.Deg2Rad; + + for (int branchIndex = 0; branchIndex < switchBranchesCount; branchIndex++) + { + if (switchBranchesCount % 2 == 1 && branchIndex == (switchBranchesCount-1) / 2) + { + //middle track + curves[branchIndex] = PreviewStraight(attachPoint, handlePosition, length, endGrade, out _); + continue; + } + + TrackOrientation trackOrientation; + float thisRadius; + + if (branchIndex < switchBranchesCount / 2.0) + { + //left of center + trackOrientation = TrackOrientation.Left; + thisRadius = (branchIndex + 1) * radius; + } + else + { + //right of center + trackOrientation = TrackOrientation.Right; + thisRadius = (switchBranchesCount - branchIndex) * radius; + } + + var thisArc = length / thisRadius * Mathf.Rad2Deg; + curves[branchIndex] = PreviewArcCurve(attachPoint, handlePosition, trackOrientation, thisRadius, thisArc, 360, endGrade, out _, samples); + } + + return curves; + } + + public static Vector3[][] PreviewYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples = 8) { if (yardOptions.Half) @@ -90,7 +130,7 @@ public static Vector3[][] PreviewYard(Switch leftPrefab, Switch rightPrefab, Vec } } - private static Vector3[][] PreviewFullYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + private static Vector3[][] PreviewFullYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples) { List results = new List(); @@ -296,7 +336,7 @@ private static Vector3[][] PreviewFullYard(Switch leftPrefab, Switch rightPrefab return results.ToArray(); } - private static Vector3[][] PreviewHalfYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + private static Vector3[][] PreviewHalfYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples) { List results = new List(); @@ -451,13 +491,13 @@ private static Vector3[][] PreviewHalfYard(Switch leftPrefab, Switch rightPrefab return results.ToArray(); } - private static Vector3[][] PreviewSwitchSprawl(Switch leftPrefab, Switch rightPrefab, YardOptions yardOptions, TrackOrientation orientation, + private static Vector3[][] PreviewSwitchSprawl(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, YardOptions yardOptions, TrackOrientation orientation, float trackDistance, bool mainSide, bool reverse, out Vector3[] trackPoints, int samples = 8) { List results = new List(); List points = new List(); - Switch current = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; + VanillaSwitch current = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; Vector3[][] temp = PreviewSwitch(current, Vector3.zero, Vector3.back, SwitchPoint.Joint, samples); results.AddRange(temp); @@ -557,7 +597,7 @@ public static Vector3[] PreviewConnect2(Vector3 p0, Vector3 h0, Vector3 p1, Vect samples); } - public static Vector3[][] PreviewCrossover(Switch prefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewCrossover(VanillaSwitch prefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, bool isTrailing, float switchDistance, int samples = 8) { List results = new List(); @@ -585,7 +625,7 @@ public static Vector3[][] PreviewCrossover(Switch prefab, Vector3 attachPoint, V return results.ToArray(); } - public static Vector3[][] PreviewScissorsCrossover(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewScissorsCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, float switchDistance, int samples = 8) { List results = new List(); @@ -611,7 +651,7 @@ public static Vector3[][] PreviewScissorsCrossover(Switch leftPrefab, Switch rig return results.ToArray(); } - public static Vector3[][] PreviewDoubleSlip(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewDoubleSlip(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float crossAngle, int samples = 8) { List results = new List(); diff --git a/MapifyEditor/Tools/TrackToolsCreator.cs b/MapifyEditor/Tools/TrackToolsCreator.cs index f452beb5..472edc9f 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.cs @@ -239,10 +239,10 @@ public static Track CreateArcCurve(Transform parent, Vector3 attachPoint, Vector // Switches. ///

- /// Instantiates a . + /// Instantiates a . /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new switch. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -251,15 +251,14 @@ public static Track CreateArcCurve(Transform parent, Vector3 attachPoint, Vector /// The instantiated . /// /// Derail Valley switches are static assets, and their tracks cannot be changed. - /// The switches are also always made at a grade of 0%. + /// The switches are also always made at a grade of 0%. /// - public static Switch CreateSwitch(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static VanillaSwitch CreateVanillaSwitch(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, SwitchPoint connectingPoint) { // Create switch object. - Switch s = Object.Instantiate(orientation == TrackOrientation.Left ? leftPrefab : rightPrefab); + VanillaSwitch s = Object.Instantiate(orientation == TrackOrientation.Left ? leftPrefab : rightPrefab, parent); s.gameObject.name = $"[Switch {orientation}]"; - s.transform.parent = parent; // Helper variables. Vector3 pivot; Quaternion rot; @@ -296,14 +295,62 @@ public static Switch CreateSwitch(Switch leftPrefab, Switch rightPrefab, Transfo return s; } + /// + /// Creates a switch without the limitations of the base game switches + /// + public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, + int connectingPoint, float radius, float arc, float endGrade) + { + //TODO connectingPoint + + var switchObject = new GameObject($"[Switch w/ {switchBranchesCount} branches]"); + var switchComponent = switchObject.AddComponent(); + //TODO + switchComponent.defaultBranch = 0; + switchComponent.standSide = CustomSwitch.StandSide.LEFT; + + var tracks = new Track[switchBranchesCount]; + var length = radius * arc * Mathf.Deg2Rad; + + for (int branchIndex = 0; branchIndex < switchBranchesCount; branchIndex++) + { + if (switchBranchesCount % 2 == 1 && branchIndex == (switchBranchesCount-1) / 2) + { + //middle track + tracks[branchIndex] = CreateStraight(switchObject.transform, attachPoint, handlePosition, length, endGrade); + continue; + } + + TrackOrientation trackOrientation; + float thisRadius; + + if (branchIndex < switchBranchesCount / 2.0) + { + //left of center + trackOrientation = TrackOrientation.Left; + thisRadius = (branchIndex + 1) * radius; + } + else + { + //right of center + trackOrientation = TrackOrientation.Right; + thisRadius = (switchBranchesCount - branchIndex) * radius; + } + + var thisArc = length / thisRadius * Mathf.Rad2Deg; + tracks[branchIndex] = CreateArcCurve(switchObject.transform, attachPoint, handlePosition, trackOrientation, thisRadius, thisArc, 360, endGrade); + } + + switchComponent.Tracks = tracks; + return switchComponent; + } // Yards. /// /// Creates a yard with similar shape to the ones present in the base game. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. - /// The base track prefab. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the first switch. /// Handle of the attachment point for the first switch. @@ -319,7 +366,7 @@ public static Switch CreateSwitch(Switch leftPrefab, Switch rightPrefab, Transfo /// The starting number of the sidings. /// Whether the track numbers should increase FROM the starting ID or decrease TO the starting ID. /// An array with all sidings. - /// An array with the es at each end of the yard. + /// An array with the es at each end of the yard. /// /// For yards with the same number of tracks on both sides, it is recommended to set to true. /// This allows for yards with a shorter overall length, and with similar lengths on both sides. If the number of sides is different, @@ -341,8 +388,8 @@ public static Switch CreateSwitch(Switch leftPrefab, Switch rightPrefab, Transfo /// total tracks, will use the numbers 3, 4, 5, 6, and 7 always, but the order will be reversed. /// /// - /// - public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + /// + public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, bool half, bool alternateSides, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -363,8 +410,8 @@ public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transfo /// /// Creates a yard with similar shape to the ones present in the base game. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The base track prefab. /// The parent for the new track. /// Attachment point for the first switch. @@ -373,9 +420,9 @@ public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transfo /// The distance between the sidings. /// Settings for the creation of the yard. /// An array with all sidings. - /// An array with the es at each end of the yard. - /// - public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + /// An array with the es at each end of the yard. + /// + public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, out Track[] sidings) { return CreateYard(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, trackDistance, @@ -383,7 +430,7 @@ public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transfo yardOptions.StationId, yardOptions.YardId, yardOptions.StartTrackId, yardOptions.ReverseNumbers, out sidings); } - private static Switch[] CreateFullYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + private static VanillaSwitch[] CreateFullYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, bool alternateSides, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -393,9 +440,9 @@ private static Switch[] CreateFullYard(Switch leftPrefab, Switch rightPrefab, Tr } Vector3 dir = (attachPoint - handlePosition).normalized; - Switch start; - Switch end; - Switch s; + VanillaSwitch start; + VanillaSwitch end; + VanillaSwitch s; Track t; // Points to connect each yard track. @@ -598,10 +645,10 @@ private static Switch[] CreateFullYard(Switch leftPrefab, Switch rightPrefab, Tr Object.DestroyImmediate(endObj); sidings = storageTracks.ToArray(); - return new Switch[] { start, end }; + return new VanillaSwitch[] { start, end }; } - private static Switch[] CreateHalfYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + private static VanillaSwitch[] CreateHalfYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -619,8 +666,8 @@ private static Switch[] CreateHalfYard(Switch leftPrefab, Switch rightPrefab, Tr rotDir = -rotDir; } - Switch start; - Switch s; + VanillaSwitch start; + VanillaSwitch s; Track t; // Points to connect each yard track. @@ -806,20 +853,20 @@ void MoveDistance(Vector3 distance) Object.DestroyImmediate(startObj); sidings = storageTracks.ToArray(); - return new Switch[] { start }; + return new VanillaSwitch[] { start }; } // Switches on each side of the yard. - private static List CreateSwitchSprawl(Switch leftPrefab, Switch rightPrefab, Transform parent, - Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, int sideTracks, float trackDistance, out Switch start, + private static List CreateSwitchSprawl(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, + Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, int sideTracks, float trackDistance, out VanillaSwitch start, out Track[] endMerge) { // Starting switch. // Switch stands are all on the outside of the yard. - start = CreateSwitch(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, SwitchPoint.Joint); - start.standSide = Switch.StandSide.DIVERGING; - start.defaultState = Switch.StandSide.THROUGH; - Switch s = start; + start = CreateVanillaSwitch(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, SwitchPoint.Joint); + start.standSide = VanillaSwitch.StandSide.DIVERGING; + start.defaultState = VanillaSwitch.StandSide.THROUGH; + VanillaSwitch s = start; BezierPoint now = s.GetDivergingPoint(); // Points where each track will be. @@ -838,12 +885,12 @@ private static List CreateSwitchSprawl(Switch leftPrefab, Switch ri for (int i = 1; i < sideTracks; i++) { t = CreateStraight(parent, now.position, now.globalHandle1, length, 0); - s = CreateSwitch(leftPrefab, rightPrefab, parent, t.Curve[1].position, t.Curve[1].globalHandle1, + s = CreateVanillaSwitch(leftPrefab, rightPrefab, parent, t.Curve[1].position, t.Curve[1].globalHandle1, orientation, SwitchPoint.Joint); now = s.GetThroughPoint(); points.Add(s.GetDivergingPoint()); - s.standSide = Switch.StandSide.THROUGH; - s.defaultState = Switch.StandSide.THROUGH; + s.standSide = VanillaSwitch.StandSide.THROUGH; + s.defaultState = VanillaSwitch.StandSide.THROUGH; length = sideL; } @@ -964,16 +1011,16 @@ public static BufferStop CreateBuffer(BufferStop prefab, Transform parent, Vecto } /// - /// Instantiates the diverging track of a only. + /// Instantiates the diverging track of a only. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. /// Which side the curve turns to. /// The instantiated . - public static Track CreateSwitchCurve(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static Track CreateSwitchCurve(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, SwitchPoint connectingPoint) { Track t; @@ -985,7 +1032,7 @@ public static Track CreateSwitchCurve(Switch leftPrefab, Switch rightPrefab, Tra { t = Object.Instantiate(rightPrefab.DivergingTrack); } - Switch s = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; + VanillaSwitch s = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; Vector3 offset = -t.Curve[0].localPosition; @@ -1090,8 +1137,8 @@ public static Track CreateConnect2Point(Transform parent, Vector3 p0, Vector3 p1 /// /// Creates a crossover. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -1099,8 +1146,8 @@ public static Track CreateConnect2Point(Transform parent, Vector3 p0, Vector3 p1 /// The distance between the parallel tracks. /// Whether to the crossover is in front or comes from behind. /// The distance between the switches on the same track. - /// An array with the at the attachment point (index 0) and the other (index 1). - public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Transform parent, + /// An array with the at the attachment point (index 0) and the other (index 1). + public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, bool trailing, float switchDistance) { @@ -1119,7 +1166,7 @@ public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Tr sp = SwitchPoint.Joint; } - Switch s1 = CreateSwitch(leftPrefab, rightPrefab, crossObj.transform, + VanillaSwitch s1 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, attachPoint, handlePosition, orientation, sp); BezierPoint bp1 = s1.GetDivergingPoint(); @@ -1132,20 +1179,20 @@ public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Tr point = point + (dir * switchDistance) + offset; - Switch s2 = CreateSwitch(leftPrefab, rightPrefab, crossObj.transform, + VanillaSwitch s2 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, point, point - dir, orientation, SwitchPoint.Through); BezierPoint bp2 = s2.GetDivergingPoint(); CreateConnect2Point(crossObj.transform, bp1, bp2, false, false, 1.0f); - return new Switch[] { s1, s2 }; + return new VanillaSwitch[] { s1, s2 }; } /// /// Creates a scissors crossover (2 crossovers in the same place). /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -1153,9 +1200,9 @@ public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Tr /// The distance between the parallel tracks. /// The distance between the switches on the same track. /// - /// An array of es in the following order: [0] attach [1] opposite to 0 [2] next to 0 [3] opposite to 2. + /// An array of es in the following order: [0] attach [1] opposite to 0 [2] next to 0 [3] opposite to 2. /// - public static Switch[] CreateScissorsCrossover(Switch leftPrefab, Switch rightPrefab, Transform parent, + public static VanillaSwitch[] CreateScissorsCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, float switchDistance) { // Create 2 crossovers offset from eachother. @@ -1184,23 +1231,23 @@ public static Switch[] CreateScissorsCrossover(Switch leftPrefab, Switch rightPr CreateConnect2Point(t1, c2[0].GetThroughPoint(), c1[1].GetThroughPoint(), false, false, 1.0f); // Return all 4 switches. - return new Switch[] { c1[0], c1[1], c2[0], c2[1] }; + return new VanillaSwitch[] { c1[0], c1[1], c2[0], c2[1] }; } /// /// Creates a double slip. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. /// The side to which the first switch turns to. /// The angle at which the 2 middle tracks cross eachother. /// - /// An array of es in the following order: [0] attach [1] diverging attach [2] opposite to 0 [3] opposite to 1. + /// An array of es in the following order: [0] attach [1] diverging attach [2] opposite to 0 [3] opposite to 1. /// - public static Switch[] CreateDoubleSlip(Switch leftPrefab, Switch rightPrefab, Transform parent, + public static VanillaSwitch[] CreateDoubleSlip(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float crossAngle) { // Create the parent object. @@ -1217,10 +1264,10 @@ public static Switch[] CreateDoubleSlip(Switch leftPrefab, Switch rightPrefab, T // First side. // Creates a switch, a curve, and then another switch connected through its diverging track. - Switch s00 = CreateSwitch(leftPrefab, rightPrefab, obj.transform, attachPoint, handlePosition, orientation, SwitchPoint.Joint); + VanillaSwitch s00 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, attachPoint, handlePosition, orientation, SwitchPoint.Joint); bp = s00.GetDivergingPoint(); bp = CreateArcCurve(obj.transform, bp.position, bp.globalHandle1, orientation, radius, arc, 180.0f, 0).Curve.Last(); - Switch s01 = CreateSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, + VanillaSwitch s01 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, FlipOrientation(orientation), SwitchPoint.Diverging); // Calculate the middle crossover's position by interesecting the 2 through tracks. @@ -1233,16 +1280,16 @@ public static Switch[] CreateDoubleSlip(Switch leftPrefab, Switch rightPrefab, T Vector3 next = MathHelper.MirrorAround(attachPoint, mid); // Repeat the process for the other side. - Switch s10 = CreateSwitch(leftPrefab, rightPrefab, obj.transform, next, next + dir, orientation, SwitchPoint.Joint); + VanillaSwitch s10 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, next, next + dir, orientation, SwitchPoint.Joint); bp = s10.GetDivergingPoint(); bp = CreateArcCurve(obj.transform, bp.position, bp.globalHandle1, orientation, radius, arc, 180.0f, 0).Curve.Last(); - Switch s11 = CreateSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, + VanillaSwitch s11 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, FlipOrientation(orientation), SwitchPoint.Diverging); CreateConnect2Point(obj.transform, s00.GetThroughPoint(), s10.GetThroughPoint(), false, false, 1.0f); CreateConnect2Point(obj.transform, s01.GetThroughPoint(), s11.GetThroughPoint(), false, false, 1.0f); - return new Switch[] { s00, s01, s10, s11 }; + return new VanillaSwitch[] { s00, s01, s10, s11 }; } /// diff --git a/MapifyEditor/Tools/TrackToolsHelper.cs b/MapifyEditor/Tools/TrackToolsHelper.cs index b491651f..028f7276 100644 --- a/MapifyEditor/Tools/TrackToolsHelper.cs +++ b/MapifyEditor/Tools/TrackToolsHelper.cs @@ -1,3 +1,4 @@ +using System.Linq; using Mapify.Editor.Utils; using UnityEditor; using UnityEngine; @@ -43,11 +44,10 @@ public static float CalculateHeightDifference(float startGrade, float endGrade, /// The handle of the attachment point. /// Which point of the switch connects to the attachment point. /// An array with 2 arrays representing the through track (index 0) and diverging track (index 1). - public static SimpleBezier[] GetSwitchBeziers(Switch s, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint) + public static SimpleBezier[] GetSwitchBeziers(VanillaSwitch s, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint) { // Create the original beziers. - SimpleBezier[] curves = new SimpleBezier[] - { + SimpleBezier[] curves = { new SimpleBezier( s.GetJointPoint().position, s.GetJointPoint().globalHandle2, @@ -101,19 +101,19 @@ public static SimpleBezier[] GetSwitchBeziers(Switch s, Vector3 attachPoint, Vec } /// - /// Calculates the radius of the diverging track of a . + /// Calculates the radius of the diverging track of a . /// - public static float CalculateSwitchRadius(Switch s) + public static float CalculateSwitchRadius(VanillaSwitch s) { BezierPoint bp = s.GetDivergingPoint(); return bp.position.z / Mathf.Sin(Mathf.Atan(Mathf.Abs(bp.handle1.x / bp.handle1.z))); } /// - /// Calculates the angle at the end of the diverging track of a . + /// Calculates the angle at the end of the diverging track of a . /// /// The angle in radians. - public static float CalculateSwitchAngle(Switch s) + public static float CalculateSwitchAngle(VanillaSwitch s) { BezierPoint bp = s.GetDivergingPoint(); return Mathf.Atan(Mathf.Abs(bp.handle1.x / bp.handle1.z)); @@ -121,6 +121,7 @@ public static float CalculateSwitchAngle(Switch s) /// /// Returns the speed limit shown on track speed signs for a given radius. + /// source: DV.Signs.SignPlacer.GetMaxSpeedForRadius /// /// The speed in km/h. public static float GetMaxSpeedForRadiusGame(float radius) @@ -196,7 +197,7 @@ public static Vector3[] GetSmoothBezierToConnectSimple(Vector3 attachPosition, V handle = newTarget + (handle - newTarget).normalized * length; - return new Vector3[] { attachPosition, + return new[] { attachPosition, attachPosition + dir * length, handle, newTarget }; @@ -237,7 +238,7 @@ public static Vector3[] GetSmoothBezierToConnectComplex(Vector3 attachPosition, length *= 1 + MathHelper.ArcToBezierHandleLength(angle * Mathf.Deg2Rad); - return new Vector3[] { attachPosition, + return new[] { attachPosition, attachPosition + dir * length, newTarget - dirNext * length, newTarget }; @@ -264,7 +265,7 @@ public static Vector3[] GetSmoothBezierToConnectMix(Vector3 attachPosition, Vect Vector3[] s = GetSmoothBezierToConnectSimple(attachPosition, attachHandle, newTarget); Vector3[] c = GetSmoothBezierToConnectComplex(attachPosition, attachHandle, newTarget); - return new Vector3[] {Vector3.Lerp(s[0], c[0], mix), + return new[] {Vector3.Lerp(s[0], c[0], mix), Vector3.Lerp(s[1], c[1], mix), Vector3.Lerp(s[2], c[2], mix), Vector3.Lerp(s[3], c[3], mix) }; @@ -275,7 +276,7 @@ public static Vector3[] GetSmoothBezierToConnectMix(Vector3 attachPosition, Vect Vector3[] s = GetSmoothBezierToConnectSimple(attachPosition, attachHandle, newTarget, maxAngle); Vector3[] c = GetSmoothBezierToConnectComplex(attachPosition, attachHandle, newTarget, maxAngle); - return new Vector3[] {Vector3.Lerp(s[0], c[0], mix), + return new[] {Vector3.Lerp(s[0], c[0], mix), Vector3.Lerp(s[1], c[1], mix), Vector3.Lerp(s[2], c[2], mix), Vector3.Lerp(s[3], c[3], mix) }; @@ -337,7 +338,7 @@ public static bool CheckForTrackSnap(Vector3 point, float radius, out Vector3 sn /// public static Vector3[] ReverseCurve(Vector3[] curve) { - return new Vector3[] { curve[3], + return new[] { curve[3], curve[2], curve[1], curve[0] }; @@ -388,7 +389,7 @@ internal static void CopyTrackFields(Track original, Track other) } // The length of the straight section (middle track) of a crossover. - internal static float CalculateCrossoverDistance(Switch switchPrefab, float trackDistance) + internal static float CalculateCrossoverDistance(VanillaSwitch switchPrefab, float trackDistance) { float targetDistance = trackDistance - (2.0f * Mathf.Abs(switchPrefab.DivergingTrack.Curve[1].position.x)); Vector3 handle = switchPrefab.DivergingTrack.Curve[1].handle1; @@ -397,7 +398,7 @@ internal static float CalculateCrossoverDistance(Switch switchPrefab, float trac } // The length of the straight section connecting the middle switch to the outer switches in a yard. - internal static float CalculateLengthFromDistanceYardCentre(Switch switchPrefab, float trackDistance) + internal static float CalculateLengthFromDistanceYardCentre(VanillaSwitch switchPrefab, float trackDistance) { float targetDistance = trackDistance - Mathf.Abs(switchPrefab.DivergingTrack.Curve[1].position.x); @@ -410,7 +411,7 @@ internal static float CalculateLengthFromDistanceYardCentre(Switch switchPrefab, } // The length of the straight section connecting the outer switches in a yard. - internal static float CalculateLengthFromDistanceYardSides(Switch switchPrefab, float trackDistance) + internal static float CalculateLengthFromDistanceYardSides(VanillaSwitch switchPrefab, float trackDistance) { float targetDistance = trackDistance; @@ -445,7 +446,7 @@ internal static float CalculateYardMidSwitchDistance(float trackDistance) /// This will only look in the default directory (Mapify folder in the Assets root). /// If a parameter is not null, it will not be replaced. /// - public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, ref Switch switchLeft, ref Switch switchRight, ref Turntable turntable) + public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, ref VanillaSwitch switchLeft, ref VanillaSwitch switchRight, ref Turntable turntable) { string[] guids; @@ -475,7 +476,7 @@ public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, if (guids.Length > 0) { - switchLeft = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); + switchLeft = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); } } @@ -485,7 +486,7 @@ public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, if (guids.Length > 0) { - switchRight = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); + switchRight = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); } } diff --git a/MapifyEditor/Tools/TrackToolsWindow.cs b/MapifyEditor/Tools/TrackToolsWindow.cs index 621d7374..98e7b52d 100644 --- a/MapifyEditor/Tools/TrackToolsWindow.cs +++ b/MapifyEditor/Tools/TrackToolsWindow.cs @@ -45,7 +45,7 @@ public static void ShowWindow() public Track CurrentTrack => _selectedTracks.Length > 0 ? _selectedTracks[0] : null; public BezierPoint CurrentPoint => _selectedPoints.Length > 0 ? _selectedPoints[0] : null; - public Switch CurrentSwitch { get; private set; } + public VanillaSwitch CurrentSwitch { get; private set; } public Turntable CurrentTurntable { get; private set; } #endregion @@ -146,7 +146,7 @@ private void PrepareSelection() { _selectionType = SelectionType.BezierPoint; } - else if (go.TryGetComponent(out Switch s)) + else if (go.TryGetComponent(out VanillaSwitch s)) { _selectionType = SelectionType.Switch; CurrentSwitch = s; @@ -207,8 +207,16 @@ public void CreateTrack(Vector3 position, Vector3 handle) Undo.RegisterCreatedObjectUndo(t.gameObject, "Created Curve"); break; case TrackPiece.Switch: - go = TrackToolsCreator.CreateSwitch(LeftSwitch, RightSwitch, _currentParent, position, handle, - _orientation, _connectingPoint).gameObject; + if (_switchType == SwitchType.Vanilla) + { + go = TrackToolsCreator.CreateVanillaSwitch(LeftSwitch, RightSwitch, _currentParent, position, handle, + _orientation, _connectingPointVanilla).gameObject; + } + else + { + go = TrackToolsCreator.CreateCustomSwitch(_currentParent, position, handle, _switchBranchesCount, _connectingPointCustom, _radius, _arc, _endGrade).gameObject; + } + SelectGameObject(go); Undo.RegisterCreatedObjectUndo(go, "Created Switch"); break; @@ -256,7 +264,7 @@ public void CreateSpecial(Vector3 attachPoint, Vector3 handlePosition) break; case SpecialTrackPiece.SwitchCurve: t = TrackToolsCreator.CreateSwitchCurve(LeftSwitch, RightSwitch, _currentParent, attachPoint, handlePosition, - _orientation, _connectingPoint); + _orientation, (SwitchPoint)_connectingPointVanilla); ApplySettingsToTrack(t); SelectTrack(t); Undo.RegisterCreatedObjectUndo(t.gameObject, "Created Switch Curve"); @@ -392,7 +400,7 @@ public void ResetCreationSettings(bool all) } if (all || _currentPiece == TrackPiece.Switch) { - _connectingPoint = SwitchPoint.Joint; + _connectingPointVanilla = SwitchPoint.Joint; } if (all || _currentPiece == TrackPiece.Yard) { @@ -565,12 +573,12 @@ private void RemakeAndRepaint() SceneView.RepaintAll(); } - private Switch GetCurrentSwitchPrefab() + private VanillaSwitch GetCurrentSwitchPrefab() { return IsLeft ? LeftSwitch : RightSwitch; } - private Switch GetSwitch(TrackOrientation orientation) + private VanillaSwitch GetSwitch(TrackOrientation orientation) { if (orientation == TrackOrientation.Left) { diff --git a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs index d632c10d..d064b030 100644 --- a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs +++ b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs @@ -73,123 +73,123 @@ private void CreatePiecePreviews() case SelectionType.Turntable: CacheTrack(CurrentTurntable.Track); break; - default: - break; } switch (_currentPiece) { case TrackPiece.Straight: - foreach (var cache in _newCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewStraight( - cache.Attach.Position, cache.Attach.Handle, - _length, _endGrade, out cache.Points, _sampleCount) }; - } - foreach (var cache in _nextCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewStraight( - cache.Attach.Position, cache.Attach.Handle, - _length, _endGrade, out cache.Points, _sampleCount) }; - } - foreach (var cache in _backCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewStraight( - cache.Attach.Position, cache.Attach.Handle, - _length, _endGrade, out cache.Points, _sampleCount) }; - } + { + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); break; - case TrackPiece.Curve: - foreach (var cache in _newCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewArcCurve( - cache.Attach.Position, cache.Attach.Handle, - _orientation, _radius, _arc, _maxArcPerPoint, _endGrade, out cache.Points, _sampleCount) }; - } - foreach (var cache in _nextCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewArcCurve( - cache.Attach.Position, cache.Attach.Handle, - _orientation, _radius, _arc, _maxArcPerPoint, _endGrade, out cache.Points, _sampleCount) }; - } - foreach (var cache in _backCache) + + void FillCache(ref List caches) { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewArcCurve( - cache.Attach.Position, cache.Attach.Handle, - _orientation, _radius, _arc, _maxArcPerPoint, _endGrade, out cache.Points, _sampleCount) }; + foreach (var cache in caches) + { + cache.Lines = new[] + { TrackToolsCreator.Previews.PreviewStraight( + cache.Attach.Position, cache.Attach.Handle, + _length, _endGrade, out cache.Points, _sampleCount) }; + } } + } + case TrackPiece.Curve: + { + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); break; - case TrackPiece.Switch: - if (LeftSwitch && RightSwitch) + + void FillCache(ref List caches) { - foreach (var cache in _newCache) + foreach (var cache in caches) { - cache.Lines = TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount); + cache.Lines = new[] + { + TrackToolsCreator.Previews.PreviewArcCurve( + cache.Attach.Position, cache.Attach.Handle, + _orientation, _radius, _arc, _maxArcPerPoint, _endGrade, out cache.Points, _sampleCount) + }; } - foreach (var cache in _nextCache) + } + } + case TrackPiece.Switch: + if (_switchType == SwitchType.Vanilla) + { + if (!LeftSwitch || !RightSwitch) break; + + void FillCache(ref List caches) { - cache.Lines = TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount); + foreach (var cache in caches) + { + cache.Lines = TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), + cache.Attach.Position, cache.Attach.Handle, + _connectingPointVanilla, _sampleCount); + } } - foreach (var cache in _backCache) + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + } + else + { + void FillCache(ref List caches) { - cache.Lines = TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount); + foreach (var cache in caches) + { + cache.Lines = TrackToolsCreator.Previews.PreviewCustomSwitch( + cache.Attach.Position, cache.Attach.Handle, _switchBranchesCount, _connectingPointCustom, _radius, _arc, _endGrade, _sampleCount); + } } + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); } + break; case TrackPiece.Yard: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewYard(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _yardOptions, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewYard(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _yardOptions, _sampleCount); - } - foreach (var cache in _backCache) + foreach (var cache in caches) { cache.Lines = TrackToolsCreator.Previews.PreviewYard(LeftSwitch, RightSwitch, cache.Attach.Position, cache.Attach.Handle, _orientation, _trackDistance, _yardOptions, _sampleCount); } } - break; + } case TrackPiece.Turntable: - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewTurntable( - cache.Attach.Position, cache.Attach.Handle, - _turntableOptions, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewTurntable( - cache.Attach.Position, cache.Attach.Handle, - _turntableOptions, _sampleCount); - } - foreach (var cache in _backCache) + { + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - cache.Lines = TrackToolsCreator.Previews.PreviewTurntable( - cache.Attach.Position, cache.Attach.Handle, - _turntableOptions, _sampleCount); + foreach (var cache in caches) + { + cache.Lines = TrackToolsCreator.Previews.PreviewTurntable( + cache.Attach.Position, cache.Attach.Handle, + _turntableOptions, _sampleCount); + } } - break; + } case TrackPiece.Special: SpecialPreviews(); break; - default: - break; } } @@ -200,31 +200,25 @@ private void SpecialPreviews() case SpecialTrackPiece.Buffer: break; case SpecialTrackPiece.SwitchCurve: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) + foreach (var cache in caches) { cache.Lines = new Vector3[1][]; System.Array.Copy(TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount), 1, cache.Lines, 0, 1); - } - foreach (var cache in _nextCache) - { - cache.Lines = new Vector3[1][]; - System.Array.Copy(TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount), 1, cache.Lines, 0, 1); - } - foreach (var cache in _backCache) - { - cache.Lines = new Vector3[1][]; - System.Array.Copy(TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount), 1, cache.Lines, 0, 1); + _connectingPointVanilla, _sampleCount), 1, cache.Lines, 0, 1); } } - break; + } case SpecialTrackPiece.Connect2: { BezierPoint p0 = null; @@ -287,76 +281,62 @@ private void SpecialPreviews() } break; case SpecialTrackPiece.Crossover: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewCrossover(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _isTrailing, _switchDistance, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewCrossover(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _isTrailing, _switchDistance, _sampleCount); - } - foreach (var cache in _backCache) + foreach (var cache in caches) { cache.Lines = TrackToolsCreator.Previews.PreviewCrossover(GetCurrentSwitchPrefab(), cache.Attach.Position, cache.Attach.Handle, _orientation, _trackDistance, _isTrailing, _switchDistance, _sampleCount); } } - break; + } case SpecialTrackPiece.ScissorsCrossover: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewScissorsCrossover(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _switchDistance, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewScissorsCrossover(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _switchDistance, _sampleCount); - } - foreach (var cache in _backCache) + foreach (var cache in caches) { cache.Lines = TrackToolsCreator.Previews.PreviewScissorsCrossover(LeftSwitch, RightSwitch, cache.Attach.Position, cache.Attach.Handle, _orientation, _trackDistance, _switchDistance, _sampleCount); } } - break; + } case SpecialTrackPiece.DoubleSlip: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewDoubleSlip(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _crossAngle, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewDoubleSlip(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _crossAngle, _sampleCount); - } - foreach (var cache in _backCache) + foreach (var cache in caches) { cache.Lines = TrackToolsCreator.Previews.PreviewDoubleSlip(LeftSwitch, RightSwitch, cache.Attach.Position, cache.Attach.Handle, _orientation, _crossAngle, _sampleCount); } } - break; - default: - break; + } } } @@ -384,18 +364,6 @@ private void CacheTrack(Track t) _backCache[0].Tooltip = PreviewPointCache.BackString; } } - - private void CreateEditingPreviews() - { - switch (_editingMode) - { - case EditingMode.InsertPoint: - - break; - default: - break; - } - } } } #endif diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs index b21b5ab8..2a3e1826 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs @@ -1,3 +1,4 @@ +using System; using Mapify.Editor.Tools.OptionData; using Mapify.Editor.Utils; using UnityEditor; @@ -43,7 +44,11 @@ public partial class TrackToolsWindow private bool _changeArc = false; // Switches. - private SwitchPoint _connectingPoint = SwitchPoint.Joint; + private SwitchType _switchType = SwitchType.Vanilla; + private int _switchBranchesCount = 2; + private SwitchPoint _connectingPointVanilla = SwitchPoint.Joint; + // 0 -> joint point, 1 - ∞ -> branch point + private int _connectingPointCustom = 0; // Yards. private YardOptions _yardOptions = YardOptions.DefaultOptions; @@ -297,16 +302,19 @@ private void DrawStraightOptions() new GUIContent($"{TrackToolsHelper.CalculateHeightDifference(0, _endGrade, _length):F3}m")); } - private void DrawCurveOptions() + private void DrawCurveOptions(bool CustomSwitchBranch = false) { - DrawOrientationGUI("Which side the curve turns to"); + if (!CustomSwitchBranch) + { + DrawOrientationGUI("Which side the curve turns to"); + } EditorGUILayout.BeginHorizontal(); _radius = EditorGUILayout.FloatField(new GUIContent("Radius", "Radius of the curve"), _radius); - if (GUILayout.Button(new GUIContent("Use switch radius", "Sets the radius to the one of switch curves"), + if (!CustomSwitchBranch && GUILayout.Button(new GUIContent("Use switch radius", "Sets the radius to the one of switch curves"), GUILayout.MaxWidth(140))) { if (LeftSwitch) @@ -326,10 +334,14 @@ private void DrawCurveOptions() EditorGUILayout.EndHorizontal(); _arc = EditorGUILayout.Slider(new GUIContent("Arc", "Angle of the curve"), - _arc, 0.0f, 180.0f); - _maxArcPerPoint = EditorGUILayout.Slider(new GUIContent("Max arc per point", - "How big an arc can be before the curve is split."), - _maxArcPerPoint, 0.0f, 90.0f); + _arc, 0.1f, 180.0f); + if (!CustomSwitchBranch) + { + _maxArcPerPoint = EditorGUILayout.Slider(new GUIContent("Max arc per point", + "How big an arc can be before the curve is split."), + _maxArcPerPoint, 0.0f, 90.0f); + } + _endGrade = EditorGUILayout.FloatField( new GUIContent("End grade", "How steep should the track's other end be"), _endGrade * 100.0f) / 100.0f; @@ -343,6 +355,9 @@ private void DrawCurveOptions() float length = EditorGUILayout.FloatField(new GUIContent("Approx. length", "Approximated total length of the curve"), _radius * _arc * Mathf.Deg2Rad); + //length of zero makes no sense and will cause exceptions + if(length < 0.1f) length = 0.1f; + bool changed = EditorGUI.EndChangeCheck(); _changeArc = EditorGUILayout.ToggleLeft(new GUIContent("Change arc", @@ -353,7 +368,7 @@ private void DrawCurveOptions() { if (_changeArc) { - _arc = (length / _radius) * Mathf.Rad2Deg; + _arc = length / _radius * Mathf.Rad2Deg; } else { @@ -369,14 +384,21 @@ private void DrawCurveOptions() private void DrawSwitchOptions() { - if (!Require(LeftSwitch, "Left switch prefab") || - !Require(RightSwitch, "Right switch prefab")) + _switchType = (SwitchType)EditorGUILayout.EnumPopup(new GUIContent("Switch type", + "Vanilla switch (like in the base game) or a custom switch (create your own shape)"), + _switchType); + + switch (_switchType) { - return; + case SwitchType.Vanilla: + DrawVanillaSwitchOptions(); + break; + case SwitchType.Custom: + DrawCustomSwitchOptions(); + break; + default: + throw new ArgumentOutOfRangeException(); } - - DrawOrientationGUI("Which side the diverging track turns to"); - DrawSwitchPointGUI(); } private void DrawYardOptions() @@ -535,9 +557,9 @@ private void DrawSwitchCurveOptions() } DrawOrientationGUI("Choose which side the track diverges to"); - DrawSwitchPointGUI(); + DrawVanillaSwitchPointGUI(); - if (_connectingPoint == SwitchPoint.Through) + if (_connectingPointVanilla == SwitchPoint.Through) { EditorGUILayout.HelpBox("The selected point has no connection with " + "the track, you should select one of the others.", MessageType.Warning); diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs index 9c63a4c3..b69b1f3c 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs @@ -1,3 +1,5 @@ +using System; +using System.Collections.Generic; using Mapify.Editor.Utils; using UnityEditor; using UnityEngine; @@ -11,8 +13,8 @@ public partial class TrackToolsWindow // Track prefabs. private bool _showPrefabs = false; public BufferStop BufferPrefab; - public Switch LeftSwitch; - public Switch RightSwitch; + public VanillaSwitch LeftSwitch; + public VanillaSwitch RightSwitch; public Turntable TurntablePrefab; // Settings. @@ -155,22 +157,71 @@ private void DrawOrientationGUI(string tooltip) EditorGUILayout.EndHorizontal(); } + private void DrawVanillaSwitchOptions() + { + if (!Require(LeftSwitch, "Left switch prefab") || + !Require(RightSwitch, "Right switch prefab")) + { + return; + } + DrawOrientationGUI("Which side the diverging track turns to"); + DrawVanillaSwitchPointGUI(); + } + // SwitchPoint enum dropdown with a button to swap options easily. - private void DrawSwitchPointGUI() + private void DrawVanillaSwitchPointGUI() { EditorGUILayout.BeginHorizontal(); - _connectingPoint = (SwitchPoint)EditorGUILayout.EnumPopup(new GUIContent("Connecting point", - "Which of the 3 switch points should connect to the current track"), - _connectingPoint); + _connectingPointVanilla = (SwitchPoint)EditorGUILayout.EnumPopup(new GUIContent("Connecting point", + "Which of the 3 switch points should connect to the current track"), + _connectingPointVanilla); if (GUILayout.Button(new GUIContent("Next point", "Swaps between the 3 switch points."), GUILayout.MaxWidth(140))) { - _connectingPoint = NextPoint(_connectingPoint); + _connectingPointVanilla = NextPoint(_connectingPointVanilla); } EditorGUILayout.EndHorizontal(); } + private void DrawCustomSwitchOptions() + { + _switchBranchesCount = EditorGUILayout.IntField(new GUIContent("Branches", "How many branches the switch has (at least 2)"), _switchBranchesCount); + if (_switchBranchesCount < 2) _switchBranchesCount = 2; + + EditorGUILayout.BeginHorizontal(); + + var displayedOptions = new GUIContent[_switchBranchesCount + 1]; + displayedOptions[0] = new GUIContent("Joint point"); + for (int i = 0; i < _switchBranchesCount; i++) + { + displayedOptions[i+1] = new GUIContent($"Branch out {i}"); + } + + var optionValues = new int[displayedOptions.Length]; + for (int i = 0; i < displayedOptions.Length; i++) + { + optionValues[i] = i; + } + + _connectingPointCustom = EditorGUILayout.IntPopup( + new GUIContent("Connecting point", "Which of the switch points should connect to the current track"), + _connectingPointCustom, + displayedOptions, + optionValues, + EditorStyles.popup + ); + + if (GUILayout.Button(new GUIContent("Next point", "Swaps between the switch points."), GUILayout.MaxWidth(120))) + { + _connectingPointCustom = (_connectingPointCustom+1) % (_switchBranchesCount+1); + } + + EditorGUILayout.EndHorizontal(); + + DrawCurveOptions(true); + } + // Orientation enum dropdown with a button to swap options easily. private void DrawSwitchDistanceGUI() { diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs index 671698fd..fb8de2f1 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs @@ -77,7 +77,7 @@ private void DrawTrackSelection() if (GUILayout.Button(new GUIContent("Swap tracks", "Swaps the selected track between the through and diverging tracks")) && isSwitch) { - Switch s = CurrentTrack.GetComponentInParent(); + VanillaSwitch s = CurrentTrack.GetComponentInParent(); if (CurrentTrack == s.ThroughTrack) { @@ -186,7 +186,7 @@ private void DrawSwitchSelection() new GUIContent($"{(CurrentSwitch.IsLeft ? "Left" : "Right")}")); EditorGUILayout.BeginHorizontal(); - CurrentSwitch.defaultState = (Switch.StandSide)EditorGUILayout.EnumPopup(new GUIContent("Currently set to", + CurrentSwitch.defaultState = (VanillaSwitch.StandSide)EditorGUILayout.EnumPopup(new GUIContent("Currently set to", "The switch state when exporting"), CurrentSwitch.defaultState); diff --git a/MapifyEditor/Trackage/CustomSwitch.cs b/MapifyEditor/Trackage/CustomSwitch.cs index 91c22e9c..fa5c304b 100644 --- a/MapifyEditor/Trackage/CustomSwitch.cs +++ b/MapifyEditor/Trackage/CustomSwitch.cs @@ -11,9 +11,12 @@ public enum StandSide } [Tooltip("Which way the switch should be flipped by default")] - public int defaultBranch = 0; + public byte defaultBranch = 0; [Tooltip("Which side of the switch the stand will appear on")] public StandSide standSide; + + [Tooltip("Tracks in the switch, from left to right")] + public new Track[] Tracks; } } diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs index ee28afc3..5af7fdd8 100644 --- a/MapifyEditor/Trackage/SwitchBase.cs +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -10,48 +10,49 @@ public abstract class SwitchBase: MonoBehaviour { public Track[] Tracks => gameObject.GetComponentsInChildren(); - protected void Snap() - { -#if UNITY_EDITOR - BezierPoint[] bezierPoints = FindObjectsOfType(); - GameObject[] selectedObjects = Selection.gameObjects; - bool isSelected = selectedObjects.Contains(gameObject); - - TrySnap(bezierPoints, isSelected, transform); - foreach (var track in Tracks) - { - TrySnap(bezierPoints, isSelected, track.Curve.Last().transform); - } -#endif - } - - private void TrySnap(IEnumerable points, bool move, Transform reference) - { - var referencePosition = reference.position; - var closestPos = Vector3.zero; - var closestDist = float.MaxValue; - - foreach (var otherPoint in points) - { - if (otherPoint.Curve().GetComponentInParent() == this) continue; - - var otherPosition = otherPoint.transform.position; - var dist = Mathf.Abs(Vector3.Distance(otherPosition, referencePosition)); - - if (dist > Track.SNAP_RANGE || dist >= closestDist) continue; - - var aTrack = otherPoint.GetComponentInParent(); - if (aTrack.IsSwitch) continue; - - closestPos = otherPosition; - closestDist = dist; - } - - if (closestDist >= float.MaxValue) return; - - if (move) { - transform.position = closestPos + (transform.position - reference.position); - } - } + // TODO why is this unused +// protected void Snap() +// { +// #if UNITY_EDITOR +// BezierPoint[] bezierPoints = FindObjectsOfType(); +// GameObject[] selectedObjects = Selection.gameObjects; +// bool isSelected = selectedObjects.Contains(gameObject); +// +// TrySnap(bezierPoints, isSelected, transform); +// foreach (var track in Tracks) +// { +// TrySnap(bezierPoints, isSelected, track.Curve.Last().transform); +// } +// #endif +// } +// +// private void TrySnap(IEnumerable points, bool move, Transform reference) +// { +// var referencePosition = reference.position; +// var closestPos = Vector3.zero; +// var closestDist = float.MaxValue; +// +// foreach (var otherPoint in points) +// { +// if (otherPoint.Curve().GetComponentInParent() == this) continue; +// +// var otherPosition = otherPoint.transform.position; +// var dist = Mathf.Abs(Vector3.Distance(otherPosition, referencePosition)); +// +// if (dist > Track.SNAP_RANGE || dist >= closestDist) continue; +// +// var aTrack = otherPoint.GetComponentInParent(); +// if (aTrack.IsSwitch) continue; +// +// closestPos = otherPosition; +// closestDist = dist; +// } +// +// if (closestDist >= float.MaxValue) return; +// +// if (move) { +// transform.position = closestPos + (transform.position - reference.position); +// } +// } } } diff --git a/MapifyEditor/Trackage/Track.cs b/MapifyEditor/Trackage/Track.cs index bafe354d..915c8e3e 100644 --- a/MapifyEditor/Trackage/Track.cs +++ b/MapifyEditor/Trackage/Track.cs @@ -69,16 +69,7 @@ public BezierCurve Curve { } } - private SwitchBase _parentSwitch; - - private SwitchBase ParentSwitch { - get { - if (_parentSwitch) return _parentSwitch; - return _parentSwitch = GetComponentInParent(); - } - } - - public bool IsSwitch => ParentSwitch != null; + public bool IsSwitch => GetComponentInParent() != null; public bool IsTurntable => GetComponentInParent() != null; public string LogicName => diff --git a/MapifyEditor/Trackage/Switch.cs b/MapifyEditor/Trackage/VanillaSwitch.cs similarity index 67% rename from MapifyEditor/Trackage/Switch.cs rename to MapifyEditor/Trackage/VanillaSwitch.cs index 752ee456..360a093a 100644 --- a/MapifyEditor/Trackage/Switch.cs +++ b/MapifyEditor/Trackage/VanillaSwitch.cs @@ -1,16 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Mapify.Editor.Utils; using UnityEngine; -#if UNITY_EDITOR -using UnityEditor; -#endif namespace Mapify.Editor { [RequireComponent(typeof(VanillaObject))] - public class Switch : SwitchBase + public class VanillaSwitch : SwitchBase { public enum StandSide { @@ -27,5 +20,10 @@ public enum StandSide public Track ThroughTrack => transform.Find("[track through]").GetComponent(); public Track DivergingTrack => transform.Find("[track diverging]").GetComponent(); public bool IsLeft => DivergingTrack.Curve.Last().localPosition.x < 0; + + public BezierPoint GetJointPoint() => ThroughTrack.Curve[0]; + public BezierPoint GetThroughPoint() => ThroughTrack.Curve[1]; + public BezierPoint GetDivergingPoint() => DivergingTrack.Curve[1]; + public BezierPoint GetDivergeJoinPoint() => DivergingTrack.Curve[0]; } } diff --git a/MapifyEditor/Utils/Extensions.cs b/MapifyEditor/Utils/Extensions.cs index c7a7acfa..001b77d4 100644 --- a/MapifyEditor/Utils/Extensions.cs +++ b/MapifyEditor/Utils/Extensions.cs @@ -243,12 +243,6 @@ public static Dictionary> MapToClosestStation(this IEnumerab .ToDictionary(group => group.Key, group => group.ToList()); } - // Switches. - public static BezierPoint GetJointPoint(this Switch s) => s.ThroughTrack.Curve[0]; - public static BezierPoint GetThroughPoint(this Switch s) => s.ThroughTrack.Curve[1]; - public static BezierPoint GetDivergingPoint(this Switch s) => s.DivergingTrack.Curve[1]; - public static BezierPoint GetDivergeJoinPoint(this Switch s) => s.DivergingTrack.Curve[0]; - // Track. /// /// Returns true if this track starts at grade of 0%. From 4d45a078599b57769e73b3d13658aee571584764 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Thu, 5 Dec 2024 12:31:46 +0100 Subject: [PATCH 14/38] add car spawner and deleter components, fix switch stalk position, create custom switches with track tools, add YardController --- Mapify/Components/CarDeleter_r.cs | 34 +++++ .../Components/{Retarder.cs => Retarder_r.cs} | 31 +++-- Mapify/Components/TimedCarSpawner_r.cs | 94 ++++++++++++++ ...witchController.cs => YardController_r.cs} | 89 +++++++++----- Mapify/Mapify.csproj | 3 +- .../Railway/LocomotiveSpawnerSetup.cs | 6 + .../SceneInitializers/Railway/TrackSetup.cs | 91 ++++++++------ Mapify/Utils/Extensions.cs | 4 +- .../BezierCurves/BezierCurveEditor.cs | 2 +- .../BezierCurves/BezierPointEditor.cs | 2 +- .../BuildUpdaters/Railway/SwitchUpdater.cs | 6 +- .../Validators/Railway/SwitchValidator.cs | 5 +- .../Validators/Railway/TrackValidator.cs | 8 +- ...gStockList.cs => VanillaLocomotiveList.cs} | 4 +- .../RollingStock/VanillaRollingStockType.cs | 63 ++++++---- .../Station/VanillaLocomotiveSpawner.cs | 7 +- MapifyEditor/Tools/ToolEnums.cs | 8 +- .../Tools/TrackToolsCreator.Previews.cs | 18 +-- MapifyEditor/Tools/TrackToolsCreator.cs | 116 +++++++++--------- MapifyEditor/Tools/TrackToolsHelper.cs | 22 ++-- MapifyEditor/Tools/TrackToolsWindow.cs | 9 +- .../Tools/TrackToolsWindowGUI/Creation.cs | 25 ++-- .../Tools/TrackToolsWindowGUI/Other.cs | 4 +- .../Tools/TrackToolsWindowGUI/Selection.cs | 4 +- MapifyEditor/TrackComponents/CarDeleter.cs | 10 ++ MapifyEditor/TrackComponents/Retarder.cs | 13 ++ .../TrackComponents/TimedCarSpawner.cs | 15 +++ .../TrackComponents/YardController.cs | 12 ++ MapifyEditor/Trackage/CustomSwitch.cs | 15 ++- .../Trackage/{VanillaSwitch.cs => Switch.cs} | 2 +- MapifyEditor/Trackage/SwitchBase.cs | 5 +- MapifyEditor/Trackage/SwitchControllerPls.cs | 11 -- MapifyEditor/Trackage/Track.cs | 8 +- 33 files changed, 504 insertions(+), 242 deletions(-) create mode 100644 Mapify/Components/CarDeleter_r.cs rename Mapify/Components/{Retarder.cs => Retarder_r.cs} (52%) create mode 100644 Mapify/Components/TimedCarSpawner_r.cs rename Mapify/Components/{SwitchController.cs => YardController_r.cs} (50%) rename MapifyEditor/RollingStock/{VanillaRollingStockList.cs => VanillaLocomotiveList.cs} (65%) create mode 100644 MapifyEditor/TrackComponents/CarDeleter.cs create mode 100644 MapifyEditor/TrackComponents/Retarder.cs create mode 100644 MapifyEditor/TrackComponents/TimedCarSpawner.cs create mode 100644 MapifyEditor/TrackComponents/YardController.cs rename MapifyEditor/Trackage/{VanillaSwitch.cs => Switch.cs} (95%) delete mode 100644 MapifyEditor/Trackage/SwitchControllerPls.cs diff --git a/Mapify/Components/CarDeleter_r.cs b/Mapify/Components/CarDeleter_r.cs new file mode 100644 index 00000000..94042681 --- /dev/null +++ b/Mapify/Components/CarDeleter_r.cs @@ -0,0 +1,34 @@ +using System.Linq; +using DV.Utils; +using UnityEngine; + +namespace Mapify.Components +{ + public class CarDeleter_r: MonoBehaviour + { + private RailTrack railTrack; + + private void Start() + { + railTrack = GetComponent(); + } + + private void Update() + { + if(!railTrack.onTrackBogies.Any()) return; + + var carToDelete = railTrack.onTrackBogies.Select(bogie => bogie._car).First(); + + Mapify.LogDebug($"{nameof(CarDeleter_r)}: Deleting {carToDelete.name}"); + + //copied from DV.CommsRadioCarDeleter.OnUse + SingletonBehaviour.Instance.DeleteCar(carToDelete); + SingletonBehaviour.Instance.ClearInvalidCarReferencesAfterManualDelete(); + if (carToDelete != null) + { + carToDelete.gameObject.SetActive(false); + carToDelete.interior.gameObject.SetActive(false); + } + } + } +} diff --git a/Mapify/Components/Retarder.cs b/Mapify/Components/Retarder_r.cs similarity index 52% rename from Mapify/Components/Retarder.cs rename to Mapify/Components/Retarder_r.cs index 0a33b0cd..85b107e7 100644 --- a/Mapify/Components/Retarder.cs +++ b/Mapify/Components/Retarder_r.cs @@ -1,32 +1,29 @@ using System.Linq; +using Mapify.Editor; using UnityEngine; namespace Mapify.Components { - public class Retarder: MonoBehaviour + public class Retarder_r: MonoBehaviour { private float maxSpeed; // meter per second private RailTrack railTrack; private float brakeForce; //Newton - private bool hasBeenSetup = false; - - public void Setup(float maxSpeed_, RailTrack railTrack_, float brakeForce_) + private void Start() { - maxSpeed = maxSpeed_; - railTrack = railTrack_; - brakeForce = brakeForce_; - - hasBeenSetup = true; - } - - private void Awake() - { - if (!hasBeenSetup) + var retarderValues = GetComponent(); + if (!retarderValues) { - Mapify.LogError($"{nameof(Retarder)} on {gameObject.name} has not been setup yet"); + Mapify.LogError($"Can't find {nameof(Retarder)} on {gameObject.name}"); Destroy(this); + return; } + + railTrack = GetComponent(); + + maxSpeed = retarderValues.maxSpeedKMH / 3.6f; // to m/s + brakeForce = retarderValues.brakeForce; } private void FixedUpdate() @@ -39,8 +36,8 @@ private void FixedUpdate() var force3D = car.transform.forward * (-brakeForce * Mathf.Sign(forwardSpeed)); car.rb.AddForce(force3D); - Mapify.LogDebugExtreme(() => $"{nameof(Retarder)} force {force3D}"); - Mapify.LogDebugExtreme(() => $"{nameof(Retarder)} forwardSpeed {forwardSpeed}"); + Mapify.LogDebugExtreme(() => $"{nameof(Retarder_r)} force {force3D}"); + Mapify.LogDebugExtreme(() => $"{nameof(Retarder_r)} forwardSpeed {forwardSpeed}"); } } } diff --git a/Mapify/Components/TimedCarSpawner_r.cs b/Mapify/Components/TimedCarSpawner_r.cs new file mode 100644 index 00000000..6c4cf5b9 --- /dev/null +++ b/Mapify/Components/TimedCarSpawner_r.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using DV; +using DV.ThingTypes; +using DV.Utils; +using Mapify.Editor; +using UnityEngine; +using Random = UnityEngine.Random; + +namespace Mapify.Components +{ + public class TimedCarSpawner_r: MonoBehaviour + { + private float SpawnInterval; + private bool EnableHandBrakeOnSpawn; + private RailTrack spawnTrack; + private TrainCarType_v2[] trainCarTypes; + + private void Start() + { + var carSpawnerValues = GetComponent(); + if (!carSpawnerValues) + { + Mapify.LogError($"Can't find {nameof(TimedCarSpawner)} on {gameObject.name}"); + Destroy(this); + return; + } + + spawnTrack = GetComponent(); + SpawnInterval = carSpawnerValues.SpawnInterval; + + var TrainCarIDs = carSpawnerValues.TrainCarTypes.Select(type => Enum.GetName(type.GetType(), type)).ToArray(); + trainCarTypes = TrainCarIDs.Select(carID => Globals.G.types._carTypesById[carID]).ToArray(); + + foreach (var trainCarType in trainCarTypes) + { + if (!trainCarType.liveries.Any()) + { + Mapify.LogError($"trainCarType {trainCarType} has no liveries"); + } + } + + EnableHandBrakeOnSpawn = carSpawnerValues.EnableHandBrakeOnSpawn; + + StartCoroutine(Spawn()); + } + + private IEnumerator Spawn() + { + while (true) + { + while (spawnTrack.onTrackBogies.Any()) + { + yield return null; + } + + yield return new WaitForSeconds(SpawnInterval); + + while (spawnTrack.onTrackBogies.Any()) + { + yield return null; + } + + var nextCar = trainCarTypes[Random.Range(0, trainCarTypes.Length)]; + var nextLivery = nextCar.liveries[Random.Range(0, nextCar.liveries.Count)]; + + Mapify.LogDebug($"Spawning {nextCar.id} with livery {nextLivery.id}"); + + var trainCarList = SingletonBehaviour.Instance.SpawnCarTypesOnTrack( + new List{ nextLivery }, + null, + spawnTrack, + true, + EnableHandBrakeOnSpawn + ); + + if (trainCarList == null || !trainCarList.Any()) + { + Mapify.LogError($"Car spawning failed! Is the track long enough to fit the traincar?"); + } + else + { + Mapify.LogDebug($"Spawn result:"); + foreach (var spawnedCar in trainCarList) + { + Mapify.LogDebug($"{spawnedCar.carType} {spawnedCar.carLivery.id}"); + } + } + } + } + } +} diff --git a/Mapify/Components/SwitchController.cs b/Mapify/Components/YardController_r.cs similarity index 50% rename from Mapify/Components/SwitchController.cs rename to Mapify/Components/YardController_r.cs index 372d586e..4e710a96 100644 --- a/Mapify/Components/SwitchController.cs +++ b/Mapify/Components/YardController_r.cs @@ -1,25 +1,40 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Management.Instrumentation; -using System.Runtime.InteropServices; using Mapify.Editor; using Mapify.Utils; using UnityEngine; namespace Mapify.Components { - public class SwitchController: MonoBehaviour + public class YardController_r: MonoBehaviour { - // public Track DetectorTrack; + // private enum SortStrategy + // { + // Label, + // CarType + // } + + private RailTrack detectorTrack; private Junction rootJunction; + private string stationID; + private string yardID; + + private Dictionary trackNumberToCarID = new(); + private bool hasBeenSetup = false; - public void Setup(Junction junction) + /// + /// + /// The first junction in the tree of junctions (switches) + /// + public void Setup(Junction rootJunction_, YardController yardControllerValues) { - // DetectorTrack = detectorTrack; - rootJunction = junction; + detectorTrack = yardControllerValues.DetectorTrack.GetComponent(); + rootJunction = rootJunction_; + + stationID = yardControllerValues.StationID; + yardID = yardControllerValues.YardID; hasBeenSetup = true; } @@ -28,44 +43,55 @@ private void Start() { if (!hasBeenSetup) { - Mapify.LogError($"{nameof(SwitchController)} on {gameObject.name} has not been setup yet"); + Mapify.LogError($"{nameof(YardController_r)} on {gameObject.name} has not been setup"); Destroy(this); } + + foreach (var trackNumber in RailTrackRegistry.Instance.GetTrackNumbersOfSubYard(stationID, yardID)) + { + trackNumberToCarID.Add((byte)trackNumber, ""); + } + + if (trackNumberToCarID.Any()) return; + + Mapify.LogError($"{nameof(YardController_r)}: could not find track numbers for yard {stationID}-{yardID}"); + Destroy(this); } private void Update() { - int track = -1; + var detectedCar = detectorTrack.onTrackBogies.Select(bogie => bogie._car).FirstOrDefault(); + if(!detectedCar) return; - if (Input.GetKeyDown(KeyCode.Keypad1)) - { - track = 1; - } - if (Input.GetKeyDown(KeyCode.Keypad2)) + var carTypeID = detectedCar.carLivery.parentType.id; + + foreach (var pair in trackNumberToCarID) { - track = 2; + if(pair.Value != carTypeID) continue; + Mapify.LogDebug($"{carTypeID} -> {stationID}-{yardID}-{pair.Key}"); + SetSwitches(pair.Key); + return; } - if (Input.GetKeyDown(KeyCode.Keypad3)) + + foreach (var pair in trackNumberToCarID) { - track = 3; + if(pair.Value != "") continue; + Mapify.LogDebug($"{carTypeID} -> {stationID}-{yardID}-{pair.Key}"); + trackNumberToCarID[pair.Key] = carTypeID; + SetSwitches(pair.Key); + return; } - if (Input.GetKeyDown(KeyCode.Keypad4)) + + Mapify.LogError($"All {trackNumberToCarID.Values.Count} tracks taken"); + foreach (var pair in trackNumberToCarID) { - track = 4; + Mapify.LogDebug($"{pair.Key} -> {pair.Value}"); } - - if (track == -1) { return; } - - SetSwitches((byte)track); } // set the switches, so that they form a path to trackNumber private void SetSwitches(byte trackNumber) { - //TODO - var stationID = "station"; - var yardID = "B"; - var goal = RailTrackRegistry.Instance.GetRailTrack(stationID, yardID, trackNumber); if (goal == null) @@ -74,6 +100,7 @@ private void SetSwitches(byte trackNumber) return; } + //TODO cache the paths in Start? var start = rootJunction.inBranch.track; var path = PathFinder.FindPath(start, goal); @@ -104,9 +131,9 @@ private void SetSwitches(byte trackNumber) } /// Returns the index of the branch that connects to the track - private int GetBranchForTrack(List outBranches, RailTrack track) + private byte GetBranchForTrack(List outBranches, RailTrack track) { - for (int branchIndex = 0; branchIndex < outBranches.Count; branchIndex++) + for (byte branchIndex = 0; branchIndex < outBranches.Count; branchIndex++) { if (outBranches[branchIndex].track.outBranch.track == track) { diff --git a/Mapify/Mapify.csproj b/Mapify/Mapify.csproj index c73fd408..01b04dd2 100644 --- a/Mapify/Mapify.csproj +++ b/Mapify/Mapify.csproj @@ -2,7 +2,7 @@ net48 - 7.3 + latest Mapify true @@ -15,6 +15,7 @@ + diff --git a/Mapify/SceneInitializers/Railway/LocomotiveSpawnerSetup.cs b/Mapify/SceneInitializers/Railway/LocomotiveSpawnerSetup.cs index ef8cbe01..41dcc766 100644 --- a/Mapify/SceneInitializers/Railway/LocomotiveSpawnerSetup.cs +++ b/Mapify/SceneInitializers/Railway/LocomotiveSpawnerSetup.cs @@ -26,6 +26,12 @@ public static void SetupLocomotiveSpawner(LocomotiveSpawner spawner) ).ToList() ) ).ToList(); + + if (!locoSpawner.locoTypeGroupsToSpawn.Any()) + { + Mapify.LogError($"{nameof(LocomotiveSpawnerSetup)} locoTypeGroupsToSpawn is empty. {nameof(spawner.condensedLocomotiveTypes)}: {spawner.condensedLocomotiveTypes}"); + } + spawner.gameObject.SetActive(wasActive); } } diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 685744d1..bd0cc7de 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -6,6 +6,7 @@ using Mapify.Editor.Utils; using Mapify.Utils; using UnityEngine; +using Object = UnityEngine.Object; namespace Mapify.SceneInitializers.Railway { @@ -49,21 +50,22 @@ private static RailTrack CreateRailTrack(Track track, bool setActive) railTrack.age = (int)track.age; railTrack.ApplyRailType(); - if (track.isRetarder) + if (track.TryGetComponent(out _)) { - CreateRetarder(track, railTrack); + track.gameObject.AddComponent(); } - return railTrack; - } + if (track.TryGetComponent(out _)) + { + track.gameObject.AddComponent(); + } - private static void CreateRetarder(Track track, RailTrack railTrack) - { - Mapify.LogDebug(() => $"{nameof(CreateRetarder)}: adding {nameof(Retarder)} on track {track.name}"); - var retarder = track.gameObject.AddComponent(); - //convert to meter per second - var retarderMaxSpeedMS = track.retarderMaxSpeedKMH / 3.6f; - retarder.Setup(retarderMaxSpeedMS, railTrack, track.retarderBrakeForce); + if (track.TryGetComponent(out _)) + { + track.gameObject.AddComponent(); + } + + return railTrack; } private static void CreateJunctions() @@ -90,11 +92,14 @@ private static void CreateCustomSwitch(CustomSwitch customSwitch) //Junction var inJunction = prefabClone.GetComponentInChildren(); + inJunction.transform.position = customSwitch.JointPoint.transform.position; inJunction.selectedBranch = customSwitch.defaultBranch; DestroyPrefabTracks(prefabClone); - CreateNewTracks(customSwitch, prefabClone, inJunction); - SetupGraphical(prefabClone); + CreateSwitchTracks(customSwitch, prefabClone, inJunction); + SetupStalk(prefabClone); + + YardControllerSetup(prefabClone, customSwitch, inJunction); } private static void DestroyPrefabTracks(GameObject prefabClone) @@ -106,17 +111,12 @@ private static void DestroyPrefabTracks(GameObject prefabClone) Object.DestroyImmediate(prefabClone.FindChildByName("[track diverging]")); } - private static void CreateNewTracks(CustomSwitch customSwitch, GameObject prefabClone, Junction switchJunction) + private static void CreateSwitchTracks(CustomSwitch customSwitch, GameObject prefabClone, Junction switchJunction) { var railTracksInSwitch = CreateRailTracks( - customSwitch.gameObject - .GetComponentsInChildren(), true + customSwitch.GetTracks(), true ); - railTracksInSwitch = railTracksInSwitch - .OrderBy(track => track.gameObject.name) - .ToList(); - if (!railTracksInSwitch.Any()) { Mapify.LogError($"{nameof(CreateCustomSwitches)}: {nameof(railTracksInSwitch)} is empty"); @@ -151,41 +151,55 @@ private static void CreateNewTracks(CustomSwitch customSwitch, GameObject prefab if (switchJunction.inBranch == null) { - Mapify.LogError($"{nameof(CreateNewTracks)}: inBranch is null"); + Mapify.LogError($"{nameof(CreateSwitchTracks)}: inBranch is null"); } } - private static void SetupGraphical(GameObject prefabClone) + private static void SetupStalk(GameObject prefabClone) { var graphical = prefabClone.FindChildByName("Graphical"); string[] toDelete = {"ballast", "anchors", "sleepers", "rails_static", "rails_moving"}; + foreach (var child in graphical.transform.GetChildren()) { if (!toDelete.Contains(child.name)) continue; Object.Destroy(child.gameObject); } + + var switch_base = graphical.transform.FindChildByName("switch_base"); + if (!switch_base) + { + Mapify.LogError("Could not determine switch offset"); + return; + } + + var offsetZ = switch_base.localPosition.z; + Mapify.LogDebug($"offsetZ: {offsetZ}"); + graphical.transform.localPosition -= new Vector3(0f, 0f, offsetZ); + var switchTrigger = prefabClone.FindChildByName("SwitchTrigger"); + switchTrigger.transform.localPosition -= new Vector3(0f, 0f, offsetZ); } private static void CreateVanillaSwitches() { - foreach (Switch sw in Object.FindObjectsOfType()) + foreach (Switch switch_ in Object.FindObjectsOfType()) { - Transform swTransform = sw.transform; - VanillaAsset vanillaAsset = sw.GetComponent().asset; + Transform swTransform = switch_.transform; + VanillaAsset vanillaAsset = switch_.GetComponent().asset; GameObject prefabClone = AssetCopier.Instantiate(vanillaAsset, false); Transform prefabCloneTransform = prefabClone.transform; - Transform inJunction = prefabCloneTransform.Find(IN_JUNCTION_NAME); - Vector3 offset = prefabCloneTransform.position - inJunction.position; + Transform junctionTransform = prefabCloneTransform.Find(IN_JUNCTION_NAME); + Vector3 offset = prefabCloneTransform.position - junctionTransform.position; foreach (Transform child in prefabCloneTransform) child.transform.position += offset; prefabCloneTransform.SetPositionAndRotation(swTransform.position, swTransform.rotation); - Junction junction = inJunction.GetComponent(); - junction.selectedBranch = (byte) (sw.IsLeft - ? sw.defaultState == Switch.StandSide.THROUGH + Junction junction = junctionTransform.GetComponent(); + junction.selectedBranch = (byte) (switch_.IsLeft + ? switch_.defaultState == Switch.StandSide.THROUGH ? 1 : 0 - : sw.defaultState == Switch.StandSide.THROUGH + : switch_.defaultState == Switch.StandSide.THROUGH ? 0 : 1 ); @@ -196,15 +210,18 @@ private static void CreateVanillaSwitches() prefabClone.transform.SetParent(WorldData.Instance.TrackRootParent); prefabClone.SetActive(true); - //TODO add this to CustomSwitch too? - if (sw.TryGetComponent(typeof(SwitchControllerPls), out Component scp)) - { - var sc = prefabClone.AddComponent(); - sc.Setup(junction); - } + YardControllerSetup(prefabClone, switch_, junction); } } + private static void YardControllerSetup(GameObject prefabClone, SwitchBase switch_, Junction junction) + { + if (!switch_.gameObject.TryGetComponent(typeof(YardController), out Component scp)) return; + + var sc = prefabClone.AddComponent(); + sc.Setup(junction, (YardController)scp); + } + private static void ConnectTracks(IEnumerable tracks) { // Ignore the warnings from not being able to find track, that's just a side effect of how we do things. diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 3566baf7..1e4fc971 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -252,11 +252,11 @@ public static IEnumerable GetTrackNumbersOfSubYard(this RailTrackRegistry r .Distinct(); } - public static void SwitchTo(this Junction junction, int branchNumber, Junction.SwitchMode switchMode) + public static void SwitchTo(this Junction junction, byte branchNumber, Junction.SwitchMode switchMode) { Mapify.LogDebug($"junction {junction.name} switch to {branchNumber}"); - junction.selectedBranch = branchNumber - 1; + junction.selectedBranch = (byte) Misc.BetterModulo(branchNumber - 1, junction.outBranches.Count); junction.Switch(switchMode); } diff --git a/MapifyEditor/BezierCurves/BezierCurveEditor.cs b/MapifyEditor/BezierCurves/BezierCurveEditor.cs index 8d3c317f..6c39026c 100644 --- a/MapifyEditor/BezierCurves/BezierCurveEditor.cs +++ b/MapifyEditor/BezierCurves/BezierCurveEditor.cs @@ -206,7 +206,7 @@ private void DrawPointInspector(BezierPoint point, int index) private static void DrawPointSceneGUI(BezierPoint point) { - if (point.GetComponentInParent()?.IsSwitch == true) + if (point.GetComponentInParent()?.IsVanillaSwitch == true) return; Handles.Label(point.position + new Vector3(0, HandleUtility.GetHandleSize(point.position) * 0.4f, 0), point.gameObject.name); diff --git a/MapifyEditor/BezierCurves/BezierPointEditor.cs b/MapifyEditor/BezierCurves/BezierPointEditor.cs index 0d8272b2..e9046a57 100644 --- a/MapifyEditor/BezierCurves/BezierPointEditor.cs +++ b/MapifyEditor/BezierCurves/BezierPointEditor.cs @@ -114,7 +114,7 @@ public override void OnInspectorGUI() private void OnSceneGUI() { - if (point.GetComponentInParent()?.IsSwitch == true) + if (point.GetComponentInParent()?.IsVanillaSwitch == true) return; Handles.color = Color.green; Vector3 newPosition = Handles.FreeMoveHandle(point.position, point.transform.rotation, HandleUtility.GetHandleSize(point.position) * 0.2f, Vector3.zero, Handles.CubeHandleCap); diff --git a/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs b/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs index 78018e8f..12b46810 100644 --- a/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs +++ b/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs @@ -7,14 +7,14 @@ public class SwitchUpdater : BuildUpdater { protected override void Update(Scenes scenes) { - foreach (VanillaSwitch sw in scenes.railwayScene.GetAllComponents()) + foreach (Switch sw in scenes.railwayScene.GetAllComponents()) { VanillaObject vanillaObject = sw.GetComponent(); vanillaObject.asset = sw.IsLeft - ? sw.standSide == VanillaSwitch.StandSide.DIVERGING + ? sw.standSide == Switch.StandSide.DIVERGING ? VanillaAsset.SwitchLeft : VanillaAsset.SwitchLeftOuterSign - : sw.standSide == VanillaSwitch.StandSide.DIVERGING + : sw.standSide == Switch.StandSide.DIVERGING ? VanillaAsset.SwitchRight : VanillaAsset.SwitchRightOuterSign; } diff --git a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs index df38cf25..889301a3 100644 --- a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs @@ -13,12 +13,13 @@ protected override IEnumerator Validate(Scenes scenes) { foreach (var switch_ in scenes.railwayScene.GetAllComponents()) { - if (switch_.Tracks.Length < 2) + var switchTracks = switch_.GetTracks(); + if (switchTracks.Length < 2) { yield return Result.Error("Switches must have at least 2 branches", switch_); } - foreach (var track in switch_.Tracks) + foreach (var track in switchTracks) { track.Snap(); diff --git a/MapifyEditor/Export/Validators/Railway/TrackValidator.cs b/MapifyEditor/Export/Validators/Railway/TrackValidator.cs index ab3e5f19..174ffa3e 100644 --- a/MapifyEditor/Export/Validators/Railway/TrackValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/TrackValidator.cs @@ -31,8 +31,14 @@ protected override IEnumerator Validate(Scenes scenes) if (PrefabUtility.IsPartOfPrefabInstance(track)) yield return Result.Warning("Track prefabs should be unpacked completely before being used", track); - if (track.trackType != TrackType.Road) + if (track.trackType == TrackType.Road) { + if (!string.IsNullOrWhiteSpace(track.stationId)) + { + yield return Result.Warning($"Track {track.name} will not be assigned to specified station {track.stationId} because {nameof(track.trackType)} is set to {track.trackType}", track); + } + } + else { if (string.IsNullOrWhiteSpace(track.stationId)) yield return Result.Error("Station ID not specified", track); else if (stations.All(station => station.stationID != track.stationId)) diff --git a/MapifyEditor/RollingStock/VanillaRollingStockList.cs b/MapifyEditor/RollingStock/VanillaLocomotiveList.cs similarity index 65% rename from MapifyEditor/RollingStock/VanillaRollingStockList.cs rename to MapifyEditor/RollingStock/VanillaLocomotiveList.cs index 76a61bd8..e2ecdfc1 100644 --- a/MapifyEditor/RollingStock/VanillaRollingStockList.cs +++ b/MapifyEditor/RollingStock/VanillaLocomotiveList.cs @@ -5,8 +5,8 @@ namespace Mapify.Editor { [Serializable] // Unity doing Unity things and not supporting nested lists in the editor - public class VanillaRollingStockList + public class VanillaLocomotiveList { - public List rollingStock; + public List rollingStock; } } diff --git a/MapifyEditor/RollingStock/VanillaRollingStockType.cs b/MapifyEditor/RollingStock/VanillaRollingStockType.cs index db8f446e..0ee740b8 100644 --- a/MapifyEditor/RollingStock/VanillaRollingStockType.cs +++ b/MapifyEditor/RollingStock/VanillaRollingStockType.cs @@ -1,32 +1,49 @@ -using System; - namespace Mapify.Editor { + // Globals.G.Types._carTypesById.Select(car => car.Key) + // Use Enum.GetName to turn it into a string ID public enum VanillaRollingStockType : byte { - DE2 = 0, - DE6 = 1, - DH4 = 10, - DM3 = 20, - S282A = 30, - S282B = 31, - S060 = 40 + Autorack = 0, + Boxcar = 1, + BoxcarMilitary = 2, + Caboose = 3, + Flatbed = 4, + FlatbedMilitary = 5, + FlatbedStakes = 6, + FlatbedShort = 7, + Gondola = 8, + HandCar = 9, + Hopper = 10, + HopperCovered = 11, + LocoDE2 = 12, + LocoDE6 = 13, + LocoDE6Slug = 14, + LocoDH4 = 15, + LocoDM3 = 16, + LocoS282A = 17, + LocoS282B = 18, + LocoS060 = 19, + NuclearFlask = 20, + Passenger = 21, + Stock = 22, + Refrigerator = 23, + TankChem = 24, + TankGas = 25, + TankOil = 26, + TankShortFood = 27, + LocoMicroshunter = 28, + LocoDM1U = 29 } - public static class VanillaRollingStockTypeExtensions + public enum VanillaLocomotiveType : byte { - public static string ToV2(this VanillaRollingStockType vanillaRollingStockType) - { - return vanillaRollingStockType switch { - VanillaRollingStockType.DE2 => "LocoDE2", - VanillaRollingStockType.DE6 => "LocoDE6", - VanillaRollingStockType.DH4 => "LocoDH4", - VanillaRollingStockType.DM3 => "LocoDM3", - VanillaRollingStockType.S282A => "LocoS282A", - VanillaRollingStockType.S282B => "LocoS282B", - VanillaRollingStockType.S060 => "LocoS060", - _ => throw new ArgumentOutOfRangeException(nameof(vanillaRollingStockType), vanillaRollingStockType, null) - }; - } + LocoDE2 = 0, + LocoDE6 = 1, + LocoDH4 = 10, + LocoDM3 = 20, + LocoS282A = 30, + LocoS282B = 31, + LocoS060 = 40, } } diff --git a/MapifyEditor/Station/VanillaLocomotiveSpawner.cs b/MapifyEditor/Station/VanillaLocomotiveSpawner.cs index d88b3a0d..76db3ce1 100644 --- a/MapifyEditor/Station/VanillaLocomotiveSpawner.cs +++ b/MapifyEditor/Station/VanillaLocomotiveSpawner.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using UnityEngine; @@ -8,11 +9,13 @@ public class VanillaLocomotiveSpawner : LocomotiveSpawner { [SerializeField] [Tooltip("What all locomotives to spawn. Each element is a group to spawn together (e.g. the steamer and it's tender)")] - internal List locomotiveGroups; + internal List locomotiveGroups; public override IEnumerable CondenseLocomotiveTypes() { - return locomotiveGroups.Select(types => string.Join(",", types.rollingStock.Select(type => type.ToV2()))); + return locomotiveGroups.Select(types => string.Join(",", types.rollingStock + .Select(locoType => Enum.GetName(locoType.GetType(), locoType)) + )); } } } diff --git a/MapifyEditor/Tools/ToolEnums.cs b/MapifyEditor/Tools/ToolEnums.cs index 5484a97c..e729e0ae 100644 --- a/MapifyEditor/Tools/ToolEnums.cs +++ b/MapifyEditor/Tools/ToolEnums.cs @@ -91,14 +91,14 @@ public static SwitchPoint NextPoint(SwitchPoint switchPoint) return SwitchPoint.Joint; } - public static VanillaSwitch.StandSide FlipStand(VanillaSwitch.StandSide standSide) + public static Switch.StandSide FlipStand(Switch.StandSide standSide) { - if (standSide == VanillaSwitch.StandSide.THROUGH) + if (standSide == Switch.StandSide.THROUGH) { - return VanillaSwitch.StandSide.DIVERGING; + return Switch.StandSide.DIVERGING; } - return VanillaSwitch.StandSide.THROUGH; + return Switch.StandSide.THROUGH; } } } diff --git a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs index 57787287..8a13ce54 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs @@ -65,7 +65,7 @@ public static Vector3[] PreviewArcCurve(Vector3 attachPoint, Vector3 handlePosit return lines.ToArray(); } - public static Vector3[][] PreviewSwitch(VanillaSwitch prefab, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint, + public static Vector3[][] PreviewSwitch(Switch prefab, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint, int samples = 8) { var curves = TrackToolsHelper.GetSwitchBeziers(prefab, attachPoint, handlePosition, connectingPoint); @@ -117,7 +117,7 @@ public static Vector3[][] PreviewCustomSwitch(Vector3 attachPoint, Vector3 handl return curves; } - public static Vector3[][] PreviewYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples = 8) { if (yardOptions.Half) @@ -130,7 +130,7 @@ public static Vector3[][] PreviewYard(VanillaSwitch leftPrefab, VanillaSwitch ri } } - private static Vector3[][] PreviewFullYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + private static Vector3[][] PreviewFullYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples) { List results = new List(); @@ -336,7 +336,7 @@ private static Vector3[][] PreviewFullYard(VanillaSwitch leftPrefab, VanillaSwit return results.ToArray(); } - private static Vector3[][] PreviewHalfYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + private static Vector3[][] PreviewHalfYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples) { List results = new List(); @@ -491,13 +491,13 @@ private static Vector3[][] PreviewHalfYard(VanillaSwitch leftPrefab, VanillaSwit return results.ToArray(); } - private static Vector3[][] PreviewSwitchSprawl(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, YardOptions yardOptions, TrackOrientation orientation, + private static Vector3[][] PreviewSwitchSprawl(Switch leftPrefab, Switch rightPrefab, YardOptions yardOptions, TrackOrientation orientation, float trackDistance, bool mainSide, bool reverse, out Vector3[] trackPoints, int samples = 8) { List results = new List(); List points = new List(); - VanillaSwitch current = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; + Switch current = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; Vector3[][] temp = PreviewSwitch(current, Vector3.zero, Vector3.back, SwitchPoint.Joint, samples); results.AddRange(temp); @@ -597,7 +597,7 @@ public static Vector3[] PreviewConnect2(Vector3 p0, Vector3 h0, Vector3 p1, Vect samples); } - public static Vector3[][] PreviewCrossover(VanillaSwitch prefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewCrossover(Switch prefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, bool isTrailing, float switchDistance, int samples = 8) { List results = new List(); @@ -625,7 +625,7 @@ public static Vector3[][] PreviewCrossover(VanillaSwitch prefab, Vector3 attachP return results.ToArray(); } - public static Vector3[][] PreviewScissorsCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewScissorsCrossover(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, float switchDistance, int samples = 8) { List results = new List(); @@ -651,7 +651,7 @@ public static Vector3[][] PreviewScissorsCrossover(VanillaSwitch leftPrefab, Van return results.ToArray(); } - public static Vector3[][] PreviewDoubleSlip(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewDoubleSlip(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float crossAngle, int samples = 8) { List results = new List(); diff --git a/MapifyEditor/Tools/TrackToolsCreator.cs b/MapifyEditor/Tools/TrackToolsCreator.cs index 472edc9f..609c83cc 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.cs @@ -239,10 +239,10 @@ public static Track CreateArcCurve(Transform parent, Vector3 attachPoint, Vector // Switches. /// - /// Instantiates a . + /// Instantiates a . /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new switch. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -253,11 +253,11 @@ public static Track CreateArcCurve(Transform parent, Vector3 attachPoint, Vector /// Derail Valley switches are static assets, and their tracks cannot be changed. /// The switches are also always made at a grade of 0%. /// - public static VanillaSwitch CreateVanillaSwitch(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static Switch CreateVanillaSwitch(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, SwitchPoint connectingPoint) { // Create switch object. - VanillaSwitch s = Object.Instantiate(orientation == TrackOrientation.Left ? leftPrefab : rightPrefab, parent); + Switch s = Object.Instantiate(orientation == TrackOrientation.Left ? leftPrefab : rightPrefab, parent); s.gameObject.name = $"[Switch {orientation}]"; // Helper variables. Vector3 pivot; @@ -304,6 +304,8 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo //TODO connectingPoint var switchObject = new GameObject($"[Switch w/ {switchBranchesCount} branches]"); + switchObject.transform.position = attachPoint; + var switchComponent = switchObject.AddComponent(); //TODO switchComponent.defaultBranch = 0; @@ -341,7 +343,7 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo tracks[branchIndex] = CreateArcCurve(switchObject.transform, attachPoint, handlePosition, trackOrientation, thisRadius, thisArc, 360, endGrade); } - switchComponent.Tracks = tracks; + switchComponent.SetTracks(tracks); return switchComponent; } @@ -349,8 +351,8 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo /// /// Creates a yard with similar shape to the ones present in the base game. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the first switch. /// Handle of the attachment point for the first switch. @@ -366,7 +368,7 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo /// The starting number of the sidings. /// Whether the track numbers should increase FROM the starting ID or decrease TO the starting ID. /// An array with all sidings. - /// An array with the es at each end of the yard. + /// An array with the es at each end of the yard. /// /// For yards with the same number of tracks on both sides, it is recommended to set to true. /// This allows for yards with a shorter overall length, and with similar lengths on both sides. If the number of sides is different, @@ -389,7 +391,7 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo /// /// /// - public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, bool half, bool alternateSides, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -410,8 +412,8 @@ public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch /// /// Creates a yard with similar shape to the ones present in the base game. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The base track prefab. /// The parent for the new track. /// Attachment point for the first switch. @@ -420,9 +422,9 @@ public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch /// The distance between the sidings. /// Settings for the creation of the yard. /// An array with all sidings. - /// An array with the es at each end of the yard. - /// - public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + /// An array with the es at each end of the yard. + /// + public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, out Track[] sidings) { return CreateYard(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, trackDistance, @@ -430,7 +432,7 @@ public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch yardOptions.StationId, yardOptions.YardId, yardOptions.StartTrackId, yardOptions.ReverseNumbers, out sidings); } - private static VanillaSwitch[] CreateFullYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + private static Switch[] CreateFullYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, bool alternateSides, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -440,9 +442,9 @@ private static VanillaSwitch[] CreateFullYard(VanillaSwitch leftPrefab, VanillaS } Vector3 dir = (attachPoint - handlePosition).normalized; - VanillaSwitch start; - VanillaSwitch end; - VanillaSwitch s; + Switch start; + Switch end; + Switch s; Track t; // Points to connect each yard track. @@ -645,10 +647,10 @@ private static VanillaSwitch[] CreateFullYard(VanillaSwitch leftPrefab, VanillaS Object.DestroyImmediate(endObj); sidings = storageTracks.ToArray(); - return new VanillaSwitch[] { start, end }; + return new Switch[] { start, end }; } - private static VanillaSwitch[] CreateHalfYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + private static Switch[] CreateHalfYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -666,8 +668,8 @@ private static VanillaSwitch[] CreateHalfYard(VanillaSwitch leftPrefab, VanillaS rotDir = -rotDir; } - VanillaSwitch start; - VanillaSwitch s; + Switch start; + Switch s; Track t; // Points to connect each yard track. @@ -853,20 +855,20 @@ void MoveDistance(Vector3 distance) Object.DestroyImmediate(startObj); sidings = storageTracks.ToArray(); - return new VanillaSwitch[] { start }; + return new Switch[] { start }; } // Switches on each side of the yard. - private static List CreateSwitchSprawl(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, - Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, int sideTracks, float trackDistance, out VanillaSwitch start, + private static List CreateSwitchSprawl(Switch leftPrefab, Switch rightPrefab, Transform parent, + Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, int sideTracks, float trackDistance, out Switch start, out Track[] endMerge) { // Starting switch. // Switch stands are all on the outside of the yard. start = CreateVanillaSwitch(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, SwitchPoint.Joint); - start.standSide = VanillaSwitch.StandSide.DIVERGING; - start.defaultState = VanillaSwitch.StandSide.THROUGH; - VanillaSwitch s = start; + start.standSide = Switch.StandSide.DIVERGING; + start.defaultState = Switch.StandSide.THROUGH; + Switch s = start; BezierPoint now = s.GetDivergingPoint(); // Points where each track will be. @@ -889,8 +891,8 @@ private static List CreateSwitchSprawl(VanillaSwitch leftPrefab, Va orientation, SwitchPoint.Joint); now = s.GetThroughPoint(); points.Add(s.GetDivergingPoint()); - s.standSide = VanillaSwitch.StandSide.THROUGH; - s.defaultState = VanillaSwitch.StandSide.THROUGH; + s.standSide = Switch.StandSide.THROUGH; + s.defaultState = Switch.StandSide.THROUGH; length = sideL; } @@ -1011,16 +1013,16 @@ public static BufferStop CreateBuffer(BufferStop prefab, Transform parent, Vecto } /// - /// Instantiates the diverging track of a only. + /// Instantiates the diverging track of a only. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. /// Which side the curve turns to. /// The instantiated . - public static Track CreateSwitchCurve(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static Track CreateSwitchCurve(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, SwitchPoint connectingPoint) { Track t; @@ -1032,7 +1034,7 @@ public static Track CreateSwitchCurve(VanillaSwitch leftPrefab, VanillaSwitch ri { t = Object.Instantiate(rightPrefab.DivergingTrack); } - VanillaSwitch s = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; + Switch s = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; Vector3 offset = -t.Curve[0].localPosition; @@ -1137,8 +1139,8 @@ public static Track CreateConnect2Point(Transform parent, Vector3 p0, Vector3 p1 /// /// Creates a crossover. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -1146,8 +1148,8 @@ public static Track CreateConnect2Point(Transform parent, Vector3 p0, Vector3 p1 /// The distance between the parallel tracks. /// Whether to the crossover is in front or comes from behind. /// The distance between the switches on the same track. - /// An array with the at the attachment point (index 0) and the other (index 1). - public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, + /// An array with the at the attachment point (index 0) and the other (index 1). + public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, bool trailing, float switchDistance) { @@ -1166,7 +1168,7 @@ public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaS sp = SwitchPoint.Joint; } - VanillaSwitch s1 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, + Switch s1 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, attachPoint, handlePosition, orientation, sp); BezierPoint bp1 = s1.GetDivergingPoint(); @@ -1179,20 +1181,20 @@ public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaS point = point + (dir * switchDistance) + offset; - VanillaSwitch s2 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, + Switch s2 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, point, point - dir, orientation, SwitchPoint.Through); BezierPoint bp2 = s2.GetDivergingPoint(); CreateConnect2Point(crossObj.transform, bp1, bp2, false, false, 1.0f); - return new VanillaSwitch[] { s1, s2 }; + return new Switch[] { s1, s2 }; } /// /// Creates a scissors crossover (2 crossovers in the same place). /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -1200,9 +1202,9 @@ public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaS /// The distance between the parallel tracks. /// The distance between the switches on the same track. /// - /// An array of es in the following order: [0] attach [1] opposite to 0 [2] next to 0 [3] opposite to 2. + /// An array of es in the following order: [0] attach [1] opposite to 0 [2] next to 0 [3] opposite to 2. /// - public static VanillaSwitch[] CreateScissorsCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, + public static Switch[] CreateScissorsCrossover(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, float switchDistance) { // Create 2 crossovers offset from eachother. @@ -1231,23 +1233,23 @@ public static VanillaSwitch[] CreateScissorsCrossover(VanillaSwitch leftPrefab, CreateConnect2Point(t1, c2[0].GetThroughPoint(), c1[1].GetThroughPoint(), false, false, 1.0f); // Return all 4 switches. - return new VanillaSwitch[] { c1[0], c1[1], c2[0], c2[1] }; + return new Switch[] { c1[0], c1[1], c2[0], c2[1] }; } /// /// Creates a double slip. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. /// The side to which the first switch turns to. /// The angle at which the 2 middle tracks cross eachother. /// - /// An array of es in the following order: [0] attach [1] diverging attach [2] opposite to 0 [3] opposite to 1. + /// An array of es in the following order: [0] attach [1] diverging attach [2] opposite to 0 [3] opposite to 1. /// - public static VanillaSwitch[] CreateDoubleSlip(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, + public static Switch[] CreateDoubleSlip(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float crossAngle) { // Create the parent object. @@ -1264,10 +1266,10 @@ public static VanillaSwitch[] CreateDoubleSlip(VanillaSwitch leftPrefab, Vanilla // First side. // Creates a switch, a curve, and then another switch connected through its diverging track. - VanillaSwitch s00 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, attachPoint, handlePosition, orientation, SwitchPoint.Joint); + Switch s00 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, attachPoint, handlePosition, orientation, SwitchPoint.Joint); bp = s00.GetDivergingPoint(); bp = CreateArcCurve(obj.transform, bp.position, bp.globalHandle1, orientation, radius, arc, 180.0f, 0).Curve.Last(); - VanillaSwitch s01 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, + Switch s01 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, FlipOrientation(orientation), SwitchPoint.Diverging); // Calculate the middle crossover's position by interesecting the 2 through tracks. @@ -1280,16 +1282,16 @@ public static VanillaSwitch[] CreateDoubleSlip(VanillaSwitch leftPrefab, Vanilla Vector3 next = MathHelper.MirrorAround(attachPoint, mid); // Repeat the process for the other side. - VanillaSwitch s10 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, next, next + dir, orientation, SwitchPoint.Joint); + Switch s10 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, next, next + dir, orientation, SwitchPoint.Joint); bp = s10.GetDivergingPoint(); bp = CreateArcCurve(obj.transform, bp.position, bp.globalHandle1, orientation, radius, arc, 180.0f, 0).Curve.Last(); - VanillaSwitch s11 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, + Switch s11 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, FlipOrientation(orientation), SwitchPoint.Diverging); CreateConnect2Point(obj.transform, s00.GetThroughPoint(), s10.GetThroughPoint(), false, false, 1.0f); CreateConnect2Point(obj.transform, s01.GetThroughPoint(), s11.GetThroughPoint(), false, false, 1.0f); - return new VanillaSwitch[] { s00, s01, s10, s11 }; + return new Switch[] { s00, s01, s10, s11 }; } /// diff --git a/MapifyEditor/Tools/TrackToolsHelper.cs b/MapifyEditor/Tools/TrackToolsHelper.cs index 028f7276..de6312cb 100644 --- a/MapifyEditor/Tools/TrackToolsHelper.cs +++ b/MapifyEditor/Tools/TrackToolsHelper.cs @@ -44,7 +44,7 @@ public static float CalculateHeightDifference(float startGrade, float endGrade, /// The handle of the attachment point. /// Which point of the switch connects to the attachment point. /// An array with 2 arrays representing the through track (index 0) and diverging track (index 1). - public static SimpleBezier[] GetSwitchBeziers(VanillaSwitch s, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint) + public static SimpleBezier[] GetSwitchBeziers(Switch s, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint) { // Create the original beziers. SimpleBezier[] curves = { @@ -101,19 +101,19 @@ public static SimpleBezier[] GetSwitchBeziers(VanillaSwitch s, Vector3 attachPoi } /// - /// Calculates the radius of the diverging track of a . + /// Calculates the radius of the diverging track of a . /// - public static float CalculateSwitchRadius(VanillaSwitch s) + public static float CalculateSwitchRadius(Switch s) { BezierPoint bp = s.GetDivergingPoint(); return bp.position.z / Mathf.Sin(Mathf.Atan(Mathf.Abs(bp.handle1.x / bp.handle1.z))); } /// - /// Calculates the angle at the end of the diverging track of a . + /// Calculates the angle at the end of the diverging track of a . /// /// The angle in radians. - public static float CalculateSwitchAngle(VanillaSwitch s) + public static float CalculateSwitchAngle(Switch s) { BezierPoint bp = s.GetDivergingPoint(); return Mathf.Atan(Mathf.Abs(bp.handle1.x / bp.handle1.z)); @@ -389,7 +389,7 @@ internal static void CopyTrackFields(Track original, Track other) } // The length of the straight section (middle track) of a crossover. - internal static float CalculateCrossoverDistance(VanillaSwitch switchPrefab, float trackDistance) + internal static float CalculateCrossoverDistance(Switch switchPrefab, float trackDistance) { float targetDistance = trackDistance - (2.0f * Mathf.Abs(switchPrefab.DivergingTrack.Curve[1].position.x)); Vector3 handle = switchPrefab.DivergingTrack.Curve[1].handle1; @@ -398,7 +398,7 @@ internal static float CalculateCrossoverDistance(VanillaSwitch switchPrefab, flo } // The length of the straight section connecting the middle switch to the outer switches in a yard. - internal static float CalculateLengthFromDistanceYardCentre(VanillaSwitch switchPrefab, float trackDistance) + internal static float CalculateLengthFromDistanceYardCentre(Switch switchPrefab, float trackDistance) { float targetDistance = trackDistance - Mathf.Abs(switchPrefab.DivergingTrack.Curve[1].position.x); @@ -411,7 +411,7 @@ internal static float CalculateLengthFromDistanceYardCentre(VanillaSwitch switch } // The length of the straight section connecting the outer switches in a yard. - internal static float CalculateLengthFromDistanceYardSides(VanillaSwitch switchPrefab, float trackDistance) + internal static float CalculateLengthFromDistanceYardSides(Switch switchPrefab, float trackDistance) { float targetDistance = trackDistance; @@ -446,7 +446,7 @@ internal static float CalculateYardMidSwitchDistance(float trackDistance) /// This will only look in the default directory (Mapify folder in the Assets root). /// If a parameter is not null, it will not be replaced. /// - public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, ref VanillaSwitch switchLeft, ref VanillaSwitch switchRight, ref Turntable turntable) + public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, ref Switch switchLeft, ref Switch switchRight, ref Turntable turntable) { string[] guids; @@ -476,7 +476,7 @@ public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, if (guids.Length > 0) { - switchLeft = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); + switchLeft = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); } } @@ -486,7 +486,7 @@ public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, if (guids.Length > 0) { - switchRight = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); + switchRight = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); } } diff --git a/MapifyEditor/Tools/TrackToolsWindow.cs b/MapifyEditor/Tools/TrackToolsWindow.cs index 98e7b52d..32e441ed 100644 --- a/MapifyEditor/Tools/TrackToolsWindow.cs +++ b/MapifyEditor/Tools/TrackToolsWindow.cs @@ -45,7 +45,7 @@ public static void ShowWindow() public Track CurrentTrack => _selectedTracks.Length > 0 ? _selectedTracks[0] : null; public BezierPoint CurrentPoint => _selectedPoints.Length > 0 ? _selectedPoints[0] : null; - public VanillaSwitch CurrentSwitch { get; private set; } + public Switch CurrentSwitch { get; private set; } public Turntable CurrentTurntable { get; private set; } #endregion @@ -146,7 +146,7 @@ private void PrepareSelection() { _selectionType = SelectionType.BezierPoint; } - else if (go.TryGetComponent(out VanillaSwitch s)) + else if (go.TryGetComponent(out Switch s)) { _selectionType = SelectionType.Switch; CurrentSwitch = s; @@ -445,6 +445,7 @@ private bool IsAllowedCreation(bool isBehind, out string tooltip) return false; } + //TODO this one sometimes gives a false positive if (!CheckGrade(isBehind ? CurrentTrack.GetGradeAtStart() : CurrentTrack.GetGradeAtEnd())) { tooltip = "Grade too steep for creation"; @@ -573,12 +574,12 @@ private void RemakeAndRepaint() SceneView.RepaintAll(); } - private VanillaSwitch GetCurrentSwitchPrefab() + private Switch GetCurrentSwitchPrefab() { return IsLeft ? LeftSwitch : RightSwitch; } - private VanillaSwitch GetSwitch(TrackOrientation orientation) + private Switch GetSwitch(TrackOrientation orientation) { if (orientation == TrackOrientation.Left) { diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs index 2a3e1826..64d608da 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs @@ -314,20 +314,27 @@ private void DrawCurveOptions(bool CustomSwitchBranch = false) _radius = EditorGUILayout.FloatField(new GUIContent("Radius", "Radius of the curve"), _radius); - if (!CustomSwitchBranch && GUILayout.Button(new GUIContent("Use switch radius", "Sets the radius to the one of switch curves"), + if (GUILayout.Button(new GUIContent("Use switch radius", "Sets the radius to the one of switch curves"), GUILayout.MaxWidth(140))) { - if (LeftSwitch) + if (CustomSwitchBranch) { - _radius = TrackToolsHelper.CalculateSwitchRadius(LeftSwitch); - } - else if (RightSwitch) - { - _radius = TrackToolsHelper.CalculateSwitchRadius(RightSwitch); + _radius = TrackToolsHelper.DefaultSwitchRadius; } else { - _radius = TrackToolsHelper.DefaultSwitchRadius; + if (LeftSwitch) + { + _radius = TrackToolsHelper.CalculateSwitchRadius(LeftSwitch); + } + else if (RightSwitch) + { + _radius = TrackToolsHelper.CalculateSwitchRadius(RightSwitch); + } + else + { + _radius = TrackToolsHelper.DefaultSwitchRadius; + } } } @@ -362,7 +369,7 @@ private void DrawCurveOptions(bool CustomSwitchBranch = false) _changeArc = EditorGUILayout.ToggleLeft(new GUIContent("Change arc", "Change the arc of the curve instead of the radius to match the length"), - _changeArc, GUILayout.MaxWidth(100)); + _changeArc, GUILayout.MaxWidth(140)); if (changed) { diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs index b69b1f3c..204b3184 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs @@ -13,8 +13,8 @@ public partial class TrackToolsWindow // Track prefabs. private bool _showPrefabs = false; public BufferStop BufferPrefab; - public VanillaSwitch LeftSwitch; - public VanillaSwitch RightSwitch; + public Switch LeftSwitch; + public Switch RightSwitch; public Turntable TurntablePrefab; // Settings. diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs index fb8de2f1..671698fd 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs @@ -77,7 +77,7 @@ private void DrawTrackSelection() if (GUILayout.Button(new GUIContent("Swap tracks", "Swaps the selected track between the through and diverging tracks")) && isSwitch) { - VanillaSwitch s = CurrentTrack.GetComponentInParent(); + Switch s = CurrentTrack.GetComponentInParent(); if (CurrentTrack == s.ThroughTrack) { @@ -186,7 +186,7 @@ private void DrawSwitchSelection() new GUIContent($"{(CurrentSwitch.IsLeft ? "Left" : "Right")}")); EditorGUILayout.BeginHorizontal(); - CurrentSwitch.defaultState = (VanillaSwitch.StandSide)EditorGUILayout.EnumPopup(new GUIContent("Currently set to", + CurrentSwitch.defaultState = (Switch.StandSide)EditorGUILayout.EnumPopup(new GUIContent("Currently set to", "The switch state when exporting"), CurrentSwitch.defaultState); diff --git a/MapifyEditor/TrackComponents/CarDeleter.cs b/MapifyEditor/TrackComponents/CarDeleter.cs new file mode 100644 index 00000000..713e9bc4 --- /dev/null +++ b/MapifyEditor/TrackComponents/CarDeleter.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +namespace Mapify.Editor +{ + [RequireComponent(typeof(Track))] + public class CarDeleter : MonoBehaviour + { + // nothing + } +} diff --git a/MapifyEditor/TrackComponents/Retarder.cs b/MapifyEditor/TrackComponents/Retarder.cs new file mode 100644 index 00000000..b98fb024 --- /dev/null +++ b/MapifyEditor/TrackComponents/Retarder.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +namespace Mapify.Editor +{ + // A retarder is a device used to reduce the speed of freight cars + public class Retarder: MonoBehaviour + { + [Tooltip("The retarder will activate when the speed of the car is above this limit (km/h)")] + public float maxSpeedKMH = 10.0f; + [Tooltip("The maximum brake force of the retarder, in Newtons")] + public float brakeForce = 50000f; + } +} diff --git a/MapifyEditor/TrackComponents/TimedCarSpawner.cs b/MapifyEditor/TrackComponents/TimedCarSpawner.cs new file mode 100644 index 00000000..629c698f --- /dev/null +++ b/MapifyEditor/TrackComponents/TimedCarSpawner.cs @@ -0,0 +1,15 @@ +using UnityEngine; + +namespace Mapify.Editor +{ + [RequireComponent(typeof(Track))] + public class TimedCarSpawner: MonoBehaviour + { + [Tooltip("Interval between spawning, in seconds")] + public float SpawnInterval = 5; + [Tooltip("What types of rolling stock to spawn")] + public VanillaRollingStockType[] TrainCarTypes; + [Tooltip("Enable the handbrake on the spawned car")] + public bool EnableHandBrakeOnSpawn = false; + } +} diff --git a/MapifyEditor/TrackComponents/YardController.cs b/MapifyEditor/TrackComponents/YardController.cs new file mode 100644 index 00000000..b0908a4f --- /dev/null +++ b/MapifyEditor/TrackComponents/YardController.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace Mapify.Editor +{ + public class YardController: MonoBehaviour + { + //TODO validate this stuff + public Track DetectorTrack; + public string StationID; + public string YardID; + } +} diff --git a/MapifyEditor/Trackage/CustomSwitch.cs b/MapifyEditor/Trackage/CustomSwitch.cs index fa5c304b..23e40b44 100644 --- a/MapifyEditor/Trackage/CustomSwitch.cs +++ b/MapifyEditor/Trackage/CustomSwitch.cs @@ -10,6 +10,8 @@ public enum StandSide RIGHT } + public BezierPoint JointPoint => Tracks[0].Curve[0]; + [Tooltip("Which way the switch should be flipped by default")] public byte defaultBranch = 0; @@ -17,6 +19,17 @@ public enum StandSide public StandSide standSide; [Tooltip("Tracks in the switch, from left to right")] - public new Track[] Tracks; + [SerializeField] + private Track[] Tracks; + + public override Track[] GetTracks() + { + return Tracks; + } + + public void SetTracks(Track[] newTracks) + { + Tracks = newTracks; + } } } diff --git a/MapifyEditor/Trackage/VanillaSwitch.cs b/MapifyEditor/Trackage/Switch.cs similarity index 95% rename from MapifyEditor/Trackage/VanillaSwitch.cs rename to MapifyEditor/Trackage/Switch.cs index 360a093a..e8b21cdc 100644 --- a/MapifyEditor/Trackage/VanillaSwitch.cs +++ b/MapifyEditor/Trackage/Switch.cs @@ -3,7 +3,7 @@ namespace Mapify.Editor { [RequireComponent(typeof(VanillaObject))] - public class VanillaSwitch : SwitchBase + public class Switch : SwitchBase { public enum StandSide { diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs index 5af7fdd8..358d34c6 100644 --- a/MapifyEditor/Trackage/SwitchBase.cs +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -8,7 +8,10 @@ namespace Mapify.Editor { public abstract class SwitchBase: MonoBehaviour { - public Track[] Tracks => gameObject.GetComponentsInChildren(); + public virtual Track[] GetTracks() + { + return gameObject.GetComponentsInChildren(); + } // TODO why is this unused // protected void Snap() diff --git a/MapifyEditor/Trackage/SwitchControllerPls.cs b/MapifyEditor/Trackage/SwitchControllerPls.cs deleted file mode 100644 index 78c41471..00000000 --- a/MapifyEditor/Trackage/SwitchControllerPls.cs +++ /dev/null @@ -1,11 +0,0 @@ -using UnityEngine; - -namespace Mapify.Editor -{ - public class SwitchControllerPls: MonoBehaviour - { - //TODO validate has component - public Switch RootSwitch; - public Track DetectorTrack; - } -} diff --git a/MapifyEditor/Trackage/Track.cs b/MapifyEditor/Trackage/Track.cs index 915c8e3e..37d945cc 100644 --- a/MapifyEditor/Trackage/Track.cs +++ b/MapifyEditor/Trackage/Track.cs @@ -45,13 +45,6 @@ public class Track : MonoBehaviour [Tooltip("The purpose of this track")] public TrackType trackType; - [Tooltip("A retarder is a device used to reduce the speed of freight cars")] - public bool isRetarder; - [Tooltip("The retarder will activate when the speed of the car is above this limit (km/h)")] - public float retarderMaxSpeedKMH = 10.0f; - [Tooltip("The maximum brake force of the retarder, in Newtons")] - public float retarderBrakeForce = 50000f; - #if UNITY_EDITOR [Header("Editor Visualization")] [SerializeField] @@ -70,6 +63,7 @@ public BezierCurve Curve { } public bool IsSwitch => GetComponentInParent() != null; + public bool IsVanillaSwitch => GetComponentInParent() != null; public bool IsTurntable => GetComponentInParent() != null; public string LogicName => From f390feb34d3513990f6c2ae25ee8a56495a558f5 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sat, 7 Dec 2024 14:08:58 +0100 Subject: [PATCH 15/38] Build 99.2 --- Mapify/Map/MapLifeCycle.cs | 2 +- Mapify/SceneInitializers/Terrain/DistantTerrainSetup.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mapify/Map/MapLifeCycle.cs b/Mapify/Map/MapLifeCycle.cs index ebe42ebc..71bee184 100644 --- a/Mapify/Map/MapLifeCycle.cs +++ b/Mapify/Map/MapLifeCycle.cs @@ -144,7 +144,7 @@ public static IEnumerator LoadMap(BasicMapInfo basicMapInfo) LevelInfo levelInfo = SingletonBehaviour.Instance; levelInfo.terrainSize = mapInfo.terrainSize; levelInfo.waterLevel = mapInfo.waterLevel; - levelInfo.worldSize = mapInfo.worldSize; + levelInfo.worldSize = new Vector3(mapInfo.worldSize, levelInfo.worldSize.y, mapInfo.worldSize); levelInfo.worldOffset = Vector3.zero; levelInfo.defaultSpawnPosition = mapInfo.defaultSpawnPosition; levelInfo.defaultSpawnRotation = mapInfo.defaultSpawnRotation; diff --git a/Mapify/SceneInitializers/Terrain/DistantTerrainSetup.cs b/Mapify/SceneInitializers/Terrain/DistantTerrainSetup.cs index bb0e93ae..69576012 100644 --- a/Mapify/SceneInitializers/Terrain/DistantTerrainSetup.cs +++ b/Mapify/SceneInitializers/Terrain/DistantTerrainSetup.cs @@ -15,7 +15,7 @@ public override void Run() DistantTerrain distantTerrain = distantTerrainObject.gameObject.AddComponent(); distantTerrain.trackingReference = SingletonBehaviour.Instance.playerTracker.GetTrackerTransform(); distantTerrain.singleTerrainSize = levelInfo.terrainSize; - distantTerrain.worldScale = levelInfo.worldSize; + distantTerrain.worldScale = levelInfo.worldSize.x; distantTerrain.step = 128; // No idea what this means but this is what it's set to in the game. } } From baab152486e1876631096f751f3393e5bcf8182d Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 19 Nov 2024 15:08:10 +0100 Subject: [PATCH 16/38] Implemented custom switches --- .../SceneInitializers/Railway/TrackSetup.cs | 132 ++++++++++++++++-- Mapify/Utils/Extensions.cs | 59 ++++++++ .../Validators/Railway/SwitchValidator.cs | 17 ++- MapifyEditor/Trackage/CustomSwitch.cs | 19 +++ MapifyEditor/Trackage/Switch.cs | 60 +------- MapifyEditor/Trackage/SwitchBase.cs | 57 ++++++++ MapifyEditor/Trackage/Track.cs | 6 +- 7 files changed, 269 insertions(+), 81 deletions(-) create mode 100644 MapifyEditor/Trackage/CustomSwitch.cs create mode 100644 MapifyEditor/Trackage/SwitchBase.cs diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 6d6afa5d..72737765 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -2,6 +2,7 @@ using System.Linq; using DV; using Mapify.Editor; +using Mapify.Editor.Utils; using Mapify.Utils; using UnityEngine; @@ -10,12 +11,14 @@ namespace Mapify.SceneInitializers.Railway [SceneSetupPriority(int.MinValue)] public class TrackSetup : SceneSetup { + private const string IN_JUNCTION_NAME = "in_junction"; + public override void Run() { Track[] tracks = Object.FindObjectsOfType().Where(t => !t.IsSwitch).ToArray(); Mapify.LogDebug(() => "Creating RailTracks"); - CreateRailTracks(tracks); + CreateRailTracks(tracks, false); Mapify.LogDebug(() => "Creating Junctions"); CreateJunctions(); @@ -29,22 +32,125 @@ public override void Run() RailManager.TestConnections(); } - private static void CreateRailTracks(IEnumerable tracks) + private static List CreateRailTracks(IEnumerable tracks, bool setActive) { - foreach (Track track in tracks) + return tracks.Select(track => CreateRailTrack(track, setActive)).ToList(); + } + + private static RailTrack CreateRailTrack(Track track, bool setActive) + { + track.gameObject.SetActive(setActive); + if (!track.IsSwitch && !track.IsTurntable) + track.name = track.LogicName; + var railTrack = track.gameObject.AddComponent(); + railTrack.generateColliders = !track.IsTurntable; + railTrack.dontChange = false; + railTrack.age = (int)track.age; + railTrack.ApplyRailType(); + + return railTrack; + } + + private static void CreateJunctions() + { + CreateCustomSwitches(); + CreateVanillaSwitches(); + } + + private static void CreateCustomSwitches() + { + foreach (var customSwitch in Object.FindObjectsOfType()) { - track.gameObject.SetActive(false); - if (!track.IsSwitch && !track.IsTurntable) - track.name = track.LogicName; - RailTrack railTrack = track.gameObject.AddComponent(); - railTrack.generateColliders = !track.IsTurntable; - railTrack.dontChange = false; - railTrack.age = (int)track.age; - railTrack.ApplyRailType(); + CreateCustomSwitch(customSwitch); } } - private static void CreateJunctions() + private static void CreateCustomSwitch(CustomSwitch customSwitch) + { + var vanillaAsset = customSwitch.standSide == CustomSwitch.StandSide.LEFT ? VanillaAsset.SwitchLeft : VanillaAsset.SwitchRight; + + var prefabClone = AssetCopier.Instantiate(vanillaAsset); + prefabClone.transform.SetPositionAndRotation(customSwitch.transform.position, customSwitch.transform.rotation); + + //Junction + var inJunction = prefabClone.GetComponentInChildren(); + inJunction.selectedBranch = customSwitch.defaultBranch; + + DestroyPrefabTracks(prefabClone); + CreateNewTracks(customSwitch, prefabClone, inJunction); + SetupGraphical(prefabClone); + } + + private static void DestroyPrefabTracks(GameObject prefabClone) + { + // must be destroyed inmediately to prevent: + // "Junction 'in_junction' doesn't have track '[track diverging]' assigned" + // from RailManager.TestConnections + Object.DestroyImmediate(prefabClone.FindChildByName("[track through]")); + Object.DestroyImmediate(prefabClone.FindChildByName("[track diverging]")); + } + + private static void CreateNewTracks(CustomSwitch customSwitch, GameObject prefabClone, Junction switchJunction) + { + var railTracksInSwitch = CreateRailTracks( + customSwitch.gameObject + .GetComponentsInChildren(), true + ); + + railTracksInSwitch = railTracksInSwitch + .OrderBy(track => track.gameObject.name) + .ToList(); + + if (!railTracksInSwitch.Any()) + { + Mapify.LogError($"{nameof(CreateCustomSwitches)}: {nameof(railTracksInSwitch)} is empty"); + return; + } + + switchJunction.outBranches = new List(); + + foreach (var t in railTracksInSwitch) + { + t.transform.SetParent(prefabClone.transform, true); + + t.inBranch = new Junction.Branch(); + t.inBranch.track = null; + t.inJunction = switchJunction; + + switchJunction.outBranches.Add(new Junction.Branch(t, true)); + } + + //track before the switch + switchJunction.inBranch = switchJunction.FindClosestBranch(railTracksInSwitch[0].curve[0].transform.position); + + //connect the track before the switch to the switch + if (switchJunction.inBranch.first) + { + switchJunction.inBranch.track.inJunction = switchJunction; + } + else + { + switchJunction.inBranch.track.outJunction = switchJunction; + } + + if (switchJunction.inBranch == null) + { + Mapify.LogError($"{nameof(CreateNewTracks)}: inBranch is null"); + } + } + + private static void SetupGraphical(GameObject prefabClone) + { + var graphical = prefabClone.FindChildByName("Graphical"); + string[] toDelete = {"ballast", "anchors", "sleepers", "rails_static", "rails_moving"}; + foreach (var child in graphical.transform.GetChildren()) + { + if (!toDelete.Contains(child.name)) continue; + Object.Destroy(child.gameObject); + } + } + + private static void CreateVanillaSwitches() { foreach (Switch sw in Object.FindObjectsOfType()) { @@ -52,7 +158,7 @@ private static void CreateJunctions() VanillaAsset vanillaAsset = sw.GetComponent().asset; GameObject prefabClone = AssetCopier.Instantiate(vanillaAsset, false); Transform prefabCloneTransform = prefabClone.transform; - Transform inJunction = prefabCloneTransform.Find("in_junction"); + Transform inJunction = prefabCloneTransform.Find(IN_JUNCTION_NAME); Vector3 offset = prefabCloneTransform.position - inJunction.position; foreach (Transform child in prefabCloneTransform) child.transform.position += offset; diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 4e7a1edd..be69e9e2 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -12,6 +12,7 @@ using Mapify.Map; using Newtonsoft.Json.Linq; using UnityEngine; +using Object = UnityEngine.Object; namespace Mapify.Utils { @@ -218,6 +219,64 @@ public static void SetBasicMapInfo(this SaveGameData saveGameData, BasicMapInfo saveGameData.SetJObject(SAVE_KEY_NAME, JObject.FromObject(basicMapInfo)); } + public static RailTrack GetRailTrack(this RailTrackRegistry registry, string stationID, string yardID, byte trackNumber) + { + var query = $"[{stationID}]_[{yardID}-{trackNumber:D2}"; + + return registry.AllTracks.FirstOrDefault(track => track.name.Contains(query)); + } + + public static void SwitchTo(this Junction junction, int branchNumber, Junction.SwitchMode switchMode) + { + Mapify.LogDebug($"junction {junction.name} switch to {branchNumber}"); + + junction.selectedBranch = branchNumber - 1; + junction.Switch(switchMode); + } + + public static Junction.Branch FindClosestBranch(this Junction junction, Vector3 fromPoint, float maxRange = 5f) + { + var closestDistance = float.PositiveInfinity; + + RailTrack track = null; + var first = false; + + foreach (var foundTrack in Resources.FindObjectsOfTypeAll()) + { + // skip the tracks in the junction + if(junction.outBranches.Any(branch => branch.track == foundTrack)) continue; + + if (!foundTrack.curve || foundTrack.curve.pointCount < 2) continue; + + var firstPoint = foundTrack.curve[0]; + + var distanceToFirst = Vector3.SqrMagnitude(fromPoint - firstPoint.position); + if (distanceToFirst < maxRange * (double) maxRange && distanceToFirst < (double) closestDistance) + { + closestDistance = distanceToFirst; + track = foundTrack; + first = true; + } + + var lastPoint = foundTrack.curve.Last(); + var distanceToLast = Vector3.SqrMagnitude(fromPoint - lastPoint.position); + if (distanceToLast < maxRange * (double) maxRange && distanceToLast < (double) closestDistance) + { + closestDistance = distanceToLast; + track = foundTrack; + first = false; + } + } + + if (track == null) + { + Mapify.LogError($"Failed to find closest branch for {junction.name}"); + return null; + } + + return new Junction.Branch(track, first); + } + #endregion #region Mapify diff --git a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs index bfd52493..f1efe9c6 100644 --- a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs @@ -10,14 +10,17 @@ public class SwitchValidator : Validator { protected override IEnumerator Validate(Scenes scenes) { - foreach (Switch sw in scenes.railwayScene.GetAllComponents()) + foreach (var switch_ in scenes.railwayScene.GetAllComponents()) { - Track divergingTrack = sw.DivergingTrack; - Track throughTrack = sw.ThroughTrack; - divergingTrack.Snap(); - throughTrack.Snap(); - if (!divergingTrack.isInSnapped || !divergingTrack.isOutSnapped || !throughTrack.isInSnapped || !throughTrack.isOutSnapped) - yield return Result.Error("Switches must have a track attached to all points", sw); + foreach (var track in switch_.GetComponentsInChildren()) + { + track.Snap(); + + if (track.isInSnapped && track.isOutSnapped) continue; + + yield return Result.Error("Switches must have a track attached to all points", switch_); + break; + } } } } diff --git a/MapifyEditor/Trackage/CustomSwitch.cs b/MapifyEditor/Trackage/CustomSwitch.cs new file mode 100644 index 00000000..91c22e9c --- /dev/null +++ b/MapifyEditor/Trackage/CustomSwitch.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +namespace Mapify.Editor +{ + public class CustomSwitch: SwitchBase + { + public enum StandSide + { + LEFT, + RIGHT + } + + [Tooltip("Which way the switch should be flipped by default")] + public int defaultBranch = 0; + + [Tooltip("Which side of the switch the stand will appear on")] + public StandSide standSide; + } +} diff --git a/MapifyEditor/Trackage/Switch.cs b/MapifyEditor/Trackage/Switch.cs index 7dce3ff0..752ee456 100644 --- a/MapifyEditor/Trackage/Switch.cs +++ b/MapifyEditor/Trackage/Switch.cs @@ -10,7 +10,7 @@ namespace Mapify.Editor { [RequireComponent(typeof(VanillaObject))] - public class Switch : MonoBehaviour + public class Switch : SwitchBase { public enum StandSide { @@ -20,68 +20,12 @@ public enum StandSide [Tooltip("Which side of the switch the stand will appear on")] public StandSide standSide; + [Tooltip("Which way the switch should be flipped by default")] public StandSide defaultState; public Track ThroughTrack => transform.Find("[track through]").GetComponent(); public Track DivergingTrack => transform.Find("[track diverging]").GetComponent(); public bool IsLeft => DivergingTrack.Curve.Last().localPosition.x < 0; - - private void OnDrawGizmos() - { - if (transform.DistToSceneCamera() >= Track.SNAP_UPDATE_RANGE_SQR) - return; - Snap(); - } - - public void Snap() - { -#if UNITY_EDITOR - BezierPoint[] bezierPoints = FindObjectsOfType(); - GameObject[] selectedObjects = Selection.gameObjects; - bool isSelected = selectedObjects.Contains(gameObject); - TrySnap(bezierPoints, isSelected, 0); - TrySnap(bezierPoints, isSelected, 1); - TrySnap(bezierPoints, isSelected, 2); -#endif - } - - private void TrySnap(IEnumerable points, bool move, byte which) - { - Transform reference; - switch (which) - { - case 0: - reference = transform; - break; - case 1: - reference = DivergingTrack.Curve.Last().transform; - break; - case 2: - reference = ThroughTrack.Curve.Last().transform; - break; - default: - throw new ArgumentOutOfRangeException(nameof(which)); - } - - Vector3 pos = reference.position; - Vector3 closestPos = Vector3.zero; - float closestDist = float.MaxValue; - foreach (BezierPoint otherBP in points) - { - if (otherBP.Curve().GetComponentInParent() == this) continue; - Vector3 otherPos = otherBP.transform.position; - float dist = Mathf.Abs(Vector3.Distance(otherPos, pos)); - if (dist > Track.SNAP_RANGE || dist >= closestDist) continue; - if (otherBP.GetComponentInParent().IsSwitch) continue; - closestPos = otherPos; - closestDist = dist; - } - - if (closestDist >= float.MaxValue) return; - - if (move) - transform.position = closestPos + (transform.position - reference.position); - } } } diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs new file mode 100644 index 00000000..ee28afc3 --- /dev/null +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using System.Linq; +using Mapify.Editor.Utils; +using UnityEditor; +using UnityEngine; + +namespace Mapify.Editor +{ + public abstract class SwitchBase: MonoBehaviour + { + public Track[] Tracks => gameObject.GetComponentsInChildren(); + + protected void Snap() + { +#if UNITY_EDITOR + BezierPoint[] bezierPoints = FindObjectsOfType(); + GameObject[] selectedObjects = Selection.gameObjects; + bool isSelected = selectedObjects.Contains(gameObject); + + TrySnap(bezierPoints, isSelected, transform); + foreach (var track in Tracks) + { + TrySnap(bezierPoints, isSelected, track.Curve.Last().transform); + } +#endif + } + + private void TrySnap(IEnumerable points, bool move, Transform reference) + { + var referencePosition = reference.position; + var closestPos = Vector3.zero; + var closestDist = float.MaxValue; + + foreach (var otherPoint in points) + { + if (otherPoint.Curve().GetComponentInParent() == this) continue; + + var otherPosition = otherPoint.transform.position; + var dist = Mathf.Abs(Vector3.Distance(otherPosition, referencePosition)); + + if (dist > Track.SNAP_RANGE || dist >= closestDist) continue; + + var aTrack = otherPoint.GetComponentInParent(); + if (aTrack.IsSwitch) continue; + + closestPos = otherPosition; + closestDist = dist; + } + + if (closestDist >= float.MaxValue) return; + + if (move) { + transform.position = closestPos + (transform.position - reference.position); + } + } + } +} diff --git a/MapifyEditor/Trackage/Track.cs b/MapifyEditor/Trackage/Track.cs index 7cf715d6..bd57717b 100644 --- a/MapifyEditor/Trackage/Track.cs +++ b/MapifyEditor/Trackage/Track.cs @@ -61,12 +61,12 @@ public BezierCurve Curve { } } - private Switch _parentSwitch; + private SwitchBase _parentSwitch; - private Switch ParentSwitch { + private SwitchBase ParentSwitch { get { if (_parentSwitch) return _parentSwitch; - return _parentSwitch = GetComponentInParent(); + return _parentSwitch = GetComponentInParent(); } } From 1d49fd7d7785096603817e4798b9990c4eb6211a Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:29:54 +0100 Subject: [PATCH 17/38] ez debug logging --- Mapify/Mapify.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Mapify/Mapify.cs b/Mapify/Mapify.cs index 068ddac3..5b3fd9c7 100644 --- a/Mapify/Mapify.cs +++ b/Mapify/Mapify.cs @@ -57,12 +57,22 @@ private static void Patch() #region Logging + public static void LogDebugExtreme(object msg) + { + LogDebugExtreme(() => msg); + } + public static void LogDebugExtreme(Func resolver) { if (Settings.ExtremelyVerboseLogging) LogDebug(resolver); } + public static void LogDebug(object msg) + { + LogDebug(() => msg); + } + public static void LogDebug(Func resolver) { if (Settings.VerboseLogging) From 6c2dbc93a3974c67f49b1591fe313577743c637a Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:10:08 +0100 Subject: [PATCH 18/38] make the visual part of the switch work with switches that have more than 2 branches --- Mapify/Mapify.csproj | 1 + Mapify/Patches/VisualSwitchPatch.cs | 75 +++++++++++++++++++ .../SceneInitializers/Railway/TrackSetup.cs | 3 +- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 Mapify/Patches/VisualSwitchPatch.cs diff --git a/Mapify/Mapify.csproj b/Mapify/Mapify.csproj index 350321be..289acdde 100644 --- a/Mapify/Mapify.csproj +++ b/Mapify/Mapify.csproj @@ -58,6 +58,7 @@ + diff --git a/Mapify/Patches/VisualSwitchPatch.cs b/Mapify/Patches/VisualSwitchPatch.cs new file mode 100644 index 00000000..1a204982 --- /dev/null +++ b/Mapify/Patches/VisualSwitchPatch.cs @@ -0,0 +1,75 @@ +using System.Collections; +using HarmonyLib; +using UnityEngine; + +namespace Mapify.Patches +{ + /// + /// Makes the visual part of the switch work with switches that have more than 2 branches. + /// + [HarmonyPatch(typeof(VisualSwitch), nameof(VisualSwitch.PlayAnimation))] + public class VisualSwitch_PlayAnimation_Patch + { + private static readonly int Speed = Animator.StringToHash("speed"); + private const int ANIMATION_LAYER = 0; + private const string STATE_NAME = "junction"; + + private static bool Prefix(VisualSwitch __instance) + { + if (__instance.junction.outBranches.Count <= 2) return true; + + if (!(bool)(Object)__instance.animator) return false; + + __instance.EnableAnimator(); + + var previousTime = __instance.animator.GetCurrentAnimatorStateInfo(ANIMATION_LAYER).normalizedTime; + var newTime = map( + __instance.junction.selectedBranch, + 0, __instance.junction.outBranches.Count - 1, + 0, 1 + ); + + var playForward = newTime > previousTime; + + // set animation direction + var speed = playForward ? __instance.speedMult : -__instance.speedMult; + __instance.animator.SetFloat(Speed, speed); + + // play animation + __instance.animator.Play(STATE_NAME, ANIMATION_LAYER, previousTime); + + __instance.StopAllCoroutines(); + var routine = Pause(newTime, playForward, __instance.animator); + __instance.StartCoroutine(routine); + + return false; + } + + private static IEnumerator Pause(float pauseTime, bool playForward, Animator animator) + { + if (playForward) + { + while (animator.GetCurrentAnimatorStateInfo(ANIMATION_LAYER).normalizedTime < pauseTime) + { + yield return null; + } + } + else + { + while (animator.GetCurrentAnimatorStateInfo(ANIMATION_LAYER).normalizedTime > pauseTime) + { + yield return null; + } + } + + // pause + animator.SetFloat(Speed, 0); + + Mapify.Log($"{nameof(Pause)} {animator.GetCurrentAnimatorStateInfo(ANIMATION_LAYER).normalizedTime} PAUSED"); + } + + private static float map(float value, float in_min, float in_max, float out_min, float out_max) { + return (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + } + } +} diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 72737765..722ba018 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -67,7 +67,8 @@ private static void CreateCustomSwitches() private static void CreateCustomSwitch(CustomSwitch customSwitch) { - var vanillaAsset = customSwitch.standSide == CustomSwitch.StandSide.LEFT ? VanillaAsset.SwitchLeft : VanillaAsset.SwitchRight; + // we use SwitchRight because with SwitchLeft the animation would be mirrored + var vanillaAsset = customSwitch.standSide == CustomSwitch.StandSide.LEFT ? VanillaAsset.SwitchRightOuterSign : VanillaAsset.SwitchRight; var prefabClone = AssetCopier.Instantiate(vanillaAsset); prefabClone.transform.SetPositionAndRotation(customSwitch.transform.position, customSwitch.transform.rotation); From 4897ada1f7102e15e8febc9516b155aae3079271 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Mon, 2 Dec 2024 16:03:45 +0100 Subject: [PATCH 19/38] track tools: implement custom switch --- .../BuildUpdaters/Railway/SwitchUpdater.cs | 6 +- .../Validators/Railway/SwitchValidator.cs | 10 +- MapifyEditor/Tools/ToolEnums.cs | 14 +- .../Tools/TrackToolsCreator.Previews.cs | 58 +++- MapifyEditor/Tools/TrackToolsCreator.cs | 171 ++++++---- MapifyEditor/Tools/TrackToolsHelper.cs | 37 +-- MapifyEditor/Tools/TrackToolsWindow.cs | 24 +- .../TrackToolsWindowDrawing/CreatePreviews.cs | 292 ++++++++---------- .../Tools/TrackToolsWindowGUI/Creation.cs | 56 +++- .../Tools/TrackToolsWindowGUI/Other.cs | 65 +++- .../Tools/TrackToolsWindowGUI/Selection.cs | 4 +- MapifyEditor/Trackage/CustomSwitch.cs | 5 +- MapifyEditor/Trackage/SwitchBase.cs | 87 +++--- MapifyEditor/Trackage/Track.cs | 11 +- .../Trackage/{Switch.cs => VanillaSwitch.cs} | 14 +- MapifyEditor/Utils/Extensions.cs | 6 - 16 files changed, 499 insertions(+), 361 deletions(-) rename MapifyEditor/Trackage/{Switch.cs => VanillaSwitch.cs} (67%) diff --git a/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs b/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs index 12b46810..78018e8f 100644 --- a/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs +++ b/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs @@ -7,14 +7,14 @@ public class SwitchUpdater : BuildUpdater { protected override void Update(Scenes scenes) { - foreach (Switch sw in scenes.railwayScene.GetAllComponents()) + foreach (VanillaSwitch sw in scenes.railwayScene.GetAllComponents()) { VanillaObject vanillaObject = sw.GetComponent(); vanillaObject.asset = sw.IsLeft - ? sw.standSide == Switch.StandSide.DIVERGING + ? sw.standSide == VanillaSwitch.StandSide.DIVERGING ? VanillaAsset.SwitchLeft : VanillaAsset.SwitchLeftOuterSign - : sw.standSide == Switch.StandSide.DIVERGING + : sw.standSide == VanillaSwitch.StandSide.DIVERGING ? VanillaAsset.SwitchRight : VanillaAsset.SwitchRightOuterSign; } diff --git a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs index f1efe9c6..df38cf25 100644 --- a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs @@ -1,5 +1,6 @@ #if UNITY_EDITOR using System.Collections.Generic; +using System.Linq; using Mapify.Editor; using Mapify.Editor.Utils; using Mapify.Editor.Validators; @@ -12,7 +13,12 @@ protected override IEnumerator Validate(Scenes scenes) { foreach (var switch_ in scenes.railwayScene.GetAllComponents()) { - foreach (var track in switch_.GetComponentsInChildren()) + if (switch_.Tracks.Length < 2) + { + yield return Result.Error("Switches must have at least 2 branches", switch_); + } + + foreach (var track in switch_.Tracks) { track.Snap(); @@ -21,6 +27,8 @@ protected override IEnumerator Validate(Scenes scenes) yield return Result.Error("Switches must have a track attached to all points", switch_); break; } + + //TODO valideer dat de tracks met de [0] aan elkaar zitten } } } diff --git a/MapifyEditor/Tools/ToolEnums.cs b/MapifyEditor/Tools/ToolEnums.cs index 1e3ccaa0..5484a97c 100644 --- a/MapifyEditor/Tools/ToolEnums.cs +++ b/MapifyEditor/Tools/ToolEnums.cs @@ -12,6 +12,12 @@ public enum TrackOrientation Right } + public enum SwitchType + { + Vanilla, + Custom + } + public enum SwitchPoint { Joint, @@ -85,14 +91,14 @@ public static SwitchPoint NextPoint(SwitchPoint switchPoint) return SwitchPoint.Joint; } - public static Switch.StandSide FlipStand(Switch.StandSide standSide) + public static VanillaSwitch.StandSide FlipStand(VanillaSwitch.StandSide standSide) { - if (standSide == Switch.StandSide.THROUGH) + if (standSide == VanillaSwitch.StandSide.THROUGH) { - return Switch.StandSide.DIVERGING; + return VanillaSwitch.StandSide.DIVERGING; } - return Switch.StandSide.THROUGH; + return VanillaSwitch.StandSide.THROUGH; } } } diff --git a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs index c58482f5..57787287 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs @@ -65,7 +65,7 @@ public static Vector3[] PreviewArcCurve(Vector3 attachPoint, Vector3 handlePosit return lines.ToArray(); } - public static Vector3[][] PreviewSwitch(Switch prefab, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint, + public static Vector3[][] PreviewSwitch(VanillaSwitch prefab, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint, int samples = 8) { var curves = TrackToolsHelper.GetSwitchBeziers(prefab, attachPoint, handlePosition, connectingPoint); @@ -77,7 +77,47 @@ public static Vector3[][] PreviewSwitch(Switch prefab, Vector3 attachPoint, Vect }; } - public static Vector3[][] PreviewYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewCustomSwitch(Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, int connectingPoint, float radius, float arc, float endGrade, + int samples = 8) + { + //TODO connectingPoint + + var curves = new Vector3[switchBranchesCount][]; + var length = radius * arc * Mathf.Deg2Rad; + + for (int branchIndex = 0; branchIndex < switchBranchesCount; branchIndex++) + { + if (switchBranchesCount % 2 == 1 && branchIndex == (switchBranchesCount-1) / 2) + { + //middle track + curves[branchIndex] = PreviewStraight(attachPoint, handlePosition, length, endGrade, out _); + continue; + } + + TrackOrientation trackOrientation; + float thisRadius; + + if (branchIndex < switchBranchesCount / 2.0) + { + //left of center + trackOrientation = TrackOrientation.Left; + thisRadius = (branchIndex + 1) * radius; + } + else + { + //right of center + trackOrientation = TrackOrientation.Right; + thisRadius = (switchBranchesCount - branchIndex) * radius; + } + + var thisArc = length / thisRadius * Mathf.Rad2Deg; + curves[branchIndex] = PreviewArcCurve(attachPoint, handlePosition, trackOrientation, thisRadius, thisArc, 360, endGrade, out _, samples); + } + + return curves; + } + + public static Vector3[][] PreviewYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples = 8) { if (yardOptions.Half) @@ -90,7 +130,7 @@ public static Vector3[][] PreviewYard(Switch leftPrefab, Switch rightPrefab, Vec } } - private static Vector3[][] PreviewFullYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + private static Vector3[][] PreviewFullYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples) { List results = new List(); @@ -296,7 +336,7 @@ private static Vector3[][] PreviewFullYard(Switch leftPrefab, Switch rightPrefab return results.ToArray(); } - private static Vector3[][] PreviewHalfYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + private static Vector3[][] PreviewHalfYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples) { List results = new List(); @@ -451,13 +491,13 @@ private static Vector3[][] PreviewHalfYard(Switch leftPrefab, Switch rightPrefab return results.ToArray(); } - private static Vector3[][] PreviewSwitchSprawl(Switch leftPrefab, Switch rightPrefab, YardOptions yardOptions, TrackOrientation orientation, + private static Vector3[][] PreviewSwitchSprawl(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, YardOptions yardOptions, TrackOrientation orientation, float trackDistance, bool mainSide, bool reverse, out Vector3[] trackPoints, int samples = 8) { List results = new List(); List points = new List(); - Switch current = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; + VanillaSwitch current = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; Vector3[][] temp = PreviewSwitch(current, Vector3.zero, Vector3.back, SwitchPoint.Joint, samples); results.AddRange(temp); @@ -557,7 +597,7 @@ public static Vector3[] PreviewConnect2(Vector3 p0, Vector3 h0, Vector3 p1, Vect samples); } - public static Vector3[][] PreviewCrossover(Switch prefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewCrossover(VanillaSwitch prefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, bool isTrailing, float switchDistance, int samples = 8) { List results = new List(); @@ -585,7 +625,7 @@ public static Vector3[][] PreviewCrossover(Switch prefab, Vector3 attachPoint, V return results.ToArray(); } - public static Vector3[][] PreviewScissorsCrossover(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewScissorsCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, float switchDistance, int samples = 8) { List results = new List(); @@ -611,7 +651,7 @@ public static Vector3[][] PreviewScissorsCrossover(Switch leftPrefab, Switch rig return results.ToArray(); } - public static Vector3[][] PreviewDoubleSlip(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewDoubleSlip(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float crossAngle, int samples = 8) { List results = new List(); diff --git a/MapifyEditor/Tools/TrackToolsCreator.cs b/MapifyEditor/Tools/TrackToolsCreator.cs index f452beb5..472edc9f 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.cs @@ -239,10 +239,10 @@ public static Track CreateArcCurve(Transform parent, Vector3 attachPoint, Vector // Switches. /// - /// Instantiates a . + /// Instantiates a . /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new switch. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -251,15 +251,14 @@ public static Track CreateArcCurve(Transform parent, Vector3 attachPoint, Vector /// The instantiated . /// /// Derail Valley switches are static assets, and their tracks cannot be changed. - /// The switches are also always made at a grade of 0%. + /// The switches are also always made at a grade of 0%. /// - public static Switch CreateSwitch(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static VanillaSwitch CreateVanillaSwitch(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, SwitchPoint connectingPoint) { // Create switch object. - Switch s = Object.Instantiate(orientation == TrackOrientation.Left ? leftPrefab : rightPrefab); + VanillaSwitch s = Object.Instantiate(orientation == TrackOrientation.Left ? leftPrefab : rightPrefab, parent); s.gameObject.name = $"[Switch {orientation}]"; - s.transform.parent = parent; // Helper variables. Vector3 pivot; Quaternion rot; @@ -296,14 +295,62 @@ public static Switch CreateSwitch(Switch leftPrefab, Switch rightPrefab, Transfo return s; } + /// + /// Creates a switch without the limitations of the base game switches + /// + public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, + int connectingPoint, float radius, float arc, float endGrade) + { + //TODO connectingPoint + + var switchObject = new GameObject($"[Switch w/ {switchBranchesCount} branches]"); + var switchComponent = switchObject.AddComponent(); + //TODO + switchComponent.defaultBranch = 0; + switchComponent.standSide = CustomSwitch.StandSide.LEFT; + + var tracks = new Track[switchBranchesCount]; + var length = radius * arc * Mathf.Deg2Rad; + + for (int branchIndex = 0; branchIndex < switchBranchesCount; branchIndex++) + { + if (switchBranchesCount % 2 == 1 && branchIndex == (switchBranchesCount-1) / 2) + { + //middle track + tracks[branchIndex] = CreateStraight(switchObject.transform, attachPoint, handlePosition, length, endGrade); + continue; + } + + TrackOrientation trackOrientation; + float thisRadius; + + if (branchIndex < switchBranchesCount / 2.0) + { + //left of center + trackOrientation = TrackOrientation.Left; + thisRadius = (branchIndex + 1) * radius; + } + else + { + //right of center + trackOrientation = TrackOrientation.Right; + thisRadius = (switchBranchesCount - branchIndex) * radius; + } + + var thisArc = length / thisRadius * Mathf.Rad2Deg; + tracks[branchIndex] = CreateArcCurve(switchObject.transform, attachPoint, handlePosition, trackOrientation, thisRadius, thisArc, 360, endGrade); + } + + switchComponent.Tracks = tracks; + return switchComponent; + } // Yards. /// /// Creates a yard with similar shape to the ones present in the base game. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. - /// The base track prefab. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the first switch. /// Handle of the attachment point for the first switch. @@ -319,7 +366,7 @@ public static Switch CreateSwitch(Switch leftPrefab, Switch rightPrefab, Transfo /// The starting number of the sidings. /// Whether the track numbers should increase FROM the starting ID or decrease TO the starting ID. /// An array with all sidings. - /// An array with the es at each end of the yard. + /// An array with the es at each end of the yard. /// /// For yards with the same number of tracks on both sides, it is recommended to set to true. /// This allows for yards with a shorter overall length, and with similar lengths on both sides. If the number of sides is different, @@ -341,8 +388,8 @@ public static Switch CreateSwitch(Switch leftPrefab, Switch rightPrefab, Transfo /// total tracks, will use the numbers 3, 4, 5, 6, and 7 always, but the order will be reversed. /// /// - /// - public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + /// + public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, bool half, bool alternateSides, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -363,8 +410,8 @@ public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transfo /// /// Creates a yard with similar shape to the ones present in the base game. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The base track prefab. /// The parent for the new track. /// Attachment point for the first switch. @@ -373,9 +420,9 @@ public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transfo /// The distance between the sidings. /// Settings for the creation of the yard. /// An array with all sidings. - /// An array with the es at each end of the yard. - /// - public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + /// An array with the es at each end of the yard. + /// + public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, out Track[] sidings) { return CreateYard(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, trackDistance, @@ -383,7 +430,7 @@ public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transfo yardOptions.StationId, yardOptions.YardId, yardOptions.StartTrackId, yardOptions.ReverseNumbers, out sidings); } - private static Switch[] CreateFullYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + private static VanillaSwitch[] CreateFullYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, bool alternateSides, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -393,9 +440,9 @@ private static Switch[] CreateFullYard(Switch leftPrefab, Switch rightPrefab, Tr } Vector3 dir = (attachPoint - handlePosition).normalized; - Switch start; - Switch end; - Switch s; + VanillaSwitch start; + VanillaSwitch end; + VanillaSwitch s; Track t; // Points to connect each yard track. @@ -598,10 +645,10 @@ private static Switch[] CreateFullYard(Switch leftPrefab, Switch rightPrefab, Tr Object.DestroyImmediate(endObj); sidings = storageTracks.ToArray(); - return new Switch[] { start, end }; + return new VanillaSwitch[] { start, end }; } - private static Switch[] CreateHalfYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + private static VanillaSwitch[] CreateHalfYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -619,8 +666,8 @@ private static Switch[] CreateHalfYard(Switch leftPrefab, Switch rightPrefab, Tr rotDir = -rotDir; } - Switch start; - Switch s; + VanillaSwitch start; + VanillaSwitch s; Track t; // Points to connect each yard track. @@ -806,20 +853,20 @@ void MoveDistance(Vector3 distance) Object.DestroyImmediate(startObj); sidings = storageTracks.ToArray(); - return new Switch[] { start }; + return new VanillaSwitch[] { start }; } // Switches on each side of the yard. - private static List CreateSwitchSprawl(Switch leftPrefab, Switch rightPrefab, Transform parent, - Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, int sideTracks, float trackDistance, out Switch start, + private static List CreateSwitchSprawl(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, + Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, int sideTracks, float trackDistance, out VanillaSwitch start, out Track[] endMerge) { // Starting switch. // Switch stands are all on the outside of the yard. - start = CreateSwitch(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, SwitchPoint.Joint); - start.standSide = Switch.StandSide.DIVERGING; - start.defaultState = Switch.StandSide.THROUGH; - Switch s = start; + start = CreateVanillaSwitch(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, SwitchPoint.Joint); + start.standSide = VanillaSwitch.StandSide.DIVERGING; + start.defaultState = VanillaSwitch.StandSide.THROUGH; + VanillaSwitch s = start; BezierPoint now = s.GetDivergingPoint(); // Points where each track will be. @@ -838,12 +885,12 @@ private static List CreateSwitchSprawl(Switch leftPrefab, Switch ri for (int i = 1; i < sideTracks; i++) { t = CreateStraight(parent, now.position, now.globalHandle1, length, 0); - s = CreateSwitch(leftPrefab, rightPrefab, parent, t.Curve[1].position, t.Curve[1].globalHandle1, + s = CreateVanillaSwitch(leftPrefab, rightPrefab, parent, t.Curve[1].position, t.Curve[1].globalHandle1, orientation, SwitchPoint.Joint); now = s.GetThroughPoint(); points.Add(s.GetDivergingPoint()); - s.standSide = Switch.StandSide.THROUGH; - s.defaultState = Switch.StandSide.THROUGH; + s.standSide = VanillaSwitch.StandSide.THROUGH; + s.defaultState = VanillaSwitch.StandSide.THROUGH; length = sideL; } @@ -964,16 +1011,16 @@ public static BufferStop CreateBuffer(BufferStop prefab, Transform parent, Vecto } /// - /// Instantiates the diverging track of a only. + /// Instantiates the diverging track of a only. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. /// Which side the curve turns to. /// The instantiated . - public static Track CreateSwitchCurve(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static Track CreateSwitchCurve(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, SwitchPoint connectingPoint) { Track t; @@ -985,7 +1032,7 @@ public static Track CreateSwitchCurve(Switch leftPrefab, Switch rightPrefab, Tra { t = Object.Instantiate(rightPrefab.DivergingTrack); } - Switch s = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; + VanillaSwitch s = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; Vector3 offset = -t.Curve[0].localPosition; @@ -1090,8 +1137,8 @@ public static Track CreateConnect2Point(Transform parent, Vector3 p0, Vector3 p1 /// /// Creates a crossover. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -1099,8 +1146,8 @@ public static Track CreateConnect2Point(Transform parent, Vector3 p0, Vector3 p1 /// The distance between the parallel tracks. /// Whether to the crossover is in front or comes from behind. /// The distance between the switches on the same track. - /// An array with the at the attachment point (index 0) and the other (index 1). - public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Transform parent, + /// An array with the at the attachment point (index 0) and the other (index 1). + public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, bool trailing, float switchDistance) { @@ -1119,7 +1166,7 @@ public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Tr sp = SwitchPoint.Joint; } - Switch s1 = CreateSwitch(leftPrefab, rightPrefab, crossObj.transform, + VanillaSwitch s1 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, attachPoint, handlePosition, orientation, sp); BezierPoint bp1 = s1.GetDivergingPoint(); @@ -1132,20 +1179,20 @@ public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Tr point = point + (dir * switchDistance) + offset; - Switch s2 = CreateSwitch(leftPrefab, rightPrefab, crossObj.transform, + VanillaSwitch s2 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, point, point - dir, orientation, SwitchPoint.Through); BezierPoint bp2 = s2.GetDivergingPoint(); CreateConnect2Point(crossObj.transform, bp1, bp2, false, false, 1.0f); - return new Switch[] { s1, s2 }; + return new VanillaSwitch[] { s1, s2 }; } /// /// Creates a scissors crossover (2 crossovers in the same place). /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -1153,9 +1200,9 @@ public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Tr /// The distance between the parallel tracks. /// The distance between the switches on the same track. /// - /// An array of es in the following order: [0] attach [1] opposite to 0 [2] next to 0 [3] opposite to 2. + /// An array of es in the following order: [0] attach [1] opposite to 0 [2] next to 0 [3] opposite to 2. /// - public static Switch[] CreateScissorsCrossover(Switch leftPrefab, Switch rightPrefab, Transform parent, + public static VanillaSwitch[] CreateScissorsCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, float switchDistance) { // Create 2 crossovers offset from eachother. @@ -1184,23 +1231,23 @@ public static Switch[] CreateScissorsCrossover(Switch leftPrefab, Switch rightPr CreateConnect2Point(t1, c2[0].GetThroughPoint(), c1[1].GetThroughPoint(), false, false, 1.0f); // Return all 4 switches. - return new Switch[] { c1[0], c1[1], c2[0], c2[1] }; + return new VanillaSwitch[] { c1[0], c1[1], c2[0], c2[1] }; } /// /// Creates a double slip. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. /// The side to which the first switch turns to. /// The angle at which the 2 middle tracks cross eachother. /// - /// An array of es in the following order: [0] attach [1] diverging attach [2] opposite to 0 [3] opposite to 1. + /// An array of es in the following order: [0] attach [1] diverging attach [2] opposite to 0 [3] opposite to 1. /// - public static Switch[] CreateDoubleSlip(Switch leftPrefab, Switch rightPrefab, Transform parent, + public static VanillaSwitch[] CreateDoubleSlip(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float crossAngle) { // Create the parent object. @@ -1217,10 +1264,10 @@ public static Switch[] CreateDoubleSlip(Switch leftPrefab, Switch rightPrefab, T // First side. // Creates a switch, a curve, and then another switch connected through its diverging track. - Switch s00 = CreateSwitch(leftPrefab, rightPrefab, obj.transform, attachPoint, handlePosition, orientation, SwitchPoint.Joint); + VanillaSwitch s00 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, attachPoint, handlePosition, orientation, SwitchPoint.Joint); bp = s00.GetDivergingPoint(); bp = CreateArcCurve(obj.transform, bp.position, bp.globalHandle1, orientation, radius, arc, 180.0f, 0).Curve.Last(); - Switch s01 = CreateSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, + VanillaSwitch s01 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, FlipOrientation(orientation), SwitchPoint.Diverging); // Calculate the middle crossover's position by interesecting the 2 through tracks. @@ -1233,16 +1280,16 @@ public static Switch[] CreateDoubleSlip(Switch leftPrefab, Switch rightPrefab, T Vector3 next = MathHelper.MirrorAround(attachPoint, mid); // Repeat the process for the other side. - Switch s10 = CreateSwitch(leftPrefab, rightPrefab, obj.transform, next, next + dir, orientation, SwitchPoint.Joint); + VanillaSwitch s10 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, next, next + dir, orientation, SwitchPoint.Joint); bp = s10.GetDivergingPoint(); bp = CreateArcCurve(obj.transform, bp.position, bp.globalHandle1, orientation, radius, arc, 180.0f, 0).Curve.Last(); - Switch s11 = CreateSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, + VanillaSwitch s11 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, FlipOrientation(orientation), SwitchPoint.Diverging); CreateConnect2Point(obj.transform, s00.GetThroughPoint(), s10.GetThroughPoint(), false, false, 1.0f); CreateConnect2Point(obj.transform, s01.GetThroughPoint(), s11.GetThroughPoint(), false, false, 1.0f); - return new Switch[] { s00, s01, s10, s11 }; + return new VanillaSwitch[] { s00, s01, s10, s11 }; } /// diff --git a/MapifyEditor/Tools/TrackToolsHelper.cs b/MapifyEditor/Tools/TrackToolsHelper.cs index b491651f..028f7276 100644 --- a/MapifyEditor/Tools/TrackToolsHelper.cs +++ b/MapifyEditor/Tools/TrackToolsHelper.cs @@ -1,3 +1,4 @@ +using System.Linq; using Mapify.Editor.Utils; using UnityEditor; using UnityEngine; @@ -43,11 +44,10 @@ public static float CalculateHeightDifference(float startGrade, float endGrade, /// The handle of the attachment point. /// Which point of the switch connects to the attachment point. /// An array with 2 arrays representing the through track (index 0) and diverging track (index 1). - public static SimpleBezier[] GetSwitchBeziers(Switch s, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint) + public static SimpleBezier[] GetSwitchBeziers(VanillaSwitch s, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint) { // Create the original beziers. - SimpleBezier[] curves = new SimpleBezier[] - { + SimpleBezier[] curves = { new SimpleBezier( s.GetJointPoint().position, s.GetJointPoint().globalHandle2, @@ -101,19 +101,19 @@ public static SimpleBezier[] GetSwitchBeziers(Switch s, Vector3 attachPoint, Vec } /// - /// Calculates the radius of the diverging track of a . + /// Calculates the radius of the diverging track of a . /// - public static float CalculateSwitchRadius(Switch s) + public static float CalculateSwitchRadius(VanillaSwitch s) { BezierPoint bp = s.GetDivergingPoint(); return bp.position.z / Mathf.Sin(Mathf.Atan(Mathf.Abs(bp.handle1.x / bp.handle1.z))); } /// - /// Calculates the angle at the end of the diverging track of a . + /// Calculates the angle at the end of the diverging track of a . /// /// The angle in radians. - public static float CalculateSwitchAngle(Switch s) + public static float CalculateSwitchAngle(VanillaSwitch s) { BezierPoint bp = s.GetDivergingPoint(); return Mathf.Atan(Mathf.Abs(bp.handle1.x / bp.handle1.z)); @@ -121,6 +121,7 @@ public static float CalculateSwitchAngle(Switch s) /// /// Returns the speed limit shown on track speed signs for a given radius. + /// source: DV.Signs.SignPlacer.GetMaxSpeedForRadius /// /// The speed in km/h. public static float GetMaxSpeedForRadiusGame(float radius) @@ -196,7 +197,7 @@ public static Vector3[] GetSmoothBezierToConnectSimple(Vector3 attachPosition, V handle = newTarget + (handle - newTarget).normalized * length; - return new Vector3[] { attachPosition, + return new[] { attachPosition, attachPosition + dir * length, handle, newTarget }; @@ -237,7 +238,7 @@ public static Vector3[] GetSmoothBezierToConnectComplex(Vector3 attachPosition, length *= 1 + MathHelper.ArcToBezierHandleLength(angle * Mathf.Deg2Rad); - return new Vector3[] { attachPosition, + return new[] { attachPosition, attachPosition + dir * length, newTarget - dirNext * length, newTarget }; @@ -264,7 +265,7 @@ public static Vector3[] GetSmoothBezierToConnectMix(Vector3 attachPosition, Vect Vector3[] s = GetSmoothBezierToConnectSimple(attachPosition, attachHandle, newTarget); Vector3[] c = GetSmoothBezierToConnectComplex(attachPosition, attachHandle, newTarget); - return new Vector3[] {Vector3.Lerp(s[0], c[0], mix), + return new[] {Vector3.Lerp(s[0], c[0], mix), Vector3.Lerp(s[1], c[1], mix), Vector3.Lerp(s[2], c[2], mix), Vector3.Lerp(s[3], c[3], mix) }; @@ -275,7 +276,7 @@ public static Vector3[] GetSmoothBezierToConnectMix(Vector3 attachPosition, Vect Vector3[] s = GetSmoothBezierToConnectSimple(attachPosition, attachHandle, newTarget, maxAngle); Vector3[] c = GetSmoothBezierToConnectComplex(attachPosition, attachHandle, newTarget, maxAngle); - return new Vector3[] {Vector3.Lerp(s[0], c[0], mix), + return new[] {Vector3.Lerp(s[0], c[0], mix), Vector3.Lerp(s[1], c[1], mix), Vector3.Lerp(s[2], c[2], mix), Vector3.Lerp(s[3], c[3], mix) }; @@ -337,7 +338,7 @@ public static bool CheckForTrackSnap(Vector3 point, float radius, out Vector3 sn /// public static Vector3[] ReverseCurve(Vector3[] curve) { - return new Vector3[] { curve[3], + return new[] { curve[3], curve[2], curve[1], curve[0] }; @@ -388,7 +389,7 @@ internal static void CopyTrackFields(Track original, Track other) } // The length of the straight section (middle track) of a crossover. - internal static float CalculateCrossoverDistance(Switch switchPrefab, float trackDistance) + internal static float CalculateCrossoverDistance(VanillaSwitch switchPrefab, float trackDistance) { float targetDistance = trackDistance - (2.0f * Mathf.Abs(switchPrefab.DivergingTrack.Curve[1].position.x)); Vector3 handle = switchPrefab.DivergingTrack.Curve[1].handle1; @@ -397,7 +398,7 @@ internal static float CalculateCrossoverDistance(Switch switchPrefab, float trac } // The length of the straight section connecting the middle switch to the outer switches in a yard. - internal static float CalculateLengthFromDistanceYardCentre(Switch switchPrefab, float trackDistance) + internal static float CalculateLengthFromDistanceYardCentre(VanillaSwitch switchPrefab, float trackDistance) { float targetDistance = trackDistance - Mathf.Abs(switchPrefab.DivergingTrack.Curve[1].position.x); @@ -410,7 +411,7 @@ internal static float CalculateLengthFromDistanceYardCentre(Switch switchPrefab, } // The length of the straight section connecting the outer switches in a yard. - internal static float CalculateLengthFromDistanceYardSides(Switch switchPrefab, float trackDistance) + internal static float CalculateLengthFromDistanceYardSides(VanillaSwitch switchPrefab, float trackDistance) { float targetDistance = trackDistance; @@ -445,7 +446,7 @@ internal static float CalculateYardMidSwitchDistance(float trackDistance) /// This will only look in the default directory (Mapify folder in the Assets root). /// If a parameter is not null, it will not be replaced. /// - public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, ref Switch switchLeft, ref Switch switchRight, ref Turntable turntable) + public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, ref VanillaSwitch switchLeft, ref VanillaSwitch switchRight, ref Turntable turntable) { string[] guids; @@ -475,7 +476,7 @@ public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, if (guids.Length > 0) { - switchLeft = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); + switchLeft = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); } } @@ -485,7 +486,7 @@ public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, if (guids.Length > 0) { - switchRight = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); + switchRight = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); } } diff --git a/MapifyEditor/Tools/TrackToolsWindow.cs b/MapifyEditor/Tools/TrackToolsWindow.cs index 621d7374..98e7b52d 100644 --- a/MapifyEditor/Tools/TrackToolsWindow.cs +++ b/MapifyEditor/Tools/TrackToolsWindow.cs @@ -45,7 +45,7 @@ public static void ShowWindow() public Track CurrentTrack => _selectedTracks.Length > 0 ? _selectedTracks[0] : null; public BezierPoint CurrentPoint => _selectedPoints.Length > 0 ? _selectedPoints[0] : null; - public Switch CurrentSwitch { get; private set; } + public VanillaSwitch CurrentSwitch { get; private set; } public Turntable CurrentTurntable { get; private set; } #endregion @@ -146,7 +146,7 @@ private void PrepareSelection() { _selectionType = SelectionType.BezierPoint; } - else if (go.TryGetComponent(out Switch s)) + else if (go.TryGetComponent(out VanillaSwitch s)) { _selectionType = SelectionType.Switch; CurrentSwitch = s; @@ -207,8 +207,16 @@ public void CreateTrack(Vector3 position, Vector3 handle) Undo.RegisterCreatedObjectUndo(t.gameObject, "Created Curve"); break; case TrackPiece.Switch: - go = TrackToolsCreator.CreateSwitch(LeftSwitch, RightSwitch, _currentParent, position, handle, - _orientation, _connectingPoint).gameObject; + if (_switchType == SwitchType.Vanilla) + { + go = TrackToolsCreator.CreateVanillaSwitch(LeftSwitch, RightSwitch, _currentParent, position, handle, + _orientation, _connectingPointVanilla).gameObject; + } + else + { + go = TrackToolsCreator.CreateCustomSwitch(_currentParent, position, handle, _switchBranchesCount, _connectingPointCustom, _radius, _arc, _endGrade).gameObject; + } + SelectGameObject(go); Undo.RegisterCreatedObjectUndo(go, "Created Switch"); break; @@ -256,7 +264,7 @@ public void CreateSpecial(Vector3 attachPoint, Vector3 handlePosition) break; case SpecialTrackPiece.SwitchCurve: t = TrackToolsCreator.CreateSwitchCurve(LeftSwitch, RightSwitch, _currentParent, attachPoint, handlePosition, - _orientation, _connectingPoint); + _orientation, (SwitchPoint)_connectingPointVanilla); ApplySettingsToTrack(t); SelectTrack(t); Undo.RegisterCreatedObjectUndo(t.gameObject, "Created Switch Curve"); @@ -392,7 +400,7 @@ public void ResetCreationSettings(bool all) } if (all || _currentPiece == TrackPiece.Switch) { - _connectingPoint = SwitchPoint.Joint; + _connectingPointVanilla = SwitchPoint.Joint; } if (all || _currentPiece == TrackPiece.Yard) { @@ -565,12 +573,12 @@ private void RemakeAndRepaint() SceneView.RepaintAll(); } - private Switch GetCurrentSwitchPrefab() + private VanillaSwitch GetCurrentSwitchPrefab() { return IsLeft ? LeftSwitch : RightSwitch; } - private Switch GetSwitch(TrackOrientation orientation) + private VanillaSwitch GetSwitch(TrackOrientation orientation) { if (orientation == TrackOrientation.Left) { diff --git a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs index 42e2c4b8..7fb6a8c0 100644 --- a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs +++ b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs @@ -71,123 +71,123 @@ private void CreatePiecePreviews() case SelectionType.Turntable: CacheTrack(CurrentTurntable.Track); break; - default: - break; } switch (_currentPiece) { case TrackPiece.Straight: - foreach (var cache in _newCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewStraight( - cache.Attach.Position, cache.Attach.Handle, - _length, _endGrade, out cache.Points, _sampleCount) }; - } - foreach (var cache in _nextCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewStraight( - cache.Attach.Position, cache.Attach.Handle, - _length, _endGrade, out cache.Points, _sampleCount) }; - } - foreach (var cache in _backCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewStraight( - cache.Attach.Position, cache.Attach.Handle, - _length, _endGrade, out cache.Points, _sampleCount) }; - } + { + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); break; - case TrackPiece.Curve: - foreach (var cache in _newCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewArcCurve( - cache.Attach.Position, cache.Attach.Handle, - _orientation, _radius, _arc, _maxArcPerPoint, _endGrade, out cache.Points, _sampleCount) }; - } - foreach (var cache in _nextCache) - { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewArcCurve( - cache.Attach.Position, cache.Attach.Handle, - _orientation, _radius, _arc, _maxArcPerPoint, _endGrade, out cache.Points, _sampleCount) }; - } - foreach (var cache in _backCache) + + void FillCache(ref List caches) { - cache.Lines = new Vector3[][] { TrackToolsCreator.Previews.PreviewArcCurve( - cache.Attach.Position, cache.Attach.Handle, - _orientation, _radius, _arc, _maxArcPerPoint, _endGrade, out cache.Points, _sampleCount) }; + foreach (var cache in caches) + { + cache.Lines = new[] + { TrackToolsCreator.Previews.PreviewStraight( + cache.Attach.Position, cache.Attach.Handle, + _length, _endGrade, out cache.Points, _sampleCount) }; + } } + } + case TrackPiece.Curve: + { + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); break; - case TrackPiece.Switch: - if (LeftSwitch && RightSwitch) + + void FillCache(ref List caches) { - foreach (var cache in _newCache) + foreach (var cache in caches) { - cache.Lines = TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount); + cache.Lines = new[] + { + TrackToolsCreator.Previews.PreviewArcCurve( + cache.Attach.Position, cache.Attach.Handle, + _orientation, _radius, _arc, _maxArcPerPoint, _endGrade, out cache.Points, _sampleCount) + }; } - foreach (var cache in _nextCache) + } + } + case TrackPiece.Switch: + if (_switchType == SwitchType.Vanilla) + { + if (!LeftSwitch || !RightSwitch) break; + + void FillCache(ref List caches) { - cache.Lines = TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount); + foreach (var cache in caches) + { + cache.Lines = TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), + cache.Attach.Position, cache.Attach.Handle, + _connectingPointVanilla, _sampleCount); + } } - foreach (var cache in _backCache) + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + } + else + { + void FillCache(ref List caches) { - cache.Lines = TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount); + foreach (var cache in caches) + { + cache.Lines = TrackToolsCreator.Previews.PreviewCustomSwitch( + cache.Attach.Position, cache.Attach.Handle, _switchBranchesCount, _connectingPointCustom, _radius, _arc, _endGrade, _sampleCount); + } } + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); } + break; case TrackPiece.Yard: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewYard(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _yardOptions, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewYard(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _yardOptions, _sampleCount); - } - foreach (var cache in _backCache) + foreach (var cache in caches) { cache.Lines = TrackToolsCreator.Previews.PreviewYard(LeftSwitch, RightSwitch, cache.Attach.Position, cache.Attach.Handle, _orientation, _trackDistance, _yardOptions, _sampleCount); } } - break; + } case TrackPiece.Turntable: - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewTurntable( - cache.Attach.Position, cache.Attach.Handle, - _turntableOptions, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewTurntable( - cache.Attach.Position, cache.Attach.Handle, - _turntableOptions, _sampleCount); - } - foreach (var cache in _backCache) + { + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - cache.Lines = TrackToolsCreator.Previews.PreviewTurntable( - cache.Attach.Position, cache.Attach.Handle, - _turntableOptions, _sampleCount); + foreach (var cache in caches) + { + cache.Lines = TrackToolsCreator.Previews.PreviewTurntable( + cache.Attach.Position, cache.Attach.Handle, + _turntableOptions, _sampleCount); + } } - break; + } case TrackPiece.Special: SpecialPreviews(); break; - default: - break; } } @@ -198,31 +198,25 @@ private void SpecialPreviews() case SpecialTrackPiece.Buffer: break; case SpecialTrackPiece.SwitchCurve: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) + foreach (var cache in caches) { cache.Lines = new Vector3[1][]; System.Array.Copy(TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount), 1, cache.Lines, 0, 1); - } - foreach (var cache in _nextCache) - { - cache.Lines = new Vector3[1][]; - System.Array.Copy(TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount), 1, cache.Lines, 0, 1); - } - foreach (var cache in _backCache) - { - cache.Lines = new Vector3[1][]; - System.Array.Copy(TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _connectingPoint, _sampleCount), 1, cache.Lines, 0, 1); + _connectingPointVanilla, _sampleCount), 1, cache.Lines, 0, 1); } } - break; + } case SpecialTrackPiece.Connect2: { BezierPoint p0 = null; @@ -285,76 +279,62 @@ private void SpecialPreviews() } break; case SpecialTrackPiece.Crossover: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewCrossover(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _isTrailing, _switchDistance, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewCrossover(GetCurrentSwitchPrefab(), - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _isTrailing, _switchDistance, _sampleCount); - } - foreach (var cache in _backCache) + foreach (var cache in caches) { cache.Lines = TrackToolsCreator.Previews.PreviewCrossover(GetCurrentSwitchPrefab(), cache.Attach.Position, cache.Attach.Handle, _orientation, _trackDistance, _isTrailing, _switchDistance, _sampleCount); } } - break; + } case SpecialTrackPiece.ScissorsCrossover: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewScissorsCrossover(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _switchDistance, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewScissorsCrossover(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _trackDistance, _switchDistance, _sampleCount); - } - foreach (var cache in _backCache) + foreach (var cache in caches) { cache.Lines = TrackToolsCreator.Previews.PreviewScissorsCrossover(LeftSwitch, RightSwitch, cache.Attach.Position, cache.Attach.Handle, _orientation, _trackDistance, _switchDistance, _sampleCount); } } - break; + } case SpecialTrackPiece.DoubleSlip: - if (LeftSwitch && RightSwitch) + { + if (!LeftSwitch || !RightSwitch) break; + + FillCache(ref _newCache); + FillCache(ref _nextCache); + FillCache(ref _backCache); + break; + + void FillCache(ref List caches) { - foreach (var cache in _newCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewDoubleSlip(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _crossAngle, _sampleCount); - } - foreach (var cache in _nextCache) - { - cache.Lines = TrackToolsCreator.Previews.PreviewDoubleSlip(LeftSwitch, RightSwitch, - cache.Attach.Position, cache.Attach.Handle, - _orientation, _crossAngle, _sampleCount); - } - foreach (var cache in _backCache) + foreach (var cache in caches) { cache.Lines = TrackToolsCreator.Previews.PreviewDoubleSlip(LeftSwitch, RightSwitch, cache.Attach.Position, cache.Attach.Handle, _orientation, _crossAngle, _sampleCount); } } - break; - default: - break; + } } } @@ -382,18 +362,6 @@ private void CacheTrack(Track t) _backCache[0].Tooltip = PreviewPointCache.BackString; } } - - private void CreateEditingPreviews() - { - switch (_editingMode) - { - case EditingMode.InsertPoint: - - break; - default: - break; - } - } } } #endif diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs index b21b5ab8..2a3e1826 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs @@ -1,3 +1,4 @@ +using System; using Mapify.Editor.Tools.OptionData; using Mapify.Editor.Utils; using UnityEditor; @@ -43,7 +44,11 @@ public partial class TrackToolsWindow private bool _changeArc = false; // Switches. - private SwitchPoint _connectingPoint = SwitchPoint.Joint; + private SwitchType _switchType = SwitchType.Vanilla; + private int _switchBranchesCount = 2; + private SwitchPoint _connectingPointVanilla = SwitchPoint.Joint; + // 0 -> joint point, 1 - ∞ -> branch point + private int _connectingPointCustom = 0; // Yards. private YardOptions _yardOptions = YardOptions.DefaultOptions; @@ -297,16 +302,19 @@ private void DrawStraightOptions() new GUIContent($"{TrackToolsHelper.CalculateHeightDifference(0, _endGrade, _length):F3}m")); } - private void DrawCurveOptions() + private void DrawCurveOptions(bool CustomSwitchBranch = false) { - DrawOrientationGUI("Which side the curve turns to"); + if (!CustomSwitchBranch) + { + DrawOrientationGUI("Which side the curve turns to"); + } EditorGUILayout.BeginHorizontal(); _radius = EditorGUILayout.FloatField(new GUIContent("Radius", "Radius of the curve"), _radius); - if (GUILayout.Button(new GUIContent("Use switch radius", "Sets the radius to the one of switch curves"), + if (!CustomSwitchBranch && GUILayout.Button(new GUIContent("Use switch radius", "Sets the radius to the one of switch curves"), GUILayout.MaxWidth(140))) { if (LeftSwitch) @@ -326,10 +334,14 @@ private void DrawCurveOptions() EditorGUILayout.EndHorizontal(); _arc = EditorGUILayout.Slider(new GUIContent("Arc", "Angle of the curve"), - _arc, 0.0f, 180.0f); - _maxArcPerPoint = EditorGUILayout.Slider(new GUIContent("Max arc per point", - "How big an arc can be before the curve is split."), - _maxArcPerPoint, 0.0f, 90.0f); + _arc, 0.1f, 180.0f); + if (!CustomSwitchBranch) + { + _maxArcPerPoint = EditorGUILayout.Slider(new GUIContent("Max arc per point", + "How big an arc can be before the curve is split."), + _maxArcPerPoint, 0.0f, 90.0f); + } + _endGrade = EditorGUILayout.FloatField( new GUIContent("End grade", "How steep should the track's other end be"), _endGrade * 100.0f) / 100.0f; @@ -343,6 +355,9 @@ private void DrawCurveOptions() float length = EditorGUILayout.FloatField(new GUIContent("Approx. length", "Approximated total length of the curve"), _radius * _arc * Mathf.Deg2Rad); + //length of zero makes no sense and will cause exceptions + if(length < 0.1f) length = 0.1f; + bool changed = EditorGUI.EndChangeCheck(); _changeArc = EditorGUILayout.ToggleLeft(new GUIContent("Change arc", @@ -353,7 +368,7 @@ private void DrawCurveOptions() { if (_changeArc) { - _arc = (length / _radius) * Mathf.Rad2Deg; + _arc = length / _radius * Mathf.Rad2Deg; } else { @@ -369,14 +384,21 @@ private void DrawCurveOptions() private void DrawSwitchOptions() { - if (!Require(LeftSwitch, "Left switch prefab") || - !Require(RightSwitch, "Right switch prefab")) + _switchType = (SwitchType)EditorGUILayout.EnumPopup(new GUIContent("Switch type", + "Vanilla switch (like in the base game) or a custom switch (create your own shape)"), + _switchType); + + switch (_switchType) { - return; + case SwitchType.Vanilla: + DrawVanillaSwitchOptions(); + break; + case SwitchType.Custom: + DrawCustomSwitchOptions(); + break; + default: + throw new ArgumentOutOfRangeException(); } - - DrawOrientationGUI("Which side the diverging track turns to"); - DrawSwitchPointGUI(); } private void DrawYardOptions() @@ -535,9 +557,9 @@ private void DrawSwitchCurveOptions() } DrawOrientationGUI("Choose which side the track diverges to"); - DrawSwitchPointGUI(); + DrawVanillaSwitchPointGUI(); - if (_connectingPoint == SwitchPoint.Through) + if (_connectingPointVanilla == SwitchPoint.Through) { EditorGUILayout.HelpBox("The selected point has no connection with " + "the track, you should select one of the others.", MessageType.Warning); diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs index c3b3832f..37ac372c 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs @@ -1,3 +1,5 @@ +using System; +using System.Collections.Generic; using Mapify.Editor.Utils; using UnityEditor; using UnityEngine; @@ -11,8 +13,8 @@ public partial class TrackToolsWindow // Track prefabs. private bool _showPrefabs = false; public BufferStop BufferPrefab; - public Switch LeftSwitch; - public Switch RightSwitch; + public VanillaSwitch LeftSwitch; + public VanillaSwitch RightSwitch; public Turntable TurntablePrefab; // Settings. @@ -147,22 +149,71 @@ private void DrawOrientationGUI(string tooltip) EditorGUILayout.EndHorizontal(); } + private void DrawVanillaSwitchOptions() + { + if (!Require(LeftSwitch, "Left switch prefab") || + !Require(RightSwitch, "Right switch prefab")) + { + return; + } + DrawOrientationGUI("Which side the diverging track turns to"); + DrawVanillaSwitchPointGUI(); + } + // SwitchPoint enum dropdown with a button to swap options easily. - private void DrawSwitchPointGUI() + private void DrawVanillaSwitchPointGUI() { EditorGUILayout.BeginHorizontal(); - _connectingPoint = (SwitchPoint)EditorGUILayout.EnumPopup(new GUIContent("Connecting point", - "Which of the 3 switch points should connect to the current track"), - _connectingPoint); + _connectingPointVanilla = (SwitchPoint)EditorGUILayout.EnumPopup(new GUIContent("Connecting point", + "Which of the 3 switch points should connect to the current track"), + _connectingPointVanilla); if (GUILayout.Button(new GUIContent("Next point", "Swaps between the 3 switch points."), GUILayout.MaxWidth(140))) { - _connectingPoint = NextPoint(_connectingPoint); + _connectingPointVanilla = NextPoint(_connectingPointVanilla); } EditorGUILayout.EndHorizontal(); } + private void DrawCustomSwitchOptions() + { + _switchBranchesCount = EditorGUILayout.IntField(new GUIContent("Branches", "How many branches the switch has (at least 2)"), _switchBranchesCount); + if (_switchBranchesCount < 2) _switchBranchesCount = 2; + + EditorGUILayout.BeginHorizontal(); + + var displayedOptions = new GUIContent[_switchBranchesCount + 1]; + displayedOptions[0] = new GUIContent("Joint point"); + for (int i = 0; i < _switchBranchesCount; i++) + { + displayedOptions[i+1] = new GUIContent($"Branch out {i}"); + } + + var optionValues = new int[displayedOptions.Length]; + for (int i = 0; i < displayedOptions.Length; i++) + { + optionValues[i] = i; + } + + _connectingPointCustom = EditorGUILayout.IntPopup( + new GUIContent("Connecting point", "Which of the switch points should connect to the current track"), + _connectingPointCustom, + displayedOptions, + optionValues, + EditorStyles.popup + ); + + if (GUILayout.Button(new GUIContent("Next point", "Swaps between the switch points."), GUILayout.MaxWidth(120))) + { + _connectingPointCustom = (_connectingPointCustom+1) % (_switchBranchesCount+1); + } + + EditorGUILayout.EndHorizontal(); + + DrawCurveOptions(true); + } + // Orientation enum dropdown with a button to swap options easily. private void DrawSwitchDistanceGUI() { diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs index 671698fd..fb8de2f1 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs @@ -77,7 +77,7 @@ private void DrawTrackSelection() if (GUILayout.Button(new GUIContent("Swap tracks", "Swaps the selected track between the through and diverging tracks")) && isSwitch) { - Switch s = CurrentTrack.GetComponentInParent(); + VanillaSwitch s = CurrentTrack.GetComponentInParent(); if (CurrentTrack == s.ThroughTrack) { @@ -186,7 +186,7 @@ private void DrawSwitchSelection() new GUIContent($"{(CurrentSwitch.IsLeft ? "Left" : "Right")}")); EditorGUILayout.BeginHorizontal(); - CurrentSwitch.defaultState = (Switch.StandSide)EditorGUILayout.EnumPopup(new GUIContent("Currently set to", + CurrentSwitch.defaultState = (VanillaSwitch.StandSide)EditorGUILayout.EnumPopup(new GUIContent("Currently set to", "The switch state when exporting"), CurrentSwitch.defaultState); diff --git a/MapifyEditor/Trackage/CustomSwitch.cs b/MapifyEditor/Trackage/CustomSwitch.cs index 91c22e9c..fa5c304b 100644 --- a/MapifyEditor/Trackage/CustomSwitch.cs +++ b/MapifyEditor/Trackage/CustomSwitch.cs @@ -11,9 +11,12 @@ public enum StandSide } [Tooltip("Which way the switch should be flipped by default")] - public int defaultBranch = 0; + public byte defaultBranch = 0; [Tooltip("Which side of the switch the stand will appear on")] public StandSide standSide; + + [Tooltip("Tracks in the switch, from left to right")] + public new Track[] Tracks; } } diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs index ee28afc3..5af7fdd8 100644 --- a/MapifyEditor/Trackage/SwitchBase.cs +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -10,48 +10,49 @@ public abstract class SwitchBase: MonoBehaviour { public Track[] Tracks => gameObject.GetComponentsInChildren(); - protected void Snap() - { -#if UNITY_EDITOR - BezierPoint[] bezierPoints = FindObjectsOfType(); - GameObject[] selectedObjects = Selection.gameObjects; - bool isSelected = selectedObjects.Contains(gameObject); - - TrySnap(bezierPoints, isSelected, transform); - foreach (var track in Tracks) - { - TrySnap(bezierPoints, isSelected, track.Curve.Last().transform); - } -#endif - } - - private void TrySnap(IEnumerable points, bool move, Transform reference) - { - var referencePosition = reference.position; - var closestPos = Vector3.zero; - var closestDist = float.MaxValue; - - foreach (var otherPoint in points) - { - if (otherPoint.Curve().GetComponentInParent() == this) continue; - - var otherPosition = otherPoint.transform.position; - var dist = Mathf.Abs(Vector3.Distance(otherPosition, referencePosition)); - - if (dist > Track.SNAP_RANGE || dist >= closestDist) continue; - - var aTrack = otherPoint.GetComponentInParent(); - if (aTrack.IsSwitch) continue; - - closestPos = otherPosition; - closestDist = dist; - } - - if (closestDist >= float.MaxValue) return; - - if (move) { - transform.position = closestPos + (transform.position - reference.position); - } - } + // TODO why is this unused +// protected void Snap() +// { +// #if UNITY_EDITOR +// BezierPoint[] bezierPoints = FindObjectsOfType(); +// GameObject[] selectedObjects = Selection.gameObjects; +// bool isSelected = selectedObjects.Contains(gameObject); +// +// TrySnap(bezierPoints, isSelected, transform); +// foreach (var track in Tracks) +// { +// TrySnap(bezierPoints, isSelected, track.Curve.Last().transform); +// } +// #endif +// } +// +// private void TrySnap(IEnumerable points, bool move, Transform reference) +// { +// var referencePosition = reference.position; +// var closestPos = Vector3.zero; +// var closestDist = float.MaxValue; +// +// foreach (var otherPoint in points) +// { +// if (otherPoint.Curve().GetComponentInParent() == this) continue; +// +// var otherPosition = otherPoint.transform.position; +// var dist = Mathf.Abs(Vector3.Distance(otherPosition, referencePosition)); +// +// if (dist > Track.SNAP_RANGE || dist >= closestDist) continue; +// +// var aTrack = otherPoint.GetComponentInParent(); +// if (aTrack.IsSwitch) continue; +// +// closestPos = otherPosition; +// closestDist = dist; +// } +// +// if (closestDist >= float.MaxValue) return; +// +// if (move) { +// transform.position = closestPos + (transform.position - reference.position); +// } +// } } } diff --git a/MapifyEditor/Trackage/Track.cs b/MapifyEditor/Trackage/Track.cs index bd57717b..e97d06b9 100644 --- a/MapifyEditor/Trackage/Track.cs +++ b/MapifyEditor/Trackage/Track.cs @@ -61,16 +61,7 @@ public BezierCurve Curve { } } - private SwitchBase _parentSwitch; - - private SwitchBase ParentSwitch { - get { - if (_parentSwitch) return _parentSwitch; - return _parentSwitch = GetComponentInParent(); - } - } - - public bool IsSwitch => ParentSwitch != null; + public bool IsSwitch => GetComponentInParent() != null; public bool IsTurntable => GetComponentInParent() != null; public string LogicName => diff --git a/MapifyEditor/Trackage/Switch.cs b/MapifyEditor/Trackage/VanillaSwitch.cs similarity index 67% rename from MapifyEditor/Trackage/Switch.cs rename to MapifyEditor/Trackage/VanillaSwitch.cs index 752ee456..360a093a 100644 --- a/MapifyEditor/Trackage/Switch.cs +++ b/MapifyEditor/Trackage/VanillaSwitch.cs @@ -1,16 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Mapify.Editor.Utils; using UnityEngine; -#if UNITY_EDITOR -using UnityEditor; -#endif namespace Mapify.Editor { [RequireComponent(typeof(VanillaObject))] - public class Switch : SwitchBase + public class VanillaSwitch : SwitchBase { public enum StandSide { @@ -27,5 +20,10 @@ public enum StandSide public Track ThroughTrack => transform.Find("[track through]").GetComponent(); public Track DivergingTrack => transform.Find("[track diverging]").GetComponent(); public bool IsLeft => DivergingTrack.Curve.Last().localPosition.x < 0; + + public BezierPoint GetJointPoint() => ThroughTrack.Curve[0]; + public BezierPoint GetThroughPoint() => ThroughTrack.Curve[1]; + public BezierPoint GetDivergingPoint() => DivergingTrack.Curve[1]; + public BezierPoint GetDivergeJoinPoint() => DivergingTrack.Curve[0]; } } diff --git a/MapifyEditor/Utils/Extensions.cs b/MapifyEditor/Utils/Extensions.cs index c7a7acfa..001b77d4 100644 --- a/MapifyEditor/Utils/Extensions.cs +++ b/MapifyEditor/Utils/Extensions.cs @@ -243,12 +243,6 @@ public static Dictionary> MapToClosestStation(this IEnumerab .ToDictionary(group => group.Key, group => group.ToList()); } - // Switches. - public static BezierPoint GetJointPoint(this Switch s) => s.ThroughTrack.Curve[0]; - public static BezierPoint GetThroughPoint(this Switch s) => s.ThroughTrack.Curve[1]; - public static BezierPoint GetDivergingPoint(this Switch s) => s.DivergingTrack.Curve[1]; - public static BezierPoint GetDivergeJoinPoint(this Switch s) => s.DivergingTrack.Curve[0]; - // Track. /// /// Returns true if this track starts at grade of 0%. From 4af26d5bbd0dc009eb6ec997ef442996ed0e8871 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Thu, 5 Dec 2024 12:31:46 +0100 Subject: [PATCH 20/38] add car spawner and deleter components, fix switch stalk position, create custom switches with track tools, add YardController --- Mapify/Mapify.csproj | 3 +- .../SceneInitializers/Railway/TrackSetup.cs | 51 +++++--- Mapify/Utils/Extensions.cs | 31 ++++- .../BezierCurves/BezierCurveEditor.cs | 2 +- .../BezierCurves/BezierPointEditor.cs | 2 +- .../BuildUpdaters/Railway/SwitchUpdater.cs | 6 +- .../Validators/Railway/SwitchValidator.cs | 5 +- .../Validators/Railway/TrackValidator.cs | 8 +- MapifyEditor/Tools/ToolEnums.cs | 8 +- .../Tools/TrackToolsCreator.Previews.cs | 18 +-- MapifyEditor/Tools/TrackToolsCreator.cs | 116 +++++++++--------- MapifyEditor/Tools/TrackToolsHelper.cs | 22 ++-- MapifyEditor/Tools/TrackToolsWindow.cs | 9 +- .../Tools/TrackToolsWindowGUI/Creation.cs | 25 ++-- .../Tools/TrackToolsWindowGUI/Other.cs | 4 +- .../Tools/TrackToolsWindowGUI/Selection.cs | 4 +- MapifyEditor/Trackage/CustomSwitch.cs | 15 ++- .../Trackage/{VanillaSwitch.cs => Switch.cs} | 2 +- MapifyEditor/Trackage/SwitchBase.cs | 5 +- MapifyEditor/Trackage/Track.cs | 1 + 20 files changed, 205 insertions(+), 132 deletions(-) rename MapifyEditor/Trackage/{VanillaSwitch.cs => Switch.cs} (95%) diff --git a/Mapify/Mapify.csproj b/Mapify/Mapify.csproj index 289acdde..ffa4e963 100644 --- a/Mapify/Mapify.csproj +++ b/Mapify/Mapify.csproj @@ -2,7 +2,7 @@ net48 - 7.3 + latest Mapify true @@ -15,6 +15,7 @@ + diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 722ba018..75951e56 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -5,6 +5,7 @@ using Mapify.Editor.Utils; using Mapify.Utils; using UnityEngine; +using Object = UnityEngine.Object; namespace Mapify.SceneInitializers.Railway { @@ -75,11 +76,12 @@ private static void CreateCustomSwitch(CustomSwitch customSwitch) //Junction var inJunction = prefabClone.GetComponentInChildren(); + inJunction.transform.position = customSwitch.JointPoint.transform.position; inJunction.selectedBranch = customSwitch.defaultBranch; DestroyPrefabTracks(prefabClone); - CreateNewTracks(customSwitch, prefabClone, inJunction); - SetupGraphical(prefabClone); + CreateSwitchTracks(customSwitch, prefabClone, inJunction); + SetupStalk(prefabClone); } private static void DestroyPrefabTracks(GameObject prefabClone) @@ -91,17 +93,12 @@ private static void DestroyPrefabTracks(GameObject prefabClone) Object.DestroyImmediate(prefabClone.FindChildByName("[track diverging]")); } - private static void CreateNewTracks(CustomSwitch customSwitch, GameObject prefabClone, Junction switchJunction) + private static void CreateSwitchTracks(CustomSwitch customSwitch, GameObject prefabClone, Junction switchJunction) { var railTracksInSwitch = CreateRailTracks( - customSwitch.gameObject - .GetComponentsInChildren(), true + customSwitch.GetTracks(), true ); - railTracksInSwitch = railTracksInSwitch - .OrderBy(track => track.gameObject.name) - .ToList(); - if (!railTracksInSwitch.Any()) { Mapify.LogError($"{nameof(CreateCustomSwitches)}: {nameof(railTracksInSwitch)} is empty"); @@ -136,41 +133,55 @@ private static void CreateNewTracks(CustomSwitch customSwitch, GameObject prefab if (switchJunction.inBranch == null) { - Mapify.LogError($"{nameof(CreateNewTracks)}: inBranch is null"); + Mapify.LogError($"{nameof(CreateSwitchTracks)}: inBranch is null"); } } - private static void SetupGraphical(GameObject prefabClone) + private static void SetupStalk(GameObject prefabClone) { var graphical = prefabClone.FindChildByName("Graphical"); string[] toDelete = {"ballast", "anchors", "sleepers", "rails_static", "rails_moving"}; + foreach (var child in graphical.transform.GetChildren()) { if (!toDelete.Contains(child.name)) continue; Object.Destroy(child.gameObject); } + + var switch_base = graphical.transform.FindChildByName("switch_base"); + if (!switch_base) + { + Mapify.LogError("Could not determine switch offset"); + return; + } + + var offsetZ = switch_base.localPosition.z; + Mapify.LogDebug($"offsetZ: {offsetZ}"); + graphical.transform.localPosition -= new Vector3(0f, 0f, offsetZ); + var switchTrigger = prefabClone.FindChildByName("SwitchTrigger"); + switchTrigger.transform.localPosition -= new Vector3(0f, 0f, offsetZ); } private static void CreateVanillaSwitches() { - foreach (Switch sw in Object.FindObjectsOfType()) + foreach (Switch switch_ in Object.FindObjectsOfType()) { - Transform swTransform = sw.transform; - VanillaAsset vanillaAsset = sw.GetComponent().asset; + Transform swTransform = switch_.transform; + VanillaAsset vanillaAsset = switch_.GetComponent().asset; GameObject prefabClone = AssetCopier.Instantiate(vanillaAsset, false); Transform prefabCloneTransform = prefabClone.transform; - Transform inJunction = prefabCloneTransform.Find(IN_JUNCTION_NAME); - Vector3 offset = prefabCloneTransform.position - inJunction.position; + Transform junctionTransform = prefabCloneTransform.Find(IN_JUNCTION_NAME); + Vector3 offset = prefabCloneTransform.position - junctionTransform.position; foreach (Transform child in prefabCloneTransform) child.transform.position += offset; prefabCloneTransform.SetPositionAndRotation(swTransform.position, swTransform.rotation); - Junction junction = inJunction.GetComponent(); - junction.selectedBranch = (byte) (sw.IsLeft - ? sw.defaultState == Switch.StandSide.THROUGH + Junction junction = junctionTransform.GetComponent(); + junction.selectedBranch = (byte) (switch_.IsLeft + ? switch_.defaultState == Switch.StandSide.THROUGH ? 1 : 0 - : sw.defaultState == Switch.StandSide.THROUGH + : switch_.defaultState == Switch.StandSide.THROUGH ? 0 : 1 ); diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index be69e9e2..951dcf1f 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -226,11 +226,38 @@ public static RailTrack GetRailTrack(this RailTrackRegistry registry, string sta return registry.AllTracks.FirstOrDefault(track => track.name.Contains(query)); } - public static void SwitchTo(this Junction junction, int branchNumber, Junction.SwitchMode switchMode) + /// + /// Returns the subyard IDs of all subyards in the yard(station) with ID yardID + /// + public static IEnumerable GetSubYardIDsOfYard(this RailTrackRegistry registry, string yardID) + { + return registry.AllTracks + .Select(railTrack => railTrack.logicTrack.ID) + .Where(ID => ID.yardId == yardID) + .Select(ID => ID.subYardId) + .Distinct(); + } + + /// + /// Returns the track numbers of all track in the subyard with ID subYardID in the yard(station) with yardID + /// + public static IEnumerable GetTrackNumbersOfSubYard(this RailTrackRegistry registry, string yardID, string subYardID) + { + return registry.AllTracks + .Select(railTrack => railTrack.logicTrack.ID) + .Where(ID => ID.yardId == yardID && + ID.subYardId == subYardID) + .Select(ID => ID.orderNumber) + .Where(trackNumberString => trackNumberString != "") + .Select(int.Parse) + .Distinct(); + } + + public static void SwitchTo(this Junction junction, byte branchNumber, Junction.SwitchMode switchMode) { Mapify.LogDebug($"junction {junction.name} switch to {branchNumber}"); - junction.selectedBranch = branchNumber - 1; + junction.selectedBranch = (byte) Misc.BetterModulo(branchNumber - 1, junction.outBranches.Count); junction.Switch(switchMode); } diff --git a/MapifyEditor/BezierCurves/BezierCurveEditor.cs b/MapifyEditor/BezierCurves/BezierCurveEditor.cs index 8d3c317f..6c39026c 100644 --- a/MapifyEditor/BezierCurves/BezierCurveEditor.cs +++ b/MapifyEditor/BezierCurves/BezierCurveEditor.cs @@ -206,7 +206,7 @@ private void DrawPointInspector(BezierPoint point, int index) private static void DrawPointSceneGUI(BezierPoint point) { - if (point.GetComponentInParent()?.IsSwitch == true) + if (point.GetComponentInParent()?.IsVanillaSwitch == true) return; Handles.Label(point.position + new Vector3(0, HandleUtility.GetHandleSize(point.position) * 0.4f, 0), point.gameObject.name); diff --git a/MapifyEditor/BezierCurves/BezierPointEditor.cs b/MapifyEditor/BezierCurves/BezierPointEditor.cs index 0d8272b2..e9046a57 100644 --- a/MapifyEditor/BezierCurves/BezierPointEditor.cs +++ b/MapifyEditor/BezierCurves/BezierPointEditor.cs @@ -114,7 +114,7 @@ public override void OnInspectorGUI() private void OnSceneGUI() { - if (point.GetComponentInParent()?.IsSwitch == true) + if (point.GetComponentInParent()?.IsVanillaSwitch == true) return; Handles.color = Color.green; Vector3 newPosition = Handles.FreeMoveHandle(point.position, point.transform.rotation, HandleUtility.GetHandleSize(point.position) * 0.2f, Vector3.zero, Handles.CubeHandleCap); diff --git a/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs b/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs index 78018e8f..12b46810 100644 --- a/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs +++ b/MapifyEditor/Export/BuildUpdaters/Railway/SwitchUpdater.cs @@ -7,14 +7,14 @@ public class SwitchUpdater : BuildUpdater { protected override void Update(Scenes scenes) { - foreach (VanillaSwitch sw in scenes.railwayScene.GetAllComponents()) + foreach (Switch sw in scenes.railwayScene.GetAllComponents()) { VanillaObject vanillaObject = sw.GetComponent(); vanillaObject.asset = sw.IsLeft - ? sw.standSide == VanillaSwitch.StandSide.DIVERGING + ? sw.standSide == Switch.StandSide.DIVERGING ? VanillaAsset.SwitchLeft : VanillaAsset.SwitchLeftOuterSign - : sw.standSide == VanillaSwitch.StandSide.DIVERGING + : sw.standSide == Switch.StandSide.DIVERGING ? VanillaAsset.SwitchRight : VanillaAsset.SwitchRightOuterSign; } diff --git a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs index df38cf25..889301a3 100644 --- a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs @@ -13,12 +13,13 @@ protected override IEnumerator Validate(Scenes scenes) { foreach (var switch_ in scenes.railwayScene.GetAllComponents()) { - if (switch_.Tracks.Length < 2) + var switchTracks = switch_.GetTracks(); + if (switchTracks.Length < 2) { yield return Result.Error("Switches must have at least 2 branches", switch_); } - foreach (var track in switch_.Tracks) + foreach (var track in switchTracks) { track.Snap(); diff --git a/MapifyEditor/Export/Validators/Railway/TrackValidator.cs b/MapifyEditor/Export/Validators/Railway/TrackValidator.cs index ab3e5f19..174ffa3e 100644 --- a/MapifyEditor/Export/Validators/Railway/TrackValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/TrackValidator.cs @@ -31,8 +31,14 @@ protected override IEnumerator Validate(Scenes scenes) if (PrefabUtility.IsPartOfPrefabInstance(track)) yield return Result.Warning("Track prefabs should be unpacked completely before being used", track); - if (track.trackType != TrackType.Road) + if (track.trackType == TrackType.Road) { + if (!string.IsNullOrWhiteSpace(track.stationId)) + { + yield return Result.Warning($"Track {track.name} will not be assigned to specified station {track.stationId} because {nameof(track.trackType)} is set to {track.trackType}", track); + } + } + else { if (string.IsNullOrWhiteSpace(track.stationId)) yield return Result.Error("Station ID not specified", track); else if (stations.All(station => station.stationID != track.stationId)) diff --git a/MapifyEditor/Tools/ToolEnums.cs b/MapifyEditor/Tools/ToolEnums.cs index 5484a97c..e729e0ae 100644 --- a/MapifyEditor/Tools/ToolEnums.cs +++ b/MapifyEditor/Tools/ToolEnums.cs @@ -91,14 +91,14 @@ public static SwitchPoint NextPoint(SwitchPoint switchPoint) return SwitchPoint.Joint; } - public static VanillaSwitch.StandSide FlipStand(VanillaSwitch.StandSide standSide) + public static Switch.StandSide FlipStand(Switch.StandSide standSide) { - if (standSide == VanillaSwitch.StandSide.THROUGH) + if (standSide == Switch.StandSide.THROUGH) { - return VanillaSwitch.StandSide.DIVERGING; + return Switch.StandSide.DIVERGING; } - return VanillaSwitch.StandSide.THROUGH; + return Switch.StandSide.THROUGH; } } } diff --git a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs index 57787287..8a13ce54 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs @@ -65,7 +65,7 @@ public static Vector3[] PreviewArcCurve(Vector3 attachPoint, Vector3 handlePosit return lines.ToArray(); } - public static Vector3[][] PreviewSwitch(VanillaSwitch prefab, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint, + public static Vector3[][] PreviewSwitch(Switch prefab, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint, int samples = 8) { var curves = TrackToolsHelper.GetSwitchBeziers(prefab, attachPoint, handlePosition, connectingPoint); @@ -117,7 +117,7 @@ public static Vector3[][] PreviewCustomSwitch(Vector3 attachPoint, Vector3 handl return curves; } - public static Vector3[][] PreviewYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples = 8) { if (yardOptions.Half) @@ -130,7 +130,7 @@ public static Vector3[][] PreviewYard(VanillaSwitch leftPrefab, VanillaSwitch ri } } - private static Vector3[][] PreviewFullYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + private static Vector3[][] PreviewFullYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples) { List results = new List(); @@ -336,7 +336,7 @@ private static Vector3[][] PreviewFullYard(VanillaSwitch leftPrefab, VanillaSwit return results.ToArray(); } - private static Vector3[][] PreviewHalfYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + private static Vector3[][] PreviewHalfYard(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, int samples) { List results = new List(); @@ -491,13 +491,13 @@ private static Vector3[][] PreviewHalfYard(VanillaSwitch leftPrefab, VanillaSwit return results.ToArray(); } - private static Vector3[][] PreviewSwitchSprawl(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, YardOptions yardOptions, TrackOrientation orientation, + private static Vector3[][] PreviewSwitchSprawl(Switch leftPrefab, Switch rightPrefab, YardOptions yardOptions, TrackOrientation orientation, float trackDistance, bool mainSide, bool reverse, out Vector3[] trackPoints, int samples = 8) { List results = new List(); List points = new List(); - VanillaSwitch current = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; + Switch current = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; Vector3[][] temp = PreviewSwitch(current, Vector3.zero, Vector3.back, SwitchPoint.Joint, samples); results.AddRange(temp); @@ -597,7 +597,7 @@ public static Vector3[] PreviewConnect2(Vector3 p0, Vector3 h0, Vector3 p1, Vect samples); } - public static Vector3[][] PreviewCrossover(VanillaSwitch prefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewCrossover(Switch prefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, bool isTrailing, float switchDistance, int samples = 8) { List results = new List(); @@ -625,7 +625,7 @@ public static Vector3[][] PreviewCrossover(VanillaSwitch prefab, Vector3 attachP return results.ToArray(); } - public static Vector3[][] PreviewScissorsCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewScissorsCrossover(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, float switchDistance, int samples = 8) { List results = new List(); @@ -651,7 +651,7 @@ public static Vector3[][] PreviewScissorsCrossover(VanillaSwitch leftPrefab, Van return results.ToArray(); } - public static Vector3[][] PreviewDoubleSlip(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, + public static Vector3[][] PreviewDoubleSlip(Switch leftPrefab, Switch rightPrefab, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float crossAngle, int samples = 8) { List results = new List(); diff --git a/MapifyEditor/Tools/TrackToolsCreator.cs b/MapifyEditor/Tools/TrackToolsCreator.cs index 472edc9f..609c83cc 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.cs @@ -239,10 +239,10 @@ public static Track CreateArcCurve(Transform parent, Vector3 attachPoint, Vector // Switches. /// - /// Instantiates a . + /// Instantiates a . /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new switch. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -253,11 +253,11 @@ public static Track CreateArcCurve(Transform parent, Vector3 attachPoint, Vector /// Derail Valley switches are static assets, and their tracks cannot be changed. /// The switches are also always made at a grade of 0%. /// - public static VanillaSwitch CreateVanillaSwitch(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static Switch CreateVanillaSwitch(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, SwitchPoint connectingPoint) { // Create switch object. - VanillaSwitch s = Object.Instantiate(orientation == TrackOrientation.Left ? leftPrefab : rightPrefab, parent); + Switch s = Object.Instantiate(orientation == TrackOrientation.Left ? leftPrefab : rightPrefab, parent); s.gameObject.name = $"[Switch {orientation}]"; // Helper variables. Vector3 pivot; @@ -304,6 +304,8 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo //TODO connectingPoint var switchObject = new GameObject($"[Switch w/ {switchBranchesCount} branches]"); + switchObject.transform.position = attachPoint; + var switchComponent = switchObject.AddComponent(); //TODO switchComponent.defaultBranch = 0; @@ -341,7 +343,7 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo tracks[branchIndex] = CreateArcCurve(switchObject.transform, attachPoint, handlePosition, trackOrientation, thisRadius, thisArc, 360, endGrade); } - switchComponent.Tracks = tracks; + switchComponent.SetTracks(tracks); return switchComponent; } @@ -349,8 +351,8 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo /// /// Creates a yard with similar shape to the ones present in the base game. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the first switch. /// Handle of the attachment point for the first switch. @@ -366,7 +368,7 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo /// The starting number of the sidings. /// Whether the track numbers should increase FROM the starting ID or decrease TO the starting ID. /// An array with all sidings. - /// An array with the es at each end of the yard. + /// An array with the es at each end of the yard. /// /// For yards with the same number of tracks on both sides, it is recommended to set to true. /// This allows for yards with a shorter overall length, and with similar lengths on both sides. If the number of sides is different, @@ -389,7 +391,7 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo /// /// /// - public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, bool half, bool alternateSides, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -410,8 +412,8 @@ public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch /// /// Creates a yard with similar shape to the ones present in the base game. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The base track prefab. /// The parent for the new track. /// Attachment point for the first switch. @@ -420,9 +422,9 @@ public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch /// The distance between the sidings. /// Settings for the creation of the yard. /// An array with all sidings. - /// An array with the es at each end of the yard. - /// - public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + /// An array with the es at each end of the yard. + /// + public static Switch[] CreateYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, YardOptions yardOptions, out Track[] sidings) { return CreateYard(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, trackDistance, @@ -430,7 +432,7 @@ public static VanillaSwitch[] CreateYard(VanillaSwitch leftPrefab, VanillaSwitch yardOptions.StationId, yardOptions.YardId, yardOptions.StartTrackId, yardOptions.ReverseNumbers, out sidings); } - private static VanillaSwitch[] CreateFullYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + private static Switch[] CreateFullYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, bool alternateSides, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -440,9 +442,9 @@ private static VanillaSwitch[] CreateFullYard(VanillaSwitch leftPrefab, VanillaS } Vector3 dir = (attachPoint - handlePosition).normalized; - VanillaSwitch start; - VanillaSwitch end; - VanillaSwitch s; + Switch start; + Switch end; + Switch s; Track t; // Points to connect each yard track. @@ -645,10 +647,10 @@ private static VanillaSwitch[] CreateFullYard(VanillaSwitch leftPrefab, VanillaS Object.DestroyImmediate(endObj); sidings = storageTracks.ToArray(); - return new VanillaSwitch[] { start, end }; + return new Switch[] { start, end }; } - private static VanillaSwitch[] CreateHalfYard(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + private static Switch[] CreateHalfYard(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, int mainSideTracks, int otherSideTracks, float minimumLength, string stationId, char yardId, byte startingTrackId, bool reverseNumbers, out Track[] sidings) { @@ -666,8 +668,8 @@ private static VanillaSwitch[] CreateHalfYard(VanillaSwitch leftPrefab, VanillaS rotDir = -rotDir; } - VanillaSwitch start; - VanillaSwitch s; + Switch start; + Switch s; Track t; // Points to connect each yard track. @@ -853,20 +855,20 @@ void MoveDistance(Vector3 distance) Object.DestroyImmediate(startObj); sidings = storageTracks.ToArray(); - return new VanillaSwitch[] { start }; + return new Switch[] { start }; } // Switches on each side of the yard. - private static List CreateSwitchSprawl(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, - Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, int sideTracks, float trackDistance, out VanillaSwitch start, + private static List CreateSwitchSprawl(Switch leftPrefab, Switch rightPrefab, Transform parent, + Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, int sideTracks, float trackDistance, out Switch start, out Track[] endMerge) { // Starting switch. // Switch stands are all on the outside of the yard. start = CreateVanillaSwitch(leftPrefab, rightPrefab, parent, attachPoint, handlePosition, orientation, SwitchPoint.Joint); - start.standSide = VanillaSwitch.StandSide.DIVERGING; - start.defaultState = VanillaSwitch.StandSide.THROUGH; - VanillaSwitch s = start; + start.standSide = Switch.StandSide.DIVERGING; + start.defaultState = Switch.StandSide.THROUGH; + Switch s = start; BezierPoint now = s.GetDivergingPoint(); // Points where each track will be. @@ -889,8 +891,8 @@ private static List CreateSwitchSprawl(VanillaSwitch leftPrefab, Va orientation, SwitchPoint.Joint); now = s.GetThroughPoint(); points.Add(s.GetDivergingPoint()); - s.standSide = VanillaSwitch.StandSide.THROUGH; - s.defaultState = VanillaSwitch.StandSide.THROUGH; + s.standSide = Switch.StandSide.THROUGH; + s.defaultState = Switch.StandSide.THROUGH; length = sideL; } @@ -1011,16 +1013,16 @@ public static BufferStop CreateBuffer(BufferStop prefab, Transform parent, Vecto } /// - /// Instantiates the diverging track of a only. + /// Instantiates the diverging track of a only. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. /// Which side the curve turns to. /// The instantiated . - public static Track CreateSwitchCurve(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, + public static Track CreateSwitchCurve(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, SwitchPoint connectingPoint) { Track t; @@ -1032,7 +1034,7 @@ public static Track CreateSwitchCurve(VanillaSwitch leftPrefab, VanillaSwitch ri { t = Object.Instantiate(rightPrefab.DivergingTrack); } - VanillaSwitch s = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; + Switch s = orientation == TrackOrientation.Left ? leftPrefab : rightPrefab; Vector3 offset = -t.Curve[0].localPosition; @@ -1137,8 +1139,8 @@ public static Track CreateConnect2Point(Transform parent, Vector3 p0, Vector3 p1 /// /// Creates a crossover. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -1146,8 +1148,8 @@ public static Track CreateConnect2Point(Transform parent, Vector3 p0, Vector3 p1 /// The distance between the parallel tracks. /// Whether to the crossover is in front or comes from behind. /// The distance between the switches on the same track. - /// An array with the at the attachment point (index 0) and the other (index 1). - public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, + /// An array with the at the attachment point (index 0) and the other (index 1). + public static Switch[] CreateCrossover(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, bool trailing, float switchDistance) { @@ -1166,7 +1168,7 @@ public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaS sp = SwitchPoint.Joint; } - VanillaSwitch s1 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, + Switch s1 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, attachPoint, handlePosition, orientation, sp); BezierPoint bp1 = s1.GetDivergingPoint(); @@ -1179,20 +1181,20 @@ public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaS point = point + (dir * switchDistance) + offset; - VanillaSwitch s2 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, + Switch s2 = CreateVanillaSwitch(leftPrefab, rightPrefab, crossObj.transform, point, point - dir, orientation, SwitchPoint.Through); BezierPoint bp2 = s2.GetDivergingPoint(); CreateConnect2Point(crossObj.transform, bp1, bp2, false, false, 1.0f); - return new VanillaSwitch[] { s1, s2 }; + return new Switch[] { s1, s2 }; } /// /// Creates a scissors crossover (2 crossovers in the same place). /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. @@ -1200,9 +1202,9 @@ public static VanillaSwitch[] CreateCrossover(VanillaSwitch leftPrefab, VanillaS /// The distance between the parallel tracks. /// The distance between the switches on the same track. /// - /// An array of es in the following order: [0] attach [1] opposite to 0 [2] next to 0 [3] opposite to 2. + /// An array of es in the following order: [0] attach [1] opposite to 0 [2] next to 0 [3] opposite to 2. /// - public static VanillaSwitch[] CreateScissorsCrossover(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, + public static Switch[] CreateScissorsCrossover(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float trackDistance, float switchDistance) { // Create 2 crossovers offset from eachother. @@ -1231,23 +1233,23 @@ public static VanillaSwitch[] CreateScissorsCrossover(VanillaSwitch leftPrefab, CreateConnect2Point(t1, c2[0].GetThroughPoint(), c1[1].GetThroughPoint(), false, false, 1.0f); // Return all 4 switches. - return new VanillaSwitch[] { c1[0], c1[1], c2[0], c2[1] }; + return new Switch[] { c1[0], c1[1], c2[0], c2[1] }; } /// /// Creates a double slip. /// - /// Prefab of a with diverging track to the left. - /// Prefab of a with diverging track to the right. + /// Prefab of a with diverging track to the left. + /// Prefab of a with diverging track to the right. /// The parent for the new track. /// Attachment point for the track. /// Handle of the attachment point for the track. /// The side to which the first switch turns to. /// The angle at which the 2 middle tracks cross eachother. /// - /// An array of es in the following order: [0] attach [1] diverging attach [2] opposite to 0 [3] opposite to 1. + /// An array of es in the following order: [0] attach [1] diverging attach [2] opposite to 0 [3] opposite to 1. /// - public static VanillaSwitch[] CreateDoubleSlip(VanillaSwitch leftPrefab, VanillaSwitch rightPrefab, Transform parent, + public static Switch[] CreateDoubleSlip(Switch leftPrefab, Switch rightPrefab, Transform parent, Vector3 attachPoint, Vector3 handlePosition, TrackOrientation orientation, float crossAngle) { // Create the parent object. @@ -1264,10 +1266,10 @@ public static VanillaSwitch[] CreateDoubleSlip(VanillaSwitch leftPrefab, Vanilla // First side. // Creates a switch, a curve, and then another switch connected through its diverging track. - VanillaSwitch s00 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, attachPoint, handlePosition, orientation, SwitchPoint.Joint); + Switch s00 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, attachPoint, handlePosition, orientation, SwitchPoint.Joint); bp = s00.GetDivergingPoint(); bp = CreateArcCurve(obj.transform, bp.position, bp.globalHandle1, orientation, radius, arc, 180.0f, 0).Curve.Last(); - VanillaSwitch s01 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, + Switch s01 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, FlipOrientation(orientation), SwitchPoint.Diverging); // Calculate the middle crossover's position by interesecting the 2 through tracks. @@ -1280,16 +1282,16 @@ public static VanillaSwitch[] CreateDoubleSlip(VanillaSwitch leftPrefab, Vanilla Vector3 next = MathHelper.MirrorAround(attachPoint, mid); // Repeat the process for the other side. - VanillaSwitch s10 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, next, next + dir, orientation, SwitchPoint.Joint); + Switch s10 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, next, next + dir, orientation, SwitchPoint.Joint); bp = s10.GetDivergingPoint(); bp = CreateArcCurve(obj.transform, bp.position, bp.globalHandle1, orientation, radius, arc, 180.0f, 0).Curve.Last(); - VanillaSwitch s11 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, + Switch s11 = CreateVanillaSwitch(leftPrefab, rightPrefab, obj.transform, bp.position, bp.globalHandle1, FlipOrientation(orientation), SwitchPoint.Diverging); CreateConnect2Point(obj.transform, s00.GetThroughPoint(), s10.GetThroughPoint(), false, false, 1.0f); CreateConnect2Point(obj.transform, s01.GetThroughPoint(), s11.GetThroughPoint(), false, false, 1.0f); - return new VanillaSwitch[] { s00, s01, s10, s11 }; + return new Switch[] { s00, s01, s10, s11 }; } /// diff --git a/MapifyEditor/Tools/TrackToolsHelper.cs b/MapifyEditor/Tools/TrackToolsHelper.cs index 028f7276..de6312cb 100644 --- a/MapifyEditor/Tools/TrackToolsHelper.cs +++ b/MapifyEditor/Tools/TrackToolsHelper.cs @@ -44,7 +44,7 @@ public static float CalculateHeightDifference(float startGrade, float endGrade, /// The handle of the attachment point. /// Which point of the switch connects to the attachment point. /// An array with 2 arrays representing the through track (index 0) and diverging track (index 1). - public static SimpleBezier[] GetSwitchBeziers(VanillaSwitch s, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint) + public static SimpleBezier[] GetSwitchBeziers(Switch s, Vector3 attachPoint, Vector3 handlePosition, SwitchPoint connectingPoint) { // Create the original beziers. SimpleBezier[] curves = { @@ -101,19 +101,19 @@ public static SimpleBezier[] GetSwitchBeziers(VanillaSwitch s, Vector3 attachPoi } /// - /// Calculates the radius of the diverging track of a . + /// Calculates the radius of the diverging track of a . /// - public static float CalculateSwitchRadius(VanillaSwitch s) + public static float CalculateSwitchRadius(Switch s) { BezierPoint bp = s.GetDivergingPoint(); return bp.position.z / Mathf.Sin(Mathf.Atan(Mathf.Abs(bp.handle1.x / bp.handle1.z))); } /// - /// Calculates the angle at the end of the diverging track of a . + /// Calculates the angle at the end of the diverging track of a . /// /// The angle in radians. - public static float CalculateSwitchAngle(VanillaSwitch s) + public static float CalculateSwitchAngle(Switch s) { BezierPoint bp = s.GetDivergingPoint(); return Mathf.Atan(Mathf.Abs(bp.handle1.x / bp.handle1.z)); @@ -389,7 +389,7 @@ internal static void CopyTrackFields(Track original, Track other) } // The length of the straight section (middle track) of a crossover. - internal static float CalculateCrossoverDistance(VanillaSwitch switchPrefab, float trackDistance) + internal static float CalculateCrossoverDistance(Switch switchPrefab, float trackDistance) { float targetDistance = trackDistance - (2.0f * Mathf.Abs(switchPrefab.DivergingTrack.Curve[1].position.x)); Vector3 handle = switchPrefab.DivergingTrack.Curve[1].handle1; @@ -398,7 +398,7 @@ internal static float CalculateCrossoverDistance(VanillaSwitch switchPrefab, flo } // The length of the straight section connecting the middle switch to the outer switches in a yard. - internal static float CalculateLengthFromDistanceYardCentre(VanillaSwitch switchPrefab, float trackDistance) + internal static float CalculateLengthFromDistanceYardCentre(Switch switchPrefab, float trackDistance) { float targetDistance = trackDistance - Mathf.Abs(switchPrefab.DivergingTrack.Curve[1].position.x); @@ -411,7 +411,7 @@ internal static float CalculateLengthFromDistanceYardCentre(VanillaSwitch switch } // The length of the straight section connecting the outer switches in a yard. - internal static float CalculateLengthFromDistanceYardSides(VanillaSwitch switchPrefab, float trackDistance) + internal static float CalculateLengthFromDistanceYardSides(Switch switchPrefab, float trackDistance) { float targetDistance = trackDistance; @@ -446,7 +446,7 @@ internal static float CalculateYardMidSwitchDistance(float trackDistance) /// This will only look in the default directory (Mapify folder in the Assets root). /// If a parameter is not null, it will not be replaced. /// - public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, ref VanillaSwitch switchLeft, ref VanillaSwitch switchRight, ref Turntable turntable) + public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, ref Switch switchLeft, ref Switch switchRight, ref Turntable turntable) { string[] guids; @@ -476,7 +476,7 @@ public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, if (guids.Length > 0) { - switchLeft = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); + switchLeft = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); } } @@ -486,7 +486,7 @@ public static void TryGetDefaultPrefabs(ref Track track, ref BufferStop buffer, if (guids.Length > 0) { - switchRight = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); + switchRight = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); } } diff --git a/MapifyEditor/Tools/TrackToolsWindow.cs b/MapifyEditor/Tools/TrackToolsWindow.cs index 98e7b52d..32e441ed 100644 --- a/MapifyEditor/Tools/TrackToolsWindow.cs +++ b/MapifyEditor/Tools/TrackToolsWindow.cs @@ -45,7 +45,7 @@ public static void ShowWindow() public Track CurrentTrack => _selectedTracks.Length > 0 ? _selectedTracks[0] : null; public BezierPoint CurrentPoint => _selectedPoints.Length > 0 ? _selectedPoints[0] : null; - public VanillaSwitch CurrentSwitch { get; private set; } + public Switch CurrentSwitch { get; private set; } public Turntable CurrentTurntable { get; private set; } #endregion @@ -146,7 +146,7 @@ private void PrepareSelection() { _selectionType = SelectionType.BezierPoint; } - else if (go.TryGetComponent(out VanillaSwitch s)) + else if (go.TryGetComponent(out Switch s)) { _selectionType = SelectionType.Switch; CurrentSwitch = s; @@ -445,6 +445,7 @@ private bool IsAllowedCreation(bool isBehind, out string tooltip) return false; } + //TODO this one sometimes gives a false positive if (!CheckGrade(isBehind ? CurrentTrack.GetGradeAtStart() : CurrentTrack.GetGradeAtEnd())) { tooltip = "Grade too steep for creation"; @@ -573,12 +574,12 @@ private void RemakeAndRepaint() SceneView.RepaintAll(); } - private VanillaSwitch GetCurrentSwitchPrefab() + private Switch GetCurrentSwitchPrefab() { return IsLeft ? LeftSwitch : RightSwitch; } - private VanillaSwitch GetSwitch(TrackOrientation orientation) + private Switch GetSwitch(TrackOrientation orientation) { if (orientation == TrackOrientation.Left) { diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs index 2a3e1826..64d608da 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs @@ -314,20 +314,27 @@ private void DrawCurveOptions(bool CustomSwitchBranch = false) _radius = EditorGUILayout.FloatField(new GUIContent("Radius", "Radius of the curve"), _radius); - if (!CustomSwitchBranch && GUILayout.Button(new GUIContent("Use switch radius", "Sets the radius to the one of switch curves"), + if (GUILayout.Button(new GUIContent("Use switch radius", "Sets the radius to the one of switch curves"), GUILayout.MaxWidth(140))) { - if (LeftSwitch) + if (CustomSwitchBranch) { - _radius = TrackToolsHelper.CalculateSwitchRadius(LeftSwitch); - } - else if (RightSwitch) - { - _radius = TrackToolsHelper.CalculateSwitchRadius(RightSwitch); + _radius = TrackToolsHelper.DefaultSwitchRadius; } else { - _radius = TrackToolsHelper.DefaultSwitchRadius; + if (LeftSwitch) + { + _radius = TrackToolsHelper.CalculateSwitchRadius(LeftSwitch); + } + else if (RightSwitch) + { + _radius = TrackToolsHelper.CalculateSwitchRadius(RightSwitch); + } + else + { + _radius = TrackToolsHelper.DefaultSwitchRadius; + } } } @@ -362,7 +369,7 @@ private void DrawCurveOptions(bool CustomSwitchBranch = false) _changeArc = EditorGUILayout.ToggleLeft(new GUIContent("Change arc", "Change the arc of the curve instead of the radius to match the length"), - _changeArc, GUILayout.MaxWidth(100)); + _changeArc, GUILayout.MaxWidth(140)); if (changed) { diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs index 37ac372c..3334d606 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs @@ -13,8 +13,8 @@ public partial class TrackToolsWindow // Track prefabs. private bool _showPrefabs = false; public BufferStop BufferPrefab; - public VanillaSwitch LeftSwitch; - public VanillaSwitch RightSwitch; + public Switch LeftSwitch; + public Switch RightSwitch; public Turntable TurntablePrefab; // Settings. diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs index fb8de2f1..671698fd 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Selection.cs @@ -77,7 +77,7 @@ private void DrawTrackSelection() if (GUILayout.Button(new GUIContent("Swap tracks", "Swaps the selected track between the through and diverging tracks")) && isSwitch) { - VanillaSwitch s = CurrentTrack.GetComponentInParent(); + Switch s = CurrentTrack.GetComponentInParent(); if (CurrentTrack == s.ThroughTrack) { @@ -186,7 +186,7 @@ private void DrawSwitchSelection() new GUIContent($"{(CurrentSwitch.IsLeft ? "Left" : "Right")}")); EditorGUILayout.BeginHorizontal(); - CurrentSwitch.defaultState = (VanillaSwitch.StandSide)EditorGUILayout.EnumPopup(new GUIContent("Currently set to", + CurrentSwitch.defaultState = (Switch.StandSide)EditorGUILayout.EnumPopup(new GUIContent("Currently set to", "The switch state when exporting"), CurrentSwitch.defaultState); diff --git a/MapifyEditor/Trackage/CustomSwitch.cs b/MapifyEditor/Trackage/CustomSwitch.cs index fa5c304b..23e40b44 100644 --- a/MapifyEditor/Trackage/CustomSwitch.cs +++ b/MapifyEditor/Trackage/CustomSwitch.cs @@ -10,6 +10,8 @@ public enum StandSide RIGHT } + public BezierPoint JointPoint => Tracks[0].Curve[0]; + [Tooltip("Which way the switch should be flipped by default")] public byte defaultBranch = 0; @@ -17,6 +19,17 @@ public enum StandSide public StandSide standSide; [Tooltip("Tracks in the switch, from left to right")] - public new Track[] Tracks; + [SerializeField] + private Track[] Tracks; + + public override Track[] GetTracks() + { + return Tracks; + } + + public void SetTracks(Track[] newTracks) + { + Tracks = newTracks; + } } } diff --git a/MapifyEditor/Trackage/VanillaSwitch.cs b/MapifyEditor/Trackage/Switch.cs similarity index 95% rename from MapifyEditor/Trackage/VanillaSwitch.cs rename to MapifyEditor/Trackage/Switch.cs index 360a093a..e8b21cdc 100644 --- a/MapifyEditor/Trackage/VanillaSwitch.cs +++ b/MapifyEditor/Trackage/Switch.cs @@ -3,7 +3,7 @@ namespace Mapify.Editor { [RequireComponent(typeof(VanillaObject))] - public class VanillaSwitch : SwitchBase + public class Switch : SwitchBase { public enum StandSide { diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs index 5af7fdd8..358d34c6 100644 --- a/MapifyEditor/Trackage/SwitchBase.cs +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -8,7 +8,10 @@ namespace Mapify.Editor { public abstract class SwitchBase: MonoBehaviour { - public Track[] Tracks => gameObject.GetComponentsInChildren(); + public virtual Track[] GetTracks() + { + return gameObject.GetComponentsInChildren(); + } // TODO why is this unused // protected void Snap() diff --git a/MapifyEditor/Trackage/Track.cs b/MapifyEditor/Trackage/Track.cs index e97d06b9..f232d8ab 100644 --- a/MapifyEditor/Trackage/Track.cs +++ b/MapifyEditor/Trackage/Track.cs @@ -62,6 +62,7 @@ public BezierCurve Curve { } public bool IsSwitch => GetComponentInParent() != null; + public bool IsVanillaSwitch => GetComponentInParent() != null; public bool IsTurntable => GetComponentInParent() != null; public string LogicName => From c42e9f9dd2346a089a1d815201ee37f8c686fd8b Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 29 Dec 2024 22:17:24 +0100 Subject: [PATCH 21/38] fix 'has no basetype' errors --- .../SceneInitializers/Railway/TrackSetup.cs | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 75951e56..3b117087 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -82,6 +82,11 @@ private static void CreateCustomSwitch(CustomSwitch customSwitch) DestroyPrefabTracks(prefabClone); CreateSwitchTracks(customSwitch, prefabClone, inJunction); SetupStalk(prefabClone); + + foreach (var track in customSwitch.GetTracks()) + { + track.gameObject.SetActive(true); + } } private static void DestroyPrefabTracks(GameObject prefabClone) @@ -96,7 +101,7 @@ private static void DestroyPrefabTracks(GameObject prefabClone) private static void CreateSwitchTracks(CustomSwitch customSwitch, GameObject prefabClone, Junction switchJunction) { var railTracksInSwitch = CreateRailTracks( - customSwitch.GetTracks(), true + customSwitch.GetTracks(), false ); if (!railTracksInSwitch.Any()) @@ -107,15 +112,15 @@ private static void CreateSwitchTracks(CustomSwitch customSwitch, GameObject pre switchJunction.outBranches = new List(); - foreach (var t in railTracksInSwitch) + foreach (var trackInSwitch in railTracksInSwitch) { - t.transform.SetParent(prefabClone.transform, true); + trackInSwitch.transform.SetParent(prefabClone.transform, true); - t.inBranch = new Junction.Branch(); - t.inBranch.track = null; - t.inJunction = switchJunction; + trackInSwitch.inBranch = new Junction.Branch(); + trackInSwitch.inBranch.track = null; + trackInSwitch.inJunction = switchJunction; - switchJunction.outBranches.Add(new Junction.Branch(t, true)); + switchJunction.outBranches.Add(new Junction.Branch(trackInSwitch, true)); } //track before the switch @@ -156,7 +161,7 @@ private static void SetupStalk(GameObject prefabClone) } var offsetZ = switch_base.localPosition.z; - Mapify.LogDebug($"offsetZ: {offsetZ}"); + // Mapify.LogDebug($"offsetZ: {offsetZ}"); graphical.transform.localPosition -= new Vector3(0f, 0f, offsetZ); var switchTrigger = prefabClone.FindChildByName("SwitchTrigger"); switchTrigger.transform.localPosition -= new Vector3(0f, 0f, offsetZ); From b07a65443e353bedfb3235bd6dd398547d9c0609 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 28 Jan 2025 16:09:23 +0100 Subject: [PATCH 22/38] cleanup --- Mapify/Utils/Extensions.cs | 35 ------------------- MapifyEditor/Tools/ToolEnums.cs | 4 +-- .../Tools/TrackToolsCreator.Previews.cs | 2 +- MapifyEditor/Tools/TrackToolsCreator.cs | 6 ++-- MapifyEditor/Tools/TrackToolsWindow.cs | 2 +- .../Tools/TrackToolsWindowGUI/Creation.cs | 2 +- .../Tools/TrackToolsWindowGUI/Other.cs | 25 ++++++------- 7 files changed, 22 insertions(+), 54 deletions(-) diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 951dcf1f..2b3eb20c 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -226,41 +226,6 @@ public static RailTrack GetRailTrack(this RailTrackRegistry registry, string sta return registry.AllTracks.FirstOrDefault(track => track.name.Contains(query)); } - /// - /// Returns the subyard IDs of all subyards in the yard(station) with ID yardID - /// - public static IEnumerable GetSubYardIDsOfYard(this RailTrackRegistry registry, string yardID) - { - return registry.AllTracks - .Select(railTrack => railTrack.logicTrack.ID) - .Where(ID => ID.yardId == yardID) - .Select(ID => ID.subYardId) - .Distinct(); - } - - /// - /// Returns the track numbers of all track in the subyard with ID subYardID in the yard(station) with yardID - /// - public static IEnumerable GetTrackNumbersOfSubYard(this RailTrackRegistry registry, string yardID, string subYardID) - { - return registry.AllTracks - .Select(railTrack => railTrack.logicTrack.ID) - .Where(ID => ID.yardId == yardID && - ID.subYardId == subYardID) - .Select(ID => ID.orderNumber) - .Where(trackNumberString => trackNumberString != "") - .Select(int.Parse) - .Distinct(); - } - - public static void SwitchTo(this Junction junction, byte branchNumber, Junction.SwitchMode switchMode) - { - Mapify.LogDebug($"junction {junction.name} switch to {branchNumber}"); - - junction.selectedBranch = (byte) Misc.BetterModulo(branchNumber - 1, junction.outBranches.Count); - junction.Switch(switchMode); - } - public static Junction.Branch FindClosestBranch(this Junction junction, Vector3 fromPoint, float maxRange = 5f) { var closestDistance = float.PositiveInfinity; diff --git a/MapifyEditor/Tools/ToolEnums.cs b/MapifyEditor/Tools/ToolEnums.cs index e729e0ae..8b0f7a32 100644 --- a/MapifyEditor/Tools/ToolEnums.cs +++ b/MapifyEditor/Tools/ToolEnums.cs @@ -14,8 +14,8 @@ public enum TrackOrientation public enum SwitchType { - Vanilla, - Custom + Vanilla, //switches like in the base game + Custom //more flexible type of switches, can have more than 2 branches and any shape } public enum SwitchPoint diff --git a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs index 8a13ce54..5b8ff53a 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs @@ -80,7 +80,7 @@ public static Vector3[][] PreviewSwitch(Switch prefab, Vector3 attachPoint, Vect public static Vector3[][] PreviewCustomSwitch(Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, int connectingPoint, float radius, float arc, float endGrade, int samples = 8) { - //TODO connectingPoint + //TODO implement connectingPoint var curves = new Vector3[switchBranchesCount][]; var length = radius * arc * Mathf.Deg2Rad; diff --git a/MapifyEditor/Tools/TrackToolsCreator.cs b/MapifyEditor/Tools/TrackToolsCreator.cs index 609c83cc..46ad6e74 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.cs @@ -301,13 +301,15 @@ public static Switch CreateVanillaSwitch(Switch leftPrefab, Switch rightPrefab, public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, int connectingPoint, float radius, float arc, float endGrade) { - //TODO connectingPoint + //TODO implement connectingPoint var switchObject = new GameObject($"[Switch w/ {switchBranchesCount} branches]"); switchObject.transform.position = attachPoint; + switchObject.transform.parent = parent; //todo test this var switchComponent = switchObject.AddComponent(); - //TODO + + //TODO maybe make this configurable? not important switchComponent.defaultBranch = 0; switchComponent.standSide = CustomSwitch.StandSide.LEFT; diff --git a/MapifyEditor/Tools/TrackToolsWindow.cs b/MapifyEditor/Tools/TrackToolsWindow.cs index 32e441ed..8def2a68 100644 --- a/MapifyEditor/Tools/TrackToolsWindow.cs +++ b/MapifyEditor/Tools/TrackToolsWindow.cs @@ -445,7 +445,7 @@ private bool IsAllowedCreation(bool isBehind, out string tooltip) return false; } - //TODO this one sometimes gives a false positive + //TODO bug: this check sometimes gives a false positive if (!CheckGrade(isBehind ? CurrentTrack.GetGradeAtStart() : CurrentTrack.GetGradeAtEnd())) { tooltip = "Grade too steep for creation"; diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs index 64d608da..7ee3e7b9 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs @@ -48,7 +48,7 @@ public partial class TrackToolsWindow private int _switchBranchesCount = 2; private SwitchPoint _connectingPointVanilla = SwitchPoint.Joint; // 0 -> joint point, 1 - ∞ -> branch point - private int _connectingPointCustom = 0; + private int _connectingPointCustom = 0; //TODO implement connecting point // Yards. private YardOptions _yardOptions = YardOptions.DefaultOptions; diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs index 3334d606..5078d1a0 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs @@ -196,18 +196,19 @@ private void DrawCustomSwitchOptions() optionValues[i] = i; } - _connectingPointCustom = EditorGUILayout.IntPopup( - new GUIContent("Connecting point", "Which of the switch points should connect to the current track"), - _connectingPointCustom, - displayedOptions, - optionValues, - EditorStyles.popup - ); - - if (GUILayout.Button(new GUIContent("Next point", "Swaps between the switch points."), GUILayout.MaxWidth(120))) - { - _connectingPointCustom = (_connectingPointCustom+1) % (_switchBranchesCount+1); - } + //TODO implement connecting point + // _connectingPointCustom = EditorGUILayout.IntPopup( + // new GUIContent("Connecting point", "Which of the switch points should connect to the current track"), + // _connectingPointCustom, + // displayedOptions, + // optionValues, + // EditorStyles.popup + // ); + + // if (GUILayout.Button(new GUIContent("Next point", "Swaps between the switch points."), GUILayout.MaxWidth(120))) + // { + // _connectingPointCustom = (_connectingPointCustom+1) % (_switchBranchesCount+1); + // } EditorGUILayout.EndHorizontal(); From fea81bbb9c00494c9e6460b3898c9bb195aa41f7 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:56:42 +0100 Subject: [PATCH 23/38] SwitchValidator: avoid a nullreferenceexception --- MapifyEditor/Export/Validators/Railway/SwitchValidator.cs | 8 +++++++- MapifyEditor/Trackage/SwitchBase.cs | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs index 889301a3..949604b1 100644 --- a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs @@ -16,7 +16,13 @@ protected override IEnumerator Validate(Scenes scenes) var switchTracks = switch_.GetTracks(); if (switchTracks.Length < 2) { - yield return Result.Error("Switches must have at least 2 branches", switch_); + yield return Result.Error($"Switches must have at least 2 branches but it has {switchTracks.Length}", switch_); + } + + if (switchTracks.Any(switchTrack => switchTrack == null)) + { + yield return Result.Error($"Switch track is null", switch_); + continue; } foreach (var track in switchTracks) diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs index 358d34c6..126d82fc 100644 --- a/MapifyEditor/Trackage/SwitchBase.cs +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -10,7 +10,8 @@ public abstract class SwitchBase: MonoBehaviour { public virtual Track[] GetTracks() { - return gameObject.GetComponentsInChildren(); + var tracks = gameObject.GetComponentsInChildren(); + return tracks ?? new Track[] {}; } // TODO why is this unused From 6a3bb2ab41c3723ddc0d9bb062089f23ccc8fa94 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:09:31 +0100 Subject: [PATCH 24/38] less magic numbers --- Mapify/Patches/TurntableControllerPatch.cs | 3 ++- MapifyEditor/Trackage/Track.cs | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Mapify/Patches/TurntableControllerPatch.cs b/Mapify/Patches/TurntableControllerPatch.cs index 795708f1..1261e3fa 100644 --- a/Mapify/Patches/TurntableControllerPatch.cs +++ b/Mapify/Patches/TurntableControllerPatch.cs @@ -1,5 +1,6 @@ using System.Reflection; using HarmonyLib; +using Mapify.Editor; using Mapify.Utils; using UnityEngine; @@ -16,7 +17,7 @@ private static bool Prefix(Transform handle) return false; BoxCollider collider = handle.GetComponent(); if (collider != null) - TurntableController_Field_PUSH_HANDLE_HALF_EXTENTS.SetValue(null, collider.size.Add(0.05f)); + TurntableController_Field_PUSH_HANDLE_HALF_EXTENTS.SetValue(null, collider.size.Add(Track.TURNTABLE_SEARCH_RANGE)); return true; } } diff --git a/MapifyEditor/Trackage/Track.cs b/MapifyEditor/Trackage/Track.cs index f232d8ab..045d18fd 100644 --- a/MapifyEditor/Trackage/Track.cs +++ b/MapifyEditor/Trackage/Track.cs @@ -12,6 +12,7 @@ public class Track : MonoBehaviour public const float SNAP_RANGE = 1.0f; public const float SNAP_UPDATE_RANGE_SQR = 250000; public const float SNAP_RANGE_SQR = SNAP_RANGE * SNAP_RANGE; + public const float TURNTABLE_SEARCH_RANGE = 0.05f; // ReSharper disable MemberCanBePrivate.Global public static readonly Color32 COLOR_ROAD = new Color32(255, 255, 255, 255); @@ -122,9 +123,9 @@ internal void Snap() { BezierPoint[] points = FindObjectsOfType().SelectMany(curve => new[] { curve[0], curve.Last() }).ToArray(); GameObject[] selectedObjects = Selection.gameObjects; - bool isSelected = !IsSwitch && !IsTurntable && (selectedObjects.Contains(gameObject) || selectedObjects.Contains(Curve[0].gameObject) || selectedObjects.Contains(Curve.Last().gameObject)); - TrySnap(points, isSelected, true); - TrySnap(points, isSelected, false); + bool shouldMove = !IsSwitch && !IsTurntable && (selectedObjects.Contains(gameObject) || selectedObjects.Contains(Curve[0].gameObject) || selectedObjects.Contains(Curve.Last().gameObject)); + TrySnap(points, shouldMove, true); + TrySnap(points, shouldMove, false); } private static void DrawDisconnectedIcon(Vector3 position) @@ -177,7 +178,7 @@ private void TrySnap(IEnumerable snapPoints, bool move, bool first) Collider[] colliders = new Collider[1]; // Turntables will search for track within 0.05m, so set it a little lower to be safe. - if (!IsSwitch && Physics.OverlapSphereNonAlloc(pos, 0.04f, colliders) != 0) + if (!IsSwitch && Physics.OverlapSphereNonAlloc(pos, TURNTABLE_SEARCH_RANGE-0.01f, colliders) != 0) { Collider collider = colliders[0]; Track track = collider.GetComponent(); From 46e002298f603e784fb1c4924cac10bea589a38a Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:16:25 +0100 Subject: [PATCH 25/38] additional switch validation --- Mapify/SceneInitializers/Railway/TrackSetup.cs | 2 +- .../Validators/Railway/SwitchValidator.cs | 17 ++++++++++++----- MapifyEditor/Trackage/CustomSwitch.cs | 14 ++++++++++++-- MapifyEditor/Trackage/Switch.cs | 2 +- MapifyEditor/Trackage/SwitchBase.cs | 2 ++ 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 3b117087..d763d03c 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -76,7 +76,7 @@ private static void CreateCustomSwitch(CustomSwitch customSwitch) //Junction var inJunction = prefabClone.GetComponentInChildren(); - inJunction.transform.position = customSwitch.JointPoint.transform.position; + inJunction.transform.position = customSwitch.GetJointPoint().transform.position; inJunction.selectedBranch = customSwitch.defaultBranch; DestroyPrefabTracks(prefabClone); diff --git a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs index 949604b1..a30ddc2e 100644 --- a/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs +++ b/MapifyEditor/Export/Validators/Railway/SwitchValidator.cs @@ -4,6 +4,7 @@ using Mapify.Editor; using Mapify.Editor.Utils; using Mapify.Editor.Validators; +using UnityEngine; namespace MapifyEditor.Export.Validators { @@ -17,6 +18,7 @@ protected override IEnumerator Validate(Scenes scenes) if (switchTracks.Length < 2) { yield return Result.Error($"Switches must have at least 2 branches but it has {switchTracks.Length}", switch_); + continue; } if (switchTracks.Any(switchTrack => switchTrack == null)) @@ -25,17 +27,22 @@ protected override IEnumerator Validate(Scenes scenes) continue; } + var jointPointPos = switch_.GetJointPoint().position; + for (int i = 1; i < switchTracks.Length; i++) + { + if (Vector3.Distance(jointPointPos, switchTracks[i].Curve[0].position) <= Track.SNAP_RANGE) continue; + + yield return Result.Error("All tracks in switches must connect to each other at point 0", switch_); + break; + } + foreach (var track in switchTracks) { track.Snap(); - if (track.isInSnapped && track.isOutSnapped) continue; - yield return Result.Error("Switches must have a track attached to all points", switch_); - break; + yield return Result.Error("Switches must have a track attached to all points", track); } - - //TODO valideer dat de tracks met de [0] aan elkaar zitten } } } diff --git a/MapifyEditor/Trackage/CustomSwitch.cs b/MapifyEditor/Trackage/CustomSwitch.cs index 23e40b44..1a1d4c23 100644 --- a/MapifyEditor/Trackage/CustomSwitch.cs +++ b/MapifyEditor/Trackage/CustomSwitch.cs @@ -1,4 +1,5 @@ -using UnityEngine; +using System; +using UnityEngine; namespace Mapify.Editor { @@ -10,7 +11,16 @@ public enum StandSide RIGHT } - public BezierPoint JointPoint => Tracks[0].Curve[0]; + public override BezierPoint GetJointPoint() => Tracks[0].Curve[0]; + + public BezierPoint GetOutPoint(int branchIndex) + { + if (branchIndex >= Tracks.Length) + { + throw new IndexOutOfRangeException($"Branch index {branchIndex} is out of range. Switch has {Tracks.Length} tracks."); + } + return Tracks[branchIndex].Curve.Last(); + } [Tooltip("Which way the switch should be flipped by default")] public byte defaultBranch = 0; diff --git a/MapifyEditor/Trackage/Switch.cs b/MapifyEditor/Trackage/Switch.cs index e8b21cdc..2d301c35 100644 --- a/MapifyEditor/Trackage/Switch.cs +++ b/MapifyEditor/Trackage/Switch.cs @@ -21,7 +21,7 @@ public enum StandSide public Track DivergingTrack => transform.Find("[track diverging]").GetComponent(); public bool IsLeft => DivergingTrack.Curve.Last().localPosition.x < 0; - public BezierPoint GetJointPoint() => ThroughTrack.Curve[0]; + public override BezierPoint GetJointPoint() => ThroughTrack.Curve[0]; public BezierPoint GetThroughPoint() => ThroughTrack.Curve[1]; public BezierPoint GetDivergingPoint() => DivergingTrack.Curve[1]; public BezierPoint GetDivergeJoinPoint() => DivergingTrack.Curve[0]; diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs index 126d82fc..592bbe4e 100644 --- a/MapifyEditor/Trackage/SwitchBase.cs +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -14,6 +14,8 @@ public virtual Track[] GetTracks() return tracks ?? new Track[] {}; } + public abstract BezierPoint GetJointPoint(); + // TODO why is this unused // protected void Snap() // { From 2db5b3088f14173d014af0f2f592a6bde76e9a02 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 28 Jan 2025 20:32:24 +0100 Subject: [PATCH 26/38] fix custom switch branches not connecting to track --- .../SceneInitializers/Railway/TrackSetup.cs | 31 +++++++++++++------ MapifyEditor/Trackage/Track.cs | 1 + 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index d763d03c..43762359 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -16,18 +16,19 @@ public class TrackSetup : SceneSetup public override void Run() { - Track[] tracks = Object.FindObjectsOfType().Where(t => !t.IsSwitch).ToArray(); + var allTracks = Object.FindObjectsOfType(); + var nonSwitchTracks = allTracks.Where(t => !t.IsSwitch).ToArray(); Mapify.LogDebug(() => "Creating RailTracks"); - CreateRailTracks(tracks, false); + CreateRailTracks(nonSwitchTracks, false); Mapify.LogDebug(() => "Creating Junctions"); CreateJunctions(); - tracks.SetActive(true); + nonSwitchTracks.SetActive(true); Mapify.LogDebug(() => "Connecting tracks"); - ConnectTracks(tracks); + ConnectTracks(allTracks); RailManager.AlignAllTrackEnds(); RailManager.TestConnections(); @@ -207,13 +208,25 @@ private static void ConnectTracks(IEnumerable tracks) foreach (Track track in tracks) { + //vanilla switches are connected elsewhere + if(track.IsVanillaSwitch) continue; + RailTrack railTrack = track.GetComponent(); - if (railTrack.isJunctionTrack) - continue; - if (railTrack.ConnectInToClosestJunction() == null) - railTrack.ConnectInToClosestBranch(); - if (railTrack.ConnectOutToClosestJunction() == null) + + if (track.IsCustomSwitch) + { railTrack.ConnectOutToClosestBranch(); + + if (railTrack.outBranch != null) continue; + Mapify.LogError($"{nameof(ConnectTracks)}: {nameof(railTrack.outBranch)} is null for custom switch track {track.name}"); + } + else + { + if (railTrack.ConnectInToClosestJunction() == null) + railTrack.ConnectInToClosestBranch(); + if (railTrack.ConnectOutToClosestJunction() == null) + railTrack.ConnectOutToClosestBranch(); + } } Debug.unityLogger.filterLogType = type; diff --git a/MapifyEditor/Trackage/Track.cs b/MapifyEditor/Trackage/Track.cs index 045d18fd..b20462b4 100644 --- a/MapifyEditor/Trackage/Track.cs +++ b/MapifyEditor/Trackage/Track.cs @@ -64,6 +64,7 @@ public BezierCurve Curve { public bool IsSwitch => GetComponentInParent() != null; public bool IsVanillaSwitch => GetComponentInParent() != null; + public bool IsCustomSwitch => GetComponentInParent() != null; public bool IsTurntable => GetComponentInParent() != null; public string LogicName => From 542009ccf5056a238310adb9305df1af56667fc8 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Tue, 28 Jan 2025 20:34:41 +0100 Subject: [PATCH 27/38] remove todo --- MapifyEditor/Tools/TrackToolsCreator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MapifyEditor/Tools/TrackToolsCreator.cs b/MapifyEditor/Tools/TrackToolsCreator.cs index 46ad6e74..f6574abb 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.cs @@ -305,7 +305,7 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo var switchObject = new GameObject($"[Switch w/ {switchBranchesCount} branches]"); switchObject.transform.position = attachPoint; - switchObject.transform.parent = parent; //todo test this + switchObject.transform.parent = parent; var switchComponent = switchObject.AddComponent(); From 87b55fc86588df15e7a8b638f52bb6e4bfd742e6 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:56:34 +0200 Subject: [PATCH 28/38] merge pls --- Mapify/Components/CarDeleter_r.cs | 4 ++-- Mapify/Components/Retarder_r.cs | 2 +- Mapify/Components/TimedCarSpawner_r.cs | 4 ++-- Mapify/Components/YardController_r.cs | 4 ++-- Mapify/Utils/Extensions.cs | 10 +++++----- Mapify/Utils/PathFinder.cs | 10 +++++----- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Mapify/Components/CarDeleter_r.cs b/Mapify/Components/CarDeleter_r.cs index 94042681..dfcb379d 100644 --- a/Mapify/Components/CarDeleter_r.cs +++ b/Mapify/Components/CarDeleter_r.cs @@ -15,9 +15,9 @@ private void Start() private void Update() { - if(!railTrack.onTrackBogies.Any()) return; + if(!railTrack.BogiesOnTrack().Any()) return; - var carToDelete = railTrack.onTrackBogies.Select(bogie => bogie._car).First(); + var carToDelete = railTrack.BogiesOnTrack().Select(bogie => bogie._car).First(); Mapify.LogDebug($"{nameof(CarDeleter_r)}: Deleting {carToDelete.name}"); diff --git a/Mapify/Components/Retarder_r.cs b/Mapify/Components/Retarder_r.cs index 85b107e7..a2e78bc3 100644 --- a/Mapify/Components/Retarder_r.cs +++ b/Mapify/Components/Retarder_r.cs @@ -28,7 +28,7 @@ private void Start() private void FixedUpdate() { - foreach (var car in railTrack.onTrackBogies.Select(bogie => bogie._car)) + foreach (var car in railTrack.BogiesOnTrack().Select(bogie => bogie._car)) { if(car.GetAbsSpeed() <= maxSpeed) { return; } diff --git a/Mapify/Components/TimedCarSpawner_r.cs b/Mapify/Components/TimedCarSpawner_r.cs index 6c4cf5b9..1ff8ef54 100644 --- a/Mapify/Components/TimedCarSpawner_r.cs +++ b/Mapify/Components/TimedCarSpawner_r.cs @@ -51,14 +51,14 @@ private IEnumerator Spawn() { while (true) { - while (spawnTrack.onTrackBogies.Any()) + while (spawnTrack.BogiesOnTrack().Any()) { yield return null; } yield return new WaitForSeconds(SpawnInterval); - while (spawnTrack.onTrackBogies.Any()) + while (spawnTrack.BogiesOnTrack().Any()) { yield return null; } diff --git a/Mapify/Components/YardController_r.cs b/Mapify/Components/YardController_r.cs index 4e710a96..3692de2b 100644 --- a/Mapify/Components/YardController_r.cs +++ b/Mapify/Components/YardController_r.cs @@ -20,7 +20,7 @@ public class YardController_r: MonoBehaviour private string stationID; private string yardID; - private Dictionary trackNumberToCarID = new(); + private Dictionary trackNumberToCarID = new Dictionary(); private bool hasBeenSetup = false; @@ -60,7 +60,7 @@ private void Start() private void Update() { - var detectedCar = detectorTrack.onTrackBogies.Select(bogie => bogie._car).FirstOrDefault(); + var detectedCar = detectorTrack.BogiesOnTrack().Select(bogie => bogie._car).FirstOrDefault(); if(!detectedCar) return; var carTypeID = detectedCar.carLivery.parentType.id; diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index c57c09e9..6d331a88 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -277,7 +277,7 @@ public static void SetBasicMapInfo(this SaveGameData saveGameData, BasicMapInfo saveGameData.SetJObject(SAVE_KEY_NAME, JObject.FromObject(basicMapInfo)); } - public static RailTrack GetRailTrack(this RailTrackRegistry registry, string stationID, string yardID, byte trackNumber) + public static RailTrack GetRailTrack(this RailTrackRegistryBase registry, string stationID, string yardID, byte trackNumber) { var query = $"[{stationID}]_[{yardID}-{trackNumber:D2}"; @@ -287,10 +287,10 @@ public static RailTrack GetRailTrack(this RailTrackRegistry registry, string sta /// /// Returns the subyard IDs of all subyards in the yard(station) with ID yardID /// - public static IEnumerable GetSubYardIDsOfYard(this RailTrackRegistry registry, string yardID) + public static IEnumerable GetSubYardIDsOfYard(this RailTrackRegistryBase registry, string yardID) { return registry.AllTracks - .Select(railTrack => railTrack.logicTrack.ID) + .Select(railTrack => railTrack.LogicTrack().ID) .Where(ID => ID.yardId == yardID) .Select(ID => ID.subYardId) .Distinct(); @@ -299,10 +299,10 @@ public static IEnumerable GetSubYardIDsOfYard(this RailTrackRegistry reg /// /// Returns the track numbers of all track in the subyard with ID subYardID in the yard(station) with yardID /// - public static IEnumerable GetTrackNumbersOfSubYard(this RailTrackRegistry registry, string yardID, string subYardID) + public static IEnumerable GetTrackNumbersOfSubYard(this RailTrackRegistryBase registry, string yardID, string subYardID) { return registry.AllTracks - .Select(railTrack => railTrack.logicTrack.ID) + .Select(railTrack => railTrack.LogicTrack().ID) .Where(ID => ID.yardId == yardID && ID.subYardId == subYardID) .Select(ID => ID.orderNumber) diff --git a/Mapify/Utils/PathFinder.cs b/Mapify/Utils/PathFinder.cs index 7078a1bd..b57f6f99 100644 --- a/Mapify/Utils/PathFinder.cs +++ b/Mapify/Utils/PathFinder.cs @@ -45,7 +45,7 @@ public static List FindPath(RailTrack start, RailTrack goal) { if (!cameFrom.ContainsKey(current)) { - Mapify.LogError($"cameFrom does not contain current {current.logicTrack.ID.FullID}"); + Mapify.LogError($"cameFrom does not contain current {current.LogicTrack().ID.FullID}"); return null; } @@ -81,7 +81,7 @@ private static Dictionary Astar(RailTrack start, RailTrack cameFrom.TryGetValue(current, out var prev); - var debug = $"ID: {current.logicTrack.ID.FullID} Prev: {prev?.logicTrack.ID.FullID}"; + var debug = $"ID: {current.LogicTrack().ID.FullID} Prev: {prev?.LogicTrack().ID.FullID}"; var neighbors = new List(); @@ -105,12 +105,12 @@ private static Dictionary Astar(RailTrack start, RailTrack //if we could go through junction directly (without reversing) if (!current.CanGoToDirectly(prev, neighbor)) { - Mapify.LogDebugExtreme($"{neighbor.logicTrack.ID.FullID} reverse needed"); + Mapify.LogDebugExtreme($"{neighbor.LogicTrack().ID.FullID} reverse needed"); continue; } // compute exact cost - var newCost = costSoFar[current] + neighbor.logicTrack.length; + var newCost = costSoFar[current] + neighbor.LogicTrack().length; // If there's no cost assigned to the neighbor yet, or if the new // cost is lower than the assigned one, add newCost for this neighbor @@ -123,7 +123,7 @@ private static Dictionary Astar(RailTrack start, RailTrack cameFrom.Remove(neighbor); } - Mapify.LogDebugExtreme($"neighbor {neighbor.logicTrack.ID.FullID} update {newCost}"); + Mapify.LogDebugExtreme($"neighbor {neighbor.LogicTrack().ID.FullID} update {newCost}"); costSoFar.Add(neighbor, newCost); cameFrom.Add(neighbor, current); From a70cb9398e2f1787623a1e37588de88657161bee Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:59:48 +0200 Subject: [PATCH 29/38] logging --- Mapify/Mapify.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Mapify/Mapify.cs b/Mapify/Mapify.cs index 2529c11d..cc181085 100644 --- a/Mapify/Mapify.cs +++ b/Mapify/Mapify.cs @@ -57,26 +57,26 @@ private static void Patch() #region Logging - public static void LogDebugExtreme(object msg) + public static void LogDebugExtreme(Func resolver) { - LogDebugExtreme(() => msg); + LogDebugExtreme(resolver.Invoke()); } - public static void LogDebugExtreme(Func resolver) + public static void LogDebugExtreme(object msg) { if (Settings.ExtremelyVerboseLogging) - LogDebug(resolver); + LogDebug(msg); } - public static void LogDebug(object msg) + public static void LogDebug(Func resolver) { - LogDebug(() => msg); + LogDebug(resolver.Invoke()); } - public static void LogDebug(Func resolver) + public static void LogDebug(object msg) { if (Settings.VerboseLogging) - ModEntry.Logger.Log($"[Debug] {resolver.Invoke()}"); + ModEntry.Logger.Log($"[Debug] {msg}"); } public static void Log(object msg) From 57e87d50dd05797fcb7e194a4f1eb48fce0d5207 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sat, 12 Jul 2025 13:17:52 +0200 Subject: [PATCH 30/38] make it build --- MapifyEditor/Trackage/Switch.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MapifyEditor/Trackage/Switch.cs b/MapifyEditor/Trackage/Switch.cs index cab5f533..f81ffca7 100644 --- a/MapifyEditor/Trackage/Switch.cs +++ b/MapifyEditor/Trackage/Switch.cs @@ -49,6 +49,11 @@ private enum SwitchPoint public Track DivergingTrack => transform.Find("[track diverging]").GetComponent(); public bool IsLeft => DivergingTrack.Curve.Last().localPosition.x < 0; + public override BezierPoint GetJointPoint() => ThroughTrack.Curve[0]; + public BezierPoint GetThroughPoint() => ThroughTrack.Curve[1]; + public BezierPoint GetDivergingPoint() => DivergingTrack.Curve[1]; + public BezierPoint GetDivergeJoinPoint() => DivergingTrack.Curve[0]; + #if UNITY_EDITOR //TODO working? Custom switch snap too? @@ -200,11 +205,6 @@ private void TrySnap(IEnumerable points, bool move, SwitchPoint swi transform.position = closestPosition + (transform.position - reference.position); } } - - public override BezierPoint GetJointPoint() => ThroughTrack.Curve[0]; - public BezierPoint GetThroughPoint() => ThroughTrack.Curve[1]; - public BezierPoint GetDivergingPoint() => DivergingTrack.Curve[1]; - public BezierPoint GetDivergeJoinPoint() => DivergingTrack.Curve[0]; #endif } } From 8372cadf4c87c9acaf3024184d809ba34046f07b Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:59:48 +0200 Subject: [PATCH 31/38] logging --- Mapify/Mapify.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Mapify/Mapify.cs b/Mapify/Mapify.cs index 5b3fd9c7..e1245f73 100644 --- a/Mapify/Mapify.cs +++ b/Mapify/Mapify.cs @@ -57,26 +57,26 @@ private static void Patch() #region Logging - public static void LogDebugExtreme(object msg) + public static void LogDebugExtreme(Func resolver) { - LogDebugExtreme(() => msg); + LogDebugExtreme(resolver.Invoke()); } - public static void LogDebugExtreme(Func resolver) + public static void LogDebugExtreme(object msg) { if (Settings.ExtremelyVerboseLogging) - LogDebug(resolver); + LogDebug(msg); } - public static void LogDebug(object msg) + public static void LogDebug(Func resolver) { - LogDebug(() => msg); + LogDebug(resolver.Invoke()); } - public static void LogDebug(Func resolver) + public static void LogDebug(object msg) { if (Settings.VerboseLogging) - ModEntry.Logger.Log($"[Debug] {resolver.Invoke()}"); + ModEntry.Logger.Log($"[Debug] {msg}"); } public static void Log(object msg) From 74f04651815841d3ae347db9f311eaec83e039f1 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sat, 12 Jul 2025 23:23:48 +0200 Subject: [PATCH 32/38] correct stalk position --- .../SceneInitializers/Railway/TrackSetup.cs | 59 ++++++++++++++----- MapifyEditor/Trackage/Switch.cs | 26 ++++---- 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 8cbb2a82..6ff9c218 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -127,16 +127,16 @@ private static void CreateCustomSwitch(CustomSwitch customSwitch) var vanillaAsset = customSwitch.standSide == CustomSwitch.StandSide.LEFT ? VanillaAsset.SwitchRightOuterSign : VanillaAsset.SwitchRight; var prefabClone = AssetCopier.Instantiate(vanillaAsset); - prefabClone.transform.SetPositionAndRotation(customSwitch.transform.position, customSwitch.transform.rotation); + prefabClone.transform.position = customSwitch.transform.position; //Junction var inJunction = prefabClone.GetComponentInChildren(); inJunction.transform.position = customSwitch.GetJointPoint().transform.position; inJunction.selectedBranch = customSwitch.defaultBranch; + SetupStalk(prefabClone, customSwitch.GetJointPoint()); DestroyPrefabTracks(prefabClone); CreateSwitchTracks(customSwitch, prefabClone, inJunction); - SetupStalk(prefabClone); foreach (var track in customSwitch.GetTracks()) { @@ -146,11 +146,11 @@ private static void CreateCustomSwitch(CustomSwitch customSwitch) private static void DestroyPrefabTracks(GameObject prefabClone) { - // must be destroyed inmediately to prevent: + // must be destroyed immediately to prevent: // "Junction 'in_junction' doesn't have track '[track diverging]' assigned" // from RailManager.TestConnections - Object.DestroyImmediate(prefabClone.FindChildByName("[track through]")); - Object.DestroyImmediate(prefabClone.FindChildByName("[track diverging]")); + Object.DestroyImmediate(prefabClone.FindChildByName(Switch.THROUGH_TRACK_NAME)); + Object.DestroyImmediate(prefabClone.FindChildByName(Switch.DIVERGING_TRACK_NAME)); } private static void CreateSwitchTracks(CustomSwitch customSwitch, GameObject prefabClone, Junction switchJunction) @@ -197,29 +197,58 @@ private static void CreateSwitchTracks(CustomSwitch customSwitch, GameObject pre } } - private static void SetupStalk(GameObject prefabClone) + private static void SetupStalk(GameObject prefabClone, BezierPoint joinPoint) { - var graphical = prefabClone.FindChildByName("Graphical"); + //visual objects + var graphical = prefabClone.FindChildByName("Graphical").transform; string[] toDelete = {"ballast", "anchors", "sleepers", "rails_static", "rails_moving"}; - foreach (var child in graphical.transform.GetChildren()) + foreach (var child in graphical.GetChildren()) { if (!toDelete.Contains(child.name)) continue; Object.Destroy(child.gameObject); } - var switch_base = graphical.transform.FindChildByName("switch_base"); + var graphicalY = graphical.localPosition.y; + + var switch_base = graphical.FindChildByName("switch_base"); if (!switch_base) { - Mapify.LogError("Could not determine switch offset"); + Mapify.LogError("Could not find switch_base"); + return; + } + + //interactable objects + var switchTrigger = prefabClone.FindChildByName("SwitchTrigger").transform; + if (!switchTrigger) + { + Mapify.LogError("Could not find SwitchTrigger"); return; } - var offsetZ = switch_base.localPosition.z; - // Mapify.LogDebug($"offsetZ: {offsetZ}"); - graphical.transform.localPosition -= new Vector3(0f, 0f, offsetZ); - var switchTrigger = prefabClone.FindChildByName("SwitchTrigger"); - switchTrigger.transform.localPosition -= new Vector3(0f, 0f, offsetZ); + //position + var transformHelper = new GameObject("transformHelper").transform; + transformHelper.SetParent(prefabClone.transform, false); + + transformHelper.position = switch_base.position; + graphical.SetParent(transformHelper, true); + switchTrigger.SetParent(transformHelper, true); + transformHelper.position = joinPoint.position; + + transformHelper.localPosition += new Vector3(0, graphicalY, 0); + + //rotation + var trackDirection = (joinPoint.globalHandle2 - joinPoint.position).normalized; + var rotationDelta = Quaternion.FromToRotation(transformHelper.forward, trackDirection); + transformHelper.Rotate(0, rotationDelta.eulerAngles.y, 0); //the stalk will sometimes flip upside down if we apply all axis + + //next to the track + graphical.localPosition = new Vector3(0, graphical.localPosition.y, graphical.localPosition.z); + + //get rid of the helper object + graphical.SetParent(prefabClone.transform, true); + switchTrigger.SetParent(prefabClone.transform, true); + GameObject.Destroy(transformHelper.gameObject); } private static void CreateVanillaSwitches() diff --git a/MapifyEditor/Trackage/Switch.cs b/MapifyEditor/Trackage/Switch.cs index f81ffca7..c55304b2 100644 --- a/MapifyEditor/Trackage/Switch.cs +++ b/MapifyEditor/Trackage/Switch.cs @@ -11,6 +11,10 @@ namespace Mapify.Editor [RequireComponent(typeof(VanillaObject))] public class Switch : SwitchBase { + //must match DV.RailTrack.RailTrack.JUNCTION_DIVERGING_TRACK_NAME / JUNCTION_THROUGH_TRACK_NAME + public const string THROUGH_TRACK_NAME = "[track through]"; + public const string DIVERGING_TRACK_NAME = "[track diverging]"; + public enum StandSide { THROUGH, @@ -30,6 +34,15 @@ private enum SwitchPoint DIVERGING } + public Track ThroughTrack => transform.Find(THROUGH_TRACK_NAME).GetComponent(); + public Track DivergingTrack => transform.Find(DIVERGING_TRACK_NAME).GetComponent(); + public bool IsLeft => DivergingTrack.Curve.Last().localPosition.x < 0; + + public override BezierPoint GetJointPoint() => ThroughTrack.Curve[0]; + public BezierPoint GetThroughPoint() => ThroughTrack.Curve[1]; + public BezierPoint GetDivergingPoint() => DivergingTrack.Curve[1]; + public BezierPoint GetDivergeJoinPoint() => DivergingTrack.Curve[0]; + #if UNITY_EDITOR private bool snapShouldUpdate = true; @@ -37,24 +50,11 @@ private enum SwitchPoint private Vector3 previousPositionThroughTrackLastPoint; private Vector3 previousPositionDivergingTrackLastPoint; - private SnappedTrack snappedTrackBeforeSwitch; //the track connected to the through track private SnappedTrack snappedTrackAfterThrough; //the track connected to the diverging track private SnappedTrack snappedTrackAfterDiverging; -#endif - - public Track ThroughTrack => transform.Find("[track through]").GetComponent(); - public Track DivergingTrack => transform.Find("[track diverging]").GetComponent(); - public bool IsLeft => DivergingTrack.Curve.Last().localPosition.x < 0; - - public override BezierPoint GetJointPoint() => ThroughTrack.Curve[0]; - public BezierPoint GetThroughPoint() => ThroughTrack.Curve[1]; - public BezierPoint GetDivergingPoint() => DivergingTrack.Curve[1]; - public BezierPoint GetDivergeJoinPoint() => DivergingTrack.Curve[0]; - -#if UNITY_EDITOR //TODO working? Custom switch snap too? From 944c07182396035add3b2c33e85086eb8dbeb881 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:41:58 +0200 Subject: [PATCH 33/38] working snap on CustomSwitch --- MapifyEditor/Trackage/CustomSwitch.cs | 15 +++ MapifyEditor/Trackage/Switch.cs | 175 +------------------------- MapifyEditor/Trackage/SwitchBase.cs | 174 ++++++++++++++++++------- 3 files changed, 147 insertions(+), 217 deletions(-) diff --git a/MapifyEditor/Trackage/CustomSwitch.cs b/MapifyEditor/Trackage/CustomSwitch.cs index 1a1d4c23..27f057f4 100644 --- a/MapifyEditor/Trackage/CustomSwitch.cs +++ b/MapifyEditor/Trackage/CustomSwitch.cs @@ -1,4 +1,7 @@ using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; using UnityEngine; namespace Mapify.Editor @@ -22,6 +25,18 @@ public BezierPoint GetOutPoint(int branchIndex) return Tracks[branchIndex].Curve.Last(); } + public List GetOutPoints() + { + return Tracks.Select(track => track.Curve.Last()).ToList(); + } + + public override List GetPoints() + { + var points = new List{ GetJointPoint() }; + points.AddRange(GetOutPoints()); + return points; + } + [Tooltip("Which way the switch should be flipped by default")] public byte defaultBranch = 0; diff --git a/MapifyEditor/Trackage/Switch.cs b/MapifyEditor/Trackage/Switch.cs index c55304b2..24ce7b13 100644 --- a/MapifyEditor/Trackage/Switch.cs +++ b/MapifyEditor/Trackage/Switch.cs @@ -1,13 +1,8 @@ -using System; using System.Collections.Generic; -using System.Linq; -using Mapify.Editor.Utils; -using UnityEditor; using UnityEngine; namespace Mapify.Editor { - [ExecuteInEditMode] //this is necessary for snapping to work [RequireComponent(typeof(VanillaObject))] public class Switch : SwitchBase { @@ -27,13 +22,6 @@ public enum StandSide [Tooltip("Which way the switch should be flipped by default")] public StandSide defaultState; - private enum SwitchPoint - { - FIRST, //the point that is shared between the two tracks - THROUGH, - DIVERGING - } - public Track ThroughTrack => transform.Find(THROUGH_TRACK_NAME).GetComponent(); public Track DivergingTrack => transform.Find(DIVERGING_TRACK_NAME).GetComponent(); public bool IsLeft => DivergingTrack.Curve.Last().localPosition.x < 0; @@ -43,168 +31,9 @@ private enum SwitchPoint public BezierPoint GetDivergingPoint() => DivergingTrack.Curve[1]; public BezierPoint GetDivergeJoinPoint() => DivergingTrack.Curve[0]; -#if UNITY_EDITOR - private bool snapShouldUpdate = true; - - private Vector3 previousPositionSwitchFirstPoint; - private Vector3 previousPositionThroughTrackLastPoint; - private Vector3 previousPositionDivergingTrackLastPoint; - - private SnappedTrack snappedTrackBeforeSwitch; - //the track connected to the through track - private SnappedTrack snappedTrackAfterThrough; - //the track connected to the diverging track - private SnappedTrack snappedTrackAfterDiverging; - - //TODO working? Custom switch snap too? - - private void OnEnable() - { - snapShouldUpdate = true; - } - - private void OnDisable() + public override List GetPoints() { - UnsnapConnectedTracks(); - } - - private void OnDestroy() - { - UnsnapConnectedTracks(); - } - - private void OnDrawGizmos() - { - if (transform.DistToSceneCamera() >= Track.SNAP_UPDATE_RANGE_SQR) - { - return; - } - - CheckSwitchMoved(); - - if (snapShouldUpdate) - { - Snap(); - snapShouldUpdate = false; - } - } - - private void CheckSwitchMoved() - { - var positionSwitchFirstPoint = transform.position; - var positionThroughTrackLastPoint = ThroughTrack.Curve.Last().position; - var positionDivergingTrackLastPoint = DivergingTrack.Curve.Last().position; - - if (positionSwitchFirstPoint != previousPositionSwitchFirstPoint || - positionThroughTrackLastPoint != previousPositionThroughTrackLastPoint || - positionDivergingTrackLastPoint != previousPositionDivergingTrackLastPoint) - { - snapShouldUpdate = true; - - previousPositionSwitchFirstPoint = positionSwitchFirstPoint; - previousPositionThroughTrackLastPoint = positionThroughTrackLastPoint; - previousPositionDivergingTrackLastPoint = positionDivergingTrackLastPoint; - } - } - - private void UnsnapConnectedTracks() - { - snappedTrackBeforeSwitch?.UnSnapped(); - snappedTrackAfterThrough?.UnSnapped(); - snappedTrackAfterDiverging?.UnSnapped(); - } - - public void Snap() - { - var bezierPoints = FindObjectsOfType(); - bool isSelected = Selection.gameObjects.Contains(gameObject); - - TrySnap(bezierPoints, isSelected, SwitchPoint.FIRST); - TrySnap(bezierPoints, isSelected, SwitchPoint.DIVERGING); - TrySnap(bezierPoints, isSelected, SwitchPoint.THROUGH); - } - - private void TrySnap(IEnumerable points, bool move, SwitchPoint switchPoint) - { - var reference = switchPoint switch - { - SwitchPoint.FIRST => transform, - SwitchPoint.THROUGH => ThroughTrack.Curve.Last().transform, - SwitchPoint.DIVERGING => DivergingTrack.Curve.Last().transform, - _ => throw new ArgumentOutOfRangeException(nameof(switchPoint), switchPoint, null) - }; - - var position = reference.position; - var closestPosition = Vector3.zero; - var closestDistance = float.MaxValue; - - foreach (BezierPoint otherSnapPoint in points) - { - //don't connect to itself - if (otherSnapPoint.Curve().GetComponentInParent() == this) continue; - - Vector3 otherPosition = otherSnapPoint.transform.position; - float distance = Mathf.Abs(Vector3.Distance(otherPosition, position)); - - // too far away - if (distance > Track.SNAP_RANGE || distance >= closestDistance) continue; - - var otherTrack = otherSnapPoint.GetComponentInParent(); - - // don't snap a switch to another switch - if (otherTrack.IsSwitch) continue; - - closestPosition = otherPosition; - closestDistance = distance; - - otherTrack.Snapped(otherSnapPoint); - - //remember what track we snapped to - switch (switchPoint) - { - case SwitchPoint.FIRST: - snappedTrackBeforeSwitch = new SnappedTrack(otherTrack, otherSnapPoint); - break; - case SwitchPoint.THROUGH: - snappedTrackAfterThrough = new SnappedTrack(otherTrack, otherSnapPoint); - break; - case SwitchPoint.DIVERGING: - snappedTrackAfterDiverging = new SnappedTrack(otherTrack, otherSnapPoint); - break; - default: - throw new ArgumentOutOfRangeException(nameof(switchPoint), switchPoint, null); - } - } - - // No snap target found - if (closestDistance >= float.MaxValue) - { - switch (switchPoint) - { - case SwitchPoint.FIRST: - snappedTrackBeforeSwitch?.UnSnapped(); - snappedTrackBeforeSwitch = null; - break; - case SwitchPoint.THROUGH: - snappedTrackAfterThrough?.UnSnapped(); - snappedTrackAfterThrough = null; - break; - case SwitchPoint.DIVERGING: - snappedTrackAfterDiverging?.UnSnapped(); - snappedTrackAfterDiverging = null; - break; - default: - throw new ArgumentOutOfRangeException(nameof(switchPoint), switchPoint, null); - } - - return; - } - - if (move) - { - transform.position = closestPosition + (transform.position - reference.position); - } + return new List { GetJointPoint(), GetThroughPoint(), GetDivergingPoint() }; } -#endif } } diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs index 592bbe4e..9a78d094 100644 --- a/MapifyEditor/Trackage/SwitchBase.cs +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -6,6 +6,7 @@ namespace Mapify.Editor { + [ExecuteInEditMode] //this is necessary for snapping to work public abstract class SwitchBase: MonoBehaviour { public virtual Track[] GetTracks() @@ -16,49 +17,134 @@ public virtual Track[] GetTracks() public abstract BezierPoint GetJointPoint(); - // TODO why is this unused -// protected void Snap() -// { -// #if UNITY_EDITOR -// BezierPoint[] bezierPoints = FindObjectsOfType(); -// GameObject[] selectedObjects = Selection.gameObjects; -// bool isSelected = selectedObjects.Contains(gameObject); -// -// TrySnap(bezierPoints, isSelected, transform); -// foreach (var track in Tracks) -// { -// TrySnap(bezierPoints, isSelected, track.Curve.Last().transform); -// } -// #endif -// } -// -// private void TrySnap(IEnumerable points, bool move, Transform reference) -// { -// var referencePosition = reference.position; -// var closestPos = Vector3.zero; -// var closestDist = float.MaxValue; -// -// foreach (var otherPoint in points) -// { -// if (otherPoint.Curve().GetComponentInParent() == this) continue; -// -// var otherPosition = otherPoint.transform.position; -// var dist = Mathf.Abs(Vector3.Distance(otherPosition, referencePosition)); -// -// if (dist > Track.SNAP_RANGE || dist >= closestDist) continue; -// -// var aTrack = otherPoint.GetComponentInParent(); -// if (aTrack.IsSwitch) continue; -// -// closestPos = otherPosition; -// closestDist = dist; -// } -// -// if (closestDist >= float.MaxValue) return; -// -// if (move) { -// transform.position = closestPos + (transform.position - reference.position); -// } -// } + public abstract List GetPoints(); + +#if UNITY_EDITOR + private bool snapShouldUpdate = true; + + private Vector3[] previousPositionsPoints; + private SnappedTrack[] snappedTracks; + private bool started = false; + + private void Start() + { + var pointsCount = GetTracks().Count()+1; + previousPositionsPoints = new Vector3[pointsCount]; + snappedTracks = new SnappedTrack[pointsCount]; + started = true; + } + + private void OnEnable() + { + snapShouldUpdate = true; + } + + private void OnDisable() + { + UnsnapConnectedTracks(); + } + + private void OnDestroy() + { + UnsnapConnectedTracks(); + } + + private void OnDrawGizmos() + { + if(!started) return; + if (transform.DistToSceneCamera() >= Track.SNAP_UPDATE_RANGE_SQR) + { + return; + } + + CheckSwitchMoved(); + + if (snapShouldUpdate) + { + Snap(); + snapShouldUpdate = false; + } + } + + private void CheckSwitchMoved() + { + var positionPoints = GetPoints().Select(point => point.position).ToArray(); + + for (int index = 0; index < positionPoints.Length; index++) + { + if (positionPoints[index] == previousPositionsPoints[index]) continue; + + snapShouldUpdate = true; + previousPositionsPoints[index] = positionPoints[index]; + } + } + + private void UnsnapConnectedTracks() + { + foreach (var snapped in snappedTracks) + { + snapped?.UnSnapped(); + } + } + + public void Snap() + { + var bezierPoints = FindObjectsOfType(); + bool isSelected = Selection.gameObjects.Contains(gameObject); + + var points = GetPoints(); + for (var pointIndex = 0; pointIndex < points.Count; pointIndex++) + { + TrySnap(bezierPoints, isSelected, points[pointIndex], pointIndex); + } + } + + private void TrySnap(IEnumerable points, bool move, BezierPoint snapPoint, int snapPointIndex) + { + var reference = snapPoint.transform; + + var position = reference.position; + var closestPosition = Vector3.zero; + var closestDistance = float.MaxValue; + + foreach (BezierPoint otherSnapPoint in points) + { + //don't connect to itself + if (otherSnapPoint.Curve().GetComponentInParent() == this) continue; + + Vector3 otherPosition = otherSnapPoint.transform.position; + float distance = Mathf.Abs(Vector3.Distance(otherPosition, position)); + + // too far away + if (distance > Track.SNAP_RANGE || distance >= closestDistance) continue; + + var otherTrack = otherSnapPoint.GetComponentInParent(); + + // don't snap a switch to another switch + if (otherTrack.IsSwitch) continue; + + closestPosition = otherPosition; + closestDistance = distance; + + otherTrack.Snapped(otherSnapPoint); + + //remember what track we snapped to + snappedTracks[snapPointIndex] = new SnappedTrack(otherTrack, otherSnapPoint); + } + + // No snap target found + if (closestDistance >= float.MaxValue) + { + snappedTracks[snapPointIndex]?.UnSnapped(); + snappedTracks[snapPointIndex] = null; + return; + } + + if (move) + { + transform.position = closestPosition + (transform.position - reference.position); + } + } +#endif } } From 6aeb72fd702847e4e6dafd195bf98b992eef6204 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 13 Jul 2025 14:34:01 +0200 Subject: [PATCH 34/38] avoid errors on validate / export --- MapifyEditor/Trackage/SwitchBase.cs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/MapifyEditor/Trackage/SwitchBase.cs b/MapifyEditor/Trackage/SwitchBase.cs index 9a78d094..43e6cff5 100644 --- a/MapifyEditor/Trackage/SwitchBase.cs +++ b/MapifyEditor/Trackage/SwitchBase.cs @@ -24,24 +24,22 @@ public virtual Track[] GetTracks() private Vector3[] previousPositionsPoints; private SnappedTrack[] snappedTracks; - private bool started = false; + private bool init = false; - private void Start() + private void OnEnable() { + snapShouldUpdate = true; + var pointsCount = GetTracks().Count()+1; previousPositionsPoints = new Vector3[pointsCount]; snappedTracks = new SnappedTrack[pointsCount]; - started = true; - } - - private void OnEnable() - { - snapShouldUpdate = true; + init = true; } private void OnDisable() { UnsnapConnectedTracks(); + init = false; } private void OnDestroy() @@ -51,7 +49,7 @@ private void OnDestroy() private void OnDrawGizmos() { - if(!started) return; + if(!init) return; if (transform.DistToSceneCamera() >= Track.SNAP_UPDATE_RANGE_SQR) { return; From 9c15272225f9cdac08cefd6b4fcb88255125a075 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 13 Jul 2025 15:04:23 +0200 Subject: [PATCH 35/38] remove todo --- MapifyEditor/Tools/TrackToolsCreator.Previews.cs | 4 +--- MapifyEditor/Tools/TrackToolsCreator.cs | 5 +---- MapifyEditor/Tools/TrackToolsWindow.cs | 8 ++++---- .../Tools/TrackToolsWindowDrawing/CreatePreviews.cs | 6 +++--- MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs | 6 ++---- MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs | 6 +++--- 6 files changed, 14 insertions(+), 21 deletions(-) diff --git a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs index 5b8ff53a..34b22c65 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.Previews.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.Previews.cs @@ -77,11 +77,9 @@ public static Vector3[][] PreviewSwitch(Switch prefab, Vector3 attachPoint, Vect }; } - public static Vector3[][] PreviewCustomSwitch(Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, int connectingPoint, float radius, float arc, float endGrade, + public static Vector3[][] PreviewCustomSwitch(Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, float radius, float arc, float endGrade, int samples = 8) { - //TODO implement connectingPoint - var curves = new Vector3[switchBranchesCount][]; var length = radius * arc * Mathf.Deg2Rad; diff --git a/MapifyEditor/Tools/TrackToolsCreator.cs b/MapifyEditor/Tools/TrackToolsCreator.cs index f6574abb..fff7d4a4 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.cs @@ -298,11 +298,8 @@ public static Switch CreateVanillaSwitch(Switch leftPrefab, Switch rightPrefab, /// /// Creates a switch without the limitations of the base game switches /// - public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, - int connectingPoint, float radius, float arc, float endGrade) + public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPoint, Vector3 handlePosition, int switchBranchesCount, float radius, float arc, float endGrade) { - //TODO implement connectingPoint - var switchObject = new GameObject($"[Switch w/ {switchBranchesCount} branches]"); switchObject.transform.position = attachPoint; switchObject.transform.parent = parent; diff --git a/MapifyEditor/Tools/TrackToolsWindow.cs b/MapifyEditor/Tools/TrackToolsWindow.cs index 8def2a68..7a1f7105 100644 --- a/MapifyEditor/Tools/TrackToolsWindow.cs +++ b/MapifyEditor/Tools/TrackToolsWindow.cs @@ -210,11 +210,11 @@ public void CreateTrack(Vector3 position, Vector3 handle) if (_switchType == SwitchType.Vanilla) { go = TrackToolsCreator.CreateVanillaSwitch(LeftSwitch, RightSwitch, _currentParent, position, handle, - _orientation, _connectingPointVanilla).gameObject; + _orientation, _connectingPoint).gameObject; } else { - go = TrackToolsCreator.CreateCustomSwitch(_currentParent, position, handle, _switchBranchesCount, _connectingPointCustom, _radius, _arc, _endGrade).gameObject; + go = TrackToolsCreator.CreateCustomSwitch(_currentParent, position, handle, _switchBranchesCount, _radius, _arc, _endGrade).gameObject; } SelectGameObject(go); @@ -264,7 +264,7 @@ public void CreateSpecial(Vector3 attachPoint, Vector3 handlePosition) break; case SpecialTrackPiece.SwitchCurve: t = TrackToolsCreator.CreateSwitchCurve(LeftSwitch, RightSwitch, _currentParent, attachPoint, handlePosition, - _orientation, (SwitchPoint)_connectingPointVanilla); + _orientation, (SwitchPoint)_connectingPoint); ApplySettingsToTrack(t); SelectTrack(t); Undo.RegisterCreatedObjectUndo(t.gameObject, "Created Switch Curve"); @@ -400,7 +400,7 @@ public void ResetCreationSettings(bool all) } if (all || _currentPiece == TrackPiece.Switch) { - _connectingPointVanilla = SwitchPoint.Joint; + _connectingPoint = SwitchPoint.Joint; } if (all || _currentPiece == TrackPiece.Yard) { diff --git a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs index 7fb6a8c0..99166edd 100644 --- a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs +++ b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs @@ -124,7 +124,7 @@ void FillCache(ref List caches) { cache.Lines = TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), cache.Attach.Position, cache.Attach.Handle, - _connectingPointVanilla, _sampleCount); + _connectingPoint, _sampleCount); } } @@ -139,7 +139,7 @@ void FillCache(ref List caches) foreach (var cache in caches) { cache.Lines = TrackToolsCreator.Previews.PreviewCustomSwitch( - cache.Attach.Position, cache.Attach.Handle, _switchBranchesCount, _connectingPointCustom, _radius, _arc, _endGrade, _sampleCount); + cache.Attach.Position, cache.Attach.Handle, _switchBranchesCount, _radius, _arc, _endGrade, _sampleCount); } } @@ -213,7 +213,7 @@ void FillCache(ref List caches) cache.Lines = new Vector3[1][]; System.Array.Copy(TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), cache.Attach.Position, cache.Attach.Handle, - _connectingPointVanilla, _sampleCount), 1, cache.Lines, 0, 1); + _connectingPoint, _sampleCount), 1, cache.Lines, 0, 1); } } } diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs index 7ee3e7b9..2249f0c2 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs @@ -46,9 +46,7 @@ public partial class TrackToolsWindow // Switches. private SwitchType _switchType = SwitchType.Vanilla; private int _switchBranchesCount = 2; - private SwitchPoint _connectingPointVanilla = SwitchPoint.Joint; - // 0 -> joint point, 1 - ∞ -> branch point - private int _connectingPointCustom = 0; //TODO implement connecting point + private SwitchPoint _connectingPoint = SwitchPoint.Joint; // Yards. private YardOptions _yardOptions = YardOptions.DefaultOptions; @@ -566,7 +564,7 @@ private void DrawSwitchCurveOptions() DrawOrientationGUI("Choose which side the track diverges to"); DrawVanillaSwitchPointGUI(); - if (_connectingPointVanilla == SwitchPoint.Through) + if (_connectingPoint == SwitchPoint.Through) { EditorGUILayout.HelpBox("The selected point has no connection with " + "the track, you should select one of the others.", MessageType.Warning); diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs index 5078d1a0..4710029b 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs @@ -164,13 +164,13 @@ private void DrawVanillaSwitchOptions() private void DrawVanillaSwitchPointGUI() { EditorGUILayout.BeginHorizontal(); - _connectingPointVanilla = (SwitchPoint)EditorGUILayout.EnumPopup(new GUIContent("Connecting point", + _connectingPoint = (SwitchPoint)EditorGUILayout.EnumPopup(new GUIContent("Connecting point", "Which of the 3 switch points should connect to the current track"), - _connectingPointVanilla); + _connectingPoint); if (GUILayout.Button(new GUIContent("Next point", "Swaps between the 3 switch points."), GUILayout.MaxWidth(140))) { - _connectingPointVanilla = NextPoint(_connectingPointVanilla); + _connectingPoint = NextPoint(_connectingPoint); } EditorGUILayout.EndHorizontal(); From 5daca6b410468158eca3967621f93a10be0a3582 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 13 Jul 2025 15:15:41 +0200 Subject: [PATCH 36/38] cleanup --- Mapify/Mapify.cs | 14 ++------- MapifyEditor/Tools/TrackToolsCreator.cs | 1 - .../Tools/TrackToolsWindowGUI/Other.cs | 31 ------------------- 3 files changed, 2 insertions(+), 44 deletions(-) diff --git a/Mapify/Mapify.cs b/Mapify/Mapify.cs index e1245f73..068ddac3 100644 --- a/Mapify/Mapify.cs +++ b/Mapify/Mapify.cs @@ -58,25 +58,15 @@ private static void Patch() #region Logging public static void LogDebugExtreme(Func resolver) - { - LogDebugExtreme(resolver.Invoke()); - } - - public static void LogDebugExtreme(object msg) { if (Settings.ExtremelyVerboseLogging) - LogDebug(msg); + LogDebug(resolver); } public static void LogDebug(Func resolver) - { - LogDebug(resolver.Invoke()); - } - - public static void LogDebug(object msg) { if (Settings.VerboseLogging) - ModEntry.Logger.Log($"[Debug] {msg}"); + ModEntry.Logger.Log($"[Debug] {resolver.Invoke()}"); } public static void Log(object msg) diff --git a/MapifyEditor/Tools/TrackToolsCreator.cs b/MapifyEditor/Tools/TrackToolsCreator.cs index fff7d4a4..ca635324 100644 --- a/MapifyEditor/Tools/TrackToolsCreator.cs +++ b/MapifyEditor/Tools/TrackToolsCreator.cs @@ -306,7 +306,6 @@ public static CustomSwitch CreateCustomSwitch(Transform parent, Vector3 attachPo var switchComponent = switchObject.AddComponent(); - //TODO maybe make this configurable? not important switchComponent.defaultBranch = 0; switchComponent.standSide = CustomSwitch.StandSide.LEFT; diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs index 4710029b..4bb8cd0f 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs @@ -181,37 +181,6 @@ private void DrawCustomSwitchOptions() _switchBranchesCount = EditorGUILayout.IntField(new GUIContent("Branches", "How many branches the switch has (at least 2)"), _switchBranchesCount); if (_switchBranchesCount < 2) _switchBranchesCount = 2; - EditorGUILayout.BeginHorizontal(); - - var displayedOptions = new GUIContent[_switchBranchesCount + 1]; - displayedOptions[0] = new GUIContent("Joint point"); - for (int i = 0; i < _switchBranchesCount; i++) - { - displayedOptions[i+1] = new GUIContent($"Branch out {i}"); - } - - var optionValues = new int[displayedOptions.Length]; - for (int i = 0; i < displayedOptions.Length; i++) - { - optionValues[i] = i; - } - - //TODO implement connecting point - // _connectingPointCustom = EditorGUILayout.IntPopup( - // new GUIContent("Connecting point", "Which of the switch points should connect to the current track"), - // _connectingPointCustom, - // displayedOptions, - // optionValues, - // EditorStyles.popup - // ); - - // if (GUILayout.Button(new GUIContent("Next point", "Swaps between the switch points."), GUILayout.MaxWidth(120))) - // { - // _connectingPointCustom = (_connectingPointCustom+1) % (_switchBranchesCount+1); - // } - - EditorGUILayout.EndHorizontal(); - DrawCurveOptions(true); } From b80c1aea8b4aa39e8b91df691a1ca0f2effd64ee Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 13 Jul 2025 16:37:43 +0200 Subject: [PATCH 37/38] fix switchTrigger position --- Mapify/SceneInitializers/Railway/TrackSetup.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 6ff9c218..47628244 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -243,7 +243,8 @@ private static void SetupStalk(GameObject prefabClone, BezierPoint joinPoint) transformHelper.Rotate(0, rotationDelta.eulerAngles.y, 0); //the stalk will sometimes flip upside down if we apply all axis //next to the track - graphical.localPosition = new Vector3(0, graphical.localPosition.y, graphical.localPosition.z); + switchTrigger.localPosition -= new Vector3(graphical.localPosition.x, 0, 0); + graphical.localPosition -= new Vector3(graphical.localPosition.x, 0, 0); //get rid of the helper object graphical.SetParent(prefabClone.transform, true); From 09464adfa8c5f5f48013823e3be5a7e06e76200b Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:52:12 +0200 Subject: [PATCH 38/38] yes --- .../SceneInitializers/Railway/TrackSetup.cs | 1 + Mapify/Utils/Extensions.cs | 2 +- MapifyEditor/Tools/TrackToolsWindow.cs | 2 +- .../TrackToolsWindowDrawing/CreatePreviews.cs | 2 +- .../Tools/TrackToolsWindowGUI/Creation.cs | 2 +- .../Tools/TrackToolsWindowGUI/Other.cs | 40 +------------------ 6 files changed, 6 insertions(+), 43 deletions(-) diff --git a/Mapify/SceneInitializers/Railway/TrackSetup.cs b/Mapify/SceneInitializers/Railway/TrackSetup.cs index 386757b7..790819ff 100644 --- a/Mapify/SceneInitializers/Railway/TrackSetup.cs +++ b/Mapify/SceneInitializers/Railway/TrackSetup.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Mapify.Components; using Mapify.Editor; using Mapify.Editor.Utils; using Mapify.Utils; diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 4231a429..6d331a88 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -277,7 +277,7 @@ public static void SetBasicMapInfo(this SaveGameData saveGameData, BasicMapInfo saveGameData.SetJObject(SAVE_KEY_NAME, JObject.FromObject(basicMapInfo)); } - public static RailTrack GetRailTrack(this RailTrackRegistry registry, string stationID, string yardID, byte trackNumber) + public static RailTrack GetRailTrack(this RailTrackRegistryBase registry, string stationID, string yardID, byte trackNumber) { var query = $"[{stationID}]_[{yardID}-{trackNumber:D2}"; diff --git a/MapifyEditor/Tools/TrackToolsWindow.cs b/MapifyEditor/Tools/TrackToolsWindow.cs index ae8b4ca5..7a1f7105 100644 --- a/MapifyEditor/Tools/TrackToolsWindow.cs +++ b/MapifyEditor/Tools/TrackToolsWindow.cs @@ -400,7 +400,7 @@ public void ResetCreationSettings(bool all) } if (all || _currentPiece == TrackPiece.Switch) { - _connectingPointVanilla = SwitchPoint.Joint; + _connectingPoint = SwitchPoint.Joint; } if (all || _currentPiece == TrackPiece.Yard) { diff --git a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs index a2f2384a..3a8b6d85 100644 --- a/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs +++ b/MapifyEditor/Tools/TrackToolsWindowDrawing/CreatePreviews.cs @@ -215,7 +215,7 @@ void FillCache(ref List caches) cache.Lines = new Vector3[1][]; System.Array.Copy(TrackToolsCreator.Previews.PreviewSwitch(GetCurrentSwitchPrefab(), cache.Attach.Position, cache.Attach.Handle, - _connectingPointVanilla, _sampleCount), 1, cache.Lines, 0, 1); + _connectingPoint, _sampleCount), 1, cache.Lines, 0, 1); } } } diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs index 881175b7..2249f0c2 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Creation.cs @@ -564,7 +564,7 @@ private void DrawSwitchCurveOptions() DrawOrientationGUI("Choose which side the track diverges to"); DrawVanillaSwitchPointGUI(); - if (_connectingPointVanilla == SwitchPoint.Through) + if (_connectingPoint == SwitchPoint.Through) { EditorGUILayout.HelpBox("The selected point has no connection with " + "the track, you should select one of the others.", MessageType.Warning); diff --git a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs index c59ff8b3..0605ce4b 100644 --- a/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs +++ b/MapifyEditor/Tools/TrackToolsWindowGUI/Other.cs @@ -178,50 +178,12 @@ private void DrawVanillaSwitchPointGUI() if (GUILayout.Button(new GUIContent("Next point", "Swaps between the 3 switch points."), GUILayout.MaxWidth(140))) { - _connectingPointVanilla = NextPoint(_connectingPointVanilla); + _connectingPoint = NextPoint(_connectingPoint); } EditorGUILayout.EndHorizontal(); } - private void DrawCustomSwitchOptions() - { - _switchBranchesCount = EditorGUILayout.IntField(new GUIContent("Branches", "How many branches the switch has (at least 2)"), _switchBranchesCount); - if (_switchBranchesCount < 2) _switchBranchesCount = 2; - - EditorGUILayout.BeginHorizontal(); - - var displayedOptions = new GUIContent[_switchBranchesCount + 1]; - displayedOptions[0] = new GUIContent("Joint point"); - for (int i = 0; i < _switchBranchesCount; i++) - { - displayedOptions[i+1] = new GUIContent($"Branch out {i}"); - } - - var optionValues = new int[displayedOptions.Length]; - for (int i = 0; i < displayedOptions.Length; i++) - { - optionValues[i] = i; - } - - _connectingPointCustom = EditorGUILayout.IntPopup( - new GUIContent("Connecting point", "Which of the switch points should connect to the current track"), - _connectingPointCustom, - displayedOptions, - optionValues, - EditorStyles.popup - ); - - if (GUILayout.Button(new GUIContent("Next point", "Swaps between the switch points."), GUILayout.MaxWidth(120))) - { - _connectingPointCustom = (_connectingPointCustom+1) % (_switchBranchesCount+1); - } - - EditorGUILayout.EndHorizontal(); - - DrawCurveOptions(true); - } - private void DrawCustomSwitchOptions() { _switchBranchesCount = EditorGUILayout.IntField(new GUIContent("Branches", "How many branches the switch has (at least 2)"), _switchBranchesCount);

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 mIYs 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