Intro:
I am trying to dump unity mesh as fbx binary.
I successfully managed to dump the mesh as fbxascii using code from https://github.com/KellanHiggins/UnityFBXExporter
then I executed this code:
string ascii = UnityFBXExporter.FBXExporter.MeshToString(gameObject,"");
var reader = new FbxAsciiReader(ascii.ToStream());
FbxDocument doc = reader.Read();
FbxIO.WriteBinary(doc, path)
Stream ToStream(this string val) => new MemoryStream(Encoding.UTF8.GetBytes(val))
problem:
I got this error
FbxException: Invalid property type System.Byte, at Month/CreationTimeStamp/FBXHeaderExtension[0]
at Fbx.FbxBinaryWriter.WriteProperty (System.Object obj, Int32 id) [0x00027] in \FbxUtil\FbxWriter\FbxBinaryWriter.cs:155
at Fbx.FbxBinaryWriter.WriteNode (Fbx.FbxDocument document, Fbx.FbxNode node) [0x001a9] in \FbxUtil\FbxWriter\FbxBinaryWriter.cs:212
at Fbx.FbxBinaryWriter.WriteNode (Fbx.FbxDocument document, Fbx.FbxNode node) [0x0028a] in \FbxUtil\FbxWriter\FbxBinaryWriter.cs:229
at Fbx.FbxBinaryWriter.WriteNode (Fbx.FbxDocument document, Fbx.FbxNode node) [0x0028a] in \FbxUtil\FbxWriter\FbxBinaryWriter.cs:229
at Fbx.FbxBinaryWriter.Write (Fbx.FbxDocument document) [0x0005a] in \FbxUtil\FbxWriter\FbxBinaryWriter.cs:259
at Fbx.FbxIO.WriteBinary (Fbx.FbxDocument document, System.String path) [0x00024] in \FbxUtil\FbxWriter\FbxIO.cs:57
...
the writer does not handle byte
:
https://github.com/Ploaj/IONET/blob/ca42ce6c9cadaf73312cc3cbe73f94e7feed509c/IONET/Fbx/IO/FbxBinaryWriter.cs#L54
but the reader does read as byte
:
https://github.com/Ploaj/IONET/blob/ca42ce6c9cadaf73312cc3cbe73f94e7feed509c/IONET/Fbx/IO/FbxAsciiReader.cs#L229
So this is problem number 1. writer does not handle byte produced by reader.
Problem 2:
I looked at the code that generates the ascii code and I found this (which matches the error message):
// Creationg Date Stamp
System.DateTime currentDate = System.DateTime.Now;
sb.AppendLine("\tCreationTimeStamp: {");
sb.AppendLine("\t\tVersion: 1000");
sb.AppendLine("\t\tYear: " + currentDate.Year);
sb.AppendLine("\t\tMonth: " + currentDate.Month); // <----!!!!!!! type of Month is int !!!!!!!!!
sb.AppendLine("\t\tDay: " + currentDate.Day);
sb.AppendLine("\t\tHour: " + currentDate.Hour);
sb.AppendLine("\t\tMinute: " + currentDate.Minute);
sb.AppendLine("\t\tSecond: " + currentDate.Second);
sb.AppendLine("\t\tMillisecond: " + currentDate.Millisecond);
sb.AppendLine("\t}");
if the written type is int then why the time that is read is byte? i guess because the data was small?
Solution
So I think the solution would be that the reader should treat byte as int?
{ typeof(byte), new WriterInfo('I', (sw, obj) => sw.Write((int)(byte)obj)) }, // write as int
{ typeof(int), new WriterInfo('I', (sw, obj) => sw.Write((int)obj)) },
or should I write is as byte?
{ typeof(byte), new WriterInfo('B', (sw, obj) => sw.Write((byte)obj)) }, // write as bye
{ typeof(int), new WriterInfo('I', (sw, obj) => sw.Write((int)obj)) },
Please fix this issue.