make_material.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. let make_material_default_scon: shader_context_t = null;
  2. let make_material_default_mcon: material_context_t = null;
  3. let make_material_height_used = false;
  4. function make_material_parse_mesh_material() {
  5. let m = project_material_data;
  6. for (let i: i32 = 0; i < m._.shader.contexts.length; ++i) {
  7. let c = m._.shader.contexts[i];
  8. if (c.name == "mesh") {
  9. array_remove(m._.shader.contexts, c);
  10. array_remove(m._.shader._.contexts, c);
  11. make_material_delete_context(c);
  12. break;
  13. }
  14. }
  15. let mm: material_t = { name: "Material", canvas: null };
  16. let con = make_mesh_run(mm);
  17. let scon: shader_context_t = shader_context_create(con.data);
  18. scon._.override_context = {};
  19. if (con.frag.shared_samplers.length > 0) {
  20. let sampler = con.frag.shared_samplers[0];
  21. scon._.override_context.shared_sampler = substring(sampler, string_last_index_of(sampler, " ") + 1, sampler.length);
  22. }
  23. if (!context_raw.texture_filter) {
  24. scon._.override_context.filter = "point";
  25. }
  26. scon._.override_context.addressing = "repeat";
  27. array_push(m._.shader.contexts, scon);
  28. array_push(m._.shader._.contexts, scon);
  29. context_raw.ddirty = 2;
  30. ///if arm_voxels
  31. make_material_make_voxel(m);
  32. ///end
  33. ///if (krom_direct3d12 || krom_vulkan)
  34. render_path_raytrace_dirty = 1;
  35. ///end
  36. }
  37. ///if arm_voxels
  38. function make_material_make_voxel(m: material_data_t) {
  39. let rebuild = true; // heightUsed;
  40. if (config_raw.rp_gi != false && rebuild) {
  41. let scon: shader_context_t = null;
  42. for (let i: i32 = 0; i < m._.shader._.contexts.length; ++i) {
  43. let c = m._.shader._.contexts[i];
  44. if (c.name == "voxel") {
  45. scon = c;
  46. break;
  47. }
  48. }
  49. if (scon != null) make_voxel_run(scon);
  50. }
  51. }
  52. ///end
  53. function make_material_parse_paint_material() {
  54. let m = project_material_data;
  55. let scon: shader_context_t = null;
  56. let mcon: material_context_t = null;
  57. for (let i: i32 = 0; i < m._.shader.contexts.length; ++i) {
  58. let c = m._.shader.contexts[i];
  59. if (c.name == "paint") {
  60. array_remove(m._.shader.contexts, c);
  61. array_remove(m._.shader._.contexts, c);
  62. if (c != make_material_default_scon) {
  63. make_material_delete_context(c);
  64. }
  65. break;
  66. }
  67. }
  68. for (let i: i32 = 0; i < m.contexts.length; ++i) {
  69. let c = m.contexts[i];
  70. if (c.name == "paint") {
  71. array_remove(m.contexts, c);
  72. array_remove(m._.contexts, c);
  73. break;
  74. }
  75. }
  76. let sdata: material_t = { name: "Material", canvas: null };
  77. let mcon2: material_context_t = { name: "paint", bind_textures: [] };
  78. let con = make_paint_run(sdata, mcon2);
  79. let compileError = false;
  80. let scon2: shader_context_t;
  81. let _scon: shader_context_t = shader_context_create(con.data);
  82. if (_scon == null) {
  83. compileError = true;
  84. }
  85. scon2 = _scon;
  86. if (compileError) {
  87. return;
  88. }
  89. scon2._.override_context = {};
  90. scon2._.override_context.addressing = "repeat";
  91. let mcon3: material_context_t = material_context_create(mcon2);
  92. array_push(m._.shader.contexts, scon2);
  93. array_push(m._.shader._.contexts, scon2);
  94. array_push(m.contexts, mcon3);
  95. array_push(m._.contexts, mcon3);
  96. if (make_material_default_scon == null) {
  97. make_material_default_scon = scon2;
  98. }
  99. if (make_material_default_mcon == null) {
  100. make_material_default_mcon = mcon3;
  101. }
  102. }
  103. function make_material_get_displace_strength(): f32 {
  104. let sc = context_main_object().base.transform.scale.x;
  105. return config_raw.displace_strength * 0.02 * sc;
  106. }
  107. function make_material_voxelgi_half_extents(): string {
  108. let ext = context_raw.vxao_ext;
  109. return "const vec3 voxelgiHalfExtents = vec3(" + ext + ", " + ext + ", " + ext + ");";
  110. }
  111. function make_material_delete_context(c: shader_context_t) {
  112. app_notify_on_next_frame(function (c: shader_context_t) { // Ensure pipeline is no longer in use
  113. shader_context_delete(c);
  114. }, c);
  115. }