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