| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- package arm.render;
- import iron.RenderPath;
- import iron.Scene;
- #if (kha_direct3d12 || kha_vulkan)
- @:access(arm.render.RenderPathRaytrace)
- class RenderPathRaytraceBake {
- public static var raysPix = 0;
- public static var raysSec = 0;
- static var raysTimer = 0.0;
- static var raysCounter = 0;
- static var lastLayer: kha.Image = null;
- static var lastBake = 0;
- public static function commands(parsePaintMaterial: ?Bool->Void): Bool {
- var path = RenderPathRaytrace.path;
- if (!RenderPathRaytrace.ready || !RenderPathRaytrace.isBake || lastBake != Context.bakeType) {
- var rebuild = !(RenderPathRaytrace.ready && RenderPathRaytrace.isBake && lastBake != Context.bakeType);
- lastBake = Context.bakeType;
- RenderPathRaytrace.ready = true;
- RenderPathRaytrace.isBake = true;
- RenderPathRaytrace.lastEnvmap = null;
- lastLayer = null;
- if (path.renderTargets.get("baketex0") != null) {
- path.renderTargets.get("baketex0").image.unload();
- path.renderTargets.get("baketex1").image.unload();
- path.renderTargets.get("baketex2").image.unload();
- }
- {
- var t = new RenderTargetRaw();
- t.name = "baketex0";
- t.width = Config.getTextureResX();
- t.height = Config.getTextureResY();
- t.format = "RGBA64";
- path.createRenderTarget(t);
- }
- {
- var t = new RenderTargetRaw();
- t.name = "baketex1";
- t.width = Config.getTextureResX();
- t.height = Config.getTextureResY();
- t.format = "RGBA64";
- path.createRenderTarget(t);
- }
- {
- var t = new RenderTargetRaw();
- t.name = "baketex2";
- t.width = Config.getTextureResX();
- t.height = Config.getTextureResY();
- t.format = "RGBA64"; // Match raytrace_target format
- path.createRenderTarget(t);
- }
- var _bakeType = Context.bakeType;
- Context.bakeType = BakeInit;
- parsePaintMaterial();
- path.setTarget("baketex0");
- path.clearTarget(0x00000000); // Pixels with alpha of 0.0 are skipped during raytracing
- path.setTarget("baketex0", ["baketex1"]);
- path.drawMeshes("paint");
- Context.bakeType = _bakeType;
- function _next() {
- parsePaintMaterial();
- }
- App.notifyOnNextFrame(_next);
- RenderPathRaytrace.raytraceInit(getBakeShaderName(), rebuild);
- return false;
- }
- if (!Context.envmapLoaded) Context.loadEnvmap();
- var probe = Scene.active.world.probe;
- var savedEnvmap = Context.showEnvmapBlur ? probe.radianceMipmaps[0] : Context.savedEnvmap;
- if (RenderPathRaytrace.lastEnvmap != savedEnvmap || lastLayer != Context.layer.texpaint) {
- RenderPathRaytrace.lastEnvmap = savedEnvmap;
- lastLayer = Context.layer.texpaint;
- var baketex0 = path.renderTargets.get("baketex0").image;
- var baketex1 = path.renderTargets.get("baketex1").image;
- var bnoise_sobol = Scene.active.embedded.get("bnoise_sobol.k");
- var bnoise_scramble = Scene.active.embedded.get("bnoise_scramble.k");
- var bnoise_rank = Scene.active.embedded.get("bnoise_rank.k");
- var texpaint_undo = RenderPath.active.renderTargets.get("texpaint_undo" + History.undoI).image;
- Krom.raytraceSetTextures(baketex0.renderTarget_, baketex1.renderTarget_, texpaint_undo.renderTarget_, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
- }
- if (Context.brushTime > 0) {
- Context.pdirty = 2;
- Context.rdirty = 2;
- }
- if (Context.pdirty > 0) {
- var f32 = RenderPathRaytrace.f32;
- f32[0] = RenderPathRaytrace.frame++;
- f32[1] = Context.bakeAoStrength;
- f32[2] = Context.bakeAoRadius;
- f32[3] = Context.bakeAoOffset;
- f32[4] = Scene.active.world.probe.raw.strength;
- f32[5] = Context.bakeUpAxis;
- f32[6] = Context.envmapAngle;
- var framebuffer = path.renderTargets.get("baketex2").image;
- Krom.raytraceDispatchRays(framebuffer.renderTarget_, f32.buffer);
- path.setTarget("texpaint" + Context.layer.id);
- path.bindTarget("baketex2", "tex");
- path.drawShader("shader_datas/copy_pass/copy_pass");
- raysPix = RenderPathRaytrace.frame * 64;
- raysCounter += 64;
- raysTimer += iron.system.Time.realDelta;
- if (raysTimer >= 1) {
- raysSec = raysCounter;
- raysTimer = 0;
- raysCounter = 0;
- }
- return true;
- }
- else {
- RenderPathRaytrace.frame = 0;
- raysTimer = 0;
- raysCounter = 0;
- return false;
- }
- }
- static function getBakeShaderName(): String {
- return
- Context.bakeType == BakeAO ? "raytrace_bake_ao" + RenderPathRaytrace.ext :
- Context.bakeType == BakeLightmap ? "raytrace_bake_light" + RenderPathRaytrace.ext :
- Context.bakeType == BakeBentNormal ? "raytrace_bake_bent" + RenderPathRaytrace.ext :
- "raytrace_bake_thick" + RenderPathRaytrace.ext;
- }
- }
- #end
|