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
162
canvas.go
162
canvas.go
|
@ -247,23 +247,6 @@ 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())
|
||||
)
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
|
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