diff --git a/Sources/arm/Layers.hx b/Sources/arm/Layers.hx index 49dcb3f0..77ba2be4 100644 --- a/Sources/arm/Layers.hx +++ b/Sources/arm/Layers.hx @@ -115,6 +115,13 @@ class Layers { rts.get("texpaint_blend1").raw.height = Config.getTextureRes(); rts.get("texpaint_blend1").image = Image.createRenderTarget(Config.getTextureRes(), Config.getTextureRes(), TextureFormat.L8); Context.brushBlendDirty = true; + if (rts.get("texpaint_blur") != null) { + rts.get("texpaint_blur").image.unload(); + var size = Std.int(Config.getTextureRes() * 0.95); + rts.get("texpaint_blur").raw.width = size; + rts.get("texpaint_blur").raw.height = size; + rts.get("texpaint_blur").image = Image.createRenderTarget(size, size); + } g.begin(); Context.ddirty = 2; iron.App.removeRender(resizeLayers); diff --git a/Sources/arm/nodes/MaterialBuilder.hx b/Sources/arm/nodes/MaterialBuilder.hx index 20546b3d..acbaf23d 100644 --- a/Sources/arm/nodes/MaterialBuilder.hx +++ b/Sources/arm/nodes/MaterialBuilder.hx @@ -31,34 +31,15 @@ class MaterialBuilder { con_paint.data.color_writes_alpha = [true, true, true, true]; if (Context.tool == ToolBake) { - if (UITrait.inst.bakeType == 0) { // AO - con_paint.data.color_writes_red[0] = false; - con_paint.data.color_writes_green[0] = false; - con_paint.data.color_writes_blue[0] = false; - con_paint.data.color_writes_alpha[0] = false; - con_paint.data.color_writes_red[1] = false; - con_paint.data.color_writes_green[1] = false; - con_paint.data.color_writes_blue[1] = false; - con_paint.data.color_writes_alpha[1] = false; - // con_paint.data.color_writes_red[2] = true; - con_paint.data.color_writes_green[2] = false; // No rough - con_paint.data.color_writes_blue[2] = false; // No met - con_paint.data.color_writes_alpha[2] = false; - } - else { - // con_paint.data.color_writes_red[0] = true; - // con_paint.data.color_writes_green[0] = true; - // con_paint.data.color_writes_blue[0] = true; - // con_paint.data.color_writes_alpha[0] = true; - con_paint.data.color_writes_red[1] = false; - con_paint.data.color_writes_green[1] = false; - con_paint.data.color_writes_blue[1] = false; - con_paint.data.color_writes_alpha[1] = false; - con_paint.data.color_writes_red[2] = false; - con_paint.data.color_writes_green[2] = false; - con_paint.data.color_writes_blue[2] = false; - con_paint.data.color_writes_alpha[2] = false; - } + // Bake into base color, disable other slots + con_paint.data.color_writes_red[1] = false; + con_paint.data.color_writes_green[1] = false; + con_paint.data.color_writes_blue[1] = false; + con_paint.data.color_writes_alpha[1] = false; + con_paint.data.color_writes_red[2] = false; + con_paint.data.color_writes_green[2] = false; + con_paint.data.color_writes_blue[2] = false; + con_paint.data.color_writes_alpha[2] = false; } var vert = con_paint.make_vert(); @@ -129,19 +110,6 @@ class MaterialBuilder { if (UITrait.inst.brushPaint == 1) frag.ndcpos = true; // Project - if (Context.tool == ToolBake) { - if (UITrait.inst.bakeType == 0) { // AO - frag.wposition = true; - frag.n = true; - } - else if (UITrait.inst.bakeType == 1) { // Position - frag.wposition = true; - } - else if (UITrait.inst.bakeType == 4) { // Normal (world) - frag.n = true; - } - } - frag.add_uniform('vec4 inp', '_inputBrush'); frag.add_uniform('vec4 inplast', '_inputBrushLast'); frag.add_uniform('float aspectRatio', '_aspectRatioWindowF'); @@ -636,6 +604,8 @@ class MaterialBuilder { if (Context.tool == ToolBake) { if (UITrait.inst.bakeType == 0) { // AO // Apply normal channel + frag.wposition = true; + frag.n = true; frag.vVec = true; frag.add_function(CyclesFunctions.str_cotangentFrame); #if kha_direct3d11 @@ -652,13 +622,18 @@ class MaterialBuilder { frag.add_uniform('sampler3D voxels'); frag.add_function(CyclesFunctions.str_traceAO); frag.n = true; - var strength = UITrait.inst.bakeStrength; - var radius = UITrait.inst.bakeRadius; - var offset = UITrait.inst.bakeOffset; - frag.write('fragColor[2].r = 1.0 - traceAO(voxpos, n, $radius, $offset) * $strength;'); + var strength = UITrait.inst.bakeAoStrength; + var radius = UITrait.inst.bakeAoRadius; + var offset = UITrait.inst.bakeAoOffset; + // frag.write('fragColor[2].r = 1.0 - traceAO(voxpos, n, $radius, $offset) * $strength;'); + frag.write('fragColor[0].r = 1.0 - traceAO(voxpos, n, $radius, $offset) * $strength;'); + frag.write('fragColor[0].g = fragColor[0].r;'); + frag.write('fragColor[0].b = fragColor[0].r;'); + frag.write('fragColor[0].a = 1.0;'); } else if (UITrait.inst.bakeType == 1) { // Position - frag.write('fragColor[0] = vec4(wposition, 1.0);'); + frag.wposition = true; + frag.write('fragColor[0] = vec4(wposition * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);'); } else if (UITrait.inst.bakeType == 2) { // TexCoord frag.write('fragColor[0] = vec4(texCoord.xy, 0.0, 1.0);'); @@ -672,7 +647,19 @@ class MaterialBuilder { frag.write('fragColor[0] = vec4(matid_r, matid_g, matid_b, 1.0);'); } else if (UITrait.inst.bakeType == 4) { // Normal (World) - frag.write('fragColor[0] = vec4(n, 1.0);'); + frag.n = true; + frag.write('fragColor[0] = vec4(n * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);'); + } + else if (UITrait.inst.bakeType == 5) { // Curvature + var strength = UITrait.inst.bakeCurvStrength * 2.0; + var radius = (1.0 / UITrait.inst.bakeCurvRadius) * 0.25; + var offset = UITrait.inst.bakeCurvOffset / 10; + frag.n = true; + frag.write('vec3 dx = dFdx(n);'); + frag.write('vec3 dy = dFdy(n);'); + frag.write('float curvature = max(dot(dx, dx), dot(dy, dy));'); + frag.write('curvature = clamp(pow(curvature, $radius) * $strength + $offset, 0.0, 1.0);'); + frag.write('fragColor[0] = vec4(curvature, curvature, curvature, 1.0);'); } } diff --git a/Sources/arm/render/RenderPathPaint.hx b/Sources/arm/render/RenderPathPaint.hx index 3694fc1d..18192032 100644 --- a/Sources/arm/render/RenderPathPaint.hx +++ b/Sources/arm/render/RenderPathPaint.hx @@ -1,6 +1,7 @@ package arm.render; import iron.object.MeshObject; +import iron.RenderPath; import iron.Scene; import arm.ui.UITrait; import arm.Tool; @@ -129,6 +130,26 @@ class RenderPathPaint { } path.drawMeshes("paint"); + + if (Context.tool == ToolBake && UITrait.inst.bakeType == 5 && UITrait.inst.bakeCurvSmooth > 0) { // Curvature + if (path.renderTargets.get("texpaint_blur") == null) { + var t = new RenderTargetRaw(); + t.name = "texpaint_blur"; + t.width = Std.int(Config.getTextureRes() * 0.95); + t.height = Std.int(Config.getTextureRes() * 0.95); + t.format = 'RGBA32'; + RenderPath.active.createRenderTarget(t); + } + var blurs = Math.round(UITrait.inst.bakeCurvSmooth); + for (i in 0...blurs) { + path.setTarget("texpaint_blur"); + path.bindTarget(texpaint, "tex"); + path.drawShader("shader_datas/copy_pass/copy_pass"); + path.setTarget(texpaint); + path.bindTarget("texpaint_blur", "tex"); + path.drawShader("shader_datas/copy_pass/copy_pass"); + } + } } } } diff --git a/Sources/arm/ui/UITrait.hx b/Sources/arm/ui/UITrait.hx index f474ce44..835f51be 100644 --- a/Sources/arm/ui/UITrait.hx +++ b/Sources/arm/ui/UITrait.hx @@ -165,9 +165,13 @@ class UITrait { public var brushAngleReject = true; public var brushAngleRejectDot = 0.5; public var bakeType = 0; - public var bakeStrength = 1.0; - public var bakeRadius = 1.0; - public var bakeOffset = 1.0; + public var bakeAoStrength = 1.0; + public var bakeAoRadius = 1.0; + public var bakeAoOffset = 1.0; + public var bakeCurvStrength = 1.0; + public var bakeCurvRadius = 1.0; + public var bakeCurvOffset = 0.0; + public var bakeCurvSmooth = 1; public var xray = false; public var symX = false; @@ -596,7 +600,9 @@ class UITrait { cloneStartY = my; } else { - if (brushTime == 0 && !App.isDragging) { // Paint started + if (brushTime == 0 && + !App.isDragging && + @:privateAccess ui.comboSelectedHandle == null) { // Paint started History.pushUndo = true; if (Context.tool == ToolClone && cloneStartX >= 0.0) { // Clone delta cloneDeltaX = (cloneStartX - mx) / iron.App.w(); @@ -922,21 +928,31 @@ class UITrait { } } else if (Context.tool == ToolBake) { + ui.changed = false; var bakeHandle = Id.handle({position: bakeType}); - bakeType = ui.combo(bakeHandle, ["AO", "Position", "TexCoord", "Material ID", "Normal (World)"], "Bake"); - if (bakeHandle.changed) { - MaterialParser.parsePaintMaterial(); + bakeType = ui.combo(bakeHandle, ["AO", "Position", "TexCoord", "Material ID", "Normal (World)", "Curvature"], "Bake"); + if (bakeType == 0) { // AO + var strengthHandle = Id.handle({value: bakeAoStrength}); + bakeAoStrength = ui.slider(strengthHandle, "Strength", 0.0, 2.0, true); + var radiusHandle = Id.handle({value: bakeAoRadius}); + bakeAoRadius = ui.slider(radiusHandle, "Radius", 0.0, 2.0, true); + var offsetHandle = Id.handle({value: bakeAoOffset}); + bakeAoOffset = ui.slider(offsetHandle, "Offset", 0.0, 2.0, true); } - if (bakeType == 0) { - var h = Id.handle({value: bakeStrength}); - bakeStrength = ui.slider(h, "Strength", 0.0, 2.0, true); - if (h.changed) MaterialParser.parsePaintMaterial(); - var h = Id.handle({value: bakeRadius}); - bakeRadius = ui.slider(h, "Radius", 0.0, 2.0, true); - if (h.changed) MaterialParser.parsePaintMaterial(); - var h = Id.handle({value: bakeOffset}); - bakeOffset = ui.slider(h, "Offset", 0.0, 2.0, true); - if (h.changed) MaterialParser.parsePaintMaterial(); + if (bakeType == 5) { // Curvature + var strengthHandle = Id.handle({value: bakeCurvStrength}); + bakeCurvStrength = ui.slider(strengthHandle, "Strength", 0.0, 2.0, true); + var radiusHandle = Id.handle({value: bakeCurvRadius}); + bakeCurvRadius = ui.slider(radiusHandle, "Radius", 0.0, 2.0, true); + var offsetHandle = Id.handle({value: bakeCurvOffset}); + bakeCurvOffset = ui.slider(offsetHandle, "Offset", 0.0, 2.0, true); + var smoothHandle = Id.handle({value: bakeCurvSmooth}); + bakeCurvSmooth = Std.int(ui.slider(smoothHandle, "Smooth", 0, 5, false, 1)); + } + if (ui.changed) { + MaterialParser.parsePaintMaterial(); + // Context.pdirty = 4; + // pushUndo } } else {