RenderPathForward.hx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package arm.render;
  2. import kha.System;
  3. import iron.RenderPath;
  4. import iron.Scene;
  5. import arm.ui.UITrait;
  6. class RenderPathForward {
  7. public static var path: RenderPath;
  8. public static function init(_path: RenderPath) {
  9. path = _path;
  10. }
  11. @:access(iron.RenderPath)
  12. public static function commands() {
  13. if (System.windowWidth() == 0 || System.windowHeight() == 0) return;
  14. #if arm_painter
  15. Inc.beginSplit();
  16. if (Inc.isCached()) return;
  17. // Match projection matrix jitter
  18. var skipTaa = UITrait.inst.splitView;
  19. if (!skipTaa) {
  20. @:privateAccess Scene.active.camera.frame = RenderPathDeferred.taaFrame;
  21. @:privateAccess Scene.active.camera.projectionJitter();
  22. }
  23. Scene.active.camera.buildMatrix();
  24. RenderPathPaint.begin();
  25. drawSplit();
  26. #end // arm_painter
  27. drawGbuffer();
  28. #if arm_painter
  29. RenderPathPaint.draw();
  30. #end
  31. #if kha_direct3d12
  32. if (UITrait.inst.viewportMode == ViewPathTrace) {
  33. RenderPathRaytrace.draw();
  34. return;
  35. }
  36. #end
  37. drawForward();
  38. #if arm_painter
  39. RenderPathPaint.end();
  40. Inc.endSplit();
  41. #end
  42. RenderPathDeferred.taaFrame++;
  43. }
  44. static function drawGbuffer() {
  45. path.setTarget("gbuffer0");
  46. path.clearTarget(null, 1.0);
  47. path.setTarget("gbuffer2");
  48. path.clearTarget(0xff000000);
  49. path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
  50. #if arm_painter
  51. RenderPathPaint.bindLayers();
  52. #end
  53. path.drawMeshes("mesh");
  54. }
  55. static function drawForward() {
  56. path.setDepthFrom("gbuffer1", "gbuffer0");
  57. path.setTarget("gbuffer1");
  58. path.drawSkydome("world_pass/world_pass/world_pass");
  59. path.setDepthFrom("gbuffer1", "gbuffer2");
  60. path.setTarget("buf");
  61. path.bindTarget("gbuffer1", "tex");
  62. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  63. path.setTarget("buf");
  64. var currentG = path.currentG;
  65. path.drawMeshes("overlay");
  66. #if arm_painter
  67. Inc.drawCompass(currentG);
  68. #end
  69. var taaFrame = RenderPathDeferred.taaFrame;
  70. var current = taaFrame % 2 == 0 ? "bufa" : "taa2";
  71. var last = taaFrame % 2 == 0 ? "taa2" : "bufa";
  72. path.setTarget(current);
  73. path.clearTarget(0x00000000);
  74. path.bindTarget("buf", "colorTex");
  75. path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  76. path.setTarget("taa");
  77. path.clearTarget(0x00000000);
  78. path.bindTarget(current, "edgesTex");
  79. path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  80. path.setTarget(current);
  81. path.bindTarget("buf", "colorTex");
  82. path.bindTarget("taa", "blendTex");
  83. path.bindTarget("gbuffer2", "sveloc");
  84. path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  85. #if arm_painter
  86. var skipTaa = UITrait.inst.splitView;
  87. #else
  88. var skipTaa = false;
  89. #end
  90. if (skipTaa) {
  91. path.setTarget("taa");
  92. path.bindTarget(current, "tex");
  93. path.drawShader("shader_datas/copy_pass/copy_pass");
  94. }
  95. else {
  96. path.setTarget("taa");
  97. path.bindTarget(current, "tex");
  98. path.bindTarget(last, "tex2");
  99. path.bindTarget("gbuffer2", "sveloc");
  100. path.drawShader("shader_datas/taa_pass/taa_pass");
  101. }
  102. if (!Inc.ssaa4()) {
  103. path.setTarget("");
  104. path.bindTarget(taaFrame == 0 ? current : "taa", "tex");
  105. path.drawShader("shader_datas/copy_pass/copy_pass");
  106. }
  107. if (Inc.ssaa4()) {
  108. path.setTarget("");
  109. path.bindTarget(taaFrame % 2 == 0 ? "taa2" : "taa", "tex");
  110. path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
  111. }
  112. }
  113. static function drawSplit() {
  114. if (UITrait.inst.splitView) {
  115. if (Context.pdirty > 0) {
  116. var cam = Scene.active.camera;
  117. UITrait.inst.viewIndex = UITrait.inst.viewIndex == 0 ? 1 : 0;
  118. cam.transform.setMatrix(arm.plugin.Camera.inst.views[UITrait.inst.viewIndex]);
  119. cam.buildMatrix();
  120. cam.buildProjection();
  121. drawGbuffer();
  122. #if kha_direct3d12
  123. UITrait.inst.viewportMode == ViewPathTrace ? RenderPathRaytrace.draw() : drawForward();
  124. #else
  125. drawForward();
  126. #end
  127. UITrait.inst.viewIndex = UITrait.inst.viewIndex == 0 ? 1 : 0;
  128. cam.transform.setMatrix(arm.plugin.Camera.inst.views[UITrait.inst.viewIndex]);
  129. cam.buildMatrix();
  130. cam.buildProjection();
  131. }
  132. }
  133. }
  134. }