From 06267645f605e4c1d7627015646f46540a116fd2 Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Thu, 10 May 2018 13:08:30 +0200 Subject: [PATCH] changed openglinterface a bit to be less specific to the go-gl implementation --- goglimpl/goglimpl.go | 40 +- imagedata.go | 4 +- images.go | 4 +- made_shaders.go | 1206 ++++++++++++++++++++---------------------- make_shaders.go | 16 +- openglinterface.go | 15 +- paths.go | 12 +- text.go | 4 +- 8 files changed, 604 insertions(+), 697 deletions(-) diff --git a/goglimpl/goglimpl.go b/goglimpl/goglimpl.go index dadbec5..8d01b0d 100644 --- a/goglimpl/goglimpl.go +++ b/goglimpl/goglimpl.go @@ -1,6 +1,7 @@ package goglimpl import ( + "strings" "unsafe" "github.com/go-gl/gl/v3.2-core/gl" @@ -14,15 +15,6 @@ var _ canvas.GL = GLImpl{} func (_ GLImpl) Ptr(data interface{}) unsafe.Pointer { return gl.Ptr(data) } -func (_ GLImpl) PtrOffset(offset int) unsafe.Pointer { - return gl.PtrOffset(offset) -} -func (_ GLImpl) Str(str string) *uint8 { - return gl.Str(str) -} -func (_ GLImpl) Strs(strs ...string) (cstrs **uint8, free func()) { - return gl.Strs(strs...) -} func (_ GLImpl) ActiveTexture(texture uint32) { gl.ActiveTexture(texture) } @@ -83,26 +75,30 @@ func (_ GLImpl) GenTextures(n int32, textures *uint32) { func (_ GLImpl) GenerateMipmap(target uint32) { gl.GenerateMipmap(target) } -func (_ GLImpl) GetAttribLocation(program uint32, name *uint8) int32 { - return gl.GetAttribLocation(program, name) +func (_ GLImpl) GetAttribLocation(program uint32, name string) int32 { + return gl.GetAttribLocation(program, gl.Str(name+"\x00")) } func (_ GLImpl) GetError() uint32 { return gl.GetError() } -func (_ GLImpl) GetProgramInfoLog(program uint32, bufSize int32, length *int32, infoLog *uint8) { - gl.GetProgramInfoLog(program, bufSize, length, infoLog) +func (_ GLImpl) GetProgramInfoLog(program uint32, bufSize int32) string { + log := strings.Repeat("\x00", int(bufSize+1)) + gl.GetProgramInfoLog(program, bufSize, nil, gl.Str(log)) + return log } func (_ GLImpl) GetProgramiv(program uint32, pname uint32, params *int32) { gl.GetProgramiv(program, pname, params) } -func (_ GLImpl) GetShaderInfoLog(shader uint32, bufSize int32, length *int32, infoLog *uint8) { - gl.GetShaderInfoLog(shader, bufSize, length, infoLog) +func (_ GLImpl) GetShaderInfoLog(program uint32, bufSize int32) string { + log := strings.Repeat("\x00", int(bufSize+1)) + gl.GetShaderInfoLog(program, bufSize, nil, gl.Str(log)) + return log } func (_ GLImpl) GetShaderiv(shader uint32, pname uint32, params *int32) { gl.GetShaderiv(shader, pname, params) } -func (_ GLImpl) GetUniformLocation(program uint32, name *uint8) int32 { - return gl.GetUniformLocation(program, name) +func (_ GLImpl) GetUniformLocation(program uint32, name string) int32 { + return gl.GetUniformLocation(program, gl.Str(name+"\x00")) } func (_ GLImpl) LinkProgram(program uint32) { gl.LinkProgram(program) @@ -113,8 +109,10 @@ func (_ GLImpl) ReadPixels(x int32, y int32, width int32, height int32, format u func (_ GLImpl) Scissor(x int32, y int32, width int32, height int32) { gl.Scissor(x, y, width, height) } -func (_ GLImpl) ShaderSource(shader uint32, count int32, xstring **uint8, length *int32) { - gl.ShaderSource(shader, count, xstring, length) +func (_ GLImpl) ShaderSource(shader uint32, source string) { + csource, freeFunc := gl.Strs(source + "\x00") + gl.ShaderSource(shader, 1, csource, nil) + freeFunc() } func (_ GLImpl) StencilFunc(xfunc uint32, ref int32, mask uint32) { gl.StencilFunc(xfunc, ref, mask) @@ -155,8 +153,8 @@ func (_ GLImpl) UniformMatrix3fv(location int32, count int32, transpose bool, va func (_ GLImpl) UseProgram(program uint32) { gl.UseProgram(program) } -func (_ GLImpl) VertexAttribPointer(index uint32, size int32, xtype uint32, normalized bool, stride int32, pointer unsafe.Pointer) { - gl.VertexAttribPointer(index, size, xtype, normalized, stride, pointer) +func (_ GLImpl) VertexAttribPointer(index uint32, size int32, xtype uint32, normalized bool, stride int32, offset uint32) { + gl.VertexAttribPointer(index, size, xtype, normalized, stride, gl.PtrOffset(int(offset))) } func (_ GLImpl) Viewport(x int32, y int32, width int32, height int32) { gl.Viewport(x, y, width, height) diff --git a/imagedata.go b/imagedata.go index e739291..07354d1 100644 --- a/imagedata.go +++ b/imagedata.go @@ -86,8 +86,8 @@ func (cv *Canvas) PutImageData(img *image.RGBA, x, y int) { gli.Uniform1i(ir.image, 0) gli.Uniform2f(ir.canvasSize, float32(cv.fw), float32(cv.fh)) gli.Uniform1f(ir.globalAlpha, 1) - gli.VertexAttribPointer(ir.vertex, 2, gl_FLOAT, false, 0, nil) - gli.VertexAttribPointer(ir.texCoord, 2, gl_FLOAT, false, 0, gli.PtrOffset(8*4)) + gli.VertexAttribPointer(ir.vertex, 2, gl_FLOAT, false, 0, 0) + gli.VertexAttribPointer(ir.texCoord, 2, gl_FLOAT, false, 0, 8*4) gli.EnableVertexAttribArray(ir.vertex) gli.EnableVertexAttribArray(ir.texCoord) gli.DrawArrays(gl_TRIANGLE_FAN, 0, 4) diff --git a/images.go b/images.go index be76c59..151a17e 100644 --- a/images.go +++ b/images.go @@ -263,8 +263,8 @@ func (cv *Canvas) DrawImage(image interface{}, coords ...float64) { gli.Uniform1i(ir.image, 0) gli.Uniform2f(ir.canvasSize, float32(cv.fw), float32(cv.fh)) gli.Uniform1f(ir.globalAlpha, float32(cv.state.globalAlpha)) - gli.VertexAttribPointer(ir.vertex, 2, gl_FLOAT, false, 0, nil) - gli.VertexAttribPointer(ir.texCoord, 2, gl_FLOAT, false, 0, gli.PtrOffset(8*4)) + gli.VertexAttribPointer(ir.vertex, 2, gl_FLOAT, false, 0, 0) + gli.VertexAttribPointer(ir.texCoord, 2, gl_FLOAT, false, 0, 8*4) gli.EnableVertexAttribArray(ir.vertex) gli.EnableVertexAttribArray(ir.texCoord) gli.DrawArrays(gl_TRIANGLE_FAN, 0, 4) diff --git a/made_shaders.go b/made_shaders.go index 5ba1498..c911fbc 100755 --- a/made_shaders.go +++ b/made_shaders.go @@ -3,78 +3,64 @@ package canvas import ( "errors" "fmt" - "strings" ) -type radialGradientShader struct { +type imagePatternShader struct { id uint32 vertex uint32 canvasSize int32 + imageSize int32 invmat int32 - gradient int32 - from int32 - to int32 - dir int32 - radFrom int32 - radTo int32 - len int32 + image int32 globalAlpha int32 } -func loadRadialGradientShader() (*radialGradientShader, error) { +func loadImagePatternShader() (*imagePatternShader, error) { var vs, fs, program uint32 { - csource, freeFunc := gli.Strs(radialGradientVS + "\x00") - defer freeFunc() - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, 1, csource, nil) + gli.ShaderSource(vs, imagePatternVS) gli.CompileShader(vs) var logLength int32 gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(vs, logLength, nil, gli.Str(shLog)) - fmt.Printf("VERTEX_SHADER compilation log for radialGradientVS:\n\n%s\n", shLog) + shLog := gli.GetShaderInfoLog(vs, logLength) + 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 radialGradientVS") + 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 radialGradientVS, glError: " + fmt.Sprint(glErr)) + return nil, errors.New("error compiling shader part for imagePatternVS, glError: " + fmt.Sprint(glErr)) } } { - csource, freeFunc := gli.Strs(radialGradientFS + "\x00") - defer freeFunc() - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, 1, csource, nil) + gli.ShaderSource(fs, imagePatternFS) gli.CompileShader(fs) var logLength int32 gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(fs, logLength, nil, gli.Str(shLog)) - fmt.Printf("FRAGMENT_SHADER compilation log for radialGradientFS:\n\n%s\n", shLog) + shLog := gli.GetShaderInfoLog(fs, logLength) + 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 radialGradientFS") + 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 radialGradientFS, glError: " + fmt.Sprint(glErr)) + return nil, errors.New("error compiling shader part for imagePatternFS, glError: " + fmt.Sprint(glErr)) } } @@ -87,9 +73,8 @@ func loadRadialGradientShader() (*radialGradientShader, error) { var logLength int32 gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) - fmt.Printf("Shader link log for radialGradientFS:\n\n%s\n", shLog) + shLog := gli.GetProgramInfoLog(program, logLength) + fmt.Printf("Shader link log for imagePatternFS:\n\n%s\n", shLog) } var status int32 @@ -97,26 +82,309 @@ func loadRadialGradientShader() (*radialGradientShader, error) { if status != gl_TRUE { gli.DeleteShader(vs) gli.DeleteShader(fs) - return nil, errors.New("error linking shader for radialGradientFS") + 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 radialGradientFS, glError: " + fmt.Sprint(glErr)) + return nil, errors.New("error linking shader for imagePatternFS, glError: " + fmt.Sprint(glErr)) } } - result := &radialGradientShader{} + result := &imagePatternShader{} result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, gli.Str("vertex\x00"))) - result.canvasSize = gli.GetUniformLocation(program, gli.Str("canvasSize\x00")) - result.invmat = gli.GetUniformLocation(program, gli.Str("invmat\x00")) - result.gradient = gli.GetUniformLocation(program, gli.Str("gradient\x00")) - result.from = gli.GetUniformLocation(program, gli.Str("from\x00")) - result.to = gli.GetUniformLocation(program, gli.Str("to\x00")) - result.dir = gli.GetUniformLocation(program, gli.Str("dir\x00")) - result.radFrom = gli.GetUniformLocation(program, gli.Str("radFrom\x00")) - result.radTo = gli.GetUniformLocation(program, gli.Str("radTo\x00")) - result.len = gli.GetUniformLocation(program, gli.Str("len\x00")) - result.globalAlpha = gli.GetUniformLocation(program, gli.Str("globalAlpha\x00")) + 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 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) + + 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 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) + + 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 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) + + 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 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 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 } @@ -142,18 +410,14 @@ func loadRadialGradientAlphaShader() (*radialGradientAlphaShader, error) { var vs, fs, program uint32 { - csource, freeFunc := gli.Strs(radialGradientAlphaVS + "\x00") - defer freeFunc() - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, 1, csource, nil) + gli.ShaderSource(vs, radialGradientAlphaVS) gli.CompileShader(vs) var logLength int32 gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(vs, logLength, nil, gli.Str(shLog)) + shLog := gli.GetShaderInfoLog(vs, logLength) fmt.Printf("VERTEX_SHADER compilation log for radialGradientAlphaVS:\n\n%s\n", shLog) } @@ -169,18 +433,14 @@ func loadRadialGradientAlphaShader() (*radialGradientAlphaShader, error) { } { - csource, freeFunc := gli.Strs(radialGradientAlphaFS + "\x00") - defer freeFunc() - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, 1, csource, nil) + gli.ShaderSource(fs, radialGradientAlphaFS) gli.CompileShader(fs) var logLength int32 gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(fs, logLength, nil, gli.Str(shLog)) + shLog := gli.GetShaderInfoLog(fs, logLength) fmt.Printf("FRAGMENT_SHADER compilation log for radialGradientAlphaFS:\n\n%s\n", shLog) } @@ -204,8 +464,7 @@ func loadRadialGradientAlphaShader() (*radialGradientAlphaShader, error) { var logLength int32 gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) + shLog := gli.GetProgramInfoLog(program, logLength) fmt.Printf("Shader link log for radialGradientAlphaFS:\n\n%s\n", shLog) } @@ -223,548 +482,19 @@ func loadRadialGradientAlphaShader() (*radialGradientAlphaShader, error) { result := &radialGradientAlphaShader{} result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, gli.Str("vertex\x00"))) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, gli.Str("alphaTexCoord\x00"))) - result.canvasSize = gli.GetUniformLocation(program, gli.Str("canvasSize\x00")) - result.invmat = gli.GetUniformLocation(program, gli.Str("invmat\x00")) - result.gradient = gli.GetUniformLocation(program, gli.Str("gradient\x00")) - result.from = gli.GetUniformLocation(program, gli.Str("from\x00")) - result.to = gli.GetUniformLocation(program, gli.Str("to\x00")) - result.dir = gli.GetUniformLocation(program, gli.Str("dir\x00")) - result.radFrom = gli.GetUniformLocation(program, gli.Str("radFrom\x00")) - result.radTo = gli.GetUniformLocation(program, gli.Str("radTo\x00")) - result.len = gli.GetUniformLocation(program, gli.Str("len\x00")) - result.alphaTex = gli.GetUniformLocation(program, gli.Str("alphaTex\x00")) - result.globalAlpha = gli.GetUniformLocation(program, gli.Str("globalAlpha\x00")) - - 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 - - { - csource, freeFunc := gli.Strs(imagePatternVS + "\x00") - defer freeFunc() - - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, 1, csource, nil) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(vs, logLength, nil, gli.Str(shLog)) - 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)) - } - } - - { - csource, freeFunc := gli.Strs(imagePatternFS + "\x00") - defer freeFunc() - - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, 1, csource, nil) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(fs, logLength, nil, gli.Str(shLog)) - 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) - - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) - 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, gli.Str("vertex\x00"))) - result.canvasSize = gli.GetUniformLocation(program, gli.Str("canvasSize\x00")) - result.imageSize = gli.GetUniformLocation(program, gli.Str("imageSize\x00")) - result.invmat = gli.GetUniformLocation(program, gli.Str("invmat\x00")) - result.image = gli.GetUniformLocation(program, gli.Str("image\x00")) - result.globalAlpha = gli.GetUniformLocation(program, gli.Str("globalAlpha\x00")) - - 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 - - { - csource, freeFunc := gli.Strs(imagePatternAlphaVS + "\x00") - defer freeFunc() - - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, 1, csource, nil) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(vs, logLength, nil, gli.Str(shLog)) - 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)) - } - } - - { - csource, freeFunc := gli.Strs(imagePatternAlphaFS + "\x00") - defer freeFunc() - - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, 1, csource, nil) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(fs, logLength, nil, gli.Str(shLog)) - 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) - - var logLength int32 - gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) - 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, gli.Str("vertex\x00"))) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, gli.Str("alphaTexCoord\x00"))) - result.canvasSize = gli.GetUniformLocation(program, gli.Str("canvasSize\x00")) - result.imageSize = gli.GetUniformLocation(program, gli.Str("imageSize\x00")) - result.invmat = gli.GetUniformLocation(program, gli.Str("invmat\x00")) - result.image = gli.GetUniformLocation(program, gli.Str("image\x00")) - result.alphaTex = gli.GetUniformLocation(program, gli.Str("alphaTex\x00")) - result.globalAlpha = gli.GetUniformLocation(program, gli.Str("globalAlpha\x00")) - - 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 - - { - csource, freeFunc := gli.Strs(solidAlphaVS + "\x00") - defer freeFunc() - - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, 1, csource, nil) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(vs, logLength, nil, gli.Str(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 solidAlphaVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for solidAlphaVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - csource, freeFunc := gli.Strs(solidAlphaFS + "\x00") - defer freeFunc() - - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, 1, csource, nil) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(fs, logLength, nil, gli.Str(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 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 := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) - 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, gli.Str("vertex\x00"))) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, gli.Str("alphaTexCoord\x00"))) - result.canvasSize = gli.GetUniformLocation(program, gli.Str("canvasSize\x00")) - result.color = gli.GetUniformLocation(program, gli.Str("color\x00")) - result.alphaTex = gli.GetUniformLocation(program, gli.Str("alphaTex\x00")) - result.globalAlpha = gli.GetUniformLocation(program, gli.Str("globalAlpha\x00")) - - 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 - - { - csource, freeFunc := gli.Strs(solidVS + "\x00") - defer freeFunc() - - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, 1, csource, nil) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(vs, logLength, nil, gli.Str(shLog)) - 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)) - } - } - - { - csource, freeFunc := gli.Strs(solidFS + "\x00") - defer freeFunc() - - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, 1, csource, nil) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(fs, logLength, nil, gli.Str(shLog)) - 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 := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) - 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, gli.Str("vertex\x00"))) - result.canvasSize = gli.GetUniformLocation(program, gli.Str("canvasSize\x00")) - result.color = gli.GetUniformLocation(program, gli.Str("color\x00")) - result.globalAlpha = gli.GetUniformLocation(program, gli.Str("globalAlpha\x00")) - - 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 - - { - csource, freeFunc := gli.Strs(linearGradientVS + "\x00") - defer freeFunc() - - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, 1, csource, nil) - gli.CompileShader(vs) - - var logLength int32 - gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(vs, logLength, nil, gli.Str(shLog)) - 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)) - } - } - - { - csource, freeFunc := gli.Strs(linearGradientFS + "\x00") - defer freeFunc() - - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, 1, csource, nil) - gli.CompileShader(fs) - - var logLength int32 - gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) - if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(fs, logLength, nil, gli.Str(shLog)) - 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 := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) - 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, gli.Str("vertex\x00"))) - result.canvasSize = gli.GetUniformLocation(program, gli.Str("canvasSize\x00")) - result.invmat = gli.GetUniformLocation(program, gli.Str("invmat\x00")) - result.gradient = gli.GetUniformLocation(program, gli.Str("gradient\x00")) - result.from = gli.GetUniformLocation(program, gli.Str("from\x00")) - result.dir = gli.GetUniformLocation(program, gli.Str("dir\x00")) - result.len = gli.GetUniformLocation(program, gli.Str("len\x00")) - result.globalAlpha = gli.GetUniformLocation(program, gli.Str("globalAlpha\x00")) + 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 } @@ -787,18 +517,14 @@ func loadLinearGradientAlphaShader() (*linearGradientAlphaShader, error) { var vs, fs, program uint32 { - csource, freeFunc := gli.Strs(linearGradientAlphaVS + "\x00") - defer freeFunc() - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, 1, csource, nil) + gli.ShaderSource(vs, linearGradientAlphaVS) gli.CompileShader(vs) var logLength int32 gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(vs, logLength, nil, gli.Str(shLog)) + shLog := gli.GetShaderInfoLog(vs, logLength) fmt.Printf("VERTEX_SHADER compilation log for linearGradientAlphaVS:\n\n%s\n", shLog) } @@ -814,18 +540,14 @@ func loadLinearGradientAlphaShader() (*linearGradientAlphaShader, error) { } { - csource, freeFunc := gli.Strs(linearGradientAlphaFS + "\x00") - defer freeFunc() - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, 1, csource, nil) + gli.ShaderSource(fs, linearGradientAlphaFS) gli.CompileShader(fs) var logLength int32 gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(fs, logLength, nil, gli.Str(shLog)) + shLog := gli.GetShaderInfoLog(fs, logLength) fmt.Printf("FRAGMENT_SHADER compilation log for linearGradientAlphaFS:\n\n%s\n", shLog) } @@ -849,8 +571,7 @@ func loadLinearGradientAlphaShader() (*linearGradientAlphaShader, error) { var logLength int32 gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) + shLog := gli.GetProgramInfoLog(program, logLength) fmt.Printf("Shader link log for linearGradientAlphaFS:\n\n%s\n", shLog) } @@ -868,16 +589,122 @@ func loadLinearGradientAlphaShader() (*linearGradientAlphaShader, error) { result := &linearGradientAlphaShader{} result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, gli.Str("vertex\x00"))) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, gli.Str("alphaTexCoord\x00"))) - result.canvasSize = gli.GetUniformLocation(program, gli.Str("canvasSize\x00")) - result.invmat = gli.GetUniformLocation(program, gli.Str("invmat\x00")) - result.gradient = gli.GetUniformLocation(program, gli.Str("gradient\x00")) - result.from = gli.GetUniformLocation(program, gli.Str("from\x00")) - result.dir = gli.GetUniformLocation(program, gli.Str("dir\x00")) - result.len = gli.GetUniformLocation(program, gli.Str("len\x00")) - result.alphaTex = gli.GetUniformLocation(program, gli.Str("alphaTex\x00")) - result.globalAlpha = gli.GetUniformLocation(program, gli.Str("globalAlpha\x00")) + 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 } @@ -895,18 +722,14 @@ func loadImageShader() (*imageShader, error) { var vs, fs, program uint32 { - csource, freeFunc := gli.Strs(imageVS + "\x00") - defer freeFunc() - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, 1, csource, nil) + gli.ShaderSource(vs, imageVS) gli.CompileShader(vs) var logLength int32 gli.GetShaderiv(vs, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(vs, logLength, nil, gli.Str(shLog)) + shLog := gli.GetShaderInfoLog(vs, logLength) fmt.Printf("VERTEX_SHADER compilation log for imageVS:\n\n%s\n", shLog) } @@ -922,18 +745,14 @@ func loadImageShader() (*imageShader, error) { } { - csource, freeFunc := gli.Strs(imageFS + "\x00") - defer freeFunc() - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, 1, csource, nil) + gli.ShaderSource(fs, imageFS) gli.CompileShader(fs) var logLength int32 gli.GetShaderiv(fs, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(fs, logLength, nil, gli.Str(shLog)) + shLog := gli.GetShaderInfoLog(fs, logLength) fmt.Printf("FRAGMENT_SHADER compilation log for imageFS:\n\n%s\n", shLog) } @@ -957,8 +776,7 @@ func loadImageShader() (*imageShader, error) { var logLength int32 gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) + shLog := gli.GetProgramInfoLog(program, logLength) fmt.Printf("Shader link log for imageFS:\n\n%s\n", shLog) } @@ -976,11 +794,111 @@ func loadImageShader() (*imageShader, error) { result := &imageShader{} result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, gli.Str("vertex\x00"))) - result.texCoord = uint32(gli.GetAttribLocation(program, gli.Str("texCoord\x00"))) - result.canvasSize = gli.GetUniformLocation(program, gli.Str("canvasSize\x00")) - result.image = gli.GetUniformLocation(program, gli.Str("image\x00")) - result.globalAlpha = gli.GetUniformLocation(program, gli.Str("globalAlpha\x00")) + 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 4f9f68a..2274e82 100644 --- a/make_shaders.go +++ b/make_shaders.go @@ -200,18 +200,14 @@ func shaderGetTopLevelLines(source string) []string { const compilePart = ` { - csource, freeFunc := gli.Strs(SHADER_SRC + "\x00") - defer freeFunc() - SHADER_VAR = gli.CreateShader(gl_SHADER_TYPE) - gli.ShaderSource(SHADER_VAR, 1, csource, nil) + 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 := strings.Repeat("\x00", int(logLength+1)) - gli.GetShaderInfoLog(SHADER_VAR, logLength, nil, gli.Str(shLog)) + shLog := gli.GetShaderInfoLog(SHADER_VAR, logLength) fmt.Printf("SHADER_TYPE compilation log for SHADER_SRC:\n\n%s\n", shLog) } @@ -236,8 +232,7 @@ const linkPart = ` var logLength int32 gli.GetProgramiv(program, gl_INFO_LOG_LENGTH, &logLength) if logLength > 0 { - shLog := strings.Repeat("\x00", int(logLength+1)) - gli.GetProgramInfoLog(program, logLength, nil, gli.Str(shLog)) + shLog := gli.GetProgramInfoLog(program, logLength) fmt.Printf("Shader link log for SHADER_SRC:\n\n%s\n", shLog) } @@ -263,7 +258,6 @@ func buildCodeHeader(buf *bytes.Buffer) { fmt.Fprint(buf, "import (\n") fmt.Fprint(buf, "\t\"errors\"\n") fmt.Fprint(buf, "\t\"fmt\"\n") - fmt.Fprint(buf, "\t\"strings\"\n") fmt.Fprint(buf, ")\n\n") } @@ -306,9 +300,9 @@ func buildCode(buf *bytes.Buffer, baseName string, inputs []ShaderInput) { for _, input := range inputs { if input.IsAttrib { - fmt.Fprintf(buf, "\tresult.%s = uint32(gli.GetAttribLocation(program, gli.Str(\"%s\\x00\")))\n", input.Name, input.Name) + fmt.Fprintf(buf, "\tresult.%s = uint32(gli.GetAttribLocation(program, \"%s\"))\n", input.Name, input.Name) } else if input.IsUniform { - fmt.Fprintf(buf, "\tresult.%s = gli.GetUniformLocation(program, gli.Str(\"%s\\x00\"))\n", input.Name, input.Name) + fmt.Fprintf(buf, "\tresult.%s = gli.GetUniformLocation(program, \"%s\")\n", input.Name, input.Name) } } diff --git a/openglinterface.go b/openglinterface.go index f4c0267..028731c 100644 --- a/openglinterface.go +++ b/openglinterface.go @@ -794,9 +794,6 @@ const ( // this interface based on Go-GL v3.2 type GL interface { Ptr(data interface{}) unsafe.Pointer - PtrOffset(offset int) unsafe.Pointer - Str(str string) *uint8 - Strs(strs ...string) (cstrs **uint8, free func()) ActiveTexture(texture uint32) AttachShader(program uint32, shader uint32) BindBuffer(target uint32, buffer uint32) @@ -817,17 +814,17 @@ type GL interface { GenBuffers(n int32, buffers *uint32) GenTextures(n int32, textures *uint32) GenerateMipmap(target uint32) - GetAttribLocation(program uint32, name *uint8) int32 + GetAttribLocation(program uint32, name string) int32 GetError() uint32 - GetProgramInfoLog(program uint32, bufSize int32, length *int32, infoLog *uint8) + GetProgramInfoLog(program uint32, bufSize int32) string GetProgramiv(program uint32, pname uint32, params *int32) - GetShaderInfoLog(shader uint32, bufSize int32, length *int32, infoLog *uint8) + GetShaderInfoLog(shader uint32, bufSize int32) string GetShaderiv(shader uint32, pname uint32, params *int32) - GetUniformLocation(program uint32, name *uint8) int32 + GetUniformLocation(program uint32, name string) int32 LinkProgram(program uint32) ReadPixels(x int32, y int32, width int32, height int32, format uint32, xtype uint32, pixels unsafe.Pointer) Scissor(x int32, y int32, width int32, height int32) - ShaderSource(shader uint32, count int32, xstring **uint8, length *int32) + ShaderSource(shader uint32, source string) StencilFunc(xfunc uint32, ref int32, mask uint32) StencilMask(mask uint32) StencilOp(fail uint32, zfail uint32, zpass uint32) @@ -841,6 +838,6 @@ type GL interface { Uniform4f(location int32, v0 float32, v1 float32, v2 float32, v3 float32) UniformMatrix3fv(location int32, count int32, transpose bool, value *float32) UseProgram(program uint32) - VertexAttribPointer(index uint32, size int32, xtype uint32, normalized bool, stride int32, pointer unsafe.Pointer) + VertexAttribPointer(index uint32, size int32, xtype uint32, normalized bool, stride int32, offset uint32) Viewport(x int32, y int32, width int32, height int32) } diff --git a/paths.go b/paths.go index d646280..dc9c7b8 100644 --- a/paths.go +++ b/paths.go @@ -370,7 +370,7 @@ func (cv *Canvas) stroke(path []pathPoint) { gli.Uniform2f(sr.canvasSize, float32(cv.fw), float32(cv.fh)) gli.EnableVertexAttribArray(sr.vertex) - gli.VertexAttribPointer(sr.vertex, 2, gl_FLOAT, false, 0, nil) + gli.VertexAttribPointer(sr.vertex, 2, gl_FLOAT, false, 0, 0) gli.DrawArrays(gl_TRIANGLES, 6, int32(len(tris)/2-6)) gli.DisableVertexAttribArray(sr.vertex) @@ -380,7 +380,7 @@ func (cv *Canvas) stroke(path []pathPoint) { vertex := cv.useShader(&cv.state.stroke) gli.EnableVertexAttribArray(vertex) - gli.VertexAttribPointer(vertex, 2, gl_FLOAT, false, 0, nil) + gli.VertexAttribPointer(vertex, 2, gl_FLOAT, false, 0, 0) gli.DrawArrays(gl_TRIANGLES, 0, 6) gli.DisableVertexAttribArray(vertex) @@ -517,7 +517,7 @@ func (cv *Canvas) Fill() { gli.Uniform2f(sr.canvasSize, float32(cv.fw), float32(cv.fh)) gli.EnableVertexAttribArray(sr.vertex) - gli.VertexAttribPointer(sr.vertex, 2, gl_FLOAT, false, 0, nil) + gli.VertexAttribPointer(sr.vertex, 2, gl_FLOAT, false, 0, 0) gli.DrawArrays(gl_TRIANGLES, 6, int32(len(tris)/2-6)) gli.DisableVertexAttribArray(sr.vertex) @@ -527,7 +527,7 @@ func (cv *Canvas) Fill() { vertex := cv.useShader(&cv.state.fill) gli.EnableVertexAttribArray(vertex) - gli.VertexAttribPointer(vertex, 2, gl_FLOAT, false, 0, nil) + gli.VertexAttribPointer(vertex, 2, gl_FLOAT, false, 0, 0) gli.DrawArrays(gl_TRIANGLES, 0, 6) gli.DisableVertexAttribArray(vertex) @@ -594,7 +594,7 @@ func (cv *Canvas) clip(path []pathPoint) { gli.BindBuffer(gl_ARRAY_BUFFER, buf) gli.BufferData(gl_ARRAY_BUFFER, len(tris)*4, unsafe.Pointer(&tris[0]), gl_STREAM_DRAW) - gli.VertexAttribPointer(sr.vertex, 2, gl_FLOAT, false, 0, nil) + gli.VertexAttribPointer(sr.vertex, 2, gl_FLOAT, false, 0, 0) gli.UseProgram(sr.id) gli.Uniform4f(sr.color, 1, 1, 1, 1) @@ -701,7 +701,7 @@ func (cv *Canvas) FillRect(x, y, w, h float64) { gli.StencilFunc(gl_EQUAL, 0, 0xFF) vertex := cv.useShader(&cv.state.fill) - gli.VertexAttribPointer(vertex, 2, gl_FLOAT, false, 0, nil) + gli.VertexAttribPointer(vertex, 2, gl_FLOAT, false, 0, 0) gli.EnableVertexAttribArray(vertex) gli.DrawArrays(gl_TRIANGLE_FAN, 0, 4) gli.DisableVertexAttribArray(vertex) diff --git a/text.go b/text.go index 41a1cf5..0bca441 100644 --- a/text.go +++ b/text.go @@ -215,8 +215,8 @@ func (cv *Canvas) FillText(str string, x, y float64) { 0, 1, 0, float32(1 - th), float32(tw), float32(1 - th), float32(tw), 1} gli.BufferData(gl_ARRAY_BUFFER, len(data)*4, unsafe.Pointer(&data[0]), gl_STREAM_DRAW) - gli.VertexAttribPointer(vertex, 2, gl_FLOAT, false, 0, nil) - gli.VertexAttribPointer(alphaTexCoord, 2, gl_FLOAT, false, 0, gli.PtrOffset(8*4)) + gli.VertexAttribPointer(vertex, 2, gl_FLOAT, false, 0, 0) + gli.VertexAttribPointer(alphaTexCoord, 2, gl_FLOAT, false, 0, 8*4) gli.DrawArrays(gl_TRIANGLE_FAN, 0, 4) for y := 0; y < strHeight; y++ {