/// <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); }