예제 #1
0
        private static void _Write(WriteSettings settings, string baseName, MODEL model)
        {
            Guard.NotNull(settings, nameof(settings));
            Guard.NotNullOrEmpty(baseName, nameof(baseName));
            Guard.NotNull(model, nameof(model));

            model = settings.FilterModel(model);

            if (settings._UpdateSupportedExtensions)
            {
                model.UpdateExtensionsSupport();
            }

            if (settings.BinaryMode)
            {
                var ex = glb.IsBinaryCompatible(model);
                if (ex != null)
                {
                    throw ex;
                }

                // setup all buffers to be written internally
                for (int i = 0; i < model._buffers.Count; ++i)
                {
                    var buffer = model._buffers[i];
                    buffer._WriteToInternal();
                }
            }
            else
            {
                // setup all buffers to be written as satellite files
                for (int i = 0; i < model._buffers.Count; ++i)
                {
                    var buffer = model._buffers[i];
                    var bname  = model._buffers.Count != 1 ? $"{baseName}_{i}.bin" : $"{baseName}.bin";
                    buffer._WriteToSatellite(settings.FileWriter, bname);
                }
            }

            // setup all images to be written to the appropiate location.
            for (int i = 0; i < model._images.Count; ++i)
            {
                var image = model._images[i];
                var iname = model._images.Count != 1 ? $"{baseName}_{i}" : $"{baseName}";
                if (settings.ImageWriting != ImageWriteMode.SatelliteFile)
                {
                    image._WriteToInternal();
                }
                else
                {
                    image._WriteToSatellite(settings.FileWriter, iname);
                }
            }

            using (var m = new MemoryStream())
            {
                if (settings.BinaryMode)
                {
                    using (var w = new BinaryWriter(m))
                    {
                        glb.WriteBinaryModel(w, model);
                    }

                    settings.FileWriter($"{baseName}.glb", m.ToArraySegment());
                }
                else
                {
                    using (var w = new StreamWriter(m))
                    {
                        model._WriteJSON(w, settings.JsonFormatting);
                    }

                    settings.FileWriter($"{baseName}.gltf", m.ToArraySegment());
                }
            }

            foreach (var b in model._buffers)
            {
                b._ClearAfterWrite();
            }
            foreach (var i in model._images)
            {
                i._ClearAfterWrite();
            }
        }