RenderPathForwardVR.hx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package arm.render;
  2. #if arm_vr
  3. import kha.System;
  4. import iron.RenderPath;
  5. import iron.Scene;
  6. import arm.ui.UISidebar;
  7. class RenderPathForwardVR {
  8. public static var path: RenderPath;
  9. static var m = iron.math.Mat4.identity();
  10. static var m0 = iron.math.Mat4.identity();
  11. static var q = new iron.math.Quat();
  12. public static function init(_path: RenderPath) {
  13. path = _path;
  14. {
  15. var t = new RenderTargetRaw();
  16. t.name = "eye0";
  17. t.width = 1440;
  18. t.height = 1600;
  19. t.format = "RGBA32";
  20. t.scale = Inc.getSuperSampling();
  21. path.createRenderTarget(t);
  22. }
  23. {
  24. var t = new RenderTargetRaw();
  25. t.name = "eye1";
  26. t.width = 1440;
  27. t.height = 1600;
  28. t.format = "RGBA32";
  29. t.scale = Inc.getSuperSampling();
  30. path.createRenderTarget(t);
  31. }
  32. path.createDepthBuffer("main_eye", "DEPTH24");
  33. {
  34. var t = new RenderTargetRaw();
  35. t.name = "gbuffer0_eye";
  36. t.width = 1440;
  37. t.height = 1600;
  38. t.format = "RGBA64";
  39. t.scale = Inc.getSuperSampling();
  40. t.depth_buffer = "main_eye";
  41. path.createRenderTarget(t);
  42. }
  43. {
  44. var t = new RenderTargetRaw();
  45. t.name = "gbuffer1_eye";
  46. t.width = 1440;
  47. t.height = 1600;
  48. t.format = "RGBA64";
  49. t.scale = Inc.getSuperSampling();
  50. path.createRenderTarget(t);
  51. }
  52. {
  53. var t = new RenderTargetRaw();
  54. t.name = "gbuffer2_eye";
  55. t.width = 1440;
  56. t.height = 1600;
  57. t.format = "RGBA64";
  58. t.scale = Inc.getSuperSampling();
  59. path.createRenderTarget(t);
  60. }
  61. {
  62. var t = new RenderTargetRaw();
  63. t.name = "buf_eye";
  64. t.width = 1440;
  65. t.height = 1600;
  66. #if (kha_direct3d12 || kha_vulkan)
  67. t.format = "RGBA64"; // Match raytrace_target format
  68. #else
  69. t.format = "RGBA32";
  70. #end
  71. t.scale = Inc.getSuperSampling();
  72. path.createRenderTarget(t);
  73. }
  74. {
  75. var t = new RenderTargetRaw();
  76. t.name = "bufa_eye";
  77. t.width = 1440;
  78. t.height = 1600;
  79. t.format = "RGBA32";
  80. t.scale = Inc.getSuperSampling();
  81. path.createRenderTarget(t);
  82. }
  83. {
  84. var t = new RenderTargetRaw();
  85. t.name = "taa_eye";
  86. t.width = 1440;
  87. t.height = 1600;
  88. t.format = "RGBA32";
  89. t.scale = Inc.getSuperSampling();
  90. path.createRenderTarget(t);
  91. }
  92. {
  93. var t = new RenderTargetRaw();
  94. t.name = "taa2_eye";
  95. t.width = 1440;
  96. t.height = 1600;
  97. t.format = "RGBA32";
  98. t.scale = Inc.getSuperSampling();
  99. path.createRenderTarget(t);
  100. }
  101. }
  102. @:access(iron.RenderPath)
  103. public static function commands() {
  104. if (System.windowWidth() == 0 || System.windowHeight() == 0) return;
  105. if (Krom.vrGetSensorStateHmdMounted()) {
  106. var current = RenderPathDeferred.taaFrame % 2 == 0 ? "bufa" : "taa2";
  107. var output = RenderPathDeferred.taaFrame % 2 == 0 ? current : "taa";
  108. m.setFrom(Scene.active.camera.transform.world);
  109. for (eye in 0...2) {
  110. var view = Krom.vrGetSensorStateView(eye);
  111. var proj = Krom.vrGetSensorStateProjection(eye);
  112. // Convert up axis
  113. q.fromAxisAngle(new iron.math.Vec4(1, 0, 0), -Math.PI / 2);
  114. Scene.active.camera.V.fromQuat(q);
  115. Scene.active.camera.V.translate(0, 1, -1);
  116. m0._00 = view._00;
  117. m0._01 = view._01;
  118. m0._02 = view._02;
  119. m0._03 = view._03;
  120. m0._10 = view._10;
  121. m0._11 = view._11;
  122. m0._12 = view._12;
  123. m0._13 = view._13;
  124. m0._20 = view._20;
  125. m0._21 = view._21;
  126. m0._22 = view._22;
  127. m0._23 = view._23;
  128. m0._30 = view._30;
  129. m0._31 = view._31;
  130. m0._32 = view._32;
  131. m0._33 = view._33;
  132. Scene.active.camera.V.multmat(m0);
  133. Scene.active.camera.P._00 = proj._00;
  134. Scene.active.camera.P._01 = proj._01;
  135. Scene.active.camera.P._02 = proj._02;
  136. Scene.active.camera.P._03 = proj._03;
  137. Scene.active.camera.P._10 = proj._10;
  138. Scene.active.camera.P._11 = proj._11;
  139. Scene.active.camera.P._12 = proj._12;
  140. Scene.active.camera.P._13 = proj._13;
  141. Scene.active.camera.P._20 = proj._20;
  142. Scene.active.camera.P._21 = proj._21;
  143. Scene.active.camera.P._22 = proj._22;
  144. Scene.active.camera.P._23 = proj._23;
  145. Scene.active.camera.P._30 = proj._30;
  146. Scene.active.camera.P._31 = proj._31;
  147. Scene.active.camera.P._32 = proj._32;
  148. Scene.active.camera.P._33 = proj._33;
  149. Scene.active.camera.VP.multmats(Scene.active.camera.P, Scene.active.camera.V);
  150. Scene.active.camera.transform.world.getInverse(Scene.active.camera.V);
  151. RenderPathForward.drawGbuffer("gbuffer0_eye", "gbuffer1_eye", "gbuffer2_eye");
  152. RenderPathForward.drawForward(true, "eye" + eye, "gbuffer0_eye", "gbuffer1_eye", "gbuffer2_eye", "buf_eye", "bufa_eye", "taa_eye", "taa2_eye");
  153. }
  154. Scene.active.camera.transform.world.setFrom(m);
  155. Scene.active.camera.buildProjection();
  156. Krom.vrBegin();
  157. path.drawStereo(function(eye: Int) {
  158. path.currentG = path.frameG;
  159. path.bindTarget("eye" + eye, "tex");
  160. path.drawShader("shader_datas/copy_pass/copy_pass");
  161. });
  162. Krom.vrWarpSwap();
  163. }
  164. iron.Scene.active.camera.buildMatrix();
  165. RenderPathPaint.begin();
  166. RenderPathForward.drawGbuffer();
  167. RenderPathForward.drawForward();
  168. RenderPathPaint.draw();
  169. RenderPathPaint.end();
  170. RenderPathDeferred.taaFrame++;
  171. }
  172. }
  173. #end