@@ -40,7 +40,7 @@ class GSplatSogsIterator {
40
40
const lerp = ( a , b , t ) => a * ( 1 - t ) + b * t ;
41
41
42
42
// extract means for centers
43
- const { meta } = data ;
43
+ const { meta, shBands } = data ;
44
44
const { means, scales, sh0, shN } = meta ;
45
45
const means_l_data = p && data . means_l . _levels [ 0 ] ;
46
46
const means_u_data = p && data . means_u . _levels [ 0 ] ;
@@ -52,6 +52,8 @@ class GSplatSogsIterator {
52
52
53
53
const norm = 2.0 / Math . sqrt ( 2.0 ) ;
54
54
55
+ const coeffs = { 1 : 3 , 2 : 8 , 3 : 15 } [ shBands ] ?? 0 ;
56
+
55
57
this . read = ( i ) => {
56
58
if ( p ) {
57
59
const nx = lerp ( means . mins [ 0 ] , means . maxs [ 0 ] , ( ( means_u_data [ i * 4 + 0 ] << 8 ) + means_l_data [ i * 4 + 0 ] ) / 65535 ) ;
@@ -121,18 +123,18 @@ class GSplatSogsIterator {
121
123
122
124
if ( sh ) {
123
125
const n = sh_labels_data [ i * 4 + 0 ] + ( sh_labels_data [ i * 4 + 1 ] << 8 ) ;
124
- const u = ( n % 64 ) * 15 ;
126
+ const u = ( n % 64 ) * coeffs ;
125
127
const v = Math . floor ( n / 64 ) ;
126
128
127
129
if ( meta . version === 2 ) {
128
130
for ( let j = 0 ; j < 3 ; ++ j ) {
129
- for ( let k = 0 ; k < 15 ; ++ k ) {
131
+ for ( let k = 0 ; k < coeffs ; ++ k ) {
130
132
sh [ j * 15 + k ] = shN . codebook [ sh_centroids_data [ ( ( u + k ) * 4 + j ) + ( v * data . sh_centroids . width * 4 ) ] ] ;
131
133
}
132
134
}
133
135
} else {
134
136
for ( let j = 0 ; j < 3 ; ++ j ) {
135
- for ( let k = 0 ; k < 15 ; ++ k ) {
137
+ for ( let k = 0 ; k < coeffs ; ++ k ) {
136
138
sh [ j * 15 + k ] = lerp ( shN . mins , shN . maxs , sh_centroids_data [ ( ( u + k ) * 4 + j ) + ( v * data . sh_centroids . width * 4 ) ] / 255 ) ;
137
139
}
138
140
}
0 commit comments