Basic render path config

This commit is contained in:
luboslenco 2018-08-29 23:01:23 +02:00
parent 7cab97dea8
commit d2046c5169
8 changed files with 236 additions and 150 deletions

View file

@ -12,22 +12,21 @@ class Config {
}
public static function save() {
var path = iron.data.Data.dataPath + 'config.arm';
var bytes = haxe.io.Bytes.ofString(haxe.Json.stringify(raw));
#if kha_krom
Krom.fileSaveBytes("./config.arm", bytes.getData());
Krom.fileSaveBytes(path, bytes.getData());
#elseif kha_kore
sys.io.File.saveBytes("./config.arm", bytes);
sys.io.File.saveBytes(path, bytes);
#end
}
public static function reset() {
}
// public static function reset() {}
}
typedef TConfig = {
@:optional var debug_console:Null<Bool>;
@:optional var window_mode:Null<Int>; // window, borderless, fullscreen
@:optional var window_mode:Null<Int>; // window, fullscreen
@:optional var window_w:Null<Int>;
@:optional var window_h:Null<Int>;
@:optional var window_resizable:Null<Bool>;
@ -36,11 +35,11 @@ typedef TConfig = {
@:optional var window_vsync:Null<Bool>;
@:optional var window_msaa:Null<Int>;
@:optional var window_scale:Null<Float>;
@:optional var rp_supersample:Null<Float>;
@:optional var rp_shadowmap:Null<Int>;
@:optional var rp_voxelgi:Null<Int>; // off, ao, ao_revox, gi, gi_revox
// @:optional var rp_supersample:Null<Float>;
@:optional var rp_shadowmap:Null<Int>; // size
@:optional var rp_ssgi:Null<Bool>;
@:optional var rp_ssr:Null<Bool>;
@:optional var rp_bloom:Null<Bool>;
@:optional var rp_motionblur:Null<Bool>;
// @:optional var rp_gi:Null<Bool>;
}

View file

@ -90,6 +90,25 @@ class Inc {
return target;
}
public static function applyConfig() {
#if arm_config
// Resize shadow map
var l = path.getLight(path.currentLightIndex);
l.data.raw.shadowmap_size = armory.data.Config.raw.rp_shadowmap;
var rt = path.renderTargets.get("shadowmap");
if (rt != null) {
rt.unload();
path.renderTargets.remove("shadowmap");
}
rt = path.renderTargets.get("shadowmapCube");
if (rt != null) {
rt.unload();
path.renderTargets.remove("shadowmapCube");
}
#end
}
#if (rp_shadowmap && kha_webgl)
public static function initEmpty() {
// Bind empty when requested target is not found

View file

@ -9,10 +9,13 @@ class RenderPathCreator {
#if (rp_renderer == "Forward")
public static var drawMeshes:Void->Void = RenderPathForward.drawMeshes;
public static var applyConfig:Void->Void = RenderPathForward.applyConfig;
#elseif (rp_renderer == "Deferred")
public static var drawMeshes:Void->Void = RenderPathDeferred.drawMeshes;
public static var applyConfig:Void->Void = RenderPathDeferred.applyConfig;
#else
public static var drawMeshes:Void->Void = function() {};
public static var applyConfig:Void->Void = function() {};
#end
public static function get():RenderPath {

View file

@ -17,6 +17,10 @@ class RenderPathDeferred {
path.drawMeshes("mesh");
}
public static function applyConfig() {
Inc.applyConfig();
}
public static function init(_path:RenderPath) {
path = _path;
@ -381,6 +385,21 @@ class RenderPathDeferred {
}
}
#end
#if arm_config
{
var t = new RenderTargetRaw();
t.name = "empty_white";
t.width = 1;
t.height = 1;
t.format = 'R8';
var rt = new RenderTarget(t);
var b = haxe.io.Bytes.alloc(1);
b.set(0, 255);
rt.image = kha.Image.fromBytes(b, t.width, t.height, kha.graphics4.TextureFormat.L8);
path.renderTargets.set(t.name, rt);
}
#end
}
@:access(iron.RenderPath)
@ -434,40 +453,44 @@ class RenderPathDeferred {
#if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
{
path.setTarget("bufa");
path.bindTarget("_main", "gbufferD");
path.bindTarget("gbuffer0", "gbuffer0");
#if (rp_ssgi == "RTGI")
path.bindTarget("gbuffer1", "gbuffer1");
#end
path.drawShader("shader_datas/ssgi_pass/ssgi_pass");
if (armory.data.Config.raw.rp_ssgi != false) {
path.setTarget("bufa");
path.bindTarget("_main", "gbufferD");
path.bindTarget("gbuffer0", "gbuffer0");
#if (rp_ssgi == "RTGI")
path.bindTarget("gbuffer1", "gbuffer1");
#end
path.drawShader("shader_datas/ssgi_pass/ssgi_pass");
path.setTarget("bufb");
path.bindTarget("gbuffer0", "gbuffer0");
path.bindTarget("bufa", "tex");
path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_x");
path.setTarget("bufb");
path.bindTarget("gbuffer0", "gbuffer0");
path.bindTarget("bufa", "tex");
path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_x");
path.setTarget("bufa");
path.bindTarget("gbuffer0", "gbuffer0");
path.bindTarget("bufb", "tex");
path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_y");
path.setTarget("bufa");
path.bindTarget("gbuffer0", "gbuffer0");
path.bindTarget("bufb", "tex");
path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_y");
}
}
#elseif (rp_ssgi == "SSAO")
{
path.setTarget("bufa");
path.bindTarget("_main", "gbufferD");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/ssao_pass/ssao_pass");
{
if (armory.data.Config.raw.rp_ssgi != false) {
path.setTarget("bufa");
path.bindTarget("_main", "gbufferD");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/ssao_pass/ssao_pass");
path.setTarget("bufb");
path.bindTarget("bufa", "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
path.setTarget("bufb");
path.bindTarget("bufa", "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
path.setTarget("bufa");
path.bindTarget("bufb", "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
path.setTarget("bufa");
path.bindTarget("bufb", "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
}
}
#end
@ -533,7 +556,12 @@ class RenderPathDeferred {
path.bindTarget("gbuffer1", "gbuffer1");
#if (rp_ssgi != "Off")
{
path.bindTarget("bufa", "ssaotex");
if (armory.data.Config.raw.rp_ssgi != false) {
path.bindTarget("bufa", "ssaotex");
}
else {
path.bindTarget("empty_white", "ssaotex");
}
}
#end
#if (rp_gi != "Off")
@ -659,41 +687,43 @@ class RenderPathDeferred {
#if rp_bloom
{
path.setTarget("bloomtex");
path.bindTarget("tex", "tex");
path.drawShader("shader_datas/bloom_pass/bloom_pass");
if (armory.data.Config.raw.rp_ssr != false) {
path.setTarget("bloomtex");
path.bindTarget("tex", "tex");
path.drawShader("shader_datas/bloom_pass/bloom_pass");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("tex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
path.setTarget("tex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
}
}
#end
@ -716,51 +746,55 @@ class RenderPathDeferred {
#if rp_ssr
{
#if rp_ssr_half
var targeta = "ssra";
var targetb = "ssrb";
#else
var targeta = "buf";
var targetb = "gbuffer1";
#end
path.setTarget(targeta);
path.bindTarget("tex", "tex");
path.bindTarget("_main", "gbufferD");
path.bindTarget("gbuffer0", "gbuffer0");
path.bindTarget("gbuffer1", "gbuffer1");
path.drawShader("shader_datas/ssr_pass/ssr_pass");
if (armory.data.Config.raw.rp_ssr != false) {
#if rp_ssr_half
var targeta = "ssra";
var targetb = "ssrb";
#else
var targeta = "buf";
var targetb = "gbuffer1";
#end
path.setTarget(targeta);
path.bindTarget("tex", "tex");
path.bindTarget("_main", "gbufferD");
path.bindTarget("gbuffer0", "gbuffer0");
path.bindTarget("gbuffer1", "gbuffer1");
path.drawShader("shader_datas/ssr_pass/ssr_pass");
path.setTarget(targetb);
path.bindTarget(targeta, "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
path.setTarget(targetb);
path.bindTarget(targeta, "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
path.setTarget("tex");
path.bindTarget(targetb, "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
path.setTarget("tex");
path.bindTarget(targetb, "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
}
}
#end
#if ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
{
path.setTarget("buf");
path.bindTarget("tex", "tex");
path.bindTarget("gbuffer0", "gbuffer0");
#if (rp_motionblur == "Camera")
{
path.bindTarget("_main", "gbufferD");
path.drawShader("shader_datas/motion_blur_pass/motion_blur_pass");
if (armory.data.Config.raw.rp_motionblur != false) {
path.setTarget("buf");
path.bindTarget("tex", "tex");
path.bindTarget("gbuffer0", "gbuffer0");
#if (rp_motionblur == "Camera")
{
path.bindTarget("_main", "gbufferD");
path.drawShader("shader_datas/motion_blur_pass/motion_blur_pass");
}
#else
{
path.bindTarget("gbuffer2", "sveloc");
path.drawShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
}
#end
path.setTarget("tex");
path.bindTarget("buf", "tex");
path.drawShader("shader_datas/copy_pass/copy_pass");
}
#else
{
path.bindTarget("gbuffer2", "sveloc");
path.drawShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
}
#end
path.setTarget("tex");
path.bindTarget("buf", "tex");
path.drawShader("shader_datas/copy_pass/copy_pass");
}
#end

View file

@ -36,6 +36,10 @@ class RenderPathForward {
#end
}
public static function applyConfig() {
Inc.applyConfig();
}
public static function init(_path:RenderPath) {
path = _path;
@ -378,41 +382,43 @@ class RenderPathForward {
#if rp_bloom
{
path.setTarget("bloomtex");
path.bindTarget("lbuf", "tex");
path.drawShader("shader_datas/bloom_pass/bloom_pass");
if (armory.data.Config.raw.rp_ssr != false) {
path.setTarget("bloomtex");
path.bindTarget("lbuf", "tex");
path.drawShader("shader_datas/bloom_pass/bloom_pass");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("lbuf");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
path.setTarget("lbuf");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
}
}
#end

View file

@ -14,28 +14,29 @@ class Starter {
if (tasks > 0) return;
if (armory.data.Config.raw == null) armory.data.Config.raw = {};
var config = armory.data.Config.raw;
if (config.window_mode == null) config.window_mode = mode;
if (config.window_resizable == null) config.window_resizable = resize;
if (config.window_minimizable == null) config.window_minimizable = min;
if (config.window_maximizable == null) config.window_maximizable = max;
if (config.window_w == null) config.window_w = w;
if (config.window_h == null) config.window_h = h;
if (config.window_msaa == null) config.window_msaa = msaa;
if (config.window_vsync == null) config.window_vsync = vsync;
var c = armory.data.Config.raw;
if (c.window_mode == null) c.window_mode = mode;
if (c.window_resizable == null) c.window_resizable = resize;
if (c.window_minimizable == null) c.window_minimizable = min;
if (c.window_maximizable == null) c.window_maximizable = max;
if (c.window_w == null) c.window_w = w;
if (c.window_h == null) c.window_h = h;
if (c.window_msaa == null) c.window_msaa = msaa;
if (c.window_vsync == null) c.window_vsync = vsync;
armory.object.Uniforms.register();
var windowMode = config.window_mode == 0 ? kha.WindowMode.Window : kha.WindowMode.Fullscreen;
var windowMode = c.window_mode == 0 ? kha.WindowMode.Window : kha.WindowMode.Fullscreen;
#if (kha_version < 1807) // TODO: deprecated
if (windowMode == kha.WindowMode.Fullscreen) { windowMode = kha.WindowMode.BorderlessWindow; config.window_w = kha.Display.width(0); config.window_h = kha.Display.height(0); }
kha.System.init({title: Main.projectName, width: config.window_w, height: config.window_h, samplesPerPixel: config.window_msaa, vSync: config.window_vsync, windowMode: windowMode, resizable: config.window_resizable, maximizable: config.window_maximizable, minimizable: config.window_minimizable}, function() {
if (windowMode == kha.WindowMode.Fullscreen) { windowMode = kha.WindowMode.BorderlessWindow; c.window_w = kha.Display.width(0); c.window_h = kha.Display.height(0); }
kha.System.init({title: Main.projectName, width: c.window_w, height: c.window_h, samplesPerPixel: c.window_msaa, vSync: c.window_vsync, windowMode: windowMode, resizable: c.window_resizable, maximizable: c.window_maximizable, minimizable: c.window_minimizable}, function() {
#else
var windowFeatures = 0;
if (config.window_resizable) windowFeatures |= kha.WindowOptions.FeatureResizable;
if (config.window_maximizable) windowFeatures |= kha.WindowOptions.FeatureMaximizable;
if (config.window_minimizable) windowFeatures |= kha.WindowOptions.FeatureMinimizable;
kha.System.start({title: Main.projectName, width: config.window_w, height: config.window_h, window: {mode: windowMode, windowFeatures: windowFeatures}, framebuffer: {samplesPerPixel: config.window_msaa, verticalSync: config.window_vsync}}, function(window:kha.Window) {
if (c.window_resizable) windowFeatures |= kha.WindowOptions.FeatureResizable;
if (c.window_maximizable) windowFeatures |= kha.WindowOptions.FeatureMaximizable;
if (c.window_minimizable) windowFeatures |= kha.WindowOptions.FeatureMinimizable;
kha.System.start({title: Main.projectName, width: c.window_w, height: c.window_h, window: {mode: windowMode, windowFeatures: windowFeatures}, framebuffer: {samplesPerPixel: c.window_msaa, verticalSync: c.window_vsync}}, function(window:kha.Window) {
#end
iron.App.init(function() {
#if arm_loadscreen

View file

@ -50,14 +50,30 @@ class CanvasScript extends Trait {
var all = armory.system.Event.get(e);
if (all != null) for (entry in all) entry.onEvent();
}
if (onReady != null) { onReady(); onReady = null; }
});
}
var onReady:Void->Void = null;
public function notifyOnReady(f:Void->Void) {
onReady = f;
}
// Defines layout
public function getElement(name:String):TElement {
for (e in canvas.elements) if (e.name == name) return e;
return null;
}
// Contains data
@:access(zui.Canvas)
@:access(zui.Handle)
public function getHandle(name:String):Handle {
// Consider this a temporary solution
return Canvas.h.children[getElement(name).id];
}
#else
public function new(canvasName:String) { super(); }

View file

@ -285,15 +285,23 @@ def write_config(resx, resy):
os.makedirs(p)
output = {}
output['window_mode'] = get_winmode(wrd.arm_winmode)
output['window_resizable'] = wrd.arm_winresize
output['window_minimizable'] = wrd.arm_winminimize
output['window_maximizable'] = wrd.arm_winmaximize
output['window_w'] = int(resx)
output['window_h'] = int(resy)
output['window_scale'] = 1.0
output['window_resizable'] = wrd.arm_winresize
output['window_maximizable'] = wrd.arm_winmaximize
output['window_minimizable'] = wrd.arm_winminimize
output['window_vsync'] = wrd.arm_vsync
rpdat = arm.utils.get_rp()
output['window_msaa'] = int(rpdat.arm_samples_per_pixel)
output['window_vsync'] = wrd.arm_vsync
output['window_scale'] = 1.0
output['rp_supersample'] = float(rpdat.rp_supersampling)
rp_shadowmap = 0 if rpdat.rp_shadowmap == 'Off' else int(rpdat.rp_shadowmap)
output['rp_shadowmap'] = rp_shadowmap
output['rp_ssgi'] = rpdat.rp_ssgi != 'Off'
output['rp_ssr'] = rpdat.rp_ssr != 'Off'
output['rp_bloom'] = rpdat.rp_bloom != 'Off'
output['rp_motionblur'] = rpdat.rp_motionblur != 'Off'
output['rp_gi'] = rpdat.rp_gi != 'Off'
with open(p + '/config.arm', 'w') as f:
f.write(json.dumps(output, sort_keys=True, indent=4))