RenderPathRaytraceBake.hx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package arm.render;
  2. import iron.RenderPath;
  3. import iron.Scene;
  4. #if (kha_direct3d12 || kha_vulkan || kha_metal)
  5. @:access(arm.render.RenderPathRaytrace)
  6. class RenderPathRaytraceBake {
  7. public static var raysPix = 0;
  8. public static var raysSec = 0;
  9. public static var currentSample = 0;
  10. static var raysTimer = 0.0;
  11. static var raysCounter = 0;
  12. static var lastLayer: kha.Image = null;
  13. static var lastBake = 0;
  14. public static function commands(parsePaintMaterial: ?Bool->Void): Bool {
  15. var path = RenderPathRaytrace.path;
  16. if (!RenderPathRaytrace.ready || !RenderPathRaytrace.isBake || lastBake != Context.raw.bakeType) {
  17. var rebuild = !(RenderPathRaytrace.ready && RenderPathRaytrace.isBake && lastBake != Context.raw.bakeType);
  18. lastBake = Context.raw.bakeType;
  19. RenderPathRaytrace.ready = true;
  20. RenderPathRaytrace.isBake = true;
  21. RenderPathRaytrace.lastEnvmap = null;
  22. lastLayer = null;
  23. if (path.renderTargets.get("baketex0") != null) {
  24. path.renderTargets.get("baketex0").image.unload();
  25. path.renderTargets.get("baketex1").image.unload();
  26. path.renderTargets.get("baketex2").image.unload();
  27. }
  28. {
  29. var t = new RenderTargetRaw();
  30. t.name = "baketex0";
  31. t.width = Config.getTextureResX();
  32. t.height = Config.getTextureResY();
  33. t.format = "RGBA64";
  34. path.createRenderTarget(t);
  35. }
  36. {
  37. var t = new RenderTargetRaw();
  38. t.name = "baketex1";
  39. t.width = Config.getTextureResX();
  40. t.height = Config.getTextureResY();
  41. t.format = "RGBA64";
  42. path.createRenderTarget(t);
  43. }
  44. {
  45. var t = new RenderTargetRaw();
  46. t.name = "baketex2";
  47. t.width = Config.getTextureResX();
  48. t.height = Config.getTextureResY();
  49. t.format = "RGBA64"; // Match raytrace_target format
  50. path.createRenderTarget(t);
  51. }
  52. var _bakeType = Context.raw.bakeType;
  53. Context.raw.bakeType = BakeInit;
  54. parsePaintMaterial();
  55. path.setTarget("baketex0");
  56. path.clearTarget(0x00000000); // Pixels with alpha of 0.0 are skipped during raytracing
  57. path.setTarget("baketex0", ["baketex1"]);
  58. path.drawMeshes("paint");
  59. Context.raw.bakeType = _bakeType;
  60. function _next() {
  61. parsePaintMaterial();
  62. }
  63. App.notifyOnNextFrame(_next);
  64. RenderPathRaytrace.raytraceInit(getBakeShaderName(), rebuild);
  65. return false;
  66. }
  67. if (!Context.raw.envmapLoaded) {
  68. Context.loadEnvmap();
  69. Context.updateEnvmap();
  70. }
  71. var probe = Scene.active.world.probe;
  72. var savedEnvmap = Context.raw.showEnvmapBlur ? probe.radianceMipmaps[0] : Context.raw.savedEnvmap;
  73. if (RenderPathRaytrace.lastEnvmap != savedEnvmap || lastLayer != Context.raw.layer.texpaint) {
  74. RenderPathRaytrace.lastEnvmap = savedEnvmap;
  75. lastLayer = Context.raw.layer.texpaint;
  76. var baketex0 = path.renderTargets.get("baketex0").image;
  77. var baketex1 = path.renderTargets.get("baketex1").image;
  78. var bnoise_sobol = Scene.active.embedded.get("bnoise_sobol.k");
  79. var bnoise_scramble = Scene.active.embedded.get("bnoise_scramble.k");
  80. var bnoise_rank = Scene.active.embedded.get("bnoise_rank.k");
  81. var texpaint_undo = RenderPath.active.renderTargets.get("texpaint_undo" + History.undoI).image;
  82. Krom.raytraceSetTextures(baketex0, baketex1, texpaint_undo, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
  83. }
  84. if (Context.raw.brushTime > 0) {
  85. Context.raw.pdirty = 2;
  86. Context.raw.rdirty = 2;
  87. }
  88. if (Context.raw.pdirty > 0) {
  89. var f32 = RenderPathRaytrace.f32;
  90. f32[0] = RenderPathRaytrace.frame++;
  91. f32[1] = Context.raw.bakeAoStrength;
  92. f32[2] = Context.raw.bakeAoRadius;
  93. f32[3] = Context.raw.bakeAoOffset;
  94. f32[4] = Scene.active.world.probe.raw.strength;
  95. f32[5] = Context.raw.bakeUpAxis;
  96. f32[6] = Context.raw.envmapAngle;
  97. var framebuffer = path.renderTargets.get("baketex2").image;
  98. Krom.raytraceDispatchRays(framebuffer.renderTarget_, f32.buffer);
  99. path.setTarget("texpaint" + Context.raw.layer.id);
  100. path.bindTarget("baketex2", "tex");
  101. path.drawShader("shader_datas/copy_pass/copy_pass");
  102. #if kha_metal
  103. var samplesPerFrame = 4;
  104. #else
  105. var samplesPerFrame = 64;
  106. #end
  107. raysPix = RenderPathRaytrace.frame * samplesPerFrame;
  108. raysCounter += samplesPerFrame;
  109. raysTimer += iron.system.Time.realDelta;
  110. if (raysTimer >= 1) {
  111. raysSec = raysCounter;
  112. raysTimer = 0;
  113. raysCounter = 0;
  114. }
  115. currentSample++;
  116. Krom.delayIdleSleep();
  117. return true;
  118. }
  119. else {
  120. RenderPathRaytrace.frame = 0;
  121. raysTimer = 0;
  122. raysCounter = 0;
  123. currentSample = 0;
  124. return false;
  125. }
  126. }
  127. static function getBakeShaderName(): String {
  128. return
  129. Context.raw.bakeType == BakeAO ? "raytrace_bake_ao" + RenderPathRaytrace.ext :
  130. Context.raw.bakeType == BakeLightmap ? "raytrace_bake_light" + RenderPathRaytrace.ext :
  131. Context.raw.bakeType == BakeBentNormal ? "raytrace_bake_bent" + RenderPathRaytrace.ext :
  132. "raytrace_bake_thick" + RenderPathRaytrace.ext;
  133. }
  134. }
  135. #end