diff --git a/Shaders/painter/glsl/layer_view.frag.glsl b/Shaders/painter/glsl/layer_view.frag.glsl index fb5ca02a..5d3fdd19 100644 --- a/Shaders/painter/glsl/layer_view.frag.glsl +++ b/Shaders/painter/glsl/layer_view.frag.glsl @@ -1,8 +1,23 @@ #version 330 uniform sampler2D tex; +uniform int channel; in vec2 texCoord; in vec4 color; out vec4 FragColor; void main() { - FragColor = textureLod(tex, texCoord, 0) * color; + if (channel == 1) { + FragColor = textureLod(tex, texCoord, 0).rrra * color; + } + else if (channel == 2) { + FragColor = textureLod(tex, texCoord, 0).ggga * color; + } + else if (channel == 3) { + FragColor = textureLod(tex, texCoord, 0).bbba * color; + } + else if (channel == 4) { + FragColor = textureLod(tex, texCoord, 0).aaaa * color; + } + else { + FragColor = textureLod(tex, texCoord, 0).rgba * color; + } } diff --git a/Shaders/painter/hlsl/layer_merge.vert.glsl b/Shaders/painter/hlsl/layer_merge.vert.glsl index 64937e0e..38cf0b8f 100644 Binary files a/Shaders/painter/hlsl/layer_merge.vert.glsl and b/Shaders/painter/hlsl/layer_merge.vert.glsl differ diff --git a/Shaders/painter/hlsl/layer_view.frag.glsl b/Shaders/painter/hlsl/layer_view.frag.glsl index e732fbcf..8ec76148 100644 Binary files a/Shaders/painter/hlsl/layer_view.frag.glsl and b/Shaders/painter/hlsl/layer_view.frag.glsl differ diff --git a/Shaders/painter/hlsl/src/build.bat b/Shaders/painter/hlsl/src/build.bat new file mode 100644 index 00000000..cbc8dd4c --- /dev/null +++ b/Shaders/painter/hlsl/src/build.bat @@ -0,0 +1,7 @@ +..\..\..\bin\hlslbin.exe cursor.vert.hlsl ..\cursor.vert.glsl vs_5_0 -i nor -i pos -i tex +..\..\..\bin\hlslbin.exe cursor.frag.hlsl ..\cursor.frag.glsl ps_5_0 +..\..\..\bin\hlslbin.exe layer_view.vert.hlsl ..\layer_view.vert.glsl vs_5_0 -i col -i pos -i tex +..\..\..\bin\hlslbin.exe layer_view.frag.hlsl ..\layer_view.frag.glsl ps_5_0 +..\..\..\bin\hlslbin.exe layer_merge.vert.hlsl ..\layer_merge.vert.glsl vs_5_0 -i col -i pos -i tex +..\..\..\bin\hlslbin.exe layer_merge.frag.hlsl ..\layer_merge.frag.glsl ps_5_0 +..\..\..\bin\hlslbin.exe mask_merge.frag.hlsl ..\mask_merge.frag.glsl ps_5_0 diff --git a/Shaders/painter/hlsl/src/layer_view.frag.hlsl b/Shaders/painter/hlsl/src/layer_view.frag.hlsl index efc657af..67b90127 100644 --- a/Shaders/painter/hlsl/src/layer_view.frag.hlsl +++ b/Shaders/painter/hlsl/src/layer_view.frag.hlsl @@ -1,5 +1,20 @@ Texture2D tex; SamplerState _tex_sampler; +uniform int channel; float4 main(float4 color : TEXCOORD0, float2 texCoord : TEXCOORD1) : SV_Target0 { - return tex.SampleLevel(_tex_sampler, texCoord, 0) * color; + if (channel == 1) { + return tex.SampleLevel(_tex_sampler, texCoord, 0).rrra * color; + } + else if (channel == 2) { + return tex.SampleLevel(_tex_sampler, texCoord, 0).ggga * color; + } + else if (channel == 3) { + return tex.SampleLevel(_tex_sampler, texCoord, 0).bbba * color; + } + else if (channel == 4) { + return tex.SampleLevel(_tex_sampler, texCoord, 0).aaaa * color; + } + else { + return tex.SampleLevel(_tex_sampler, texCoord, 0).rgba * color; + } } diff --git a/Shaders/raytrace/raytrace_bake_ao.cso b/Shaders/raytrace/raytrace_bake_ao.cso index 6ec8ae1c..89859ae8 100644 Binary files a/Shaders/raytrace/raytrace_bake_ao.cso and b/Shaders/raytrace/raytrace_bake_ao.cso differ diff --git a/Shaders/raytrace/raytrace_bake_bent.cso b/Shaders/raytrace/raytrace_bake_bent.cso index c3490738..3e92e65c 100644 Binary files a/Shaders/raytrace/raytrace_bake_bent.cso and b/Shaders/raytrace/raytrace_bake_bent.cso differ diff --git a/Shaders/raytrace/raytrace_bake_light.cso b/Shaders/raytrace/raytrace_bake_light.cso index ab055dfb..5febbfa8 100644 Binary files a/Shaders/raytrace/raytrace_bake_light.cso and b/Shaders/raytrace/raytrace_bake_light.cso differ diff --git a/Shaders/raytrace/raytrace_bake_thick.cso b/Shaders/raytrace/raytrace_bake_thick.cso index 89e335f5..4506f3b9 100644 Binary files a/Shaders/raytrace/raytrace_bake_thick.cso and b/Shaders/raytrace/raytrace_bake_thick.cso differ diff --git a/Shaders/raytrace/src/raytrace_bake_ao.hlsl b/Shaders/raytrace/src/raytrace_bake_ao.hlsl index 2493a772..51b68df0 100644 --- a/Shaders/raytrace/src/raytrace_bake_ao.hlsl +++ b/Shaders/raytrace/src/raytrace_bake_ao.hlsl @@ -77,7 +77,7 @@ void raygeneration() { float b = 1.0 - a; color = color * b + accum.xyz * a; } - render_target[DispatchRaysIndex().xy] = float4(color.xyz, 0.0f); + render_target[DispatchRaysIndex().xy] = float4(color.xyz, 1.0f); } [shader("closesthit")] diff --git a/Shaders/raytrace/src/raytrace_bake_bent.hlsl b/Shaders/raytrace/src/raytrace_bake_bent.hlsl index 0e338b7d..991f9a63 100644 --- a/Shaders/raytrace/src/raytrace_bake_bent.hlsl +++ b/Shaders/raytrace/src/raytrace_bake_bent.hlsl @@ -79,7 +79,7 @@ void raygeneration() { float b = 1.0 - a; color = color * b + accum.xyz * a; } - render_target[DispatchRaysIndex().xy] = float4(color.xyz, 0.0f); + render_target[DispatchRaysIndex().xy] = float4(color.xyz, 1.0f); } [shader("closesthit")] diff --git a/Shaders/raytrace/src/raytrace_bake_light.hlsl b/Shaders/raytrace/src/raytrace_bake_light.hlsl index d25a8e6a..51899f89 100644 --- a/Shaders/raytrace/src/raytrace_bake_light.hlsl +++ b/Shaders/raytrace/src/raytrace_bake_light.hlsl @@ -81,7 +81,7 @@ void raygeneration() { float b = 1.0 - a; color = color * b + accum.xyz * a; } - render_target[DispatchRaysIndex().xy] = float4(color.xyz, 0.0f); + render_target[DispatchRaysIndex().xy] = float4(color.xyz, 1.0f); } [shader("closesthit")] diff --git a/Shaders/raytrace/src/raytrace_bake_thick.hlsl b/Shaders/raytrace/src/raytrace_bake_thick.hlsl index c72899f1..1596104d 100644 --- a/Shaders/raytrace/src/raytrace_bake_thick.hlsl +++ b/Shaders/raytrace/src/raytrace_bake_thick.hlsl @@ -78,7 +78,7 @@ void raygeneration() { float b = 1.0 - a; color = color * b + accum.xyz * a; } - render_target[DispatchRaysIndex().xy] = float4(color.xyz, 0.0f); + render_target[DispatchRaysIndex().xy] = float4(color.xyz, 1.0f); } [shader("closesthit")] diff --git a/Sources/arm/Tool.hx b/Sources/arm/Tool.hx index 4ac679dc..b4f5e181 100644 --- a/Sources/arm/Tool.hx +++ b/Sources/arm/Tool.hx @@ -191,7 +191,9 @@ package arm; @:enum abstract PaintTex(Int) from Int to Int { var TexBase = 0; var TexNormal = 1; - var TexPack = 2; + var TexOcclusion = 2; + var TexRoughness = 3; + var TexMetallic = 4; } @:enum abstract ProjectModel(Int) from Int to Int { diff --git a/Sources/arm/ui/UIView2D.hx b/Sources/arm/ui/UIView2D.hx index 752584ab..b7f9df2f 100644 --- a/Sources/arm/ui/UIView2D.hx +++ b/Sources/arm/ui/UIView2D.hx @@ -6,6 +6,7 @@ import kha.graphics4.PipelineState; import kha.graphics4.VertexStructure; import kha.graphics4.VertexData; import kha.graphics4.BlendingFactor; +import kha.graphics4.ConstantLocation; import zui.Zui; import zui.Id; import iron.system.Input; @@ -28,6 +29,7 @@ class UIView2D { public var panY = 0.0; public var panScale = 1.0; var pipe: PipelineState; + var channelLocation: ConstantLocation; var texType = TexBase; var uvmapShow = false; @@ -46,6 +48,7 @@ class UIView2D { pipe.blendDestination = BlendingFactor.BlendZero; pipe.colorWriteMaskAlpha = false; pipe.compile(); + channelLocation = pipe.getConstantLocation("channel"); var scale = Config.raw.window_scale; ui = new Zui({font: App.font, theme: App.theme, color_wheel: App.color_wheel, scaleFactor: scale}); @@ -94,22 +97,36 @@ class UIView2D { ui.g.pipeline = pipe; var l = Context.layer; var tex: Image = null; + var channel = 0; if (type == View2DLayer) { - tex = texType == TexBase ? l.texpaint : texType == TexNormal ? l.texpaint_nor : l.texpaint_pack; - if (Context.layerIsMask) tex = l.texpaint_mask; + tex = + Context.layerIsMask ? l.texpaint_mask : + texType == TexBase ? l.texpaint : + texType == TexNormal ? l.texpaint_nor : + l.texpaint_pack; + + channel = + texType == TexOcclusion ? 1 : + texType == TexRoughness ? 2 : + texType == TexMetallic ? 3 : + 0; } else { // View2DAsset tex = UITrait.inst.getImage(Context.texture); } + ui.currentWindow.texture.g4.setInt(channelLocation, channel); + var th = tw; if (tex != null) { th = tw * (tex.height / tex.width); if (!UITrait.inst.textureFilter) { ui.g.imageScaleQuality = kha.graphics2.ImageScaleQuality.Low; } + ui.g.drawScaledImage(tex, tx, ty, tw, th); + if (!UITrait.inst.textureFilter) { ui.g.imageScaleQuality = kha.graphics2.ImageScaleQuality.High; } @@ -165,7 +182,7 @@ class UIView2D { ui._x = 2; ui._y = 2; ui._w = ew; - texType = ui.combo(Id.handle({position: texType}), ["Base", "Normal Map", "ORM"], "Texture"); + texType = ui.combo(Id.handle({position: texType}), ["Base Color", "Normal Map", "Occlusion", "Roughness", "Metallic"], "Texture"); ui._x += ew + 3; ui._y = 2; uvmapShow = ui.check(Id.handle({selected: uvmapShow}), "UV Map");