Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/flo-bit/shapecraft. flo-bit.dev/shapecraft
Something went wrong. Try again.
3.7 kB · 162 lines
JavaScript
at commit da69385e
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163import { EventDispatcher } from './EventDispatcher.js';import { Texture } from '../textures/Texture.js';import { LinearFilter } from '../constants.js';import { Vector4 } from '../math/Vector4.js';import { Source } from '../textures/Source.js';
/* In options, we can specify: * Texture parameters for an auto-generated target texture * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers*/class RenderTarget extends EventDispatcher {
constructor( width = 1, height = 1, options = {} ) {
super();
this.isRenderTarget = true;
this.width = width; this.height = height; this.depth = 1;
this.scissor = new Vector4( 0, 0, width, height ); this.scissorTest = false;
this.viewport = new Vector4( 0, 0, width, height );
const image = { width: width, height: height, depth: 1 };
options = Object.assign( { generateMipmaps: false, internalFormat: null, minFilter: LinearFilter, depthBuffer: true, stencilBuffer: false, resolveDepthBuffer: true, resolveStencilBuffer: true, depthTexture: null, samples: 0, count: 1 }, options );
const texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );
texture.flipY = false; texture.generateMipmaps = options.generateMipmaps; texture.internalFormat = options.internalFormat;
this.textures = [];
const count = options.count; for ( let i = 0; i < count; i ++ ) {
this.textures[ i ] = texture.clone(); this.textures[ i ].isRenderTargetTexture = true;
}
this.depthBuffer = options.depthBuffer; this.stencilBuffer = options.stencilBuffer;
this.resolveDepthBuffer = options.resolveDepthBuffer; this.resolveStencilBuffer = options.resolveStencilBuffer;
this.depthTexture = options.depthTexture;
this.samples = options.samples;
}
get texture() {
return this.textures[ 0 ];
}
set texture( value ) {
this.textures[ 0 ] = value;
}
setSize( width, height, depth = 1 ) {
if ( this.width !== width || this.height !== height || this.depth !== depth ) {
this.width = width; this.height = height; this.depth = depth;
for ( let i = 0, il = this.textures.length; i < il; i ++ ) {
this.textures[ i ].image.width = width; this.textures[ i ].image.height = height; this.textures[ i ].image.depth = depth;
}
this.dispose();
}
this.viewport.set( 0, 0, width, height ); this.scissor.set( 0, 0, width, height );
}
clone() {
return new this.constructor().copy( this );
}
copy( source ) {
this.width = source.width; this.height = source.height; this.depth = source.depth;
this.scissor.copy( source.scissor ); this.scissorTest = source.scissorTest;
this.viewport.copy( source.viewport );
this.textures.length = 0;
for ( let i = 0, il = source.textures.length; i < il; i ++ ) {
this.textures[ i ] = source.textures[ i ].clone(); this.textures[ i ].isRenderTargetTexture = true;
}
// ensure image object is not shared, see #20328
const image = Object.assign( {}, source.texture.image ); this.texture.source = new Source( image );
this.depthBuffer = source.depthBuffer; this.stencilBuffer = source.stencilBuffer;
this.resolveDepthBuffer = source.resolveDepthBuffer; this.resolveStencilBuffer = source.resolveStencilBuffer;
if ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();
this.samples = source.samples;
return this;
}
dispose() {
this.dispatchEvent( { type: 'dispose' } );
}
}
export { RenderTarget };