diff --git a/backend/goglbackend/clip.go b/backend/goglbackend/clip.go index d6414c5..3ccec5c 100644 --- a/backend/goglbackend/clip.go +++ b/backend/goglbackend/clip.go @@ -40,9 +40,7 @@ func (b *GoGLBackend) Clip(pts [][2]float64) { gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1i(b.shd.UseAlphaTex, 0) - gl.Uniform1i(b.shd.UseLinearGradient, 0) - gl.Uniform1i(b.shd.UseRadialGradient, 0) - gl.Uniform1i(b.shd.UseImagePattern, 0) + gl.Uniform1i(b.shd.Func, shdFuncSolid) gl.EnableVertexAttribArray(b.shd.Vertex) gl.ColorMask(false, false, false, false) diff --git a/backend/goglbackend/fill.go b/backend/goglbackend/fill.go index 34b8e3e..c3474f6 100644 --- a/backend/goglbackend/fill.go +++ b/backend/goglbackend/fill.go @@ -38,9 +38,7 @@ func (b *GoGLBackend) Clear(pts [4][2]float64) { gl.Uniform4f(b.shd.Color, 0, 0, 0, 0) gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1i(b.shd.UseAlphaTex, 0) - gl.Uniform1i(b.shd.UseLinearGradient, 0) - gl.Uniform1i(b.shd.UseRadialGradient, 0) - gl.Uniform1i(b.shd.UseImagePattern, 0) + gl.Uniform1i(b.shd.Func, shdFuncSolid) gl.Disable(gl.BLEND) @@ -134,9 +132,7 @@ func (b *GoGLBackend) Fill(style *backendbase.FillStyle, pts [][2]float64, canOv gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1i(b.shd.UseAlphaTex, 0) - gl.Uniform1i(b.shd.UseLinearGradient, 0) - gl.Uniform1i(b.shd.UseRadialGradient, 0) - gl.Uniform1i(b.shd.UseImagePattern, 0) + gl.Uniform1i(b.shd.Func, shdFuncSolid) gl.EnableVertexAttribArray(b.shd.Vertex) gl.VertexAttribPointer(b.shd.Vertex, 2, gl.FLOAT, false, 0, nil) @@ -238,14 +234,16 @@ func (b *GoGLBackend) drawBlurred(size float64) { 0, 1, 0, 0, 1, 0, 1, 1} gl.BufferData(gl.ARRAY_BUFFER, len(data)*4, unsafe.Pointer(&data[0]), gl.STREAM_DRAW) - gl.UseProgram(b.bbshd.ID) - gl.Uniform1i(b.bbshd.Image, 0) - gl.Uniform2f(b.bbshd.CanvasSize, float32(b.fw), float32(b.fh)) + gl.UseProgram(b.shd.ID) + gl.Uniform1i(b.shd.Image, 0) + gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) + gl.Uniform1i(b.shd.UseAlphaTex, 0) + gl.Uniform1i(b.shd.Func, shdFuncBoxBlur) - gl.VertexAttribPointer(b.bbshd.Vertex, 2, gl.FLOAT, false, 0, nil) - gl.VertexAttribPointer(b.bbshd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) - gl.EnableVertexAttribArray(b.bbshd.Vertex) - gl.EnableVertexAttribArray(b.bbshd.TexCoord) + gl.VertexAttribPointer(b.shd.Vertex, 2, gl.FLOAT, false, 0, nil) + gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) + gl.EnableVertexAttribArray(b.shd.Vertex) + gl.EnableVertexAttribArray(b.shd.TexCoord) gl.Disable(gl.BLEND) @@ -284,22 +282,20 @@ func (b *GoGLBackend) drawBlurred(size float64) { b.disableTextureRenderTarget() b.box3(sizec, true) - gl.DisableVertexAttribArray(b.bbshd.Vertex) - gl.DisableVertexAttribArray(b.bbshd.TexCoord) + gl.DisableVertexAttribArray(b.shd.Vertex) + gl.DisableVertexAttribArray(b.shd.TexCoord) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) } func (b *GoGLBackend) box3(size int, vertical bool) { - gl.Uniform1i(b.bbshd.BoxSize, int32(size)) + gl.Uniform1i(b.shd.BoxSize, int32(size)) if vertical { - gl.Uniform1i(b.bbshd.BoxVertical, 1) - gl.Uniform1f(b.bbshd.BoxScale, 1/float32(b.fh)) + gl.Uniform1i(b.shd.BoxVertical, 1) + gl.Uniform1f(b.shd.BoxScale, 1/float32(b.fh)) } else { - gl.Uniform1i(b.bbshd.BoxVertical, 0) - gl.Uniform1f(b.bbshd.BoxScale, 1/float32(b.fw)) + gl.Uniform1i(b.shd.BoxVertical, 0) + gl.Uniform1f(b.shd.BoxScale, 1/float32(b.fw)) } gl.DrawArrays(gl.TRIANGLE_FAN, 0, 4) - - gl.StencilFunc(gl.ALWAYS, 0, 0xFF) } diff --git a/backend/goglbackend/gogl.go b/backend/goglbackend/gogl.go index a7526da..f85f695 100644 --- a/backend/goglbackend/gogl.go +++ b/backend/goglbackend/gogl.go @@ -20,8 +20,7 @@ type GLContext struct { shadowBuf uint32 alphaTex uint32 - shd unifiedShader - bbshd boxBlurShader + shd unifiedShader offscr1 offscreenBuffer offscr2 offscreenBuffer @@ -58,15 +57,6 @@ func NewGLContext() (*GLContext, error) { return nil, err } - err = loadShader(boxVS, boxFS, &ctx.bbshd.shaderProgram) - if err != nil { - return nil, err - } - ctx.bbshd.shaderProgram.mustLoadLocations(&ctx.bbshd) - if err = glError(); err != nil { - return nil, err - } - gl.GenBuffers(1, &ctx.buf) if err = glError(); err != nil { return nil, err @@ -320,10 +310,7 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp gl.Uniform1f(b.shd.GlobalAlpha, float32(style.Color.A)/255) gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot) gl.Uniform1i(b.shd.UseAlphaTex, alphaVal) - gl.Uniform1i(b.shd.UseLinearGradient, 1) - gl.Uniform1i(b.shd.UseRadialGradient, 0) - gl.Uniform1i(b.shd.UseImagePattern, 0) - gl.Uniform1i(b.shd.UseImage, 0) + gl.Uniform1i(b.shd.Func, shdFuncLinearGradient) return b.shd.Vertex, b.shd.TexCoord } if rg := style.RadialGradient; rg != nil { @@ -342,10 +329,7 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp gl.Uniform1f(b.shd.GlobalAlpha, float32(style.Color.A)/255) gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot) gl.Uniform1i(b.shd.UseAlphaTex, alphaVal) - gl.Uniform1i(b.shd.UseLinearGradient, 0) - gl.Uniform1i(b.shd.UseRadialGradient, 1) - gl.Uniform1i(b.shd.UseImagePattern, 0) - gl.Uniform1i(b.shd.UseImage, 0) + gl.Uniform1i(b.shd.Func, shdFuncRadialGradient) return b.shd.Vertex, b.shd.TexCoord } if ip := style.ImagePattern; ip != nil { @@ -375,10 +359,7 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp gl.Uniform1f(b.shd.GlobalAlpha, float32(style.Color.A)/255) gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot) gl.Uniform1i(b.shd.UseAlphaTex, alphaVal) - gl.Uniform1i(b.shd.UseLinearGradient, 0) - gl.Uniform1i(b.shd.UseRadialGradient, 0) - gl.Uniform1i(b.shd.UseImagePattern, 1) - gl.Uniform1i(b.shd.UseImage, 0) + gl.Uniform1i(b.shd.Func, shdFuncImagePattern) return b.shd.Vertex, b.shd.TexCoord } @@ -389,10 +370,7 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle, useAlpha bool, alp gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1i(b.shd.AlphaTex, alphaTexSlot) gl.Uniform1i(b.shd.UseAlphaTex, alphaVal) - gl.Uniform1i(b.shd.UseLinearGradient, 0) - gl.Uniform1i(b.shd.UseRadialGradient, 0) - gl.Uniform1i(b.shd.UseImagePattern, 0) - gl.Uniform1i(b.shd.UseImage, 0) + gl.Uniform1i(b.shd.Func, shdFuncSolid) return b.shd.Vertex, b.shd.TexCoord } diff --git a/backend/goglbackend/imagedata.go b/backend/goglbackend/imagedata.go index 86eaa3e..cb08b53 100644 --- a/backend/goglbackend/imagedata.go +++ b/backend/goglbackend/imagedata.go @@ -90,10 +90,7 @@ func (b *GoGLBackend) PutImageData(img *image.RGBA, x, y int) { gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform1f(b.shd.GlobalAlpha, 1) gl.Uniform1i(b.shd.UseAlphaTex, 0) - gl.Uniform1i(b.shd.UseLinearGradient, 0) - gl.Uniform1i(b.shd.UseRadialGradient, 0) - gl.Uniform1i(b.shd.UseImagePattern, 0) - gl.Uniform1i(b.shd.UseImage, 1) + gl.Uniform1i(b.shd.Func, shdFuncImage) gl.VertexAttribPointer(b.shd.Vertex, 2, gl.FLOAT, false, 0, nil) gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) gl.EnableVertexAttribArray(b.shd.Vertex) diff --git a/backend/goglbackend/images.go b/backend/goglbackend/images.go index b980af5..fc6dc8c 100644 --- a/backend/goglbackend/images.go +++ b/backend/goglbackend/images.go @@ -199,10 +199,7 @@ func (b *GoGLBackend) DrawImage(dimg backendbase.Image, sx, sy, sw, sh float64, gl.Uniform2f(b.shd.CanvasSize, float32(b.fw), float32(b.fh)) gl.Uniform1f(b.shd.GlobalAlpha, float32(alpha)) gl.Uniform1i(b.shd.UseAlphaTex, 0) - gl.Uniform1i(b.shd.UseLinearGradient, 0) - gl.Uniform1i(b.shd.UseRadialGradient, 0) - gl.Uniform1i(b.shd.UseImagePattern, 0) - gl.Uniform1i(b.shd.UseImage, 1) + gl.Uniform1i(b.shd.Func, shdFuncImage) gl.VertexAttribPointer(b.shd.Vertex, 2, gl.FLOAT, false, 0, nil) gl.VertexAttribPointer(b.shd.TexCoord, 2, gl.FLOAT, false, 0, gl.PtrOffset(8*4)) gl.EnableVertexAttribArray(b.shd.Vertex) diff --git a/backend/goglbackend/shaders.go b/backend/goglbackend/shaders.go index 70759cb..fa6b183 100755 --- a/backend/goglbackend/shaders.go +++ b/backend/goglbackend/shaders.go @@ -21,16 +21,15 @@ precision mediump float; varying vec2 v_cp, v_tc; +uniform int func; + uniform vec4 color; uniform float globalAlpha; -uniform bool useLinearGradient; -uniform bool useRadialGradient; uniform sampler2D gradient; uniform vec2 from, dir, to; uniform float len, radFrom, radTo; -uniform bool useImagePattern; uniform vec2 imageSize; uniform sampler2D image; uniform mat3 imageTransform; @@ -39,7 +38,9 @@ uniform vec2 repeat; uniform bool useAlphaTex; uniform sampler2D alphaTex; -uniform bool useImage; +uniform int boxSize; +uniform bool boxVertical; +uniform float boxScale; bool isNaN(float v) { return v < 0.0 || 0.0 < v || v == 0.0 ? false : true; @@ -48,12 +49,29 @@ bool isNaN(float v) { void main() { vec4 col = color; - if (useLinearGradient) { + if (func == 5) { + vec4 sum = vec4(0.0); + if (boxVertical) { + vec2 start = v_tc - vec2(0.0, (float)(boxSize) * boxScale); + for (int i=0; i 1.0) { col *= repeat.y; } - } else if (useImage) { + } else if (func == 4) { col = texture2D(image, v_tc); } @@ -94,52 +112,14 @@ void main() { } ` -var boxVS = ` -attribute vec2 vertex, texCoord; - -uniform vec2 canvasSize; - -varying vec2 v_cp, v_tc; - -void main() { - v_tc = texCoord; - v_cp = vertex; - vec2 glp = vertex * 2.0 / canvasSize - 1.0; - gl_Position = vec4(glp.x, -glp.y, 0.0, 1.0); -} -` -var boxFS = ` -#ifdef GL_ES -precision mediump float; -#endif - -varying vec2 v_cp, v_tc; - -uniform int boxSize; -uniform bool boxVertical; -uniform float boxScale; -uniform sampler2D image; - -void main() { - vec4 color = vec4(0.0, 0.0, 0.0, 0.0); - - vec4 sum = vec4(0.0); - if (boxVertical) { - vec2 start = v_tc - vec2(0.0, (float)(boxSize) * boxScale); - for (int i=0; i