196 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			196 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								let vector2 = null;
							 | 
						||
| 
								 | 
							
								let vector4 = null;
							 | 
						||
| 
								 | 
							
								let color4 = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import Color4 from './Color4.js';
							 | 
						||
| 
								 | 
							
								import { Vector2, Vector4, REVISION, createCanvasElement } from 'three';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Backend {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									constructor( parameters = {} ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.parameters = Object.assign( {}, parameters );
							 | 
						||
| 
								 | 
							
										this.data = new WeakMap();
							 | 
						||
| 
								 | 
							
										this.renderer = null;
							 | 
						||
| 
								 | 
							
										this.domElement = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									async init( renderer ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.renderer = renderer;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// render context
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									begin( renderContext ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									finish( renderContext ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// render object
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									draw( renderObject, info ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// program
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createProgram( program ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									destroyProgram( program ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// bindings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createBindings( renderObject ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									updateBindings( renderObject ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// pipeline
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createRenderPipeline( renderObject ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createComputePipeline( computeNode, pipeline ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									destroyPipeline( pipeline ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// cache key
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									needsRenderUpdate( renderObject ) { } // return Boolean ( fast test )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									getRenderCacheKey( renderObject ) { } // return String
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// node builder
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createNodeBuilder( renderObject ) { } // return NodeBuilder (ADD IT)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// textures
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createSampler( texture ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createDefaultTexture( texture ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createTexture( texture ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									copyTextureToBuffer( texture, x, y, width, height ) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// attributes
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createAttribute( attribute ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									createIndexAttribute( attribute ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									updateAttribute( attribute ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									destroyAttribute( attribute ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// canvas
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									getContext() { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									updateSize() { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// utils
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									resolveTimestampAsync( renderContext, type ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									hasFeatureAsync( name ) { } // return Boolean
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									hasFeature( name ) { } // return Boolean
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									getInstanceCount( renderObject ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										const { object, geometry } = renderObject;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return geometry.isInstancedBufferGeometry ? geometry.instanceCount : ( object.isInstancedMesh ? object.count : 1 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									getDrawingBufferSize() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										vector2 = vector2 || new Vector2();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return this.renderer.getDrawingBufferSize( vector2 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									getScissor() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										vector4 = vector4 || new Vector4();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return this.renderer.getScissor( vector4 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									setScissorTest( boolean ) { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									getClearColor() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										const renderer = this.renderer;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										color4 = color4 || new Color4();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										renderer.getClearColor( color4 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										color4.getRGB( color4, this.renderer.currentColorSpace );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return color4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									getDomElement() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										let domElement = this.domElement;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if ( domElement === null ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											domElement = ( this.parameters.canvas !== undefined ) ? this.parameters.canvas : createCanvasElement();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// OffscreenCanvas does not have setAttribute, see #22811
							 | 
						||
| 
								 | 
							
											if ( 'setAttribute' in domElement ) domElement.setAttribute( 'data-engine', `three.js r${REVISION} webgpu` );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											this.domElement = domElement;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return domElement;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// resource properties
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									set( object, value ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.data.set( object, value );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									get( object ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										let map = this.data.get( object );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if ( map === undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											map = {};
							 | 
						||
| 
								 | 
							
											this.data.set( object, map );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return map;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									has( object ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return this.data.has( object );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									delete( object ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.data.delete( object );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export default Backend;
							 |