123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- package webgl
- foreign import "webgl"
- import glm "core:math/linalg/glsl"
- Enum :: distinct u32
- Buffer :: distinct u32
- Framebuffer :: distinct u32
- Program :: distinct u32
- Renderbuffer :: distinct u32
- Shader :: distinct u32
- Texture :: distinct u32
- ContextAttribute :: enum u32 {
- disableAlpha = 0,
- disableAntialias = 1,
- disableDepth = 2,
- failIfMajorPerformanceCaveat = 3,
- disablePremultipliedAlpha = 4,
- preserveDrawingBuffer = 5,
- stencil = 6,
- desynchronized = 7,
- }
- ContextAttributes :: distinct bit_set[ContextAttribute; u32]
- DEFAULT_CONTEXT_ATTRIBUTES :: ContextAttributes{}
- @(default_calling_convention="c")
- foreign webgl {
- // CreateCurrentContextById must be called before `GetCurrentContextAttributes` if the user wants to
- // set specific attributes, otherwise the default attributes will be set for the WebGL context
- CreateCurrentContextById :: proc(name: string, attributes: ContextAttributes) -> bool ---
- // Acquire the WebGL context from a canvas element by id
- SetCurrentContextById :: proc(name: string) -> bool ---
- GetCurrentContextAttributes :: proc() -> ContextAttributes ---
- DrawingBufferWidth :: proc() -> i32 ---
- DrawingBufferHeight :: proc() -> i32 ---
-
- GetWebGLVersion :: proc(major, minor: ^i32) ---
- GetESVersion :: proc(major, minor: ^i32) ---
-
- GetError :: proc() -> Enum ---
-
- IsExtensionSupported :: proc(name: string) -> bool ---
- ActiveTexture :: proc(x: Enum) ---
- AttachShader :: proc(program: Program, shader: Shader) ---
- BindAttribLocation :: proc(program: Program, index: i32, name: string) ---
- BindBuffer :: proc(target: Enum, buffer: Buffer) ---
- BindFramebuffer :: proc(target: Enum, buffer: Buffer) ---
- BindTexture :: proc(target: Enum, texture: Texture) ---
- BlendColor :: proc(red, green, blue, alpha: f32) ---
- BlendEquation :: proc(mode: Enum) ---
- BlendFunc :: proc(sfactor, dfactor: Enum) ---
- BlendFuncSeparate :: proc(srcRGB, dstRGB, srcAlpha, dstAlpha: Enum) ---
-
- BufferData :: proc(target: Enum, size: int, data: rawptr, usage: Enum) ---
- BufferSubData :: proc(target: Enum, offset: uintptr, size: int, data: rawptr) ---
- Clear :: proc(bits: Enum) ---
- ClearColor :: proc(r, g, b, a: f32) ---
- ClearDepth :: proc(x: Enum) ---
- ClearStencil :: proc(x: Enum) ---
- ClearMask :: proc(r, g, b, a: bool) ---
- CompileShader :: proc(shader: Shader) ---
-
- CompressedTexImage2D :: proc(target: Enum, level: i32, internalformat: Enum, width, height: i32, border: i32, imageSize: int, data: rawptr) ---
- CompressedTexSubImage2D :: proc(target: Enum, level: i32, xoffset, yoffset, width, height: i32, format: Enum, imageSize: int, data: rawptr) ---
- CopyTexImage2D :: proc(target: Enum, level: i32, internalformat: Enum, x, y, width, height: i32, border: i32) ---
- CopyTexSubImage2D :: proc(target: Enum, level: i32, xoffset, yoffset, x, y: i32, width, height: i32) ---
-
- CreateBuffer :: proc() -> Buffer ---
- CreateFramebuffer :: proc() -> Framebuffer ---
- CreateProgram :: proc() -> Program ---
- CreateRenderbuffer :: proc() -> Renderbuffer ---
- CreateShader :: proc(shaderType: Enum) -> Shader ---
- CreateTexture :: proc() -> Texture ---
-
- CullFace :: proc(mode: Enum) ---
-
- DeleteBuffer :: proc(buffer: Buffer) ---
- DeleteFramebuffer :: proc(framebuffer: Framebuffer) ---
- DeleteProgram :: proc(program: Program) ---
- DeleteRenderbuffer :: proc(renderbuffer: Renderbuffer) ---
- DeleteShader :: proc(shader: Shader) ---
- DeleteTexture :: proc(texture: Texture) ---
-
- DepthFunc :: proc(func: Enum) ---
- DepthMask :: proc(flag: bool) ---
- DepthRange :: proc(zNear, zFar: f32) ---
- DetachShader :: proc(program: Program, shader: Shader) ---
- Disable :: proc(cap: Enum) ---
- DisableVertexAttribArray :: proc(index: i32) ---
- DrawArrays :: proc(mode: Enum, first, count: int) ---
- DrawElements :: proc(mode: Enum, count: int, type: Enum, indices: rawptr) ---
-
- Enable :: proc(cap: Enum) ---
- EnableVertexAttribArray :: proc(index: i32) ---
- Finish :: proc() ---
- Flush :: proc() ---
- FramebufferRenderbuffer :: proc(target, attachment, renderbufertarget: Enum, renderbuffer: Renderbuffer) ---
- FramebufferTexture2D :: proc(target, attachment, textarget: Enum, texture: Texture, level: i32) ---
- FrontFace :: proc(mode: Enum) ---
-
- GenerateMipmap :: proc(target: Enum) ---
-
- GetAttribLocation :: proc(program: Program, name: string) -> i32 ---
- GetUniformLocation :: proc(program: Program, name: string) -> i32 ---
- GetVertexAttribOffset :: proc(index: i32, pname: Enum) -> uintptr ---
- GetProgramParameter :: proc(program: Program, pname: Enum) -> i32 ---
- Hint :: proc(target: Enum, mode: Enum) ---
-
- IsBuffer :: proc(buffer: Buffer) -> bool ---
- IsFramebuffer :: proc(framebuffer: Framebuffer) -> bool ---
- IsProgram :: proc(program: Program) -> bool ---
- IsRenderbuffer :: proc(renderbuffer: Renderbuffer) -> bool ---
- IsShader :: proc(shader: Shader) -> bool ---
- IsTexture :: proc(texture: Texture) -> bool ---
-
- LineWidth :: proc(width: f32) ---
- LinkProgram :: proc(program: Program) ---
- PixelStorei :: proc(pname: Enum, param: i32) ---
- PolygonOffset :: proc(factor: f32, units: f32) ---
-
- ReadnPixels :: proc(x, y, width, height: i32, format: Enum, type: Enum, bufSize: int, data: rawptr) ---
- RenderbufferStorage :: proc(target: Enum, internalformat: Enum, width, height: i32) ---
- SampleCoverage :: proc(value: f32, invert: bool) ---
- Scissor :: proc(x, y, width, height: i32) ---
- ShaderSource :: proc(shader: Shader, strings: []string) ---
-
- StencilFunc :: proc(func: Enum, ref: i32, mask: u32) ---
- StencilFuncSeparate :: proc(face, func: Enum, ref: i32, mask: u32) ---
- StencilMask :: proc(mask: u32) ---
- StencilMaskSeparate :: proc(face: Enum, mask: u32) ---
- StencilOp :: proc(fail, zfail, zpass: Enum) ---
- StencilOpSeparate :: proc(face, fail, zfail, zpass: Enum) ---
-
- TexImage2D :: proc(target: Enum, level: i32, internalformat: Enum, width, height: i32, border: i32, format, type: Enum, size: int, data: rawptr) ---
- TexSubImage2D :: proc(target: Enum, level: i32, xoffset, yoffset, width, height: i32, format, type: Enum, size: int, data: rawptr) ---
-
- TexParameterf :: proc(target, pname: Enum, param: f32) ---
- TexParameteri :: proc(target, pname: Enum, param: i32) ---
-
- Uniform1f :: proc(location: i32, v0: f32) ---
- Uniform2f :: proc(location: i32, v0, v1: f32) ---
- Uniform3f :: proc(location: i32, v0, v1, v2: f32) ---
- Uniform4f :: proc(location: i32, v0, v1, v2, v3: f32) ---
-
- Uniform1i :: proc(location: i32, v0: i32) ---
- Uniform2i :: proc(location: i32, v0, v1: i32) ---
- Uniform3i :: proc(location: i32, v0, v1, v2: i32) ---
- Uniform4i :: proc(location: i32, v0, v1, v2, v3: i32) ---
-
- UseProgram :: proc(program: Program) ---
- ValidateProgram :: proc(program: Program) ---
-
- VertexAttrib1f :: proc(index: i32, x: f32) ---
- VertexAttrib2f :: proc(index: i32, x, y: f32) ---
- VertexAttrib3f :: proc(index: i32, x, y, z: f32) ---
- VertexAttrib4f :: proc(index: i32, x, y, z, w: f32) ---
- VertexAttribPointer :: proc(index: i32, size: int, type: Enum, normalized: bool, stride: int, ptr: uintptr) ---
-
- Viewport :: proc(x, y, w, h: i32) ---
- }
- Uniform1fv :: proc "c" (location: i32, v: f32) { Uniform1f(location, v) }
- Uniform2fv :: proc "c" (location: i32, v: glm.vec2) { Uniform2f(location, v.x, v.y) }
- Uniform3fv :: proc "c" (location: i32, v: glm.vec3) { Uniform3f(location, v.x, v.y, v.z) }
- Uniform4fv :: proc "c" (location: i32, v: glm.vec4) { Uniform4f(location, v.x, v.y, v.z, v.w) }
- Uniform1iv :: proc "c" (location: i32, v: i32) { Uniform1i(location, v) }
- Uniform2iv :: proc "c" (location: i32, v: glm.ivec2) { Uniform2i(location, v.x, v.y) }
- Uniform3iv :: proc "c" (location: i32, v: glm.ivec3) { Uniform3i(location, v.x, v.y, v.z) }
- Uniform4iv :: proc "c" (location: i32, v: glm.ivec4) { Uniform4i(location, v.x, v.y, v.z, v.w) }
- VertexAttrib1fv :: proc "c" (index: i32, v: f32) { VertexAttrib1f(index, v) }
- VertexAttrib2fv :: proc "c" (index: i32, v: glm.vec2){ VertexAttrib2f(index, v.x, v.y) }
- VertexAttrib3fv :: proc "c" (index: i32, v: glm.vec3){ VertexAttrib3f(index, v.x, v.y, v.z) }
- VertexAttrib4fv :: proc "c" (index: i32, v: glm.vec4){ VertexAttrib4f(index, v.x, v.y, v.z, v.w) }
- UniformMatrix2fv :: proc "c" (location: i32, m: glm.mat2) {
- foreign webgl {
- @(link_name="UniformMatrix2fv")
- _UniformMatrix2fv :: proc "c" (location: i32, value: [^]f32) ---
- }
- value := transmute([2*2]f32)m
- _UniformMatrix2fv(location, &value[0])
- }
- UniformMatrix3fv :: proc "c" (location: i32, m: glm.mat3) {
- foreign webgl {
- @(link_name="UniformMatrix3fv")
- _UniformMatrix3fv :: proc "c" (location: i32, value: [^]f32) ---
- }
- value := transmute([3*3]f32)m
- _UniformMatrix3fv(location, &value[0])
- }
- UniformMatrix4fv :: proc "c" (location: i32, m: glm.mat4) {
- foreign webgl {
- @(link_name="UniformMatrix4fv")
- _UniformMatrix4fv :: proc "c" (location: i32, value: [^]f32) ---
- }
- value := transmute([4*4]f32)m
- _UniformMatrix4fv(location, &value[0])
- }
- GetShaderiv :: proc "c" (shader: Shader, pname: Enum) -> (p: i32) {
- @(default_calling_convention="c")
- foreign webgl {
- @(link_name="GetShaderiv")
- _GetShaderiv :: proc "c" (shader: Shader, pname: Enum, p: ^i32) ---
- }
- _GetShaderiv(shader, pname, &p)
- return
- }
- GetProgramInfoLog :: proc "c" (program: Program, buf: []byte) -> string {
- @(default_calling_convention="c")
- foreign webgl {
- @(link_name="GetProgramInfoLog")
- _GetProgramInfoLog :: proc "c" (program: Program, buf: []byte, length: ^int) ---
- }
-
- length: int
- _GetProgramInfoLog(program, buf, &length)
- return string(buf[:length])
- }
- GetShaderInfoLog :: proc "c" (shader: Shader, buf: []byte) -> string {
- @(default_calling_convention="c")
- foreign webgl {
- @(link_name="GetShaderInfoLog")
- _GetShaderInfoLog :: proc "c" (shader: Shader, buf: []byte, length: ^int) ---
- }
-
- length: int
- _GetShaderInfoLog(shader, buf, &length)
- return string(buf[:length])
- }
- BufferDataSlice :: proc "c" (target: Enum, slice: $S/[]$E, usage: Enum) {
- BufferData(target, len(slice)*size_of(E), raw_data(slice), usage)
- }
- BufferSubDataSlice :: proc "c" (target: Enum, offset: uintptr, slice: $S/[]$E) {
- BufferSubData(target, offset, len(slice)*size_of(E), raw_data(slice), usage)
- }
- CompressedTexImage2DSlice :: proc "c" (target: Enum, level: i32, internalformat: Enum, width, height: i32, border: i32, slice: $S/[]$E) {
- CompressedTexImage2DSlice(target, level, internalformat, width, height, border, len(slice)*size_of(E), raw_data(slice))
- }
- CompressedTexSubImage2DSlice :: proc "c" (target: Enum, level: i32, xoffset, yoffset, width, height: i32, format: Enum, slice: $S/[]$E) {
- CompressedTexSubImage2DSlice(target, level, level, xoffset, yoffset, width, height, format, len(slice)*size_of(E), raw_data(slice))
- }
- ReadPixelsSlice :: proc "c" (x, y, width, height: i32, format: Enum, type: Enum, slice: $S/[]$E) {
- ReadnPixels(x, y, width, height, format, type, len(slice)*size_of(E), raw_data(slice))
- }
- TexImage2DSlice :: proc "c" (target: Enum, level: i32, internalformat: Enum, width, height: i32, border: i32, format, type: Enum, slice: $S/[]$E) {
- TexImage2D(target, level, internalformat, width, height, border, format, type, len(slice)*size_of(E), raw_data(slice))
- }
- TexSubImage2DSlice :: proc "c" (target: Enum, level: i32, xoffset, yoffset, width, height: i32, format, type: Enum, slice: $S/[]$E) {
- TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, len(slice)*size_of(E), raw_data(slice))
- }
|