diff --git a/Editor/VramEditorWindow.cs b/Editor/VramEditorWindow.cs index 1cff27a..7a1c6a3 100644 --- a/Editor/VramEditorWindow.cs +++ b/Editor/VramEditorWindow.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.IO; +using System.Linq; using SplashEdit.RuntimeCode; using Unity.Collections; using UnityEditor; @@ -13,6 +14,7 @@ namespace SplashEdit.EditorCode { private const int VramWidth = 1024; private const int VramHeight = 512; + private static readonly Vector2 MinSize = new Vector2(800, 600); private List prohibitedAreas = new List(); private Vector2 scrollPosition; private Texture2D vramImage; @@ -22,8 +24,6 @@ namespace SplashEdit.EditorCode private Color bufferColor1 = new Color(1, 0, 0, 0.5f); private Color bufferColor2 = new Color(0, 1, 0, 0.5f); private Color prohibitedColor = new Color(1, 0, 0, 0.3f); - - private static string _psxDataPath = "Assets/PSXData.asset"; private PSXData _psxData; private static readonly Vector2[] resolutions = @@ -33,14 +33,15 @@ namespace SplashEdit.EditorCode new Vector2(368, 240), new Vector2(368, 480), new Vector2(512, 240), new Vector2(512, 480), new Vector2(640, 240), new Vector2(640, 480) - }; + }; + private static string[] resolutionsStrings => resolutions.Select(c => $"{c.x}x{c.y}").ToArray(); [MenuItem("Window/VRAM Editor")] public static void ShowWindow() { VRAMEditorWindow window = GetWindow("VRAM Editor"); // Set minimum window dimensions. - window.minSize = new Vector2(1600, 600); + window.minSize = MinSize; } private void OnEnable() @@ -53,9 +54,9 @@ namespace SplashEdit.EditorCode blackPixels.Dispose(); // Ensure minimum window size is applied. - this.minSize = new Vector2(800, 600); + this.minSize = MinSize; - LoadData(); + _psxData = Utils.LoadData(out selectedResolution, out dualBuffering, out verticalLayout, out prohibitedAreas); } /// @@ -117,9 +118,7 @@ namespace SplashEdit.EditorCode } // Define framebuffer regions based on selected resolution and layout. - Rect buffer1 = new Rect(0, 0, selectedResolution.x, selectedResolution.y); - Rect buffer2 = verticalLayout ? new Rect(0, 256, selectedResolution.x, selectedResolution.y) - : new Rect(selectedResolution.x, 0, selectedResolution.x, selectedResolution.y); + (Rect buffer1, Rect buffer2) = Utils.BufferForResolution(selectedResolution, verticalLayout); List framebuffers = new List { buffer1 }; if (dualBuffering) @@ -162,12 +161,11 @@ namespace SplashEdit.EditorCode GUILayout.Label("VRAM Editor", EditorStyles.boldLabel); // Dropdown for resolution selection. - selectedResolution = resolutions[EditorGUILayout.Popup("Resolution", System.Array.IndexOf(resolutions, selectedResolution), - new string[] { "256x240", "256x480", "320x240", "320x480", "368x240", "368x480", "512x240", "512x480", "640x240", "640x480" })]; + selectedResolution = resolutions[EditorGUILayout.Popup("Resolution", System.Array.IndexOf(resolutions, selectedResolution), resolutionsStrings)]; // Check resolution constraints for dual buffering. - bool canDBHorizontal = selectedResolution[0] * 2 <= 1024; - bool canDBVertical = selectedResolution[1] * 2 <= 512; + bool canDBHorizontal = selectedResolution.x * 2 <= VramWidth; + bool canDBVertical = selectedResolution.y * 2 <= VramHeight; if (canDBHorizontal || canDBVertical) { @@ -240,9 +238,7 @@ namespace SplashEdit.EditorCode EditorGUI.DrawPreviewTexture(vramRect, vramImage, null, ScaleMode.ScaleToFit, 0, 0, ColorWriteMask.All); // Draw framebuffer overlays. - Rect buffer1 = new Rect(vramRect.x, vramRect.y, selectedResolution.x, selectedResolution.y); - Rect buffer2 = verticalLayout ? new Rect(vramRect.x, 256, selectedResolution.x, selectedResolution.y) - : new Rect(vramRect.x + selectedResolution.x, vramRect.y, selectedResolution.x, selectedResolution.y); + (Rect buffer1, Rect buffer2) = Utils.BufferForResolution(selectedResolution, verticalLayout, vramRect.min); EditorGUI.DrawRect(buffer1, bufferColor1); GUI.Label(new Rect(buffer1.center.x - 40, buffer1.center.y - 10, 120, 20), "Framebuffer A", EditorStyles.boldLabel); @@ -263,25 +259,6 @@ namespace SplashEdit.EditorCode GUILayout.EndHorizontal(); } - /// - /// Loads stored PSX data from the asset. - /// - private void LoadData() - { - _psxData = AssetDatabase.LoadAssetAtPath(_psxDataPath); - if (!_psxData) - { - _psxData = CreateInstance(); - AssetDatabase.CreateAsset(_psxData, _psxDataPath); - AssetDatabase.SaveAssets(); - } - - selectedResolution = _psxData.OutputResolution; - dualBuffering = _psxData.DualBuffering; - verticalLayout = _psxData.VerticalBuffering; - prohibitedAreas = _psxData.ProhibitedAreas; - } - /// /// Stores current configuration to the PSX data asset. /// This is now triggered manually via the "Save Settings" button. diff --git a/LICENSE.meta b/LICENSE.meta new file mode 100644 index 0000000..af41383 --- /dev/null +++ b/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c1679c9d58898f14494d614dfe5f76a6 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/PSXSceneExporter.cs b/Runtime/PSXSceneExporter.cs index f0c7d9b..28da0bf 100644 --- a/Runtime/PSXSceneExporter.cs +++ b/Runtime/PSXSceneExporter.cs @@ -26,7 +26,7 @@ namespace SplashEdit.RuntimeCode public void Export() { - LoadData(); + _psxData = Utils.LoadData(out selectedResolution, out dualBuffering, out verticalLayout, out prohibitedAreas); _exporters = FindObjectsByType(FindObjectsSortMode.None); foreach (PSXObjectExporter exp in _exporters) { @@ -39,10 +39,7 @@ namespace SplashEdit.RuntimeCode void PackTextures() { - - Rect buffer1 = new Rect(0, 0, selectedResolution.x, selectedResolution.y); - Rect buffer2 = verticalLayout ? new Rect(0, 256, selectedResolution.x, selectedResolution.y) - : new Rect(selectedResolution.x, 0, selectedResolution.x, selectedResolution.y); + (Rect buffer1, Rect buffer2) = Utils.BufferForResolution(selectedResolution, verticalLayout); List framebuffers = new List { buffer1 }; if (dualBuffering) @@ -111,24 +108,6 @@ namespace SplashEdit.RuntimeCode Debug.Log(totalFaces); } - public void LoadData() - { - _psxData = AssetDatabase.LoadAssetAtPath(_psxDataPath); - - if (!_psxData) - { - _psxData = ScriptableObject.CreateInstance(); - AssetDatabase.CreateAsset(_psxData, _psxDataPath); - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - } - - selectedResolution = _psxData.OutputResolution; - dualBuffering = _psxData.DualBuffering; - verticalLayout = _psxData.VerticalBuffering; - prohibitedAreas = _psxData.ProhibitedAreas; - } - void OnDrawGizmos() { Gizmos.DrawIcon(transform.position, "Packages/net.psxsplash.splashedit/Icons/PSXSceneExporter.png", true); diff --git a/Runtime/Utils.cs b/Runtime/Utils.cs index 1c17997..7b14902 100644 --- a/Runtime/Utils.cs +++ b/Runtime/Utils.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; +using UnityEditor; using UnityEngine; namespace SplashEdit.RuntimeCode @@ -41,4 +43,42 @@ namespace SplashEdit.RuntimeCode return new Rect(X, Y, Width, Height); } } + + + public static class Utils + { + private static string _psxDataPath = "Assets/PSXData.asset"; + + public static (Rect, Rect) BufferForResolution(Vector2 selectedResolution, bool verticalLayout, Vector2 offset = default) + { + if (offset == default) + { + offset = Vector2.zero; + } + Rect buffer1 = new Rect(offset.x, offset.y, selectedResolution.x, selectedResolution.y); + Rect buffer2 = verticalLayout ? new Rect(offset.x, 256, selectedResolution.x, selectedResolution.y) + : new Rect(offset.x + selectedResolution.x, offset.y, selectedResolution.x, selectedResolution.y); + return (buffer1, buffer2); + } + + /// + /// Loads stored PSX data from the asset. + /// + public static PSXData LoadData(out Vector2 selectedResolution, out bool dualBuffering, out bool verticalLayout, out List prohibitedAreas) + { + var _psxData = AssetDatabase.LoadAssetAtPath(_psxDataPath); + if (!_psxData) + { + _psxData = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(_psxData, _psxDataPath); + AssetDatabase.SaveAssets(); + } + + selectedResolution = _psxData.OutputResolution; + dualBuffering = _psxData.DualBuffering; + verticalLayout = _psxData.VerticalBuffering; + prohibitedAreas = _psxData.ProhibitedAreas; + return _psxData; + } + } }