package kha.graphics4;

class PipelineStateBase {
	public function new() {
		inputLayout = null;
		vertexShader = null;
		fragmentShader = null;
		geometryShader = null;
		tessellationControlShader = null;
		tessellationEvaluationShader = null;

		cullMode = CullMode.None;

		depthWrite = false;
		depthMode = CompareMode.Always;

		stencilFrontMode = CompareMode.Always;
		stencilFrontBothPass = StencilAction.Keep;
		stencilFrontDepthFail = StencilAction.Keep;
		stencilFrontFail = StencilAction.Keep;

		stencilBackMode = CompareMode.Always;
		stencilBackBothPass = StencilAction.Keep;
		stencilBackDepthFail = StencilAction.Keep;
		stencilBackFail = StencilAction.Keep;

		stencilReferenceValue = Static(0);
		stencilReadMask = 0xff;
		stencilWriteMask = 0xff;

		blendSource = BlendingFactor.BlendOne;
		blendDestination = BlendingFactor.BlendZero;
		blendOperation = BlendingOperation.Add;
		alphaBlendSource = BlendingFactor.BlendOne;
		alphaBlendDestination = BlendingFactor.BlendZero;
		alphaBlendOperation = BlendingOperation.Add;

		colorWriteMasksRed = [];
		colorWriteMasksGreen = [];
		colorWriteMasksBlue = [];
		colorWriteMasksAlpha = [];
		for (i in 0...8)
			colorWriteMasksRed.push(true);
		for (i in 0...8)
			colorWriteMasksGreen.push(true);
		for (i in 0...8)
			colorWriteMasksBlue.push(true);
		for (i in 0...8)
			colorWriteMasksAlpha.push(true);

		colorAttachmentCount = 1;
		colorAttachments = [];
		for (i in 0...8)
			colorAttachments.push(TextureFormat.RGBA32);

		depthStencilAttachment = DepthStencilFormat.NoDepthAndStencil;

		conservativeRasterization = false;
	}

	public var inputLayout: Array<VertexStructure>;
	public var vertexShader: VertexShader;
	public var fragmentShader: FragmentShader;
	public var geometryShader: GeometryShader;
	public var tessellationControlShader: TessellationControlShader;
	public var tessellationEvaluationShader: TessellationEvaluationShader;

	public var cullMode: CullMode;

	public var depthWrite: Bool;
	public var depthMode: CompareMode;

	public var stencilFrontMode: CompareMode;
	public var stencilFrontBothPass: StencilAction;
	public var stencilFrontDepthFail: StencilAction;
	public var stencilFrontFail: StencilAction;

	public var stencilBackMode: CompareMode;
	public var stencilBackBothPass: StencilAction;
	public var stencilBackDepthFail: StencilAction;
	public var stencilBackFail: StencilAction;

	public var stencilReferenceValue: StencilValue;
	public var stencilReadMask: Int;
	public var stencilWriteMask: Int;

	// One, Zero deactivates blending
	public var blendSource: BlendingFactor;
	public var blendDestination: BlendingFactor;
	public var blendOperation: BlendingOperation;
	public var alphaBlendSource: BlendingFactor;
	public var alphaBlendDestination: BlendingFactor;
	public var alphaBlendOperation: BlendingOperation;

	public var colorWriteMask(never, set): Bool;
	public var colorWriteMaskRed(get, set): Bool;
	public var colorWriteMaskGreen(get, set): Bool;
	public var colorWriteMaskBlue(get, set): Bool;
	public var colorWriteMaskAlpha(get, set): Bool;

	public var colorWriteMasksRed: Array<Bool>;
	public var colorWriteMasksGreen: Array<Bool>;
	public var colorWriteMasksBlue: Array<Bool>;
	public var colorWriteMasksAlpha: Array<Bool>;

	public var colorAttachmentCount: Int;
	public var colorAttachments: Array<TextureFormat>;

	public var depthStencilAttachment: DepthStencilFormat;

	inline function set_colorWriteMask(value: Bool): Bool {
		return colorWriteMaskRed = colorWriteMaskBlue = colorWriteMaskGreen = colorWriteMaskAlpha = value;
	}

	inline function get_colorWriteMaskRed(): Bool {
		return colorWriteMasksRed[0];
	}

	inline function set_colorWriteMaskRed(value: Bool): Bool {
		return colorWriteMasksRed[0] = value;
	}

	inline function get_colorWriteMaskGreen(): Bool {
		return colorWriteMasksGreen[0];
	}

	inline function set_colorWriteMaskGreen(value: Bool): Bool {
		return colorWriteMasksGreen[0] = value;
	}

	inline function get_colorWriteMaskBlue(): Bool {
		return colorWriteMasksBlue[0];
	}

	inline function set_colorWriteMaskBlue(value: Bool): Bool {
		return colorWriteMasksBlue[0] = value;
	}

	inline function get_colorWriteMaskAlpha(): Bool {
		return colorWriteMasksAlpha[0];
	}

	inline function set_colorWriteMaskAlpha(value: Bool): Bool {
		return colorWriteMasksAlpha[0] = value;
	}

	public var conservativeRasterization: Bool;
}