shaders.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright 2016 The G3N Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package shader
  5. import (
  6. "fmt"
  7. "github.com/g3n/engine/gls"
  8. )
  9. // ProgramInfo contains information for a registered program name
  10. type ProgramInfo struct {
  11. Vertex string // Vertex shader name
  12. Frag string // Fragment shader name
  13. Geometry string // Geometry shader name (maybe an empty string)
  14. }
  15. // Internal global maps of shader chunks, shader sources and programs
  16. var chunks = map[string]string{}
  17. var shaders = map[string]string{}
  18. var programs = map[string]ProgramInfo{}
  19. // Chunks returns a map with all registered shader chunks names
  20. // associated with its glsl source code.
  21. func Chunks() map[string]string {
  22. return chunks
  23. }
  24. // Shaders returns a map with all registered shader names
  25. // associated with
  26. func Shaders() map[string]string {
  27. return shaders
  28. }
  29. func Programs() map[string]ProgramInfo {
  30. return programs
  31. }
  32. func AddChunk(name, source string) {
  33. chunks[name] = source
  34. }
  35. func AddShader(name, source string) {
  36. shaders[name] = source
  37. }
  38. // AddProgram adds a program name to the global program registry
  39. func AddProgram(name, vertexName, fragName string) {
  40. programs[name] = ProgramInfo{vertexName, fragName, ""}
  41. }
  42. // SetProgramShader sets the shader type and name for a previously
  43. // specified program name.
  44. // It panics if the specified program or shader name not found or
  45. // if an invalid shader type was specified.
  46. func SetProgramShader(pname string, stype int, sname string) {
  47. // Checks if program name is valid
  48. pinfo, ok := programs[pname]
  49. if !ok {
  50. panic(fmt.Sprintf("Program name:%s not found", pname))
  51. }
  52. // Checks if shader name is valid
  53. _, ok = shaders[sname]
  54. if !ok {
  55. panic(fmt.Sprintf("Shader name:%s not found", sname))
  56. }
  57. // Sets the program shader name for the specified type
  58. switch stype {
  59. case gls.VERTEX_SHADER:
  60. pinfo.Vertex = sname
  61. case gls.FRAGMENT_SHADER:
  62. pinfo.Frag = sname
  63. case gls.GEOMETRY_SHADER:
  64. pinfo.Geometry = sname
  65. default:
  66. panic("Invalid shader type")
  67. }
  68. programs[pname] = pinfo
  69. }