Skip to content

Commit

Permalink
fix(export): Cases of corrupt glTFs when not all vertex attributes of…
Browse files Browse the repository at this point in the history
… a mesh were exported. (atteneder#168)
  • Loading branch information
atteneder authored and GitHub Enterprise committed Jun 28, 2024
1 parent 33e9c25 commit b997bf4
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 16 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased] -

### Fixed
- (Export) Cases of corrupt glTFs when not all vertex attributes of a mesh were exported.

## [6.7.0] - 2024-06-25

### Added
Expand Down
31 changes: 15 additions & 16 deletions Runtime/Scripts/Export/GltfWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ enum State
struct AttributeData
{
public int stream;
public int offset;
public int inputOffset;
public int outputOffset;
public int accessorId;
public int size;
}
Expand Down Expand Up @@ -903,7 +904,8 @@ async Task BakeMesh(int meshId, UnityEngine.Mesh.MeshData meshData)

var attrData = new AttributeData
{
offset = inputStrides[attribute.stream],
inputOffset = inputStrides[attribute.stream],
outputOffset = outputStrides[attribute.stream],
stream = attribute.stream,
size = attribute.dimension * attributeSize
};
Expand All @@ -915,17 +917,14 @@ async Task BakeMesh(int meshId, UnityEngine.Mesh.MeshData meshData)
{
continue;
}
else
{
outputStrides[attribute.stream] += attrData.size;
}

outputStrides[attribute.stream] += attrData.size;
// Adhere data alignment rules
Assert.IsTrue(attrData.offset % 4 == 0);
Assert.IsTrue(attrData.outputOffset % 4 == 0);

var accessor = new Accessor
{
byteOffset = attrData.offset,
byteOffset = attrData.outputOffset,
componentType = Accessor.GetComponentType(attribute.format),
count = vertexCount,
};
Expand Down Expand Up @@ -1554,10 +1553,10 @@ NativeArray<byte> outputStream
{
var job = new ExportJobs.ConvertPositionFloatJob
{
input = (byte*)inputStream.GetUnsafeReadOnlyPtr() + attrData.offset,
input = (byte*)inputStream.GetUnsafeReadOnlyPtr() + attrData.inputOffset,
inputByteStride = inputByteStride,
outputByteStride = outputByteStride,
output = (byte*)outputStream.GetUnsafePtr() + attrData.offset
output = (byte*)outputStream.GetUnsafePtr() + attrData.outputOffset
}.Schedule(vertexCount, k_DefaultInnerLoopBatchCount);
return job;
}
Expand Down Expand Up @@ -1597,10 +1596,10 @@ NativeArray<byte> outputStream
{
var job = new ExportJobs.ConvertTangentFloatJob
{
input = (byte*)inputStream.GetUnsafeReadOnlyPtr() + attrData.offset,
input = (byte*)inputStream.GetUnsafeReadOnlyPtr() + attrData.inputOffset,
inputByteStride = inputByteStride,
outputByteStride = outputByteStride,
output = (byte*)outputStream.GetUnsafePtr() + attrData.offset
output = (byte*)outputStream.GetUnsafePtr() + attrData.outputOffset
}.Schedule(vertexCount, k_DefaultInnerLoopBatchCount);
return job;
}
Expand Down Expand Up @@ -1662,10 +1661,10 @@ NativeArray<byte> outputStream
{
var job = new ExportJobs.ConvertTexCoordFloatJob
{
input = (byte*)inputStream.GetUnsafeReadOnlyPtr() + attrData.offset,
input = (byte*)inputStream.GetUnsafeReadOnlyPtr() + attrData.inputOffset,
inputByteStride = inputByteStride,
outputByteStride = outputByteStride,
output = (byte*)outputStream.GetUnsafePtr() + attrData.offset
output = (byte*)outputStream.GetUnsafePtr() + attrData.outputOffset
}.Schedule(vertexCount, k_DefaultInnerLoopBatchCount);
return job;
}
Expand All @@ -1684,8 +1683,8 @@ NativeArray<byte> outputStream
inputByteStride = inputByteStride,
outputByteStride = outputByteStride,
byteLength = (uint)attrData.size,
input = (byte*)inputStream.GetUnsafeReadOnlyPtr() + attrData.offset,
output = (byte*)outputStream.GetUnsafePtr() + attrData.offset
input = (byte*)inputStream.GetUnsafeReadOnlyPtr() + attrData.inputOffset,
output = (byte*)outputStream.GetUnsafePtr() + attrData.outputOffset
}.Schedule(vertexCount, k_DefaultInnerLoopBatchCount);
return job;
}
Expand Down

0 comments on commit b997bf4

Please sign in to comment.