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