Files
armorpaint/Sources/arm/render/RenderPathForward.hx
T

176 lines
4.1 KiB
Haxe
Raw Normal View History

2019-12-05 18:00:38 +01:00
package arm.render;
import kha.System;
import iron.RenderPath;
2019-12-05 22:29:30 +01:00
import iron.Scene;
2020-03-18 20:26:28 +01:00
import arm.ui.UISidebar;
2019-12-05 18:00:38 +01:00
class RenderPathForward {
2019-12-09 00:28:10 +01:00
public static var path: RenderPath;
2019-12-05 18:00:38 +01:00
2019-12-09 00:28:10 +01:00
public static function init(_path: RenderPath) {
2019-12-05 18:00:38 +01:00
path = _path;
}
@:access(iron.RenderPath)
public static function commands() {
if (System.windowWidth() == 0 || System.windowHeight() == 0) return;
2019-12-05 22:29:30 +01:00
#if arm_painter
Inc.beginSplit();
2019-12-09 00:28:10 +01:00
if (Inc.isCached()) return;
2019-12-05 22:29:30 +01:00
// Match projection matrix jitter
2020-03-26 15:22:22 +01:00
var skipTaa = Context.splitView;
2019-12-05 22:29:30 +01:00
if (!skipTaa) {
@:privateAccess Scene.active.camera.frame = RenderPathDeferred.taaFrame;
@:privateAccess Scene.active.camera.projectionJitter();
}
Scene.active.camera.buildMatrix();
RenderPathPaint.begin();
2019-12-05 22:56:37 +01:00
2019-12-05 22:29:30 +01:00
drawSplit();
2019-12-05 22:56:37 +01:00
#end // arm_painter
2019-12-05 22:29:30 +01:00
2019-12-05 22:56:37 +01:00
drawGbuffer();
#if arm_painter
2019-12-05 22:29:30 +01:00
RenderPathPaint.draw();
2019-12-05 22:56:37 +01:00
#end
2019-12-05 22:29:30 +01:00
2019-12-05 22:56:37 +01:00
#if kha_direct3d12
2020-03-26 15:22:22 +01:00
if (Context.viewportMode == ViewPathTrace) {
2019-12-05 22:56:37 +01:00
RenderPathRaytrace.draw();
return;
}
#end
2019-12-05 22:29:30 +01:00
drawForward();
#if arm_painter
RenderPathPaint.end();
Inc.endSplit();
#end
RenderPathDeferred.taaFrame++;
}
2019-12-05 22:56:37 +01:00
static function drawGbuffer() {
2019-12-05 22:29:30 +01:00
path.setTarget("gbuffer0");
2020-05-12 19:24:09 +02:00
#if kha_metal
path.clearTarget(0x00000000, 1.0);
#else
2019-12-05 18:00:38 +01:00
path.clearTarget(null, 1.0);
2020-05-12 19:24:09 +02:00
#end
2019-12-05 22:29:30 +01:00
path.setTarget("gbuffer2");
path.clearTarget(0xff000000);
path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
#if arm_painter
RenderPathPaint.bindLayers();
#end
2019-12-05 18:00:38 +01:00
path.drawMeshes("mesh");
2020-03-09 23:48:12 +01:00
#if arm_painter
RenderPathPaint.unbindLayers();
#end
2019-12-05 22:56:37 +01:00
}
2019-12-05 18:00:38 +01:00
2019-12-05 22:56:37 +01:00
static function drawForward() {
2019-12-05 22:29:30 +01:00
path.setDepthFrom("gbuffer1", "gbuffer0");
path.setTarget("gbuffer1");
2019-12-05 18:00:38 +01:00
path.drawSkydome("world_pass/world_pass/world_pass");
2019-12-05 22:29:30 +01:00
path.setDepthFrom("gbuffer1", "gbuffer2");
2019-12-05 18:00:38 +01:00
path.setTarget("buf");
2019-12-05 22:29:30 +01:00
path.bindTarget("gbuffer1", "tex");
2019-12-05 18:00:38 +01:00
path.drawShader("shader_datas/compositor_pass/compositor_pass");
2019-12-05 22:29:30 +01:00
path.setTarget("buf");
var currentG = path.currentG;
path.drawMeshes("overlay");
#if arm_painter
Inc.drawCompass(currentG);
#end
var taaFrame = RenderPathDeferred.taaFrame;
var current = taaFrame % 2 == 0 ? "bufa" : "taa2";
var last = taaFrame % 2 == 0 ? "taa2" : "bufa";
path.setTarget(current);
path.clearTarget(0x00000000);
path.bindTarget("buf", "colorTex");
path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
2019-12-11 21:30:29 +01:00
path.setTarget("taa");
2019-12-05 22:29:30 +01:00
path.clearTarget(0x00000000);
path.bindTarget(current, "edgesTex");
path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
path.setTarget(current);
path.bindTarget("buf", "colorTex");
2019-12-11 21:30:29 +01:00
path.bindTarget("taa", "blendTex");
2019-12-05 22:29:30 +01:00
path.bindTarget("gbuffer2", "sveloc");
path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
#if arm_painter
2020-03-26 15:22:22 +01:00
var skipTaa = Context.splitView;
2019-12-05 22:29:30 +01:00
#else
var skipTaa = false;
#end
if (skipTaa) {
path.setTarget("taa");
path.bindTarget(current, "tex");
path.drawShader("shader_datas/copy_pass/copy_pass");
}
else {
path.setTarget("taa");
path.bindTarget(current, "tex");
path.bindTarget(last, "tex2");
path.bindTarget("gbuffer2", "sveloc");
path.drawShader("shader_datas/taa_pass/taa_pass");
}
if (!Inc.ssaa4()) {
path.setTarget("");
path.bindTarget(taaFrame == 0 ? current : "taa", "tex");
path.drawShader("shader_datas/copy_pass/copy_pass");
2019-12-05 18:00:38 +01:00
}
if (Inc.ssaa4()) {
path.setTarget("");
2019-12-05 22:29:30 +01:00
path.bindTarget(taaFrame % 2 == 0 ? "taa2" : "taa", "tex");
2019-12-05 18:00:38 +01:00
path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
}
}
2019-12-05 22:29:30 +01:00
static function drawSplit() {
2020-03-26 15:22:22 +01:00
if (Context.splitView) {
2019-12-05 22:29:30 +01:00
if (Context.pdirty > 0) {
var cam = Scene.active.camera;
2020-03-26 15:22:22 +01:00
Context.viewIndex = Context.viewIndex == 0 ? 1 : 0;
cam.transform.setMatrix(arm.plugin.Camera.inst.views[Context.viewIndex]);
2019-12-05 22:29:30 +01:00
cam.buildMatrix();
cam.buildProjection();
2019-12-05 22:56:37 +01:00
drawGbuffer();
2019-12-05 22:29:30 +01:00
#if kha_direct3d12
2020-03-26 15:22:22 +01:00
Context.viewportMode == ViewPathTrace ? RenderPathRaytrace.draw() : drawForward();
2019-12-05 22:29:30 +01:00
#else
drawForward();
#end
2020-03-26 15:22:22 +01:00
Context.viewIndex = Context.viewIndex == 0 ? 1 : 0;
cam.transform.setMatrix(arm.plugin.Camera.inst.views[Context.viewIndex]);
2019-12-05 22:29:30 +01:00
cam.buildMatrix();
cam.buildProjection();
}
}
}
2019-12-05 18:00:38 +01:00
}