| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- package arm.node;
- import iron.data.SceneFormat;
- import iron.data.ShaderData;
- import iron.data.MaterialData;
- import arm.ui.UITrait;
- import arm.ui.UINodes;
- import arm.node.MaterialShader;
- import arm.Tool;
- class MaterialParser {
- static var sc: ShaderContext = null;
- static var _matcon: TMaterialContext = null;
- static var _materialcontext: MaterialContext = null;
- static function getMOut(): Bool {
- for (n in UINodes.inst.getCanvasMaterial().nodes) if (n.type == "OUTPUT_MATERIAL_PBR") return true;
- return false;
- }
- public static function parseMeshMaterial() {
- if (UITrait.inst.worktab.position == SpaceScene) return;
- var m = Project.materials[0].data;
- // iron.data.Data.getMaterial("Scene", "Material", function(m:iron.data.MaterialData) {
- var sc: ShaderContext = null;
- for (c in m.shader.contexts) if (c.raw.name == "mesh") { sc = c; break; }
- if (sc != null) {
- m.shader.raw.contexts.remove(sc.raw);
- m.shader.contexts.remove(sc);
- }
- var con = MaterialBuilder.make_mesh(new MaterialShaderData({name: "Material", canvas: null}));
- if (sc != null) sc.delete();
- sc = new ShaderContext(con.data, function(sc: ShaderContext){});
- sc.overrideContext = {}
- if (con.frag.sharedSamplers.length > 0) {
- var sampler = con.frag.sharedSamplers[0];
- sc.overrideContext.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
- }
- if (!UITrait.inst.textureFilter) {
- sc.overrideContext.filter = "point";
- }
- m.shader.raw.contexts.push(sc.raw);
- m.shader.contexts.push(sc);
- Context.ddirty = 2;
- makeVoxel(m);
- // });
- }
- public static function parseParticleMaterial() {
- var m = UITrait.inst.particleMaterial;
- // iron.data.Data.getMaterial("Scene", "MaterialParticle", function(m:iron.data.MaterialData) {
- var sc: ShaderContext = null;
- for (c in m.shader.contexts) if (c.raw.name == "mesh") { sc = c; break; }
- if (sc != null) {
- m.shader.raw.contexts.remove(sc.raw);
- m.shader.contexts.remove(sc);
- }
- var con = MaterialBuilder.make_particle(new MaterialShaderData({name: "MaterialParticle", canvas: null}));
- if (sc != null) sc.delete();
- sc = new ShaderContext(con.data, function(sc: ShaderContext){});
- m.shader.raw.contexts.push(sc.raw);
- m.shader.contexts.push(sc);
- // });
- }
- public static function parseMeshPreviewMaterial() {
- if (!getMOut()) return;
- var m = UITrait.inst.worktab.position == SpaceScene ? Context.materialScene.data : Project.materials[0].data;
- // iron.data.Data.getMaterial("Scene", "Material", function(m:iron.data.MaterialData) {
- var sc: ShaderContext = null;
- for (c in m.shader.contexts) if (c.raw.name == "mesh") { sc = c; break; }
- m.shader.raw.contexts.remove(sc.raw);
- m.shader.contexts.remove(sc);
- var matcon: TMaterialContext = { name: "mesh", bind_textures: [] };
- var sd = new MaterialShaderData({name: "Material", canvas: null});
- var con = MaterialBuilder.make_mesh_preview(sd, matcon);
- for (i in 0...m.contexts.length) {
- if (m.contexts[i].raw.name == "mesh") {
- m.contexts[i] = new MaterialContext(matcon, function(self: MaterialContext) {});
- break;
- }
- }
- if (sc != null) sc.delete();
- var compileError = false;
- sc = new ShaderContext(con.data, function(sc: ShaderContext) {
- if (sc == null) compileError = true;
- });
- if (compileError) return;
- m.shader.raw.contexts.push(sc.raw);
- m.shader.contexts.push(sc);
- if (UITrait.inst.worktab.position == SpaceScene) {
- makeVoxel(m);
- }
- // });
- }
- static function makeVoxel(m: MaterialData) {
- #if rp_voxelao
- var rebuild = MaterialBuilder.heightUsed;
- #if arm_world
- rebuild = true; //UITrait.inst.vxaoExt != 1.0;
- #end
- if (Config.raw.rp_gi != false && rebuild) {
- var sc: ShaderContext = null;
- for (c in m.shader.contexts) if (c.raw.name == "voxel") { sc = c; break; }
- if (sc != null) MaterialBuilder.make_voxel(sc);
- }
- #end
- }
- public static function parsePaintMaterial() {
- if (!getMOut()) return;
- if (UITrait.inst.worktab.position == SpaceScene) {
- parseMeshPreviewMaterial();
- return;
- }
- //
- var m = Project.materials[0].data;
- sc = null;
- _materialcontext = null;
- //
- // iron.data.Data.getMaterial("Scene", "Material", function(m:iron.data.MaterialData) {
- var mat: TMaterial = {
- name: "Material",
- canvas: UINodes.inst.getCanvasMaterial()
- };
- var _sd = new MaterialShaderData(mat);
- if (sc == null) {
- for (c in m.shader.contexts) {
- if (c.raw.name == "paint") {
- sc = c;
- break;
- }
- }
- }
- if (_materialcontext == null) {
- for (c in m.contexts) {
- if (c.raw.name == "paint") {
- _materialcontext = c;
- _matcon = c.raw;
- break;
- }
- }
- }
- if (sc != null) {
- m.shader.raw.contexts.remove(sc.raw);
- m.shader.contexts.remove(sc);
- }
- if (_materialcontext != null) {
- m.raw.contexts.remove(_matcon);
- m.contexts.remove(_materialcontext);
- }
- _matcon = {
- name: "paint",
- bind_textures: []
- }
- var con = MaterialBuilder.make_paint(_sd, _matcon);
- var cdata = con.data;
- // from_source is synchronous..
- if (sc != null) sc.delete();
- var compileError = false;
- sc = new ShaderContext(cdata, function(sc: ShaderContext) {
- if (sc == null) compileError = true;
- });
- if (compileError) return;
- sc.overrideContext = {}
- sc.overrideContext.addressing = "repeat";
- m.shader.raw.contexts.push(sc.raw);
- m.shader.contexts.push(sc);
- m.raw.contexts.push(_matcon);
- new MaterialContext(_matcon, function(self: MaterialContext) {
- _materialcontext = self;
- m.contexts.push(self);
- });
- // });
- }
- public static function parseBrush() {
- Logic.packageName = "arm.node.brush";
- Logic.parse(Context.brush.canvas, false);
- }
- }
|