v/vlib/gl/gl.v

399 lines
11 KiB
V

// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module gl
import glm
#flag -I @VROOT/thirdparty/glad
#include "glad.h"
#flag @VROOT/thirdparty/glad/glad.o
// joe-c: fix & remove
pub enum TmpGlImportHack{ non_empty }
fn C.gladLoadGL() int
fn C.glDisable()
fn C.glEnable()
fn C.glScissor()
fn C.glVertexAttribPointer()
fn C.glGenBuffers()
fn C.glEnableVertexAttribArray()
fn C.glDisableVertexAttribArray()
fn C.glGenVertexArrays()
fn C.glDrawElements()
fn C.glUseProgram()
fn C.glValidateProgram()
fn C.glDrawArrays()
fn C.glBufferData()
fn C.glGenerateMipmap()
fn C.glTexParameteri()
fn C.glDeleteTextures()
fn C.glBindTexture()
fn C.glActiveTexture()
fn C.glGenTextures()
fn C.glBindBuffer()
fn C.glBindVertexArray()
fn C.glGetProgramInfoLog()
fn C.glGetShaderInfoLog()
fn C.glDeleteShader()
fn C.glGetProgramiv()
fn C.glLinkProgram()
fn C.glAttachShader()
fn C.glDetachShader()
fn C.glGetShaderiv()
fn C.glCompileShader()
fn C.glShaderSource()
fn C.glCreateProgram() int
fn C.glDeleteProgram()
fn C.glClear()
fn C.glCreateShader() int
fn C.glClearColor()
fn C.glViewport()
fn C.glPixelStorei()
fn C.glBlendFunc()
fn C.glPolygonMode()
fn C.glDeleteBuffers()
fn C.glDeleteVertexArrays()
fn C.glGetUniformLocation() int
fn C.glGetAttribLocation() int
fn C.glBindAttribLocation()
fn C.glUniform1f()
// init_glad initializes glad, which is needed to use other functions.
pub fn init_glad() {
ok := C.gladLoadGL()
if ok == 0 {
println('Failed to initialize glad OpenGL context')
exit(1)
}
}
// viewport declares the area, which should be rendered in the window.
// Should be used on resizing the window.
pub fn viewport(x, y, width, height int) {
C.glViewport(x, y, width, height)
}
// clear_color sets the color, which will be the background, where you can draw.
// Need only set once.
pub fn clear_color(r, g, b, a int) {
C.glClearColor(f32(r)/255.0, f32(g)/255.0, f32(b)/255.0, f32(a)/255.0)
}
// clear clears the bits of the last frame (ColorBufferBit, DepthBufferBit, StencilBufferBit) to store new data.
// Should be done every frame.
pub fn clear() {
C.glClear(C.GL_COLOR_BUFFER_BIT | C.GL_DEPTH_BUFFER_BIT | C.GL_STENCIL_BUFFER_BIT)
}
// create_shader creates a shader in OpenGL and returns the id.
pub fn create_shader(typ int) int {
return C.glCreateShader(typ)
}
// Create a program in OpenGL and returns the id.
// A shader can be attached to a program, which is required to use them.
pub fn create_program() int {
return C.glCreateProgram()
}
// Delete a program by id.
// Cleanup method, should be used after the main game loop
pub fn delete_program(program int) {
C.glDeleteProgram(program)
}
// shader_source attaches source code to the shader via the shaderID.
// Could be also used to load multiple sources into a shader.
// To just add one source code to one shader use: `gl.shader_source(shader, 1, src, 0)`
pub fn shader_source(shader, count int, source string, length int) {
C.glShaderSource(shader, count, &source.str, length)
}
// compile_shader compiles the shader's source code.
// OpenGL compiles the source code at runtime.
pub fn compile_shader(shader int) {
C.glCompileShader(shader)
}
// shader_compile_status returns the compile status of the shader compilation.
// Can be used to check the compilation and see for errors in the shader code via `gl.shader_info_log()`
pub fn shader_compile_status(shader int) int {
success := 0
C.glGetShaderiv(shader, C.GL_COMPILE_STATUS, &success)
return success
}
// attach_shader attaches a shader to a program.
// Required for drawing things on the screen
pub fn attach_shader(program, shader int) {
C.glAttachShader(program, shader)
}
// detach_shader detaches a shader of a program
// Cleanup method
pub fn detach_shader(program, shader int) {
C.glDetachShader(program, shader)
}
// link_program links a program as target.
// This let OpenGL know, which program has to be use.
pub fn link_program(program int) {
C.glLinkProgram(program)
}
// get_program_link_status returns the link status of linking the program
pub fn get_program_link_status(program int) int {
success := 0
C.glGetProgramiv(program, C.GL_LINK_STATUS, &success)
return success
}
// validate_program checks that the shaders in the program can be executed
pub fn validate_program(program int) {
C.glValidateProgram(program)
}
// delete_shader deletes a shader via the shaderID
// Cleanup method
pub fn delete_shader(shader int) {
C.glDeleteShader(shader)
}
// shader_info_log returns a info log of the shader.
// Can be used to print compilation errors.
pub fn shader_info_log(shader int) string {
info_log := [512]byte
C.glGetShaderInfoLog(shader, 512, 0, info_log)
return tos_clone(info_log)
}
// get_program_info_log returns a info log of the program.
// Can be used to print linking errors etc.
pub fn get_program_info_log(program int) string {
info_log := [1024]byte
C.glGetProgramInfoLog(program, 1024, 0, info_log)
return tos_clone(info_log)
}
// bind_vao binds a vertex array buffer to OpenGL.
// Says OpenGL which vao is the target.
pub fn bind_vao(vao u32) {
C.glBindVertexArray(vao)
}
// bind_buffer binds a vertex buffer object to OpenGL.
// Says OpenGL which vbo is the target.
pub fn bind_buffer(typ int, vbo u32) {
C.glBindBuffer(typ, vbo)
}
// gen_texture generates a textureID.
// Needed to use texturing.
pub fn gen_texture() u32 {
res := u32(0)
C.glGenTextures(1, &res)
return res
}
// active_texture activates a texture.
// If you don't do this, texture isn't working.
pub fn active_texture(t int) {
C.glActiveTexture(t)
}
// bind_2d_texture binds the activated texture as a 2D texture.
// Helper method.
pub fn bind_2d_texture(texture u32) {
C.glBindTexture(C.GL_TEXTURE_2D, texture)
}
// bind_texture binds the activated texture to a texture type.
// Defines the type for texture.
pub fn bind_texture(texture, typ u32) {
C.glBindTexture(typ, texture)
}
// delete_texture deletes a texture by ID.
// Cleanup method.
pub fn delete_texture(texture u32) {
C.glDeleteTextures(1, &texture)
}
// buffer_data puts data into a buffer.
// With these methods, data can put into a buffer.
// Common usage for C.GL_ARRAY_BUFFER or C.GL_ELEMENT_ARRAY_BUFFER.
pub fn buffer_data(typ, size int, arr voidptr, draw_typ int) {
C.glBufferData(typ, size, arr, draw_typ)
}
// buffer_data_int puts int into a buffer.
pub fn buffer_data_int(typ int, vertices []int, draw_typ int) {
size := sizeof(int) * u32(vertices.len)
C.glBufferData(typ, size, vertices.data, draw_typ)
}
// buffer_data_f32 puts float into a buffer.
pub fn buffer_data_f32(typ int, vertices []f32, draw_typ int) {
size := sizeof(f32) * u32(vertices.len)
C.glBufferData(typ, size, vertices.data, draw_typ)
}
// set_vbo sets vertices into a vertex buffer object.
// Helper method.
pub fn set_vbo(vbo u32, vertices []f32, draw_typ int) {
gl.bind_buffer(C.GL_ARRAY_BUFFER, vbo)
gl.buffer_data_f32(C.GL_ARRAY_BUFFER, vertices, draw_typ)
}
// set_ebo sets indices into a element array buffer.
// Helper method.
pub fn set_ebo(ebo u32, indices []int, draw_typ int) {
gl.bind_buffer(C.GL_ELEMENT_ARRAY_BUFFER, ebo)
gl.buffer_data_int(C.GL_ELEMENT_ARRAY_BUFFER, indices, draw_typ)
}
// delete_buffer deletes a vertex buffer object.
// Cleanup method.
pub fn delete_buffer(vbo u32) {
C.glDeleteBuffers(1, vbo)
}
// delete_vao deletes a vertex array object.
// Cleanup method.
pub fn delete_vao(vao u32) {
C.glDeleteVertexArrays(1, vao)
}
// get_uniform_location gets the uniform location for key in program.
// Required to put uniform data in shader at runtime.
pub fn get_uniform_location(program int, key string) int {
return C.glGetUniformLocation(program, key.str)
}
// get_attrib_location gets the attribute location for key in program.
// Required to put attrib data in shader at runtime.
pub fn get_attrib_location(program int, key string) int {
return C.glGetAttribLocation(program, key.str)
}
// bind_attrib_location binds a attrib on index in program to a name.
// Used to send data into a shader.
pub fn bind_attrib_location(program int, index int, name string) {
C.glBindAttribLocation(program, index, name.str)
}
// draw_arrays draws the vertex buffer object on screen.
// Commonly start is 0 and len 3 (without textures) or 5 (with textures).
// Mode commonly C.GL_TRIANGLES.
pub fn draw_arrays(mode, start, len int) {
C.glDrawArrays(mode, start, len)
}
// draw_elements draws the element object buffer on screen.
// Commonly typ is C.GL_UNSIGNED_INT and mode C.GL_TRIANGLES.
pub fn draw_elements(mode, count, typ, indices int) {
C.glDrawElements(mode, count, typ, indices)
}
// use_program binds program to OpenGL.
// Defines the program which is the target.
pub fn use_program(program int) {
C.glUseProgram(program)
}
// gen_vertex_array generates a vertex array ID.
// Linked to an empty vertex array.
pub fn gen_vertex_array() u32 {
vao := u32(0)
C.glGenVertexArrays(1, &vao)
return vao
}
// enable_vertex_attrib_array enables a vertex attrib array by index.
pub fn enable_vertex_attrib_array(n int) {
C.glEnableVertexAttribArray(n)
}
// disable_vertex_attrib_array disabled a vertex attrib array by index.
pub fn disable_vertex_attrib_array(n int) {
C.glDisableVertexAttribArray(n)
}
// gen_buffer generates an buffer ID.
// Linked to an empty buffer-
pub fn gen_buffer() u32 {
vbo := u32(0)
C.glGenBuffers(1, &vbo)
return vbo
}
// vertex_attrib_pointer defines the activated array by index.
pub fn vertex_attrib_pointer(index, size int, typ int, normalized bool, _stride int, _ptr int) {
mut stride := u32(_stride)
mut ptr := _ptr
if typ == C.GL_FLOAT {
stride *= sizeof(f32)
ptr *= int(sizeof(f32))
}
C.glVertexAttribPointer(index, size, typ, normalized, stride, ptr)
}
// tex_param attachs texture value as int to a texture by ID.
pub fn tex_param(key, val int) {
C.glTexParameteri(C.GL_TEXTURE_2D, key, val)
}
// enable enables various capabilities for OpenGL.
pub fn enable(val int) {
C.glEnable(val)
}
// disable disables various capabilities for OpenGL.
pub fn disable(val int) {
C.glDisable(val)
}
// scissor defines a rectangle in the window.
pub fn scissor(x, y, width, height int) {
C.glScissor(x, y, height, height)
}
pub fn generate_mipmap(typ int) {
C.glGenerateMipmap(typ)
}
// set_mat4fv sets a mat4 at uniform location.
// Used for almost every view stuff in OpenGL.
pub fn set_mat4fv(loc, count int, transpose bool, val glm.Mat4) {
C.glUniformMatrix4fv(loc, count, transpose, val.data)
}
// set_f32 sets a float at uniform location.
// Usable for global lighing.
pub fn set_f32(loc int, val f32) {
C.glUniform1f(loc, val)
}
// set_vec sets a vec3 at uniform location.
// Usable to set locations or colors.
pub fn set_vec(loc int, x, y, z f32) {
C.glUniform3f(loc, x, y, z)
}
// set_bool sets a bool at uniform location.
// Send states to the shader.
pub fn set_bool(loc int, val bool) {
if val {
set_f32(loc, 1)
} else {
set_f32(loc, 0)
}
}