예제 #1
0
        /// <summary>
        /// Prepares the model for writing with the appropiate settings, creating a defensive copy if neccesary.
        /// </summary>
        /// <param name="model">The source <see cref="MODEL"/> instance.</param>
        /// <returns>The source <see cref="MODEL"/> instance, or a cloned and modified instance if current settings required it.</returns>
        internal MODEL FilterModel(MODEL model)
        {
            Guard.NotNull(model, nameof(model));

            // check if we need to modify the model before saving it,
            // in order to create a defensive copy.

            var needsMergeBuffers = (this.MergeBuffers | this.BinaryMode) && model.LogicalBuffers.Count > 1;

            var imagesAsBufferViews = model.LogicalImages.Count > 0 && this.ImageWriting == ImageWriteMode.BufferView;

            if (needsMergeBuffers | imagesAsBufferViews)
            {
                if (_NoCloneWatchdog)
                {
                    throw new InvalidOperationException($"Current settings require creating a densive copy before model modification, but calling {nameof(MODEL.DeepClone)} is not allowed with the current settings.");
                }
                model = model.DeepClone();
            }

            if (ImageWriting == ImageWriteMode.BufferView)
            {
                model.MergeImages();
                needsMergeBuffers |= this.MergeBuffers | this.BinaryMode;
            }

            if (needsMergeBuffers)
            {
                model.MergeBuffers();
            }

            return(model);
        }
        /// <summary>
        /// Prepares the model for writing with the appropiate settings, cloning it if neccesary.
        /// </summary>
        /// <param name="model">The source <see cref="MODEL"/> instance.</param>
        /// <returns>The source <see cref="MODEL"/> instance, or a cloned and modified instance if current settings required it.</returns>
        internal MODEL FilterModel(MODEL model)
        {
            Guard.NotNull(model, nameof(model));

            var needsMergeBuffers = (this.MergeBuffers | this.BinaryMode) && model.LogicalBuffers.Count > 1;

            var imagesAsBufferViews = model.LogicalImages.Count > 0 && this.ImageWriting == ImageWriteMode.BufferView;

            if (needsMergeBuffers | imagesAsBufferViews)
            {
                if (_NoCloneWatchdog)
                {
                    throw new InvalidOperationException($"Current settings require a model rewrite, but {nameof(MODEL.DeepClone)} is not allowed in the current context");
                }
                model = model.DeepClone();
            }

            if (ImageWriting == ImageWriteMode.BufferView)
            {
                model.MergeImages();
                needsMergeBuffers |= this.MergeBuffers | this.BinaryMode;
            }

            if (needsMergeBuffers)
            {
                model.MergeBuffers();
            }

            return(model);
        }