Skip to content

Commit fe07774

Browse files
authored
Merge pull request #15056 from WestLangley/dev-rgbe_loader_float
RGBELoader: support FloatType output
2 parents c8ae258 + c34c1d0 commit fe07774

File tree

1 file changed

+53
-3
lines changed

1 file changed

+53
-3
lines changed

examples/js/loaders/RGBELoader.js

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
THREE.HDRLoader = THREE.RGBELoader = function ( manager ) {
99

1010
this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
11+
this.type = THREE.UnsignedByteType;
1112

1213
};
1314

@@ -328,19 +329,68 @@ THREE.RGBELoader.prototype._parser = function ( buffer ) {
328329
;
329330
if ( RGBE_RETURN_FAILURE !== image_rgba_data ) {
330331

332+
if ( this.type === THREE.UnsignedByteType ) {
333+
334+
var data = image_rgba_data;
335+
var format = THREE.RGBEFormat; // handled as THREE.RGBAFormat in shaders
336+
var type = THREE.UnsignedByteType;
337+
338+
} else if ( this.type === THREE.FloatType ) {
339+
340+
var RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {
341+
342+
var e = sourceArray[ sourceOffset + 3 ];
343+
var scale = Math.pow( 2.0, e - 128.0 ) / 255.0;
344+
345+
destArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;
346+
destArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;
347+
destArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;
348+
349+
};
350+
351+
var numElements = ( image_rgba_data.length / 4 ) * 3;
352+
var floatArray = new Float32Array( numElements );
353+
354+
for ( var j = 0; j < numElements; j ++ ) {
355+
356+
RGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 3 );
357+
358+
}
359+
360+
var data = floatArray;
361+
var format = THREE.RGBFormat;
362+
var type = THREE.FloatType;
363+
364+
365+
} else {
366+
367+
console.error( 'THREE.RGBELoader: unsupported type: ', this.type );
368+
369+
}
370+
331371
return {
332372
width: w, height: h,
333-
data: image_rgba_data,
373+
data: data,
334374
header: rgbe_header_info.string,
335375
gamma: rgbe_header_info.gamma,
336376
exposure: rgbe_header_info.exposure,
337-
format: THREE.RGBEFormat, // handled as THREE.RGBAFormat in shaders
338-
type: THREE.UnsignedByteType
377+
format: format,
378+
type: type
339379
};
340380

341381
}
342382

343383
}
384+
344385
return null;
345386

346387
};
388+
389+
THREE.RGBELoader.prototype.setType = function ( value ) {
390+
391+
this.type = value;
392+
return this;
393+
394+
};
395+
396+

0 commit comments

Comments
 (0)