MaterialParser.hx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package arm.node;
  2. import iron.data.SceneFormat;
  3. import iron.data.ShaderData;
  4. import iron.data.MaterialData;
  5. import arm.ui.UITrait;
  6. import arm.ui.UINodes;
  7. import arm.node.MaterialShader;
  8. import arm.Tool;
  9. class MaterialParser {
  10. static var sc: ShaderContext = null;
  11. static var _matcon: TMaterialContext = null;
  12. static var _materialcontext: MaterialContext = null;
  13. static function getMOut(): Bool {
  14. for (n in UINodes.inst.getCanvasMaterial().nodes) if (n.type == "OUTPUT_MATERIAL_PBR") return true;
  15. return false;
  16. }
  17. public static function parseMeshMaterial() {
  18. if (UITrait.inst.worktab.position == SpaceScene) return;
  19. var m = Project.materials[0].data;
  20. // iron.data.Data.getMaterial("Scene", "Material", function(m:iron.data.MaterialData) {
  21. var sc: ShaderContext = null;
  22. for (c in m.shader.contexts) if (c.raw.name == "mesh") { sc = c; break; }
  23. if (sc != null) {
  24. m.shader.raw.contexts.remove(sc.raw);
  25. m.shader.contexts.remove(sc);
  26. }
  27. var con = MaterialBuilder.make_mesh(new MaterialShaderData({name: "Material", canvas: null}));
  28. if (sc != null) sc.delete();
  29. sc = new ShaderContext(con.data, function(sc: ShaderContext){});
  30. sc.overrideContext = {}
  31. if (con.frag.sharedSamplers.length > 0) {
  32. var sampler = con.frag.sharedSamplers[0];
  33. sc.overrideContext.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
  34. }
  35. if (!UITrait.inst.textureFilter) {
  36. sc.overrideContext.filter = "point";
  37. }
  38. m.shader.raw.contexts.push(sc.raw);
  39. m.shader.contexts.push(sc);
  40. Context.ddirty = 2;
  41. makeVoxel(m);
  42. // });
  43. }
  44. public static function parseParticleMaterial() {
  45. var m = UITrait.inst.particleMaterial;
  46. // iron.data.Data.getMaterial("Scene", "MaterialParticle", function(m:iron.data.MaterialData) {
  47. var sc: ShaderContext = null;
  48. for (c in m.shader.contexts) if (c.raw.name == "mesh") { sc = c; break; }
  49. if (sc != null) {
  50. m.shader.raw.contexts.remove(sc.raw);
  51. m.shader.contexts.remove(sc);
  52. }
  53. var con = MaterialBuilder.make_particle(new MaterialShaderData({name: "MaterialParticle", canvas: null}));
  54. if (sc != null) sc.delete();
  55. sc = new ShaderContext(con.data, function(sc: ShaderContext){});
  56. m.shader.raw.contexts.push(sc.raw);
  57. m.shader.contexts.push(sc);
  58. // });
  59. }
  60. public static function parseMeshPreviewMaterial() {
  61. if (!getMOut()) return;
  62. var m = UITrait.inst.worktab.position == SpaceScene ? Context.materialScene.data : Project.materials[0].data;
  63. // iron.data.Data.getMaterial("Scene", "Material", function(m:iron.data.MaterialData) {
  64. var sc: ShaderContext = null;
  65. for (c in m.shader.contexts) if (c.raw.name == "mesh") { sc = c; break; }
  66. m.shader.raw.contexts.remove(sc.raw);
  67. m.shader.contexts.remove(sc);
  68. var matcon: TMaterialContext = { name: "mesh", bind_textures: [] };
  69. var sd = new MaterialShaderData({name: "Material", canvas: null});
  70. var con = MaterialBuilder.make_mesh_preview(sd, matcon);
  71. for (i in 0...m.contexts.length) {
  72. if (m.contexts[i].raw.name == "mesh") {
  73. m.contexts[i] = new MaterialContext(matcon, function(self: MaterialContext) {});
  74. break;
  75. }
  76. }
  77. if (sc != null) sc.delete();
  78. var compileError = false;
  79. sc = new ShaderContext(con.data, function(sc: ShaderContext) {
  80. if (sc == null) compileError = true;
  81. });
  82. if (compileError) return;
  83. m.shader.raw.contexts.push(sc.raw);
  84. m.shader.contexts.push(sc);
  85. if (UITrait.inst.worktab.position == SpaceScene) {
  86. makeVoxel(m);
  87. }
  88. // });
  89. }
  90. static function makeVoxel(m: MaterialData) {
  91. #if rp_voxelao
  92. var rebuild = MaterialBuilder.heightUsed;
  93. #if arm_world
  94. rebuild = true; //UITrait.inst.vxaoExt != 1.0;
  95. #end
  96. if (Config.raw.rp_gi != false && rebuild) {
  97. var sc: ShaderContext = null;
  98. for (c in m.shader.contexts) if (c.raw.name == "voxel") { sc = c; break; }
  99. if (sc != null) MaterialBuilder.make_voxel(sc);
  100. }
  101. #end
  102. }
  103. public static function parsePaintMaterial() {
  104. if (!getMOut()) return;
  105. if (UITrait.inst.worktab.position == SpaceScene) {
  106. parseMeshPreviewMaterial();
  107. return;
  108. }
  109. //
  110. var m = Project.materials[0].data;
  111. sc = null;
  112. _materialcontext = null;
  113. //
  114. // iron.data.Data.getMaterial("Scene", "Material", function(m:iron.data.MaterialData) {
  115. var mat: TMaterial = {
  116. name: "Material",
  117. canvas: UINodes.inst.getCanvasMaterial()
  118. };
  119. var _sd = new MaterialShaderData(mat);
  120. if (sc == null) {
  121. for (c in m.shader.contexts) {
  122. if (c.raw.name == "paint") {
  123. sc = c;
  124. break;
  125. }
  126. }
  127. }
  128. if (_materialcontext == null) {
  129. for (c in m.contexts) {
  130. if (c.raw.name == "paint") {
  131. _materialcontext = c;
  132. _matcon = c.raw;
  133. break;
  134. }
  135. }
  136. }
  137. if (sc != null) {
  138. m.shader.raw.contexts.remove(sc.raw);
  139. m.shader.contexts.remove(sc);
  140. }
  141. if (_materialcontext != null) {
  142. m.raw.contexts.remove(_matcon);
  143. m.contexts.remove(_materialcontext);
  144. }
  145. _matcon = {
  146. name: "paint",
  147. bind_textures: []
  148. }
  149. var con = MaterialBuilder.make_paint(_sd, _matcon);
  150. var cdata = con.data;
  151. // from_source is synchronous..
  152. if (sc != null) sc.delete();
  153. var compileError = false;
  154. sc = new ShaderContext(cdata, function(sc: ShaderContext) {
  155. if (sc == null) compileError = true;
  156. });
  157. if (compileError) return;
  158. sc.overrideContext = {}
  159. sc.overrideContext.addressing = "repeat";
  160. m.shader.raw.contexts.push(sc.raw);
  161. m.shader.contexts.push(sc);
  162. m.raw.contexts.push(_matcon);
  163. new MaterialContext(_matcon, function(self: MaterialContext) {
  164. _materialcontext = self;
  165. m.contexts.push(self);
  166. });
  167. // });
  168. }
  169. public static function parseBrush() {
  170. Logic.packageName = "arm.node.brush";
  171. Logic.parse(Context.brush.canvas, false);
  172. }
  173. }