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; |