RenderPathDeferred.hx 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122
  1. package arm.render;
  2. import kha.System;
  3. import iron.RenderPath;
  4. import iron.Scene;
  5. import iron.math.Mat4;
  6. import iron.math.Vec4;
  7. import iron.math.Quat;
  8. import iron.system.Input;
  9. import iron.object.MeshObject;
  10. import arm.util.ViewportUtil;
  11. import arm.util.RenderUtil;
  12. import arm.ui.UITrait;
  13. import arm.ui.UIView2D;
  14. import arm.nodes.MaterialParser;
  15. import arm.Tool;
  16. class RenderPathDeferred {
  17. #if (rp_renderer == "Deferred")
  18. public static var path:RenderPath;
  19. #if rp_voxelao
  20. static var voxels = "voxels";
  21. static var voxelsLast = "voxels";
  22. public static var voxelFrame = 0;
  23. public static var voxelFreq = 6; // Revoxelizing frequency
  24. #end
  25. static var taaFrame = 0;
  26. static var lastX = -1.0;
  27. static var lastY = -1.0;
  28. public static function init(_path:RenderPath) {
  29. path = _path;
  30. #if (rp_background == "World")
  31. {
  32. path.loadShader("shader_datas/world_pass/world_pass");
  33. }
  34. #end
  35. #if rp_voxelao
  36. {
  37. Inc.initGI();
  38. path.loadShader("shader_datas/deferred_light/deferred_light_VoxelAOvar");
  39. }
  40. #end
  41. {
  42. path.createDepthBuffer("main", "DEPTH24");
  43. var t = new RenderTargetRaw();
  44. t.name = "gbuffer0";
  45. t.width = 0;
  46. t.height = 0;
  47. t.format = "RGBA64";
  48. t.scale = Inc.getSuperSampling();
  49. t.depth_buffer = "main";
  50. path.createRenderTarget(t);
  51. }
  52. {
  53. var t = new RenderTargetRaw();
  54. t.name = "tex";
  55. t.width = 0;
  56. t.height = 0;
  57. t.format = Inc.getHdrFormat();
  58. t.scale = Inc.getSuperSampling();
  59. t.depth_buffer = "main";
  60. path.createRenderTarget(t);
  61. }
  62. {
  63. var t = new RenderTargetRaw();
  64. t.name = "buf";
  65. t.width = 0;
  66. t.height = 0;
  67. t.format = Inc.getHdrFormat();
  68. t.scale = Inc.getSuperSampling();
  69. path.createRenderTarget(t);
  70. }
  71. {
  72. var t = new RenderTargetRaw();
  73. t.name = "gbuffer1";
  74. t.width = 0;
  75. t.height = 0;
  76. t.format = "RGBA64";
  77. t.scale = Inc.getSuperSampling();
  78. path.createRenderTarget(t);
  79. }
  80. #if rp_gbuffer2
  81. {
  82. var t = new RenderTargetRaw();
  83. t.name = "gbuffer2";
  84. t.width = 0;
  85. t.height = 0;
  86. t.format = "RGBA64";
  87. t.scale = Inc.getSuperSampling();
  88. path.createRenderTarget(t);
  89. }
  90. {
  91. var t = new RenderTargetRaw();
  92. t.name = "taa";
  93. t.width = 0;
  94. t.height = 0;
  95. #if kha_direct3d12
  96. t.format = "RGBA128";
  97. #else
  98. t.format = "RGBA32";
  99. #end
  100. t.scale = Inc.getSuperSampling();
  101. path.createRenderTarget(t);
  102. }
  103. #end
  104. path.loadShader("shader_datas/deferred_light/deferred_light");
  105. #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
  106. {
  107. path.loadShader("shader_datas/ssgi_pass/ssgi_pass");
  108. path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
  109. path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
  110. }
  111. #end
  112. #if ((rp_ssgi != "Off") || rp_volumetriclight)
  113. {
  114. var t = new RenderTargetRaw();
  115. t.name = "singlea";
  116. t.width = 0;
  117. t.height = 0;
  118. t.format = "R8";
  119. t.scale = Inc.getSuperSampling();
  120. #if rp_ssgi_half
  121. t.scale *= 0.5;
  122. #end
  123. path.createRenderTarget(t);
  124. }
  125. {
  126. var t = new RenderTargetRaw();
  127. t.name = "singleb";
  128. t.width = 0;
  129. t.height = 0;
  130. t.format = "R8";
  131. t.scale = Inc.getSuperSampling();
  132. #if rp_ssgi_half
  133. t.scale *= 0.5;
  134. #end
  135. path.createRenderTarget(t);
  136. }
  137. #end
  138. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  139. {
  140. var t = new RenderTargetRaw();
  141. t.name = "bufa";
  142. t.width = 0;
  143. t.height = 0;
  144. t.format = "RGBA32";
  145. t.scale = Inc.getSuperSampling();
  146. path.createRenderTarget(t);
  147. }
  148. {
  149. var t = new RenderTargetRaw();
  150. t.name = "bufb";
  151. t.width = 0;
  152. t.height = 0;
  153. t.format = "RGBA32";
  154. t.scale = Inc.getSuperSampling();
  155. path.createRenderTarget(t);
  156. }
  157. #end
  158. #if rp_compositornodes
  159. {
  160. path.loadShader("shader_datas/compositor_pass/compositor_pass");
  161. }
  162. #end
  163. #if ((!rp_compositornodes) || (rp_antialiasing == "TAA") || (rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  164. {
  165. path.loadShader("shader_datas/copy_pass/copy_pass");
  166. }
  167. #end
  168. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  169. {
  170. path.loadShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  171. path.loadShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  172. path.loadShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  173. #if (rp_antialiasing == "TAA")
  174. {
  175. path.loadShader("shader_datas/taa_pass/taa_pass");
  176. }
  177. #end
  178. }
  179. #end
  180. #if (rp_supersampling == 4)
  181. {
  182. path.loadShader("shader_datas/supersample_resolve/supersample_resolve");
  183. }
  184. #end
  185. #if rp_volumetriclight
  186. {
  187. path.loadShader("shader_datas/volumetric_light/volumetric_light");
  188. path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  189. path.loadShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y");
  190. }
  191. #end
  192. #if rp_water
  193. {
  194. path.loadShader("shader_datas/water_pass/water_pass");
  195. path.loadShader("shader_datas/copy_pass/copy_pass");
  196. }
  197. #end
  198. #if rp_bloom
  199. {
  200. var t = new RenderTargetRaw();
  201. t.name = "bloomtex";
  202. t.width = 0;
  203. t.height = 0;
  204. t.scale = 0.25;
  205. t.format = Inc.getHdrFormat();
  206. path.createRenderTarget(t);
  207. }
  208. {
  209. var t = new RenderTargetRaw();
  210. t.name = "bloomtex2";
  211. t.width = 0;
  212. t.height = 0;
  213. t.scale = 0.25;
  214. t.format = Inc.getHdrFormat();
  215. path.createRenderTarget(t);
  216. }
  217. {
  218. path.loadShader("shader_datas/bloom_pass/bloom_pass");
  219. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  220. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  221. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  222. }
  223. #end
  224. #if rp_autoexposure
  225. {
  226. var t = new RenderTargetRaw();
  227. t.name = "histogram";
  228. t.width = 1;
  229. t.height = 1;
  230. t.format = Inc.getHdrFormat();
  231. path.createRenderTarget(t);
  232. }
  233. {
  234. path.loadShader("shader_datas/histogram_pass/histogram_pass");
  235. }
  236. #end
  237. #if rp_sss
  238. {
  239. path.loadShader("shader_datas/sss_pass/sss_pass_x");
  240. path.loadShader("shader_datas/sss_pass/sss_pass_y");
  241. }
  242. #end
  243. #if (rp_ssr_half || rp_ssgi_half)
  244. {
  245. {
  246. path.loadShader("shader_datas/downsample_depth/downsample_depth");
  247. var t = new RenderTargetRaw();
  248. t.name = "half";
  249. t.width = 0;
  250. t.height = 0;
  251. t.scale = Inc.getSuperSampling() * 0.5;
  252. t.format = "R32"; // R16
  253. path.createRenderTarget(t);
  254. }
  255. }
  256. #end
  257. #if rp_ssr
  258. {
  259. path.loadShader("shader_datas/ssr_pass/ssr_pass");
  260. path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
  261. path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
  262. #if rp_ssr_half
  263. {
  264. var t = new RenderTargetRaw();
  265. t.name = "ssra";
  266. t.width = 0;
  267. t.height = 0;
  268. t.scale = Inc.getSuperSampling() * 0.5;
  269. t.format = Inc.getHdrFormat();
  270. path.createRenderTarget(t);
  271. }
  272. {
  273. var t = new RenderTargetRaw();
  274. t.name = "ssrb";
  275. t.width = 0;
  276. t.height = 0;
  277. t.scale = Inc.getSuperSampling() * 0.5;
  278. t.format = Inc.getHdrFormat();
  279. path.createRenderTarget(t);
  280. }
  281. #end
  282. }
  283. #end
  284. #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  285. {
  286. #if (rp_motionblur == "Camera")
  287. {
  288. path.loadShader("shader_datas/motion_blur_pass/motion_blur_pass");
  289. }
  290. #else
  291. {
  292. path.loadShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  293. }
  294. #end
  295. }
  296. #end
  297. #if arm_config
  298. {
  299. var t = new RenderTargetRaw();
  300. t.name = "empty_white";
  301. t.width = 1;
  302. t.height = 1;
  303. t.format = 'R8';
  304. var rt = new RenderTarget(t);
  305. var b = haxe.io.Bytes.alloc(1);
  306. b.set(0, 255);
  307. rt.image = kha.Image.fromBytes(b, t.width, t.height, kha.graphics4.TextureFormat.L8);
  308. path.renderTargets.set(t.name, rt);
  309. }
  310. #end
  311. {
  312. var t = new RenderTargetRaw();
  313. t.name = "taa2";
  314. t.width = 0;
  315. t.height = 0;
  316. t.format = "RGBA32";
  317. t.scale = Inc.getSuperSampling();
  318. path.createRenderTarget(t);
  319. }
  320. {
  321. var t = new RenderTargetRaw();
  322. t.name = "texpaint_colorid";
  323. t.width = 1;
  324. t.height = 1;
  325. t.format = 'RGBA32';
  326. path.createRenderTarget(t);
  327. }
  328. {
  329. var t = new RenderTargetRaw();
  330. t.name = "texpaint_picker";
  331. t.width = 1;
  332. t.height = 1;
  333. t.format = 'RGBA32';
  334. path.createRenderTarget(t);
  335. }
  336. {
  337. var t = new RenderTargetRaw();
  338. t.name = "texpaint_nor_picker";
  339. t.width = 1;
  340. t.height = 1;
  341. t.format = 'RGBA32';
  342. path.createRenderTarget(t);
  343. }
  344. {
  345. var t = new RenderTargetRaw();
  346. t.name = "texpaint_pack_picker";
  347. t.width = 1;
  348. t.height = 1;
  349. t.format = 'RGBA32';
  350. path.createRenderTarget(t);
  351. }
  352. path.loadShader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
  353. { // Material preview
  354. {
  355. var t = new RenderTargetRaw();
  356. t.name = "texpreview";
  357. t.width = 1;
  358. t.height = 1;
  359. t.format = 'RGBA32';
  360. path.createRenderTarget(t);
  361. }
  362. {
  363. var t = new RenderTargetRaw();
  364. t.name = "texpreview_icon";
  365. t.width = 1;
  366. t.height = 1;
  367. t.format = 'RGBA32';
  368. path.createRenderTarget(t);
  369. }
  370. {
  371. path.createDepthBuffer("mmain", "DEPTH24");
  372. var t = new RenderTargetRaw();
  373. t.name = "mtex";
  374. t.width = RenderUtil.matPreviewSize;
  375. t.height = RenderUtil.matPreviewSize;
  376. t.format = Inc.getHdrFormat();
  377. t.scale = Inc.getSuperSampling();
  378. t.depth_buffer = "mmain";
  379. path.createRenderTarget(t);
  380. }
  381. {
  382. var t = new RenderTargetRaw();
  383. t.name = "mbuf";
  384. t.width = RenderUtil.matPreviewSize;
  385. t.height = RenderUtil.matPreviewSize;
  386. t.format = Inc.getHdrFormat();
  387. t.scale = Inc.getSuperSampling();
  388. path.createRenderTarget(t);
  389. }
  390. {
  391. var t = new RenderTargetRaw();
  392. t.name = "mgbuffer0";
  393. t.width = RenderUtil.matPreviewSize;
  394. t.height = RenderUtil.matPreviewSize;
  395. t.format = "RGBA64";
  396. t.scale = Inc.getSuperSampling();
  397. t.depth_buffer = "mmain";
  398. path.createRenderTarget(t);
  399. }
  400. {
  401. var t = new RenderTargetRaw();
  402. t.name = "mgbuffer1";
  403. t.width = RenderUtil.matPreviewSize;
  404. t.height = RenderUtil.matPreviewSize;
  405. t.format = "RGBA64";
  406. t.scale = Inc.getSuperSampling();
  407. path.createRenderTarget(t);
  408. }
  409. #if rp_gbuffer2
  410. {
  411. var t = new RenderTargetRaw();
  412. t.name = "mgbuffer2";
  413. t.width = RenderUtil.matPreviewSize;
  414. t.height = RenderUtil.matPreviewSize;
  415. t.format = "RGBA64";
  416. t.scale = Inc.getSuperSampling();
  417. path.createRenderTarget(t);
  418. }
  419. #end
  420. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  421. {
  422. var t = new RenderTargetRaw();
  423. t.name = "mbufa";
  424. t.width = RenderUtil.matPreviewSize;
  425. t.height = RenderUtil.matPreviewSize;
  426. t.format = "RGBA32";
  427. t.scale = Inc.getSuperSampling();
  428. path.createRenderTarget(t);
  429. }
  430. {
  431. var t = new RenderTargetRaw();
  432. t.name = "mbufb";
  433. t.width = RenderUtil.matPreviewSize;
  434. t.height = RenderUtil.matPreviewSize;
  435. t.format = "RGBA32";
  436. t.scale = Inc.getSuperSampling();
  437. path.createRenderTarget(t);
  438. }
  439. #end
  440. }
  441. //
  442. }
  443. @:access(iron.RenderPath)
  444. public static function commands() {
  445. if (System.windowWidth() == 0 || System.windowHeight() == 0) return;
  446. var ssaa4 = Config.raw.rp_supersample == 4 ? true : false;
  447. var mouse = Input.getMouse();
  448. var mx = lastX;
  449. var my = lastY;
  450. lastX = mouse.x;
  451. lastY = mouse.y;
  452. if (Context.ddirty <= 0 && Context.rdirty <= 0 && (Context.pdirty <= 0 || UITrait.inst.worktab.position == SpaceScene)) {
  453. if (mx != lastX || my != lastY || mouse.locked) Context.ddirty = 0;
  454. if (Context.ddirty > -2) {
  455. path.setTarget("");
  456. path.bindTarget("taa", "tex");
  457. ssaa4 ?
  458. path.drawShader("shader_datas/supersample_resolve/supersample_resolve") :
  459. path.drawShader("shader_datas/copy_pass/copy_pass");
  460. if (UITrait.inst.brush3d) RenderPathPaint.commandsCursor();
  461. if (Context.ddirty <= 0) Context.ddirty--;
  462. }
  463. return;
  464. }
  465. // Match projection matrix jitter
  466. @:privateAccess Scene.active.camera.frame = taaFrame;
  467. @:privateAccess Scene.active.camera.projectionJitter();
  468. Scene.active.camera.buildMatrix();
  469. var pushUndoLast = History.pushUndo;
  470. if (History.pushUndo && History.undoLayers != null) {
  471. History.paint();
  472. }
  473. // 2D paint
  474. var painto:MeshObject = null;
  475. var planeo:MeshObject = null;
  476. var visibles:Array<Bool> = null;
  477. var mergedObjectVisible = false;
  478. var savedFov = 0.0;
  479. if (UITrait.inst.paint2d) {
  480. // Set plane mesh
  481. painto = Context.paintObject;
  482. visibles = [];
  483. for (p in Project.paintObjects) {
  484. visibles.push(p.visible);
  485. p.visible = false;
  486. }
  487. if (Context.mergedObject != null) {
  488. mergedObjectVisible = Context.mergedObject.visible;
  489. Context.mergedObject.visible = false;
  490. }
  491. var cam = Scene.active.camera;
  492. UITrait.inst.savedCamera.setFrom(cam.transform.local);
  493. savedFov = cam.data.raw.fov;
  494. ViewportUtil.updateCameraType(0);
  495. var m = Mat4.identity();
  496. m.translate(0, 0, 0.5);
  497. cam.transform.setMatrix(m);
  498. cam.data.raw.fov = 0.92;
  499. cam.buildProjection();
  500. cam.buildMatrix();
  501. var tw = 0.95 * UIView2D.inst.panScale;
  502. var tx = UIView2D.inst.panX / iron.App.w();
  503. var ty = UIView2D.inst.panY / iron.App.h();
  504. m.setIdentity();
  505. m.scale(new Vec4(tw, tw, 1));
  506. m.setLoc(new Vec4(tx, ty, 0));
  507. var m2 = Mat4.identity();
  508. m2.getInverse(Scene.active.camera.VP);
  509. m.multmat(m2);
  510. planeo = cast Scene.active.getChild(".Plane");
  511. planeo.visible = true;
  512. Context.paintObject = planeo;
  513. var v = new Vec4();
  514. var sx = v.set(m._00, m._01, m._02).length();
  515. planeo.transform.rot.fromEuler(-Math.PI / 2, 0, 0);
  516. planeo.transform.scale.set(sx, 1.0, sx);
  517. planeo.transform.loc.set(m._30, -m._31, 0.0);
  518. planeo.transform.buildMatrix();
  519. }
  520. // Geometry
  521. drawGbuffer();
  522. if (History.undoLayers != null) {
  523. // Symmetry
  524. if (UITrait.inst.symX || UITrait.inst.symY || UITrait.inst.symZ) {
  525. Context.ddirty = 2;
  526. var t = Context.paintObject.transform;
  527. var sx = t.scale.x;
  528. var sy = t.scale.y;
  529. var sz = t.scale.z;
  530. if (UITrait.inst.symX) {
  531. t.scale.set(-sx, sy, sz);
  532. t.buildMatrix();
  533. RenderPathPaint.commandsPaint();
  534. }
  535. if (UITrait.inst.symY) {
  536. t.scale.set(sx, -sy, sz);
  537. t.buildMatrix();
  538. RenderPathPaint.commandsPaint();
  539. }
  540. if (UITrait.inst.symZ) {
  541. t.scale.set(sx, sy, -sz);
  542. t.buildMatrix();
  543. RenderPathPaint.commandsPaint();
  544. }
  545. if (UITrait.inst.symX && UITrait.inst.symY) {
  546. t.scale.set(-sx, -sy, sz);
  547. t.buildMatrix();
  548. RenderPathPaint.commandsPaint();
  549. }
  550. if (UITrait.inst.symX && UITrait.inst.symZ) {
  551. t.scale.set(-sx, sy, -sz);
  552. t.buildMatrix();
  553. RenderPathPaint.commandsPaint();
  554. }
  555. if (UITrait.inst.symY && UITrait.inst.symZ) {
  556. t.scale.set(sx, -sy, -sz);
  557. t.buildMatrix();
  558. RenderPathPaint.commandsPaint();
  559. }
  560. if (UITrait.inst.symX && UITrait.inst.symY && UITrait.inst.symZ) {
  561. t.scale.set(-sx, -sy, -sz);
  562. t.buildMatrix();
  563. RenderPathPaint.commandsPaint();
  564. }
  565. t.scale.set(sx, sy, sz);
  566. t.buildMatrix();
  567. }
  568. if (Context.tool == ToolBake) {
  569. if (UITrait.inst.bakeType == 2) { // Normal (Tangent)
  570. UITrait.inst.bakeType = 3; // Bake high poly world normals
  571. MaterialParser.parsePaintMaterial();
  572. var _paintObject = Context.paintObject;
  573. var highPoly = Project.paintObjects[UITrait.inst.bakeHighPoly];
  574. var _visible = highPoly.visible;
  575. highPoly.visible = true;
  576. Context.selectPaintObject(highPoly);
  577. RenderPathPaint.commandsPaint();
  578. highPoly.visible = _visible;
  579. UITrait.inst.sub--;
  580. if (pushUndoLast) History.paint();
  581. UITrait.inst.bakeType = 2;
  582. MaterialParser.parsePaintMaterial();
  583. Context.selectPaintObject(_paintObject);
  584. RenderPathPaint.commandsPaint();
  585. }
  586. else if (UITrait.inst.bakeType == 7) { // Object ID
  587. var _layerFilter = UITrait.inst.layerFilter;
  588. var _paintObject = Context.paintObject;
  589. var isMerged = Context.mergedObject != null;
  590. var _visible = isMerged && Context.mergedObject.visible;
  591. UITrait.inst.layerFilter = 1;
  592. if (isMerged) Context.mergedObject.visible = false;
  593. for (p in Project.paintObjects) {
  594. Context.selectPaintObject(p);
  595. RenderPathPaint.commandsPaint();
  596. }
  597. UITrait.inst.layerFilter = _layerFilter;
  598. Context.selectPaintObject(_paintObject);
  599. if (isMerged) Context.mergedObject.visible = _visible;
  600. }
  601. else {
  602. RenderPathPaint.commandsPaint();
  603. }
  604. }
  605. else { // Paint
  606. RenderPathPaint.commandsPaint();
  607. }
  608. }
  609. //
  610. if (Context.brushBlendDirty) {
  611. Context.brushBlendDirty = false;
  612. path.setTarget("texpaint_blend0", ["texpaint_blend1"]);
  613. path.clearTarget(0x00000000);
  614. }
  615. if (UITrait.inst.paint2d) {
  616. // Restore paint mesh
  617. planeo.visible = false;
  618. for (i in 0...Project.paintObjects.length) {
  619. Project.paintObjects[i].visible = visibles[i];
  620. }
  621. if (Context.mergedObject != null) {
  622. Context.mergedObject.visible = mergedObjectVisible;
  623. }
  624. Context.paintObject = painto;
  625. Scene.active.camera.transform.setMatrix(UITrait.inst.savedCamera);
  626. Scene.active.camera.data.raw.fov = savedFov;
  627. ViewportUtil.updateCameraType(UITrait.inst.cameraType);
  628. Scene.active.camera.buildProjection();
  629. Scene.active.camera.buildMatrix();
  630. drawGbuffer();
  631. }
  632. #if kha_direct3d12
  633. if (Context.ddirty > 1 || Context.pdirty > 0) {
  634. RenderPathRaytrace.frame = 1.0;
  635. }
  636. RenderPathRaytrace.commands();
  637. path.setTarget("taa");
  638. drawCompass(path.currentG);
  639. path.setTarget("");
  640. path.bindTarget("taa", "tex");
  641. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  642. if (UITrait.inst.brush3d) {
  643. RenderPathPaint.commandsCursor();
  644. }
  645. return;
  646. #end
  647. #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
  648. {
  649. var ssgi = Config.raw.rp_ssgi != false && UITrait.inst.cameraType == 0;
  650. if (ssgi && Context.ddirty > 0 && taaFrame > 0) {
  651. path.setTarget("singlea");
  652. path.bindTarget("_main", "gbufferD");
  653. path.bindTarget("gbuffer0", "gbuffer0");
  654. // #if (rp_ssgi == "RTGI")
  655. // path.bindTarget("gbuffer1", "gbuffer1");
  656. // #end
  657. path.drawShader("shader_datas/ssgi_pass/ssgi_pass");
  658. path.setTarget("singleb");
  659. path.bindTarget("singlea", "tex");
  660. path.bindTarget("gbuffer0", "gbuffer0");
  661. path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
  662. path.setTarget("singlea");
  663. path.bindTarget("singleb", "tex");
  664. path.bindTarget("gbuffer0", "gbuffer0");
  665. path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
  666. }
  667. }
  668. #end
  669. // Voxels
  670. #if rp_voxelao
  671. if (Config.raw.rp_gi != false)
  672. {
  673. var voxelize = path.voxelize() && Context.ddirty > 0 && taaFrame > 0;
  674. #if arm_voxelgi_temporal
  675. voxelize = ++voxelFrame % voxelFreq == 0;
  676. if (voxelize) {
  677. voxels = voxels == "voxels" ? "voxelsB" : "voxels";
  678. voxelsLast = voxels == "voxels" ? "voxelsB" : "voxels";
  679. }
  680. #end
  681. if (voxelize) {
  682. var res = Inc.getVoxelRes();
  683. var voxtex = voxels;
  684. path.clearImage(voxtex, 0x00000000);
  685. path.setTarget("");
  686. path.setViewport(res, res);
  687. path.bindTarget(voxtex, "voxels");
  688. if (arm.nodes.MaterialBuilder.heightUsed) {
  689. var tid = Project.layers[0].id;
  690. path.bindTarget("texpaint_pack" + tid, "texpaint_pack");
  691. }
  692. path.drawMeshes("voxel");
  693. path.generateMipmaps(voxels);
  694. }
  695. }
  696. #end
  697. // ---
  698. // Deferred light
  699. // ---
  700. #if (!kha_opengl)
  701. path.setDepthFrom("tex", "gbuffer1"); // Unbind depth so we can read it
  702. #end
  703. path.setTarget("tex");
  704. path.bindTarget("_main", "gbufferD");
  705. path.bindTarget("gbuffer0", "gbuffer0");
  706. path.bindTarget("gbuffer1", "gbuffer1");
  707. #if (rp_ssgi != "Off")
  708. {
  709. var ssgi = Config.raw.rp_ssgi != false && UITrait.inst.cameraType == 0;
  710. if (ssgi && taaFrame > 0) {
  711. path.bindTarget("singlea", "ssaotex");
  712. }
  713. else {
  714. path.bindTarget("empty_white", "ssaotex");
  715. }
  716. }
  717. #end
  718. var voxelao_pass = false;
  719. #if rp_voxelao
  720. if (Config.raw.rp_gi != false)
  721. {
  722. voxelao_pass = true;
  723. path.bindTarget(voxels, "voxels");
  724. #if arm_voxelgi_temporal
  725. {
  726. path.bindTarget(voxelsLast, "voxelsLast");
  727. }
  728. #end
  729. }
  730. #end
  731. voxelao_pass ?
  732. path.drawShader("shader_datas/deferred_light/deferred_light_VoxelAOvar") :
  733. path.drawShader("shader_datas/deferred_light/deferred_light");
  734. #if (!kha_opengl)
  735. path.setDepthFrom("tex", "gbuffer0"); // Re-bind depth
  736. #end
  737. path.setTarget("tex"); // Re-binds depth
  738. path.drawSkydome("shader_datas/world_pass/world_pass");
  739. #if rp_ocean
  740. {
  741. path.setTarget("tex");
  742. path.bindTarget("_main", "gbufferD");
  743. path.drawShader("shader_datas/water_pass/water_pass");
  744. }
  745. #end
  746. #if rp_blending
  747. {
  748. path.drawMeshes("blend");
  749. }
  750. #end
  751. #if rp_translucency
  752. {
  753. var hasLight = Scene.active.lights.length > 0;
  754. if (hasLight) Inc.drawTranslucency("tex");
  755. }
  756. #end
  757. #if rp_bloom
  758. {
  759. if (Config.raw.rp_bloom != false) {
  760. path.setTarget("bloomtex");
  761. path.bindTarget("tex", "tex");
  762. path.drawShader("shader_datas/bloom_pass/bloom_pass");
  763. path.setTarget("bloomtex2");
  764. path.bindTarget("bloomtex", "tex");
  765. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  766. path.setTarget("bloomtex");
  767. path.bindTarget("bloomtex2", "tex");
  768. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  769. path.setTarget("bloomtex2");
  770. path.bindTarget("bloomtex", "tex");
  771. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  772. path.setTarget("bloomtex");
  773. path.bindTarget("bloomtex2", "tex");
  774. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  775. path.setTarget("bloomtex2");
  776. path.bindTarget("bloomtex", "tex");
  777. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  778. path.setTarget("bloomtex");
  779. path.bindTarget("bloomtex2", "tex");
  780. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  781. path.setTarget("bloomtex2");
  782. path.bindTarget("bloomtex", "tex");
  783. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  784. path.setTarget("tex");
  785. path.bindTarget("bloomtex2", "tex");
  786. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  787. }
  788. }
  789. #end
  790. #if rp_sss
  791. {
  792. path.setTarget("buf");
  793. path.bindTarget("tex", "tex");
  794. path.bindTarget("_main", "gbufferD");
  795. path.bindTarget("gbuffer2", "gbuffer2");
  796. path.drawShader("shader_datas/sss_pass/sss_pass_x");
  797. path.setTarget("tex");
  798. // TODO: can not bind tex
  799. path.bindTarget("tex", "tex");
  800. path.bindTarget("_main", "gbufferD");
  801. path.bindTarget("gbuffer2", "gbuffer2");
  802. path.drawShader("shader_datas/sss_pass/sss_pass_y");
  803. }
  804. #end
  805. #if rp_ssr
  806. {
  807. if (Config.raw.rp_ssr != false) {
  808. var targeta = "buf";
  809. var targetb = "gbuffer1";
  810. path.setTarget(targeta);
  811. path.bindTarget("tex", "tex");
  812. path.bindTarget("_main", "gbufferD");
  813. path.bindTarget("gbuffer0", "gbuffer0");
  814. path.bindTarget("gbuffer1", "gbuffer1");
  815. path.drawShader("shader_datas/ssr_pass/ssr_pass");
  816. path.setTarget(targetb);
  817. path.bindTarget(targeta, "tex");
  818. path.bindTarget("gbuffer0", "gbuffer0");
  819. path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
  820. path.setTarget("tex");
  821. path.bindTarget(targetb, "tex");
  822. path.bindTarget("gbuffer0", "gbuffer0");
  823. path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
  824. }
  825. }
  826. #end
  827. #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  828. {
  829. if (Config.raw.rp_motionblur != false) {
  830. path.setTarget("buf");
  831. path.bindTarget("tex", "tex");
  832. path.bindTarget("gbuffer0", "gbuffer0");
  833. #if (rp_motionblur == "Camera")
  834. {
  835. path.bindTarget("_main", "gbufferD");
  836. path.drawShader("shader_datas/motion_blur_pass/motion_blur_pass");
  837. }
  838. #else
  839. {
  840. path.bindTarget("gbuffer2", "sveloc");
  841. path.drawShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  842. }
  843. #end
  844. path.setTarget("tex");
  845. path.bindTarget("buf", "tex");
  846. path.drawShader("shader_datas/copy_pass/copy_pass");
  847. }
  848. }
  849. #end
  850. // Begin compositor
  851. #if rp_autoexposure
  852. {
  853. path.generateMipmaps("tex");
  854. }
  855. #end
  856. path.setTarget("buf");
  857. path.bindTarget("tex", "tex");
  858. #if rp_compositordepth
  859. {
  860. path.bindTarget("_main", "gbufferD");
  861. }
  862. #end
  863. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  864. // End compositor
  865. #if rp_overlays
  866. {
  867. path.setTarget("buf");
  868. var currentG = path.currentG;
  869. path.drawMeshes("overlay");
  870. drawCompass(currentG);
  871. }
  872. #end
  873. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  874. {
  875. var current = taaFrame % 2 == 0 ? "bufa" : "taa2";
  876. var last = taaFrame % 2 == 0 ? "taa2" : "bufa";
  877. path.setTarget(current);
  878. path.clearTarget(0x00000000);
  879. path.bindTarget("buf", "colorTex");
  880. path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  881. path.setTarget("bufb");
  882. path.clearTarget(0x00000000);
  883. path.bindTarget(current, "edgesTex");
  884. path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  885. path.setTarget(current);
  886. path.bindTarget("buf", "colorTex");
  887. path.bindTarget("bufb", "blendTex");
  888. path.bindTarget("gbuffer2", "sveloc");
  889. path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  890. path.setTarget("taa");
  891. path.bindTarget(current, "tex");
  892. path.bindTarget(last, "tex2");
  893. path.bindTarget("gbuffer2", "sveloc");
  894. path.drawShader("shader_datas/taa_pass/taa_pass");
  895. if (!ssaa4) {
  896. path.setTarget("");
  897. path.bindTarget(taaFrame == 0 ? current : "taa", "tex");
  898. path.drawShader("shader_datas/copy_pass/copy_pass");
  899. }
  900. }
  901. #end
  902. #if (rp_supersampling == 4)
  903. {
  904. if (ssaa4) {
  905. path.setTarget("");
  906. path.bindTarget(taaFrame % 2 == 0 ? "taa2" : "taa", "tex");
  907. path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
  908. }
  909. }
  910. #end
  911. if (UITrait.inst.brush3d) RenderPathPaint.commandsCursor();
  912. taaFrame++;
  913. Context.ddirty--;
  914. Context.pdirty--;
  915. Context.rdirty--;
  916. }
  917. static function drawGbuffer() {
  918. path.setTarget("gbuffer0"); // Only clear gbuffer0
  919. path.clearTarget(null, 1.0);
  920. #if rp_gbuffer2
  921. {
  922. path.setTarget("gbuffer2");
  923. path.clearTarget(0xff000000);
  924. path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
  925. }
  926. #else
  927. {
  928. path.setTarget("gbuffer0", ["gbuffer1"]);
  929. }
  930. #end
  931. // Paint
  932. var tid = Project.layers[0].id;
  933. path.bindTarget("texpaint" + tid, "texpaint");
  934. path.bindTarget("texpaint_nor" + tid, "texpaint_nor");
  935. path.bindTarget("texpaint_pack" + tid, "texpaint_pack");
  936. for (i in 1...Project.layers.length) {
  937. var l = Project.layers[i];
  938. tid = l.id;
  939. path.bindTarget("texpaint" + tid, "texpaint" + tid);
  940. path.bindTarget("texpaint_nor" + tid, "texpaint_nor" + tid);
  941. path.bindTarget("texpaint_pack" + tid, "texpaint_pack" + tid);
  942. if (l.texpaint_mask != null) {
  943. path.bindTarget("texpaint_mask" + tid, "texpaint_mask" + tid);
  944. }
  945. }
  946. //
  947. path.drawMeshes("mesh");
  948. #if rp_decals
  949. {
  950. #if (!kha_opengl)
  951. path.setDepthFrom("gbuffer0", "gbuffer1"); // Unbind depth so we can read it
  952. path.depthToRenderTarget.set("main", path.renderTargets.get("tex"));
  953. #end
  954. path.setTarget("gbuffer0", ["gbuffer1"]);
  955. path.bindTarget("_main", "gbufferD");
  956. path.drawDecals("decal");
  957. #if (!kha_opengl)
  958. path.setDepthFrom("gbuffer0", "tex"); // Re-bind depth
  959. path.depthToRenderTarget.set("main", path.renderTargets.get("gbuffer0"));
  960. #end
  961. }
  962. #end
  963. }
  964. static function drawCompass(currentG:kha.graphics4.Graphics) {
  965. if (UITrait.inst.showCompass) {
  966. var scene = Scene.active;
  967. var cam = Scene.active.camera;
  968. var gizmo:MeshObject = cast scene.getChild(".GizmoTranslate");
  969. var visible = gizmo.visible;
  970. var parent = gizmo.parent;
  971. var loc = gizmo.transform.loc;
  972. var rot = gizmo.transform.rot;
  973. var crot = cam.transform.rot;
  974. var ratio = iron.App.w() / iron.App.h();
  975. var P = cam.P;
  976. cam.P = Mat4.ortho(-8 * ratio, 8 * ratio, -8, 8, -2, 2);
  977. gizmo.visible = true;
  978. gizmo.parent = cam;
  979. gizmo.transform.loc = new Vec4(7.2 * ratio, -7.6, -1);
  980. gizmo.transform.rot = new Quat(-crot.x, -crot.y, -crot.z, crot.w);
  981. gizmo.transform.buildMatrix();
  982. gizmo.render(currentG, "overlay", []);
  983. cam.P = P;
  984. gizmo.visible = visible;
  985. gizmo.parent = parent;
  986. gizmo.transform.loc = loc;
  987. gizmo.transform.rot = rot;
  988. gizmo.transform.buildMatrix();
  989. }
  990. }
  991. #end
  992. }