RenderPathDeferred.hx 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522
  1. package arm.renderpath;
  2. import iron.RenderPath;
  3. import armory.renderpath.Inc;
  4. class RenderPathDeferred {
  5. #if (rp_renderer == "Deferred")
  6. static var path:RenderPath;
  7. #if (rp_gi != "Off")
  8. static var voxels = "voxels";
  9. static var voxelsLast = "voxels";
  10. #end
  11. public static function drawMeshes() {
  12. path.drawMeshes("mesh");
  13. }
  14. public static function applyConfig() {
  15. Inc.applyConfig();
  16. }
  17. public static function init(_path:RenderPath) {
  18. path = _path;
  19. #if (rp_shadowmap && kha_webgl)
  20. Inc.initEmpty();
  21. #end
  22. #if (rp_background == "World")
  23. {
  24. path.loadShader("shader_datas/world_pass/world_pass");
  25. }
  26. #end
  27. #if (rp_translucency)
  28. {
  29. Inc.initTranslucency();
  30. }
  31. #end
  32. #if (rp_gi != "Off")
  33. {
  34. Inc.initGI();
  35. #if arm_voxelgi_temporal
  36. {
  37. Inc.initGI("voxelsB");
  38. }
  39. #end
  40. #if (rp_gi == "Voxel GI")
  41. {
  42. Inc.initGI("voxelsOpac");
  43. Inc.initGI("voxelsNor");
  44. #if (rp_gi_bounces)
  45. Inc.initGI("voxelsBounce");
  46. #end
  47. }
  48. #end
  49. #if (rp_gi == "Voxel AO")
  50. path.loadShader("shader_datas/deferred_indirect/deferred_indirect_VoxelAOvar");
  51. #end
  52. }
  53. #end
  54. {
  55. path.createDepthBuffer("main", "DEPTH24");
  56. var t = new RenderTargetRaw();
  57. t.name = "tex";
  58. t.width = 0;
  59. t.height = 0;
  60. t.displayp = Inc.getDisplayp();
  61. t.format = Inc.getHdrFormat();
  62. t.scale = Inc.getSuperSampling();
  63. t.depth_buffer = "main";
  64. #if rp_autoexposure
  65. t.mipmaps = true;
  66. #end
  67. path.createRenderTarget(t);
  68. #if rp_autoexposure
  69. // Texture lod is fetched manually, prevent mipmap filtering
  70. t.mipmaps = false;
  71. #end
  72. }
  73. {
  74. var t = new RenderTargetRaw();
  75. t.name = "buf";
  76. t.width = 0;
  77. t.height = 0;
  78. t.displayp = Inc.getDisplayp();
  79. t.format = Inc.getHdrFormat();
  80. t.scale = Inc.getSuperSampling();
  81. path.createRenderTarget(t);
  82. }
  83. {
  84. var t = new RenderTargetRaw();
  85. t.name = "gbuffer0";
  86. t.width = 0;
  87. t.height = 0;
  88. t.displayp = Inc.getDisplayp();
  89. t.format = "RGBA64";
  90. t.scale = Inc.getSuperSampling();
  91. t.depth_buffer = "main";
  92. path.createRenderTarget(t);
  93. }
  94. {
  95. var t = new RenderTargetRaw();
  96. t.name = "gbuffer1";
  97. t.width = 0;
  98. t.height = 0;
  99. t.displayp = Inc.getDisplayp();
  100. t.format = "RGBA64";
  101. t.scale = Inc.getSuperSampling();
  102. path.createRenderTarget(t);
  103. }
  104. #if rp_gbuffer2
  105. {
  106. var t = new RenderTargetRaw();
  107. t.name = "gbuffer2";
  108. t.width = 0;
  109. t.height = 0;
  110. t.displayp = Inc.getDisplayp();
  111. t.format = "RGBA64";
  112. t.scale = Inc.getSuperSampling();
  113. path.createRenderTarget(t);
  114. }
  115. {
  116. var t = new RenderTargetRaw();
  117. t.name = "taa";
  118. t.width = 0;
  119. t.height = 0;
  120. t.displayp = Inc.getDisplayp();
  121. t.format = "RGBA32";
  122. t.scale = Inc.getSuperSampling();
  123. path.createRenderTarget(t);
  124. }
  125. #end
  126. path.loadShader("shader_datas/deferred_indirect/deferred_indirect");
  127. path.loadShader("shader_datas/deferred_light/deferred_light");
  128. path.loadShader("shader_datas/deferred_light_quad/deferred_light_quad");
  129. #if rp_probes
  130. path.loadShader("shader_datas/probe_planar/probe_planar");
  131. path.loadShader("shader_datas/probe_cubemap/probe_cubemap");
  132. path.loadShader("shader_datas/copy_pass/copy_pass");
  133. #end
  134. #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
  135. {
  136. path.loadShader("shader_datas/ssgi_pass/ssgi_pass");
  137. path.loadShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_x");
  138. path.loadShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_y");
  139. }
  140. #elseif (rp_ssgi == "SSAO")
  141. {
  142. path.loadShader("shader_datas/ssao_pass/ssao_pass");
  143. path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
  144. path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
  145. }
  146. #end
  147. #if ((rp_ssgi != "Off") || (rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  148. {
  149. var t = new RenderTargetRaw();
  150. t.name = "bufa";
  151. t.width = 0;
  152. t.height = 0;
  153. t.displayp = Inc.getDisplayp();
  154. t.format = "RGBA32";
  155. t.scale = Inc.getSuperSampling();
  156. path.createRenderTarget(t);
  157. }
  158. {
  159. var t = new RenderTargetRaw();
  160. t.name = "bufb";
  161. t.width = 0;
  162. t.height = 0;
  163. t.displayp = Inc.getDisplayp();
  164. t.format = "RGBA32";
  165. t.scale = Inc.getSuperSampling();
  166. path.createRenderTarget(t);
  167. }
  168. #end
  169. // #if rp_rendercapture
  170. // {
  171. // var t = new RenderTargetRaw();
  172. // t.name = "capture";
  173. // t.width = 0;
  174. // t.height = 0;
  175. // t.format = Inc.getRenderCaptureFormat();
  176. // path.createRenderTarget(t);
  177. // }
  178. // #end
  179. #if rp_compositornodes
  180. {
  181. path.loadShader("shader_datas/compositor_pass/compositor_pass");
  182. }
  183. #end
  184. #if ((!rp_compositornodes) || (rp_antialiasing == "TAA") || (rp_rendercapture) || (rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  185. {
  186. path.loadShader("shader_datas/copy_pass/copy_pass");
  187. }
  188. #end
  189. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  190. {
  191. path.loadShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  192. path.loadShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  193. path.loadShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  194. #if (rp_antialiasing == "TAA")
  195. {
  196. path.loadShader("shader_datas/taa_pass/taa_pass");
  197. }
  198. #end
  199. }
  200. #end
  201. #if (rp_supersampling == 4)
  202. {
  203. path.loadShader("shader_datas/supersample_resolve/supersample_resolve");
  204. }
  205. #end
  206. #if rp_volumetriclight
  207. {
  208. path.loadShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  209. path.loadShader("shader_datas/volumetric_light/volumetric_light");
  210. path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  211. path.loadShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y");
  212. {
  213. var t = new RenderTargetRaw();
  214. t.name = "bufvola";
  215. t.width = 0;
  216. t.height = 0;
  217. t.displayp = Inc.getDisplayp();
  218. t.format = "R8";
  219. t.scale = Inc.getSuperSampling();
  220. // t.scale = 0.5;
  221. path.createRenderTarget(t);
  222. }
  223. {
  224. var t = new RenderTargetRaw();
  225. t.name = "bufvolb";
  226. t.width = 0;
  227. t.height = 0;
  228. t.displayp = Inc.getDisplayp();
  229. t.format = "R8";
  230. t.scale = Inc.getSuperSampling();
  231. // t.scale = 0.5;
  232. path.createRenderTarget(t);
  233. }
  234. }
  235. #end
  236. #if rp_ocean
  237. {
  238. path.loadShader("shader_datas/water_pass/water_pass");
  239. }
  240. #end
  241. #if rp_bloom
  242. {
  243. var t = new RenderTargetRaw();
  244. t.name = "bloomtex";
  245. t.width = 0;
  246. t.height = 0;
  247. t.scale = 0.25;
  248. t.format = Inc.getHdrFormat();
  249. path.createRenderTarget(t);
  250. }
  251. {
  252. var t = new RenderTargetRaw();
  253. t.name = "bloomtex2";
  254. t.width = 0;
  255. t.height = 0;
  256. t.scale = 0.25;
  257. t.format = Inc.getHdrFormat();
  258. path.createRenderTarget(t);
  259. }
  260. {
  261. path.loadShader("shader_datas/bloom_pass/bloom_pass");
  262. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  263. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  264. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  265. }
  266. #end
  267. #if rp_sss
  268. {
  269. path.loadShader("shader_datas/sss_pass/sss_pass_x");
  270. path.loadShader("shader_datas/sss_pass/sss_pass_y");
  271. }
  272. #end
  273. #if rp_ssr
  274. {
  275. path.loadShader("shader_datas/ssr_pass/ssr_pass");
  276. path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
  277. path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
  278. #if rp_ssr_half
  279. {
  280. var t = new RenderTargetRaw();
  281. t.name = "ssra";
  282. t.width = 0;
  283. t.height = 0;
  284. t.scale = 0.5;
  285. t.format = Inc.getHdrFormat();
  286. path.createRenderTarget(t);
  287. }
  288. {
  289. var t = new RenderTargetRaw();
  290. t.name = "ssrb";
  291. t.width = 0;
  292. t.height = 0;
  293. t.scale = 0.5;
  294. t.format = Inc.getHdrFormat();
  295. path.createRenderTarget(t);
  296. }
  297. #end
  298. }
  299. #end
  300. #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  301. {
  302. #if (rp_motionblur == "Camera")
  303. {
  304. path.loadShader("shader_datas/motion_blur_pass/motion_blur_pass");
  305. }
  306. #else
  307. {
  308. path.loadShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  309. }
  310. #end
  311. }
  312. #end
  313. #if rp_soft_shadows
  314. {
  315. path.loadShader("shader_datas/dilate_pass/dilate_pass_x");
  316. path.loadShader("shader_datas/dilate_pass/dilate_pass_y");
  317. path.loadShader("shader_datas/visibility_pass/visibility_pass");
  318. path.loadShader("shader_datas/blur_shadow_pass/blur_shadow_pass_x");
  319. path.loadShader("shader_datas/blur_shadow_pass/blur_shadow_pass_y");
  320. {
  321. var t = new RenderTargetRaw();
  322. t.name = "visa";
  323. t.width = 0;
  324. t.height = 0;
  325. t.format = 'R16';
  326. path.createRenderTarget(t);
  327. }
  328. {
  329. var t = new RenderTargetRaw();
  330. t.name = "visb";
  331. t.width = 0;
  332. t.height = 0;
  333. t.format = 'R16';
  334. path.createRenderTarget(t);
  335. }
  336. {
  337. var t = new RenderTargetRaw();
  338. t.name = "dist";
  339. t.width = 0;
  340. t.height = 0;
  341. t.format = 'R16';
  342. path.createRenderTarget(t);
  343. }
  344. }
  345. #end
  346. #if arm_config
  347. {
  348. var t = new RenderTargetRaw();
  349. t.name = "empty_white";
  350. t.width = 1;
  351. t.height = 1;
  352. t.format = 'R8';
  353. var rt = new RenderTarget(t);
  354. var b = haxe.io.Bytes.alloc(1);
  355. b.set(0, 255);
  356. rt.image = kha.Image.fromBytes(b, t.width, t.height, kha.graphics4.TextureFormat.L8);
  357. path.renderTargets.set(t.name, rt);
  358. }
  359. #end
  360. // Paint
  361. {
  362. path.createDepthBuffer("paintdb", "DEPTH16");
  363. }
  364. var w = 1;
  365. for (i in 0...8)
  366. {
  367. var t = new RenderTargetRaw();
  368. t.name = "texpaint_colorid" + i;
  369. t.width = w;
  370. t.height = w;
  371. t.format = 'RGBA32';
  372. path.createRenderTarget(t);
  373. w *= 2;
  374. }
  375. path.loadShader("shader_datas/max_luminance_pass/max_luminance_pass");
  376. path.loadShader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
  377. path.loadShader("shader_datas/copy_mrt4_pass/copy_mrt4_pass");
  378. { // Material preview
  379. {
  380. var t = new RenderTargetRaw();
  381. t.name = "texpreview";
  382. t.width = 1;
  383. t.height = 1;
  384. t.format = 'RGBA32';
  385. path.createRenderTarget(t);
  386. }
  387. {
  388. path.createDepthBuffer("mmain", "DEPTH24");
  389. var t = new RenderTargetRaw();
  390. t.name = "mtex";
  391. t.width = 100;
  392. t.height = 100;
  393. t.format = Inc.getHdrFormat();
  394. t.scale = Inc.getSuperSampling();
  395. t.depth_buffer = "mmain";
  396. path.createRenderTarget(t);
  397. }
  398. {
  399. var t = new RenderTargetRaw();
  400. t.name = "mbuf";
  401. t.width = 100;
  402. t.height = 100;
  403. t.format = Inc.getHdrFormat();
  404. t.scale = Inc.getSuperSampling();
  405. path.createRenderTarget(t);
  406. }
  407. {
  408. var t = new RenderTargetRaw();
  409. t.name = "mgbuffer0";
  410. t.width = 100;
  411. t.height = 100;
  412. t.format = "RGBA64";
  413. t.scale = Inc.getSuperSampling();
  414. t.depth_buffer = "mmain";
  415. path.createRenderTarget(t);
  416. }
  417. {
  418. var t = new RenderTargetRaw();
  419. t.name = "mgbuffer1";
  420. t.width = 100;
  421. t.height = 100;
  422. t.format = "RGBA64";
  423. t.scale = Inc.getSuperSampling();
  424. path.createRenderTarget(t);
  425. }
  426. #if rp_gbuffer2
  427. {
  428. var t = new RenderTargetRaw();
  429. t.name = "mgbuffer2";
  430. t.width = 100;
  431. t.height = 100;
  432. t.format = "RGBA64";
  433. t.scale = Inc.getSuperSampling();
  434. path.createRenderTarget(t);
  435. }
  436. #end
  437. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  438. {
  439. var t = new RenderTargetRaw();
  440. t.name = "mbufa";
  441. t.width = 100;
  442. t.height = 100;
  443. t.format = "RGBA32";
  444. t.scale = Inc.getSuperSampling();
  445. path.createRenderTarget(t);
  446. }
  447. {
  448. var t = new RenderTargetRaw();
  449. t.name = "mbufb";
  450. t.width = 100;
  451. t.height = 100;
  452. t.format = "RGBA32";
  453. t.scale = Inc.getSuperSampling();
  454. path.createRenderTarget(t);
  455. }
  456. #end
  457. }
  458. //
  459. }
  460. // Paint
  461. static var initVoxels = true;
  462. public static function drawShadowMap(l:iron.object.LightObject) {
  463. #if (rp_shadowmap)
  464. var faces = l.data.raw.shadowmap_cube ? 6 : 1;
  465. for (i in 0...faces) {
  466. if (faces > 1) path.currentFace = i;
  467. path.setTarget(Inc.getShadowMap());
  468. // Paint
  469. if (arm.UITrait.inst.paintHeight) {
  470. var tid = arm.UITrait.inst.layers[0].id;
  471. path.bindTarget("texpaint_opt" + tid, "texpaint_opt");
  472. }
  473. //
  474. path.clearTarget(null, 1.0);
  475. path.drawMeshes("shadowmap");
  476. }
  477. path.currentFace = -1;
  478. // One light at a time for now, precompute all lights for tiled
  479. #if rp_soft_shadows
  480. if (l.raw.type != "point") {
  481. path.setTarget("visa"); // Merge using min blend
  482. Inc.bindShadowMap();
  483. path.drawShader("shader_datas/dilate_pass/dilate_pass_x");
  484. path.setTarget("visb");
  485. path.bindTarget("visa", "shadowMap");
  486. path.drawShader("shader_datas/dilate_pass/dilate_pass_y");
  487. }
  488. path.setTarget("visa", ["dist"]);
  489. //if (i == 0) path.clearTarget(0x00000000);
  490. if (l.raw.type != "point") path.bindTarget("visb", "dilate");
  491. Inc.bindShadowMap();
  492. //path.bindTarget("_main", "gbufferD");
  493. path.bindTarget("gbuffer0", "gbuffer0");
  494. path.drawShader("shader_datas/visibility_pass/visibility_pass");
  495. path.setTarget("visb");
  496. path.bindTarget("visa", "tex");
  497. path.bindTarget("gbuffer0", "gbuffer0");
  498. path.bindTarget("dist", "dist");
  499. path.drawShader("shader_datas/blur_shadow_pass/blur_shadow_pass_x");
  500. path.setTarget("visa");
  501. path.bindTarget("visb", "tex");
  502. path.bindTarget("gbuffer0", "gbuffer0");
  503. path.bindTarget("dist", "dist");
  504. path.drawShader("shader_datas/blur_shadow_pass/blur_shadow_pass_y");
  505. #end
  506. #end
  507. }
  508. @:access(iron.RenderPath)
  509. public static function commands() {
  510. if (arm.App.realw() == 0 || arm.App.realh() == 0) return;
  511. // Paint
  512. if (!arm.UITrait.inst.dirty()) {
  513. path.setTarget("");
  514. path.bindTarget("bufb", "tex");
  515. path.drawShader("shader_datas/copy_pass/copy_pass");
  516. return;
  517. }
  518. var tid = arm.UITrait.inst.selectedLayer.id;
  519. if (arm.UITrait.inst.pushUndo) {
  520. var i = arm.UITrait.inst.undoI;
  521. if (arm.UITrait.inst.paintHeight) {
  522. path.setTarget("texpaint_undo" + i, ["texpaint_nor_undo" + i, "texpaint_pack_undo" + i, "texpaint_opt_undo" + i]);
  523. }
  524. else {
  525. path.setTarget("texpaint_undo" + i, ["texpaint_nor_undo" + i, "texpaint_pack_undo" + i]);
  526. }
  527. path.bindTarget("texpaint" + tid, "tex0");
  528. path.bindTarget("texpaint_nor" + tid, "tex1");
  529. path.bindTarget("texpaint_pack" + tid, "tex2");
  530. if (arm.UITrait.inst.paintHeight) {
  531. path.bindTarget("texpaint_opt" + tid, "tex3");
  532. path.drawShader("shader_datas/copy_mrt4_pass/copy_mrt4_pass");
  533. }
  534. else {
  535. path.drawShader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
  536. }
  537. arm.UITrait.inst.undoLayers[arm.UITrait.inst.undoI].targetObject = arm.UITrait.inst.paintObject;
  538. arm.UITrait.inst.undoLayers[arm.UITrait.inst.undoI].targetLayer = arm.UITrait.inst.selectedLayer;
  539. arm.UITrait.inst.undoI = (arm.UITrait.inst.undoI + 1) % arm.UITrait.inst.C.undo_steps;
  540. if (arm.UITrait.inst.undos < arm.UITrait.inst.C.undo_steps) arm.UITrait.inst.undos++;
  541. arm.UITrait.inst.redos = 0;
  542. arm.UITrait.inst.pushUndo = false;
  543. }
  544. if (arm.UITrait.inst.depthDirty()) {
  545. path.setTarget("texpaint" + tid);
  546. path.clearTarget(null, 1.0);
  547. path.drawMeshes("depth"); // TODO: CHECK DEPTH EXPORT
  548. }
  549. if (arm.UITrait.inst.paintDirty()) {
  550. if (arm.UITrait.inst.brushType == 4) { // Pick Color Id
  551. path.setTarget("texpaint_colorid7");
  552. path.clearTarget(0xff000000);
  553. path.bindTarget("_paintdb", "paintdb");
  554. path.drawMeshes("paint");
  555. // Extract picked color to 1x1 texture
  556. for (i in 0...7) {
  557. var j = 7 - i;
  558. path.setTarget("texpaint_colorid" + (j - 1));
  559. path.bindTarget("texpaint_colorid" + j, "tex");
  560. path.drawShader("shader_datas/max_luminance_pass/max_luminance_pass");
  561. }
  562. }
  563. else {
  564. if (arm.UITrait.inst.brushType == 3) { // Bake AO
  565. if (initVoxels) {
  566. initVoxels = false;
  567. var t = new RenderTargetRaw();
  568. t.name = "voxels";
  569. t.format = "R8";
  570. t.width = 256;
  571. t.height = 256;
  572. t.depth = 256;
  573. t.is_image = true;
  574. t.mipmaps = true;
  575. path.createRenderTarget(t);
  576. }
  577. path.clearImage("voxels", 0x00000000);
  578. path.setTarget("");
  579. path.setViewport(256, 256);
  580. path.bindTarget("voxels", "voxels");
  581. path.drawMeshes("voxel");
  582. path.generateMipmaps("voxels");
  583. }
  584. if (arm.UITrait.inst.paintHeight) {
  585. path.setTarget("texpaint" + tid, ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_opt" + tid]);
  586. }
  587. else {
  588. path.setTarget("texpaint" + tid, ["texpaint_nor" + tid, "texpaint_pack" + tid]);
  589. }
  590. path.bindTarget("_paintdb", "paintdb");
  591. if (arm.UITrait.inst.brushType == 3) { // Bake AO
  592. path.bindTarget("voxels", "voxels");
  593. }
  594. if (arm.UITrait.inst.colorIdPicked) {
  595. path.bindTarget("texpaint_colorid0", "texpaint_colorid0");
  596. }
  597. path.drawMeshes("paint");
  598. }
  599. }
  600. //
  601. #if rp_dynres
  602. {
  603. DynamicResolutionScale.run(path);
  604. }
  605. #end
  606. #if rp_gbuffer2
  607. {
  608. path.setTarget("gbuffer2");
  609. path.clearTarget(0xff000000);
  610. path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
  611. }
  612. #else
  613. {
  614. path.setTarget("gbuffer0", ["gbuffer1"]);
  615. }
  616. #end
  617. #if (rp_background == "Clear")
  618. {
  619. path.clearTarget(-1, 1.0);
  620. }
  621. #else
  622. {
  623. path.clearTarget(null, 1.0);
  624. }
  625. #end
  626. // Paint
  627. tid = arm.UITrait.inst.layers[0].id;
  628. path.bindTarget("texpaint" + tid, "texpaint");
  629. path.bindTarget("texpaint_nor" + tid, "texpaint_nor");
  630. path.bindTarget("texpaint_pack" + tid, "texpaint_pack");
  631. if (arm.UITrait.inst.paintHeight) path.bindTarget("texpaint_opt" + tid, "texpaint_opt");
  632. for (i in 1...arm.UITrait.inst.layers.length) {
  633. tid = arm.UITrait.inst.layers[i].id;
  634. path.bindTarget("texpaint" + tid, "texpaint" + tid);
  635. path.bindTarget("texpaint_nor" + tid, "texpaint_nor" + tid);
  636. path.bindTarget("texpaint_pack" + tid, "texpaint_pack" + tid);
  637. if (arm.UITrait.inst.paintHeight) path.bindTarget("texpaint_opt" + tid, "texpaint_opt" + tid);
  638. }
  639. //
  640. #if rp_stereo
  641. {
  642. path.drawStereo(drawMeshes);
  643. }
  644. #else
  645. {
  646. RenderPathCreator.drawMeshes();
  647. }
  648. #end
  649. #if rp_decals
  650. {
  651. // path.setTarget("gbuffer0", ["gbuffer1"]);
  652. path.bindTarget("_main", "gbufferD");
  653. path.drawDecals("decal");
  654. }
  655. #end
  656. #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
  657. {
  658. if (armory.data.Config.raw.rp_ssgi != false) {
  659. path.setTarget("bufa");
  660. path.bindTarget("_main", "gbufferD");
  661. path.bindTarget("gbuffer0", "gbuffer0");
  662. #if (rp_ssgi == "RTGI")
  663. path.bindTarget("gbuffer1", "gbuffer1");
  664. #end
  665. path.drawShader("shader_datas/ssgi_pass/ssgi_pass");
  666. path.setTarget("bufb");
  667. path.bindTarget("gbuffer0", "gbuffer0");
  668. path.bindTarget("bufa", "tex");
  669. path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_x");
  670. path.setTarget("bufa");
  671. path.bindTarget("gbuffer0", "gbuffer0");
  672. path.bindTarget("bufb", "tex");
  673. path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_y");
  674. }
  675. }
  676. #elseif (rp_ssgi == "SSAO")
  677. {
  678. if (armory.data.Config.raw.rp_ssgi != false) {
  679. path.setTarget("bufa");
  680. path.bindTarget("_main", "gbufferD");
  681. path.bindTarget("gbuffer0", "gbuffer0");
  682. path.drawShader("shader_datas/ssao_pass/ssao_pass");
  683. path.setTarget("bufb");
  684. path.bindTarget("bufa", "tex");
  685. path.bindTarget("gbuffer0", "gbuffer0");
  686. path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
  687. path.setTarget("bufa");
  688. path.bindTarget("bufb", "tex");
  689. path.bindTarget("gbuffer0", "gbuffer0");
  690. path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
  691. }
  692. }
  693. #end
  694. // Voxels
  695. #if (rp_gi != "Off")
  696. var relight = false;
  697. if (armory.data.Config.raw.rp_gi != false)
  698. {
  699. var voxelize = path.voxelize();
  700. #if arm_voxelgi_temporal
  701. voxelize = ++RenderPathCreator.voxelFrame % RenderPathCreator.voxelFreq == 0;
  702. if (voxelize) {
  703. voxels = voxels == "voxels" ? "voxelsB" : "voxels";
  704. voxelsLast = voxels == "voxels" ? "voxelsB" : "voxels";
  705. }
  706. #end
  707. if (voxelize) {
  708. var res = Inc.getVoxelRes();
  709. #if (rp_gi == "Voxel GI")
  710. var voxtex = "voxelsOpac";
  711. #else
  712. var voxtex = voxels;
  713. #end
  714. path.clearImage(voxtex, 0x00000000);
  715. path.setTarget("");
  716. path.setViewport(res, res);
  717. path.bindTarget(voxtex, "voxels");
  718. path.drawMeshes("voxel");
  719. relight = true;
  720. }
  721. #if ((rp_gi == "Voxel GI") && (rp_voxelgi_relight))
  722. // Relight if light was moved
  723. for (light in iron.Scene.active.lights) {
  724. if (light.transform.diff()) { relight = true; break; }
  725. }
  726. #end
  727. if (relight) {
  728. #if (rp_gi == "Voxel GI")
  729. // Inc.computeVoxelsBegin();
  730. // for (i in 0...lights.length) Inc.computeVoxels(i); // Redraws SM
  731. // Inc.computeVoxelsEnd();
  732. #if (rp_gi_bounces)
  733. voxels = "voxelsBounce";
  734. #end
  735. #else
  736. path.generateMipmaps(voxels); // AO
  737. #end
  738. }
  739. }
  740. #end
  741. // Indirect
  742. path.setTarget("tex");
  743. // path.bindTarget("_main", "gbufferD");
  744. path.bindTarget("gbuffer0", "gbuffer0");
  745. path.bindTarget("gbuffer1", "gbuffer1");
  746. #if (rp_ssgi != "Off")
  747. {
  748. if (armory.data.Config.raw.rp_ssgi != false) {
  749. path.bindTarget("bufa", "ssaotex");
  750. }
  751. else {
  752. path.bindTarget("empty_white", "ssaotex");
  753. }
  754. }
  755. #end
  756. var voxelao_pass = false;
  757. #if (rp_gi != "Off")
  758. if (armory.data.Config.raw.rp_gi != false)
  759. {
  760. #if (rp_gi == "Voxel AO")
  761. voxelao_pass = true;
  762. #end
  763. path.bindTarget(voxels, "voxels");
  764. #if arm_voxelgi_temporal
  765. {
  766. path.bindTarget(voxelsLast, "voxelsLast");
  767. }
  768. #end
  769. }
  770. #end
  771. if (voxelao_pass) {
  772. path.drawShader("shader_datas/deferred_indirect/deferred_indirect_VoxelAOvar");
  773. }
  774. else {
  775. path.drawShader("shader_datas/deferred_indirect/deferred_indirect");
  776. }
  777. #if rp_probes
  778. if (!path.isProbe) {
  779. var probes = iron.Scene.active.probes;
  780. for (i in 0...probes.length) {
  781. var p = probes[i];
  782. if (!p.visible || p.culled) continue;
  783. path.currentProbeIndex = i;
  784. path.setTarget("tex");
  785. path.bindTarget("gbuffer0", "gbuffer0");
  786. path.bindTarget("gbuffer1", "gbuffer1");
  787. path.bindTarget(p.raw.name, "probeTex");
  788. if (p.data.raw.type == "planar") {
  789. path.drawVolume(p, "shader_datas/probe_planar/probe_planar");
  790. }
  791. else if (p.data.raw.type == "cubemap") {
  792. path.drawVolume(p, "shader_datas/probe_cubemap/probe_cubemap");
  793. }
  794. }
  795. }
  796. #end
  797. // Direct
  798. var lights = iron.Scene.active.lights;
  799. #if (rp_gi == "Voxel GI")
  800. if (relight) Inc.computeVoxelsBegin();
  801. #end
  802. for (i in 0...lights.length) {
  803. var l = lights[i];
  804. if (!l.visible) continue;
  805. path.currentLightIndex = i;
  806. #if (rp_shadowmap)
  807. {
  808. if (path.lightCastShadow()) {
  809. // Paint
  810. // Inc.drawShadowMap(l);
  811. drawShadowMap(l);
  812. //
  813. }
  814. }
  815. #end
  816. #if (rp_gi == "Voxel GI")
  817. if (relight) Inc.computeVoxels(i);
  818. #end
  819. path.setTarget("tex");
  820. // path.bindTarget("_main", "gbufferD");
  821. path.bindTarget("gbuffer0", "gbuffer0");
  822. path.bindTarget("gbuffer1", "gbuffer1");
  823. #if rp_gbuffer2_direct
  824. path.bindTarget("gbuffer2", "gbuffer2");
  825. #end
  826. #if rp_shadowmap
  827. {
  828. if (path.lightCastShadow()) {
  829. #if rp_soft_shadows
  830. path.bindTarget("visa", "svisibility");
  831. #else
  832. Inc.bindShadowMap();
  833. #end
  834. }
  835. }
  836. #end
  837. #if ((rp_voxelgi_shadows) || (rp_voxelgi_refraction))
  838. {
  839. path.bindTarget(voxels, "voxels");
  840. }
  841. #end
  842. if (path.lightIsSun()) {
  843. path.drawShader("shader_datas/deferred_light_quad/deferred_light_quad");
  844. }
  845. else {
  846. path.drawLightVolume("shader_datas/deferred_light/deferred_light");
  847. }
  848. #if rp_volumetriclight
  849. {
  850. path.setTarget("bufvola");
  851. path.bindTarget("_main", "gbufferD");
  852. Inc.bindShadowMap();
  853. if (path.lightIsSun()) {
  854. path.drawShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  855. }
  856. else {
  857. path.drawLightVolume("shader_datas/volumetric_light/volumetric_light");
  858. }
  859. path.setTarget("bufvolb");
  860. path.bindTarget("bufvola", "tex");
  861. path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  862. path.setTarget("tex");
  863. path.bindTarget("bufvolb", "tex");
  864. path.drawShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y");
  865. }
  866. #end
  867. }
  868. path.currentLightIndex = 0;
  869. #if (rp_gi == "Voxel GI")
  870. if (relight) Inc.computeVoxelsEnd();
  871. #end
  872. #if (rp_background == "World")
  873. {
  874. path.drawSkydome("shader_datas/world_pass/world_pass");
  875. }
  876. #end
  877. #if rp_ocean
  878. {
  879. path.setTarget("tex");
  880. path.bindTarget("_main", "gbufferD");
  881. path.drawShader("shader_datas/water_pass/water_pass");
  882. }
  883. #end
  884. #if rp_blending
  885. {
  886. path.drawMeshes("blend");
  887. }
  888. #end
  889. #if rp_translucency
  890. {
  891. var hasLight = iron.Scene.active.lights.length > 0;
  892. if (hasLight) Inc.drawTranslucency("tex");
  893. }
  894. #end
  895. #if rp_bloom
  896. {
  897. if (armory.data.Config.raw.rp_bloom != false) {
  898. path.setTarget("bloomtex");
  899. path.bindTarget("tex", "tex");
  900. path.drawShader("shader_datas/bloom_pass/bloom_pass");
  901. path.setTarget("bloomtex2");
  902. path.bindTarget("bloomtex", "tex");
  903. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  904. path.setTarget("bloomtex");
  905. path.bindTarget("bloomtex2", "tex");
  906. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  907. path.setTarget("bloomtex2");
  908. path.bindTarget("bloomtex", "tex");
  909. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  910. path.setTarget("bloomtex");
  911. path.bindTarget("bloomtex2", "tex");
  912. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  913. path.setTarget("bloomtex2");
  914. path.bindTarget("bloomtex", "tex");
  915. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  916. path.setTarget("bloomtex");
  917. path.bindTarget("bloomtex2", "tex");
  918. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  919. path.setTarget("bloomtex2");
  920. path.bindTarget("bloomtex", "tex");
  921. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  922. path.setTarget("tex");
  923. path.bindTarget("bloomtex2", "tex");
  924. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  925. }
  926. }
  927. #end
  928. #if rp_sss
  929. {
  930. path.setTarget("buf");
  931. path.bindTarget("tex", "tex");
  932. path.bindTarget("_main", "gbufferD");
  933. path.bindTarget("gbuffer2", "gbuffer2");
  934. path.drawShader("shader_datas/sss_pass/sss_pass_x");
  935. path.setTarget("tex");
  936. // TODO: can not bind tex
  937. path.bindTarget("tex", "tex");
  938. path.bindTarget("_main", "gbufferD");
  939. path.bindTarget("gbuffer2", "gbuffer2");
  940. path.drawShader("shader_datas/sss_pass/sss_pass_y");
  941. }
  942. #end
  943. #if rp_ssr
  944. {
  945. if (armory.data.Config.raw.rp_ssr != false) {
  946. #if rp_ssr_half
  947. var targeta = "ssra";
  948. var targetb = "ssrb";
  949. #else
  950. var targeta = "buf";
  951. var targetb = "gbuffer1";
  952. #end
  953. path.setTarget(targeta);
  954. path.bindTarget("tex", "tex");
  955. path.bindTarget("_main", "gbufferD");
  956. path.bindTarget("gbuffer0", "gbuffer0");
  957. path.bindTarget("gbuffer1", "gbuffer1");
  958. path.drawShader("shader_datas/ssr_pass/ssr_pass");
  959. path.setTarget(targetb);
  960. path.bindTarget(targeta, "tex");
  961. path.bindTarget("gbuffer0", "gbuffer0");
  962. path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
  963. path.setTarget("tex");
  964. path.bindTarget(targetb, "tex");
  965. path.bindTarget("gbuffer0", "gbuffer0");
  966. path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
  967. }
  968. }
  969. #end
  970. #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  971. {
  972. if (armory.data.Config.raw.rp_motionblur != false) {
  973. path.setTarget("buf");
  974. path.bindTarget("tex", "tex");
  975. path.bindTarget("gbuffer0", "gbuffer0");
  976. #if (rp_motionblur == "Camera")
  977. {
  978. path.bindTarget("_main", "gbufferD");
  979. path.drawShader("shader_datas/motion_blur_pass/motion_blur_pass");
  980. }
  981. #else
  982. {
  983. path.bindTarget("gbuffer2", "sveloc");
  984. path.drawShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  985. }
  986. #end
  987. path.setTarget("tex");
  988. path.bindTarget("buf", "tex");
  989. path.drawShader("shader_datas/copy_pass/copy_pass");
  990. }
  991. }
  992. #end
  993. // We are just about to enter compositing, add more custom passes here
  994. // #if rp_custom_pass
  995. // {
  996. // }
  997. // #end
  998. // Begin compositor
  999. #if rp_autoexposure
  1000. {
  1001. path.generateMipmaps("tex");
  1002. }
  1003. #end
  1004. #if ((rp_supersampling == 4) || (rp_rendercapture))
  1005. var framebuffer = "buf";
  1006. #else
  1007. var framebuffer = "";
  1008. #end
  1009. #if ((rp_antialiasing == "Off") || (rp_antialiasing == "FXAA") || (!rp_render_to_texture))
  1010. {
  1011. RenderPathCreator.finalTarget = path.currentTarget;
  1012. path.setTarget(framebuffer);
  1013. }
  1014. #else
  1015. {
  1016. RenderPathCreator.finalTarget = path.currentTarget;
  1017. path.setTarget("buf");
  1018. }
  1019. #end
  1020. path.bindTarget("tex", "tex");
  1021. #if rp_compositordepth
  1022. {
  1023. path.bindTarget("_main", "gbufferD");
  1024. }
  1025. #end
  1026. #if rp_compositornodes
  1027. {
  1028. if (!path.isProbe) path.drawShader("shader_datas/compositor_pass/compositor_pass");
  1029. else path.drawShader("shader_datas/copy_pass/copy_pass");
  1030. }
  1031. #else
  1032. {
  1033. path.drawShader("shader_datas/copy_pass/copy_pass");
  1034. }
  1035. #end
  1036. // End compositor
  1037. #if rp_overlays
  1038. {
  1039. path.clearTarget(null, 1.0);
  1040. path.drawMeshes("overlay");
  1041. }
  1042. #end
  1043. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  1044. {
  1045. path.setTarget("bufa");
  1046. path.clearTarget(0x00000000);
  1047. path.bindTarget("buf", "colorTex");
  1048. path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  1049. path.setTarget("bufb");
  1050. path.clearTarget(0x00000000);
  1051. path.bindTarget("bufa", "edgesTex");
  1052. path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  1053. #if (rp_antialiasing == "TAA")
  1054. path.isProbe ? path.setTarget(framebuffer) : path.setTarget("bufa");
  1055. #else
  1056. path.setTarget(framebuffer);
  1057. #end
  1058. path.bindTarget("buf", "colorTex");
  1059. path.bindTarget("bufb", "blendTex");
  1060. #if (rp_antialiasing == "TAA")
  1061. {
  1062. path.bindTarget("gbuffer2", "sveloc");
  1063. }
  1064. #end
  1065. path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  1066. #if (rp_antialiasing == "TAA")
  1067. {
  1068. if (!path.isProbe) { // No last frame for probe
  1069. // Paint
  1070. var isLast = arm.UITrait.inst.ddirty == 1 || arm.UITrait.inst.rdirty == 1;
  1071. path.setTarget(isLast ? "bufb" : framebuffer);
  1072. path.bindTarget("bufa", "tex");
  1073. path.bindTarget("taa", "tex2");
  1074. path.bindTarget("gbuffer2", "sveloc");
  1075. path.drawShader("shader_datas/taa_pass/taa_pass");
  1076. if (isLast) {
  1077. path.setTarget(framebuffer);
  1078. path.bindTarget("bufb", "tex");
  1079. path.drawShader("shader_datas/copy_pass/copy_pass");
  1080. }
  1081. else {
  1082. path.setTarget("taa");
  1083. path.bindTarget("bufa", "tex");
  1084. path.drawShader("shader_datas/copy_pass/copy_pass");
  1085. }
  1086. //
  1087. // path.setTarget(framebuffer);
  1088. // path.bindTarget("bufa", "tex");
  1089. // path.bindTarget("taa", "tex2");
  1090. // path.bindTarget("gbuffer2", "sveloc");
  1091. // path.drawShader("shader_datas/taa_pass/taa_pass");
  1092. // path.setTarget("taa");
  1093. // path.bindTarget("bufa", "tex");
  1094. // path.drawShader("shader_datas/copy_pass/copy_pass");
  1095. //
  1096. }
  1097. }
  1098. #end
  1099. }
  1100. #end
  1101. #if (rp_supersampling == 4)
  1102. {
  1103. // #if rp_rendercapture
  1104. // TODO: ss4 + capture broken
  1105. // var finalTarget = "capture";
  1106. // #else
  1107. var finalTarget = "";
  1108. // #end
  1109. path.setTarget(finalTarget);
  1110. path.bindTarget(framebuffer, "tex");
  1111. path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
  1112. }
  1113. // #elseif (rp_rendercapture)
  1114. // {
  1115. // path.setTarget("capture");
  1116. // path.bindTarget(framebuffer, "tex");
  1117. // path.drawShader("shader_datas/copy_pass/copy_pass");
  1118. // }
  1119. #end
  1120. // paint
  1121. arm.UITrait.inst.ddirty--;
  1122. arm.UITrait.inst.pdirty--;
  1123. arm.UITrait.inst.rdirty--;
  1124. //
  1125. }
  1126. @:access(iron.RenderPath)
  1127. public static function commandsPreview() {
  1128. #if rp_gbuffer2
  1129. {
  1130. path.setTarget("mgbuffer2");
  1131. path.clearTarget(0xff000000);
  1132. path.setTarget("mgbuffer0", ["mgbuffer1", "mgbuffer2"]);
  1133. }
  1134. #else
  1135. {
  1136. path.setTarget("mgbuffer0", ["mgbuffer1"]);
  1137. }
  1138. #end
  1139. #if (rp_background == "Clear")
  1140. {
  1141. path.clearTarget(-1, 1.0);
  1142. }
  1143. #else
  1144. {
  1145. path.clearTarget(null, 1.0);
  1146. }
  1147. #end
  1148. RenderPathCreator.drawMeshes();
  1149. // Indirect
  1150. path.setTarget("mtex");
  1151. // path.bindTarget("_mmain", "gbufferD");
  1152. path.bindTarget("mgbuffer0", "gbuffer0");
  1153. path.bindTarget("mgbuffer1", "gbuffer1");
  1154. #if (rp_ssgi != "Off")
  1155. {
  1156. path.bindTarget("empty_white", "ssaotex");
  1157. }
  1158. #end
  1159. path.drawShader("shader_datas/deferred_indirect/deferred_indirect");
  1160. // Direct
  1161. var lights = iron.Scene.active.lights;
  1162. for (i in 0...lights.length) {
  1163. var l = lights[i];
  1164. if (!l.visible) continue;
  1165. path.currentLightIndex = i;
  1166. path.setTarget("mtex");
  1167. // path.bindTarget("_mmain", "gbufferD");
  1168. path.bindTarget("mgbuffer0", "gbuffer0");
  1169. path.bindTarget("mgbuffer1", "gbuffer1");
  1170. #if rp_gbuffer2_direct
  1171. path.bindTarget("mgbuffer2", "gbuffer2");
  1172. #end
  1173. if (path.lightIsSun()) {
  1174. path.drawShader("shader_datas/deferred_light_quad/deferred_light_quad");
  1175. }
  1176. else {
  1177. path.drawLightVolume("shader_datas/deferred_light/deferred_light");
  1178. }
  1179. }
  1180. path.currentLightIndex = 0;
  1181. #if (rp_background == "World")
  1182. {
  1183. path.drawSkydome("shader_datas/world_pass/world_pass");
  1184. }
  1185. #end
  1186. var framebuffer = "texpreview";
  1187. #if arm_editor
  1188. var selectedMat = arm.UITrait.inst.htab.position == 0 ? arm.UITrait.inst.selectedMaterial2 : arm.UITrait.inst.selectedMaterial;
  1189. #else
  1190. var selectedMat = arm.UITrait.inst.selectedMaterial;
  1191. #end
  1192. iron.RenderPath.active.renderTargets.get("texpreview").image = selectedMat.image;
  1193. #if ((rp_antialiasing == "Off") || (rp_antialiasing == "FXAA") || (!rp_render_to_texture))
  1194. {
  1195. path.setTarget(framebuffer);
  1196. }
  1197. #else
  1198. {
  1199. path.setTarget("mbuf");
  1200. }
  1201. #end
  1202. path.bindTarget("mtex", "tex");
  1203. #if rp_compositordepth
  1204. {
  1205. path.bindTarget("_mmain", "gbufferD");
  1206. }
  1207. #end
  1208. #if rp_compositornodes
  1209. {
  1210. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  1211. }
  1212. #else
  1213. {
  1214. path.drawShader("shader_datas/copy_pass/copy_pass");
  1215. }
  1216. #end
  1217. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  1218. {
  1219. path.setTarget("mbufa");
  1220. path.clearTarget(0x00000000);
  1221. path.bindTarget("mbuf", "colorTex");
  1222. path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  1223. path.setTarget("mbufb");
  1224. path.clearTarget(0x00000000);
  1225. path.bindTarget("mbufa", "edgesTex");
  1226. path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  1227. path.setTarget(framebuffer);
  1228. path.clearTarget(0x00000000, 0.0);
  1229. path.bindTarget("mbuf", "colorTex");
  1230. path.bindTarget("mbufb", "blendTex");
  1231. #if (rp_antialiasing == "TAA")
  1232. {
  1233. path.bindTarget("mgbuffer2", "sveloc");
  1234. }
  1235. #end
  1236. path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  1237. }
  1238. #end
  1239. }
  1240. @:access(iron.RenderPath)
  1241. public static function commandsSticker() {
  1242. #if rp_gbuffer2
  1243. {
  1244. path.setTarget("gbuffer2");
  1245. path.clearTarget(0xff000000);
  1246. path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
  1247. }
  1248. #else
  1249. {
  1250. path.setTarget("gbuffer0", ["gbuffer1"]);
  1251. }
  1252. #end
  1253. #if (rp_background == "Clear")
  1254. {
  1255. path.clearTarget(-1, 1.0);
  1256. }
  1257. #else
  1258. {
  1259. path.clearTarget(null, 1.0);
  1260. }
  1261. #end
  1262. RenderPathCreator.drawMeshes();
  1263. // Indirect
  1264. path.setTarget("tex");
  1265. // path.bindTarget("_main", "gbufferD");
  1266. path.bindTarget("gbuffer0", "gbuffer0");
  1267. path.bindTarget("gbuffer1", "gbuffer1");
  1268. #if (rp_ssgi != "Off")
  1269. {
  1270. path.bindTarget("empty_white", "ssaotex");
  1271. }
  1272. #end
  1273. path.drawShader("shader_datas/deferred_indirect/deferred_indirect");
  1274. // Direct
  1275. var lights = iron.Scene.active.lights;
  1276. for (i in 0...lights.length) {
  1277. var l = lights[i];
  1278. if (!l.visible) continue;
  1279. path.currentLightIndex = i;
  1280. path.setTarget("tex");
  1281. // path.bindTarget("_main", "gbufferD");
  1282. path.bindTarget("gbuffer0", "gbuffer0");
  1283. path.bindTarget("gbuffer1", "gbuffer1");
  1284. #if rp_gbuffer2_direct
  1285. path.bindTarget("gbuffer2", "gbuffer2");
  1286. #end
  1287. if (path.lightIsSun()) {
  1288. path.drawShader("shader_datas/deferred_light_quad/deferred_light_quad");
  1289. }
  1290. else {
  1291. path.drawLightVolume("shader_datas/deferred_light/deferred_light");
  1292. }
  1293. }
  1294. path.currentLightIndex = 0;
  1295. #if (rp_background == "World")
  1296. {
  1297. path.drawSkydome("shader_datas/world_pass/world_pass");
  1298. }
  1299. #end
  1300. var framebuffer = "texpreview";
  1301. iron.RenderPath.active.renderTargets.get("texpreview").image = arm.UITrait.inst.stickerImage;
  1302. #if ((rp_antialiasing == "Off") || (rp_antialiasing == "FXAA") || (!rp_render_to_texture))
  1303. {
  1304. path.setTarget(framebuffer);
  1305. }
  1306. #else
  1307. {
  1308. path.setTarget("buf");
  1309. }
  1310. #end
  1311. path.bindTarget("tex", "tex");
  1312. #if rp_compositordepth
  1313. {
  1314. path.bindTarget("_main", "gbufferD");
  1315. }
  1316. #end
  1317. #if rp_compositornodes
  1318. {
  1319. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  1320. }
  1321. #else
  1322. {
  1323. path.drawShader("shader_datas/copy_pass/copy_pass");
  1324. }
  1325. #end
  1326. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  1327. {
  1328. path.setTarget("bufa");
  1329. path.clearTarget(0x00000000);
  1330. path.bindTarget("buf", "colorTex");
  1331. path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  1332. path.setTarget("bufb");
  1333. path.clearTarget(0x00000000);
  1334. path.bindTarget("bufa", "edgesTex");
  1335. path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  1336. path.setTarget(framebuffer);
  1337. path.clearTarget(0x00000000, 0.0);
  1338. path.bindTarget("buf", "colorTex");
  1339. path.bindTarget("bufb", "blendTex");
  1340. #if (rp_antialiasing == "TAA")
  1341. {
  1342. path.bindTarget("gbuffer2", "sveloc");
  1343. }
  1344. #end
  1345. path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  1346. }
  1347. #end
  1348. }
  1349. #end
  1350. }