Curvature baker
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user