webgl.odin 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. package webgl
  2. foreign import "webgl"
  3. import glm "core:math/linalg/glsl"
  4. Enum :: distinct u32
  5. Buffer :: distinct u32
  6. Framebuffer :: distinct u32
  7. Program :: distinct u32
  8. Renderbuffer :: distinct u32
  9. Shader :: distinct u32
  10. Texture :: distinct u32
  11. ContextAttribute :: enum u32 {
  12. disableAlpha = 0,
  13. disableAntialias = 1,
  14. disableDepth = 2,
  15. failIfMajorPerformanceCaveat = 3,
  16. disablePremultipliedAlpha = 4,
  17. preserveDrawingBuffer = 5,
  18. stencil = 6,
  19. desynchronized = 7,
  20. }
  21. ContextAttributes :: distinct bit_set[ContextAttribute; u32]
  22. DEFAULT_CONTEXT_ATTRIBUTES :: ContextAttributes{}
  23. @(default_calling_convention="contextless")
  24. foreign webgl {
  25. // CreateCurrentContextById must be called before `GetCurrentContextAttributes` if the user wants to
  26. // set specific attributes, otherwise the default attributes will be set for the WebGL context
  27. CreateCurrentContextById :: proc(name: string, attributes: ContextAttributes) -> bool ---
  28. // Acquire the WebGL context from a canvas element by id
  29. SetCurrentContextById :: proc(name: string) -> bool ---
  30. GetCurrentContextAttributes :: proc() -> ContextAttributes ---
  31. DrawingBufferWidth :: proc() -> i32 ---
  32. DrawingBufferHeight :: proc() -> i32 ---
  33. GetWebGLVersion :: proc(major, minor: ^i32) ---
  34. GetESVersion :: proc(major, minor: ^i32) ---
  35. GetError :: proc() -> Enum ---
  36. IsExtensionSupported :: proc(name: string) -> bool ---
  37. ActiveTexture :: proc(x: Enum) ---
  38. AttachShader :: proc(program: Program, shader: Shader) ---
  39. BindAttribLocation :: proc(program: Program, index: i32, name: string) ---
  40. BindBuffer :: proc(target: Enum, buffer: Buffer) ---
  41. BindFramebuffer :: proc(target: Enum, framebuffer: Framebuffer) ---
  42. BindTexture :: proc(target: Enum, texture: Texture) ---
  43. BlendColor :: proc(red, green, blue, alpha: f32) ---
  44. BlendEquation :: proc(mode: Enum) ---
  45. BlendFunc :: proc(sfactor, dfactor: Enum) ---
  46. BlendFuncSeparate :: proc(srcRGB, dstRGB, srcAlpha, dstAlpha: Enum) ---
  47. BufferData :: proc(target: Enum, size: int, data: rawptr, usage: Enum) ---
  48. BufferSubData :: proc(target: Enum, offset: uintptr, size: int, data: rawptr) ---
  49. Clear :: proc(bits: Enum) ---
  50. ClearColor :: proc(r, g, b, a: f32) ---
  51. ClearDepth :: proc(x: Enum) ---
  52. ClearStencil :: proc(x: Enum) ---
  53. ColorMask :: proc(r, g, b, a: bool) ---
  54. CompileShader :: proc(shader: Shader) ---
  55. CompressedTexImage2D :: proc(target: Enum, level: i32, internalformat: Enum, width, height: i32, border: i32, imageSize: int, data: rawptr) ---
  56. CompressedTexSubImage2D :: proc(target: Enum, level: i32, xoffset, yoffset, width, height: i32, format: Enum, imageSize: int, data: rawptr) ---
  57. CopyTexImage2D :: proc(target: Enum, level: i32, internalformat: Enum, x, y, width, height: i32, border: i32) ---
  58. CopyTexSubImage2D :: proc(target: Enum, level: i32, xoffset, yoffset, x, y: i32, width, height: i32) ---
  59. CreateBuffer :: proc() -> Buffer ---
  60. CreateFramebuffer :: proc() -> Framebuffer ---
  61. CreateProgram :: proc() -> Program ---
  62. CreateRenderbuffer :: proc() -> Renderbuffer ---
  63. CreateShader :: proc(shaderType: Enum) -> Shader ---
  64. CreateTexture :: proc() -> Texture ---
  65. CullFace :: proc(mode: Enum) ---
  66. DeleteBuffer :: proc(buffer: Buffer) ---
  67. DeleteFramebuffer :: proc(framebuffer: Framebuffer) ---
  68. DeleteProgram :: proc(program: Program) ---
  69. DeleteRenderbuffer :: proc(renderbuffer: Renderbuffer) ---
  70. DeleteShader :: proc(shader: Shader) ---
  71. DeleteTexture :: proc(texture: Texture) ---
  72. DepthFunc :: proc(func: Enum) ---
  73. DepthMask :: proc(flag: bool) ---
  74. DepthRange :: proc(zNear, zFar: f32) ---
  75. DetachShader :: proc(program: Program, shader: Shader) ---
  76. Disable :: proc(cap: Enum) ---
  77. DisableVertexAttribArray :: proc(index: i32) ---
  78. DrawArrays :: proc(mode: Enum, first, count: int) ---
  79. DrawElements :: proc(mode: Enum, count: int, type: Enum, indices: rawptr) ---
  80. Enable :: proc(cap: Enum) ---
  81. EnableVertexAttribArray :: proc(index: i32) ---
  82. Finish :: proc() ---
  83. Flush :: proc() ---
  84. FramebufferRenderbuffer :: proc(target, attachment, renderbufertarget: Enum, renderbuffer: Renderbuffer) ---
  85. FramebufferTexture2D :: proc(target, attachment, textarget: Enum, texture: Texture, level: i32) ---
  86. FrontFace :: proc(mode: Enum) ---
  87. GenerateMipmap :: proc(target: Enum) ---
  88. GetAttribLocation :: proc(program: Program, name: string) -> i32 ---
  89. GetUniformLocation :: proc(program: Program, name: string) -> i32 ---
  90. GetVertexAttribOffset :: proc(index: i32, pname: Enum) -> uintptr ---
  91. GetProgramParameter :: proc(program: Program, pname: Enum) -> i32 ---
  92. GetParameter :: proc(pname: Enum) -> i32 ---
  93. Hint :: proc(target: Enum, mode: Enum) ---
  94. IsBuffer :: proc(buffer: Buffer) -> bool ---
  95. IsEnabled :: proc(cap: Enum) -> bool ---
  96. IsFramebuffer :: proc(framebuffer: Framebuffer) -> bool ---
  97. IsProgram :: proc(program: Program) -> bool ---
  98. IsRenderbuffer :: proc(renderbuffer: Renderbuffer) -> bool ---
  99. IsShader :: proc(shader: Shader) -> bool ---
  100. IsTexture :: proc(texture: Texture) -> bool ---
  101. LineWidth :: proc(width: f32) ---
  102. LinkProgram :: proc(program: Program) ---
  103. PixelStorei :: proc(pname: Enum, param: i32) ---
  104. PolygonOffset :: proc(factor: f32, units: f32) ---
  105. ReadnPixels :: proc(x, y, width, height: i32, format: Enum, type: Enum, bufSize: int, data: rawptr) ---
  106. RenderbufferStorage :: proc(target: Enum, internalformat: Enum, width, height: i32) ---
  107. SampleCoverage :: proc(value: f32, invert: bool) ---
  108. Scissor :: proc(x, y, width, height: i32) ---
  109. ShaderSource :: proc(shader: Shader, strings: []string) ---
  110. StencilFunc :: proc(func: Enum, ref: i32, mask: u32) ---
  111. StencilFuncSeparate :: proc(face, func: Enum, ref: i32, mask: u32) ---
  112. StencilMask :: proc(mask: u32) ---
  113. StencilMaskSeparate :: proc(face: Enum, mask: u32) ---
  114. StencilOp :: proc(fail, zfail, zpass: Enum) ---
  115. StencilOpSeparate :: proc(face, fail, zfail, zpass: Enum) ---
  116. TexImage2D :: proc(target: Enum, level: i32, internalformat: Enum, width, height: i32, border: i32, format, type: Enum, size: int, data: rawptr) ---
  117. TexSubImage2D :: proc(target: Enum, level: i32, xoffset, yoffset, width, height: i32, format, type: Enum, size: int, data: rawptr) ---
  118. TexParameterf :: proc(target, pname: Enum, param: f32) ---
  119. TexParameteri :: proc(target, pname: Enum, param: i32) ---
  120. Uniform1f :: proc(location: i32, v0: f32) ---
  121. Uniform2f :: proc(location: i32, v0, v1: f32) ---
  122. Uniform3f :: proc(location: i32, v0, v1, v2: f32) ---
  123. Uniform4f :: proc(location: i32, v0, v1, v2, v3: f32) ---
  124. Uniform1i :: proc(location: i32, v0: i32) ---
  125. Uniform2i :: proc(location: i32, v0, v1: i32) ---
  126. Uniform3i :: proc(location: i32, v0, v1, v2: i32) ---
  127. Uniform4i :: proc(location: i32, v0, v1, v2, v3: i32) ---
  128. UseProgram :: proc(program: Program) ---
  129. ValidateProgram :: proc(program: Program) ---
  130. VertexAttrib1f :: proc(index: i32, x: f32) ---
  131. VertexAttrib2f :: proc(index: i32, x, y: f32) ---
  132. VertexAttrib3f :: proc(index: i32, x, y, z: f32) ---
  133. VertexAttrib4f :: proc(index: i32, x, y, z, w: f32) ---
  134. VertexAttribPointer :: proc(index: i32, size: int, type: Enum, normalized: bool, stride: int, ptr: uintptr) ---
  135. Viewport :: proc(x, y, w, h: i32) ---
  136. }
  137. Uniform1fv :: proc "contextless" (location: i32, v: f32) { Uniform1f(location, v) }
  138. Uniform2fv :: proc "contextless" (location: i32, v: glm.vec2) { Uniform2f(location, v.x, v.y) }
  139. Uniform3fv :: proc "contextless" (location: i32, v: glm.vec3) { Uniform3f(location, v.x, v.y, v.z) }
  140. Uniform4fv :: proc "contextless" (location: i32, v: glm.vec4) { Uniform4f(location, v.x, v.y, v.z, v.w) }
  141. Uniform1iv :: proc "contextless" (location: i32, v: i32) { Uniform1i(location, v) }
  142. Uniform2iv :: proc "contextless" (location: i32, v: glm.ivec2) { Uniform2i(location, v.x, v.y) }
  143. Uniform3iv :: proc "contextless" (location: i32, v: glm.ivec3) { Uniform3i(location, v.x, v.y, v.z) }
  144. Uniform4iv :: proc "contextless" (location: i32, v: glm.ivec4) { Uniform4i(location, v.x, v.y, v.z, v.w) }
  145. VertexAttrib1fv :: proc "contextless" (index: i32, v: f32) { VertexAttrib1f(index, v) }
  146. VertexAttrib2fv :: proc "contextless" (index: i32, v: glm.vec2){ VertexAttrib2f(index, v.x, v.y) }
  147. VertexAttrib3fv :: proc "contextless" (index: i32, v: glm.vec3){ VertexAttrib3f(index, v.x, v.y, v.z) }
  148. VertexAttrib4fv :: proc "contextless" (index: i32, v: glm.vec4){ VertexAttrib4f(index, v.x, v.y, v.z, v.w) }
  149. UniformMatrix2fv :: proc "contextless" (location: i32, m: glm.mat2) {
  150. foreign webgl {
  151. @(link_name="UniformMatrix2fv")
  152. _UniformMatrix2fv :: proc "contextless" (location: i32, value: [^]f32) ---
  153. }
  154. value := transmute([2*2]f32)m
  155. _UniformMatrix2fv(location, &value[0])
  156. }
  157. UniformMatrix3fv :: proc "contextless" (location: i32, m: glm.mat3) {
  158. foreign webgl {
  159. @(link_name="UniformMatrix3fv")
  160. _UniformMatrix3fv :: proc "contextless" (location: i32, value: [^]f32) ---
  161. }
  162. value := transmute([3*3]f32)m
  163. _UniformMatrix3fv(location, &value[0])
  164. }
  165. UniformMatrix4fv :: proc "contextless" (location: i32, m: glm.mat4) {
  166. foreign webgl {
  167. @(link_name="UniformMatrix4fv")
  168. _UniformMatrix4fv :: proc "contextless" (location: i32, value: [^]f32) ---
  169. }
  170. value := transmute([4*4]f32)m
  171. _UniformMatrix4fv(location, &value[0])
  172. }
  173. GetShaderiv :: proc "contextless" (shader: Shader, pname: Enum) -> (p: i32) {
  174. foreign webgl {
  175. @(link_name="GetShaderiv")
  176. _GetShaderiv :: proc "contextless" (shader: Shader, pname: Enum, p: ^i32) ---
  177. }
  178. _GetShaderiv(shader, pname, &p)
  179. return
  180. }
  181. GetProgramInfoLog :: proc "contextless" (program: Program, buf: []byte) -> string {
  182. foreign webgl {
  183. @(link_name="GetProgramInfoLog")
  184. _GetProgramInfoLog :: proc "contextless" (program: Program, buf: []byte, length: ^int) ---
  185. }
  186. length: int
  187. _GetProgramInfoLog(program, buf, &length)
  188. return string(buf[:length])
  189. }
  190. GetShaderInfoLog :: proc "contextless" (shader: Shader, buf: []byte) -> string {
  191. foreign webgl {
  192. @(link_name="GetShaderInfoLog")
  193. _GetShaderInfoLog :: proc "contextless" (shader: Shader, buf: []byte, length: ^int) ---
  194. }
  195. length: int
  196. _GetShaderInfoLog(shader, buf, &length)
  197. return string(buf[:length])
  198. }
  199. BufferDataSlice :: proc "contextless" (target: Enum, slice: $S/[]$E, usage: Enum) {
  200. BufferData(target, len(slice)*size_of(E), raw_data(slice), usage)
  201. }
  202. BufferSubDataSlice :: proc "contextless" (target: Enum, offset: uintptr, slice: $S/[]$E) {
  203. BufferSubData(target, offset, len(slice)*size_of(E), raw_data(slice))
  204. }
  205. CompressedTexImage2DSlice :: proc "contextless" (target: Enum, level: i32, internalformat: Enum, width, height: i32, border: i32, slice: $S/[]$E) {
  206. CompressedTexImage2DSlice(target, level, internalformat, width, height, border, len(slice)*size_of(E), raw_data(slice))
  207. }
  208. CompressedTexSubImage2DSlice :: proc "contextless" (target: Enum, level: i32, xoffset, yoffset, width, height: i32, format: Enum, slice: $S/[]$E) {
  209. CompressedTexSubImage2DSlice(target, level, level, xoffset, yoffset, width, height, format, len(slice)*size_of(E), raw_data(slice))
  210. }
  211. ReadPixelsSlice :: proc "contextless" (x, y, width, height: i32, format: Enum, type: Enum, slice: $S/[]$E) {
  212. ReadnPixels(x, y, width, height, format, type, len(slice)*size_of(E), raw_data(slice))
  213. }
  214. TexImage2DSlice :: proc "contextless" (target: Enum, level: i32, internalformat: Enum, width, height: i32, border: i32, format, type: Enum, slice: $S/[]$E) {
  215. TexImage2D(target, level, internalformat, width, height, border, format, type, len(slice)*size_of(E), raw_data(slice))
  216. }
  217. TexSubImage2DSlice :: proc "contextless" (target: Enum, level: i32, xoffset, yoffset, width, height: i32, format, type: Enum, slice: $S/[]$E) {
  218. TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, len(slice)*size_of(E), raw_data(slice))
  219. }