From cfec620e21c16cb9910dd06928bb7527e29dcc53 Mon Sep 17 00:00:00 2001 From: Petar Tasev Date: Sat, 9 May 2026 14:26:05 -0700 Subject: [PATCH 1/3] Initial support for hend3n normals --- .../Formats/Pssg/RenderDataSourceReader.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/EgoEngineLibrary/Formats/Pssg/RenderDataSourceReader.cs b/src/EgoEngineLibrary/Formats/Pssg/RenderDataSourceReader.cs index 94e5a07..9af1a49 100644 --- a/src/EgoEngineLibrary/Formats/Pssg/RenderDataSourceReader.cs +++ b/src/EgoEngineLibrary/Formats/Pssg/RenderDataSourceReader.cs @@ -231,6 +231,8 @@ public Vector3 GetNormal(uint index) return ReadVector3(data); case "half4": // just read Vec3, pretty sure 4th item is just 1.0 return ReadVectorHalf3(data); + case "hend3n": + return ReadHend3N(data); default: throw new NotImplementedException($"Support for {attribute.Name} data type {attribute.DataType} is not implemented."); } @@ -410,5 +412,21 @@ static unsafe Half Int16BitsToHalf(short value) { return *(Half*)&value; } + + private static Vector3 ReadHend3N(ReadOnlySpan data) + { + var i = BinaryPrimitives.ReadUInt32BigEndian(data); + var y = i >> 11; + var z = i >> 22; + + // use shift to sign extend + var vec = new Vector3 + { + X = (((int)(i & 0x7FF)) << 21 >> 21) / (float)0x3FF, + Y = (((int)(y & 0x7FF)) << 21 >> 21) / (float)0x3FF, + Z = (((int)(z & 0x3FF)) << 22 >> 22) / (float)0x1FF + }; + return vec; + } } } From f99c803bcfca6a277a9cfb8d868f2e8c781388b1 Mon Sep 17 00:00:00 2001 From: Petar Tasev Date: Sun, 10 May 2026 21:54:11 -0700 Subject: [PATCH 2/3] Fix reading certain pssg files --- src/010 Templates/pssg.bt | 1 + .../Graphics/Pssg/Elements/PssgShaderProgramCode.cs | 6 +++--- src/EgoEngineLibrary/Graphics/Pssg/PssgBinaryReader.cs | 6 ++---- src/EgoEngineLibrary/Graphics/Pssg/PssgFile.cs | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/010 Templates/pssg.bt b/src/010 Templates/pssg.bt index d169abd..2cf60a9 100644 --- a/src/010 Templates/pssg.bt +++ b/src/010 Templates/pssg.bt @@ -81,6 +81,7 @@ struct NODE { case "SHADERINPUT": case "TEXTUREIMAGEBLOCKDATA": case "TRANSFORM": + case "SHADERPROGRAMCODEBLOCK": char data[end - FTell()] ; break; default: diff --git a/src/EgoEngineLibrary/Graphics/Pssg/Elements/PssgShaderProgramCode.cs b/src/EgoEngineLibrary/Graphics/Pssg/Elements/PssgShaderProgramCode.cs index 5aa3bdf..3a42ea1 100644 --- a/src/EgoEngineLibrary/Graphics/Pssg/Elements/PssgShaderProgramCode.cs +++ b/src/EgoEngineLibrary/Graphics/Pssg/Elements/PssgShaderProgramCode.cs @@ -11,7 +11,7 @@ public class PssgShaderProgramCode : PssgElement new PssgSchemaAttribute("codeType", PssgAttributeType.String), new PssgSchemaAttribute("profileType", PssgAttributeType.Int), new PssgSchemaAttribute("profile", PssgAttributeType.Int), - new PssgSchemaAttribute("codeEntry", PssgAttributeType.Int), + new PssgSchemaAttribute("codeEntry", PssgAttributeType.String), new PssgSchemaAttribute("parameterCount", PssgAttributeType.Int), new PssgSchemaAttribute("streamCount", PssgAttributeType.Int), } @@ -41,9 +41,9 @@ public uint Profile set => AddAttribute(Schema.Attributes[3].Name, value); } - public byte CodeEntry + public string CodeEntry { - get => GetAttributeValue(Schema.Attributes[4].Name); + get => GetAttributeValue(Schema.Attributes[4].Name); set => AddAttribute(Schema.Attributes[4].Name, value); } diff --git a/src/EgoEngineLibrary/Graphics/Pssg/PssgBinaryReader.cs b/src/EgoEngineLibrary/Graphics/Pssg/PssgBinaryReader.cs index fc6e563..2eb6a57 100644 --- a/src/EgoEngineLibrary/Graphics/Pssg/PssgBinaryReader.cs +++ b/src/EgoEngineLibrary/Graphics/Pssg/PssgBinaryReader.cs @@ -1,6 +1,4 @@ using System.Numerics; -using System.Text; -using EgoEngineLibrary.Collections; using EgoEngineLibrary.Conversion; using EgoEngineLibrary.IO; @@ -8,8 +6,8 @@ namespace EgoEngineLibrary.Graphics.Pssg { public class PssgBinaryReader : EndianBinaryReader { - public OrderedSet ElementTable { get; set; } - public OrderedSet AttributeTable { get; set; } + public List ElementTable { get; set; } + public List AttributeTable { get; set; } internal bool UseDataElementCheck { get; set; } public PssgBinaryReader(EndianBitConverter bitConvertor, Stream stream, bool leaveOpen) diff --git a/src/EgoEngineLibrary/Graphics/Pssg/PssgFile.cs b/src/EgoEngineLibrary/Graphics/Pssg/PssgFile.cs index 8901bdb..95dae6d 100644 --- a/src/EgoEngineLibrary/Graphics/Pssg/PssgFile.cs +++ b/src/EgoEngineLibrary/Graphics/Pssg/PssgFile.cs @@ -132,8 +132,8 @@ public static PssgFile ReadPssg(Stream fileStream, PssgFileType fileType) } } - file._elementTable = reader.ElementTable; - file._attributeTable = reader.AttributeTable; + file._elementTable = new OrderedSet(reader.ElementTable); + file._attributeTable = new OrderedSet(reader.AttributeTable); } return file; From 9c3dba79ca5ad6a02afcb7ec2ebc9c8ed313aefb Mon Sep 17 00:00:00 2001 From: Petar Tasev Date: Sun, 10 May 2026 22:00:58 -0700 Subject: [PATCH 3/3] Adjust pssg styles and enable self-contained deploy --- src/EgoPssgEditor/App.axaml | 7 +++++++ src/EgoPssgEditor/EgoPssgEditor.csproj | 6 +++--- src/EgoPssgEditor/Views/MainWindow.axaml | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/EgoPssgEditor/App.axaml b/src/EgoPssgEditor/App.axaml index bcafe07..306222b 100644 --- a/src/EgoPssgEditor/App.axaml +++ b/src/EgoPssgEditor/App.axaml @@ -10,6 +10,13 @@ + +