const RWGltf_JsonValue* aTypeStr = findObjectMember (theAccessor, "type");
const RWGltf_JsonValue* aBufferViewName = findObjectMember (theAccessor, "bufferView");
const RWGltf_JsonValue* aByteOffset = findObjectMember (theAccessor, "byteOffset");
- const RWGltf_JsonValue* aByteStride = findObjectMember (theAccessor, "byteStride");
+ const RWGltf_JsonValue* aByteStride = findObjectMember (theAccessor, "byteStride"); // byteStride was part of bufferView in glTF 1.0
const RWGltf_JsonValue* aCompType = findObjectMember (theAccessor, "componentType");
const RWGltf_JsonValue* aCount = findObjectMember (theAccessor, "count");
if (aTypeStr == NULL
const RWGltf_JsonValue* aBufferName = findObjectMember (theBufferView, "buffer");
const RWGltf_JsonValue* aByteLength = findObjectMember (theBufferView, "byteLength");
const RWGltf_JsonValue* aByteOffset = findObjectMember (theBufferView, "byteOffset");
+ const RWGltf_JsonValue* aByteStride = findObjectMember (theBufferView, "byteStride"); // byteStride is part of bufferView since glTF 2.0
const RWGltf_JsonValue* aTarget = findObjectMember (theBufferView, "target");
if (aBufferName == NULL)
{
aBuffView.ByteLength = aByteLength != NULL && aByteLength->IsNumber()
? (int64_t )aByteLength->GetDouble()
: 0;
+ aBuffView.ByteStride = aByteStride != NULL && aByteStride->IsInt()
+ ? aByteStride->GetInt()
+ : 0;
if (aTarget != NULL && aTarget->IsInt())
{
aBuffView.Target = (RWGltf_GltfBufferViewTarget )aTarget->GetInt();
reportGltfError ("BufferView '" + theName + "' defines invalid byteOffset.");
return false;
}
+ else if (aBuffView.ByteStride < 0
+ || aBuffView.ByteStride > 255)
+ {
+ reportGltfError ("BufferView '" + theName + "' defines invalid byteStride.");
+ return false;
+ }
const RWGltf_JsonValue* aBuffer = myGltfRoots[RWGltf_GltfRootElement_Buffers].FindChild (*aBufferName);
if (aBuffer == NULL
const RWGltf_JsonValue* anUriVal = findObjectMember (theBuffer, "uri");
int64_t anOffset = theView.ByteOffset + theAccessor.ByteOffset;
+ const int32_t aByteStride = theAccessor.ByteStride != 0 ? theView.ByteStride : theView.ByteStride;
bool isBinary = false;
if (myIsBinary)
{
RWGltf_GltfPrimArrayData& aData = theMeshData->AddPrimArrayData (theType);
aData.Accessor = theAccessor;
+ aData.Accessor.ByteStride = aByteStride;
aData.StreamOffset = anOffset;
aData.StreamUri = myFilePath;
return true;
{
RWGltf_GltfPrimArrayData& aData = theMeshData->AddPrimArrayData (theType);
aData.Accessor = theAccessor;
+ aData.Accessor.ByteStride = aByteStride;
aData.StreamOffset = anOffset;
if (!myDecodedBuffers.Find (theName, aData.StreamData))
{
RWGltf_GltfPrimArrayData& aData = theMeshData->AddPrimArrayData (theType);
aData.Accessor = theAccessor;
+ aData.Accessor.ByteStride = aByteStride;
aData.StreamOffset = anOffset;
aData.StreamUri = myFolder + anUri;
if (myExternalFiles != NULL)