From 54e97761de906a2f9d110e59de4981388534c465 Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Thu, 10 May 2018 17:26:31 +0200 Subject: [PATCH] no longer using TEXTURE_1D since it is not available on GL ES --- goglimpl/goglimpl.go | 25 +- gradients.go | 22 +- made_shaders.go | 1398 ++++++++++++++++++++---------------------- make_shaders.go | 12 +- openglinterface.go | 5 +- shaders.go | 16 +- 6 files changed, 714 insertions(+), 764 deletions(-) diff --git a/goglimpl/goglimpl.go b/goglimpl/goglimpl.go index 8d01b0d..dc8fd11 100644 --- a/goglimpl/goglimpl.go +++ b/goglimpl/goglimpl.go @@ -81,17 +81,27 @@ func (_ GLImpl) GetAttribLocation(program uint32, name string) int32 { func (_ GLImpl) GetError() uint32 { return gl.GetError() } -func (_ GLImpl) GetProgramInfoLog(program uint32, bufSize int32) string { - log := strings.Repeat("\x00", int(bufSize+1)) - gl.GetProgramInfoLog(program, bufSize, nil, gl.Str(log)) +func (_ GLImpl) GetProgramInfoLog(program uint32) string { + var length int32 + gl.GetProgramiv(program, gl.INFO_LOG_LENGTH, &length) + if length == 0 { + return "" + } + log := strings.Repeat("\x00", int(length+1)) + gl.GetProgramInfoLog(program, length, nil, gl.Str(log)) return log } func (_ GLImpl) GetProgramiv(program uint32, pname uint32, params *int32) { gl.GetProgramiv(program, pname, params) } -func (_ GLImpl) GetShaderInfoLog(program uint32, bufSize int32) string { - log := strings.Repeat("\x00", int(bufSize+1)) - gl.GetShaderInfoLog(program, bufSize, nil, gl.Str(log)) +func (_ GLImpl) GetShaderInfoLog(program uint32) string { + var length int32 + gl.GetShaderiv(program, gl.INFO_LOG_LENGTH, &length) + if length == 0 { + return "" + } + log := strings.Repeat("\x00", int(length+1)) + gl.GetShaderInfoLog(program, length, nil, gl.Str(log)) return log } func (_ GLImpl) GetShaderiv(shader uint32, pname uint32, params *int32) { @@ -123,9 +133,6 @@ func (_ GLImpl) StencilMask(mask uint32) { func (_ GLImpl) StencilOp(fail uint32, zfail uint32, zpass uint32) { gl.StencilOp(fail, zfail, zpass) } -func (_ GLImpl) TexImage1D(target uint32, level int32, internalformat int32, width int32, border int32, format uint32, xtype uint32, pixels unsafe.Pointer) { - gl.TexImage1D(target, level, internalformat, width, border, format, xtype, pixels) -} func (_ GLImpl) TexImage2D(target uint32, level int32, internalformat int32, width int32, height int32, border int32, format uint32, xtype uint32, pixels unsafe.Pointer) { gl.TexImage2D(target, level, internalformat, width, height, border, format, xtype, pixels) } diff --git a/gradients.go b/gradients.go index 146a128..51d6fd7 100644 --- a/gradients.go +++ b/gradients.go @@ -42,10 +42,11 @@ func NewLinearGradient(x0, y0, x1, y1 float64) *LinearGradient { lg := &LinearGradient{gradient: gradient{from: vec{x0, y0}, to: vec{x1, y1}}} gli.GenTextures(1, &lg.tex) gli.ActiveTexture(gl_TEXTURE0) - gli.BindTexture(gl_TEXTURE_1D, lg.tex) - gli.TexParameteri(gl_TEXTURE_1D, gl_TEXTURE_MIN_FILTER, gl_LINEAR) - gli.TexParameteri(gl_TEXTURE_1D, gl_TEXTURE_MAG_FILTER, gl_LINEAR) - gli.TexParameteri(gl_TEXTURE_1D, gl_TEXTURE_WRAP_S, gl_CLAMP_TO_EDGE) + gli.BindTexture(gl_TEXTURE_2D, lg.tex) + gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, gl_LINEAR) + gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MAG_FILTER, gl_LINEAR) + gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_S, gl_CLAMP_TO_EDGE) + gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_T, gl_CLAMP_TO_EDGE) runtime.SetFinalizer(lg, func(lg *LinearGradient) { glChan <- func() { gli.DeleteTextures(1, &lg.tex) @@ -62,10 +63,11 @@ func NewRadialGradient(x0, y0, r0, x1, y1, r1 float64) *RadialGradient { rg := &RadialGradient{gradient: gradient{from: vec{x0, y0}, to: vec{x1, y1}}, radFrom: r0, radTo: r1} gli.GenTextures(1, &rg.tex) gli.ActiveTexture(gl_TEXTURE0) - gli.BindTexture(gl_TEXTURE_1D, rg.tex) - gli.TexParameteri(gl_TEXTURE_1D, gl_TEXTURE_MIN_FILTER, gl_LINEAR) - gli.TexParameteri(gl_TEXTURE_1D, gl_TEXTURE_MAG_FILTER, gl_LINEAR) - gli.TexParameteri(gl_TEXTURE_1D, gl_TEXTURE_WRAP_S, gl_CLAMP_TO_EDGE) + gli.BindTexture(gl_TEXTURE_2D, rg.tex) + gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, gl_LINEAR) + gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MAG_FILTER, gl_LINEAR) + gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_S, gl_CLAMP_TO_EDGE) + gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_T, gl_CLAMP_TO_EDGE) runtime.SetFinalizer(rg, func(rg *RadialGradient) { glChan <- func() { gli.DeleteTextures(1, &rg.tex) @@ -86,7 +88,7 @@ func (g *gradient) load() { } gli.ActiveTexture(gl_TEXTURE0) - gli.BindTexture(gl_TEXTURE_1D, g.tex) + gli.BindTexture(gl_TEXTURE_2D, g.tex) var pixels [2048 * 4]byte pp := 0 for i := 0; i < 2048; i++ { @@ -97,7 +99,7 @@ func (g *gradient) load() { pixels[pp+3] = byte(math.Floor(c.a*255 + 0.5)) pp += 4 } - gli.TexImage1D(gl_TEXTURE_1D, 0, gl_RGBA, 2048, 0, gl_RGBA, gl_UNSIGNED_BYTE, gli.Ptr(&pixels[0])) + gli.TexImage2D(gl_TEXTURE_2D, 0, gl_RGBA, 2048, 1, 0, gl_RGBA, gl_UNSIGNED_BYTE, gli.Ptr(&pixels[0])) g.loaded = true } diff --git a/made_shaders.go b/made_shaders.go index c911fbc..a9c6ca4 100755 --- a/made_shaders.go +++ b/made_shaders.go @@ -5,6 +5,666 @@ import ( "fmt" ) +type radialGradientShader struct { + id uint32 + vertex uint32 + canvasSize int32 + invmat int32 + gradient int32 + from int32 + to int32 + dir int32 + radFrom int32 + radTo int32 + len int32 + globalAlpha int32 +} + +func loadRadialGradientShader() (*radialGradientShader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, radialGradientVS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for radialGradientVS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for radialGradientVS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for radialGradientVS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, radialGradientFS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for radialGradientFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(fs) + return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for radialGradientFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for radialGradientFS, glError: " + fmt.Sprint(glErr)) + } + } + + { + program = gli.CreateProgram() + gli.AttachShader(program, vs) + gli.AttachShader(program, fs) + gli.LinkProgram(program) + + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { + fmt.Printf("Shader link log for radialGradientFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetProgramiv(program, gl_LINK_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + gli.DeleteShader(fs) + return nil, errors.New("error linking shader for radialGradientFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for radialGradientFS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &radialGradientShader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.invmat = gli.GetUniformLocation(program, "invmat") + result.gradient = gli.GetUniformLocation(program, "gradient") + result.from = gli.GetUniformLocation(program, "from") + result.to = gli.GetUniformLocation(program, "to") + result.dir = gli.GetUniformLocation(program, "dir") + result.radFrom = gli.GetUniformLocation(program, "radFrom") + result.radTo = gli.GetUniformLocation(program, "radTo") + result.len = gli.GetUniformLocation(program, "len") + result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") + + return result, nil +} + +type solidShader struct { + id uint32 + vertex uint32 + canvasSize int32 + color int32 + globalAlpha int32 +} + +func loadSolidShader() (*solidShader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, solidVS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for solidVS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for solidVS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for solidVS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, solidFS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for solidFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(fs) + return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for solidFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for solidFS, glError: " + fmt.Sprint(glErr)) + } + } + + { + program = gli.CreateProgram() + gli.AttachShader(program, vs) + gli.AttachShader(program, fs) + gli.LinkProgram(program) + + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { + fmt.Printf("Shader link log for solidFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetProgramiv(program, gl_LINK_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + gli.DeleteShader(fs) + return nil, errors.New("error linking shader for solidFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for solidFS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &solidShader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.color = gli.GetUniformLocation(program, "color") + result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") + + return result, nil +} + +type solidAlphaShader struct { + id uint32 + vertex uint32 + alphaTexCoord uint32 + canvasSize int32 + color int32 + alphaTex int32 + globalAlpha int32 +} + +func loadSolidAlphaShader() (*solidAlphaShader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, solidAlphaVS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for solidAlphaVS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for solidAlphaVS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for solidAlphaVS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, solidAlphaFS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for solidAlphaFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(fs) + return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for solidAlphaFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for solidAlphaFS, glError: " + fmt.Sprint(glErr)) + } + } + + { + program = gli.CreateProgram() + gli.AttachShader(program, vs) + gli.AttachShader(program, fs) + gli.LinkProgram(program) + + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { + fmt.Printf("Shader link log for solidAlphaFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetProgramiv(program, gl_LINK_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + gli.DeleteShader(fs) + return nil, errors.New("error linking shader for solidAlphaFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for solidAlphaFS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &solidAlphaShader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.color = gli.GetUniformLocation(program, "color") + result.alphaTex = gli.GetUniformLocation(program, "alphaTex") + result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") + + return result, nil +} + +type linearGradientShader struct { + id uint32 + vertex uint32 + canvasSize int32 + invmat int32 + gradient int32 + from int32 + dir int32 + len int32 + globalAlpha int32 +} + +func loadLinearGradientShader() (*linearGradientShader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, linearGradientVS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for linearGradientVS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for linearGradientVS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for linearGradientVS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, linearGradientFS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for linearGradientFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(fs) + return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for linearGradientFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for linearGradientFS, glError: " + fmt.Sprint(glErr)) + } + } + + { + program = gli.CreateProgram() + gli.AttachShader(program, vs) + gli.AttachShader(program, fs) + gli.LinkProgram(program) + + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { + fmt.Printf("Shader link log for linearGradientFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetProgramiv(program, gl_LINK_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + gli.DeleteShader(fs) + return nil, errors.New("error linking shader for linearGradientFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for linearGradientFS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &linearGradientShader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.invmat = gli.GetUniformLocation(program, "invmat") + result.gradient = gli.GetUniformLocation(program, "gradient") + result.from = gli.GetUniformLocation(program, "from") + result.dir = gli.GetUniformLocation(program, "dir") + result.len = gli.GetUniformLocation(program, "len") + result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") + + return result, nil +} + +type linearGradientAlphaShader struct { + id uint32 + vertex uint32 + alphaTexCoord uint32 + canvasSize int32 + invmat int32 + gradient int32 + from int32 + dir int32 + len int32 + alphaTex int32 + globalAlpha int32 +} + +func loadLinearGradientAlphaShader() (*linearGradientAlphaShader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, linearGradientAlphaVS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for linearGradientAlphaVS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for linearGradientAlphaVS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for linearGradientAlphaVS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, linearGradientAlphaFS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for linearGradientAlphaFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(fs) + return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for linearGradientAlphaFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for linearGradientAlphaFS, glError: " + fmt.Sprint(glErr)) + } + } + + { + program = gli.CreateProgram() + gli.AttachShader(program, vs) + gli.AttachShader(program, fs) + gli.LinkProgram(program) + + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { + fmt.Printf("Shader link log for linearGradientAlphaFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetProgramiv(program, gl_LINK_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + gli.DeleteShader(fs) + return nil, errors.New("error linking shader for linearGradientAlphaFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for linearGradientAlphaFS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &linearGradientAlphaShader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.invmat = gli.GetUniformLocation(program, "invmat") + result.gradient = gli.GetUniformLocation(program, "gradient") + result.from = gli.GetUniformLocation(program, "from") + result.dir = gli.GetUniformLocation(program, "dir") + result.len = gli.GetUniformLocation(program, "len") + result.alphaTex = gli.GetUniformLocation(program, "alphaTex") + result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") + + return result, nil +} + +type radialGradientAlphaShader struct { + id uint32 + vertex uint32 + alphaTexCoord uint32 + canvasSize int32 + invmat int32 + gradient int32 + from int32 + to int32 + dir int32 + radFrom int32 + radTo int32 + len int32 + alphaTex int32 + globalAlpha int32 +} + +func loadRadialGradientAlphaShader() (*radialGradientAlphaShader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, radialGradientAlphaVS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for radialGradientAlphaVS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for radialGradientAlphaVS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for radialGradientAlphaVS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, radialGradientAlphaFS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for radialGradientAlphaFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(fs) + return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for radialGradientAlphaFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for radialGradientAlphaFS, glError: " + fmt.Sprint(glErr)) + } + } + + { + program = gli.CreateProgram() + gli.AttachShader(program, vs) + gli.AttachShader(program, fs) + gli.LinkProgram(program) + + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { + fmt.Printf("Shader link log for radialGradientAlphaFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetProgramiv(program, gl_LINK_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + gli.DeleteShader(fs) + return nil, errors.New("error linking shader for radialGradientAlphaFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for radialGradientAlphaFS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &radialGradientAlphaShader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.invmat = gli.GetUniformLocation(program, "invmat") + result.gradient = gli.GetUniformLocation(program, "gradient") + result.from = gli.GetUniformLocation(program, "from") + result.to = gli.GetUniformLocation(program, "to") + result.dir = gli.GetUniformLocation(program, "dir") + result.radFrom = gli.GetUniformLocation(program, "radFrom") + result.radTo = gli.GetUniformLocation(program, "radTo") + result.len = gli.GetUniformLocation(program, "len") + result.alphaTex = gli.GetUniformLocation(program, "alphaTex") + result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") + + return result, nil +} + +type imageShader struct { + id uint32 + vertex uint32 + texCoord uint32 + canvasSize int32 + image int32 + globalAlpha int32 +} + +func loadImageShader() (*imageShader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, imageVS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for imageVS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for imageVS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for imageVS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, imageFS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for imageFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(fs) + return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for imageFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for imageFS, glError: " + fmt.Sprint(glErr)) + } + } + + { + program = gli.CreateProgram() + gli.AttachShader(program, vs) + gli.AttachShader(program, fs) + gli.LinkProgram(program) + + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { + fmt.Printf("Shader link log for imageFS:\n\n%s\n", shLog) + } + + var status int32 + gli.GetProgramiv(program, gl_LINK_STATUS, &status) + if status != gl_TRUE { + gli.DeleteShader(vs) + gli.DeleteShader(fs) + return nil, errors.New("error linking shader for imageFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for imageFS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &imageShader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.texCoord = uint32(gli.GetAttribLocation(program, "texCoord")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.image = gli.GetUniformLocation(program, "image") + result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") + + return result, nil +} + type imagePatternShader struct { id uint32 vertex uint32 @@ -23,10 +683,8 @@ func loadImagePatternShader() (*imagePatternShader, error) { gli.ShaderSource(vs, imagePatternVS) gli.CompileShader(vs) - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(vs, logLength) + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { fmt.Printf("VERTEX_SHADER compilation log for imagePatternVS:\n\n%s\n", shLog) } @@ -46,10 +704,8 @@ func loadImagePatternShader() (*imagePatternShader, error) { gli.ShaderSource(fs, imagePatternFS) gli.CompileShader(fs) - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(fs, logLength) + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { fmt.Printf("FRAGMENT_SHADER compilation log for imagePatternFS:\n\n%s\n", shLog) } @@ -70,10 +726,8 @@ func loadImagePatternShader() (*imagePatternShader, error) { gli.AttachShader(program, fs) gli.LinkProgram(program) - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { fmt.Printf("Shader link log for imagePatternFS:\n\n%s\n", shLog) } @@ -121,10 +775,8 @@ func loadImagePatternAlphaShader() (*imagePatternAlphaShader, error) { gli.ShaderSource(vs, imagePatternAlphaVS) gli.CompileShader(vs) - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(vs, logLength) + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { fmt.Printf("VERTEX_SHADER compilation log for imagePatternAlphaVS:\n\n%s\n", shLog) } @@ -144,10 +796,8 @@ func loadImagePatternAlphaShader() (*imagePatternAlphaShader, error) { gli.ShaderSource(fs, imagePatternAlphaFS) gli.CompileShader(fs) - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(fs, logLength) + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { fmt.Printf("FRAGMENT_SHADER compilation log for imagePatternAlphaFS:\n\n%s\n", shLog) } @@ -168,10 +818,8 @@ func loadImagePatternAlphaShader() (*imagePatternAlphaShader, error) { gli.AttachShader(program, fs) gli.LinkProgram(program) - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { fmt.Printf("Shader link log for imagePatternAlphaFS:\n\n%s\n", shLog) } @@ -200,705 +848,3 @@ func loadImagePatternAlphaShader() (*imagePatternAlphaShader, error) { return result, nil } - -type solidShader struct { - id uint32 - vertex uint32 - canvasSize int32 - color int32 - globalAlpha int32 -} - -func loadSolidShader() (*solidShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, solidVS) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(vs, logLength) - fmt.Printf("VERTEX_SHADER compilation log for solidVS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for solidVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for solidVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, solidFS) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(fs, logLength) - fmt.Printf("FRAGMENT_SHADER compilation log for solidFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(fs) - return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for solidFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for solidFS, glError: " + fmt.Sprint(glErr)) - } - } - - { - program = gli.CreateProgram() - gli.AttachShader(program, vs) - gli.AttachShader(program, fs) - gli.LinkProgram(program) - - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) - fmt.Printf("Shader link log for solidFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetProgramiv(program, gl_LINK_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - gli.DeleteShader(fs) - return nil, errors.New("error linking shader for solidFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for solidFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &solidShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.color = gli.GetUniformLocation(program, "color") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} - -type solidAlphaShader struct { - id uint32 - vertex uint32 - alphaTexCoord uint32 - canvasSize int32 - color int32 - alphaTex int32 - globalAlpha int32 -} - -func loadSolidAlphaShader() (*solidAlphaShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, solidAlphaVS) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(vs, logLength) - fmt.Printf("VERTEX_SHADER compilation log for solidAlphaVS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for solidAlphaVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for solidAlphaVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, solidAlphaFS) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(fs, logLength) - fmt.Printf("FRAGMENT_SHADER compilation log for solidAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(fs) - return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for solidAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for solidAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - { - program = gli.CreateProgram() - gli.AttachShader(program, vs) - gli.AttachShader(program, fs) - gli.LinkProgram(program) - - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) - fmt.Printf("Shader link log for solidAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetProgramiv(program, gl_LINK_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - gli.DeleteShader(fs) - return nil, errors.New("error linking shader for solidAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for solidAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &solidAlphaShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.color = gli.GetUniformLocation(program, "color") - result.alphaTex = gli.GetUniformLocation(program, "alphaTex") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} - -type radialGradientAlphaShader struct { - id uint32 - vertex uint32 - alphaTexCoord uint32 - canvasSize int32 - invmat int32 - gradient int32 - from int32 - to int32 - dir int32 - radFrom int32 - radTo int32 - len int32 - alphaTex int32 - globalAlpha int32 -} - -func loadRadialGradientAlphaShader() (*radialGradientAlphaShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, radialGradientAlphaVS) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(vs, logLength) - fmt.Printf("VERTEX_SHADER compilation log for radialGradientAlphaVS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for radialGradientAlphaVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for radialGradientAlphaVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, radialGradientAlphaFS) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(fs, logLength) - fmt.Printf("FRAGMENT_SHADER compilation log for radialGradientAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(fs) - return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for radialGradientAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for radialGradientAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - { - program = gli.CreateProgram() - gli.AttachShader(program, vs) - gli.AttachShader(program, fs) - gli.LinkProgram(program) - - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) - fmt.Printf("Shader link log for radialGradientAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetProgramiv(program, gl_LINK_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - gli.DeleteShader(fs) - return nil, errors.New("error linking shader for radialGradientAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for radialGradientAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &radialGradientAlphaShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.invmat = gli.GetUniformLocation(program, "invmat") - result.gradient = gli.GetUniformLocation(program, "gradient") - result.from = gli.GetUniformLocation(program, "from") - result.to = gli.GetUniformLocation(program, "to") - result.dir = gli.GetUniformLocation(program, "dir") - result.radFrom = gli.GetUniformLocation(program, "radFrom") - result.radTo = gli.GetUniformLocation(program, "radTo") - result.len = gli.GetUniformLocation(program, "len") - result.alphaTex = gli.GetUniformLocation(program, "alphaTex") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} - -type linearGradientAlphaShader struct { - id uint32 - vertex uint32 - alphaTexCoord uint32 - canvasSize int32 - invmat int32 - gradient int32 - from int32 - dir int32 - len int32 - alphaTex int32 - globalAlpha int32 -} - -func loadLinearGradientAlphaShader() (*linearGradientAlphaShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, linearGradientAlphaVS) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(vs, logLength) - fmt.Printf("VERTEX_SHADER compilation log for linearGradientAlphaVS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for linearGradientAlphaVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for linearGradientAlphaVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, linearGradientAlphaFS) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(fs, logLength) - fmt.Printf("FRAGMENT_SHADER compilation log for linearGradientAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(fs) - return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for linearGradientAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for linearGradientAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - { - program = gli.CreateProgram() - gli.AttachShader(program, vs) - gli.AttachShader(program, fs) - gli.LinkProgram(program) - - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) - fmt.Printf("Shader link log for linearGradientAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetProgramiv(program, gl_LINK_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - gli.DeleteShader(fs) - return nil, errors.New("error linking shader for linearGradientAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for linearGradientAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &linearGradientAlphaShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.invmat = gli.GetUniformLocation(program, "invmat") - result.gradient = gli.GetUniformLocation(program, "gradient") - result.from = gli.GetUniformLocation(program, "from") - result.dir = gli.GetUniformLocation(program, "dir") - result.len = gli.GetUniformLocation(program, "len") - result.alphaTex = gli.GetUniformLocation(program, "alphaTex") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} - -type radialGradientShader struct { - id uint32 - vertex uint32 - canvasSize int32 - invmat int32 - gradient int32 - from int32 - to int32 - dir int32 - radFrom int32 - radTo int32 - len int32 - globalAlpha int32 -} - -func loadRadialGradientShader() (*radialGradientShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, radialGradientVS) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(vs, logLength) - fmt.Printf("VERTEX_SHADER compilation log for radialGradientVS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for radialGradientVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for radialGradientVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, radialGradientFS) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(fs, logLength) - fmt.Printf("FRAGMENT_SHADER compilation log for radialGradientFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(fs) - return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for radialGradientFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for radialGradientFS, glError: " + fmt.Sprint(glErr)) - } - } - - { - program = gli.CreateProgram() - gli.AttachShader(program, vs) - gli.AttachShader(program, fs) - gli.LinkProgram(program) - - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) - fmt.Printf("Shader link log for radialGradientFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetProgramiv(program, gl_LINK_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - gli.DeleteShader(fs) - return nil, errors.New("error linking shader for radialGradientFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for radialGradientFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &radialGradientShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.invmat = gli.GetUniformLocation(program, "invmat") - result.gradient = gli.GetUniformLocation(program, "gradient") - result.from = gli.GetUniformLocation(program, "from") - result.to = gli.GetUniformLocation(program, "to") - result.dir = gli.GetUniformLocation(program, "dir") - result.radFrom = gli.GetUniformLocation(program, "radFrom") - result.radTo = gli.GetUniformLocation(program, "radTo") - result.len = gli.GetUniformLocation(program, "len") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} - -type imageShader struct { - id uint32 - vertex uint32 - texCoord uint32 - canvasSize int32 - image int32 - globalAlpha int32 -} - -func loadImageShader() (*imageShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, imageVS) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(vs, logLength) - fmt.Printf("VERTEX_SHADER compilation log for imageVS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for imageVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for imageVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, imageFS) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(fs, logLength) - fmt.Printf("FRAGMENT_SHADER compilation log for imageFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(fs) - return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for imageFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for imageFS, glError: " + fmt.Sprint(glErr)) - } - } - - { - program = gli.CreateProgram() - gli.AttachShader(program, vs) - gli.AttachShader(program, fs) - gli.LinkProgram(program) - - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) - fmt.Printf("Shader link log for imageFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetProgramiv(program, gl_LINK_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - gli.DeleteShader(fs) - return nil, errors.New("error linking shader for imageFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for imageFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &imageShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.texCoord = uint32(gli.GetAttribLocation(program, "texCoord")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.image = gli.GetUniformLocation(program, "image") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} - -type linearGradientShader struct { - id uint32 - vertex uint32 - canvasSize int32 - invmat int32 - gradient int32 - from int32 - dir int32 - len int32 - globalAlpha int32 -} - -func loadLinearGradientShader() (*linearGradientShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, linearGradientVS) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(vs, logLength) - fmt.Printf("VERTEX_SHADER compilation log for linearGradientVS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for linearGradientVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for linearGradientVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, linearGradientFS) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(fs, logLength) - fmt.Printf("FRAGMENT_SHADER compilation log for linearGradientFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(fs) - return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for linearGradientFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for linearGradientFS, glError: " + fmt.Sprint(glErr)) - } - } - - { - program = gli.CreateProgram() - gli.AttachShader(program, vs) - gli.AttachShader(program, fs) - gli.LinkProgram(program) - - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) - fmt.Printf("Shader link log for linearGradientFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetProgramiv(program, gl_LINK_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - gli.DeleteShader(fs) - return nil, errors.New("error linking shader for linearGradientFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for linearGradientFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &linearGradientShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.invmat = gli.GetUniformLocation(program, "invmat") - result.gradient = gli.GetUniformLocation(program, "gradient") - result.from = gli.GetUniformLocation(program, "from") - result.dir = gli.GetUniformLocation(program, "dir") - result.len = gli.GetUniformLocation(program, "len") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} diff --git a/make_shaders.go b/make_shaders.go index 2274e82..7d5ad3e 100644 --- a/make_shaders.go +++ b/make_shaders.go @@ -204,10 +204,8 @@ const compilePart = ` gli.ShaderSource(SHADER_VAR, SHADER_SRC) gli.CompileShader(SHADER_VAR) - var logLength int32 - gli.GetShaderiv(SHADER_VAR, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetShaderInfoLog(SHADER_VAR, logLength) + shLog := gli.GetShaderInfoLog(SHADER_VAR) + if len(shLog) > 0 { fmt.Printf("SHADER_TYPE compilation log for SHADER_SRC:\n\n%s\n", shLog) } @@ -229,10 +227,8 @@ const linkPart = ` gli.AttachShader(program, fs) gli.LinkProgram(program) - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := gli.GetProgramInfoLog(program, logLength) + shLog := gli.GetProgramInfoLog(program) + if len(shLog) > 0 { fmt.Printf("Shader link log for SHADER_SRC:\n\n%s\n", shLog) } diff --git a/openglinterface.go b/openglinterface.go index 028731c..32f5fe3 100644 --- a/openglinterface.go +++ b/openglinterface.go @@ -816,9 +816,9 @@ type GL interface { GenerateMipmap(target uint32) GetAttribLocation(program uint32, name string) int32 GetError() uint32 - GetProgramInfoLog(program uint32, bufSize int32) string + GetProgramInfoLog(program uint32) string GetProgramiv(program uint32, pname uint32, params *int32) - GetShaderInfoLog(shader uint32, bufSize int32) string + GetShaderInfoLog(shader uint32) string GetShaderiv(shader uint32, pname uint32, params *int32) GetUniformLocation(program uint32, name string) int32 LinkProgram(program uint32) @@ -828,7 +828,6 @@ type GL interface { StencilFunc(xfunc uint32, ref int32, mask uint32) StencilMask(mask uint32) StencilOp(fail uint32, zfail uint32, zpass uint32) - TexImage1D(target uint32, level int32, internalformat int32, width int32, border int32, format uint32, xtype uint32, pixels unsafe.Pointer) TexImage2D(target uint32, level int32, internalformat int32, width int32, height int32, border int32, format uint32, xtype uint32, pixels unsafe.Pointer) TexParameteri(target uint32, pname uint32, param int32) TexSubImage2D(target uint32, level int32, xoffset int32, yoffset int32, width int32, height int32, format uint32, xtype uint32, pixels unsafe.Pointer) diff --git a/shaders.go b/shaders.go index bddde32..138f377 100644 --- a/shaders.go +++ b/shaders.go @@ -56,7 +56,7 @@ precision mediump float; #endif varying vec2 v_cp; uniform mat3 invmat; -uniform sampler1D gradient; +uniform sampler2D gradient; uniform vec2 from, dir; uniform float len; uniform float globalAlpha; @@ -65,7 +65,7 @@ void main() { vec2 v = untf.xy - from; float r = dot(v, dir) / len; r = clamp(r, 0.0, 1.0); - vec4 col = texture1D(gradient, r); + vec4 col = texture2D(gradient, vec2(r, 0.0)); col.a *= globalAlpha; gl_FragColor = col; }` @@ -85,7 +85,7 @@ precision mediump float; #endif varying vec2 v_cp; uniform mat3 invmat; -uniform sampler1D gradient; +uniform sampler2D gradient; uniform vec2 from, to, dir; uniform float radFrom, radTo; uniform float len; @@ -110,7 +110,7 @@ void main() { } float o = max(o1, o2); //float r = radFrom + o * (radTo - radFrom); - vec4 col = texture1D(gradient, o); + vec4 col = texture2D(gradient, vec2(o, 0.0)); col.a *= globalAlpha; gl_FragColor = col; }` @@ -182,7 +182,7 @@ varying vec2 v_cp; varying vec2 v_atc; varying vec2 v_texCoord; uniform mat3 invmat; -uniform sampler1D gradient; +uniform sampler2D gradient; uniform vec2 from, dir; uniform float len; uniform sampler2D alphaTex; @@ -192,7 +192,7 @@ void main() { vec2 v = untf.xy - from; float r = dot(v, dir) / len; r = clamp(r, 0.0, 1.0); - vec4 col = texture1D(gradient, r); + vec4 col = texture2D(gradient, vec2(r, 0.0)); col.a *= texture2D(alphaTex, v_atc).a * globalAlpha; gl_FragColor = col; }` @@ -215,7 +215,7 @@ precision mediump float; varying vec2 v_cp; varying vec2 v_atc; uniform mat3 invmat; -uniform sampler1D gradient; +uniform sampler2D gradient; uniform vec2 from, to, dir; uniform float radFrom, radTo; uniform float len; @@ -241,7 +241,7 @@ void main() { } float o = max(o1, o2); float r = radFrom + o * (radTo - radFrom); - vec4 col = texture1D(gradient, o); + vec4 col = texture2D(gradient, vec2(o, 0.0)); col.a *= texture2D(alphaTex, v_atc).a * globalAlpha; gl_FragColor = col; }`