From ecb1422937a4f35c37d03bc90dd83d477e0bbea2 Mon Sep 17 00:00:00 2001 From: "aliaksei.kalosha" Date: Sat, 12 Apr 2025 18:16:57 +0200 Subject: [PATCH 1/2] update handling of Lua assets --- Editor/LuaFileAssetEditor.cs | 6 +- Editor/LuaImporter.cs | 14 +- Runtime/LuaFile.cs | 10 +- Runtime/PSXObjectExporter.cs | 5 +- Runtime/PSXSceneExporter.cs | 15 +- Sample.meta | 8 + Sample/Lua.meta | 8 + Sample/Lua/example.lua | 21 + Sample/Lua/example.lua.meta | 10 + Sample/Material.meta | 8 + Sample/Material/PSXDefault.mat | 137 ++++++ Sample/Material/PSXDefault.mat.meta | 8 + Sample/Scene.meta | 8 + Sample/Scene/Demo.unity | 683 ++++++++++++++++++++++++++++ Sample/Scene/Demo.unity.meta | 7 + 15 files changed, 930 insertions(+), 18 deletions(-) create mode 100644 Sample.meta create mode 100644 Sample/Lua.meta create mode 100644 Sample/Lua/example.lua create mode 100644 Sample/Lua/example.lua.meta create mode 100644 Sample/Material.meta create mode 100644 Sample/Material/PSXDefault.mat create mode 100644 Sample/Material/PSXDefault.mat.meta create mode 100644 Sample/Scene.meta create mode 100644 Sample/Scene/Demo.unity create mode 100644 Sample/Scene/Demo.unity.meta diff --git a/Editor/LuaFileAssetEditor.cs b/Editor/LuaFileAssetEditor.cs index 04968a8..2f549d9 100644 --- a/Editor/LuaFileAssetEditor.cs +++ b/Editor/LuaFileAssetEditor.cs @@ -5,11 +5,11 @@ using UnityEngine; [CustomEditor(typeof(LuaFile))] public class LuaScriptAssetEditor : Editor { + private TextAsset asset; + public override void OnInspectorGUI() { LuaFile luaScriptAsset = (LuaFile)target; - - // Allow user to drag-and-drop the Lua file - luaScriptAsset.luaScript = (TextAsset)EditorGUILayout.ObjectField("Lua Script", luaScriptAsset.luaScript, typeof(TextAsset), false); + EditorGUILayout.TextArea(luaScriptAsset.LuaScript); } } diff --git a/Editor/LuaImporter.cs b/Editor/LuaImporter.cs index 97aa322..2b931da 100644 --- a/Editor/LuaImporter.cs +++ b/Editor/LuaImporter.cs @@ -1,6 +1,8 @@ using UnityEngine; using System.IO; +using UnityEditor; using UnityEditor.AssetImporters; +using Splashedit.RuntimeCode; namespace SplashEdit.EditorCode { @@ -9,9 +11,15 @@ namespace SplashEdit.EditorCode { public override void OnImportAsset(AssetImportContext ctx) { - var asset = new TextAsset(File.ReadAllText(ctx.assetPath)); - ctx.AddObjectToAsset("Text", asset); - ctx.SetMainObject(asset); + var asset = ScriptableObject.CreateInstance(); + var luaCode = File.ReadAllText(ctx.assetPath); + asset.Init(luaCode); + asset.name = Path.GetFileName(ctx.assetPath); + var text = new TextAsset(asset.LuaScript); + + ctx.AddObjectToAsset("Text", text); + ctx.AddObjectToAsset("Script", asset); + ctx.SetMainObject(text); } } } \ No newline at end of file diff --git a/Runtime/LuaFile.cs b/Runtime/LuaFile.cs index 56a297d..82a2df6 100644 --- a/Runtime/LuaFile.cs +++ b/Runtime/LuaFile.cs @@ -2,10 +2,14 @@ using UnityEngine; namespace Splashedit.RuntimeCode { - - [CreateAssetMenu(fileName = "NewLuaScript", menuName = "Lua Script", order = 1)] public class LuaFile : ScriptableObject { - public TextAsset luaScript; + [SerializeField] private string luaScript; + public string LuaScript => luaScript; + + public void Init(string luaCode) + { + luaScript = luaCode; + } } } diff --git a/Runtime/PSXObjectExporter.cs b/Runtime/PSXObjectExporter.cs index 040e7de..1daceb4 100644 --- a/Runtime/PSXObjectExporter.cs +++ b/Runtime/PSXObjectExporter.cs @@ -8,13 +8,14 @@ namespace SplashEdit.RuntimeCode [RequireComponent(typeof(Renderer))] public class PSXObjectExporter : MonoBehaviour { - public LuaFile luaFile; + public LuaFile LuaFile => luaFile; public List Textures { get; set; } = new List(); // Stores the converted PlayStation-style texture - public PSXMesh Mesh { get; set; } // Stores the converted PlayStation-style mesh + public PSXMesh Mesh { get; protected set; } // Stores the converted PlayStation-style mesh [Header("Export Settings")] [FormerlySerializedAs("BitDepth")] [SerializeField] private PSXBPP bitDepth = PSXBPP.TEX_8BIT; // Defines the bit depth of the texture (e.g., 4BPP, 8BPP) + [SerializeField] private LuaFile luaFile; [Header("Gizmo Settings")] [FormerlySerializedAs("PreviewNormals")] [SerializeField] private bool previewNormals = false; diff --git a/Runtime/PSXSceneExporter.cs b/Runtime/PSXSceneExporter.cs index c66c1e0..e79e29c 100644 --- a/Runtime/PSXSceneExporter.cs +++ b/Runtime/PSXSceneExporter.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; using Splashedit.RuntimeCode; using UnityEditor; using UnityEngine; @@ -128,12 +129,12 @@ namespace SplashEdit.RuntimeCode // Lua files foreach (PSXObjectExporter exporter in _exporters) { - if (exporter.luaFile != null) + if (exporter.LuaFile != null) { //if not contains - if (!luaFiles.Contains(exporter.luaFile)) + if (!luaFiles.Contains(exporter.LuaFile)) { - luaFiles.Add(exporter.luaFile); + luaFiles.Add(exporter.LuaFile); } } } @@ -168,7 +169,7 @@ namespace SplashEdit.RuntimeCode // Write placeholder for lua file data offset and record its position. luaOffsetPlaceholderPositions.Add(writer.BaseStream.Position); writer.Write((int)0); // 4-byte placeholder for mesh data offset. - writer.Write((uint)luaFile.luaScript.text.Length); + writer.Write((uint)luaFile.LuaScript.Length); } // GameObject section (exporters) @@ -195,9 +196,9 @@ namespace SplashEdit.RuntimeCode writer.Write((int)rotationMatrix[2, 2]); writer.Write((ushort)exporter.Mesh.Triangles.Count); - if (exporter.luaFile != null) + if (exporter.LuaFile != null) { - int index = luaFiles.IndexOf(exporter.luaFile); + int index = luaFiles.IndexOf(exporter.LuaFile); writer.Write((short)index); } else @@ -257,7 +258,7 @@ namespace SplashEdit.RuntimeCode long luaDataOffset = writer.BaseStream.Position; luaDataOffsets.Add(luaDataOffset); - writer.Write(luaFile.luaScript.bytes); + writer.Write(Encoding.UTF8.GetBytes(luaFile.LuaScript)); } // Mesh data section: Write mesh data for each exporter. diff --git a/Sample.meta b/Sample.meta new file mode 100644 index 0000000..9ab8c24 --- /dev/null +++ b/Sample.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 03c1f3626c09eb44eb79759ab2675f9e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/Lua.meta b/Sample/Lua.meta new file mode 100644 index 0000000..4b2a10a --- /dev/null +++ b/Sample/Lua.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 83f98f1f40209b141a597a83c862a61f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/Lua/example.lua b/Sample/Lua/example.lua new file mode 100644 index 0000000..32ce2fc --- /dev/null +++ b/Sample/Lua/example.lua @@ -0,0 +1,21 @@ +local dir = true +local minY = -300 +local maxY = -25 + +function doSomething(first, other) + local pos = first.position + + if dir then + pos.y = pos.y + 10 + if pos.y >= maxY then + dir = false + end + else + pos.y = pos.y - 10 + if pos.y <= minY then + dir = true + end + end + + first.position = pos +end \ No newline at end of file diff --git a/Sample/Lua/example.lua.meta b/Sample/Lua/example.lua.meta new file mode 100644 index 0000000..6f508d6 --- /dev/null +++ b/Sample/Lua/example.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2080a81a20451b74bb4fed47cde1eb64 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: d364a1392e3bccd77aca824ac471f89c, type: 3} diff --git a/Sample/Material.meta b/Sample/Material.meta new file mode 100644 index 0000000..2740ad7 --- /dev/null +++ b/Sample/Material.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 98c8fecb427143042be70f00ac1ebb42 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/Material/PSXDefault.mat b/Sample/Material/PSXDefault.mat new file mode 100644 index 0000000..661d116 --- /dev/null +++ b/Sample/Material/PSXDefault.mat @@ -0,0 +1,137 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PSXDefault + m_Shader: {fileID: 4800000, guid: 0ca6dca7396eb48e5849247ffd444914, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2000 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 2800000, guid: 0be7a2d4700082dbc83b9274837c70bc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BlendOp: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &7557462600926894941 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 9 diff --git a/Sample/Material/PSXDefault.mat.meta b/Sample/Material/PSXDefault.mat.meta new file mode 100644 index 0000000..42a6ced --- /dev/null +++ b/Sample/Material/PSXDefault.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ef90866ae3c8e3241995606c20a6f335 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/Scene.meta b/Sample/Scene.meta new file mode 100644 index 0000000..5377593 --- /dev/null +++ b/Sample/Scene.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6a2d025695ecb074a811681d20c569b0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/Scene/Demo.unity b/Sample/Scene/Demo.unity new file mode 100644 index 0000000..2fdbb8b --- /dev/null +++ b/Sample/Scene/Demo.unity @@ -0,0 +1,683 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &416002693 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 416002697} + - component: {fileID: 416002696} + - component: {fileID: 416002695} + - component: {fileID: 416002694} + - component: {fileID: 416002698} + m_Layer: 0 + m_Name: ExportObjectWithScript + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &416002694 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 416002693} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &416002695 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 416002693} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: ef90866ae3c8e3241995606c20a6f335, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &416002696 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 416002693} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &416002697 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 416002693} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 107.39} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &416002698 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 416002693} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bea0f31a495202580ac77bd9fd6e99f2, type: 3} + m_Name: + m_EditorClassIdentifier: + bitDepth: 8 + luaFile: {fileID: 271950057456261835, guid: 2080a81a20451b74bb4fed47cde1eb64, type: 3} + previewNormals: 0 + normalPreviewLength: 0.5 +--- !u!1 &512214764 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 512214766} + - component: {fileID: 512214765} + m_Layer: 0 + m_Name: SceneExporter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &512214765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512214764} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ab5195ad94fd173cfb6d48ee06eaf245, type: 3} + m_Name: + m_EditorClassIdentifier: + GTEScaling: 100 +--- !u!4 &512214766 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512214764} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &706636693 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 706636697} + - component: {fileID: 706636696} + - component: {fileID: 706636695} + - component: {fileID: 706636694} + - component: {fileID: 706636698} + m_Layer: 0 + m_Name: ExportObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &706636694 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 706636693} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &706636695 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 706636693} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: ef90866ae3c8e3241995606c20a6f335, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &706636696 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 706636693} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &706636697 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 706636693} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 101.463} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &706636698 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 706636693} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bea0f31a495202580ac77bd9fd6e99f2, type: 3} + m_Name: + m_EditorClassIdentifier: + bitDepth: 8 + luaFile: {fileID: 0} + previewNormals: 0 + normalPreviewLength: 0.5 +--- !u!1 &728093073 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 728093076} + - component: {fileID: 728093075} + - component: {fileID: 728093074} + - component: {fileID: 728093077} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &728093074 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 728093073} + m_Enabled: 1 +--- !u!20 &728093075 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 728093073} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &728093076 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 728093073} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &728093077 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 728093073} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 +--- !u!1 &1570671553 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1570671555} + - component: {fileID: 1570671554} + - component: {fileID: 1570671556} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1570671554 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570671553} + m_Enabled: 1 + serializedVersion: 11 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &1570671555 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570671553} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!114 &1570671556 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570671553} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 3 + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_RenderingLayers: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_ShadowRenderingLayers: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 0 +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 728093076} + - {fileID: 1570671555} + - {fileID: 512214766} + - {fileID: 706636697} + - {fileID: 416002697} diff --git a/Sample/Scene/Demo.unity.meta b/Sample/Scene/Demo.unity.meta new file mode 100644 index 0000000..ba8ad78 --- /dev/null +++ b/Sample/Scene/Demo.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: dbf5265ad7d363446800065929646d36 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 551eb4c0de06e0fe8606c5ff00606757d841396b Mon Sep 17 00:00:00 2001 From: "aliaksei.kalosha" Date: Sat, 12 Apr 2025 19:20:27 +0200 Subject: [PATCH 2/2] remove code repetition 2 --- Runtime/PSXSceneExporter.cs | 202 ++++++++++++++---------------------- 1 file changed, 79 insertions(+), 123 deletions(-) diff --git a/Runtime/PSXSceneExporter.cs b/Runtime/PSXSceneExporter.cs index e79e29c..1411884 100644 --- a/Runtime/PSXSceneExporter.cs +++ b/Runtime/PSXSceneExporter.cs @@ -39,7 +39,7 @@ namespace SplashEdit.RuntimeCode for (int i = 0; i < _exporters.Length; i++) { PSXObjectExporter exp = _exporters[i]; - EditorUtility.DisplayProgressBar($"{nameof(PSXSceneExporter)}", $"Export {nameof(PSXObjectExporter)}", ((float)i)/ _exporters.Length); + EditorUtility.DisplayProgressBar($"{nameof(PSXSceneExporter)}", $"Export {nameof(PSXObjectExporter)}", ((float)i) / _exporters.Length); exp.CreatePSXTextures2D(); exp.CreatePSXMesh(GTEScaling); } @@ -87,29 +87,23 @@ namespace SplashEdit.RuntimeCode void ExportFile() { - string path = EditorUtility.SaveFilePanel("Select Output File", "", "output", "bin"); int totalFaces = 0; // Lists for lua data offsets. - List luaOffsetPlaceholderPositions = new List(); - List luaDataOffsets = new List(); + OffsetData luaOffset = new(); // Lists for mesh data offsets. - List meshOffsetPlaceholderPositions = new List(); - List meshDataOffsets = new List(); + OffsetData meshOffset = new(); // Lists for atlas data offsets. - List atlasOffsetPlaceholderPositions = new List(); - List atlasDataOffsets = new List(); + OffsetData atlasOffset = new(); // Lists for clut data offsets. - List clutOffsetPlaceholderPositions = new List(); - List clutDataOffsets = new List(); + OffsetData clutOffset = new(); // Lists for navmesh data offsets. - List navmeshOffsetPlaceholderPositions = new List(); - List navmeshDataOffsets = new List(); + OffsetData navmeshOffset = new(); int clutCount = 0; List luaFiles = new List(); @@ -167,7 +161,7 @@ namespace SplashEdit.RuntimeCode foreach (LuaFile luaFile in luaFiles) { // Write placeholder for lua file data offset and record its position. - luaOffsetPlaceholderPositions.Add(writer.BaseStream.Position); + luaOffset.OffsetPlaceholderPositions.Add(writer.BaseStream.Position); writer.Write((int)0); // 4-byte placeholder for mesh data offset. writer.Write((uint)luaFile.LuaScript.Length); } @@ -176,7 +170,7 @@ namespace SplashEdit.RuntimeCode foreach (PSXObjectExporter exporter in _exporters) { // Write placeholder for mesh data offset and record its position. - meshOffsetPlaceholderPositions.Add(writer.BaseStream.Position); + meshOffset.OffsetPlaceholderPositions.Add(writer.BaseStream.Position); writer.Write((int)0); // 4-byte placeholder for mesh data offset. // Write object's transform @@ -211,7 +205,7 @@ namespace SplashEdit.RuntimeCode foreach (PSXNavMesh navmesh in _navmeshes) { // Write placeholder for navmesh raw data offset. - navmeshOffsetPlaceholderPositions.Add(writer.BaseStream.Position); + navmeshOffset.OffsetPlaceholderPositions.Add(writer.BaseStream.Position); writer.Write((int)0); // 4-byte placeholder for navmesh data offset. writer.Write((ushort)navmesh.Navmesh.Count); @@ -222,7 +216,7 @@ namespace SplashEdit.RuntimeCode foreach (TextureAtlas atlas in _atlases) { // Write placeholder for texture atlas raw data offset. - atlasOffsetPlaceholderPositions.Add(writer.BaseStream.Position); + atlasOffset.OffsetPlaceholderPositions.Add(writer.BaseStream.Position); writer.Write((int)0); // 4-byte placeholder for atlas data offset. writer.Write((ushort)atlas.Width); @@ -238,7 +232,7 @@ namespace SplashEdit.RuntimeCode { if (texture.ColorPalette != null) { - clutOffsetPlaceholderPositions.Add(writer.BaseStream.Position); + clutOffset.OffsetPlaceholderPositions.Add(writer.BaseStream.Position); writer.Write((int)0); // 4-byte placeholder for clut data offset. writer.Write((ushort)texture.ClutPackingX); // 2 bytes writer.Write((ushort)texture.ClutPackingY); // 2 bytes @@ -256,52 +250,54 @@ namespace SplashEdit.RuntimeCode AlignToFourBytes(writer); // Record the current offset for this lua file's data. long luaDataOffset = writer.BaseStream.Position; - luaDataOffsets.Add(luaDataOffset); + luaOffset.DataOffsets.Add(luaDataOffset); writer.Write(Encoding.UTF8.GetBytes(luaFile.LuaScript)); } + 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 action) + { + for (int i = 0; i < tri.Vertexes.Length; i++) + { + action(tri.Vertexes[i]); + } + } + // Mesh data section: Write mesh data for each exporter. foreach (PSXObjectExporter exporter in _exporters) { AlignToFourBytes(writer); // Record the current offset for this exporter's mesh data. long meshDataOffset = writer.BaseStream.Position; - meshDataOffsets.Add(meshDataOffset); + meshOffset.DataOffsets.Add(meshDataOffset); 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 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); @@ -336,10 +332,11 @@ namespace SplashEdit.RuntimeCode { AlignToFourBytes(writer); long navmeshDataOffset = writer.BaseStream.Position; - navmeshDataOffsets.Add(navmeshDataOffset); + navmeshOffset.DataOffsets.Add(navmeshDataOffset); foreach (PSXNavMeshTri tri in navmesh.Navmesh) { + // Write vertices coordinates writer.Write((int)tri.v0.vx); writer.Write((int)tri.v0.vy); writer.Write((int)tri.v0.vz); @@ -361,7 +358,7 @@ namespace SplashEdit.RuntimeCode AlignToFourBytes(writer); // Record the current offset for this atlas's data. long atlasDataOffset = writer.BaseStream.Position; - atlasDataOffsets.Add(atlasDataOffset); + atlasOffset.DataOffsets.Add(atlasDataOffset); // Write the atlas's raw texture data. for (int y = 0; y < atlas.vramPixels.GetLength(1); y++) @@ -382,7 +379,7 @@ namespace SplashEdit.RuntimeCode { AlignToFourBytes(writer); long clutDataOffset = writer.BaseStream.Position; - clutDataOffsets.Add(clutDataOffset); + clutOffset.DataOffsets.Add(clutDataOffset); foreach (VRAMPixel color in texture.ColorPalette) { @@ -393,80 +390,33 @@ namespace SplashEdit.RuntimeCode } - // Bacfill the lua data offsets into the metadata section. - if (luaOffsetPlaceholderPositions.Count == luaDataOffsets.Count) - { - for (int i = 0; i < luaOffsetPlaceholderPositions.Count; i++) - { - writer.Seek((int)luaOffsetPlaceholderPositions[i], SeekOrigin.Begin); - writer.Write((int)luaDataOffsets[i]); - } - } - else - { - Debug.LogError("Mismatch between metadata lua offset placeholders and lua data blocks!"); - } - - // Backfill the mesh data offsets into the metadata section. - if (meshOffsetPlaceholderPositions.Count == meshDataOffsets.Count) - { - for (int i = 0; i < meshOffsetPlaceholderPositions.Count; i++) - { - writer.Seek((int)meshOffsetPlaceholderPositions[i], SeekOrigin.Begin); - writer.Write((int)meshDataOffsets[i]); - } - } - else - { - Debug.LogError("Mismatch between metadata mesh offset placeholders and mesh data blocks!"); - } - - // Backfill the navmesh offsets into the metadata section. - if (navmeshOffsetPlaceholderPositions.Count == navmeshDataOffsets.Count) - { - for (int i = 0; i < navmeshOffsetPlaceholderPositions.Count; i++) - { - writer.Seek((int)navmeshOffsetPlaceholderPositions[i], SeekOrigin.Begin); - writer.Write((int)navmeshDataOffsets[i]); - } - } - else - { - Debug.LogError("Mismatch between metadata mesh offset placeholders and mesh data blocks!"); - } - - - // Backfill the atlas data offsets into the metadata section. - if (atlasOffsetPlaceholderPositions.Count == atlasDataOffsets.Count) - { - for (int i = 0; i < atlasOffsetPlaceholderPositions.Count; i++) - { - writer.Seek((int)atlasOffsetPlaceholderPositions[i], SeekOrigin.Begin); - writer.Write((int)atlasDataOffsets[i]); - } - } - else - { - Debug.LogError("Mismatch between atlas offset placeholders and atlas data blocks!"); - } - - // Backfill the clut data offsets into the metadata section. - if (clutOffsetPlaceholderPositions.Count == clutDataOffsets.Count) - { - for (int i = 0; i < clutOffsetPlaceholderPositions.Count; i++) - { - writer.Seek((int)clutOffsetPlaceholderPositions[i], SeekOrigin.Begin); - writer.Write((int)clutDataOffsets[i]); - } - } - else - { - Debug.LogError("Mismatch between clut offset placeholders and clut data blocks!"); - } + writeOffset(writer, luaOffset, "lua"); + writeOffset(writer, meshOffset, "mesh"); + writeOffset(writer, navmeshOffset, "navmesh"); + writeOffset(writer, atlasOffset, "atlas"); + writeOffset(writer, clutOffset, "clut"); } Debug.Log(totalFaces); } + private void writeOffset(BinaryWriter writer, OffsetData data, string type) + { + // Backfill the data offsets into the metadata section. + if (data.OffsetPlaceholderPositions.Count == data.DataOffsets.Count) + { + for (int i = 0; i < data.OffsetPlaceholderPositions.Count; i++) + { + writer.Seek((int)data.OffsetPlaceholderPositions[i], SeekOrigin.Begin); + writer.Write((int)data.DataOffsets[i]); + } + } + else + { + Debug.LogError("Mismatch between clut offset placeholders and clut data blocks!"); + } + } + + void AlignToFourBytes(BinaryWriter writer) { long position = writer.BaseStream.Position; @@ -483,4 +433,10 @@ namespace SplashEdit.RuntimeCode } } + + public class OffsetData + { + public List OffsetPlaceholderPositions = new List(); + public List DataOffsets = new List(); + } }