Пример #1
0
        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);
        }
Пример #2
0
        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));
        }