From a8e5f7cc4a4dba2c903c06c4bffa555cb812c071 Mon Sep 17 00:00:00 2001 From: "aliaksei.kalosha" Date: Sat, 12 Apr 2025 00:56:17 +0200 Subject: [PATCH 1/3] add Texture Cache on PSXObjectExporter --- Runtime/PSXObjectExporter.cs | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Runtime/PSXObjectExporter.cs b/Runtime/PSXObjectExporter.cs index 8cd3fda..3d40a5c 100644 --- a/Runtime/PSXObjectExporter.cs +++ b/Runtime/PSXObjectExporter.cs @@ -1,30 +1,32 @@ using System.Collections.Generic; using UnityEngine; +using UnityEngine.Serialization; namespace SplashEdit.RuntimeCode { [RequireComponent(typeof(Renderer))] public class PSXObjectExporter : MonoBehaviour { - public PSXBPP BitDepth = PSXBPP.TEX_8BIT; // Defines the bit depth of the texture (e.g., 4BPP, 8BPP) - public List Textures { get; set; } = new List(); // Stores the converted PlayStation-style texture public PSXMesh Mesh { get; set; } // Stores the converted PlayStation-style mesh - - - [SerializeField] private bool PreviewNormals = false; + [Header("Export Settings")] + [FormerlySerializedAs("BitDepth")] + [SerializeField] private PSXBPP bitDepth = PSXBPP.TEX_8BIT; // Defines the bit depth of the texture (e.g., 4BPP, 8BPP) + [Header("Gizmo Settings")] + [FormerlySerializedAs("PreviewNormals")] + [SerializeField] private bool previewNormals = false; [SerializeField] private float normalPreviewLength = 0.5f; // Length of the normal lines + private readonly Dictionary<(int, PSXBPP), PSXTexture2D> cache = new(); + private void OnDrawGizmos() { - - if (PreviewNormals) + if (previewNormals) { MeshFilter filter = GetComponent(); if (filter != null) { - Mesh mesh = filter.sharedMesh; Vector3[] vertices = mesh.vertices; Vector3[] normals = mesh.normals; @@ -76,8 +78,17 @@ namespace SplashEdit.RuntimeCode if (tex2D != null) { - PSXTexture2D tex = PSXTexture2D.CreateFromTexture2D(tex2D, BitDepth); - tex.OriginalTexture = tex2D; // Store reference to the original texture + PSXTexture2D tex; + if (cache.ContainsKey((tex2D.GetInstanceID(), bitDepth))) + { + tex = cache[(tex2D.GetInstanceID(), bitDepth)]; + } + else + { + tex = PSXTexture2D.CreateFromTexture2D(tex2D, bitDepth); + tex.OriginalTexture = tex2D; // Store reference to the original texture + cache.Add((tex2D.GetInstanceID(), bitDepth), tex); + } Textures.Add(tex); } } From 09404e6e06e3832ab4b3165646d85125a3f9b007 Mon Sep 17 00:00:00 2001 From: "aliaksei.kalosha" Date: Sat, 12 Apr 2025 01:25:21 +0200 Subject: [PATCH 2/3] add more C# look to the PSXPlayer class --- Runtime/PSXPlayer.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Runtime/PSXPlayer.cs b/Runtime/PSXPlayer.cs index bcacaa3..8d5d4ad 100644 --- a/Runtime/PSXPlayer.cs +++ b/Runtime/PSXPlayer.cs @@ -1,25 +1,28 @@ using UnityEngine; using UnityEngine.AI; +using UnityEngine.Serialization; namespace SplashEdit.RuntimeCode { public class PSXPlayer : MonoBehaviour { - public float PlayerHeight; + private const float LookOutDistance = 1000f; - [HideInInspector] - public Vector3 CamPoint; - private readonly float maxDistance = 1000f; + [FormerlySerializedAs("PlayerHeight")] + [SerializeField] private float playerHeight; + + public float PlayerHeight => playerHeight; + public Vector3 CamPoint { get; protected set; } public void FindNavmesh() { - NavMeshHit hit; - if (NavMesh.SamplePosition(transform.position, out hit, maxDistance, NavMesh.AllAreas)) + if (NavMesh.SamplePosition(transform.position, out NavMeshHit hit, LookOutDistance, NavMesh.AllAreas)) { CamPoint = hit.position + new Vector3(0, PlayerHeight, 0); } } + void OnDrawGizmos() { FindNavmesh(); From 87dcb1024f6a5a9a61aecc9b8534208350e22ae7 Mon Sep 17 00:00:00 2001 From: "aliaksei.kalosha" Date: Sat, 12 Apr 2025 01:40:06 +0200 Subject: [PATCH 3/3] fix bug with reimport of texture --- Editor/VramEditorWindow.cs | 8 +++++++- Runtime/PSXSceneExporter.cs | 10 ++++++++-- Runtime/Utils.cs | 16 ++++++++++++---- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Editor/VramEditorWindow.cs b/Editor/VramEditorWindow.cs index 331f663..7581825 100644 --- a/Editor/VramEditorWindow.cs +++ b/Editor/VramEditorWindow.cs @@ -113,11 +113,16 @@ namespace SplashEdit.EditorCode // Retrieve all PSXObjectExporter objects and create their PSX textures. PSXObjectExporter[] objects = FindObjectsByType(FindObjectsSortMode.None); - foreach (PSXObjectExporter exp in objects) + for (int i = 0; i < objects.Length; i++) { + + EditorUtility.DisplayProgressBar($"{nameof(VRAMEditorWindow)}", $"Export {nameof(PSXObjectExporter)}", ((float)i) / objects.Length); + PSXObjectExporter exp = objects[i]; exp.CreatePSXTextures2D(); } + EditorUtility.ClearProgressBar(); + // Define framebuffer regions based on selected resolution and layout. (Rect buffer1, Rect buffer2) = Utils.BufferForResolution(selectedResolution, verticalLayout); @@ -157,6 +162,7 @@ namespace SplashEdit.EditorCode } } } + } private void OnGUI() diff --git a/Runtime/PSXSceneExporter.cs b/Runtime/PSXSceneExporter.cs index 688e23c..dbbdca0 100644 --- a/Runtime/PSXSceneExporter.cs +++ b/Runtime/PSXSceneExporter.cs @@ -34,18 +34,24 @@ namespace SplashEdit.RuntimeCode _psxData = DataStorage.LoadData(out selectedResolution, out dualBuffering, out verticalLayout, out prohibitedAreas); _exporters = FindObjectsByType(FindObjectsSortMode.None); - foreach (PSXObjectExporter exp in _exporters) + for (int i = 0; i < _exporters.Length; i++) { + PSXObjectExporter exp = _exporters[i]; + EditorUtility.DisplayProgressBar($"{nameof(PSXSceneExporter)}", $"Export {nameof(PSXObjectExporter)}", ((float)i)/ _exporters.Length); exp.CreatePSXTextures2D(); exp.CreatePSXMesh(GTEScaling); } _navmeshes = FindObjectsByType(FindObjectsSortMode.None); - foreach (PSXNavMesh navmesh in _navmeshes) + for (int i = 0; i < _navmeshes.Length; i++) { + PSXNavMesh navmesh = _navmeshes[i]; + EditorUtility.DisplayProgressBar($"{nameof(PSXSceneExporter)}", $"Export {nameof(PSXNavMesh)}", ((float)i) / _navmeshes.Length); navmesh.CreateNavmesh(GTEScaling); } + EditorUtility.ClearProgressBar(); + PackTextures(); PSXPlayer player = FindObjectsByType(FindObjectsSortMode.None).FirstOrDefault(); diff --git a/Runtime/Utils.cs b/Runtime/Utils.cs index 143dd47..6393dd3 100644 --- a/Runtime/Utils.cs +++ b/Runtime/Utils.cs @@ -342,16 +342,24 @@ namespace SplashEdit.RuntimeCode } string assetPath = AssetDatabase.GetAssetPath(texture); var tImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter; + bool needReimport = false; if (tImporter != null) { if (tImporter.maxTextureSize > MaxTextureSize) { tImporter.maxTextureSize = MaxTextureSize; + needReimport = true; + } + if (tImporter.isReadable != isReadable) + { + tImporter.isReadable = isReadable; + needReimport = true; + } + if (needReimport) + { + AssetDatabase.ImportAsset(assetPath); + AssetDatabase.Refresh(); } - tImporter.isReadable = isReadable; - - AssetDatabase.ImportAsset(assetPath); - AssetDatabase.Refresh(); } } }