forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			346 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			346 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha.html5worker; | ||
|  | 
 | ||
|  | import kha.arrays.Float32Array; | ||
|  | import kha.Canvas; | ||
|  | import kha.graphics4.IndexBuffer; | ||
|  | import kha.graphics4.MipMapFilter; | ||
|  | import kha.graphics4.PipelineState; | ||
|  | import kha.graphics4.TextureAddressing; | ||
|  | import kha.graphics4.TextureFilter; | ||
|  | import kha.graphics4.Usage; | ||
|  | import kha.graphics4.VertexBuffer; | ||
|  | import kha.graphics4.VertexStructure; | ||
|  | import kha.math.FastMatrix3; | ||
|  | import kha.math.FastMatrix4; | ||
|  | import kha.math.FastVector2; | ||
|  | import kha.math.FastVector3; | ||
|  | import kha.math.FastVector4; | ||
|  | 
 | ||
|  | class Graphics implements kha.graphics4.Graphics { | ||
|  | 	var renderTarget: Image; | ||
|  | 
 | ||
|  | 	public function new(renderTarget: Canvas = null) { | ||
|  | 		if (Std.isOfType(renderTarget, Image)) { | ||
|  | 			this.renderTarget = cast renderTarget; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function begin(additionalRenderTargets: Array<Canvas> = null): Void { | ||
|  | 		Worker.postMessage({command: 'begin', renderTarget: renderTarget == null ? -1 : renderTarget._rtid}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function beginFace(face: Int): Void {} | ||
|  | 
 | ||
|  | 	public function beginEye(eye: Int): Void {} | ||
|  | 
 | ||
|  | 	public function end(): Void { | ||
|  | 		Worker.postMessage({command: 'end'}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function flush(): Void {} | ||
|  | 
 | ||
|  | 	public function vsynced(): Bool { | ||
|  | 		return true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function refreshRate(): Int { | ||
|  | 		return 60; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function clear(?color: Color, ?depth: Float, ?stencil: Int): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'clear', | ||
|  | 			color: color == null ? null : color.value, | ||
|  | 			hasDepth: depth != null, | ||
|  | 			depth: depth, | ||
|  | 			hasStencil: stencil != null, | ||
|  | 			stencil: stencil | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function viewport(x: Int, y: Int, width: Int, height: Int): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'viewport', | ||
|  | 			x: x, | ||
|  | 			y: y, | ||
|  | 			width: width, | ||
|  | 			height: height | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function createVertexBuffer(vertexCount: Int, structure: VertexStructure, usage: Usage, canRead: Bool = false): kha.graphics4.VertexBuffer { | ||
|  | 		return new VertexBuffer(vertexCount, structure, usage); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setVertexBuffer(vertexBuffer: kha.graphics4.VertexBuffer): Void { | ||
|  | 		Worker.postMessage({command: 'setVertexBuffer', id: vertexBuffer._id}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setVertexBuffers(vertexBuffers: Array<kha.graphics4.VertexBuffer>): Void { | ||
|  | 		var ids = new Array<Int>(); | ||
|  | 		for (buffer in vertexBuffers) { | ||
|  | 			ids.push(buffer._id); | ||
|  | 		} | ||
|  | 		Worker.postMessage({command: 'setVertexBuffers', ids: ids}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function createIndexBuffer(indexCount: Int, usage: Usage, canRead: Bool = false): kha.graphics4.IndexBuffer { | ||
|  | 		return new IndexBuffer(indexCount, usage); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setIndexBuffer(indexBuffer: kha.graphics4.IndexBuffer): Void { | ||
|  | 		Worker.postMessage({command: 'setIndexBuffer', id: indexBuffer._id}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setTexture(stage: kha.graphics4.TextureUnit, texture: kha.Image): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setTexture', | ||
|  | 			stage: cast(stage, kha.html5worker.TextureUnit)._id, | ||
|  | 			texture: texture == null ? -1 : texture.id, | ||
|  | 			renderTarget: texture == null ? -1 : texture._rtid | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setTextureDepth(stage: kha.graphics4.TextureUnit, texture: kha.Image): Void {} | ||
|  | 
 | ||
|  | 	public function setTextureArray(unit: kha.graphics4.TextureUnit, texture: kha.Image): Void {} | ||
|  | 
 | ||
|  | 	public function setVideoTexture(unit: kha.graphics4.TextureUnit, texture: kha.Video): Void {} | ||
|  | 
 | ||
|  | 	public function setImageTexture(unit: kha.graphics4.TextureUnit, texture: kha.Image): Void {} | ||
|  | 
 | ||
|  | 	public function setTextureParameters(texunit: kha.graphics4.TextureUnit, uAddressing: TextureAddressing, vAddressing: TextureAddressing, | ||
|  | 			minificationFilter: TextureFilter, magnificationFilter: TextureFilter, mipmapFilter: MipMapFilter): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setTextureParameters', | ||
|  | 			id: cast(texunit, kha.html5worker.TextureUnit)._id, | ||
|  | 			uAddressing: uAddressing, | ||
|  | 			vAddressing: vAddressing, | ||
|  | 			minificationFilter: minificationFilter, | ||
|  | 			magnificationFilter: magnificationFilter, | ||
|  | 			mipmapFilter: mipmapFilter | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setTexture3DParameters(texunit: kha.graphics4.TextureUnit, uAddressing: TextureAddressing, vAddressing: TextureAddressing, | ||
|  | 		wAddressing: TextureAddressing, minificationFilter: TextureFilter, magnificationFilter: TextureFilter, mipmapFilter: MipMapFilter): Void {} | ||
|  | 
 | ||
|  | 	public function setTextureCompareMode(texunit: kha.graphics4.TextureUnit, enabled: Bool): Void {} | ||
|  | 
 | ||
|  | 	public function setCubeMapCompareMode(texunit: kha.graphics4.TextureUnit, enabled: Bool): Void {} | ||
|  | 
 | ||
|  | 	public function setCubeMap(stage: kha.graphics4.TextureUnit, cubeMap: kha.graphics4.CubeMap): Void {} | ||
|  | 
 | ||
|  | 	public function setCubeMapDepth(stage: kha.graphics4.TextureUnit, cubeMap: kha.graphics4.CubeMap): Void {} | ||
|  | 
 | ||
|  | 	public function setPipeline(pipe: PipelineState): Void { | ||
|  | 		Worker.postMessage({command: 'setPipeline', id: pipe._id}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setStencilReferenceValue(value: Int): Void {} | ||
|  | 
 | ||
|  | 	public function setBool(location: kha.graphics4.ConstantLocation, value: Bool): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setBool', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			value: value | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setInt(location: kha.graphics4.ConstantLocation, value: Int): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setInt', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			value: value | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setInt2(location: kha.graphics4.ConstantLocation, value1: Int, value2: Int): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setInt2', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			_0: value1, | ||
|  | 			_1: value2 | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setInt3(location: kha.graphics4.ConstantLocation, value1: Int, value2: Int, value3: Int): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setInt3', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			_0: value1, | ||
|  | 			_1: value2, | ||
|  | 			_2: value3 | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setInt4(location: kha.graphics4.ConstantLocation, value1: Int, value2: Int, value3: Int, value4: Int): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setInt4', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			_0: value1, | ||
|  | 			_1: value2, | ||
|  | 			_2: value3, | ||
|  | 			_3: value4 | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setInts(location: kha.graphics4.ConstantLocation, values: kha.arrays.Int32Array): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setInts', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			values: values | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setFloat(location: kha.graphics4.ConstantLocation, value: FastFloat): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setFloat', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			value: value | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setFloat2(location: kha.graphics4.ConstantLocation, value1: FastFloat, value2: FastFloat): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setFloat2', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			_0: value1, | ||
|  | 			_1: value2 | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setFloat3(location: kha.graphics4.ConstantLocation, value1: FastFloat, value2: FastFloat, value3: FastFloat): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setFloat3', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			_0: value1, | ||
|  | 			_1: value2, | ||
|  | 			_2: value3 | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setFloat4(location: kha.graphics4.ConstantLocation, value1: FastFloat, value2: FastFloat, value3: FastFloat, value4: FastFloat): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setFloat4', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			_0: value1, | ||
|  | 			_1: value2, | ||
|  | 			_2: value3, | ||
|  | 			_3: value4 | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setFloats(location: kha.graphics4.ConstantLocation, values: Float32Array): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setFloats', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			values: values | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setVector2(location: kha.graphics4.ConstantLocation, value: FastVector2): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setVector2', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			x: value.x, | ||
|  | 			y: value.y | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setVector3(location: kha.graphics4.ConstantLocation, value: FastVector3): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setVector3', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			x: value.x, | ||
|  | 			y: value.y, | ||
|  | 			z: value.z | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function setVector4(location: kha.graphics4.ConstantLocation, value: FastVector4): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setVector4', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			x: value.x, | ||
|  | 			y: value.y, | ||
|  | 			z: value.z, | ||
|  | 			w: value.w | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public inline function setMatrix(location: kha.graphics4.ConstantLocation, matrix: FastMatrix4): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setMatrix4', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			_00: matrix._00, | ||
|  | 			_01: matrix._01, | ||
|  | 			_02: matrix._02, | ||
|  | 			_03: matrix._03, | ||
|  | 			_10: matrix._10, | ||
|  | 			_11: matrix._11, | ||
|  | 			_12: matrix._12, | ||
|  | 			_13: matrix._13, | ||
|  | 			_20: matrix._20, | ||
|  | 			_21: matrix._21, | ||
|  | 			_22: matrix._22, | ||
|  | 			_23: matrix._23, | ||
|  | 			_30: matrix._30, | ||
|  | 			_31: matrix._31, | ||
|  | 			_32: matrix._32, | ||
|  | 			_33: matrix._33 | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public inline function setMatrix3(location: kha.graphics4.ConstantLocation, matrix: FastMatrix3): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'setMatrix3', | ||
|  | 			location: cast(location, kha.html5worker.ConstantLocation)._id, | ||
|  | 			_00: matrix._00, | ||
|  | 			_01: matrix._01, | ||
|  | 			_02: matrix._02, | ||
|  | 			_10: matrix._10, | ||
|  | 			_11: matrix._11, | ||
|  | 			_12: matrix._12, | ||
|  | 			_20: matrix._20, | ||
|  | 			_21: matrix._21, | ||
|  | 			_22: matrix._22 | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function drawIndexedVertices(start: Int = 0, count: Int = -1): Void { | ||
|  | 		Worker.postMessage({command: 'drawIndexedVertices', start: start, count: count}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function scissor(x: Int, y: Int, width: Int, height: Int): Void { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'scissor', | ||
|  | 			x: x, | ||
|  | 			y: y, | ||
|  | 			width: width, | ||
|  | 			height: height | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function disableScissor(): Void { | ||
|  | 		Worker.postMessage({command: 'disableScissor'}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function drawIndexedVerticesInstanced(instanceCount: Int, start: Int = 0, count: Int = -1) { | ||
|  | 		Worker.postMessage({ | ||
|  | 			command: 'drawIndexedVerticesInstanced', | ||
|  | 			instanceCount: instanceCount, | ||
|  | 			start: start, | ||
|  | 			count: count | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function instancedRenderingAvailable(): Bool { | ||
|  | 		return true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function maxBoundTextures(): Int { | ||
|  | 		return 16; | ||
|  | 	} | ||
|  | } |