/// <summary>
 /// Emit a DMesh3 as a BinaryDMeshStruct
 /// </summary>
 public static void EmitDMeshBinary(this SceneSerializer s, DMesh3 m, IOutputStream o)
 {
     // binary version - uuencoded byte buffers
     //    - storing doubles uses roughly same mem as string, but string is only 8 digits precision
     //    - storing floats saves roughly 50%
     //    - storing triangles is worse until vertex count > 9999
     //          - could store as byte or short in those cases...
     //    - edges and edge ref counts are stored, then use mesh.RebuildFromEdgeRefcounts() to rebuild 3D mesh (same as gSerialization)
     o.BeginStruct(IOStrings.BinaryDMeshStruct);
     o.AddAttribute(IOStrings.AMeshVertices3Binary, m.VerticesBuffer.GetBytes());
     if (m.HasVertexNormals)
     {
         o.AddAttribute(IOStrings.AMeshNormals3Binary, m.NormalsBuffer.GetBytes());
     }
     if (m.HasVertexColors)
     {
         o.AddAttribute(IOStrings.AMeshColors3Binary, m.ColorsBuffer.GetBytes());
     }
     if (m.HasVertexUVs)
     {
         o.AddAttribute(IOStrings.AMeshUVs2Binary, m.UVBuffer.GetBytes());
     }
     o.AddAttribute(IOStrings.AMeshTrianglesBinary, m.TrianglesBuffer.GetBytes());
     if (m.HasTriangleGroups)
     {
         o.AddAttribute(IOStrings.AMeshTriangleGroupsBinary, m.GroupsBuffer.GetBytes());
     }
     o.AddAttribute(IOStrings.AMeshEdgesBinary, m.EdgesBuffer.GetBytes());
     o.AddAttribute(IOStrings.AMeshEdgeRefCountsBinary, m.EdgesRefCounts.RawRefCounts.GetBytes());
     o.EndStruct();
 }
 /// <summary>
 /// Emit frame as a struct
 /// </summary>
 public static void EmitFrame(this SceneSerializer s, IOutputStream o, string structName, ref Frame3f frame)
 {
     o.BeginStruct(structName);
     o.AddAttribute(IOStrings.APosition, frame.Origin);
     o.AddAttribute(IOStrings.AOrientation, frame.Rotation);
     o.EndStruct();
 }
        /// <summary>
        /// Emit a DMesh3 as a CompressedDMeshStruct
        /// </summary>
        public static void EmitDMeshCompressed_Minimal(this SceneSerializer s, DMesh3 m, IOutputStream o)
        {
            SceneSerializer.EmitOptions opt = s.CurrentOptions;

            // compressed version - uuencoded byte buffers
            //    - storing doubles uses roughly same mem as string, but string is only 8 digits precision
            //    - storing floats saves roughly 50%
            //    - storing triangles is worse until vertex count > 9999
            //          - could store as byte or short in those cases...
            //    - edges and edge ref counts are stored, then use mesh.RebuildFromEdgeRefcounts() to rebuild 3D mesh (same as gSerialization)
            o.BeginStruct(IOStrings.CompressedDMeshStruct);

            o.AddAttribute(IOStrings.AMeshStorageMode, (int)IOStrings.MeshStorageMode.Minimal);

            // need compact mesh to do this
            if (m.IsCompactV == false)
            {
                m = new DMesh3(m, true);
            }

            o.AddAttribute(IOStrings.AMeshVertices3Compressed, BufferUtil.CompressZLib(m.VerticesBuffer.GetBytes(), opt.FastCompression));

            if (opt.StoreMeshVertexNormals && m.HasVertexNormals)
            {
                o.AddAttribute(IOStrings.AMeshNormals3Compressed, BufferUtil.CompressZLib(m.NormalsBuffer.GetBytes(), opt.FastCompression));
            }
            if (opt.StoreMeshVertexColors && m.HasVertexColors)
            {
                o.AddAttribute(IOStrings.AMeshColors3Compressed, BufferUtil.CompressZLib(m.ColorsBuffer.GetBytes(), opt.FastCompression));
            }
            if (opt.StoreMeshVertexUVs && m.HasVertexUVs)
            {
                o.AddAttribute(IOStrings.AMeshUVs2Compressed, BufferUtil.CompressZLib(m.UVBuffer.GetBytes(), opt.FastCompression));
            }

            int[] triangles = new int[3 * m.TriangleCount];
            int   k         = 0;

            foreach (int tid in m.TriangleIndices())
            {
                Index3i t = m.GetTriangle(tid);
                triangles[k++] = t.a; triangles[k++] = t.b; triangles[k++] = t.c;
            }
            o.AddAttribute(IOStrings.AMeshTrianglesCompressed, BufferUtil.CompressZLib(BufferUtil.ToBytes(triangles), opt.FastCompression));

            if (opt.StoreMeshFaceGroups && m.HasTriangleGroups)
            {
                int[] groups = new int[m.TriangleCount];
                k = 0;
                foreach (int tid in m.TriangleIndices())
                {
                    groups[k++] = m.GetTriangleGroup(tid);
                }
                o.AddAttribute(IOStrings.AMeshTriangleGroupsCompressed, BufferUtil.CompressZLib(BufferUtil.ToBytes(groups), opt.FastCompression));
            }

            o.EndStruct();
        }
        /// <summary>
        /// Emit a keyframe sequence as a KeyframeListStruct
        /// </summary>
        public static void EmitKeyframes(this SceneSerializer s, KeyframeSequence seq, IOutputStream o)
        {
            o.BeginStruct(IOStrings.KeyframeListStruct);
            o.AddAttribute(IOStrings.ATimeRange, (Vector2f)seq.ValidRange);

            int i = 0;

            foreach (Keyframe k  in seq)
            {
                o.BeginStruct(IOStrings.KeyframeStruct, i.ToString());
                i++;
                o.AddAttribute(IOStrings.ATime, (float)k.Time, true);
                o.AddAttribute(IOStrings.APosition, k.Frame.Origin, true);
                o.AddAttribute(IOStrings.AOrientation, k.Frame.Rotation, true);
                o.EndStruct();
            }

            o.EndStruct();
        }
        /// <summary>
        /// Emit a SceneObject transform as a TransformStruct (position, orientation, scale)
        /// </summary>
        public static void EmitTransform(this SceneSerializer s, IOutputStream o, SceneObject so)
        {
            o.BeginStruct(IOStrings.TransformStruct);
            Frame3f f = so.GetLocalFrame(CoordSpace.ObjectCoords);

            o.AddAttribute(IOStrings.APosition, f.Origin);
            o.AddAttribute(IOStrings.AOrientation, f.Rotation);
            o.AddAttribute(IOStrings.AScale, so.RootGameObject.GetLocalScale());
            o.EndStruct();
        }
