3D brush cursor

This commit is contained in:
unknown
2019-06-01 16:51:31 +02:00
parent 4d705a1488
commit c365f3fabc
10 changed files with 92 additions and 37 deletions
+6 -5
View File
@@ -165,6 +165,7 @@ void main() {
uniform float4x4 VP;
uniform float4x4 invVP;
uniform float2 mouse;
uniform float radius;
Texture2D<float4> gbufferD;
SamplerState _gbufferD_sampler;
Texture2D<float4> gbuffer0;
@@ -194,7 +195,7 @@ SPIRV_Cross_Output main(float4 pos : TEXCOORD1, float2 nor : TEXCOORD0, float2 t
float ax = acos(dot(float3(1,0,0), float3(n.x,0,0)));
float az = acos(dot(float3(0,0,1), float3(0,0,n.z)));
float sy = -sign(n.y);
wpos.xyz += mul(mul(pos.xyz / float3(8,8,8), rotAxis(float3(0,0,1), ax + 3.14/2)),
wpos.xyz += mul(mul(pos.xyz * radius.xxx, rotAxis(float3(0,0,1), ax + 3.14/2)),
rotAxis(float3(1,0,0), -az * sy + 3.14/2));
stage_output.gl_Position = mul(float4(wpos.xyz, 1.0), VP);
stage_output.gl_Position.z = (stage_output.gl_Position.z + stage_output.gl_Position.w) * 0.5;
@@ -205,7 +206,7 @@ SPIRV_Cross_Output main(float4 pos : TEXCOORD1, float2 nor : TEXCOORD0, float2 t
Texture2D<float4> tex;
SamplerState _tex_sampler;
float4 main(float2 texCoord : TEXCOORD0) : SV_Target0 {
return tex.SampleLevel(_tex_sampler, texCoord, 0);
return float4(1.0, 1.0, 1.0, tex.SampleLevel(_tex_sampler, texCoord, 0).a);
}
";
@@ -215,6 +216,7 @@ float4 main(float2 texCoord : TEXCOORD0) : SV_Target0 {
uniform mat4 VP;
uniform mat4 invVP;
uniform vec2 mouse;
uniform float radius;
uniform sampler2D gbufferD;
uniform sampler2D gbuffer0;
in vec4 pos;
@@ -246,7 +248,7 @@ void main() {
wpos.xyz +=
rotAxis(vec3(1,0,0), -az * sy + 3.14/2) *
rotAxis(vec3(0,0,1), ax + 3.14/2) *
(pos.xyz / 8);
(pos.xyz * radius);
gl_Position = VP * vec4(wpos.xyz, 1.0);
}
";
@@ -255,8 +257,7 @@ uniform sampler2D tex;
in vec2 texCoord;
out vec4 FragColor;
void main() {
FragColor = textureLod(tex, texCoord, 0.0);
FragColor.rgb = vec3(1.0);
FragColor = vec4(1.0, 1.0, 1.0, textureLod(tex, texCoord, 0.0).a);
}
";
+2
View File
@@ -32,6 +32,7 @@ class Layers {
public static var cursorVP:ConstantLocation;
public static var cursorInvVP:ConstantLocation;
public static var cursorMouse:ConstantLocation;
public static var cursorRadius:ConstantLocation;
public static var cursorTex:TextureUnit;
public static var cursorGbufferD:TextureUnit;
public static var cursorGbuffer0:TextureUnit;
@@ -173,6 +174,7 @@ class Layers {
cursorVP = pipeCursor.getConstantLocation("VP");
cursorInvVP = pipeCursor.getConstantLocation("invVP");
cursorMouse = pipeCursor.getConstantLocation("mouse");
cursorRadius = pipeCursor.getConstantLocation("radius");
cursorGbufferD = pipeCursor.getTextureUnit("gbufferD");
cursorGbuffer0 = pipeCursor.getTextureUnit("gbuffer0");
cursorTex = pipeCursor.getTextureUnit("tex");
+68 -22
View File
@@ -175,33 +175,79 @@ class MaterialBuilder {
frag.write('float dist = 0.0;');
}
else {
frag.write('vec2 binp = inp.xy * 2.0 - 1.0;');
frag.write('binp.x *= aspectRatio;');
frag.write('binp = binp * 0.5 + 0.5;');
if (UITrait.inst.brush3d) {
#if (kha_opengl || kha_webgl)
frag.write('float depth = textureLod(paintdb, vec2(inp.x, 1.0 - inp.y), 0.0).r;');
#else
frag.write('float depth = textureLod(paintdb, inp.xy, 0.0).r;');
#end
frag.add_uniform('mat4 invVP', '_inverseViewProjectionMatrix');
#if (kha_opengl || kha_webgl)
frag.write('vec2 inp2 = inp;');
#else
frag.write('vec2 inp2 = vec2(inp.x, 1.0 - inp.y);');
#end
frag.write('float4 winp = float4(inp2.xy * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);');
frag.write('winp = mul(winp, invVP);');
frag.write('winp.xyz /= winp.w;');
frag.wposition = true;
// Continuos paint
frag.write('vec2 binplast = inplast.xy * 2.0 - 1.0;');
frag.write('binplast.x *= aspectRatio;');
frag.write('binplast = binplast * 0.5 + 0.5;');
frag.write('vec2 pa = bsp.xy - binp.xy, ba = binplast.xy - binp.xy;');
frag.write('float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);');
frag.write('float dist = length(pa - ba * h);');
if (!UITrait.inst.mirrorX) {
// frag.write('float dist = distance(wposition, winp);');
// frag.write('if (dist > brushRadius) { discard; }');
// Continuos paint
#if (kha_opengl || kha_webgl)
frag.write('float depthlast = textureLod(paintdb, vec2(inplast.x, 1.0 - inplast.y), 0.0).r;');
#else
frag.write('float depthlast = textureLod(paintdb, inplast.xy, 0.0).r;');
#end
#if (kha_opengl || kha_webgl)
frag.write('vec2 inplast2 = inplast;');
#else
frag.write('vec2 inplast2 = vec2(inplast.x, 1.0 - inplast.y);');
#end
frag.write('float4 winplast = float4(inplast2.xy * 2.0 - 1.0, depthlast * 2.0 - 1.0, 1.0);');
frag.write('winplast = mul(winplast, invVP);');
frag.write('winplast.xyz /= winplast.w;');
frag.write('vec3 pa = wposition - winp;');
frag.write('vec3 ba = winplast - winp;');
frag.write('float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);');
frag.write('float dist = length(pa - ba * h);');
frag.write('if (dist > brushRadius) { discard; }');
// if (UITrait.inst.mirrorX) {}
}
else {
frag.write('vec2 binp2 = vec2(0.5 - (binp.x - 0.5), binp.y), binplast2 = vec2(0.5 - (binplast.x - 0.5), binplast.y);');
frag.write('vec2 pa2 = bsp.xy - binp2.xy, ba2 = binplast2.xy - binp2.xy;');
frag.write('float h2 = clamp(dot(pa2, ba2) / dot(ba2, ba2), 0.0, 1.0);');
frag.write('float dist2 = length(pa2 - ba2 * h2);');
frag.write('if (dist > brushRadius && dist2 > brushRadius) { discard; }');
}
//
frag.write('vec2 binp = inp.xy * 2.0 - 1.0;');
frag.write('binp.x *= aspectRatio;');
frag.write('binp = binp * 0.5 + 0.5;');
// frag.write('float dist = distance(bsp.xy, binp.xy);');
// frag.write('if (dist > brushRadius) { discard; }');
// Continuos paint
frag.write('vec2 binplast = inplast.xy * 2.0 - 1.0;');
frag.write('binplast.x *= aspectRatio;');
frag.write('binplast = binplast * 0.5 + 0.5;');
frag.write('vec2 pa = bsp.xy - binp.xy;');
frag.write('vec2 ba = binplast.xy - binp.xy;');
frag.write('float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);');
frag.write('float dist = length(pa - ba * h);');
if (!UITrait.inst.mirrorX) {
frag.write('if (dist > brushRadius) { discard; }');
}
else {
frag.write('vec2 binp2 = vec2(0.5 - (binp.x - 0.5), binp.y), binplast2 = vec2(0.5 - (binplast.x - 0.5), binplast.y);');
frag.write('vec2 pa2 = bsp.xy - binp2.xy, ba2 = binplast2.xy - binp2.xy;');
frag.write('float h2 = clamp(dot(pa2, ba2) / dot(ba2, ba2), 0.0, 1.0);');
frag.write('float dist2 = length(pa2 - ba2 * h2);');
frag.write('if (dist > brushRadius && dist2 > brushRadius) { discard; }');
}
//
// frag.write('float dist = distance(bsp.xy, binp.xy);');
// frag.write('if (dist > brushRadius) { discard; }');
}
}
}
else { // Fill, Bake
+2 -1
View File
@@ -19,7 +19,8 @@ class Uniforms {
var val = (UITrait.inst.brushRadius * UITrait.inst.brushNodesRadius) / 15.0;
var pen = iron.system.Input.getPen();
if (UITrait.penPressureRadius && pen.down()) val *= pen.pressure;
val *= 900 / App.h(); // Projection ratio
if (UITrait.inst.brush3d) val *= 2;
else val *= 900 / App.h(); // Projection ratio
return val;
}
else if (link == '_brushOpacity') {
+3 -4
View File
@@ -186,10 +186,7 @@ class RenderPathDeferred {
ssaa4 ?
path.drawShader("shader_datas/supersample_resolve/supersample_resolve") :
path.drawShader("shader_datas/copy_pass/copy_pass");
if (UITrait.inst.brushWarp) {
RenderPathPaint.commandsCursor();
}
if (UITrait.inst.brush3d) RenderPathPaint.commandsCursor();
return;
}
@@ -752,6 +749,8 @@ class RenderPathDeferred {
}
#end
if (UITrait.inst.brush3d) RenderPathPaint.commandsCursor();
taaFrame++;
UITrait.inst.ddirty--;
UITrait.inst.pdirty--;
@@ -171,6 +171,7 @@ class RenderPathPaint {
var mx = iron.system.Input.getMouse().x / iron.App.w();
var my = 1.0 - (iron.system.Input.getMouse().y / iron.App.h());
g.setFloat2(Layers.cursorMouse, mx, my);
g.setFloat(Layers.cursorRadius, UITrait.inst.brushRadius / 3.4);
g.setMatrix(Layers.cursorVP, iron.Scene.active.camera.VP.self);
var helpMat = iron.math.Mat4.identity();
helpMat.getInverse(iron.Scene.active.camera.VP);
+3
View File
@@ -205,6 +205,9 @@ class UINodes extends iron.Trait {
wx = lay == 0 ? Std.int(iron.App.w()) : UITrait.inst.windowW;
wx += UITrait.inst.toolbarw;
wy = UITrait.inst.headerh * 2;
if (UIView2D.inst.show) {
wy += Std.int(iron.App.h() / 2);
}
var mx = mouse.x + App.x();
var my = mouse.y + App.y();
if (mx < wx || my < wy) return;
+5 -3
View File
@@ -187,7 +187,7 @@ class UITrait extends iron.Trait {
public var brushBias = 1.0;
public var brushPaint = 0;
public var selectedTool = 0;
public var brushWarp = false;
public var brush3d = true;
public var bakeType = 0;
public var bakeStrength = 1.0;
public var bakeRadius = 1.0;
@@ -816,7 +816,7 @@ class UITrait extends iron.Trait {
g.color = 0xffffffff;
// Brush
if (arm.App.uienabled && worktab.position == 0 && !brushWarp) {
if (arm.App.uienabled && worktab.position == 0 && !brush3d) {
var cursorImg = Res.get('cursor.png');
var mouse = iron.system.Input.getMouse();
var mx = mouse.x + iron.App.x();
@@ -1834,7 +1834,9 @@ class UITrait extends iron.Trait {
ui.g.begin(false);
armory.data.Config.save();
}
brushWarp = ui.check(Id.handle({selected: brushWarp}), "Brush Warp");
var brush3dHandle = Id.handle({selected: brush3d});
brush3d = ui.check(brush3dHandle, "3D Brush Cursor");
if (brush3dHandle.changed) MaterialParser.parsePaintMaterial();
}
ui.separator();