removed gl code that is no longer needed in frontend
This commit is contained in:
parent
fc4d3dbd9e
commit
e17505b056
3 changed files with 2 additions and 1596 deletions
166
canvas.go
166
canvas.go
|
@ -246,25 +246,8 @@ loop:
|
||||||
const alphaTexSize = 2048
|
const alphaTexSize = 2048
|
||||||
|
|
||||||
var (
|
var (
|
||||||
gli GL
|
gli GL
|
||||||
buf uint32
|
glChan = make(chan func())
|
||||||
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())
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type offscreenBuffer struct {
|
type offscreenBuffer struct {
|
||||||
|
@ -292,151 +275,6 @@ type gaussianShader struct {
|
||||||
// The goglimpl subpackage contains an implementation based on Go-GL v3.2
|
// The goglimpl subpackage contains an implementation based on Go-GL v3.2
|
||||||
func LoadGL(glimpl GL) (err error) {
|
func LoadGL(glimpl GL) (err error) {
|
||||||
gli = glimpl
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1120
made_shaders.go
1120
made_shaders.go
File diff suppressed because it is too large
Load diff
312
make_shaders.go
312
make_shaders.go
|
@ -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")
|
|
||||||
}
|
|
Loading…
Reference in a new issue