public override IEnumerable <Exception> Validate() { var exxx = base.Validate().ToList(); if (!_bufferView.HasValue) { exxx.Add(new EXCEPTION(this, $"BufferView index missing")); return(exxx); } if (_bufferView < 0 || _bufferView >= LogicalParent.LogicalBufferViews.Count) { exxx.Add(new EXCEPTION(this, $"BufferView index out of range")); } if (_count < 0) { exxx.Add(new EXCEPTION(this, $"Count is out of range")); } if (_byteOffset < 0) { exxx.Add(new EXCEPTION(this, $"ByteOffset is out of range")); } if (SourceBufferView.DeviceBufferTarget == BufferMode.ARRAY_BUFFER) { var len = Encoding.ByteLength() * Dimensions.DimCount(); if (len > 0 && (len & 3) != 0) { exxx.Add(new EXCEPTION(this, $"Expected length to be multiple of 4, found {len}")); } } if (SourceBufferView.DeviceBufferTarget == BufferMode.ELEMENT_ARRAY_BUFFER) { var len = Encoding.ByteLength() * Dimensions.DimCount(); if (len != 1 && len != 2 && len != 4) { exxx.Add(new EXCEPTION(this, $"Expected length to be 1, 2 or 4, found {len}")); } } // validate bounds if (_min.Count != _max.Count) { exxx.Add(new EXCEPTION(this, "min and max length mismatch")); return(exxx); } for (int i = 0; i < _min.Count; ++i) { if (_min[i] > _max[i]) { exxx.Add(new EXCEPTION(this, $"min[{i}] is larger than max[{i}]")); } } return(exxx); }
public ArraySegment <Byte> TryGetVertexBytes(int vertexIdx) { if (_sparse != null) { throw new InvalidOperationException("Can't be used on Acessors with Sparse Data"); } var itemByteSz = Encoding.ByteLength() * Dimensions.DimCount(); var byteStride = Math.Max(itemByteSz, SourceBufferView.ByteStride); var byteOffset = vertexIdx * byteStride; return(SourceBufferView.Content.Slice(this.ByteOffset + (vertexIdx * byteStride), itemByteSz)); }