forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			169 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			169 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.graphics4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import kha.graphics4.FragmentShader;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.VertexData;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.VertexElement;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.VertexShader;
							 | 
						||
| 
								 | 
							
								import kha.graphics4.VertexStructure;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class PipelineState extends PipelineStateBase {
							 | 
						||
| 
								 | 
							
									var _pipeline: Pointer;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function new() {
							 | 
						||
| 
								 | 
							
										super();
							 | 
						||
| 
								 | 
							
										init();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function init(): Void {
							 | 
						||
| 
								 | 
							
										_pipeline = kinc_create_pipeline();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function delete() {
							 | 
						||
| 
								 | 
							
										kinc_delete_pipeline(_pipeline);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function linkWithStructures2(structure0: VertexStructure, structure1: VertexStructure, structure2: VertexStructure, structure3: VertexStructure,
							 | 
						||
| 
								 | 
							
											count: Int): Void {
							 | 
						||
| 
								 | 
							
										kinc_pipeline_set_vertex_shader(_pipeline, vertexShader._shader);
							 | 
						||
| 
								 | 
							
										kinc_pipeline_set_fragment_shader(_pipeline, fragmentShader._shader);
							 | 
						||
| 
								 | 
							
										if (geometryShader != null)
							 | 
						||
| 
								 | 
							
											kinc_pipeline_set_geometry_shader(_pipeline, geometryShader._shader);
							 | 
						||
| 
								 | 
							
										if (tessellationControlShader != null)
							 | 
						||
| 
								 | 
							
											kinc_pipeline_set_tesscontrol_shader(_pipeline, tessellationControlShader._shader);
							 | 
						||
| 
								 | 
							
										if (tessellationEvaluationShader != null)
							 | 
						||
| 
								 | 
							
											kinc_pipeline_set_tesseval_shader(_pipeline, tessellationEvaluationShader._shader);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var structures = [structure0, structure1, structure2, structure3];
							 | 
						||
| 
								 | 
							
										var kinc_structures: Array<Pointer> = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i in 0...count) {
							 | 
						||
| 
								 | 
							
											var kinc_structure = VertexBuffer.kinc_create_vertexstructure(structures[i].instanced);
							 | 
						||
| 
								 | 
							
											kinc_structures.push(kinc_structure);
							 | 
						||
| 
								 | 
							
											for (j in 0...structures[i].size()) {
							 | 
						||
| 
								 | 
							
												var vertexElement = structures[i].get(j);
							 | 
						||
| 
								 | 
							
												VertexBuffer.kinc_vertexstructure_add(kinc_structure, StringHelper.convert(vertexElement.name),
							 | 
						||
| 
								 | 
							
													VertexBuffer.convertVertexDataToKinc(vertexElement.data));
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										kinc_pipeline_compile(_pipeline, kinc_structures[0], count > 1 ? kinc_structures[1] : null, count > 2 ? kinc_structures[2] : null,
							 | 
						||
| 
								 | 
							
											count > 3 ? kinc_structures[3] : null);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function getDepthBufferBits(depthAndStencil: DepthStencilFormat): Int {
							 | 
						||
| 
								 | 
							
										return switch (depthAndStencil) {
							 | 
						||
| 
								 | 
							
											case NoDepthAndStencil: 0;
							 | 
						||
| 
								 | 
							
											case DepthOnly: 24;
							 | 
						||
| 
								 | 
							
											case DepthAutoStencilAuto: 24;
							 | 
						||
| 
								 | 
							
											case Depth24Stencil8: 24;
							 | 
						||
| 
								 | 
							
											case Depth32Stencil8: 32;
							 | 
						||
| 
								 | 
							
											case Depth16: 16;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function getStencilBufferBits(depthAndStencil: DepthStencilFormat): Int {
							 | 
						||
| 
								 | 
							
										return switch (depthAndStencil) {
							 | 
						||
| 
								 | 
							
											case NoDepthAndStencil: 0;
							 | 
						||
| 
								 | 
							
											case DepthOnly: 0;
							 | 
						||
| 
								 | 
							
											case DepthAutoStencilAuto: 8;
							 | 
						||
| 
								 | 
							
											case Depth24Stencil8: 8;
							 | 
						||
| 
								 | 
							
											case Depth32Stencil8: 8;
							 | 
						||
| 
								 | 
							
											case Depth16: 0;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function compile(): Void {
							 | 
						||
| 
								 | 
							
										var stencilReferenceValue = 0;
							 | 
						||
| 
								 | 
							
										switch (this.stencilReferenceValue) {
							 | 
						||
| 
								 | 
							
											case Static(value):
							 | 
						||
| 
								 | 
							
												stencilReferenceValue = value;
							 | 
						||
| 
								 | 
							
											default:
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										kinc_pipeline_set_states(_pipeline, cullMode, depthMode, stencilFrontMode, stencilFrontBothPass, stencilFrontDepthFail, stencilFrontFail,
							 | 
						||
| 
								 | 
							
											stencilBackMode, stencilBackBothPass, stencilBackDepthFail, stencilBackFail, getBlendFunc(blendSource), getBlendFunc(blendDestination),
							 | 
						||
| 
								 | 
							
											getBlendFunc(alphaBlendSource), getBlendFunc(alphaBlendDestination), depthWrite, stencilReferenceValue, stencilReadMask, stencilWriteMask,
							 | 
						||
| 
								 | 
							
											colorWriteMaskRed, colorWriteMaskGreen, colorWriteMaskBlue, colorWriteMaskAlpha, colorAttachmentCount, colorAttachments[0], colorAttachments[1],
							 | 
						||
| 
								 | 
							
											colorAttachments[2], colorAttachments[3], colorAttachments[4], colorAttachments[5], colorAttachments[6], colorAttachments[7],
							 | 
						||
| 
								 | 
							
											getDepthBufferBits(depthStencilAttachment), getStencilBufferBits(depthStencilAttachment), conservativeRasterization);
							 | 
						||
| 
								 | 
							
										linkWithStructures2(inputLayout.length > 0 ? inputLayout[0] : null, inputLayout.length > 1 ? inputLayout[1] : null,
							 | 
						||
| 
								 | 
							
											inputLayout.length > 2 ? inputLayout[2] : null, inputLayout.length > 3 ? inputLayout[3] : null, inputLayout.length);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function getConstantLocation(name: String): kha.graphics4.ConstantLocation {
							 | 
						||
| 
								 | 
							
										return new kha.korehl.graphics4.ConstantLocation(kinc_pipeline_get_constantlocation(_pipeline, StringHelper.convert(name)));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function getTextureUnit(name: String): kha.graphics4.TextureUnit {
							 | 
						||
| 
								 | 
							
										return new kha.korehl.graphics4.TextureUnit(kinc_pipeline_get_textureunit(_pipeline, StringHelper.convert(name)));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function getBlendFunc(factor: BlendingFactor): Int {
							 | 
						||
| 
								 | 
							
										switch (factor) {
							 | 
						||
| 
								 | 
							
											case BlendOne, Undefined:
							 | 
						||
| 
								 | 
							
												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;
							 | 
						||
| 
								 | 
							
											default:
							 | 
						||
| 
								 | 
							
												return 0;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function set(): Void {
							 | 
						||
| 
								 | 
							
										kinc_pipeline_set(_pipeline);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_create_pipeline") static function kinc_create_pipeline(): Pointer {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_delete_pipeline") static function kinc_delete_pipeline(pipeline: Pointer): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_set_fragment_shader") static function kinc_pipeline_set_fragment_shader(pipeline: Pointer, shader: Pointer): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_set_vertex_shader") static function kinc_pipeline_set_vertex_shader(pipeline: Pointer, shader: Pointer): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_set_geometry_shader") static function kinc_pipeline_set_geometry_shader(pipeline: Pointer, shader: Pointer): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_set_tesscontrol_shader") static function kinc_pipeline_set_tesscontrol_shader(pipeline: Pointer, shader: Pointer): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_set_tesseval_shader") static function kinc_pipeline_set_tesseval_shader(pipeline: Pointer, shader: Pointer): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_compile") static function kinc_pipeline_compile(pipeline: Pointer, structure0: Pointer, structure1: Pointer,
							 | 
						||
| 
								 | 
							
										structure2: Pointer, structure3: Pointer): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_get_constantlocation") static function kinc_pipeline_get_constantlocation(pipeline: Pointer, name: hl.Bytes): Pointer {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_get_textureunit") static function kinc_pipeline_get_textureunit(pipeline: Pointer, name: hl.Bytes): Pointer {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_set_states") static function kinc_pipeline_set_states(pipeline: Pointer, cullMode: Int, depthMode: Int,
							 | 
						||
| 
								 | 
							
										stencilFrontMode: Int, stencilFrontBothPass: Int, stencilFrontDepthFail: Int, stencilFrontFail: Int, stencilBackMode: Int, stencilBackBothPass: Int,
							 | 
						||
| 
								 | 
							
										stencilBackDepthFail: Int, stencilBackFail: Int, blendSource: Int, blendDestination: Int, alphaBlendSource: Int, alphaBlendDestination: Int,
							 | 
						||
| 
								 | 
							
										depthWrite: Bool, stencilReferenceValue: Int, stencilReadMask: Int, stencilWriteMask: Int, colorWriteMaskRed: Bool, colorWriteMaskGreen: Bool,
							 | 
						||
| 
								 | 
							
										colorWriteMaskBlue: Bool, colorWriteMaskAlpha: Bool, colorAttachmentCount: Int, colorAttachment0: TextureFormat, colorAttachment1: TextureFormat,
							 | 
						||
| 
								 | 
							
										colorAttachment2: TextureFormat, colorAttachment3: TextureFormat, colorAttachment4: TextureFormat, colorAttachment5: TextureFormat,
							 | 
						||
| 
								 | 
							
										colorAttachment6: TextureFormat, colorAttachment7: TextureFormat, depthAttachmentBits: Int, stencilAttachmentBits: Int,
							 | 
						||
| 
								 | 
							
										conservativeRasterization: Bool): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:hlNative("std", "kinc_pipeline_set") static function kinc_pipeline_set(pipeline: Pointer): Void {}
							 | 
						||
| 
								 | 
							
								}
							 |