forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			278 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			278 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.graphics5;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import kha.graphics5.FragmentShader;
							 | 
						||
| 
								 | 
							
								import kha.graphics5.VertexData;
							 | 
						||
| 
								 | 
							
								import kha.graphics5.VertexElement;
							 | 
						||
| 
								 | 
							
								import kha.graphics5.VertexShader;
							 | 
						||
| 
								 | 
							
								import kha.graphics5.VertexStructure;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@:headerCode('
							 | 
						||
| 
								 | 
							
								#include <Kore/Graphics5/Graphics.h>
							 | 
						||
| 
								 | 
							
								#include <Kore/Graphics5/PipelineState.h>
							 | 
						||
| 
								 | 
							
								')
							 | 
						||
| 
								 | 
							
								@:cppFileCode('
							 | 
						||
| 
								 | 
							
								static Kore::Graphics5::ZCompareMode convertCompareMode(int mode) {
							 | 
						||
| 
								 | 
							
									switch (mode) {
							 | 
						||
| 
								 | 
							
									case 0:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::ZCompareAlways;
							 | 
						||
| 
								 | 
							
									case 1:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::ZCompareNever;
							 | 
						||
| 
								 | 
							
									case 2:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::ZCompareEqual;
							 | 
						||
| 
								 | 
							
									case 3:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::ZCompareNotEqual;
							 | 
						||
| 
								 | 
							
									case 4:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::ZCompareLess;
							 | 
						||
| 
								 | 
							
									case 5:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::ZCompareLessEqual;
							 | 
						||
| 
								 | 
							
									case 6:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::ZCompareGreater;
							 | 
						||
| 
								 | 
							
									case 7:
							 | 
						||
| 
								 | 
							
									default:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::ZCompareGreaterEqual;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static Kore::Graphics5::StencilAction convertStencilAction(int action) {
							 | 
						||
| 
								 | 
							
									switch (action) {
							 | 
						||
| 
								 | 
							
									case 0:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::Keep;
							 | 
						||
| 
								 | 
							
									case 1:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::Zero;
							 | 
						||
| 
								 | 
							
									case 2:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::Replace;
							 | 
						||
| 
								 | 
							
									case 3:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::Increment;
							 | 
						||
| 
								 | 
							
									case 4:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::IncrementWrap;
							 | 
						||
| 
								 | 
							
									case 5:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::Decrement;
							 | 
						||
| 
								 | 
							
									case 6:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::DecrementWrap;
							 | 
						||
| 
								 | 
							
									case 7:
							 | 
						||
| 
								 | 
							
									default:
							 | 
						||
| 
								 | 
							
										return Kore::Graphics5::Invert;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								')
							 | 
						||
| 
								 | 
							
								@:headerClassCode("Kore::Graphics5::PipelineState* pipeline;")
							 | 
						||
| 
								 | 
							
								@:keep
							 | 
						||
| 
								 | 
							
								class PipelineState extends PipelineStateBase {
							 | 
						||
| 
								 | 
							
									public function new() {
							 | 
						||
| 
								 | 
							
										super();
							 | 
						||
| 
								 | 
							
										untyped __cpp__('pipeline = new Kore::Graphics5::PipelineState;');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function delete(): Void {
							 | 
						||
| 
								 | 
							
										untyped __cpp__('delete pipeline; pipeline = nullptr;');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode('
							 | 
						||
| 
								 | 
							
										pipeline->vertexShader = vertexShader->shader;
							 | 
						||
| 
								 | 
							
										pipeline->fragmentShader = fragmentShader->shader;
							 | 
						||
| 
								 | 
							
										// if (geometryShader != null()) pipeline->geometryShader = geometryShader->shader;
							 | 
						||
| 
								 | 
							
										// if (tessellationControlShader != null()) pipeline->tessellationControlShader = tessellationControlShader->shader;
							 | 
						||
| 
								 | 
							
										// if (tessellationEvaluationShader != null()) pipeline->tessellationEvaluationShader = tessellationEvaluationShader->shader;
							 | 
						||
| 
								 | 
							
										Kore::Graphics4::VertexStructure s0, s1, s2, s3;
							 | 
						||
| 
								 | 
							
										Kore::Graphics4::VertexStructure* structures2[4] = { &s0, &s1, &s2, &s3 };
							 | 
						||
| 
								 | 
							
										::kha::graphics4::VertexStructure* structures[4] = { &structure0, &structure1, &structure2, &structure3 };
							 | 
						||
| 
								 | 
							
										for (int i1 = 0; i1 < size; ++i1) {
							 | 
						||
| 
								 | 
							
											structures2[i1]->instanced = (*structures[i1])->instanced;
							 | 
						||
| 
								 | 
							
											for (int i2 = 0; i2 < (*structures[i1])->size(); ++i2) {
							 | 
						||
| 
								 | 
							
												Kore::Graphics4::VertexData data;
							 | 
						||
| 
								 | 
							
												switch ((*structures[i1])->get(i2)->data) {
							 | 
						||
| 
								 | 
							
												case 0:
							 | 
						||
| 
								 | 
							
													data = Kore::Graphics4::Float1VertexData;
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
												case 1:
							 | 
						||
| 
								 | 
							
													data = Kore::Graphics4::Float2VertexData;
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
												case 2:
							 | 
						||
| 
								 | 
							
													data = Kore::Graphics4::Float3VertexData;
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
												case 3:
							 | 
						||
| 
								 | 
							
													data = Kore::Graphics4::Float4VertexData;
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
												case 4:
							 | 
						||
| 
								 | 
							
													data = Kore::Graphics4::Float4x4VertexData;
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
												case 5:
							 | 
						||
| 
								 | 
							
													data = Kore::Graphics4::Short2NormVertexData;
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
												case 6:
							 | 
						||
| 
								 | 
							
													data = Kore::Graphics4::Short4NormVertexData;
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												pipeline->inputLayout[i1] = structures2[i1];
							 | 
						||
| 
								 | 
							
												pipeline->inputLayout[i1]->add((*structures[i1])->get(i2)->name, data);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										for (int i = size; i < 16; ++i) {
							 | 
						||
| 
								 | 
							
											pipeline->inputLayout[i] = nullptr;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										pipeline->compile();
							 | 
						||
| 
								 | 
							
									')
							 | 
						||
| 
								 | 
							
									private function linkWithStructures2(structure0: VertexStructure, structure1: VertexStructure, structure2: VertexStructure, structure3: VertexStructure,
							 | 
						||
| 
								 | 
							
										size: Int): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function compile(): Void {
							 | 
						||
| 
								 | 
							
										setStates(cullMode, depthMode, stencilMode, stencilBothPass, stencilDepthFail, stencilFail, getBlendFunc(blendSource), getBlendFunc(blendDestination),
							 | 
						||
| 
								 | 
							
											getBlendFunc(alphaBlendSource), getBlendFunc(alphaBlendDestination));
							 | 
						||
| 
								 | 
							
										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 {
							 | 
						||
| 
								 | 
							
										var location = new kha.kore.graphics4.ConstantLocation();
							 | 
						||
| 
								 | 
							
										initConstantLocation(location, name);
							 | 
						||
| 
								 | 
							
										return location;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// @:functionCode('location->location = pipeline->getConstantLocation(name.c_str());')
							 | 
						||
| 
								 | 
							
									private function initConstantLocation(location: kha.kore.graphics4.ConstantLocation, name: String): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function getTextureUnit(name: String): kha.graphics4.TextureUnit {
							 | 
						||
| 
								 | 
							
										var unit = new kha.kore.graphics4.TextureUnit();
							 | 
						||
| 
								 | 
							
										initTextureUnit(unit, name);
							 | 
						||
| 
								 | 
							
										return unit;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// @:functionCode('unit->unit = pipeline->getTextureUnit(name.c_str());')
							 | 
						||
| 
								 | 
							
									private function initTextureUnit(unit: kha.kore.graphics4.TextureUnit, name: String): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									private 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;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode('
							 | 
						||
| 
								 | 
							
										switch (cullMode) {
							 | 
						||
| 
								 | 
							
										case 0:
							 | 
						||
| 
								 | 
							
											pipeline->cullMode = Kore::Graphics5::Clockwise;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										case 1:
							 | 
						||
| 
								 | 
							
											pipeline->cullMode = Kore::Graphics5::CounterClockwise;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										case 2:
							 | 
						||
| 
								 | 
							
											pipeline->cullMode = Kore::Graphics5::NoCulling;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										switch (depthMode) {
							 | 
						||
| 
								 | 
							
										case 0:
							 | 
						||
| 
								 | 
							
											pipeline->depthMode = Kore::Graphics5::ZCompareAlways;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										case 1:
							 | 
						||
| 
								 | 
							
											pipeline->depthMode = Kore::Graphics5::ZCompareNever;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										case 2:
							 | 
						||
| 
								 | 
							
											pipeline->depthMode = Kore::Graphics5::ZCompareEqual;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										case 3:
							 | 
						||
| 
								 | 
							
											pipeline->depthMode = Kore::Graphics5::ZCompareNotEqual;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										case 4:
							 | 
						||
| 
								 | 
							
											pipeline->depthMode = Kore::Graphics5::ZCompareLess;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										case 5:
							 | 
						||
| 
								 | 
							
											pipeline->depthMode = Kore::Graphics5::ZCompareLessEqual;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										case 6:
							 | 
						||
| 
								 | 
							
											pipeline->depthMode = Kore::Graphics5::ZCompareGreater;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										case 7:
							 | 
						||
| 
								 | 
							
											pipeline->depthMode = Kore::Graphics5::ZCompareGreaterEqual;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										pipeline->depthWrite = depthWrite;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										pipeline->stencilMode = convertCompareMode(stencilMode);
							 | 
						||
| 
								 | 
							
										pipeline->stencilBothPass = convertStencilAction(stencilBothPass);
							 | 
						||
| 
								 | 
							
										pipeline->stencilDepthFail = convertStencilAction(stencilDepthFail);
							 | 
						||
| 
								 | 
							
										pipeline->stencilFail = convertStencilAction(stencilFail);
							 | 
						||
| 
								 | 
							
										pipeline->stencilReferenceValue = stencilReferenceValue;
							 | 
						||
| 
								 | 
							
										pipeline->stencilReadMask = stencilReadMask;
							 | 
						||
| 
								 | 
							
										pipeline->stencilWriteMask = stencilWriteMask;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										pipeline->blendSource = (Kore::Graphics5::BlendingOperation)blendSource;
							 | 
						||
| 
								 | 
							
										pipeline->blendDestination = (Kore::Graphics5::BlendingOperation)blendDestination;
							 | 
						||
| 
								 | 
							
										pipeline->alphaBlendSource = (Kore::Graphics5::BlendingOperation)alphaBlendSource;
							 | 
						||
| 
								 | 
							
										pipeline->alphaBlendDestination = (Kore::Graphics5::BlendingOperation)alphaBlendDestination;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (int i = 0; i < 8; ++i) {
							 | 
						||
| 
								 | 
							
											pipeline->colorWriteMaskRed[i] = colorWriteMasksRed[i];
							 | 
						||
| 
								 | 
							
											pipeline->colorWriteMaskGreen[i] = colorWriteMasksGreen[i];
							 | 
						||
| 
								 | 
							
											pipeline->colorWriteMaskBlue[i] = colorWriteMasksBlue[i];
							 | 
						||
| 
								 | 
							
											pipeline->colorWriteMaskAlpha[i] = colorWriteMasksAlpha[i];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										pipeline->conservativeRasterization = conservativeRasterization;
							 | 
						||
| 
								 | 
							
									')
							 | 
						||
| 
								 | 
							
									private function setStates(cullMode: Int, depthMode: Int, stencilMode: Int, stencilBothPass: Int, stencilDepthFail: Int, stencilFail: Int,
							 | 
						||
| 
								 | 
							
										blendSource: Int, blendDestination: Int, alphaBlendSource: Int, alphaBlendDestination: Int): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// @:functionCode('Kore::Graphics4::setPipeline(pipeline);')
							 | 
						||
| 
								 | 
							
									// private function set2(): Void {
							 | 
						||
| 
								 | 
							
									// }
							 | 
						||
| 
								 | 
							
									// public function set(): Void {
							 | 
						||
| 
								 | 
							
									// 	set2();
							 | 
						||
| 
								 | 
							
									// }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									public static function _unused1(): VertexElement {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									public static function _unused2(): VertexData {
							 | 
						||
| 
								 | 
							
										return Float1;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									public static function _unused3(): VertexShader {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									public static function _unused4(): FragmentShader {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									public static function _unused5(): GeometryShader {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									public static function _unused6(): TessellationControlShader {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									public static function _unused7(): TessellationEvaluationShader {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |