diff --git a/gui/panel.go b/gui/panel.go index 8efe28f5..07765d5c 100644 --- a/gui/panel.go +++ b/gui/panel.go @@ -98,7 +98,8 @@ type Panel struct { paddingsColor math32.Color4 // panel padding color contentColor math32.Color4 // panel content color textureValid float32 // texture valid flag (bool) - dummy [3]float32 // complete 8 * vec4 + opacity float32 + dummy [2]float32 // complete 8 * vec4 } } @@ -135,6 +136,7 @@ func (p *Panel) Initialize(ipan IPanel, width, height float32) { // TODO rename p.width = width p.height = height + p.udata.opacity = 1 // If first time, create panel quad geometry if panelQuadGeometry == nil { @@ -393,6 +395,22 @@ func (p *Panel) Paddings() RectBounds { return p.paddingSizes } +// SetOpacity sets the alpha modifier of this panel +func (p *Panel) SetOpacity(alpha float32) { + if alpha > 1 { + alpha = 1 + } + if alpha < 0 { + alpha = 0 + } + p.udata.opacity = alpha +} + +// Opacity returns current opacity value +func (p *Panel) Opacity() float32 { + return p.udata.opacity +} + // SetBordersColor sets the color of this panel borders // The borders opacity is set to 1.0 (full opaque) func (p *Panel) SetBordersColor(color *math32.Color) { diff --git a/renderer/shaders/panel_fragment.glsl b/renderer/shaders/panel_fragment.glsl index cb5b590f..0e2a5777 100644 --- a/renderer/shaders/panel_fragment.glsl +++ b/renderer/shaders/panel_fragment.glsl @@ -23,6 +23,7 @@ uniform vec4 Panel[8]; #define PaddingColor Panel[5] // panel padding color #define ContentColor Panel[6] // panel content color #define TextureValid bool(Panel[7].x) // texture valid flag +#define Opacity Panel[7].y // panel alpha modifier // Output out vec4 FragColor; @@ -103,18 +104,21 @@ void main() { } FragColor = color; + FragColor.a *= Opacity; return; } // Checks if fragment is inside paddings area if (checkRect(Padding)) { FragColor = PaddingColor; + FragColor.a *= Opacity; return; } // Checks if fragment is inside borders area if (checkRect(Border)) { FragColor = BorderColor; + FragColor.a *= Opacity; return; } diff --git a/renderer/shaders/sources.go b/renderer/shaders/sources.go index f0e3deb3..2b56e069 100644 --- a/renderer/shaders/sources.go +++ b/renderer/shaders/sources.go @@ -332,6 +332,7 @@ uniform vec4 Panel[8]; #define PaddingColor Panel[5] // panel padding color #define ContentColor Panel[6] // panel content color #define TextureValid bool(Panel[7].x) // texture valid flag +#define Opacity Panel[7].y // panel alpha modifier // Output out vec4 FragColor; @@ -412,18 +413,21 @@ void main() { } FragColor = color; + FragColor.a *= Opacity; return; } // Checks if fragment is inside paddings area if (checkRect(Padding)) { FragColor = PaddingColor; + FragColor.a *= Opacity; return; } // Checks if fragment is inside borders area if (checkRect(Border)) { FragColor = BorderColor; + FragColor.a *= Opacity; return; } diff --git a/tools/g3nshaders/main.go b/tools/g3nshaders/main.go index 2f56d9ce..30795aff 100644 --- a/tools/g3nshaders/main.go +++ b/tools/g3nshaders/main.go @@ -20,6 +20,7 @@ import ( "log" "os" "path/filepath" + "sort" "strings" "text/template" ) @@ -163,6 +164,10 @@ func processDir(dir string, include bool) { panic(err) } + sort.Slice(finfos, func(i, j int) bool { + return finfos[i].Name() < finfos[j].Name() + }) + // Process all directory entries. for _, fi := range finfos { if fi.IsDir() {