示例#1
0
文件: gltf.g.cs 项目: rsfc/SharpGLTF
        protected override void DeserializeProperty(string jsonPropertyName, JsonReader reader)
        {
            switch (jsonPropertyName)
            {
            case "buffer": _buffer = DeserializePropertyValue <Int32>(reader); break;

            case "byteLength": _byteLength = DeserializePropertyValue <Int32>(reader); break;

            case "byteOffset": _byteOffset = DeserializePropertyValue <Int32?>(reader); break;

            case "byteStride": _byteStride = DeserializePropertyValue <Int32?>(reader); break;

            case "target": _target = DeserializePropertyValue <BufferMode>(reader); break;

            default: base.DeserializeProperty(jsonPropertyName, reader); break;
            }
        }
示例#2
0
 internal static bool AreEqual(BufferView bv, BYTES content, int byteStride, BufferMode?target)
 {
     if (bv.Content.Array != content.Array)
     {
         return(false);
     }
     if (bv.Content.Offset != content.Offset)
     {
         return(false);
     }
     if (bv.Content.Count != content.Count)
     {
         return(false);
     }
     if (bv.ByteStride != byteStride)
     {
         return(false);
     }
     if (bv._target != target)
     {
         return(false);
     }
     return(true);
 }
示例#3
0
        /// <summary>
        /// Creates or reuses a <see cref="BufferView"/> instance
        /// at <see cref="ModelRoot.LogicalBufferViews"/>.
        /// </summary>
        /// <param name="buffer">The buffer to wrap.</param>
        /// <param name="byteOffset">The zero-based index of the first Byte in <paramref name="buffer"/></param>
        /// <param name="byteLength">The number of elements in <paramref name="buffer"/></param>
        /// <param name="byteStride">For strided vertex buffers, it must be a value multiple of 4, 0 otherwise</param>
        /// <param name="target">The type hardware device buffer, or null</param>
        /// <returns>A <see cref="BufferView"/> instance.</returns>
        public BufferView UseBufferView(Buffer buffer, int byteOffset = 0, int?byteLength = null, int byteStride = 0, BufferMode?target = null)
        {
            Guard.NotNull(buffer, nameof(buffer));
            Guard.MustShareLogicalParent(this, "this", buffer, nameof(buffer));

            var content = new BYTES(buffer.Content, byteOffset, byteLength.AsValue(buffer.Content.Length - byteOffset));

            foreach (var bv in this.LogicalBufferViews)
            {
                if (BufferView.AreEqual(bv, content, byteStride, target))
                {
                    return(bv);
                }
            }

            var newbv = new BufferView(buffer, byteOffset, byteLength, byteStride, target);

            this._bufferViews.Add(newbv);

            return(newbv);
        }
示例#4
0
 /// <summary>
 /// Creates or reuses a <see cref="BufferView"/> instance
 /// at <see cref="ModelRoot.LogicalBufferViews"/>.
 /// </summary>
 /// <param name="buffer">The array to wrap.</param>
 /// <param name="byteOffset">The zero-based index of the first Byte in <paramref name="buffer"/></param>
 /// <param name="byteLength">The number of elements in <paramref name="buffer"/></param>
 /// <param name="byteStride">For strided vertex buffers, it must be a value multiple of 4, 0 otherwise</param>
 /// <param name="target">The type hardware device buffer, or null</param>
 /// <returns>A <see cref="BufferView"/> instance.</returns>
 public BufferView UseBufferView(Byte[] buffer, int byteOffset = 0, int?byteLength = null, int byteStride = 0, BufferMode?target = null)
 {
     Guard.NotNull(buffer, nameof(buffer));
     return(UseBufferView(UseBuffer(buffer), byteOffset, byteLength, byteStride, target));
 }
示例#5
0
 /// <summary>
 /// Creates or reuses a <see cref="BufferView"/> instance
 /// at <see cref="ModelRoot.LogicalBufferViews"/>.
 /// </summary>
 /// <param name="data">The array range to wrap.</param>
 /// <param name="byteStride">For strided vertex buffers, it must be a value multiple of 4, 0 otherwise</param>
 /// <param name="target">The type hardware device buffer, or null</param>
 /// <returns>A <see cref="BufferView"/> instance.</returns>
 public BufferView UseBufferView(ArraySegment <Byte> data, int byteStride = 0, BufferMode?target = null)
 {
     Guard.NotNull(data.Array, nameof(data));
     return(UseBufferView(data.Array, data.Offset, data.Count, byteStride, target));
 }
