96 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha.graphics4; | ||
|  | 
 | ||
|  | import kha.graphics4.FragmentShader; | ||
|  | import kha.graphics4.VertexData; | ||
|  | import kha.graphics4.VertexShader; | ||
|  | import kha.graphics4.VertexStructure; | ||
|  | 
 | ||
|  | class PipelineState extends PipelineStateBase { | ||
|  | 	var pipeline: Dynamic; | ||
|  | 
 | ||
|  | 	public function new() { | ||
|  | 		super(); | ||
|  | 		pipeline = Krom.createPipeline(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function delete() { | ||
|  | 		Krom.deletePipeline(pipeline); | ||
|  | 		pipeline = null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function compile(): Void { | ||
|  | 		var structure0 = inputLayout.length > 0 ? inputLayout[0] : null; | ||
|  | 		var structure1 = inputLayout.length > 1 ? inputLayout[1] : null; | ||
|  | 		var structure2 = inputLayout.length > 2 ? inputLayout[2] : null; | ||
|  | 		var structure3 = inputLayout.length > 3 ? inputLayout[3] : null; | ||
|  | 		var gs = geometryShader != null ? geometryShader.shader : null; | ||
|  | 		var tcs = tessellationControlShader != null ? tessellationControlShader.shader : null; | ||
|  | 		var tes = tessellationEvaluationShader != null ? tessellationEvaluationShader.shader : null; | ||
|  | 		var stencilReferenceValue = 0; | ||
|  | 		switch (this.stencilReferenceValue) { | ||
|  | 			case Static(value): | ||
|  | 				stencilReferenceValue = value; | ||
|  | 			default: | ||
|  | 		} | ||
|  | 		Krom.compilePipeline(pipeline, structure0, structure1, structure2, structure3, inputLayout.length, vertexShader.shader, fragmentShader.shader, gs, | ||
|  | 			tcs, tes, { | ||
|  | 				cullMode: cullMode, | ||
|  | 				depthWrite: this.depthWrite, | ||
|  | 				depthMode: depthMode, | ||
|  | 				stencilMode: stencilFrontMode, | ||
|  | 				stencilBothPass: stencilFrontBothPass, | ||
|  | 				stencilDepthFail: stencilFrontDepthFail, | ||
|  | 				stencilFail: stencilFrontFail, | ||
|  | 				stencilReferenceValue: stencilReferenceValue, | ||
|  | 				stencilReadMask: stencilReadMask, | ||
|  | 				stencilWriteMask: stencilWriteMask, | ||
|  | 				blendSource: convertBlendingFactor(blendSource), | ||
|  | 				blendDestination: convertBlendingFactor(blendDestination), | ||
|  | 				alphaBlendSource: convertBlendingFactor(alphaBlendSource), | ||
|  | 				alphaBlendDestination: convertBlendingFactor(alphaBlendDestination), | ||
|  | 				colorWriteMaskRed: colorWriteMasksRed, | ||
|  | 				colorWriteMaskGreen: colorWriteMasksGreen, | ||
|  | 				colorWriteMaskBlue: colorWriteMasksBlue, | ||
|  | 				colorWriteMaskAlpha: colorWriteMasksAlpha, | ||
|  | 				conservativeRasterization: conservativeRasterization | ||
|  | 			}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function set(): Void { | ||
|  | 		Krom.setPipeline(pipeline); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getConstantLocation(name: String): kha.graphics4.ConstantLocation { | ||
|  | 		return Krom.getConstantLocation(pipeline, name); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getTextureUnit(name: String): kha.graphics4.TextureUnit { | ||
|  | 		return Krom.getTextureUnit(pipeline, name); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function convertBlendingFactor(factor: BlendingFactor): Int { | ||
|  | 		switch (factor) { | ||
|  | 			case Undefined, BlendOne: | ||
|  | 				return 0; | ||
|  | 			case BlendZero: | ||
|  | 				return 1; | ||
|  | 			case SourceAlpha: | ||
|  | 				return 2; | ||
|  | 			case DestinationAlpha: | ||
|  | 				return 3; | ||
|  | 			case InverseSourceAlpha: | ||
|  | 				return 4; | ||
|  | 			case InverseDestinationAlpha: | ||
|  | 				return 5; | ||
|  | 			case SourceColor: | ||
|  | 				return 6; | ||
|  | 			case DestinationColor: | ||
|  | 				return 7; | ||
|  | 			case InverseSourceColor: | ||
|  | 				return 8; | ||
|  | 			case InverseDestinationColor: | ||
|  | 				return 9; | ||
|  | 		} | ||
|  | 	} | ||
|  | } |