Files
armorpaint/base/Sources/RenderPathRaytrace.ts
T
luboslenco ee67b50c0f Use ts
2024-01-17 18:53:31 +01:00

203 lines
7.3 KiB
TypeScript

///if (krom_direct3d12 || krom_vulkan || krom_metal)
class RenderPathRaytrace {
static frame = 0;
static ready = false;
static dirty = 0;
static uvScale = 1.0;
static path: RenderPath;
static first = true;
static f32a = new Float32Array(24);
static helpMat = Mat4.identity();
static vb_scale = 1.0;
static vb: VertexBuffer;
static ib: IndexBuffer;
static lastEnvmap: Image = null;
static isBake = false;
///if krom_direct3d12
static ext = ".cso";
///elseif krom_metal
static ext = ".metal";
///else
static ext = ".spirv";
///end
///if is_lab
static lastTexpaint: Image = null;
///end
static init = (_path: RenderPath) => {
RenderPathRaytrace.path = _path;
}
static commands = (useLiveLayer: bool) => {
if (!RenderPathRaytrace.ready || RenderPathRaytrace.isBake) {
RenderPathRaytrace.ready = true;
RenderPathRaytrace.isBake = false;
let mode = Context.raw.pathTraceMode == PathTraceMode.TraceCore ? "core" : "full";
RenderPathRaytrace.raytraceInit("raytrace_brute_" + mode + RenderPathRaytrace.ext);
RenderPathRaytrace.lastEnvmap = null;
}
if (!Context.raw.envmapLoaded) {
Context.loadEnvmap();
Context.updateEnvmap();
}
let probe = Scene.active.world.probe;
let savedEnvmap = Context.raw.showEnvmapBlur ? probe.radianceMipmaps[0] : Context.raw.savedEnvmap;
if (RenderPathRaytrace.lastEnvmap != savedEnvmap) {
RenderPathRaytrace.lastEnvmap = savedEnvmap;
let bnoise_sobol = Scene.active.embedded.get("bnoise_sobol.k");
let bnoise_scramble = Scene.active.embedded.get("bnoise_scramble.k");
let bnoise_rank = Scene.active.embedded.get("bnoise_rank.k");
let l = Base.flatten(true);
Krom.raytraceSetTextures(l.texpaint, l.texpaint_nor, l.texpaint_pack, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
}
///if is_lab
let l = Base.flatten(true);
if (l.texpaint != RenderPathRaytrace.lastTexpaint) {
RenderPathRaytrace.lastTexpaint = l.texpaint;
let bnoise_sobol = Scene.active.embedded.get("bnoise_sobol.k");
let bnoise_scramble = Scene.active.embedded.get("bnoise_scramble.k");
let bnoise_rank = Scene.active.embedded.get("bnoise_rank.k");
Krom.raytraceSetTextures(l.texpaint, l.texpaint_nor, l.texpaint_pack, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
}
///end
if (Context.raw.pdirty > 0 || RenderPathRaytrace.dirty > 0) {
Base.flatten(true);
}
let cam = Scene.active.camera;
let ct = cam.transform;
RenderPathRaytrace.helpMat.setFrom(cam.V);
RenderPathRaytrace.helpMat.multmat(cam.P);
RenderPathRaytrace.helpMat.getInverse(RenderPathRaytrace.helpMat);
RenderPathRaytrace.f32a[0] = ct.worldx();
RenderPathRaytrace.f32a[1] = ct.worldy();
RenderPathRaytrace.f32a[2] = ct.worldz();
RenderPathRaytrace.f32a[3] = RenderPathRaytrace.frame;
///if krom_metal
// frame = (frame % (16)) + 1; // _PAINT
RenderPathRaytrace.frame = RenderPathRaytrace.frame + 1; // _RENDER
///else
RenderPathRaytrace.frame = (RenderPathRaytrace.frame % 4) + 1; // _PAINT
// frame = frame + 1; // _RENDER
///end
RenderPathRaytrace.f32a[4] = RenderPathRaytrace.helpMat._00;
RenderPathRaytrace.f32a[5] = RenderPathRaytrace.helpMat._01;
RenderPathRaytrace.f32a[6] = RenderPathRaytrace.helpMat._02;
RenderPathRaytrace.f32a[7] = RenderPathRaytrace.helpMat._03;
RenderPathRaytrace.f32a[8] = RenderPathRaytrace.helpMat._10;
RenderPathRaytrace.f32a[9] = RenderPathRaytrace.helpMat._11;
RenderPathRaytrace.f32a[10] = RenderPathRaytrace.helpMat._12;
RenderPathRaytrace.f32a[11] = RenderPathRaytrace.helpMat._13;
RenderPathRaytrace.f32a[12] = RenderPathRaytrace.helpMat._20;
RenderPathRaytrace.f32a[13] = RenderPathRaytrace.helpMat._21;
RenderPathRaytrace.f32a[14] = RenderPathRaytrace.helpMat._22;
RenderPathRaytrace.f32a[15] = RenderPathRaytrace.helpMat._23;
RenderPathRaytrace.f32a[16] = RenderPathRaytrace.helpMat._30;
RenderPathRaytrace.f32a[17] = RenderPathRaytrace.helpMat._31;
RenderPathRaytrace.f32a[18] = RenderPathRaytrace.helpMat._32;
RenderPathRaytrace.f32a[19] = RenderPathRaytrace.helpMat._33;
RenderPathRaytrace.f32a[20] = Scene.active.world.probe.raw.strength * 1.5;
if (!Context.raw.showEnvmap) RenderPathRaytrace.f32a[20] = -RenderPathRaytrace.f32a[20];
RenderPathRaytrace.f32a[21] = Context.raw.envmapAngle;
RenderPathRaytrace.f32a[22] = RenderPathRaytrace.uvScale;
///if is_lab
RenderPathRaytrace.f32a[22] *= Scene.active.meshes[0].data.scaleTex;
///end
let framebuffer = RenderPathRaytrace.path.renderTargets.get("buf").image;
Krom.raytraceDispatchRays(framebuffer.renderTarget_, RenderPathRaytrace.f32a.buffer);
if (Context.raw.ddirty == 1 || Context.raw.pdirty == 1) {
///if krom_metal
Context.raw.rdirty = 128;
///else
Context.raw.rdirty = 4;
///end
}
Context.raw.ddirty--;
Context.raw.pdirty--;
Context.raw.rdirty--;
// Context.raw.ddirty = 1; // _RENDER
}
static raytraceInit = (shaderName: string, build = true) => {
if (RenderPathRaytrace.first) {
RenderPathRaytrace.first = false;
Scene.active.embedData("bnoise_sobol.k", () => {});
Scene.active.embedData("bnoise_scramble.k", () => {});
Scene.active.embedData("bnoise_rank.k", () => {});
}
Data.getBlob(shaderName, (shader: ArrayBuffer) => {
if (build) RenderPathRaytrace.buildData();
let bnoise_sobol = Scene.active.embedded.get("bnoise_sobol.k");
let bnoise_scramble = Scene.active.embedded.get("bnoise_scramble.k");
let bnoise_rank = Scene.active.embedded.get("bnoise_rank.k");
Krom.raytraceInit(shader, RenderPathRaytrace.vb.buffer_, RenderPathRaytrace.ib.buffer_, RenderPathRaytrace.vb_scale);
});
}
static buildData = () => {
if (Context.raw.mergedObject == null) UtilMesh.mergeMesh();
///if is_paint
let mo = !Context.layerFilterUsed() ? Context.raw.mergedObject : Context.raw.paintObject;
///else
let mo = Scene.active.meshes[0];
///end
let md = mo.data;
let mo_scale = mo.transform.scale.x; // Uniform scale only
RenderPathRaytrace.vb_scale = md.scalePos * mo_scale;
if (mo.parent != null) RenderPathRaytrace.vb_scale *= mo.parent.transform.scale.x;
RenderPathRaytrace.vb = md.vertexBuffer;
RenderPathRaytrace.ib = md.indexBuffers[0];
}
static draw = (useLiveLayer: bool) => {
let isLive = Config.raw.brush_live && RenderPathPaint.liveLayerDrawn > 0;
if (Context.raw.ddirty > 1 || Context.raw.pdirty > 0 || isLive) RenderPathRaytrace.frame = 0;
///if krom_metal
// Delay path tracing additional samples while painting
let down = Input.getMouse().down() || Input.getPen().down();
if (Context.inViewport() && down) RenderPathRaytrace.frame = 0;
///end
RenderPathRaytrace.commands(useLiveLayer);
if (Config.raw.rp_bloom != false) {
RenderPathBase.drawBloom("buf");
}
RenderPathRaytrace.path.setTarget("buf");
RenderPathRaytrace.path.drawMeshes("overlay");
RenderPathRaytrace.path.setTarget("buf");
RenderPathBase.drawCompass(RenderPathRaytrace.path.currentG);
RenderPathRaytrace.path.setTarget("taa");
RenderPathRaytrace.path.bindTarget("buf", "tex");
RenderPathRaytrace.path.drawShader("shader_datas/compositor_pass/compositor_pass");
RenderPathRaytrace.path.setTarget("");
RenderPathRaytrace.path.bindTarget("taa", "tex");
RenderPathRaytrace.path.drawShader("shader_datas/copy_pass/copy_pass");
if (Config.raw.brush_3d) {
RenderPathPaint.commandsCursor();
}
}
}
///end