From a01a6799f1c7fecfd114493d47250bbb0dc48d0e Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Wed, 31 Oct 2018 12:39:14 +0100 Subject: [PATCH] reduced the maximum shadow blur size to avoid running into some gpu limitations for now --- canvas.go | 6 +- made_shaders.go | 1510 +++++++++++++++++++++++------------------------ shaders.go | 12 +- shadows.go | 4 +- text.go | 2 +- 5 files changed, 767 insertions(+), 767 deletions(-) diff --git a/canvas.go b/canvas.go index 2d7815d..6898c18 100644 --- a/canvas.go +++ b/canvas.go @@ -220,7 +220,7 @@ var ( ir *imageShader gauss15r *gaussianShader gauss63r *gaussianShader - gauss255r *gaussianShader + gauss127r *gaussianShader offscr1 offscreenBuffer offscr2 offscreenBuffer glChan = make(chan func()) @@ -354,7 +354,7 @@ func LoadGL(glimpl GL) (err error) { } gauss63r = (*gaussianShader)(gauss63s) - gauss255s, err := loadGaussian255Shader() + gauss127s, err := loadGaussian127Shader() if err != nil { return } @@ -362,7 +362,7 @@ func LoadGL(glimpl GL) (err error) { if err != nil { return } - gauss255r = (*gaussianShader)(gauss255s) + gauss127r = (*gaussianShader)(gauss127s) gli.GenBuffers(1, &buf) err = glError() diff --git a/made_shaders.go b/made_shaders.go index 4781270..72e4cb8 100755 --- a/made_shaders.go +++ b/made_shaders.go @@ -5,6 +5,738 @@ import ( "fmt" ) +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 imagePatternShader struct { + id uint32 + vertex uint32 + canvasSize int32 + imageSize int32 + invmat int32 + image int32 + globalAlpha int32 +} + +func loadImagePatternShader() (*imagePatternShader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, imagePatternVS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for imagePatternVS:\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 imagePatternVS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for imagePatternVS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, imagePatternFS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for imagePatternFS:\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 imagePatternFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for imagePatternFS, 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 imagePatternFS:\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 imagePatternFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for imagePatternFS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &imagePatternShader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.imageSize = gli.GetUniformLocation(program, "imageSize") + result.invmat = gli.GetUniformLocation(program, "invmat") + 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) + + 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 gaussian127Shader struct { + id uint32 + vertex uint32 + texCoord uint32 + canvasSize int32 + kernelScale int32 + image int32 + kernel int32 +} + +func loadGaussian127Shader() (*gaussian127Shader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, gaussian127VS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for gaussian127VS:\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 gaussian127VS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for gaussian127VS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, gaussian127FS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for gaussian127FS:\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 gaussian127FS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for gaussian127FS, 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 gaussian127FS:\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 gaussian127FS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for gaussian127FS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &gaussian127Shader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.texCoord = uint32(gli.GetAttribLocation(program, "texCoord")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.kernelScale = gli.GetUniformLocation(program, "kernelScale") + result.image = gli.GetUniformLocation(program, "image") + result.kernel = gli.GetUniformLocation(program, "kernel") + + return result, nil +} + +type imagePatternAlphaShader struct { + id uint32 + vertex uint32 + alphaTexCoord uint32 + canvasSize int32 + imageSize int32 + invmat int32 + image int32 + alphaTex int32 + globalAlpha int32 +} + +func loadImagePatternAlphaShader() (*imagePatternAlphaShader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, imagePatternAlphaVS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for imagePatternAlphaVS:\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 imagePatternAlphaVS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for imagePatternAlphaVS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, imagePatternAlphaFS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for imagePatternAlphaFS:\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 imagePatternAlphaFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for imagePatternAlphaFS, 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 imagePatternAlphaFS:\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 imagePatternAlphaFS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for imagePatternAlphaFS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &imagePatternAlphaShader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.imageSize = gli.GetUniformLocation(program, "imageSize") + result.invmat = gli.GetUniformLocation(program, "invmat") + result.image = gli.GetUniformLocation(program, "image") + 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 gaussian15Shader struct { + id uint32 + vertex uint32 + texCoord uint32 + canvasSize int32 + kernelScale int32 + image int32 + kernel int32 +} + +func loadGaussian15Shader() (*gaussian15Shader, error) { + var vs, fs, program uint32 + + { + vs = gli.CreateShader(gl_VERTEX_SHADER) + gli.ShaderSource(vs, gaussian15VS) + gli.CompileShader(vs) + + shLog := gli.GetShaderInfoLog(vs) + if len(shLog) > 0 { + fmt.Printf("VERTEX_SHADER compilation log for gaussian15VS:\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 gaussian15VS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for gaussian15VS, glError: " + fmt.Sprint(glErr)) + } + } + + { + fs = gli.CreateShader(gl_FRAGMENT_SHADER) + gli.ShaderSource(fs, gaussian15FS) + gli.CompileShader(fs) + + shLog := gli.GetShaderInfoLog(fs) + if len(shLog) > 0 { + fmt.Printf("FRAGMENT_SHADER compilation log for gaussian15FS:\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 gaussian15FS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error compiling shader part for gaussian15FS, 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 gaussian15FS:\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 gaussian15FS") + } + if glErr := gli.GetError(); glErr != gl_NO_ERROR { + return nil, errors.New("error linking shader for gaussian15FS, glError: " + fmt.Sprint(glErr)) + } + } + + result := &gaussian15Shader{} + result.id = program + result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) + result.texCoord = uint32(gli.GetAttribLocation(program, "texCoord")) + result.canvasSize = gli.GetUniformLocation(program, "canvasSize") + result.kernelScale = gli.GetUniformLocation(program, "kernelScale") + result.image = gli.GetUniformLocation(program, "image") + result.kernel = gli.GetUniformLocation(program, "kernel") + + 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) + + 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 gaussian63Shader struct { id uint32 vertex uint32 @@ -95,56 +827,58 @@ func loadGaussian63Shader() (*gaussian63Shader, error) { return result, nil } -type solidShader struct { - id uint32 - vertex uint32 - canvasSize int32 - color int32 - globalAlpha int32 +type solidAlphaShader struct { + id uint32 + vertex uint32 + alphaTexCoord uint32 + canvasSize int32 + color int32 + alphaTex int32 + globalAlpha int32 } -func loadSolidShader() (*solidShader, error) { +func loadSolidAlphaShader() (*solidAlphaShader, error) { var vs, fs, program uint32 { vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, solidVS) + gli.ShaderSource(vs, solidAlphaVS) gli.CompileShader(vs) shLog := gli.GetShaderInfoLog(vs) if len(shLog) > 0 { - fmt.Printf("VERTEX_SHADER compilation log for solidVS:\n\n%s\n", shLog) + 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 solidVS") + 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 solidVS, glError: " + fmt.Sprint(glErr)) + return nil, errors.New("error compiling shader part for solidAlphaVS, glError: " + fmt.Sprint(glErr)) } } { fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, solidFS) + gli.ShaderSource(fs, solidAlphaFS) gli.CompileShader(fs) shLog := gli.GetShaderInfoLog(fs) if len(shLog) > 0 { - fmt.Printf("FRAGMENT_SHADER compilation log for solidFS:\n\n%s\n", shLog) + 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 solidFS") + 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 solidFS, glError: " + fmt.Sprint(glErr)) + return nil, errors.New("error compiling shader part for solidAlphaFS, glError: " + fmt.Sprint(glErr)) } } @@ -156,7 +890,7 @@ func loadSolidShader() (*solidShader, error) { shLog := gli.GetProgramInfoLog(program) if len(shLog) > 0 { - fmt.Printf("Shader link log for solidFS:\n\n%s\n", shLog) + fmt.Printf("Shader link log for solidAlphaFS:\n\n%s\n", shLog) } var status int32 @@ -164,18 +898,20 @@ func loadSolidShader() (*solidShader, error) { if status != gl_TRUE { gli.DeleteShader(vs) gli.DeleteShader(fs) - return nil, errors.New("error linking shader for solidFS") + 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 solidFS, glError: " + fmt.Sprint(glErr)) + return nil, errors.New("error linking shader for solidAlphaFS, glError: " + fmt.Sprint(glErr)) } } - result := &solidShader{} + 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 @@ -382,739 +1118,3 @@ func loadRadialGradientAlphaShader() (*radialGradientAlphaShader, error) { return result, nil } - -type gaussian15Shader struct { - id uint32 - vertex uint32 - texCoord uint32 - canvasSize int32 - kernelScale int32 - image int32 - kernel int32 -} - -func loadGaussian15Shader() (*gaussian15Shader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, gaussian15VS) - gli.CompileShader(vs) - - shLog := gli.GetShaderInfoLog(vs) - if len(shLog) > 0 { - fmt.Printf("VERTEX_SHADER compilation log for gaussian15VS:\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 gaussian15VS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for gaussian15VS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, gaussian15FS) - gli.CompileShader(fs) - - shLog := gli.GetShaderInfoLog(fs) - if len(shLog) > 0 { - fmt.Printf("FRAGMENT_SHADER compilation log for gaussian15FS:\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 gaussian15FS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for gaussian15FS, 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 gaussian15FS:\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 gaussian15FS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for gaussian15FS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &gaussian15Shader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.texCoord = uint32(gli.GetAttribLocation(program, "texCoord")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.kernelScale = gli.GetUniformLocation(program, "kernelScale") - result.image = gli.GetUniformLocation(program, "image") - result.kernel = gli.GetUniformLocation(program, "kernel") - - return result, nil -} - -type imagePatternShader struct { - id uint32 - vertex uint32 - canvasSize int32 - imageSize int32 - invmat int32 - image int32 - globalAlpha int32 -} - -func loadImagePatternShader() (*imagePatternShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, imagePatternVS) - gli.CompileShader(vs) - - shLog := gli.GetShaderInfoLog(vs) - if len(shLog) > 0 { - fmt.Printf("VERTEX_SHADER compilation log for imagePatternVS:\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 imagePatternVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for imagePatternVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, imagePatternFS) - gli.CompileShader(fs) - - shLog := gli.GetShaderInfoLog(fs) - if len(shLog) > 0 { - fmt.Printf("FRAGMENT_SHADER compilation log for imagePatternFS:\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 imagePatternFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for imagePatternFS, 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 imagePatternFS:\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 imagePatternFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for imagePatternFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &imagePatternShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.imageSize = gli.GetUniformLocation(program, "imageSize") - result.invmat = gli.GetUniformLocation(program, "invmat") - result.image = gli.GetUniformLocation(program, "image") - 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 gaussian255Shader struct { - id uint32 - vertex uint32 - texCoord uint32 - canvasSize int32 - kernelScale int32 - image int32 - kernel int32 -} - -func loadGaussian255Shader() (*gaussian255Shader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, gaussian255VS) - gli.CompileShader(vs) - - shLog := gli.GetShaderInfoLog(vs) - if len(shLog) > 0 { - fmt.Printf("VERTEX_SHADER compilation log for gaussian255VS:\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 gaussian255VS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for gaussian255VS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, gaussian255FS) - gli.CompileShader(fs) - - shLog := gli.GetShaderInfoLog(fs) - if len(shLog) > 0 { - fmt.Printf("FRAGMENT_SHADER compilation log for gaussian255FS:\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 gaussian255FS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for gaussian255FS, 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 gaussian255FS:\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 gaussian255FS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for gaussian255FS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &gaussian255Shader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.texCoord = uint32(gli.GetAttribLocation(program, "texCoord")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.kernelScale = gli.GetUniformLocation(program, "kernelScale") - result.image = gli.GetUniformLocation(program, "image") - result.kernel = gli.GetUniformLocation(program, "kernel") - - 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) - - 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 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 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 imagePatternAlphaShader struct { - id uint32 - vertex uint32 - alphaTexCoord uint32 - canvasSize int32 - imageSize int32 - invmat int32 - image int32 - alphaTex int32 - globalAlpha int32 -} - -func loadImagePatternAlphaShader() (*imagePatternAlphaShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, imagePatternAlphaVS) - gli.CompileShader(vs) - - shLog := gli.GetShaderInfoLog(vs) - if len(shLog) > 0 { - fmt.Printf("VERTEX_SHADER compilation log for imagePatternAlphaVS:\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 imagePatternAlphaVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for imagePatternAlphaVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, imagePatternAlphaFS) - gli.CompileShader(fs) - - shLog := gli.GetShaderInfoLog(fs) - if len(shLog) > 0 { - fmt.Printf("FRAGMENT_SHADER compilation log for imagePatternAlphaFS:\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 imagePatternAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for imagePatternAlphaFS, 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 imagePatternAlphaFS:\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 imagePatternAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for imagePatternAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &imagePatternAlphaShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.imageSize = gli.GetUniformLocation(program, "imageSize") - result.invmat = gli.GetUniformLocation(program, "invmat") - result.image = gli.GetUniformLocation(program, "image") - result.alphaTex = gli.GetUniformLocation(program, "alphaTex") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} diff --git a/shaders.go b/shaders.go index 74d2165..14f2c76 100644 --- a/shaders.go +++ b/shaders.go @@ -327,7 +327,7 @@ _SUM_ gl_FragColor = color; }` -var gaussian255VS = ` +var gaussian127VS = ` attribute vec2 vertex, texCoord; uniform vec2 canvasSize; varying vec2 v_texCoord; @@ -336,14 +336,14 @@ void main() { vec2 glp = vertex * 2.0 / canvasSize - 1.0; gl_Position = vec4(glp.x, -glp.y, 0.0, 1.0); }` -var gaussian255FS = ` +var gaussian127FS = ` #ifdef GL_ES precision mediump float; #endif varying vec2 v_texCoord; uniform vec2 kernelScale; uniform sampler2D image; -uniform float kernel[255]; +uniform float kernel[127]; void main() { vec4 color = vec4(0.0, 0.0, 0.0, 0.0); _SUM_ @@ -353,11 +353,11 @@ _SUM_ func init() { fstr := "\tcolor += texture2D(image, v_texCoord + vec2(%.1f * kernelScale.x, %.1f * kernelScale.y)) * kernel[%d];\n" bb := bytes.Buffer{} - for i := 0; i < 255; i++ { - off := float64(i) - 127 + for i := 0; i < 127; i++ { + off := float64(i) - 63 fmt.Fprintf(&bb, fstr, off, off, i) } - gaussian255FS = strings.Replace(gaussian255FS, "_SUM_", bb.String(), -1) + gaussian127FS = strings.Replace(gaussian127FS, "_SUM_", bb.String(), -1) bb.Reset() for i := 0; i < 63; i++ { off := float64(i) - 31 diff --git a/shadows.go b/shadows.go index e19511f..1c3e7cd 100644 --- a/shadows.go +++ b/shadows.go @@ -128,8 +128,8 @@ func (cv *Canvas) drawBlurredShadow() { gs = gauss63r kernel = kernelBuf[:63] } else { - gs = gauss255r - kernel = kernelBuf[:255] + gs = gauss127r + kernel = kernelBuf[:127] } gaussianKernel(cv.state.shadowBlur, kernel) diff --git a/text.go b/text.go index 2f9d65e..e28544f 100644 --- a/text.go +++ b/text.go @@ -405,7 +405,7 @@ func (cv *Canvas) MeasureText(str string) TextMetrics { } return TextMetrics{ - Width: x, + Width: x, ActualBoundingBoxAscent: -minY, ActualBoundingBoxDescent: +maxY, }