/// <summary> /// Merges all the Buffer objects into a single, big one. /// </summary> /// <remarks> /// When merging the buffers, it also adjusts the BufferView offsets so the data they point to remains the same. /// </remarks> public void MergeBuffers() { // retrieve all buffers and merge them into a single, big buffer var views = _bufferViews .OrderByDescending(item => item.Data.Count) .ToArray(); if (views.Length <= 1) { return; // nothing to do. } var sbbuilder = new _StaticBufferBuilder(0); foreach (var bv in views) { bv._ConvertToStaticBuffer(sbbuilder); } this._buffers.Clear(); var b = new Buffer { _Data = sbbuilder.ToArray() }; this._buffers.Add(b); }
internal void _ConvertToStaticBuffer(_StaticBufferBuilder targetBuffer) { // retrieve old buffer var srcBuf = this.LogicalParent.LogicalBuffers[this._buffer]._Data; var data = new Byte[this._byteLength]; Array.Copy(srcBuf, this._byteOffset ?? 0, data, 0, this._byteLength); // append data to new buffer this._buffer = targetBuffer.BufferIndex; this._byteLength = data.Length; this._byteOffset = targetBuffer.Append(data); }