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