fix after merge

This commit is contained in:
aliaksei.kalosha
2025-04-01 21:50:09 +02:00
parent de21aa6c67
commit a42cce4ee2
6 changed files with 302 additions and 323 deletions

View File

@@ -56,7 +56,7 @@ namespace SplashEdit.EditorCode
// Ensure minimum window size is applied.
this.minSize = MinSize;
_psxData = Utils.LoadData(out selectedResolution, out dualBuffering, out verticalLayout, out prohibitedAreas);
_psxData = DataStorage.LoadData(out selectedResolution, out dualBuffering, out verticalLayout, out prohibitedAreas);
}
/// <summary>
@@ -266,7 +266,10 @@ namespace SplashEdit.EditorCode
// Display VRAM image preview.
Rect vramRect = GUILayoutUtility.GetRect(VramWidth, VramHeight, GUILayout.ExpandWidth(false));
if (vramImage)
{
EditorGUI.DrawPreviewTexture(vramRect, vramImage, null, ScaleMode.ScaleToFit, 0, 0, ColorWriteMask.All);
}
// Draw framebuffer overlays.
(Rect buffer1, Rect buffer2) = Utils.BufferForResolution(selectedResolution, verticalLayout, vramRect.min);

View File

@@ -30,6 +30,7 @@ namespace SplashEdit.RuntimeCode
public PSXVertex v2;
public PSXTexture2D Texture;
public readonly PSXVertex[] Vertexes => new PSXVertex[] { v0, v1, v2 };
}
/// <summary>

View File

