|
8 | 8 | THREE.HDRLoader = THREE.RGBELoader = function ( manager ) { |
9 | 9 |
|
10 | 10 | this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; |
| 11 | + this.type = THREE.UnsignedByteType; |
11 | 12 |
|
12 | 13 | }; |
13 | 14 |
|
@@ -328,19 +329,68 @@ THREE.RGBELoader.prototype._parser = function ( buffer ) { |
328 | 329 | ; |
329 | 330 | if ( RGBE_RETURN_FAILURE !== image_rgba_data ) { |
330 | 331 |
|
| 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 | + |
331 | 371 | return { |
332 | 372 | width: w, height: h, |
333 | | - data: image_rgba_data, |
| 373 | + data: data, |
334 | 374 | header: rgbe_header_info.string, |
335 | 375 | gamma: rgbe_header_info.gamma, |
336 | 376 | 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 |
339 | 379 | }; |
340 | 380 |
|
341 | 381 | } |
342 | 382 |
|
343 | 383 | } |
| 384 | + |
344 | 385 | return null; |
345 | 386 |
|
346 | 387 | }; |
| 388 | + |
| 389 | +THREE.RGBELoader.prototype.setType = function ( value ) { |
| 390 | + |
| 391 | + this.type = value; |
| 392 | + return this; |
| 393 | + |
| 394 | +}; |
| 395 | + |
| 396 | + |
0 commit comments