RenderPathForward.hx 5.3 KB

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