@@ -3,7 +3,6 @@ using UnityEngine;
namespace SplashEdit.RuntimeCode
{
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(Renderer))]
public class PSXObjectExporter : MonoBehaviour
{
@@ -55,7 +54,6 @@ namespace SplashEdit.RuntimeCode
if (renderer != null)
{
Material[] materials = renderer.sharedMaterials;
Textures = new List<PSXTexture2D>(); // Ensure the list is initialized
foreach (Material mat in materials)
{
@@ -84,17 +82,6 @@ namespace SplashEdit.RuntimeCode
}
}
}
else
{
//TODO: Better handle object with default texture
Texture = new PSXTexture2D()
{
BitDepth = BitDepth,
Width = 0,
Height = 0,
};
Texture.OriginalTexture = null;
}
}
private Texture2D ConvertToTexture2D(Texture texture)
@@ -123,11 +110,6 @@ namespace SplashEdit.RuntimeCode
{
Mesh = PSXMesh.CreateFromUnityRenderer(renderer, GTEScaling, transform, Textures);
}
else
{
// Dynamic meshes do not consider object transformation
Mesh = PSXMesh.CreateFromUnityMesh(meshFilter.sharedMesh, Texture.Width, Texture.Height);
}
}
}
}

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -25,11 +26,7 @@ namespace SplashEdit.RuntimeCode
public void Export()
{
_psxData = DataStorage.LoadData();
selectedResolution = _psxData.OutputResolution;
dualBuffering = _psxData.DualBuffering;
verticalLayout = _psxData.VerticalBuffering;
prohibitedAreas = _psxData.ProhibitedAreas;
_psxData = DataStorage.LoadData(out selectedResolution, out dualBuffering, out verticalLayout, out prohibitedAreas);
_exporters = FindObjectsByType<PSXObjectExporter>(FindObjectsSortMode.None);
foreach (PSXObjectExporter exp in _exporters)
@@ -41,15 +38,15 @@ namespace SplashEdit.RuntimeCode
ExportFile();
}
private PSXData _psxData;
private readonly string _psxDataPath = "Assets/PSXData.asset";
private Vector2 selectedResolution;
private bool dualBuffering;
private bool verticalLayout;
private List<ProhibitedArea> prohibitedAreas;
private VRAMPixel[,] vramPixels;
void PackTextures()
{
(Rect buffer1, Rect buffer2) = Utils.BufferForResolution(selectedResolution, verticalLayout);
List<Rect> framebuffers = new List<Rect> { buffer1 };
if (dualBuffering)
{
framebuffers.Add(buffer2);
}
VRAMPacker tp = new VRAMPacker(framebuffers, prohibitedAreas);
var packed = tp.PackTexturesIntoVRAM(_exporters);
@@ -173,53 +170,51 @@ namespace SplashEdit.RuntimeCode
totalFaces += exporter.Mesh.Triangles.Count;
void writeVertexPosition(PSXVertex v)
{
writer.Write((short)v.vx);
writer.Write((short)v.vy);
writer.Write((short)v.vz);
}
void writeVertexNormals(PSXVertex v)
{
writer.Write((short)v.nx);
writer.Write((short)v.ny);
writer.Write((short)v.nz);
}
void writeVertexColor(PSXVertex v)
{
writer.Write((byte)v.r);
writer.Write((byte)v.g);
writer.Write((byte)v.b);
writer.Write((byte)0); // padding
}
void writeVertexUV(PSXVertex v, PSXTexture2D t ,int expander)
{
writer.Write((byte)(v.u + t.PackingX * expander));
writer.Write((byte)(v.v + t.PackingY));
}
void foreachVertexDo(Tri tri, Action<PSXVertex> action)
{
for (int i = 0; i < tri.Vertexes.Length; i++)
{
action(tri.Vertexes[i]);
}
}
foreach (Tri tri in exporter.Mesh.Triangles)
{
int expander = 16 / ((int)tri.Texture.BitDepth);
// Write vertices coordinates
writer.Write((short)tri.v0.vx);
writer.Write((short)tri.v0.vy);
writer.Write((short)tri.v0.vz);
writer.Write((short)tri.v1.vx);
writer.Write((short)tri.v1.vy);
writer.Write((short)tri.v1.vz);
writer.Write((short)tri.v2.vx);
writer.Write((short)tri.v2.vy);
writer.Write((short)tri.v2.vz);
foreachVertexDo(tri, (v) => writeVertexPosition(v));
// Write vertex normals for v0 only
writer.Write((short)tri.v0.nx);
writer.Write((short)tri.v0.ny);
writer.Write((short)tri.v0.nz);
writeVertexNormals(tri.v0);
// Write vertex colors with padding
writer.Write((byte)tri.v0.r);
writer.Write((byte)tri.v0.g);
writer.Write((byte)tri.v0.b);
writer.Write((byte)0); // padding
writer.Write((byte)tri.v1.r);
writer.Write((byte)tri.v1.g);
writer.Write((byte)tri.v1.b);
writer.Write((byte)0); // padding
writer.Write((byte)tri.v2.r);
writer.Write((byte)tri.v2.g);
writer.Write((byte)tri.v2.b);
writer.Write((byte)0); // padding
foreachVertexDo(tri, (v) => writeVertexColor(v));
// Write UVs for each vertex, adjusting for texture packing
writer.Write((byte)(tri.v0.u + tri.Texture.PackingX * expander));
writer.Write((byte)(tri.v0.v + tri.Texture.PackingY));
writer.Write((byte)(tri.v1.u + tri.Texture.PackingX * expander));
writer.Write((byte)(tri.v1.v + tri.Texture.PackingY));
writer.Write((byte)(tri.v2.u + tri.Texture.PackingX * expander));
writer.Write((byte)(tri.v2.v + tri.Texture.PackingY));
foreachVertexDo(tri, (v) => writeVertexUV(v, tri.Texture, expander));
writer.Write((ushort)0); // padding
@@ -227,18 +222,7 @@ namespace SplashEdit.RuntimeCode
TPageAttr tpage = new TPageAttr();
tpage.SetPageX(tri.Texture.TexpageX);
tpage.SetPageY(tri.Texture.TexpageY);
switch (tri.Texture.BitDepth)
{
case PSXBPP.TEX_4BIT:
tpage.Set(TPageAttr.ColorMode.Mode4Bit);
break;
case PSXBPP.TEX_8BIT:
tpage.Set(TPageAttr.ColorMode.Mode8Bit);
break;
case PSXBPP.TEX_16BIT:
tpage.Set(TPageAttr.ColorMode.Mode16Bit);
break;
}
tpage.Set(tri.Texture.BitDepth.ToColorMode());
tpage.SetDithering(true);
writer.Write((ushort)tpage.info);
writer.Write((ushort)tri.Texture.ClutPackingX);

View File

@@ -102,7 +102,7 @@ namespace SplashEdit.RuntimeCode
foreach (var texture in group.OrderByDescending(tex => tex.QuantizedWidth * tex.Height))
{
// Remove duplicate textures
if (uniqueTextures.Where(tex => tex.OriginalTexture != null).Any(tex => tex.OriginalTexture.GetInstanceID() == obj.Texture.OriginalTexture.GetInstanceID() && tex.BitDepth == obj.Texture.BitDepth))
if (uniqueTextures.Any(tex => tex.OriginalTexture.GetInstanceID() == texture.OriginalTexture.GetInstanceID() && tex.BitDepth == texture.BitDepth))
{
// Skip packing this texture it will be replaced later.
continue;

View File

@@ -10,6 +10,26 @@ namespace SplashEdit.RuntimeCode
public static class DataStorage
{
private static readonly string psxDataPath = "Assets/PSXData.asset";
/// <summary>
/// Loads stored PSX data from the asset.
/// </summary>
public static PSXData LoadData(out Vector2 selectedResolution, out bool dualBuffering, out bool verticalLayout, out List<ProhibitedArea> prohibitedAreas)
{
var _psxData = AssetDatabase.LoadAssetAtPath<PSXData>(psxDataPath);
if (!_psxData)
{
_psxData = ScriptableObject.CreateInstance<PSXData>();
AssetDatabase.CreateAsset(_psxData, psxDataPath);
AssetDatabase.SaveAssets();
}
selectedResolution = _psxData.OutputResolution;
dualBuffering = _psxData.DualBuffering;
verticalLayout = _psxData.VerticalBuffering;
prohibitedAreas = _psxData.ProhibitedAreas;
return _psxData;
}
public static PSXData LoadData()
{
PSXData psxData = AssetDatabase.LoadAssetAtPath<PSXData>(psxDataPath);
@@ -288,8 +308,6 @@ namespace SplashEdit.RuntimeCode
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)
@@ -302,24 +320,15 @@ namespace SplashEdit.RuntimeCode
return (buffer1, buffer2);
}
/// <summary>
/// Loads stored PSX data from the asset.
/// </summary>
public static PSXData LoadData(out Vector2 selectedResolution, out bool dualBuffering, out bool verticalLayout, out List<ProhibitedArea> prohibitedAreas)
public static TPageAttr.ColorMode ToColorMode(this PSXBPP depth)
{
var _psxData = AssetDatabase.LoadAssetAtPath<PSXData>(_psxDataPath);
if (!_psxData)
return depth switch
{
_psxData = ScriptableObject.CreateInstance<PSXData>();
AssetDatabase.CreateAsset(_psxData, _psxDataPath);
AssetDatabase.SaveAssets();
}
selectedResolution = _psxData.OutputResolution;
dualBuffering = _psxData.DualBuffering;
verticalLayout = _psxData.VerticalBuffering;
prohibitedAreas = _psxData.ProhibitedAreas;
return _psxData;
PSXBPP.TEX_4BIT => TPageAttr.ColorMode.Mode4Bit,
PSXBPP.TEX_8BIT => TPageAttr.ColorMode.Mode8Bit,
PSXBPP.TEX_16BIT => TPageAttr.ColorMode.Mode16Bit,
_ => throw new System.NotImplementedException(),
};
}
}
}