1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

move all vlib modules to vlib/

This commit is contained in:
Alexander Medvednikov
2019-06-29 11:54:29 +02:00
parent bdcbcb075b
commit 4594d78bd6
62 changed files with 6 additions and 5 deletions

182
vlib/gl/1shader.v Normal file
View File

@@ -0,0 +1,182 @@
// Copyright (c) 2019 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 os
import gx
import glm
// import darwin
import const (
GL_VERTEX_SHADER
GL_FRAGMENT_SHADER
GL_ARRAY_BUFFER
GL_TRIANGLES
GL_CULL_FACE
GL_BLEND
GL_LINES
)
struct Shader {
program_id int
}
const (
TEXT_VERT = '#version 330 core
layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
out vec2 TexCoords;
uniform mat4 projection;
void main()
{
gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);
TexCoords = vertex.zw;
} '
TEXT_FRAG = '#version 330 core
in vec2 TexCoords;
out vec4 color;
uniform sampler2D text;
uniform vec3 textColor;
void main()
{
vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);
color = vec4(textColor, 1.0) * sampled;
} '
SIMPLE_VERT = ' #version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
out vec3 ourColor;
out vec2 TexCoord;
uniform mat4 projection;
void main() {
gl_Position = projection * vec4(aPos, 1.0);
// gl_Position = vec4(aPos, 1.0);
ourColor = aColor;
//TexCoord = vec2(aTexCoord.x, aTexCoord.y);
TexCoord = aTexCoord;
}
'
SIMPLE_FRAG = '#version 330 core
out vec4 FragColor;
uniform vec3 color;
uniform bool has_texture;
in vec3 ourColor;
in vec2 TexCoord;
uniform sampler2D ourTexture;
void main() {
// FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
// FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
if (has_texture) {
FragColor = texture(ourTexture, TexCoord);
} else {
FragColor = vec4(color, 1.0f);
}
}
'
)
pub fn new_shader(name string) Shader {
// TODO This is not used, remove
mut dir := ''
// Already have absolute path
if name.starts_with('/') {
dir = ''
}
vertex_path := '${dir}${name}.vert'
fragment_path := '${dir}${name}.frag'
println('shader path=$vertex_path,\n fpath="$fragment_path"')
// vertex_src := os.read_file(vertex_path.trim_space())
mut vertex_src := ''
mut fragment_src := ''
if name == 'text' {
vertex_src = TEXT_VERT
fragment_src = TEXT_FRAG
}
else if name == 'simple' {
// println('new shader simple!!!')
// println(SIMPLE_VERT)
vertex_src = SIMPLE_VERT
fragment_src = SIMPLE_FRAG
}
// ////////////////////////////////////////
vertex_shader := gl.create_shader(GL_VERTEX_SHADER)
gl.shader_source(vertex_shader, 1, vertex_src, 0)
gl.compile_shader(vertex_shader)
if gl.shader_compile_status(vertex_shader) == 0 {
log := gl.shader_info_log(vertex_shader)
println('shader $vertex_shader compilation failed')
println('shader source = $vertex_src')
println('shader failed to compile')
exit(1)
}
// fragment shader
// fragment_src := os.read_file(fragment_path.trim_space())
fragment_shader := gl.create_shader(GL_FRAGMENT_SHADER)
gl.shader_source(fragment_shader, 1, fragment_src, 0)
gl.compile_shader(fragment_shader)
if gl.shader_compile_status(fragment_shader) == 0 {
println('fragment $fragment_shader shader compilation failed')
println('shader failed to compile')
exit(1)
}
// link shaders
shader_program := gl.create_program()
gl.attach_shader(shader_program, vertex_shader)
gl.attach_shader(shader_program, fragment_shader)
gl.link_program(shader_program)
// check for linking errors
success := gl.get_program_link_status(shader_program)
if success == 0 {
println('shader compilation failed')
println('vertex source = $vertex_src')
println('fragment source = $fragment_src')
println('shader failed to compile')
exit(1)
}
shader := Shader {
program_id: shader_program,
}
return shader
}
pub fn (s Shader) use() {
gl.use_program(s.program_id)
}
pub fn (s Shader) uni_location(key string) int {
return C.glGetUniformLocation(s.program_id, key.str)
}
// fn (s Shader) set_mat4(str string, f *f32) {
pub fn (s Shader) set_mat4(str string, m glm.Mat4) {
// TODO cache uniform location
C.glUniformMatrix4fv(s.uni_location(str), 1, false, m.data)
}
pub fn (s Shader) set_int(str string, n int) {
C.glUniform1i(s.uni_location(str), n)
}
pub fn (s Shader) set_color(str string, c gx.Color) {
C.glUniform3f(s.uni_location(str), f32(c.r) / 255.0, f32(c.g) / 255.0, f32(c.b) / 255.0)
}

212
vlib/gl/gl.v Normal file
View File

