Files
armorpaint/Sources/arm/node/MaterialParser.hx
T

168 lines
4.9 KiB
Haxe
Raw Normal View History

2019-11-13 15:17:10 +01:00
package arm.node;
2019-05-09 22:38:50 +02:00
import iron.data.SceneFormat;
2019-06-20 11:23:01 +02:00
import iron.data.ShaderData;
2019-05-09 22:38:50 +02:00
import iron.data.MaterialData;
2020-03-18 20:26:28 +01:00
import arm.ui.UISidebar;
2019-05-09 22:38:50 +02:00
import arm.ui.UINodes;
2019-11-13 15:17:10 +01:00
import arm.node.MaterialShader;
2020-03-18 20:26:28 +01:00
import arm.Enums;
2019-05-09 22:38:50 +02:00
class MaterialParser {
2020-03-12 18:12:20 +01:00
public static var defaultScon: ShaderContext = null;
public static var defaultMcon: MaterialContext = null;
2019-05-09 22:38:50 +02:00
2019-12-09 00:28:10 +01:00
static function getMOut(): Bool {
2019-12-04 20:17:29 +01:00
for (n in UINodes.inst.getCanvasMaterial().nodes) if (n.type == "OUTPUT_MATERIAL_PBR") return true;
2019-05-09 22:38:50 +02:00
return false;
}
public static function parseMeshMaterial() {
2020-03-18 20:26:28 +01:00
if (UISidebar.inst.worktab.position == SpaceScene) return;
2019-06-23 14:50:41 +02:00
var m = Project.materials[0].data;
2020-03-12 18:12:20 +01:00
var scon: ShaderContext = null;
for (c in m.shader.contexts) if (c.raw.name == "mesh") { scon = c; break; }
if (scon != null) {
m.shader.raw.contexts.remove(scon.raw);
m.shader.contexts.remove(scon);
}
var con = MaterialBuilder.make_mesh(new MaterialShaderData({name: "Material", canvas: null}));
if (scon != null) scon.delete();
scon = new ShaderContext(con.data, function(scon: ShaderContext){});
scon.overrideContext = {}
if (con.frag.sharedSamplers.length > 0) {
var sampler = con.frag.sharedSamplers[0];
scon.overrideContext.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
}
2020-03-18 20:26:28 +01:00
if (!UISidebar.inst.textureFilter) {
2020-03-12 18:12:20 +01:00
scon.overrideContext.filter = "point";
}
m.shader.raw.contexts.push(scon.raw);
m.shader.contexts.push(scon);
Context.ddirty = 2;
2019-05-31 12:28:27 +02:00
2020-03-12 18:12:20 +01:00
makeVoxel(m);
2019-05-09 22:38:50 +02:00
}
public static function parseParticleMaterial() {
2020-03-18 20:26:28 +01:00
var m = UISidebar.inst.particleMaterial;
2020-03-12 18:12:20 +01:00
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);
2019-05-09 22:38:50 +02:00
}
public static function parseMeshPreviewMaterial() {
if (!getMOut()) return;
2020-03-18 20:26:28 +01:00
var m = UISidebar.inst.worktab.position == SpaceScene ? Context.materialScene.data : Project.materials[0].data;
2020-03-12 18:12:20 +01:00
var scon: ShaderContext = null;
for (c in m.shader.contexts) if (c.raw.name == "mesh") { scon = c; break; }
m.shader.raw.contexts.remove(scon.raw);
m.shader.contexts.remove(scon);
2019-05-09 22:38:50 +02:00
2020-03-12 18:12:20 +01:00
var mcon: TMaterialContext = { name: "mesh", bind_textures: [] };
2019-05-09 22:38:50 +02:00
2020-03-12 18:12:20 +01:00
var sd = new MaterialShaderData({name: "Material", canvas: null});
var con = MaterialBuilder.make_mesh_preview(sd, mcon);
2019-05-09 22:38:50 +02:00
2020-03-12 18:12:20 +01:00
for (i in 0...m.contexts.length) {
if (m.contexts[i].raw.name == "mesh") {
m.contexts[i] = new MaterialContext(mcon, function(self: MaterialContext) {});
break;
2019-05-09 22:38:50 +02:00
}
2020-03-12 18:12:20 +01:00
}
2019-10-06 19:03:59 +02:00
2020-03-12 18:12:20 +01:00
if (scon != null) scon.delete();
2019-05-09 22:38:50 +02:00
2020-03-12 18:12:20 +01:00
var compileError = false;
scon = new ShaderContext(con.data, function(scon: ShaderContext) {
if (scon == null) compileError = true;
});
if (compileError) return;
2019-05-09 22:38:50 +02:00
2020-03-12 18:12:20 +01:00
m.shader.raw.contexts.push(scon.raw);
m.shader.contexts.push(scon);
2019-08-31 20:42:29 +02:00
2020-03-18 20:26:28 +01:00
if (UISidebar.inst.worktab.position == SpaceScene) {
2020-03-12 18:12:20 +01:00
makeVoxel(m);
}
2019-05-09 22:38:50 +02:00
}
2019-12-09 00:28:10 +01:00
static function makeVoxel(m: MaterialData) {
2019-08-31 20:42:29 +02:00
#if rp_voxelao
var rebuild = MaterialBuilder.heightUsed;
#if arm_world
2020-03-12 18:12:20 +01:00
rebuild = true;
2019-08-31 20:42:29 +02:00
#end
if (Config.raw.rp_gi != false && rebuild) {
2020-03-12 18:12:20 +01:00
var scon: ShaderContext = null;
for (c in m.shader.contexts) if (c.raw.name == "voxel") { scon = c; break; }
if (scon != null) MaterialBuilder.make_voxel(scon);
2019-08-31 20:42:29 +02:00
}
#end
}
2019-05-09 22:38:50 +02:00
public static function parsePaintMaterial() {
if (!getMOut()) return;
2019-10-06 19:03:59 +02:00
2020-03-18 20:26:28 +01:00
if (UISidebar.inst.worktab.position == SpaceScene) {
2019-05-09 22:38:50 +02:00
parseMeshPreviewMaterial();
return;
}
2019-06-23 14:50:41 +02:00
var m = Project.materials[0].data;
2020-03-12 18:12:20 +01:00
var scon: ShaderContext = null;
var mcon: MaterialContext = null;
for (c in m.shader.contexts) {
if (c.raw.name == "paint") {
m.shader.raw.contexts.remove(c.raw);
m.shader.contexts.remove(c);
if (c != defaultScon) c.delete();
break;
2019-05-09 22:38:50 +02:00
}
2020-03-11 22:37:57 +01:00
}
2020-03-12 18:12:20 +01:00
for (c in m.contexts) {
if (c.raw.name == "paint") {
m.raw.contexts.remove(c.raw);
m.contexts.remove(c);
break;
2019-05-09 22:38:50 +02:00
}
2020-03-11 22:37:57 +01:00
}
2019-05-09 22:38:50 +02:00
2020-03-12 18:12:20 +01:00
var sdata = new MaterialShaderData({ name: "Material", canvas: UINodes.inst.getCanvasMaterial() });
var mcon = { name: "paint", bind_textures: [] };
var con = MaterialBuilder.make_paint(sdata, mcon);
2019-10-06 19:03:59 +02:00
2020-03-11 22:37:57 +01:00
var compileError = false;
2020-03-12 18:12:20 +01:00
var scon = new ShaderContext(con.data, function(scon: ShaderContext) {
if (scon == null) compileError = true;
2020-03-11 22:37:57 +01:00
});
if (compileError) return;
2020-03-12 18:12:20 +01:00
scon.overrideContext = {}
scon.overrideContext.addressing = "repeat";
var mcon = new MaterialContext(mcon, function(mcon: MaterialContext) {});
2019-10-06 19:03:59 +02:00
2020-03-12 18:12:20 +01:00
m.shader.raw.contexts.push(scon.raw);
m.shader.contexts.push(scon);
m.raw.contexts.push(mcon.raw);
m.contexts.push(mcon);
2019-05-09 22:38:50 +02:00
2020-03-12 18:12:20 +01:00
if (defaultScon == null) defaultScon = scon;
if (defaultMcon == null) defaultMcon = mcon;
2019-05-09 22:38:50 +02:00
}
public static function parseBrush() {
2019-11-13 15:17:10 +01:00
Logic.packageName = "arm.node.brush";
2019-12-09 00:28:10 +01:00
Logic.parse(Context.brush.canvas, false);
2019-05-09 22:38:50 +02:00
}
}