render_path_base.ts 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. let render_path_base_taa_frame: i32 = 0;
  2. let render_path_base_super_sample: f32 = 1.0;
  3. let render_path_base_last_x: f32 = -1.0;
  4. let render_path_base_last_y: f32 = -1.0;
  5. let render_path_base_bloom_mipmaps: render_target_t[];
  6. let render_path_base_bloom_current_mip: i32 = 0;
  7. let render_path_base_bloom_sample_scale: f32;
  8. ///if arm_voxels
  9. let render_path_base_voxels_res: i32 = 256;
  10. let render_path_base_voxels_created: bool = false;
  11. ///end
  12. function render_path_base_init() {
  13. render_path_base_super_sample = config_raw.rp_supersample;
  14. }
  15. ///if arm_voxels
  16. function render_path_base_init_voxels(target_name: string = "voxels") {
  17. if (config_raw.rp_gi != true || render_path_base_voxels_created) {
  18. return;
  19. }
  20. render_path_base_voxels_created = true;
  21. {
  22. let t: render_target_t = render_target_create();
  23. t.name = target_name;
  24. t.format = "R8";
  25. t.width = render_path_base_voxels_res;
  26. t.height = render_path_base_voxels_res;
  27. t.depth = render_path_base_voxels_res;
  28. t.is_image = true;
  29. t.mipmaps = true;
  30. render_path_create_render_target(t);
  31. }
  32. }
  33. ///end
  34. function render_path_base_apply_config() {
  35. if (render_path_base_super_sample != config_raw.rp_supersample) {
  36. render_path_base_super_sample = config_raw.rp_supersample;
  37. let keys: string[] = map_keys(render_path_render_targets);
  38. for (let i: i32 = 0; i < keys.length; ++i) {
  39. let rt: render_target_t = map_get(render_path_render_targets, keys[i]);
  40. if (rt.width == 0 && rt.scale != null) {
  41. rt.scale = render_path_base_super_sample;
  42. }
  43. }
  44. render_path_resize();
  45. }
  46. ///if arm_voxels
  47. if (!render_path_base_voxels_created) {
  48. render_path_base_init_voxels();
  49. }
  50. ///end
  51. }
  52. function render_path_base_get_super_sampling(): f32 {
  53. return render_path_base_super_sample;
  54. }
  55. function render_path_base_draw_compass() {
  56. if (context_raw.show_compass) {
  57. let cam: camera_object_t = scene_camera;
  58. let compass: mesh_object_t = scene_get_child(".Compass").ext;
  59. let _visible: bool = compass.base.visible;
  60. let _parent: object = compass.base.parent;
  61. let _loc: vec4_t = compass.base.transform.loc;
  62. let _rot: quat_t = compass.base.transform.rot;
  63. let crot: quat_t = cam.base.transform.rot;
  64. let ratio: f32 = app_w() / app_h();
  65. let _P: mat4_t = cam.p;
  66. cam.p = mat4_ortho(-8 * ratio, 8 * ratio, -8, 8, -2, 2);
  67. compass.base.visible = true;
  68. compass.base.parent = cam.base;
  69. compass.base.transform.loc = vec4_create(7.4 * ratio, 7.0, -1);
  70. compass.base.transform.rot = quat_create(-crot.x, -crot.y, -crot.z, crot.w);
  71. vec4_set(compass.base.transform.scale, 0.4, 0.4, 0.4);
  72. transform_build_matrix(compass.base.transform);
  73. compass.frustum_culling = false;
  74. mesh_object_render(compass, "overlay", []);
  75. cam.p = _P;
  76. compass.base.visible = _visible;
  77. compass.base.parent = _parent;
  78. compass.base.transform.loc = _loc;
  79. compass.base.transform.rot = _rot;
  80. transform_build_matrix(compass.base.transform);
  81. }
  82. }
  83. function render_path_base_begin() {
  84. // Begin split
  85. if (context_raw.split_view && !context_raw.paint2d_view) {
  86. if (context_raw.view_index_last == -1 && context_raw.view_index == -1) {
  87. // Begin split, draw right viewport first
  88. context_raw.view_index = 1;
  89. }
  90. else {
  91. // Set current viewport
  92. context_raw.view_index = mouse_view_x() > base_w() / 2 ? 1 : 0;
  93. }
  94. let cam: camera_object_t = scene_camera;
  95. if (context_raw.view_index_last > -1) {
  96. // Save current viewport camera
  97. mat4_set_from(camera_views[context_raw.view_index_last], cam.base.transform.local);
  98. }
  99. let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
  100. if (context_raw.view_index_last != context_raw.view_index || decal || !config_raw.brush_3d) {
  101. // Redraw on current viewport change
  102. context_raw.ddirty = 1;
  103. }
  104. transform_set_matrix(cam.base.transform, camera_views[context_raw.view_index]);
  105. camera_object_build_mat(cam);
  106. camera_object_build_proj(cam);
  107. }
  108. // Match projection matrix jitter
  109. let skip_taa: bool = context_raw.split_view || ((context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) && context_raw.pdirty > 0);
  110. scene_camera.frame = skip_taa ? 0 : render_path_base_taa_frame;
  111. camera_object_proj_jitter(scene_camera);
  112. camera_object_build_mat(scene_camera);
  113. }
  114. function render_path_base_end() {
  115. // End split
  116. context_raw.view_index_last = context_raw.view_index;
  117. context_raw.view_index = -1;
  118. if (context_raw.foreground_event && !mouse_down()) {
  119. context_raw.foreground_event = false;
  120. context_raw.pdirty = 0;
  121. }
  122. render_path_base_taa_frame++;
  123. }
  124. function render_path_base_ssaa4(): bool {
  125. return config_raw.rp_supersample == 4;
  126. }
  127. function render_path_base_is_cached(): bool {
  128. if (sys_width() == 0 || sys_height() == 0) {
  129. return true;
  130. }
  131. let mx: f32 = render_path_base_last_x;
  132. let my: f32 = render_path_base_last_y;
  133. render_path_base_last_x = mouse_view_x();
  134. render_path_base_last_y = mouse_view_y();
  135. if (context_raw.ddirty <= 0 && context_raw.rdirty <= 0 && context_raw.pdirty <= 0) {
  136. if (mx != render_path_base_last_x || my != render_path_base_last_y || mouse_locked) {
  137. context_raw.ddirty = 0;
  138. }
  139. ///if (krom_metal || krom_android)
  140. if (context_raw.ddirty > -6) {
  141. ///else
  142. if (context_raw.ddirty > -2) {
  143. ///end
  144. render_path_set_target("");
  145. render_path_bind_target("taa", "tex");
  146. render_path_base_ssaa4() ?
  147. render_path_draw_shader("shader_datas/supersample_resolve/supersample_resolve") :
  148. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  149. render_path_paint_commands_cursor();
  150. if (context_raw.ddirty <= 0) {
  151. context_raw.ddirty--;
  152. }
  153. }
  154. render_path_base_end();
  155. return true;
  156. }
  157. return false;
  158. }
  159. function render_path_base_commands(draw_commands: ()=>void) {
  160. if (render_path_base_is_cached()) {
  161. return;
  162. }
  163. render_path_base_begin();
  164. render_path_paint_begin();
  165. render_path_base_draw_split(draw_commands);
  166. render_path_base_draw_gbuffer();
  167. render_path_paint_draw();
  168. ///if (krom_direct3d12 || krom_vulkan || krom_metal)
  169. if (context_raw.viewport_mode == viewport_mode_t.PATH_TRACE) {
  170. ///if is_paint
  171. let use_live_layer: bool = context_raw.tool == workspace_tool_t.MATERIAL;
  172. ///else
  173. let use_live_layer: bool = false;
  174. ///end
  175. render_path_raytrace_draw(use_live_layer);
  176. return;
  177. }
  178. ///end
  179. draw_commands();
  180. render_path_paint_end();
  181. render_path_base_end();
  182. }
  183. function render_path_base_draw_bloom(tex: string = "tex") {
  184. if (config_raw.rp_bloom != false) {
  185. if (render_path_base_bloom_mipmaps == null) {
  186. render_path_base_bloom_mipmaps = [];
  187. let prev_scale: f32 = 1.0;
  188. for (let i: i32 = 0; i < 10; ++i) {
  189. let t: render_target_t = render_target_create();
  190. t.name = "bloom_mip_" + i;
  191. t.width = 0;
  192. t.height = 0;
  193. t.scale = (prev_scale *= 0.5);
  194. t.format = "RGBA64";
  195. array_push(render_path_base_bloom_mipmaps, render_path_create_render_target(t));
  196. }
  197. render_path_load_shader("shader_datas/bloom_pass/bloom_downsample_pass");
  198. render_path_load_shader("shader_datas/bloom_pass/bloom_upsample_pass");
  199. }
  200. let bloom_radius: f32 = 6.5;
  201. let min_dim: f32 = math_min(render_path_current_w, render_path_current_h);
  202. let log_min_dim: f32 = math_max(1.0, math_log2(min_dim) + (bloom_radius - 8.0));
  203. let num_mips: i32 = math_floor(log_min_dim);
  204. render_path_base_bloom_sample_scale = 0.5 + log_min_dim - num_mips;
  205. for (let i: i32 = 0; i < num_mips; ++i) {
  206. render_path_base_bloom_current_mip = i;
  207. render_path_set_target(render_path_base_bloom_mipmaps[i].name);
  208. render_path_clear_target();
  209. render_path_bind_target(i == 0 ? tex : render_path_base_bloom_mipmaps[i - 1].name, "tex");
  210. render_path_draw_shader("shader_datas/bloom_pass/bloom_downsample_pass");
  211. }
  212. for (let i: i32 = 0; i < num_mips; ++i) {
  213. let mip_level: i32 = num_mips - 1 - i;
  214. render_path_base_bloom_current_mip = mip_level;
  215. render_path_set_target(mip_level == 0 ? tex : render_path_base_bloom_mipmaps[mip_level - 1].name);
  216. render_path_bind_target(render_path_base_bloom_mipmaps[mip_level].name, "tex");
  217. render_path_draw_shader("shader_datas/bloom_pass/bloom_upsample_pass");
  218. }
  219. }
  220. }
  221. function render_path_base_draw_split(draw_commands: ()=>void) {
  222. if (context_raw.split_view && !context_raw.paint2d_view) {
  223. context_raw.ddirty = 2;
  224. let cam: camera_object_t = scene_camera;
  225. context_raw.view_index = context_raw.view_index == 0 ? 1 : 0;
  226. transform_set_matrix(cam.base.transform, camera_views[context_raw.view_index]);
  227. camera_object_build_mat(cam);
  228. camera_object_build_proj(cam);
  229. render_path_base_draw_gbuffer();
  230. ///if (krom_direct3d12 || krom_vulkan || krom_metal)
  231. ///if is_paint
  232. let use_live_layer: bool = context_raw.tool == workspace_tool_t.MATERIAL;
  233. ///else
  234. let use_live_layer: bool = false;
  235. ///end
  236. context_raw.viewport_mode == viewport_mode_t.PATH_TRACE ? render_path_raytrace_draw(use_live_layer) : draw_commands();
  237. ///else
  238. draw_commands();
  239. ///end
  240. context_raw.view_index = context_raw.view_index == 0 ? 1 : 0;
  241. transform_set_matrix(cam.base.transform, camera_views[context_raw.view_index]);
  242. camera_object_build_mat(cam);
  243. camera_object_build_proj(cam);
  244. }
  245. }
  246. ///if arm_voxels
  247. function render_path_base_draw_voxels() {
  248. if (config_raw.rp_gi != false) {
  249. let voxelize: bool = context_raw.ddirty > 0 && render_path_base_taa_frame > 0;
  250. if (voxelize) {
  251. render_path_clear_image("voxels", 0x00000000);
  252. render_path_set_target("");
  253. render_path_set_viewport(render_path_base_voxels_res, render_path_base_voxels_res);
  254. render_path_bind_target("voxels", "voxels");
  255. if (make_material_height_used) {
  256. let tid: i32 = 0; // layers[0].id;
  257. render_path_bind_target("texpaint_pack" + tid, "texpaint_pack");
  258. }
  259. render_path_draw_meshes("voxel");
  260. render_path_gen_mipmaps("voxels");
  261. }
  262. }
  263. }
  264. ///end
  265. function render_path_base_init_ssao() {
  266. {
  267. let t: render_target_t = render_target_create();
  268. t.name = "singlea";
  269. t.width = 0;
  270. t.height = 0;
  271. t.format = "R8";
  272. t.scale = render_path_base_get_super_sampling();
  273. render_path_create_render_target(t);
  274. }
  275. {
  276. let t: render_target_t = render_target_create();
  277. t.name = "singleb";
  278. t.width = 0;
  279. t.height = 0;
  280. t.format = "R8";
  281. t.scale = render_path_base_get_super_sampling();
  282. render_path_create_render_target(t);
  283. }
  284. render_path_load_shader("shader_datas/ssao_pass/ssao_pass");
  285. render_path_load_shader("shader_datas/ssao_blur_pass/ssao_blur_pass_x");
  286. render_path_load_shader("shader_datas/ssao_blur_pass/ssao_blur_pass_y");
  287. }
  288. function render_path_base_draw_ssao() {
  289. let ssao: bool = config_raw.rp_ssao != false && context_raw.camera_type == camera_type_t.PERSPECTIVE;
  290. if (ssao && context_raw.ddirty > 0 && render_path_base_taa_frame > 0) {
  291. if (map_get(render_path_render_targets, "singlea") == null) {
  292. render_path_base_init_ssao();
  293. }
  294. render_path_set_target("singlea");
  295. render_path_bind_target("_main", "gbufferD");
  296. render_path_bind_target("gbuffer0", "gbuffer0");
  297. render_path_draw_shader("shader_datas/ssao_pass/ssao_pass");
  298. render_path_set_target("singleb");
  299. render_path_bind_target("singlea", "tex");
  300. render_path_bind_target("gbuffer0", "gbuffer0");
  301. render_path_draw_shader("shader_datas/ssao_blur_pass/ssao_blur_pass_x");
  302. render_path_set_target("singlea");
  303. render_path_bind_target("singleb", "tex");
  304. render_path_bind_target("gbuffer0", "gbuffer0");
  305. render_path_draw_shader("shader_datas/ssao_blur_pass/ssao_blur_pass_y");
  306. }
  307. }
  308. function render_path_base_draw_deferred_light() {
  309. render_path_set_target("tex");
  310. render_path_bind_target("_main", "gbufferD");
  311. render_path_bind_target("gbuffer0", "gbuffer0");
  312. render_path_bind_target("gbuffer1", "gbuffer1");
  313. let ssao: bool = config_raw.rp_ssao != false && context_raw.camera_type == camera_type_t.PERSPECTIVE;
  314. if (ssao && render_path_base_taa_frame > 0) {
  315. render_path_bind_target("singlea", "ssaotex");
  316. }
  317. else {
  318. render_path_bind_target("empty_white", "ssaotex");
  319. }
  320. let voxelao_pass: bool = false;
  321. ///if arm_voxels
  322. if (config_raw.rp_gi != false) {
  323. voxelao_pass = true;
  324. render_path_bind_target("voxels", "voxels");
  325. }
  326. ///end
  327. voxelao_pass ?
  328. render_path_draw_shader("shader_datas/deferred_light/deferred_light_voxel") :
  329. render_path_draw_shader("shader_datas/deferred_light/deferred_light");
  330. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
  331. render_path_set_depth_from("tex", "gbuffer0"); // Bind depth for world pass
  332. ///end
  333. render_path_set_target("tex");
  334. render_path_draw_skydome("shader_datas/world_pass/world_pass");
  335. ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
  336. render_path_set_depth_from("tex", "gbuffer1"); // Unbind depth
  337. ///end
  338. }
  339. function render_path_base_draw_ssr() {
  340. if (config_raw.rp_ssr != false) {
  341. if (map_get(_render_path_cached_shader_contexts, "shader_datas/ssr_pass/ssr_pass") == null) {
  342. {
  343. let t: render_target_t = render_target_create();
  344. t.name = "bufb";
  345. t.width = 0;
  346. t.height = 0;
  347. t.format = "RGBA64";
  348. render_path_create_render_target(t);
  349. }
  350. render_path_load_shader("shader_datas/ssr_pass/ssr_pass");
  351. render_path_load_shader("shader_datas/ssr_blur_pass/ssr_blur_pass_x");
  352. render_path_load_shader("shader_datas/ssr_blur_pass/ssr_blur_pass_y3_blend");
  353. }
  354. let targeta: string = "bufb";
  355. let targetb: string = "gbuffer1";
  356. render_path_set_target(targeta);
  357. render_path_bind_target("tex", "tex");
  358. render_path_bind_target("_main", "gbufferD");
  359. render_path_bind_target("gbuffer0", "gbuffer0");
  360. render_path_bind_target("gbuffer1", "gbuffer1");
  361. render_path_draw_shader("shader_datas/ssr_pass/ssr_pass");
  362. render_path_set_target(targetb);
  363. render_path_bind_target(targeta, "tex");
  364. render_path_bind_target("gbuffer0", "gbuffer0");
  365. render_path_draw_shader("shader_datas/ssr_blur_pass/ssr_blur_pass_x");
  366. render_path_set_target("tex");
  367. render_path_bind_target(targetb, "tex");
  368. render_path_bind_target("gbuffer0", "gbuffer0");
  369. render_path_draw_shader("shader_datas/ssr_blur_pass/ssr_blur_pass_y3_blend");
  370. }
  371. }
  372. // function render_path_base_draw_motion_blur() {
  373. // if (config_raw.rp_motionblur != false) {
  374. // render_path_set_target("buf");
  375. // render_path_bind_target("tex", "tex");
  376. // render_path_bind_target("gbuffer0", "gbuffer0");
  377. // ///if (rp_motionblur == "Camera")
  378. // {
  379. // render_path_bind_target("_main", "gbufferD");
  380. // render_path_draw_shader("shader_datas/motion_blur_pass/motion_blur_pass");
  381. // }
  382. // ///else
  383. // {
  384. // render_path_bind_target("gbuffer2", "sveloc");
  385. // render_path_draw_shader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  386. // }
  387. // ///end
  388. // render_path_set_target("tex");
  389. // render_path_bind_target("buf", "tex");
  390. // render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  391. // }
  392. // }
  393. // function render_path_base_draw_histogram() {
  394. // {
  395. // let t: render_target_t = RenderTarget.create();
  396. // t.name = "histogram";
  397. // t.width = 1;
  398. // t.height = 1;
  399. // t.format = "RGBA64";
  400. // render_path_create_render_target(t);
  401. // render_path_load_shader("shader_datas/histogram_pass/histogram_pass");
  402. // }
  403. // render_path_set_target("histogram");
  404. // render_path_bind_target("taa", "tex");
  405. // render_path_draw_shader("shader_datas/histogram_pass/histogram_pass");
  406. // }
  407. function render_path_base_draw_taa() {
  408. let current: string = render_path_base_taa_frame % 2 == 0 ? "buf2" : "taa2";
  409. let last: string = render_path_base_taa_frame % 2 == 0 ? "taa2" : "buf2";
  410. render_path_set_target(current);
  411. render_path_clear_target(0x00000000);
  412. render_path_bind_target("buf", "colorTex");
  413. render_path_draw_shader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  414. render_path_set_target("taa");
  415. render_path_clear_target(0x00000000);
  416. render_path_bind_target(current, "edgesTex");
  417. render_path_draw_shader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  418. render_path_set_target(current);
  419. render_path_bind_target("buf", "colorTex");
  420. render_path_bind_target("taa", "blendTex");
  421. render_path_bind_target("gbuffer2", "sveloc");
  422. render_path_draw_shader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  423. let skip_taa: bool = context_raw.split_view;
  424. if (skip_taa) {
  425. render_path_set_target("taa");
  426. render_path_bind_target(current, "tex");
  427. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  428. }
  429. else {
  430. render_path_set_target("taa");
  431. render_path_bind_target(current, "tex");
  432. render_path_bind_target(last, "tex2");
  433. render_path_bind_target("gbuffer2", "sveloc");
  434. render_path_draw_shader("shader_datas/taa_pass/taa_pass");
  435. }
  436. if (render_path_base_ssaa4()) {
  437. render_path_set_target("");
  438. render_path_bind_target(render_path_base_taa_frame % 2 == 0 ? "taa2" : "taa", "tex");
  439. render_path_draw_shader("shader_datas/supersample_resolve/supersample_resolve");
  440. }
  441. else {
  442. render_path_set_target("");
  443. render_path_bind_target(render_path_base_taa_frame == 0 ? current : "taa", "tex");
  444. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  445. }
  446. }
  447. function render_path_base_draw_gbuffer() {
  448. render_path_set_target("gbuffer0"); // Only clear gbuffer0
  449. ///if krom_metal
  450. render_path_clear_target(0x00000000, 1.0, clear_flag_t.COLOR | clear_flag_t.DEPTH);
  451. ///else
  452. render_path_clear_target(null, 1.0, clear_flag_t.DEPTH);
  453. ///end
  454. if (make_mesh_layer_pass_count == 1) {
  455. render_path_set_target("gbuffer2");
  456. render_path_clear_target(0xff000000);
  457. }
  458. render_path_set_target("gbuffer0", ["gbuffer1", "gbuffer2"]);
  459. render_path_paint_bind_layers();
  460. render_path_draw_meshes("mesh");
  461. render_path_paint_unbind_layers();
  462. if (make_mesh_layer_pass_count > 1) {
  463. render_path_base_make_gbuffer_copy_textures();
  464. for (let i: i32 = 1; i < make_mesh_layer_pass_count; ++i) {
  465. let ping: string = i % 2 == 1 ? "_copy" : "";
  466. let pong: string = i % 2 == 1 ? "" : "_copy";
  467. if (i == make_mesh_layer_pass_count - 1) {
  468. render_path_set_target("gbuffer2" + ping);
  469. render_path_clear_target(0xff000000);
  470. }
  471. render_path_set_target("gbuffer0" + ping, ["gbuffer1" + ping, "gbuffer2" + ping]);
  472. render_path_bind_target("gbuffer0" + pong, "gbuffer0");
  473. render_path_bind_target("gbuffer1" + pong, "gbuffer1");
  474. render_path_bind_target("gbuffer2" + pong, "gbuffer2");
  475. render_path_paint_bind_layers();
  476. render_path_draw_meshes("mesh" + i);
  477. render_path_paint_unbind_layers();
  478. }
  479. if (make_mesh_layer_pass_count % 2 == 0) {
  480. render_path_base_copy_to_gbuffer();
  481. }
  482. }
  483. let hide: bool = operator_shortcut(map_get(config_keymap, "stencil_hide"), shortcut_type_t.DOWN) || keyboard_down("control");
  484. let is_decal: bool = base_is_decal_layer();
  485. if (is_decal && !hide) {
  486. line_draw_render(context_raw.layer.decal_mat);
  487. }
  488. }
  489. function render_path_base_make_gbuffer_copy_textures() {
  490. let copy: render_target_t = map_get(render_path_render_targets, "gbuffer0_copy");
  491. if (copy == null || copy._image.width != map_get(render_path_render_targets, "gbuffer0")._image.width || copy._image.height != map_get(render_path_render_targets, "gbuffer0")._image.height) {
  492. {
  493. let t: render_target_t = render_target_create();
  494. t.name = "gbuffer0_copy";
  495. t.width = 0;
  496. t.height = 0;
  497. t.format = "RGBA64";
  498. t.scale = render_path_base_get_super_sampling();
  499. t.depth_buffer = "main";
  500. render_path_create_render_target(t);
  501. }
  502. {
  503. let t: render_target_t = render_target_create();
  504. t.name = "gbuffer1_copy";
  505. t.width = 0;
  506. t.height = 0;
  507. t.format = "RGBA64";
  508. t.scale = render_path_base_get_super_sampling();
  509. render_path_create_render_target(t);
  510. }
  511. {
  512. let t: render_target_t = render_target_create();
  513. t.name = "gbuffer2_copy";
  514. t.width = 0;
  515. t.height = 0;
  516. t.format = "RGBA64";
  517. t.scale = render_path_base_get_super_sampling();
  518. render_path_create_render_target(t);
  519. }
  520. ///if krom_metal
  521. // TODO: Fix depth attach for gbuffer0_copy on metal
  522. // Use resize to re-create buffers from scratch for now
  523. render_path_resize();
  524. ///end
  525. }
  526. }
  527. function render_path_base_copy_to_gbuffer() {
  528. render_path_set_target("gbuffer0", ["gbuffer1", "gbuffer2"]);
  529. render_path_bind_target("gbuffer0_copy", "tex0");
  530. render_path_bind_target("gbuffer1_copy", "tex1");
  531. render_path_bind_target("gbuffer2_copy", "tex2");
  532. render_path_draw_shader("shader_datas/copy_mrt3_pass/copy_mrt3RGBA64_pass");
  533. }