Skip to content

Commit 248c8f3

Browse files
authored
Merge pull request #94 from qmuntal/nil-buffer
Return non-nil slice in ReadAccessor when bufferView and sparse are nil
2 parents aed1fc5 + aa9bbe9 commit 248c8f3

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

modeler/read.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ var uint32Pool = sync.Pool{
2929
// ReadAccessor is safe to use even with malformed documents.
3030
// If that happens it will return an error instead of panic.
3131
func ReadAccessor(doc *gltf.Document, acr *gltf.Accessor, buffer []byte) (any, error) {
32-
if acr.BufferView == nil && acr.Sparse == nil {
33-
return nil, nil
34-
}
3532
data, err := binary.MakeSliceBuffer(acr.ComponentType, acr.Type, acr.Count, buffer)
3633
if err != nil {
3734
return nil, err
@@ -119,8 +116,10 @@ var bufPool = sync.Pool{
119116
func makeBufferOf[T any](count int, buffer []T) []T {
120117
if len(buffer) < count {
121118
buffer = append(buffer, make([]T, count-len(buffer))...)
122-
} else {
119+
} else if count != 0 {
123120
buffer = buffer[:count]
121+
} else if buffer == nil {
122+
buffer = make([]T, 0)
124123
}
125124
return buffer
126125
}

modeler/read_test.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func TestReadAccessor(t *testing.T) {
112112
want any
113113
wantErr bool
114114
}{
115-
{"nodata", args{&gltf.Document{}, &gltf.Accessor{}}, nil, false},
115+
{"nodata", args{&gltf.Document{}, &gltf.Accessor{}}, []float32{}, false},
116116
{"base", args{&gltf.Document{Buffers: []*gltf.Buffer{
117117
{ByteLength: 9, Data: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}},
118118
}, BufferViews: []*gltf.BufferView{{
@@ -542,6 +542,9 @@ func TestReadPosition(t *testing.T) {
542542
want [][3]float32
543543
wantErr bool
544544
}{
545+
{"nil-bufferView", args{nil, &gltf.Accessor{
546+
Type: gltf.AccessorVec3, ComponentType: gltf.ComponentFloat,
547+
}, nil}, [][3]float32{}, false},
545548
{"float32", args{[]byte{0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64}, &gltf.Accessor{
546549
BufferView: gltf.Index(0), Count: 1, Type: gltf.AccessorVec3, ComponentType: gltf.ComponentFloat,
547550
}, nil}, [][3]float32{{1, 2, 3}}, false},
@@ -557,13 +560,14 @@ func TestReadPosition(t *testing.T) {
557560
}
558561
for _, tt := range tests {
559562
t.Run(tt.name, func(t *testing.T) {
560-
doc := &gltf.Document{
561-
BufferViews: []*gltf.BufferView{
563+
doc := new(gltf.Document)
564+
if tt.args.data != nil {
565+
doc.BufferViews = []*gltf.BufferView{
562566
{Buffer: 0, ByteLength: len(tt.args.data)},
563-
},
564-
Buffers: []*gltf.Buffer{
567+
}
568+
doc.Buffers = []*gltf.Buffer{
565569
{Data: tt.args.data, ByteLength: len(tt.args.data)},
566-
},
570+
}
567571
}
568572
got, err := modeler.ReadPosition(doc, tt.args.acr, tt.args.buffer)
569573
if (err != nil) != tt.wantErr {

0 commit comments

Comments
 (0)