Curvature baker

This commit is contained in:
luboslenco
2019-07-02 12:09:47 +02:00
parent 167f01f03b
commit 9237b3ad62
4 changed files with 95 additions and 64 deletions
+7
View File
@@ -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);
+34 -47
View File
@@ -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);');
}
}
+21
View File
@@ -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");
}
}
}
}
}
+33 -17
View File
@@ -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 {