Add curvature bake node

This commit is contained in:
luboslenco
2021-01-23 16:10:26 +01:00
parent a63b988b23
commit 1fa27a9832
10 changed files with 227 additions and 71 deletions
+101 -24
View File
@@ -4,6 +4,7 @@ import zui.Nodes;
import iron.data.SceneFormat;
import iron.data.ShaderData;
import iron.data.MaterialData;
import iron.RenderPath;
import arm.ui.UIHeader;
import arm.ui.UINodes;
import arm.ui.UISidebar;
@@ -12,6 +13,7 @@ import arm.shader.NodeShaderContext;
import arm.shader.NodeShaderData;
import arm.shader.ShaderFunctions;
import arm.shader.MaterialParser;
import arm.render.RenderPathPaint;
import arm.util.RenderUtil;
import arm.Enums;
@@ -174,13 +176,13 @@ class MakeMaterial {
}
#end
public static function parsePaintMaterial() {
public static function parsePaintMaterial(bakePreviews = true) {
if (!getMOut()) return;
{
if (bakePreviews) {
var current = @:privateAccess kha.graphics2.Graphics.current;
if (current != null) current.end();
bakeBlurNodes();
bakeNodePreviews();
if (current != null) current.begin(false);
}
@@ -225,7 +227,7 @@ class MakeMaterial {
if (defaultMcon == null) defaultMcon = mcon;
}
static function bakeBlurNodes() {
static function bakeNodePreviews() {
if (Context.nodePreviewsBlur != null) {
for (image in Context.nodePreviewsBlur) {
image.unload();
@@ -238,35 +240,110 @@ class MakeMaterial {
}
Context.nodePreviewsWarp = null;
}
for (node in UINodes.inst.getCanvasMaterial().nodes) {
if (node.type == "BLUR") {
if (Context.nodePreviewsBlur == null) {
Context.nodePreviewsBlur = new Map();
}
var image = kha.Image.createRenderTarget(Std.int(Config.getTextureResX() / 4), Std.int(Config.getTextureResY() / 4));
Context.nodePreviewsBlur.set(MaterialParser.node_name(node), image);
MaterialParser.blur_passthrough = true;
RenderUtil.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image);
MaterialParser.blur_passthrough = false;
if (Context.nodePreviewsBake != null) {
for (img in Context.nodePreviewsBake) {
img.unload();
}
if (node.type == "DIRECT_WARP") {
if (Context.nodePreviewsWarp == null) {
Context.nodePreviewsWarp = new Map();
Context.nodePreviewsBake = null;
}
traverseNodes(UINodes.inst.getCanvasMaterial().nodes, null, []);
}
static function traverseNodes(nodes: Array<TNode>, group: TNodeCanvas, parents: Array<TNode>) {
for (node in nodes) {
bakeNodePreview(node, group, parents);
if (node.type == "GROUP") {
for (g in Project.materialGroups) {
if (g.canvas.name == node.name) {
parents.push(node);
traverseNodes(g.canvas.nodes, g.canvas, parents);
parents.pop();
break;
}
}
var image = kha.Image.createRenderTarget(Std.int(Config.getTextureResX()), Std.int(Config.getTextureResY()));
Context.nodePreviewsWarp.set(MaterialParser.node_name(node), image);
MaterialParser.warp_passthrough = true;
RenderUtil.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image);
MaterialParser.warp_passthrough = false;
}
}
}
public static function parseNodePreviewMaterial(node: TNode): { scon: ShaderContext, mcon: MaterialContext } {
static function bakeNodePreview(node: TNode, group: TNodeCanvas, parents: Array<TNode>) {
if (node.type == "BLUR") {
if (Context.nodePreviewsBlur == null) {
Context.nodePreviewsBlur = new Map();
}
var image = kha.Image.createRenderTarget(Std.int(Config.getTextureResX() / 4), Std.int(Config.getTextureResY() / 4));
Context.nodePreviewsBlur.set(MaterialParser.node_name(node, parents), image);
MaterialParser.blur_passthrough = true;
RenderUtil.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image);
MaterialParser.blur_passthrough = false;
}
else if (node.type == "DIRECT_WARP") {
if (Context.nodePreviewsWarp == null) {
Context.nodePreviewsWarp = new Map();
}
var image = kha.Image.createRenderTarget(Std.int(Config.getTextureResX()), Std.int(Config.getTextureResY()));
Context.nodePreviewsWarp.set(MaterialParser.node_name(node, parents), image);
MaterialParser.warp_passthrough = true;
RenderUtil.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image);
MaterialParser.warp_passthrough = false;
}
else if (node.type == "BAKE_CURVATURE") {
if (Context.nodePreviewsBake == null) {
Context.nodePreviewsBake = new Map();
}
var id = MaterialParser.node_name(node, parents);
var image = Context.nodePreviewsBake.get(id);
if (image == null) {
image = kha.Image.createRenderTarget(Std.int(Config.getTextureResX()), Std.int(Config.getTextureResY()), kha.graphics4.TextureFormat.L8);
Context.nodePreviewsBake.set(id, image);
}
MaterialParser.bake_passthrough = true;
var res = parseNodePreviewMaterial(node, group, parents);
MaterialParser.bake_passthrough = false;
if (res == null || res.scon == null) return;
if (RenderPathPaint.liveLayer == null) {
RenderPathPaint.liveLayer = new arm.data.LayerSlot("_live");
RenderPathPaint.liveLayer.createMask(0x00000000);
}
var _space = UIHeader.inst.worktab.position;
var _tool = Context.tool;
var _bakeType = Context.bakeType;
UIHeader.inst.worktab.position = SpacePaint;
Context.tool = ToolBake;
Context.bakeType = BakeCurvature;
MaterialParser.bake_passthrough = true;
parsePaintMaterial(false);
Context.pdirty = 1;
RenderPathPaint.useLiveLayer(true);
RenderPathPaint.commandsPaint(false);
RenderPathPaint.dilate(true, true);
RenderPathPaint.useLiveLayer(false);
MaterialParser.bake_passthrough = false;
Context.pdirty = 0;
UIHeader.inst.worktab.position = _space;
Context.tool = _tool;
Context.bakeType = _bakeType;
parsePaintMaterial(false);
var rts = RenderPath.active.renderTargets;
var texpaint_live = rts.get("texpaint_live");
image.g2.begin(false);
image.g2.drawImage(texpaint_live.image, 0, 0);
image.g2.end();
}
}
public static function parseNodePreviewMaterial(node: TNode, group: TNodeCanvas = null, parents: Array<TNode> = null): { scon: ShaderContext, mcon: MaterialContext } {
if (node.outputs.length == 0) return null;
var sdata = new NodeShaderData({ name: "Material", canvas: UINodes.inst.getCanvasMaterial() });
var mcon_raw: TMaterialContext = { name: "mesh", bind_textures: [] };
var con = MakeNodePreview.run(sdata, mcon_raw, node);
var con = MakeNodePreview.run(sdata, mcon_raw, node, group, parents);
var compileError = false;
var scon = new ShaderContext(con.data, function(scon: ShaderContext) {
if (scon == null) compileError = true;