RenderPathPreview.hx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package arm.render;
  2. import iron.RenderPath;
  3. import arm.util.RenderUtil;
  4. @:access(iron.RenderPath)
  5. class RenderPathPreview {
  6. public static var path: RenderPath;
  7. public static function init(_path: RenderPath) {
  8. path = _path;
  9. {
  10. var t = new RenderTargetRaw();
  11. t.name = "texpreview";
  12. t.width = 1;
  13. t.height = 1;
  14. t.format = "RGBA32";
  15. path.createRenderTarget(t);
  16. }
  17. {
  18. var t = new RenderTargetRaw();
  19. t.name = "texpreview_icon";
  20. t.width = 1;
  21. t.height = 1;
  22. t.format = "RGBA32";
  23. path.createRenderTarget(t);
  24. }
  25. path.createDepthBuffer("mmain", "DEPTH24");
  26. {
  27. var t = new RenderTargetRaw();
  28. t.name = "mtex";
  29. t.width = Std.int(RenderUtil.materialPreviewSize * 2.0);
  30. t.height = Std.int(RenderUtil.materialPreviewSize * 2.0);
  31. t.format = "RGBA64";
  32. t.scale = RenderPathBase.getSuperSampling();
  33. #if kha_opengl
  34. t.depth_buffer = "mmain";
  35. #end
  36. path.createRenderTarget(t);
  37. }
  38. {
  39. var t = new RenderTargetRaw();
  40. t.name = "mgbuffer0";
  41. t.width = Std.int(RenderUtil.materialPreviewSize * 2.0);
  42. t.height = Std.int(RenderUtil.materialPreviewSize * 2.0);
  43. t.format = "RGBA64";
  44. t.scale = RenderPathBase.getSuperSampling();
  45. t.depth_buffer = "mmain";
  46. path.createRenderTarget(t);
  47. }
  48. {
  49. var t = new RenderTargetRaw();
  50. t.name = "mgbuffer1";
  51. t.width = Std.int(RenderUtil.materialPreviewSize * 2.0);
  52. t.height = Std.int(RenderUtil.materialPreviewSize * 2.0);
  53. t.format = "RGBA64";
  54. t.scale = RenderPathBase.getSuperSampling();
  55. path.createRenderTarget(t);
  56. }
  57. {
  58. var t = new RenderTargetRaw();
  59. t.name = "mgbuffer2";
  60. t.width = Std.int(RenderUtil.materialPreviewSize * 2.0);
  61. t.height = Std.int(RenderUtil.materialPreviewSize * 2.0);
  62. t.format = "RGBA64";
  63. t.scale = RenderPathBase.getSuperSampling();
  64. path.createRenderTarget(t);
  65. }
  66. }
  67. public static function commandsPreview() {
  68. path.setTarget("mgbuffer2");
  69. path.clearTarget(0xff000000);
  70. #if (kha_metal)
  71. var clearColor = 0xffffffff;
  72. #else
  73. var clearColor: Null<Int> = null;
  74. #end
  75. path.setTarget("mgbuffer0");
  76. path.clearTarget(clearColor, 1.0);
  77. path.setTarget("mgbuffer0", ["mgbuffer1", "mgbuffer2"]);
  78. path.drawMeshes("mesh");
  79. // Deferred light
  80. path.setTarget("mtex");
  81. path.bindTarget("_mmain", "gbufferD");
  82. path.bindTarget("mgbuffer0", "gbuffer0");
  83. path.bindTarget("mgbuffer1", "gbuffer1");
  84. {
  85. path.bindTarget("empty_white", "ssaotex");
  86. }
  87. path.drawShader("shader_datas/deferred_light/deferred_light");
  88. #if (kha_direct3d11 || kha_direct3d12 || kha_metal || kha_vulkan)
  89. path.setDepthFrom("mtex", "mgbuffer0"); // Bind depth for world pass
  90. #end
  91. path.setTarget("mtex"); // Re-binds depth
  92. path.drawSkydome("shader_datas/world_pass/world_pass");
  93. #if (kha_direct3d11 || kha_direct3d12 || kha_metal || kha_vulkan)
  94. path.setDepthFrom("mtex", "mgbuffer1"); // Unbind depth
  95. #end
  96. var framebuffer = "texpreview";
  97. var selectedMat = Context.raw.material;
  98. RenderPath.active.renderTargets.get("texpreview").image = selectedMat.image;
  99. RenderPath.active.renderTargets.get("texpreview_icon").image = selectedMat.imageIcon;
  100. path.setTarget(framebuffer);
  101. path.bindTarget("mtex", "tex");
  102. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  103. path.setTarget("texpreview_icon");
  104. path.bindTarget("texpreview", "tex");
  105. path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
  106. }
  107. public static function commandsDecal() {
  108. path.setTarget("gbuffer2");
  109. path.clearTarget(0xff000000);
  110. #if (kha_metal)
  111. var clearColor = 0xffffffff;
  112. #else
  113. var clearColor: Null<Int> = null;
  114. #end
  115. path.setTarget("gbuffer0");
  116. path.clearTarget(clearColor, 1.0);
  117. path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
  118. path.drawMeshes("mesh");
  119. // Deferred light
  120. path.setTarget("tex");
  121. path.bindTarget("_main", "gbufferD");
  122. path.bindTarget("gbuffer0", "gbuffer0");
  123. path.bindTarget("gbuffer1", "gbuffer1");
  124. {
  125. path.bindTarget("empty_white", "ssaotex");
  126. }
  127. path.drawShader("shader_datas/deferred_light/deferred_light");
  128. #if (kha_direct3d11 || kha_direct3d12 || kha_metal || kha_vulkan)
  129. path.setDepthFrom("tex", "gbuffer0"); // Bind depth for world pass
  130. #end
  131. path.setTarget("tex");
  132. path.drawSkydome("shader_datas/world_pass/world_pass");
  133. #if (kha_direct3d11 || kha_direct3d12 || kha_metal || kha_vulkan)
  134. path.setDepthFrom("tex", "gbuffer1"); // Unbind depth
  135. #end
  136. var framebuffer = "texpreview";
  137. RenderPath.active.renderTargets.get("texpreview").image = Context.raw.decalImage;
  138. path.setTarget(framebuffer);
  139. path.bindTarget("tex", "tex");
  140. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  141. }
  142. }