Пример #6
0
        public static void EmitPrintMeshSettings(this SceneSerializer s, IOutputStream o, PrintMeshSettings settings)
        {
            o.BeginStruct(PrintSettingsStruct);
            o.AddAttribute(AttrPrintSettingsVersion, settings.Version);

            o.AddAttribute(AttrPrintSettingsObjectType, (int)settings.ObjectType);
            o.AddAttribute(AttrPrintSettingsOpenMode, (int)settings.OpenMeshMode);

            o.AddAttribute(AttrPrintSettingsNoVoids, settings.NoVoids);
            o.AddAttribute(AttrPrintSettingsShellOnly, settings.OuterShellOnly);

            o.AddAttribute(AttrPrintSettingsClearanceXY, (float)settings.Clearance);
            o.AddAttribute(AttrPrintSettingsOffsetXY, (float)settings.OffsetXY);

            o.EndStruct();
        }
 /// <summary>
 /// Emit an SOMaterial as a MaterialStruct
 /// </summary>
 public static void EmitMaterial(this SceneSerializer s, IOutputStream o, SOMaterial mat)
 {
     o.BeginStruct(IOStrings.MaterialStruct);
     if (mat.Type == SOMaterial.MaterialType.StandardRGBColor)
     {
         o.AddAttribute(IOStrings.AMaterialType, IOStrings.AMaterialType_Standard);
         o.AddAttribute(IOStrings.AMaterialName, mat.Name);
         o.AddAttribute(IOStrings.AMaterialRGBColor, mat.RGBColor);
     }
     else if (mat.Type == SOMaterial.MaterialType.TransparentRGBColor)
     {
         o.AddAttribute(IOStrings.AMaterialType, IOStrings.AMaterialType_Transparent);
         o.AddAttribute(IOStrings.AMaterialName, mat.Name);
         o.AddAttribute(IOStrings.AMaterialRGBColor, mat.RGBColor);
     }
     o.EndStruct();
 }
 /// <summary>
 /// Emit a SimpleMesh as an AsciiMeshStruct
 /// </summary>
 public static void EmitMeshAscii(this SceneSerializer s, SimpleMesh m, IOutputStream o)
 {
     o.BeginStruct(IOStrings.AsciiMeshStruct);
     o.AddAttribute(IOStrings.AMeshVertices3, m.VerticesItr());
     if (m.HasVertexNormals)
     {
         o.AddAttribute(IOStrings.AMeshNormals3, m.NormalsItr());
     }
     if (m.HasVertexColors)
     {
         o.AddAttribute(IOStrings.AMeshColors3, m.ColorsItr());
     }
     if (m.HasVertexUVs)
     {
         o.AddAttribute(IOStrings.AMeshUVs2, m.UVsItr());
     }
     o.AddAttribute(IOStrings.AMeshTriangles, m.TrianglesItr());
     o.EndStruct();
 }
        /// <summary>
        /// Emit a DMesh3 as a CompressedDMeshStruct
        /// </summary>
        public static void EmitDMeshCompressed(this SceneSerializer s, DMesh3 m, IOutputStream o)
        {
            SceneSerializer.EmitOptions opt = s.CurrentOptions;

            // compressed version - uuencoded byte buffers
            //    - storing doubles uses roughly same mem as string, but string is only 8 digits precision
            //    - storing floats saves roughly 50%
            //    - storing triangles is worse until vertex count > 9999
            //          - could store as byte or short in those cases...
            //    - edges and edge ref counts are stored, then use mesh.RebuildFromEdgeRefcounts() to rebuild 3D mesh (same as gSerialization)
            o.BeginStruct(IOStrings.CompressedDMeshStruct);

            o.AddAttribute(IOStrings.AMeshStorageMode, (int)IOStrings.MeshStorageMode.EdgeRefCounts);

            o.AddAttribute(IOStrings.AMeshVertices3Compressed, BufferUtil.CompressZLib(m.VerticesBuffer.GetBytes(), opt.FastCompression));

            if (opt.StoreMeshVertexNormals && m.HasVertexNormals)
            {
                o.AddAttribute(IOStrings.AMeshNormals3Compressed, BufferUtil.CompressZLib(m.NormalsBuffer.GetBytes(), opt.FastCompression));
            }
            if (opt.StoreMeshVertexColors && m.HasVertexColors)
            {
                o.AddAttribute(IOStrings.AMeshColors3Compressed, BufferUtil.CompressZLib(m.ColorsBuffer.GetBytes(), opt.FastCompression));
            }
            if (opt.StoreMeshVertexUVs && m.HasVertexUVs)
            {
                o.AddAttribute(IOStrings.AMeshUVs2Compressed, BufferUtil.CompressZLib(m.UVBuffer.GetBytes(), opt.FastCompression));
            }

            o.AddAttribute(IOStrings.AMeshTrianglesCompressed, BufferUtil.CompressZLib(m.TrianglesBuffer.GetBytes(), opt.FastCompression));
            if (opt.StoreMeshFaceGroups && m.HasTriangleGroups)
            {
                o.AddAttribute(IOStrings.AMeshTriangleGroupsCompressed, BufferUtil.CompressZLib(m.GroupsBuffer.GetBytes(), opt.FastCompression));
            }

            o.AddAttribute(IOStrings.AMeshEdgesCompressed, BufferUtil.CompressZLib(m.EdgesBuffer.GetBytes(), opt.FastCompression));
            o.AddAttribute(IOStrings.AMeshEdgeRefCountsCompressed, BufferUtil.CompressZLib(m.EdgesRefCounts.RawRefCounts.GetBytes(), opt.FastCompression));
            o.EndStruct();
        }
 /// <summary>
 /// Emit a SimpleMesh as a BinaryMeshStruct
 /// </summary>
 public static void EmitMeshBinary(this SceneSerializer s, SimpleMesh m, IOutputStream o)
 {
     // binary version - uuencoded byte buffers
     //    - storing doubles uses roughly same mem as string, but string is only 8 digits precision
     //    - storing floats saves roughly 50%
     //    - storing triangles is worse until vertex count > 9999
     //          - could store as byte or short in those cases...
     o.BeginStruct(IOStrings.BinaryMeshStruct);
     o.AddAttribute(IOStrings.AMeshVertices3Binary, m.Vertices.GetBytes());
     if (m.HasVertexNormals)
     {
         o.AddAttribute(IOStrings.AMeshNormals3Binary, m.Normals.GetBytes());
     }
     if (m.HasVertexColors)
     {
         o.AddAttribute(IOStrings.AMeshColors3Binary, m.Colors.GetBytes());
     }
     if (m.HasVertexUVs)
     {
         o.AddAttribute(IOStrings.AMeshUVs2Binary, m.UVs.GetBytes());
     }
     o.AddAttribute(IOStrings.AMeshTrianglesBinary, m.Triangles.GetBytes());
     o.EndStruct();
 }