RenderPathRaytrace.hx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package arm.render;
  2. import iron.RenderPath;
  3. import iron.Scene;
  4. #if (kha_direct3d12 || kha_vulkan || kha_metal)
  5. class RenderPathRaytrace {
  6. public static var frame = 0;
  7. public static var ready = false;
  8. public static var dirty = 0;
  9. public static var uvScale = 1.0;
  10. static var path: RenderPath;
  11. static var first = true;
  12. static var f32 = new kha.arrays.Float32Array(24);
  13. static var helpMat = iron.math.Mat4.identity();
  14. static var vb_scale = 1.0;
  15. static var vb: kha.graphics4.VertexBuffer;
  16. static var ib: kha.graphics4.IndexBuffer;
  17. static var lastEnvmap: kha.Image = null;
  18. static var isBake = false;
  19. #if kha_direct3d12
  20. public static inline var ext = ".cso";
  21. #elseif kha_metal
  22. public static inline var ext = ".metal";
  23. #else
  24. public static inline var ext = ".spirv";
  25. #end
  26. #if is_lab
  27. static var lastTexpaint: kha.Image = null;
  28. #end
  29. public static function init(_path: RenderPath) {
  30. path = _path;
  31. }
  32. static function commands(useLiveLayer: Bool) {
  33. if (!ready || isBake) {
  34. ready = true;
  35. isBake = false;
  36. var mode = Context.raw.pathTraceMode == TraceCore ? "core" : "full";
  37. raytraceInit("raytrace_brute_" + mode + ext);
  38. lastEnvmap = null;
  39. }
  40. if (!Context.raw.envmapLoaded) {
  41. Context.loadEnvmap();
  42. Context.updateEnvmap();
  43. }
  44. var probe = Scene.active.world.probe;
  45. var savedEnvmap = Context.raw.showEnvmapBlur ? probe.radianceMipmaps[0] : Context.raw.savedEnvmap;
  46. if (lastEnvmap != savedEnvmap) {
  47. lastEnvmap = savedEnvmap;
  48. var bnoise_sobol = Scene.active.embedded.get("bnoise_sobol.k");
  49. var bnoise_scramble = Scene.active.embedded.get("bnoise_scramble.k");
  50. var bnoise_rank = Scene.active.embedded.get("bnoise_rank.k");
  51. var l = App.flatten(true);
  52. Krom.raytraceSetTextures(l.texpaint, l.texpaint_nor, l.texpaint_pack, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
  53. }
  54. #if is_lab
  55. var l = App.flatten(true);
  56. if (l.texpaint != lastTexpaint) {
  57. lastTexpaint = l.texpaint;
  58. var bnoise_sobol = Scene.active.embedded.get("bnoise_sobol.k");
  59. var bnoise_scramble = Scene.active.embedded.get("bnoise_scramble.k");
  60. var bnoise_rank = Scene.active.embedded.get("bnoise_rank.k");
  61. Krom.raytraceSetTextures(l.texpaint, l.texpaint_nor, l.texpaint_pack, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
  62. }
  63. #end
  64. if (Context.raw.pdirty > 0 || dirty > 0) {
  65. App.flatten(true);
  66. }
  67. var cam = Scene.active.camera;
  68. var ct = cam.transform;
  69. helpMat.setFrom(cam.V);
  70. helpMat.multmat(cam.P);
  71. helpMat.getInverse(helpMat);
  72. f32[0] = ct.worldx();
  73. f32[1] = ct.worldy();
  74. f32[2] = ct.worldz();
  75. f32[3] = frame;
  76. #if kha_metal
  77. // frame = (frame % (16)) + 1; // _PAINT
  78. frame = frame + 1; // _RENDER
  79. #else
  80. frame = (frame % 4) + 1; // _PAINT
  81. // frame = frame + 1; // _RENDER
  82. #end
  83. f32[4] = helpMat._00;
  84. f32[5] = helpMat._01;
  85. f32[6] = helpMat._02;
  86. f32[7] = helpMat._03;
  87. f32[8] = helpMat._10;
  88. f32[9] = helpMat._11;
  89. f32[10] = helpMat._12;
  90. f32[11] = helpMat._13;
  91. f32[12] = helpMat._20;
  92. f32[13] = helpMat._21;
  93. f32[14] = helpMat._22;
  94. f32[15] = helpMat._23;
  95. f32[16] = helpMat._30;
  96. f32[17] = helpMat._31;
  97. f32[18] = helpMat._32;
  98. f32[19] = helpMat._33;
  99. f32[20] = Scene.active.world.probe.raw.strength * 1.5;
  100. if (!Context.raw.showEnvmap) f32[20] = -f32[20];
  101. f32[21] = Context.raw.envmapAngle;
  102. f32[22] = uvScale;
  103. #if is_lab
  104. f32[22] *= Scene.active.meshes[0].data.scaleTex;
  105. #end
  106. var framebuffer = path.renderTargets.get("buf").image;
  107. Krom.raytraceDispatchRays(framebuffer.renderTarget_, f32.buffer);
  108. if (Context.raw.ddirty == 1 || Context.raw.pdirty == 1) {
  109. #if kha_metal
  110. Context.raw.rdirty = 128;
  111. #else
  112. Context.raw.rdirty = 4;
  113. #end
  114. }
  115. Context.raw.ddirty--;
  116. Context.raw.pdirty--;
  117. Context.raw.rdirty--;
  118. // Context.raw.ddirty = 1; // _RENDER
  119. }
  120. static function raytraceInit(shaderName: String, build = true) {
  121. if (first) {
  122. first = false;
  123. Scene.active.embedData("bnoise_sobol.k", function() {});
  124. Scene.active.embedData("bnoise_scramble.k", function() {});
  125. Scene.active.embedData("bnoise_rank.k", function() {});
  126. }
  127. iron.data.Data.getBlob(shaderName, function(shader: kha.Blob) {
  128. if (build) buildData();
  129. var bnoise_sobol = Scene.active.embedded.get("bnoise_sobol.k");
  130. var bnoise_scramble = Scene.active.embedded.get("bnoise_scramble.k");
  131. var bnoise_rank = Scene.active.embedded.get("bnoise_rank.k");
  132. Krom.raytraceInit(shader.bytes.getData(), untyped vb.buffer, untyped ib.buffer, vb_scale);
  133. });
  134. }
  135. static function buildData() {
  136. if (Context.raw.mergedObject == null) arm.util.MeshUtil.mergeMesh();
  137. #if is_paint
  138. var mo = !Context.layerFilterUsed() ? Context.raw.mergedObject : Context.raw.paintObject;
  139. #else
  140. var mo = Scene.active.meshes[0];
  141. #end
  142. var md = mo.data;
  143. var geom = md.geom;
  144. var mo_scale = mo.transform.scale.x; // Uniform scale only
  145. vb_scale = md.scalePos * mo_scale;
  146. if (mo.parent != null) vb_scale *= mo.parent.transform.scale.x;
  147. vb = geom.vertexBuffer;
  148. ib = geom.indexBuffers[0];
  149. }
  150. public static function draw(useLiveLayer: Bool) {
  151. var isLive = Config.raw.brush_live && RenderPathPaint.liveLayerDrawn > 0;
  152. if (Context.raw.ddirty > 1 || Context.raw.pdirty > 0 || isLive) frame = 0;
  153. #if kha_metal
  154. // Delay path tracing additional samples while painting
  155. var down = iron.system.Input.getMouse().down() || iron.system.Input.getPen().down();
  156. if (Context.inViewport() && down) frame = 0;
  157. #end
  158. commands(useLiveLayer);
  159. if (Config.raw.rp_bloom != false) {
  160. RenderPathBase.drawBloom("buf");
  161. }
  162. path.setTarget("buf");
  163. path.drawMeshes("overlay");
  164. path.setTarget("buf");
  165. RenderPathBase.drawCompass(path.currentG);
  166. path.setTarget("taa");
  167. path.bindTarget("buf", "tex");
  168. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  169. path.setTarget("");
  170. path.bindTarget("taa", "tex");
  171. path.drawShader("shader_datas/copy_pass/copy_pass");
  172. if (Config.raw.brush_3d) {
  173. RenderPathPaint.commandsCursor();
  174. }
  175. }
  176. }
  177. #end