gl_goxjs.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. //go:build js || wasm || test_web_driver
  2. // +build js wasm test_web_driver
  3. package gl
  4. import (
  5. "encoding/binary"
  6. "github.com/fyne-io/gl-js"
  7. "golang.org/x/mobile/exp/f32"
  8. )
  9. const (
  10. arrayBuffer = gl.ARRAY_BUFFER
  11. bitColorBuffer = gl.COLOR_BUFFER_BIT
  12. bitDepthBuffer = gl.DEPTH_BUFFER_BIT
  13. clampToEdge = gl.CLAMP_TO_EDGE
  14. colorFormatRGBA = gl.RGBA
  15. compileStatus = gl.COMPILE_STATUS
  16. constantAlpha = gl.CONSTANT_ALPHA
  17. float = gl.FLOAT
  18. fragmentShader = gl.FRAGMENT_SHADER
  19. front = gl.FRONT
  20. glFalse = gl.FALSE
  21. linkStatus = gl.LINK_STATUS
  22. one = gl.ONE
  23. oneMinusConstantAlpha = gl.ONE_MINUS_CONSTANT_ALPHA
  24. oneMinusSrcAlpha = gl.ONE_MINUS_SRC_ALPHA
  25. scissorTest = gl.SCISSOR_TEST
  26. srcAlpha = gl.SRC_ALPHA
  27. staticDraw = gl.STATIC_DRAW
  28. texture0 = gl.TEXTURE0
  29. texture2D = gl.TEXTURE_2D
  30. textureMinFilter = gl.TEXTURE_MIN_FILTER
  31. textureMagFilter = gl.TEXTURE_MAG_FILTER
  32. textureWrapS = gl.TEXTURE_WRAP_S
  33. textureWrapT = gl.TEXTURE_WRAP_T
  34. triangles = gl.TRIANGLES
  35. triangleStrip = gl.TRIANGLE_STRIP
  36. unsignedByte = gl.UNSIGNED_BYTE
  37. vertexShader = gl.VERTEX_SHADER
  38. )
  39. type (
  40. // Attribute represents a GL attribute
  41. Attribute gl.Attrib
  42. // Buffer represents a GL buffer
  43. Buffer gl.Buffer
  44. // Program represents a compiled GL program
  45. Program gl.Program
  46. // Shader represents a GL shader
  47. Shader gl.Shader
  48. // Uniform represents a GL uniform
  49. Uniform gl.Uniform
  50. )
  51. var noBuffer = Buffer(gl.NoBuffer)
  52. var noShader = Shader(gl.NoShader)
  53. var textureFilterToGL = []int32{gl.LINEAR, gl.NEAREST}
  54. func (p *painter) Init() {
  55. p.ctx = &xjsContext{}
  56. gl.Disable(gl.DEPTH_TEST)
  57. gl.Enable(gl.BLEND)
  58. p.logError()
  59. p.program = p.createProgram("simple_es")
  60. p.lineProgram = p.createProgram("line_es")
  61. p.rectangleProgram = p.createProgram("rectangle_es")
  62. p.roundRectangleProgram = p.createProgram("round_rectangle_es")
  63. }
  64. type xjsContext struct{}
  65. var _ context = (*xjsContext)(nil)
  66. func (c *xjsContext) ActiveTexture(textureUnit uint32) {
  67. gl.ActiveTexture(gl.Enum(textureUnit))
  68. }
  69. func (c *xjsContext) AttachShader(program Program, shader Shader) {
  70. gl.AttachShader(gl.Program(program), gl.Shader(shader))
  71. }
  72. func (c *xjsContext) BindBuffer(target uint32, buf Buffer) {
  73. gl.BindBuffer(gl.Enum(target), gl.Buffer(buf))
  74. }
  75. func (c *xjsContext) BindTexture(target uint32, texture Texture) {
  76. gl.BindTexture(gl.Enum(target), gl.Texture(texture))
  77. }
  78. func (c *xjsContext) BlendColor(r, g, b, a float32) {
  79. gl.BlendColor(r, g, b, a)
  80. }
  81. func (c *xjsContext) BlendFunc(srcFactor, destFactor uint32) {
  82. gl.BlendFunc(gl.Enum(srcFactor), gl.Enum(destFactor))
  83. }
  84. func (c *xjsContext) BufferData(target uint32, points []float32, usage uint32) {
  85. gl.BufferData(gl.Enum(target), f32.Bytes(binary.LittleEndian, points...), gl.Enum(usage))
  86. }
  87. func (c *xjsContext) Clear(mask uint32) {
  88. gl.Clear(gl.Enum(mask))
  89. }
  90. func (c *xjsContext) ClearColor(r, g, b, a float32) {
  91. gl.ClearColor(r, g, b, a)
  92. }
  93. func (c *xjsContext) CompileShader(shader Shader) {
  94. gl.CompileShader(gl.Shader(shader))
  95. }
  96. func (c *xjsContext) CreateBuffer() Buffer {
  97. return Buffer(gl.CreateBuffer())
  98. }
  99. func (c *xjsContext) CreateProgram() Program {
  100. return Program(gl.CreateProgram())
  101. }
  102. func (c *xjsContext) CreateShader(typ uint32) Shader {
  103. return Shader(gl.CreateShader(gl.Enum(typ)))
  104. }
  105. func (c *xjsContext) CreateTexture() (texture Texture) {
  106. return Texture(gl.CreateTexture())
  107. }
  108. func (c *xjsContext) DeleteBuffer(buffer Buffer) {
  109. gl.DeleteBuffer(gl.Buffer(buffer))
  110. }
  111. func (c *xjsContext) DeleteTexture(texture Texture) {
  112. gl.DeleteTexture(gl.Texture(texture))
  113. }
  114. func (c *xjsContext) Disable(capability uint32) {
  115. gl.Disable(gl.Enum(capability))
  116. }
  117. func (c *xjsContext) DrawArrays(mode uint32, first, count int) {
  118. gl.DrawArrays(gl.Enum(mode), first, count)
  119. }
  120. func (c *xjsContext) Enable(capability uint32) {
  121. gl.Enable(gl.Enum(capability))
  122. }
  123. func (c *xjsContext) EnableVertexAttribArray(attribute Attribute) {
  124. gl.EnableVertexAttribArray(gl.Attrib(attribute))
  125. }
  126. func (c *xjsContext) GetAttribLocation(program Program, name string) Attribute {
  127. return Attribute(gl.GetAttribLocation(gl.Program(program), name))
  128. }
  129. func (c *xjsContext) GetError() uint32 {
  130. return uint32(gl.GetError())
  131. }
  132. func (c *xjsContext) GetProgrami(program Program, param uint32) int {
  133. return gl.GetProgrami(gl.Program(program), gl.Enum(param))
  134. }
  135. func (c *xjsContext) GetProgramInfoLog(program Program) string {
  136. return gl.GetProgramInfoLog(gl.Program(program))
  137. }
  138. func (c *xjsContext) GetShaderi(shader Shader, param uint32) int {
  139. return gl.GetShaderi(gl.Shader(shader), gl.Enum(param))
  140. }
  141. func (c *xjsContext) GetShaderInfoLog(shader Shader) string {
  142. return gl.GetShaderInfoLog(gl.Shader(shader))
  143. }
  144. func (c *xjsContext) GetUniformLocation(program Program, name string) Uniform {
  145. return Uniform(gl.GetUniformLocation(gl.Program(program), name))
  146. }
  147. func (c *xjsContext) LinkProgram(program Program) {
  148. gl.LinkProgram(gl.Program(program))
  149. }
  150. func (c *xjsContext) ReadBuffer(_ uint32) {
  151. }
  152. func (c *xjsContext) ReadPixels(x, y, width, height int, colorFormat, typ uint32, pixels []uint8) {
  153. gl.ReadPixels(pixels, x, y, width, height, gl.Enum(colorFormat), gl.Enum(typ))
  154. }
  155. func (c *xjsContext) ShaderSource(shader Shader, source string) {
  156. gl.ShaderSource(gl.Shader(shader), source)
  157. }
  158. func (c *xjsContext) Scissor(x, y, w, h int32) {
  159. gl.Scissor(x, y, w, h)
  160. }
  161. func (c *xjsContext) TexImage2D(target uint32, level, width, height int, colorFormat, typ uint32, data []uint8) {
  162. gl.TexImage2D(
  163. gl.Enum(target),
  164. level,
  165. width,
  166. height,
  167. gl.Enum(colorFormat),
  168. gl.Enum(typ),
  169. data,
  170. )
  171. }
  172. func (c *xjsContext) TexParameteri(target, param uint32, value int32) {
  173. gl.TexParameteri(gl.Enum(target), gl.Enum(param), int(value))
  174. }
  175. func (c *xjsContext) Uniform1f(uniform Uniform, v float32) {
  176. gl.Uniform1f(gl.Uniform(uniform), v)
  177. }
  178. func (c *xjsContext) Uniform2f(uniform Uniform, v0, v1 float32) {
  179. gl.Uniform2f(gl.Uniform(uniform), v0, v1)
  180. }
  181. func (c *xjsContext) Uniform4f(uniform Uniform, v0, v1, v2, v3 float32) {
  182. gl.Uniform4f(gl.Uniform(uniform), v0, v1, v2, v3)
  183. }
  184. func (c *xjsContext) UseProgram(program Program) {
  185. gl.UseProgram(gl.Program(program))
  186. }
  187. func (c *xjsContext) VertexAttribPointerWithOffset(attribute Attribute, size int, typ uint32, normalized bool, stride, offset int) {
  188. gl.VertexAttribPointer(gl.Attrib(attribute), size, gl.Enum(typ), normalized, stride, offset)
  189. }
  190. func (c *xjsContext) Viewport(x, y, width, height int) {
  191. gl.Viewport(x, y, width, height)
  192. }