From c30e379350ec8479f0ae6981b9626e19d55a7526 Mon Sep 17 00:00:00 2001 From: DomCR Date: Fri, 19 Jan 2024 17:38:02 +0100 Subject: [PATCH 1/3] undo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 01ba40b..8b5b040 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ the different 3D formats. ### MeshIO.FBX -- Read FBX binary files +- Read/Write FBX binary files - Read/Write FBX ASCII files - Process and add custom `FbxProperties` From cb0acfa649e36fb3c60b61243d2986c1318857ec Mon Sep 17 00:00:00 2001 From: DomCR Date: Fri, 2 Feb 2024 17:24:22 +0100 Subject: [PATCH 2/3] bin stream writer --- src/MeshIO.FBX.Tests/FbxWriterTest.cs | 35 +++++++- src/MeshIO.FBX/Writers/FbxBinaryWriter.cs | 6 +- .../StreamWriter/FbxAsciiStreamWriter.cs | 4 +- .../StreamWriter/FbxBinaryStreamWriter.cs | 85 +++++++++++++++++++ .../StreamWriter/FbxStreamWriterBase.cs | 14 ++- 5 files changed, 133 insertions(+), 11 deletions(-) create mode 100644 src/MeshIO.FBX/Writers/StreamWriter/FbxBinaryStreamWriter.cs diff --git a/src/MeshIO.FBX.Tests/FbxWriterTest.cs b/src/MeshIO.FBX.Tests/FbxWriterTest.cs index 8494531..f676ccc 100644 --- a/src/MeshIO.FBX.Tests/FbxWriterTest.cs +++ b/src/MeshIO.FBX.Tests/FbxWriterTest.cs @@ -26,11 +26,11 @@ public void WriteEmptyAsciiStream(FbxVersion version) using (FbxWriter writer = new FbxWriter(new MemoryStream(), new Scene(), options)) { writer.OnNotification += this.onNotification; - writer.Write(new FbxWriterOptions() { IsBinaryFormat = false }); + writer.Write(options); } } - [Theory(Skip = "Not implemented")] + [Theory] [MemberData(nameof(Versions))] public void WriteEmptyBinaryStream(FbxVersion version) { @@ -43,7 +43,7 @@ public void WriteEmptyBinaryStream(FbxVersion version) using (FbxWriter writer = new FbxWriter(new MemoryStream(), new Scene())) { writer.OnNotification += this.onNotification; - writer.Write(new FbxWriterOptions() { IsBinaryFormat = true }); + writer.Write(options); } } @@ -70,7 +70,34 @@ public void WriteAsciiFbxWithMesh(FbxVersion version) using (FbxWriter writer = new FbxWriter(path, scene, options)) { writer.OnNotification += this.onNotification; - writer.Write(new FbxWriterOptions() { IsBinaryFormat = false }); + writer.Write(options); + } + } + + [Theory] + [MemberData(nameof(Versions))] + public void WriteBinaryFbxWithMesh(FbxVersion version) + { + FbxWriterOptions options = new FbxWriterOptions + { + IsBinaryFormat = true, + Version = version, + }; + + string path = Path.Combine(FolderPath.OutFilesFbx, $"box_{version}_binary.fbx"); + + Scene scene = new Scene(); + + Node box = new Node("my_node"); + Mesh mesh = new Box("my_box").CreateMesh(); + box.Entities.Add(mesh); + + scene.RootNode.Nodes.Add(box); + + using (FbxWriter writer = new FbxWriter(path, scene, options)) + { + writer.OnNotification += this.onNotification; + writer.Write(options); } } } diff --git a/src/MeshIO.FBX/Writers/FbxBinaryWriter.cs b/src/MeshIO.FBX/Writers/FbxBinaryWriter.cs index 7290473..8c303d1 100644 --- a/src/MeshIO.FBX/Writers/FbxBinaryWriter.cs +++ b/src/MeshIO.FBX/Writers/FbxBinaryWriter.cs @@ -56,8 +56,12 @@ public void Write() this.stream.Write((int)this.Root.Version); // TODO: Do we write a top level node or not? Maybe check the version? this.nodePath.Clear(); + foreach (var node in this.Root.Nodes) + { this.WriteNode(this.Root, node); + } + this.WriteNode(this.Root, null); this.stream.Write(GenerateFooterCode(this.Root)); this.WriteFooter(this.stream, (int)this.Root.Version); @@ -285,7 +289,5 @@ void WriteNode(FbxRootNode document, FbxNode node) this.nodePath.Pop(); } } - - } } diff --git a/src/MeshIO.FBX/Writers/StreamWriter/FbxAsciiStreamWriter.cs b/src/MeshIO.FBX/Writers/StreamWriter/FbxAsciiStreamWriter.cs index af2a0e9..0c2650c 100644 --- a/src/MeshIO.FBX/Writers/StreamWriter/FbxAsciiStreamWriter.cs +++ b/src/MeshIO.FBX/Writers/StreamWriter/FbxAsciiStreamWriter.cs @@ -16,9 +16,9 @@ internal sealed class FbxAsciiStreamWriter : FbxStreamWriterBase private System.IO.StreamWriter _streamWriter; - public FbxAsciiStreamWriter(Stream stream, Encoding encoding) + public FbxAsciiStreamWriter(Stream stream, FbxWriterOptions options) : base(options) { - _streamWriter = new System.IO.StreamWriter(stream, encoding); + _streamWriter = new System.IO.StreamWriter(stream, this._encoding); } public override void Dispose() diff --git a/src/MeshIO.FBX/Writers/StreamWriter/FbxBinaryStreamWriter.cs b/src/MeshIO.FBX/Writers/StreamWriter/FbxBinaryStreamWriter.cs new file mode 100644 index 0000000..4ae14bc --- /dev/null +++ b/src/MeshIO.FBX/Writers/StreamWriter/FbxBinaryStreamWriter.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace MeshIO.FBX.Writers.StreamWriter +{ + internal sealed class FbxBinaryStreamWriter : FbxStreamWriterBase + { + public FbxBinaryStreamWriter(FbxWriterOptions options) : base(options) + { + } + + public override void Dispose() + { + throw new NotImplementedException(); + } + + public override void WriteArray(IEnumerable arr) + { + throw new NotImplementedException(); + } + + public override void WriteByteArray(IEnumerable arr) + { + throw new NotImplementedException(); + } + + public override void WriteCloseBracket() + { + throw new NotImplementedException(); + } + + public override void WriteEmptyLine() + { + throw new NotImplementedException(); + } + + public override void WriteName(string value) + { + throw new NotImplementedException(); + } + + public override void WriteOpenBracket() + { + throw new NotImplementedException(); + } + + public override void WriteValue(string value) + { + throw new NotImplementedException(); + } + + public override void WriteValue(int value) + { + throw new NotImplementedException(); + } + + public override void WriteValue(long value) + { + throw new NotImplementedException(); + } + + public override void WriteValue(ulong value) + { + throw new NotImplementedException(); + } + + public override void WriteValue(char value) + { + throw new NotImplementedException(); + } + + public override void WriteValue(double value) + { + throw new NotImplementedException(); + } + + public override void WriteValue(float value) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/MeshIO.FBX/Writers/StreamWriter/FbxStreamWriterBase.cs b/src/MeshIO.FBX/Writers/StreamWriter/FbxStreamWriterBase.cs index 45c2eab..748102f 100644 --- a/src/MeshIO.FBX/Writers/StreamWriter/FbxStreamWriterBase.cs +++ b/src/MeshIO.FBX/Writers/StreamWriter/FbxStreamWriterBase.cs @@ -11,15 +11,23 @@ public static IFbxStreamWriter Create(FbxWriterOptions options, Stream stream) { if (options.IsBinaryFormat) { - throw new NotImplementedException(); + return new FbxBinaryStreamWriter(stream, options); } else { - Encoding encoding = new UTF8Encoding(false); - return new FbxAsciiStreamWriter(stream, encoding); + return new FbxAsciiStreamWriter(stream, options); } } + protected FbxWriterOptions _options; + protected Encoding _encoding; + + protected FbxStreamWriterBase(FbxWriterOptions options) + { + this._options = options; + this._encoding = new UTF8Encoding(false); + } + public virtual void WriteComment(string comment) { } From 69be5d05d60ec4bc6797319c4d8463eefbb240eb Mon Sep 17 00:00:00 2001 From: DomCR Date: Tue, 6 Feb 2024 09:16:29 +0100 Subject: [PATCH 3/3] base --- src/MeshIO.FBX.Tests/FbxWriterTest.cs | 5 +++ src/MeshIO.FBX.Tests/MeshIO.FBX.Tests.csproj | 6 ++++ src/MeshIO.FBX/FbxPropertyTemplate.cs | 36 +++++++++---------- src/MeshIO.FBX/Writers/FbxFileWriterBase.cs | 14 ++++++-- .../StreamWriter/FbxBinaryStreamWriter.cs | 2 +- 5 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/MeshIO.FBX.Tests/FbxWriterTest.cs b/src/MeshIO.FBX.Tests/FbxWriterTest.cs index f676ccc..a953a84 100644 --- a/src/MeshIO.FBX.Tests/FbxWriterTest.cs +++ b/src/MeshIO.FBX.Tests/FbxWriterTest.cs @@ -99,6 +99,11 @@ public void WriteBinaryFbxWithMesh(FbxVersion version) writer.OnNotification += this.onNotification; writer.Write(options); } + + using (FbxReader reader = new FbxReader(path)) + { + var s = reader.Read(); + } } } } diff --git a/src/MeshIO.FBX.Tests/MeshIO.FBX.Tests.csproj b/src/MeshIO.FBX.Tests/MeshIO.FBX.Tests.csproj index 5502a12..3a622ed 100644 --- a/src/MeshIO.FBX.Tests/MeshIO.FBX.Tests.csproj +++ b/src/MeshIO.FBX.Tests/MeshIO.FBX.Tests.csproj @@ -2,6 +2,12 @@ net6.0 + + + true + + Exe + false diff --git a/src/MeshIO.FBX/FbxPropertyTemplate.cs b/src/MeshIO.FBX/FbxPropertyTemplate.cs index b50cab0..59eb0d4 100644 --- a/src/MeshIO.FBX/FbxPropertyTemplate.cs +++ b/src/MeshIO.FBX/FbxPropertyTemplate.cs @@ -97,9 +97,9 @@ private static Dictionary getFbxNodeTemplate() new FbxProperty("TranslationMaxZ", "bool", "", PropertyFlags.None,0), new FbxProperty("RotationOrder", "enum", "", PropertyFlags.None,0), new FbxProperty("RotationSpaceForLimitOnly", "bool", "", PropertyFlags.None,0), - new FbxProperty("RotationStiffnessX", "double", "Number", PropertyFlags.None,0), - new FbxProperty("RotationStiffnessY", "double", "Number", PropertyFlags.None,0), - new FbxProperty("RotationStiffnessZ", "double", "Number", PropertyFlags.None,0), + new FbxProperty("RotationStiffnessX", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("RotationStiffnessY", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("RotationStiffnessZ", "double", "Number", PropertyFlags.None,0.0d), new FbxProperty("AxisLen", "double", "Number", PropertyFlags.None,10), new FbxProperty("PreRotation", "Vector3D", "Vector", PropertyFlags.None,XYZ.Zero), new FbxProperty("PostRotation", "Vector3D", "Vector", PropertyFlags.None,XYZ.Zero), @@ -125,21 +125,21 @@ private static Dictionary getFbxNodeTemplate() new FbxProperty("GeometricTranslation", "Vector3D", "Vector", PropertyFlags.None,XYZ.Zero), new FbxProperty("GeometricRotation", "Vector3D", "Vector", PropertyFlags.None,XYZ.Zero), new FbxProperty("GeometricScaling", "Vector3D", "Vector", PropertyFlags.None,new XYZ(1,1,1)), - new FbxProperty("MinDampRangeX", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MinDampRangeY", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MinDampRangeZ", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MaxDampRangeX", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MaxDampRangeY", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MaxDampRangeZ", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MinDampStrengthX", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MinDampStrengthY", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MinDampStrengthZ", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MaxDampStrengthX", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MaxDampStrengthY", "double", "Number", PropertyFlags.None,0), - new FbxProperty("MaxDampStrengthZ", "double", "Number", PropertyFlags.None,0), - new FbxProperty("PreferedAngleX", "double", "Number", PropertyFlags.None,0), - new FbxProperty("PreferedAngleY", "double", "Number", PropertyFlags.None,0), - new FbxProperty("PreferedAngleZ", "double", "Number", PropertyFlags.None,0), + new FbxProperty("MinDampRangeX", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MinDampRangeY", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MinDampRangeZ", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MaxDampRangeX", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MaxDampRangeY", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MaxDampRangeZ", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MinDampStrengthX", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MinDampStrengthY", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MinDampStrengthZ", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MaxDampStrengthX", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MaxDampStrengthY", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("MaxDampStrengthZ", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("PreferedAngleX", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("PreferedAngleY", "double", "Number", PropertyFlags.None,0.0d), + new FbxProperty("PreferedAngleZ", "double", "Number", PropertyFlags.None,0.0d), new FbxProperty("LookAtProperty", "object", "", PropertyFlags.None,null), new FbxProperty("UpVectorProperty", "object", "", PropertyFlags.None ,null), new FbxProperty("Show", "bool", "", PropertyFlags.None,1), diff --git a/src/MeshIO.FBX/Writers/FbxFileWriterBase.cs b/src/MeshIO.FBX/Writers/FbxFileWriterBase.cs index 6fe76a8..179876d 100644 --- a/src/MeshIO.FBX/Writers/FbxFileWriterBase.cs +++ b/src/MeshIO.FBX/Writers/FbxFileWriterBase.cs @@ -76,6 +76,13 @@ public void Write() if (this.Options.IsBinaryFormat) { //Seems to need some extra fields + Random random = new Random(); + var fileId = new byte[16]; + random.NextBytes(fileId); + + _writer.WritePairNodeValue("FileId", fileId); + _writer.WritePairNodeValue("CreationTime", "1970-01-01 10:00:00:000"); + _writer.WritePairNodeValue("Creator", "MeshIO.FBX"); } this.writeGlobalSettings(); @@ -266,7 +273,9 @@ private void writeDocuments() this.WriteProperties(Scene.Properties); _writer.WritePairNodeValue(FbxFileToken.RootNode, 0L); + _writer.WriteCloseBracket(); + _writer.WriteEmptyLine(); foreach (Scene s in Scene.SubScenes) { @@ -279,11 +288,10 @@ private void writeDocuments() this.WriteProperties(s.Properties); _writer.WriteCloseBracket(); - } _writer.WriteCloseBracket(); - + _writer.WriteEmptyLine(); } private void writeReferences() @@ -330,6 +338,8 @@ private void writeDefinitions() this.WriteProperties(template.Properties.Values); _writer.WriteCloseBracket(); + _writer.WriteEmptyLine(); + _writer.WriteCloseBracket(); _writer.WriteEmptyLine(); } diff --git a/src/MeshIO.FBX/Writers/StreamWriter/FbxBinaryStreamWriter.cs b/src/MeshIO.FBX/Writers/StreamWriter/FbxBinaryStreamWriter.cs index 4ae14bc..5bbd79a 100644 --- a/src/MeshIO.FBX/Writers/StreamWriter/FbxBinaryStreamWriter.cs +++ b/src/MeshIO.FBX/Writers/StreamWriter/FbxBinaryStreamWriter.cs @@ -8,7 +8,7 @@ namespace MeshIO.FBX.Writers.StreamWriter { internal sealed class FbxBinaryStreamWriter : FbxStreamWriterBase { - public FbxBinaryStreamWriter(FbxWriterOptions options) : base(options) + public FbxBinaryStreamWriter(Stream stream, FbxWriterOptions options) : base(options) { }