@@ -0,0 +1,212 @@
// Copyright (c) 2019 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 const (
GL_TEXTURE_2D
GL_TEXTURE0
GL_FLOAT
GL_VERTEX_SHADER
GL_ELEMENT_ARRAY_BUFFER
GL_DEPTH_TEST
GL_COLOR_BUFFER_BIT
GL_DEPTH_BUFFER_BIT
GL_STENCIL_BUFFER_BIT
GL_COMPILE_STATUS
GL_LINK_STATUS
GL_ARRAY_BUFFER
)
// TODO: windows support
#flag linux -I @VROOT/thirdparty/glad
#flag darwin -I @VROOT/thirdparty/glad
#include "glad.h"
#include "glad.c"
pub fn init_glad() {
ok := C.gladLoadGL()
if !ok {
println('Failed to initialize glad OpenGL context')
exit(1)
}
}
pub fn viewport(a, b, c, d int) {
C.glViewport(a, b, c, d)
}
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)
}
pub fn clear() {
C.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
}
pub fn create_shader(typ int) int {
return C.glCreateShader(typ)
}
pub fn create_program() int {
return C.glCreateProgram()
}
pub fn shader_source(shader, a int, source string, b int) {
C.glShaderSource(shader, a, &source.str, b)
}
pub fn compile_shader(shader int) {
C.glCompileShader(shader)
}
pub fn shader_compile_status(shader int) int {
success := 0
C.glGetShaderiv(shader, GL_COMPILE_STATUS, &success)
return success
}
pub fn attach_shader(program, shader int) {
// fn (s Shader) attach(program int) {
C.glAttachShader(program, shader)
}
pub fn link_program(program int) {
C.glLinkProgram(program)
}
pub fn get_program_link_status(program int) int {
success := 0
C.glGetProgramiv(program, GL_LINK_STATUS, &success)
return success
}
pub fn delete_shader(shader int) {
C.glDeleteShader(shader)
}
pub fn shader_info_log(shader int) string {
infoLog := [512]byte
C.glGetShaderInfoLog(shader, 512, 0, infoLog)
return tos_clone(infoLog)
}
pub fn get_program_info_log(program int) string {
infoLog := [1024]byte
C.glGetProgramInfoLog(program, 1024, 0, infoLog)
return tos_clone(infoLog)
}
pub fn bind_vao(vao u32) {
C.glBindVertexArray(vao)
}
pub fn bind_buffer(typ int, vbo u32) {
C.glBindBuffer(typ, vbo)
}
pub fn gen_texture() u32 {
res := u32(0)
C.glGenTextures(1, &res)
return res
}
pub fn active_texture(t int) {
C.glActiveTexture(t)
}
pub fn bind_2d_texture(texture u32) {
C.glBindTexture(GL_TEXTURE_2D, texture)
}
pub fn delete_texture(texture u32) {
C.glDeleteTextures(1, &texture)
}
pub fn buffer_data(typ, size int, arr voidptr, draw_typ int) {
C.glBufferData(typ, size, arr, draw_typ)
}
pub fn buffer_data_int(typ int, vertices[]int, draw_typ int) {
size := sizeof(int) * vertices.len
C.glBufferData(typ, size, vertices.data, draw_typ)
}
pub fn buffer_data_f32(typ int, vertices[]f32, draw_typ int) {
size := sizeof(f32) * vertices.len
C.glBufferData(typ, size, vertices.data, draw_typ)
}
pub fn set_vbo(vbo u32, vertices[]f32, draw_typ int) {
gl.bind_buffer(GL_ARRAY_BUFFER, vbo)
gl.buffer_data_f32(GL_ARRAY_BUFFER, vertices, draw_typ)
}
pub fn set_ebo(ebo u32, indices[]int, draw_typ int) {
gl.bind_buffer(GL_ELEMENT_ARRAY_BUFFER, ebo)
// gl.buffer_data_int(GL_ELEMENT_ARRAY_BUFFER, indices, draw_typ)
gl.buffer_data_int(GL_ELEMENT_ARRAY_BUFFER, indices, draw_typ)
}
// /////////////////////
// fn gen_vertex_arrays(a int, vao uint) {
// # glGenVertexArrays(a, &VAO);
// }
pub fn draw_arrays(typ, start, len int) {
C.glDrawArrays(typ, start, len)
}
pub fn draw_elements(mode, count, typ, indices int) {
C.glDrawElements(mode, count, typ, indices)
}
pub fn use_program(program int) {
C.glUseProgram(program)
}
pub fn gen_vertex_array() u32 {
VAO := u32(0)
C.glGenVertexArrays(1, &VAO)
return VAO
}
pub fn enable_vertex_attrib_array(n int) {
C.glEnableVertexAttribArray(n)
}
pub fn gen_buffer() u32 {
VBO := u32(0)
C.glGenBuffers(1, &VBO)
return VBO
}
pub fn vertex_attrib_pointer(index, size int, typ int, normalized bool, stride int, ptr int) {
if typ == GL_FLOAT {
stride *= sizeof(f32)
ptr *= sizeof(f32)
}
C.glVertexAttribPointer(index, size, typ, normalized, stride, ptr)
}
pub fn tex_param(key, val int) {
C.glTexParameteri(GL_TEXTURE_2D, key, val)
}
pub fn enable(val int) {
C.glEnable(val)
}
pub fn disable(val int) {
C.glDisable(val)
}
pub fn scissor(a, b, c, d int) {
C.glScissor(a, b, c, d)
}
pub fn generate_mipmap(typ int) {
C.glGenerateMipmap(typ)
}