From e17505b05649ef0f8405a8bee3316343d7257875 Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Thu, 21 Feb 2019 17:09:11 +0100 Subject: [PATCH] removed gl code that is no longer needed in frontend --- canvas.go | 166 +------ made_shaders.go | 1120 ----------------------------------------------- make_shaders.go | 312 ------------- 3 files changed, 2 insertions(+), 1596 deletions(-) delete mode 100755 made_shaders.go delete mode 100644 make_shaders.go diff --git a/canvas.go b/canvas.go index ecb923d..8e96192 100644 --- a/canvas.go +++ b/canvas.go @@ -246,25 +246,8 @@ loop: const alphaTexSize = 2048 var ( - gli GL - buf uint32 - shadowBuf uint32 - alphaTex uint32 - sr *solidShader - lgr *linearGradientShader - rgr *radialGradientShader - ipr *imagePatternShader - sar *solidAlphaShader - rgar *radialGradientAlphaShader - lgar *linearGradientAlphaShader - ipar *imagePatternAlphaShader - ir *imageShader - gauss15r *gaussianShader - gauss63r *gaussianShader - gauss127r *gaussianShader - offscr1 offscreenBuffer - offscr2 offscreenBuffer - glChan = make(chan func()) + gli GL + glChan = make(chan func()) ) type offscreenBuffer struct { @@ -292,151 +275,6 @@ type gaussianShader struct { // The goglimpl subpackage contains an implementation based on Go-GL v3.2 func LoadGL(glimpl GL) (err error) { gli = glimpl - - gli.GetError() // clear error state - - sr, err = loadSolidShader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - - lgr, err = loadLinearGradientShader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - - rgr, err = loadRadialGradientShader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - - ipr, err = loadImagePatternShader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - - sar, err = loadSolidAlphaShader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - - lgar, err = loadLinearGradientAlphaShader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - - rgar, err = loadRadialGradientAlphaShader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - - ipar, err = loadImagePatternAlphaShader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - - ir, err = loadImageShader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - - gauss15s, err := loadGaussian15Shader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - gauss15r = (*gaussianShader)(gauss15s) - - gauss63s, err := loadGaussian63Shader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - gauss63r = (*gaussianShader)(gauss63s) - - gauss127s, err := loadGaussian127Shader() - if err != nil { - return - } - err = glError() - if err != nil { - return - } - gauss127r = (*gaussianShader)(gauss127s) - - gli.GenBuffers(1, &buf) - err = glError() - if err != nil { - return - } - - gli.GenBuffers(1, &shadowBuf) - err = glError() - if err != nil { - return - } - - gli.ActiveTexture(gl_TEXTURE0) - gli.GenTextures(1, &alphaTex) - gli.BindTexture(gl_TEXTURE_2D, alphaTex) - gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, gl_NEAREST) - gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MAG_FILTER, gl_NEAREST) - gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_S, gl_CLAMP_TO_EDGE) - gli.TexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_T, gl_CLAMP_TO_EDGE) - gli.TexImage2D(gl_TEXTURE_2D, 0, gl_ALPHA, alphaTexSize, alphaTexSize, 0, gl_ALPHA, gl_UNSIGNED_BYTE, nil) - - gli.Enable(gl_BLEND) - gli.BlendFunc(gl_SRC_ALPHA, gl_ONE_MINUS_SRC_ALPHA) - gli.Enable(gl_STENCIL_TEST) - gli.StencilMask(0xFF) - gli.Clear(gl_STENCIL_BUFFER_BIT) - gli.StencilOp(gl_KEEP, gl_KEEP, gl_KEEP) - gli.StencilFunc(gl_EQUAL, 0, 0xFF) - - gli.Enable(gl_SCISSOR_TEST) - return } diff --git a/made_shaders.go b/made_shaders.go deleted file mode 100755 index 72e4cb8..0000000 --- a/made_shaders.go +++ /dev/null @@ -1,1120 +0,0 @@ -package canvas - -import ( - "errors" - "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 - texCoord uint32 - canvasSize int32 - kernelScale int32 - image int32 - kernel int32 -} - -func loadGaussian63Shader() (*gaussian63Shader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, gaussian63VS) - gli.CompileShader(vs) - - shLog := gli.GetShaderInfoLog(vs) - if len(shLog) > 0 { - fmt.Printf("VERTEX_SHADER compilation log for gaussian63VS:\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 gaussian63VS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for gaussian63VS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, gaussian63FS) - gli.CompileShader(fs) - - shLog := gli.GetShaderInfoLog(fs) - if len(shLog) > 0 { - fmt.Printf("FRAGMENT_SHADER compilation log for gaussian63FS:\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 gaussian63FS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for gaussian63FS, 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 gaussian63FS:\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 gaussian63FS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for gaussian63FS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &gaussian63Shader{} - 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 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 linearGradientAlphaShader struct { - id uint32 - vertex uint32 - alphaTexCoord uint32 - canvasSize int32 - invmat int32 - gradient int32 - from int32 - dir int32 - len int32 - alphaTex int32 - globalAlpha int32 -} - -func loadLinearGradientAlphaShader() (*linearGradientAlphaShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, linearGradientAlphaVS) - gli.CompileShader(vs) - - shLog := gli.GetShaderInfoLog(vs) - if len(shLog) > 0 { - fmt.Printf("VERTEX_SHADER compilation log for linearGradientAlphaVS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for linearGradientAlphaVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for linearGradientAlphaVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, linearGradientAlphaFS) - gli.CompileShader(fs) - - shLog := gli.GetShaderInfoLog(fs) - if len(shLog) > 0 { - fmt.Printf("FRAGMENT_SHADER compilation log for linearGradientAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(fs) - return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for linearGradientAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for linearGradientAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - { - program = gli.CreateProgram() - gli.AttachShader(program, vs) - gli.AttachShader(program, fs) - gli.LinkProgram(program) - - shLog := gli.GetProgramInfoLog(program) - if len(shLog) > 0 { - fmt.Printf("Shader link log for linearGradientAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetProgramiv(program, gl_LINK_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - gli.DeleteShader(fs) - return nil, errors.New("error linking shader for linearGradientAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for linearGradientAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &linearGradientAlphaShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.invmat = gli.GetUniformLocation(program, "invmat") - result.gradient = gli.GetUniformLocation(program, "gradient") - result.from = gli.GetUniformLocation(program, "from") - result.dir = gli.GetUniformLocation(program, "dir") - result.len = gli.GetUniformLocation(program, "len") - result.alphaTex = gli.GetUniformLocation(program, "alphaTex") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} - -type radialGradientAlphaShader struct { - id uint32 - vertex uint32 - alphaTexCoord uint32 - canvasSize int32 - invmat int32 - gradient int32 - from int32 - to int32 - dir int32 - radFrom int32 - radTo int32 - len int32 - alphaTex int32 - globalAlpha int32 -} - -func loadRadialGradientAlphaShader() (*radialGradientAlphaShader, error) { - var vs, fs, program uint32 - - { - vs = gli.CreateShader(gl_VERTEX_SHADER) - gli.ShaderSource(vs, radialGradientAlphaVS) - gli.CompileShader(vs) - - shLog := gli.GetShaderInfoLog(vs) - if len(shLog) > 0 { - fmt.Printf("VERTEX_SHADER compilation log for radialGradientAlphaVS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(vs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - return nil, errors.New("Error compiling GL_VERTEX_SHADER shader part for radialGradientAlphaVS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for radialGradientAlphaVS, glError: " + fmt.Sprint(glErr)) - } - } - - { - fs = gli.CreateShader(gl_FRAGMENT_SHADER) - gli.ShaderSource(fs, radialGradientAlphaFS) - gli.CompileShader(fs) - - shLog := gli.GetShaderInfoLog(fs) - if len(shLog) > 0 { - fmt.Printf("FRAGMENT_SHADER compilation log for radialGradientAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(fs, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(fs) - return nil, errors.New("Error compiling GL_FRAGMENT_SHADER shader part for radialGradientAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for radialGradientAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - { - program = gli.CreateProgram() - gli.AttachShader(program, vs) - gli.AttachShader(program, fs) - gli.LinkProgram(program) - - shLog := gli.GetProgramInfoLog(program) - if len(shLog) > 0 { - fmt.Printf("Shader link log for radialGradientAlphaFS:\n\n%s\n", shLog) - } - - var status int32 - gli.GetProgramiv(program, gl_LINK_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(vs) - gli.DeleteShader(fs) - return nil, errors.New("error linking shader for radialGradientAlphaFS") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for radialGradientAlphaFS, glError: " + fmt.Sprint(glErr)) - } - } - - result := &radialGradientAlphaShader{} - result.id = program - result.vertex = uint32(gli.GetAttribLocation(program, "vertex")) - result.alphaTexCoord = uint32(gli.GetAttribLocation(program, "alphaTexCoord")) - result.canvasSize = gli.GetUniformLocation(program, "canvasSize") - result.invmat = gli.GetUniformLocation(program, "invmat") - result.gradient = gli.GetUniformLocation(program, "gradient") - result.from = gli.GetUniformLocation(program, "from") - result.to = gli.GetUniformLocation(program, "to") - result.dir = gli.GetUniformLocation(program, "dir") - result.radFrom = gli.GetUniformLocation(program, "radFrom") - result.radTo = gli.GetUniformLocation(program, "radTo") - result.len = gli.GetUniformLocation(program, "len") - result.alphaTex = gli.GetUniformLocation(program, "alphaTex") - result.globalAlpha = gli.GetUniformLocation(program, "globalAlpha") - - return result, nil -} diff --git a/make_shaders.go b/make_shaders.go deleted file mode 100644 index 58da595..0000000 --- a/make_shaders.go +++ /dev/null @@ -1,312 +0,0 @@ -//+build ignore - -package main - -import ( - "bytes" - "fmt" - "go/ast" - "go/build" - "go/parser" - "go/token" - "io/ioutil" - "log" - "regexp" - "strings" - "unicode" -) - -func main() { - // find the go files in the current directory - pkg, err := build.Default.ImportDir(".", 0) - if err != nil { - log.Fatalf("Could not process directory: %s", err) - } - - vsMap := make(map[string]string) - fsMap := make(map[string]string) - - // go through each file and find const raw string literals with - fset := token.NewFileSet() - for _, goFile := range pkg.GoFiles { - parsedFile, err := parser.ParseFile(fset, goFile, nil, 0) - if err != nil { - log.Fatalf("Failed to parse file %s: %s", goFile, err) - } - - for _, obj := range parsedFile.Scope.Objects { - isVS := strings.HasSuffix(obj.Name, "VS") - isFS := strings.HasSuffix(obj.Name, "FS") - var shaderCode string - if isVS || isFS { - if value, ok := obj.Decl.(*ast.ValueSpec); ok && len(value.Values) == 1 { - if lit, ok := value.Values[0].(*ast.BasicLit); ok { - shaderCode = lit.Value - } - } - } - if shaderCode != "" { - baseName := obj.Name[:len(obj.Name)-2] - if isVS { - vsMap[baseName] = shaderCode - } else if isFS { - fsMap[baseName] = shaderCode - } - } - } - } - - for name := range vsMap { - if _, ok := fsMap[name]; !ok { - log.Println("Warning: Vertex shader with no corresponding fragment shader (" + name + ")") - delete(vsMap, name) - continue - } - } - for name := range fsMap { - if _, ok := vsMap[name]; !ok { - log.Println("Warning: Fragment shader with no corresponding vertex shader (" + name + ")") - delete(fsMap, name) - continue - } - } - - goCode := &bytes.Buffer{} - buildCodeHeader(goCode) - - for name, vs := range vsMap { - fs := fsMap[name] - - vs = vs[1 : len(vs)-1] - fs = fs[1 : len(fs)-1] - - inputs := shaderFindInputVariables(vs + "\n" + fs) - - buildCode(goCode, name, inputs) - } - - err = ioutil.WriteFile("made_shaders.go", goCode.Bytes(), 0777) - if err != nil { - log.Fatalf("Could not write made_shaders.go: %s", err) - } -} - -type ShaderInput struct { - Name string - IsAttrib bool - IsUniform bool -} - -func shaderFindInputVariables(source string) []ShaderInput { - inputs := make([]ShaderInput, 0, 10) - - varDefSplitter := regexp.MustCompile("[ \t\r\n,]+") - lines := shaderGetTopLevelLines(source) - for _, line := range lines { - line = strings.TrimSpace(line) - if len(line) == 0 || line[0] == '#' { - continue - } - if strings.Contains(line, "{") { - break - } - parts := varDefSplitter.Split(line, -1) - isAttrib := parts[0] == "attribute" - isUniform := parts[0] == "uniform" - if !isAttrib && !isUniform { - continue - } - for _, part := range parts[2:] { - if idx := strings.IndexByte(part, '['); idx >= 0 { - part = part[:idx] - } - inputs = append(inputs, ShaderInput{ - Name: part, - IsAttrib: isAttrib, - IsUniform: isUniform}) - } - } - return inputs -} - -func shaderGetTopLevelLines(source string) []string { - sourceBytes := []byte(source) - l := len(sourceBytes) - if l == 0 { - return make([]string, 0) - } - - var inPrecompiledStatement, inLineComment, inBlockComment, inString, stringEscape, lastWasWhitespace bool - curlyBraceDepth := 0 - - topLevelLines := make([]string, 0, 100) - currentLine := make([]byte, 0, 1000) - - var c0, c1 byte = ' ', ' ' - for i := 0; i < l; i++ { - c1 = sourceBytes[i] - isWhitespace := unicode.IsSpace(rune(c1)) - if !inBlockComment && !inString && c0 == '/' && c1 == '/' { - inLineComment = true - if len(currentLine) > 0 { - currentLine = currentLine[:len(currentLine)-1] - } - } else if !inBlockComment && !inString && c1 == '#' { - inPrecompiledStatement = true - } else if !inBlockComment && !inLineComment && !inPrecompiledStatement && !inString && c0 == '/' && c1 == '*' { - inBlockComment = true - if len(currentLine) > 0 { - currentLine = currentLine[:len(currentLine)-1] - } - } else if !inBlockComment && !inString && !inLineComment && !inPrecompiledStatement && c1 == '"' { - inString = true - } else if inString && !stringEscape && c1 == '\\' { - stringEscape = true - } else if inString && stringEscape { - stringEscape = false - } else if inString && !stringEscape && c1 == '"' { - inString = false - } else if !inBlockComment && !inLineComment && !inPrecompiledStatement && !inString && c1 == '{' { - if curlyBraceDepth == 0 { - topLevelLines = append(topLevelLines, string(currentLine)) - currentLine = currentLine[:0] - } - curlyBraceDepth++ - } - if !inBlockComment && !inLineComment && !inPrecompiledStatement && !inString && curlyBraceDepth == 0 { - if c1 == ';' { - topLevelLines = append(topLevelLines, string(currentLine)) - currentLine = currentLine[:0] - } else if !isWhitespace { - currentLine = append(currentLine, c1) - } else if !lastWasWhitespace { - currentLine = append(currentLine, ' ') - } - } - if !inBlockComment && !inLineComment && !inPrecompiledStatement && !inString && c1 == '}' { - curlyBraceDepth-- - } else if (inLineComment || inPrecompiledStatement) && (c1 == '\r' || c1 == '\n') { - inLineComment = false - inPrecompiledStatement = false - } else if inBlockComment && c0 == '*' && c1 == '/' { - inBlockComment = false - } - - lastWasWhitespace = isWhitespace - c0 = c1 - } - - topLevelLines = append(topLevelLines, string(currentLine)) - - return topLevelLines -} - -const compilePart = ` - { - SHADER_VAR = gli.CreateShader(gl_SHADER_TYPE) - gli.ShaderSource(SHADER_VAR, SHADER_SRC) - gli.CompileShader(SHADER_VAR) - - shLog := gli.GetShaderInfoLog(SHADER_VAR) - if len(shLog) > 0 { - fmt.Printf("SHADER_TYPE compilation log for SHADER_SRC:\n\n%s\n", shLog) - } - - var status int32 - gli.GetShaderiv(SHADER_VAR, gl_COMPILE_STATUS, &status) - if status != gl_TRUE { - gli.DeleteShader(SHADER_VAR) - return nil, errors.New("Error compiling GL_SHADER_TYPE shader part for SHADER_SRC") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error compiling shader part for SHADER_SRC, glError: " + fmt.Sprint(glErr)) - } - } -` -const linkPart = ` - { - 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 SHADER_SRC:\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 SHADER_SRC") - } - if glErr := gli.GetError(); glErr != gl_NO_ERROR { - return nil, errors.New("error linking shader for SHADER_SRC, glError: " + fmt.Sprint(glErr)) - } - } -` - -func capitalize(s string) string { - return strings.ToUpper(s[:1]) + s[1:] -} - -func buildCodeHeader(buf *bytes.Buffer) { - fmt.Fprint(buf, "package canvas\n\n") - fmt.Fprint(buf, "import (\n") - fmt.Fprint(buf, "\t\"errors\"\n") - fmt.Fprint(buf, "\t\"fmt\"\n") - fmt.Fprint(buf, ")\n\n") -} - -func buildCode(buf *bytes.Buffer, baseName string, inputs []ShaderInput) { - shaderName := baseName + "Shader" - vsName := baseName + "VS" - fsName := baseName + "FS" - - fmt.Fprintf(buf, "type %s struct {\n", shaderName) - fmt.Fprint(buf, "\tid uint32\n") - for _, input := range inputs { - if input.IsAttrib { - fmt.Fprintf(buf, "\t%s uint32\n", input.Name) - } else if input.IsUniform { - fmt.Fprintf(buf, "\t%s int32\n", input.Name) - } - } - fmt.Fprint(buf, "}\n\n") - fmt.Fprintf(buf, "func load%s() (*%s, error) {\n", capitalize(shaderName), shaderName) - fmt.Fprint(buf, "\tvar vs, fs, program uint32\n") - - var part string - - part = strings.Replace(compilePart, "SHADER_SRC", vsName, -1) - part = strings.Replace(part, "SHADER_TYPE", "VERTEX_SHADER", -1) - part = strings.Replace(part, "SHADER_VAR", "vs", -1) - fmt.Fprint(buf, part) - - part = strings.Replace(compilePart, "SHADER_SRC", fsName, -1) - part = strings.Replace(part, "SHADER_TYPE", "FRAGMENT_SHADER", -1) - part = strings.Replace(part, "SHADER_VAR", "fs", -1) - fmt.Fprint(buf, part) - - part = strings.Replace(linkPart, "SHADER_SRC", fsName, -1) - fmt.Fprint(buf, part) - - fmt.Fprint(buf, "\n") - fmt.Fprintf(buf, "\tresult := &%s{}\n", shaderName) - fmt.Fprint(buf, "\tresult.id = program\n") - - for _, input := range inputs { - if input.IsAttrib { - 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, \"%s\")\n", input.Name, input.Name) - } - } - - fmt.Fprint(buf, "\n") - - fmt.Fprint(buf, "\treturn result, nil\n") - fmt.Fprint(buf, "}\n") -}