114 lines
3.1 KiB
JavaScript
114 lines
3.1 KiB
JavaScript
|
import { Object3D } from '../core/Object3D.js';
|
||
|
import { WebGLRenderTargetCube } from '../renderers/WebGLRenderTargetCube.js';
|
||
|
import { LinearFilter, RGBFormat } from '../constants.js';
|
||
|
import { Vector3 } from '../math/Vector3.js';
|
||
|
import { PerspectiveCamera } from './PerspectiveCamera.js';
|
||
|
|
||
|
/**
|
||
|
* Camera for rendering cube maps
|
||
|
* - renders scene into axis-aligned cube
|
||
|
*
|
||
|
* @author alteredq / http://alteredqualia.com/
|
||
|
*/
|
||
|
|
||
|
function CubeCamera( near, far, cubeResolution, options ) {
|
||
|
|
||
|
Object3D.call( this );
|
||
|
|
||
|
this.type = 'CubeCamera';
|
||
|
|
||
|
var fov = 90, aspect = 1;
|
||
|
|
||
|
var cameraPX = new PerspectiveCamera( fov, aspect, near, far );
|
||
|
cameraPX.up.set( 0, - 1, 0 );
|
||
|
cameraPX.lookAt( new Vector3( 1, 0, 0 ) );
|
||
|
this.add( cameraPX );
|
||
|
|
||
|
var cameraNX = new PerspectiveCamera( fov, aspect, near, far );
|
||
|
cameraNX.up.set( 0, - 1, 0 );
|
||
|
cameraNX.lookAt( new Vector3( - 1, 0, 0 ) );
|
||
|
this.add( cameraNX );
|
||
|
|
||
|
var cameraPY = new PerspectiveCamera( fov, aspect, near, far );
|
||
|
cameraPY.up.set( 0, 0, 1 );
|
||
|
cameraPY.lookAt( new Vector3( 0, 1, 0 ) );
|
||
|
this.add( cameraPY );
|
||
|
|
||
|
var cameraNY = new PerspectiveCamera( fov, aspect, near, far );
|
||
|
cameraNY.up.set( 0, 0, - 1 );
|
||
|
cameraNY.lookAt( new Vector3( 0, - 1, 0 ) );
|
||
|
this.add( cameraNY );
|
||
|
|
||
|
var cameraPZ = new PerspectiveCamera( fov, aspect, near, far );
|
||
|
cameraPZ.up.set( 0, - 1, 0 );
|
||
|
cameraPZ.lookAt( new Vector3( 0, 0, 1 ) );
|
||
|
this.add( cameraPZ );
|
||
|
|
||
|
var cameraNZ = new PerspectiveCamera( fov, aspect, near, far );
|
||
|
cameraNZ.up.set( 0, - 1, 0 );
|
||
|
cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );
|
||
|
this.add( cameraNZ );
|
||
|
|
||
|
options = options || { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };
|
||
|
|
||
|
this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );
|
||
|
this.renderTarget.texture.name = "CubeCamera";
|
||
|
|
||
|
this.update = function ( renderer, scene ) {
|
||
|
|
||
|
if ( this.parent === null ) this.updateMatrixWorld();
|
||
|
|
||
|
var renderTarget = this.renderTarget;
|
||
|
var generateMipmaps = renderTarget.texture.generateMipmaps;
|
||
|
|
||
|
renderTarget.texture.generateMipmaps = false;
|
||
|
|
||
|
renderTarget.activeCubeFace = 0;
|
||
|
renderer.render( scene, cameraPX, renderTarget );
|
||
|
|
||
|
renderTarget.activeCubeFace = 1;
|
||
|
renderer.render( scene, cameraNX, renderTarget );
|
||
|
|
||
|
renderTarget.activeCubeFace = 2;
|
||
|
renderer.render( scene, cameraPY, renderTarget );
|
||
|
|
||
|
renderTarget.activeCubeFace = 3;
|
||
|
renderer.render( scene, cameraNY, renderTarget );
|
||
|
|
||
|
renderTarget.activeCubeFace = 4;
|
||
|
renderer.render( scene, cameraPZ, renderTarget );
|
||
|
|
||
|
renderTarget.texture.generateMipmaps = generateMipmaps;
|
||
|
|
||
|
renderTarget.activeCubeFace = 5;
|
||
|
renderer.render( scene, cameraNZ, renderTarget );
|
||
|
|
||
|
renderer.setRenderTarget( null );
|
||
|
|
||
|
};
|
||
|
|
||
|
this.clear = function ( renderer, color, depth, stencil ) {
|
||
|
|
||
|
var renderTarget = this.renderTarget;
|
||
|
|
||
|
for ( var i = 0; i < 6; i ++ ) {
|
||
|
|
||
|
renderTarget.activeCubeFace = i;
|
||
|
renderer.setRenderTarget( renderTarget );
|
||
|
|
||
|
renderer.clear( color, depth, stencil );
|
||
|
|
||
|
}
|
||
|
|
||
|
renderer.setRenderTarget( null );
|
||
|
|
||
|
};
|
||
|
|
||
|
}
|
||
|
|
||
|
CubeCamera.prototype = Object.create( Object3D.prototype );
|
||
|
CubeCamera.prototype.constructor = CubeCamera;
|
||
|
|
||
|
|
||
|
export { CubeCamera };
|