示例#6
0
        internal BufferView(Buffer buffer, int byteOffset, int?byteLength, int byteStride, BufferMode?target)
        {
            Guard.NotNull(buffer, nameof(buffer));
            Guard.NotNull(buffer.Content, nameof(buffer));
            Guard.NotNull(buffer.LogicalParent, nameof(buffer));

            byteLength = byteLength.AsValue(buffer.Content.Length - byteOffset);

            Guard.MustBeGreaterThanOrEqualTo(byteLength.AsValue(0), _byteLengthMinimum, nameof(byteLength));
            Guard.MustBeGreaterThanOrEqualTo(byteOffset, _byteOffsetMinimum, nameof(byteOffset));

            if (target == BufferMode.ELEMENT_ARRAY_BUFFER || byteStride == 0)
            {
                Guard.IsTrue(byteStride == 0, nameof(byteStride));
                this._byteStride = null;
            }
            else if (byteStride > 0)
            {
                // TODO: clarify under which conditions bytestride needs to be defined or forbidden.

                Guard.IsTrue(byteStride.IsMultipleOf(4), nameof(byteStride));
                Guard.MustBeBetweenOrEqualTo(byteStride, _byteStrideMinimum, _byteStrideMaximum, nameof(byteStride));
                this._byteStride = byteStride.AsNullable(0, _byteStrideMinimum, _byteStrideMaximum);
            }

            this._buffer = buffer.LogicalIndex;

            this._byteLength = byteLength.AsValue(buffer.Content.Length);

            this._byteOffset = byteOffset.AsNullable(_byteOffsetDefault, _byteOffsetMinimum, int.MaxValue);

            this._target = target;
        }
示例#7
0
        public BufferView CreateBufferView(Buffer buffer, int?byteLength = null, int?byteOffset = null, int?byteStride = null, BufferMode?target = null)
        {
            Guard.NotNull(buffer, nameof(buffer));
            Guard.MustShareLogicalParent(this, buffer, nameof(buffer));

            var bv = new BufferView(buffer, byteLength, byteOffset, byteStride, target);

            this._bufferViews.Add(bv);

            return(bv);
        }
示例#8
0
        internal BufferView(Buffer buffer, int?byteLength, int?byteOffset, int?byteStride, BufferMode?target)
        {
            Guard.NotNull(buffer, nameof(buffer));
            Guard.NotNull(buffer.LogicalParent, nameof(buffer));
            if (byteLength.HasValue)
            {
                Guard.MustBeGreaterThan(byteLength.Value, 0, nameof(byteLength));
            }

            if (byteOffset.HasValue)
            {
                Guard.MustBeGreaterThan(byteOffset.Value, 0, nameof(byteOffset));
            }

            if (byteStride.HasValue && target.HasValue)
            {
                if (target.Value == BufferMode.ELEMENT_ARRAY_BUFFER)
                {
                    Guard.IsTrue(byteStride.Value == 2 || byteStride.Value == 4, nameof(byteStride));
                }
                else if (target.Value == BufferMode.ELEMENT_ARRAY_BUFFER)
                {
                    Guard.IsTrue((byteStride.Value % 4) == 0, nameof(byteStride));
                }
            }

            this._buffer = buffer.LogicalIndex;

            this._byteLength = byteLength.AsValue(buffer._Data.Length);

            this._byteOffset = byteOffset;
            this._byteStride = byteStride;

            this._target = target;
        }
示例#9
0
        /// <summary>
        /// Creates or reuses a <see cref="BufferView"/> instance
        /// at <see cref="ModelRoot.LogicalBufferViews"/>.
        /// </summary>
        /// <param name="buffer">The buffer to wrap.</param>
        /// <param name="byteOffset">The zero-based index of the first Byte in <paramref name="buffer"/></param>
        /// <param name="byteLength">The number of elements in <paramref name="buffer"/></param>
        /// <param name="byteStride">For strided vertex buffers, it must be a value multiple of 4, 0 otherwise</param>
        /// <param name="target">The type hardware device buffer, or null</param>
        /// <returns>A <see cref="BufferView"/> instance.</returns>
        public BufferView UseBufferView(Buffer buffer, int byteOffset = 0, int?byteLength = null, int byteStride = 0, BufferMode?target = null)
        {
            Guard.NotNull(buffer, nameof(buffer));
            Guard.MustShareLogicalParent(this, "this", buffer, nameof(buffer));

            byteLength = byteLength.AsValue(buffer.Content.Length - byteOffset);

            foreach (var bv in this.LogicalBufferViews)
            {
                if (bv.Content.Array != buffer.Content)
                {
                    continue;
                }
                if (bv.Content.Offset != byteOffset)
                {
                    continue;
                }
                if (bv.Content.Count != byteLength.Value)
                {
                    continue;
                }
                if (bv.ByteStride != byteStride)
                {
                    continue;
                }
                if (bv.DeviceBufferTarget != target)
                {
                    continue;
                }

                return(bv);
            }

            var newbv = new BufferView(buffer, byteOffset, byteLength, byteStride, target);

            this._bufferViews.Add(newbv);

            return(newbv);
        }