@@ -39,29 +39,46 @@ export class ZipGLTFLoader {
39
39
const binNameOnly = bin_filename . split ( '/' ) . pop ( )
40
40
gltf_json . buffers [ 0 ] . uri = binNameOnly
41
41
}
42
- // Map all relevant files by filename only
42
+ // Map all relevant files by filename only (case-insensitive, handle spaces)
43
43
const fileMap : Record < string , Uint8Array > = { }
44
44
const filePromises = Object . keys ( zip . files ) . map ( async ( filename ) => {
45
45
const file = zip . files [ filename ]
46
46
if ( ! file . dir ) {
47
47
const nameOnly = filename . split ( '/' ) . pop ( ) ?? filename
48
48
if ( / \. ( b i n | g l t f | p n g | j p g | j p e g | w e b p ) $ / i. test ( nameOnly ) ) {
49
- fileMap [ nameOnly ] = new Uint8Array ( await file . async ( 'arraybuffer' ) )
49
+ // Map by original, lowercased, and decoded name
50
+ const buffer = new Uint8Array ( await file . async ( 'arraybuffer' ) )
51
+ fileMap [ nameOnly ] = buffer
52
+ fileMap [ nameOnly . toLowerCase ( ) ] = buffer
53
+ try {
54
+ const decoded = decodeURIComponent ( nameOnly )
55
+ fileMap [ decoded ] = buffer
56
+ fileMap [ decoded . toLowerCase ( ) ] = buffer
57
+ } catch { }
50
58
}
51
59
}
52
60
} )
53
61
await Promise . all ( filePromises )
54
62
// Patch loader to use in-memory blobs for all referenced files
55
63
this . loader . manager . setURLModifier ( ( url : string ) => {
56
64
const cleanUrl = url . split ( / [ ? # ] / ) [ 0 ]
57
- const nameOnly = cleanUrl . split ( '/' ) . pop ( ) ?? cleanUrl
58
- if ( fileMap [ nameOnly ] ) {
65
+ let nameOnly = cleanUrl . split ( '/' ) . pop ( ) ?? cleanUrl
66
+ // Try original, lowercased, and decoded
67
+ let buffer = fileMap [ nameOnly ]
68
+ if ( ! buffer ) buffer = fileMap [ nameOnly . toLowerCase ( ) ]
69
+ if ( ! buffer ) {
70
+ try {
71
+ const decoded = decodeURIComponent ( nameOnly )
72
+ buffer = fileMap [ decoded ] || fileMap [ decoded . toLowerCase ( ) ]
73
+ } catch { }
74
+ }
75
+ if ( buffer ) {
59
76
let mime = 'application/octet-stream'
60
77
if ( / \. p n g $ / i. test ( nameOnly ) ) mime = 'image/png'
61
78
else if ( / \. j p e ? g $ / i. test ( nameOnly ) ) mime = 'image/jpeg'
62
79
else if ( / \. w e b p $ / i. test ( nameOnly ) ) mime = 'image/webp'
63
80
else if ( / \. g l t f $ / i. test ( nameOnly ) ) mime = 'application/json'
64
- const blob = new Blob ( [ fileMap [ nameOnly ] ] , { type : mime } )
81
+ const blob = new Blob ( [ buffer ] , { type : mime } )
65
82
return URL . createObjectURL ( blob )
66
83
}
67
84
return url
0 commit comments