From 6b0270602777efb57b2713c9297ae462698c1bee Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 20 Dec 2021 17:58:24 -0600 Subject: [PATCH] lots of updates! --- lib/stb_truetype.c | 2 +- lib/stb_truetype.onyx | 9 +- run_tree/assets/shaders/basic_vertex.glsl | 2 +- run_tree/assets/shaders/font_fragment.glsl | 13 ++ run_tree/assets/shaders/font_vertex.glsl | 21 +++ run_tree/assets/shaders/world_vertex.glsl | 4 +- run_tree/lib/onyx_opengles.so | Bin 232840 -> 232872 bytes src/build.onyx | 3 + src/camera.onyx | 20 ++- src/chunk.onyx | 53 +++++-- src/font.onyx | 163 +++++++++++++++++++++ src/main.onyx | 127 ++++------------ src/mesh.onyx | 72 +++++---- src/shader.onyx | 146 ++++++++++++++++++ src/vecmath.onyx | 4 + src/world.onyx | 36 +++++ 16 files changed, 526 insertions(+), 149 deletions(-) create mode 100644 run_tree/assets/shaders/font_fragment.glsl create mode 100644 run_tree/assets/shaders/font_vertex.glsl create mode 100644 src/font.onyx create mode 100644 src/shader.onyx create mode 100644 src/world.onyx diff --git a/lib/stb_truetype.c b/lib/stb_truetype.c index 37ddff8..0ae528a 100644 --- a/lib/stb_truetype.c +++ b/lib/stb_truetype.c @@ -87,4 +87,4 @@ ONYX_LIBRARY { ONYX_FUNC(stbtt_GetPackedQuad) NULL -}; \ No newline at end of file +}; diff --git a/lib/stb_truetype.onyx b/lib/stb_truetype.onyx index a40ffd9..a2be6c4 100644 --- a/lib/stb_truetype.onyx +++ b/lib/stb_truetype.onyx @@ -10,12 +10,19 @@ stbtt_packedchar :: struct #size 28 { xoff2, yoff2: f32; } +stbtt_aligned_quad :: struct #size 32 { + x0, y0, s0, t0 : f32; + x1, y1, s1, t1 : f32; +} + #foreign "stb_truetype" { stbtt_PackBegin :: (ctx: ^stbtt_pack_context, pixels: ^u8, width, height, stride_in_bytes, padding: i32) -> i32 --- stbtt_PackEnd :: (ctx: ^stbtt_pack_context) -> void --- stbtt_PackFontRange :: (ctx: ^stbtt_pack_context, fontdata: ^u8, font_index: i32, font_size: f32, first_unicode_char_in_range: i32, num_chars_in_range: i32, chardata_for_range: ^stbtt_packedchar) -> i32 --- stbtt_PackSetOversampling :: (ctx: ^stbtt_pack_context, h_oversample, v_oversample: i32) -> void --- + + stbtt_GetPackedQuad :: (chardata: ^stbtt_packedchar, pw, ph: i32, char_index: i32, xpos, ypos: ^f32, quad: ^stbtt_aligned_quad, align_to_integer: bool) -> void --- } #export "stbtt_heap_alloc" calloc -#export "stbtt_heap_free" cfree \ No newline at end of file +#export "stbtt_heap_free" cfree diff --git a/run_tree/assets/shaders/basic_vertex.glsl b/run_tree/assets/shaders/basic_vertex.glsl index 5efc2ec..67d8d32 100644 --- a/run_tree/assets/shaders/basic_vertex.glsl +++ b/run_tree/assets/shaders/basic_vertex.glsl @@ -2,7 +2,7 @@ layout(location = 0) in vec3 a_pos; layout(location = 1) in vec2 a_tex; -layout(std140) uniform u_matrix_block { +layout(std140) uniform u_world_matrix_block { mat4 u_view; mat4 u_world; mat4 u_model; diff --git a/run_tree/assets/shaders/font_fragment.glsl b/run_tree/assets/shaders/font_fragment.glsl new file mode 100644 index 0000000..553d9f6 --- /dev/null +++ b/run_tree/assets/shaders/font_fragment.glsl @@ -0,0 +1,13 @@ +#version 300 es +precision mediump float; + +in vec4 v_color; +in vec2 v_texture; + +uniform sampler2D u_texture; + +out vec4 fragColor; + +void main() { + fragColor = vec4(v_color.rgb, v_color.a * texture(u_texture, v_texture).a); +} diff --git a/run_tree/assets/shaders/font_vertex.glsl b/run_tree/assets/shaders/font_vertex.glsl new file mode 100644 index 0000000..4e58e4b --- /dev/null +++ b/run_tree/assets/shaders/font_vertex.glsl @@ -0,0 +1,21 @@ +#version 300 es +precision mediump float; +layout(location = 0) in vec2 a_interp; +layout(location = 1) in vec2 a_pos_top_left; +layout(location = 2) in vec2 a_pos_bottom_right; +layout(location = 3) in vec2 a_tex_top_left; +layout(location = 4) in vec2 a_tex_bottom_right; + +layout(std140) uniform u_window_matrix_block { + mat4 u_window; +}; + +out vec4 v_color; +out vec2 v_texture; + +void main() { + gl_Position = u_window * vec4(mix(a_pos_top_left, a_pos_bottom_right, a_interp), 0, 1); + v_texture = mix(a_tex_top_left, a_tex_bottom_right, a_interp); + v_color = vec4(0, 0, 0, 1); +} + diff --git a/run_tree/assets/shaders/world_vertex.glsl b/run_tree/assets/shaders/world_vertex.glsl index d93598a..8f50ed8 100644 --- a/run_tree/assets/shaders/world_vertex.glsl +++ b/run_tree/assets/shaders/world_vertex.glsl @@ -2,7 +2,7 @@ layout(location = 0) in vec3 a_pos; layout(location = 1) in uint a_data; -layout(std140) uniform u_matrix_block { +layout(std140) uniform u_world_matrix_block { mat4 u_view; mat4 u_world; mat4 u_model; @@ -11,7 +11,7 @@ layout(std140) uniform u_matrix_block { out vec4 v_color; void main() { - gl_Position = u_view * u_world * vec4(a_pos, 1); + gl_Position = u_view * u_world * u_model * vec4(a_pos, 1); vec3 block_color = vec3( float((a_data & 0x0000FU) >> 0U) / 15.0, diff --git a/run_tree/lib/onyx_opengles.so b/run_tree/lib/onyx_opengles.so index 71591b0922cef35fce573675c5eda80c5347170c..393e39ffa4675376eb0aa7d2a7f7d30540f470de 100755 GIT binary patch literal 232872 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

-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 cast(u32) b1 == cast(u32) b2; -#operator != (b1, b2: Block) => cast(u32) b1 != cast(u32) b2; +#operator == macro (b1, b2: Block) => cast(u32) b1 == cast(u32) b2; +#operator != macro (b1, b2: Block) => cast(u32) b1 != cast(u32) b2; Block_Empty :: cast(Block) 0; @@ -15,18 +15,37 @@ block_make :: (red, green, blue: f32, brightness: f32) -> Block { return ~~((i << 12) | (b << 8) | (g << 4) | r); } +Chunk_Vertex :: struct { + position: Vector3; + + // This field is broken up by bit, but Onyx does not (nor ever will) support bit-fields. + // + // 4-bits (0..3) - red color + // 4-bits (4..7) - green color + // 4-bits (8..11) - blue color + // 4-bits (12..15) - intensity + data: u32; +} + Chunk_Size :: 32 Chunk :: struct { + position: Vector3; blocks: [] Block; - mesh: ^Mesh = null; + mesh: ^Mesh(Chunk_Vertex) = null; + mesh_dirty := false; } -chunk_make :: (allocator := context.allocator) -> ^Chunk { +chunk_make :: (x, y, z: i32, allocator := context.allocator) -> ^Chunk { chunk := new(Chunk, allocator); + chunk.position = .{ + ~~(x * Chunk_Size), + ~~(y * Chunk_Size), + ~~(z * Chunk_Size), + }; memory.alloc_slice(^chunk.blocks, Chunk_Size * Chunk_Size * Chunk_Size); - memory.fill_slice(chunk.blocks, block_make(0,0,0,0)); + memory.fill_slice(chunk.blocks, Block_Empty); return chunk; } @@ -43,6 +62,7 @@ chunk_make :: (allocator := context.allocator) -> ^Chunk { chunk_set :: (use chunk: ^Chunk, x, y, z: i32, block: Block) { if !in_chunk_bounds(x, y, z) do return; blocks[x * Chunk_Size * Chunk_Size + y * Chunk_Size + z] = block; + mesh_dirty = true; } chunk_get :: (use chunk: ^Chunk, x, y, z: i32) -> Block { @@ -79,11 +99,17 @@ chunk_get :: (use chunk: ^Chunk, x, y, z: i32) -> Block { u32.[ 0, 4, 7, 0, 7, 3 ] ]; -chunk_build_mesh :: (use chunk: ^Chunk) -> ^Mesh { - verticies := array.make(Vertex, capacity=512); +chunk_build_mesh :: (use chunk: ^Chunk) { + if mesh != null && mesh_dirty == false do return; + if mesh != null { + mesh_free(mesh); + mesh = null; + } + + verticies := array.make(Chunk_Vertex, capacity=512); defer array.free(^verticies); - chunk_foreach(chunk) #{ + chunk_foreach(chunk) { if block == Block_Empty do continue; for i: 6 { @@ -104,14 +130,19 @@ chunk_build_mesh :: (use chunk: ^Chunk) -> ^Mesh { indicies := cast([] u32) block_indicies[i]; for j: 6 { v := block_verticies[indicies[j]]; - verticies << .{ ~~x+v.x, ~~y+v.y, ~~z+v.z, ~~color }; + verticies << .{ .{ ~~x+v.x, ~~y+v.y, ~~z+v.z }, ~~color }; } } - }; + } - return mesh_make(verticies, .[]); + mesh = mesh_make(verticies, .[]); + mesh_dirty = false; } +chunk_draw :: (chunk: ^Chunk) { + update_model_matrix(chunk.position); + mesh_draw(chunk.mesh); +} chunk_foreach :: macro (chunk: ^Chunk, body: Code) { diff --git a/src/font.onyx b/src/font.onyx new file mode 100644 index 0000000..6e91de4 --- /dev/null +++ b/src/font.onyx @@ -0,0 +1,163 @@ + +use package core +use package core.intrinsics.onyx {__zero_value} +use package stb_truetype +use package opengles + +#local { + font_registry: Map(FontDescriptor, Font); + font_vbo: GLint; + font_vao: GLint; + + font_shader: Shader; +} + +fonts_init :: () { + map.init(^font_registry); + + font_shader = shader_make("./assets/shaders/font_vertex.glsl", "./assets/shaders/font_fragment.glsl"); + shader_use(font_shader); + shader_link_window_matrix_block(font_shader); + + glGenVertexArrays(1, ^font_vao); + glBindVertexArray(font_vao); + + font_interp_buffer: GLint; + glGenBuffers(1, ^font_interp_buffer); + glBindBuffer(GL_ARRAY_BUFFER, font_interp_buffer); + font_interp_data := f32.[ + 0.0, 0.0, + 1.0, 0.0, + 1.0, 1.0, + 0.0, 1.0, + ]; + glBufferData(GL_ARRAY_BUFFER, sizeof typeof font_interp_data, ~~^font_interp_data, GL_STATIC_DRAW); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, false, 2 * sizeof f32, ~~0); + + font_index_buffer: GLint; + glGenBuffers(1, ^font_index_buffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, font_index_buffer); + font_index_data := u8.[ 0, 1, 2, 0, 2, 3 ]; + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof typeof font_index_data, ~~^font_index_data, GL_STATIC_DRAW); + + glGenBuffers(1, ^font_vbo); + glBindBuffer(GL_ARRAY_BUFFER, font_vbo); + glBufferData(GL_ARRAY_BUFFER, 1024 * sizeof stbtt_aligned_quad, null, GL_STREAM_DRAW); + + for 1..5 { + glEnableVertexAttribArray(it); + glVertexAttribDivisor(it, 1); + } + glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof stbtt_aligned_quad, ~~ 0); + glVertexAttribPointer(2, 2, GL_FLOAT, false, sizeof stbtt_aligned_quad, ~~16); + glVertexAttribPointer(3, 2, GL_FLOAT, false, sizeof stbtt_aligned_quad, ~~8); + glVertexAttribPointer(4, 2, GL_FLOAT, false, sizeof stbtt_aligned_quad, ~~24); + + glBindBuffer(GL_ARRAY_BUFFER, -1); + glBindVertexArray(-1); +} + + +Font :: struct { + texture: GLint; + texture_width, texture_height: i32; + chars: [] stbtt_packedchar; +} + +font_make :: (fd: FontDescriptor) -> Font { + texture_size :: 512; + + char_data := memory.make_slice(stbtt_packedchar, 96); + + ttf_file := os.get_contents(fd.path); + if ttf_file.count == 0 { + println("Bad font"); + return __zero_value(Font); + } + defer cfree(ttf_file.data); + + pixels := calloc(texture_size * texture_size); + defer cfree(pixels); + + ctx: stbtt_pack_context; + stbtt_PackBegin(^ctx, pixels, texture_size, texture_size, 0, 1); + stbtt_PackFontRange(^ctx, ttf_file.data, 0, ~~fd.size, #char " ", 96, char_data.data); + stbtt_PackEnd(^ctx); + + texture: GLint; + glGenTextures(1, ^texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, texture_size, texture_size, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glBindTexture(GL_TEXTURE_2D, -1); + + font := Font.{ + texture = texture, + texture_width = texture_size, + texture_height = texture_size, + chars = char_data + }; + + return font; +} + +alloca :: macro (size: u32) -> rawptr { + defer __stack_top = ~~(cast(^u8) __stack_top + size); + return __stack_top; +} + +font_draw :: (font: Font, x, y: f32, msg: str) { + quads: ^stbtt_aligned_quad = alloca(msg.count * sizeof stbtt_aligned_quad); + quad_num := 0; + + x_, y_ := x, y; + + for msg { + stbtt_GetPackedQuad(font.chars.data, font.texture_width, font.texture_height, + ~~(it - #char " "), ^x_, ^y_, ^quads[quad_num], false); + + quad_num += 1; + } + + glBindBuffer(GL_ARRAY_BUFFER, font_vbo); + glBufferSubData(GL_ARRAY_BUFFER, 0, quad_num * sizeof stbtt_aligned_quad, quads); + glBindBuffer(GL_ARRAY_BUFFER, -1); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, font.texture); + shader_use(font_shader); + shader_set_uniform(font_shader, #cstr "u_texture", 0); + + glBindVertexArray(font_vao); + glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, ~~0, quad_num); + glBindTexture(GL_TEXTURE_2D, -1); + glBindVertexArray(-1); +} + + + +FontDescriptor :: struct { + path : str; + size : u32; +} + +#match hash.to_u32 (fd: FontDescriptor) => { + name_hash := hash.to_u32(fd.path); + size_hash := hash.to_u32(fd.size); + return name_hash * 13 + size_hash * 17; +} + +#operator == (f1, f2: FontDescriptor) => f1.path == f2.path && f1.size == f2.size; + +font_lookup :: (fd := FontDescriptor.{ "assets/calibri.ttf", 12 }) -> Font { + if font_registry->has(fd) { + return font_registry[fd]; + } + + font := font_make(fd); + font_registry[fd] = font; + return font; +} + diff --git a/src/main.onyx b/src/main.onyx index b3146b0..e6be5af 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -10,7 +10,8 @@ camera: Camera; create_window :: () => { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); window = glfwCreateWindow(1200, 720, #cstr "Voxel Shooter"); glfwMakeContextCurrent(window); @@ -23,6 +24,7 @@ create_window :: () => { glViewport(0, 0, width, height); camera_set_window_size(^camera, ~~width, ~~height); update_view_matrix(); + update_window_matrix(); } #export "on_key" (window: GLFWwindow_p, key, scancode, action, mod: u32) { @@ -51,83 +53,35 @@ toggle_cursor_grabbed :: () { } } -chunk: ^Chunk; -matrix_block_buffer: GLuint; +world: ^World; +world_shader: Shader; +font: Font; setup_opengl :: () { glInit(glfwGetLoadProcAddress()); + glEnable(GL_TEXTURE); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glFrontFace(GL_CW); glCullFace(GL_BACK); glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - compile_shader :: (source: str, type: GLenum) -> GLint { - shader := glCreateShader(type); - source_data := source.data; - source_len := source.count; - glShaderSource(shader, 1, ^source_data, ^source_len); - glCompileShader(shader); - - success: GLint; - if glGetShaderiv(shader, GL_COMPILE_STATUS, ^success); success == GL_FALSE { - buf_data: [1024] u8; - buf := str.{ ~~buf_data, 0 }; - glGetShaderInfoLog(shader, 1024, ^buf.count, buf.data); - println(buf); - } - - return shader; - } - - link_program :: (vertex_shader, fragment_shader: GLint) -> GLuint { - prog := glCreateProgram(); - glAttachShader(prog, vertex_shader); - glAttachShader(prog, fragment_shader); - glLinkProgram(prog); - - success: GLint; - if glGetProgramiv(prog, GL_LINK_STATUS, ^success); success == GL_FALSE { - buf_data: [1024] u8; - buf := str.{ ~~buf_data, 0 }; - glGetProgramInfoLog(prog, 1024, ^buf.count, buf.data); - println(buf); - } + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - return prog; - } - - vertex_shader := os.get_contents("assets/shaders/world_vertex.glsl"); - fragment_shader := os.get_contents("assets/shaders/world_fragment.glsl"); - vs := compile_shader(vertex_shader, GL_VERTEX_SHADER); - fs := compile_shader(fragment_shader, GL_FRAGMENT_SHADER); - - prog := link_program(vs, fs); - glUseProgram(prog); + shaders_init(); + fonts_init(); - matrix: [32] GLfloat; - glGenBuffers(1, ^matrix_block_buffer); - glBindBuffer(GL_UNIFORM_BUFFER, matrix_block_buffer); - glBufferData(GL_UNIFORM_BUFFER, sizeof f32 * (16 + 16 + 16), ^matrix, GL_DYNAMIC_DRAW); - glBindBuffer(GL_UNIFORM_BUFFER, -1); + world_shader = shader_make( + "assets/shaders/world_vertex.glsl", + "assets/shaders/world_fragment.glsl"); - glBindBufferBase(GL_UNIFORM_BUFFER, 0, matrix_block_buffer); - - matrix_block_index := glGetUniformBlockIndex(prog, #cstr "u_matrix_block"); - glUniformBlockBinding(prog, matrix_block_index, 0); - - chunk = chunk_make(); - for z: 32 do for x: 32 { - chunk_set(chunk, x, 0, z, block_make(0.2, 1, 0.2, 0.8)); - } - for z: 32 do for x: 32 { - if random.between(0, 10) >= 7 do continue; - chunk_set(chunk, x, 1, z, block_make(random.float(0, 1), random.float(0, 1), random.float(0, 1), 1)); - } - chunk.mesh = chunk_build_mesh(chunk); + shader_link_world_matrix_block(world_shader); + font = font_lookup(.{"./assets/calibri.ttf", 32}); + + shader_use(world_shader); + world = world_make(); + __initialize(^camera); camera.position = .{5,5,5}; camera_set_fov(^camera, 75); @@ -137,24 +91,8 @@ setup_opengl :: () { update_view_matrix(); update_world_matrix(); -} - -update_view_matrix :: () { - view_mat: [16] f32; - camera_get_view_matrix(^camera, view_mat); - - glBindBuffer(GL_UNIFORM_BUFFER, matrix_block_buffer); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof typeof view_mat, ^view_mat); - glBindBuffer(GL_UNIFORM_BUFFER, -1); -} - -update_world_matrix :: () { - world_mat: [16] f32; - camera_get_world_matrix(^camera, world_mat); - - glBindBuffer(GL_UNIFORM_BUFFER, matrix_block_buffer); - glBufferSubData(GL_UNIFORM_BUFFER, 16 * sizeof f32, sizeof typeof world_mat, ^world_mat); - glBindBuffer(GL_UNIFORM_BUFFER, -1); + update_model_matrix(.{0, 0, 0}); + update_window_matrix(); } update :: (dt: f32) { @@ -179,9 +117,9 @@ update :: (dt: f32) { camera.x_rot += ~~(my - last_mouse_y) / 400.0f; camera.x_rot = math.clamp(camera.x_rot, -math.PI / 2 + 0.1, math.PI / 2 - 0.1); - speed := 3 * dt; + speed := 5 * dt; if glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS { - speed = 8 * dt; + speed = 15 * dt; } facing := camera_get_forward(^camera); @@ -205,23 +143,10 @@ draw :: () { glClearColor(.7, .7, .9, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -/* - #persist forward : Vector3; - forward = camera_get_forward(^camera); - array.sort(cubes, (x, y) => { - v := Vector3.dot(forward, *(cast(^Vector3) ^y.verticies[0]) - camera.position) - Vector3.dot(forward, *(cast(^Vector3) ^x.verticies[0]) - camera.position); - if v < 0 do return -1; - if v > 0 do return 1; - return 0; - }); - - for cubes { - // if Vector3.dot(forward, *(cast(^Vector3) ^it.verticies[0]) - camera.position) < 0 do continue; - mesh_draw(it); - } - */ + shader_use(world_shader); + world_draw(world); - mesh_draw(chunk.mesh); + font_draw(font, 100, 100, "Hello!"); glfwSwapBuffers(window); } diff --git a/src/mesh.onyx b/src/mesh.onyx index feb3b79..42859a9 100644 --- a/src/mesh.onyx +++ b/src/mesh.onyx @@ -1,19 +1,7 @@ use package core use package opengles -Vertex :: struct { - x, y, z: f32; - - // This field is broken up by bit, but Onyx does not (nor ever will) support bit-fields. - // - // 4-bits (0..3) - red color - // 4-bits (4..7) - green color - // 4-bits (8..11) - blue color - // 4-bits (12..15) - intensity - data: u32; -} - -Mesh :: struct { +Mesh :: struct (T: type_expr) { handle: GLint; vertex_handle: GLint; index_handle: GLint; @@ -22,8 +10,8 @@ Mesh :: struct { index_count: u32; } -mesh_make :: (verticies: [] Vertex, indicies: [] u32) -> ^Mesh { - mesh := new(Mesh); +mesh_make :: (verticies: [] $T, indicies: [] u32) -> ^Mesh(T) { + mesh := new(Mesh(T)); mesh.vertex_count = verticies.count; mesh.index_count = indicies.count; @@ -32,23 +20,39 @@ mesh_make :: (verticies: [] Vertex, indicies: [] u32) -> ^Mesh { glGenBuffers(1, ^mesh.vertex_handle); glBindBuffer(GL_ARRAY_BUFFER, mesh.vertex_handle); - glBufferData(GL_ARRAY_BUFFER, sizeof Vertex * verticies.count, verticies.data, GL_STATIC_DRAW); - - glEnableVertexAttribArray(0); - glEnableVertexAttribArray(1); - glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof Vertex, ~~0); - glVertexAttribIPointer(1, 1, GL_UNSIGNED_INT, sizeof Vertex, ~~12); + glBufferData(GL_ARRAY_BUFFER, sizeof T * verticies.count, verticies.data, GL_STATIC_DRAW); + + vertex_info := cast(^type_info.Type_Info_Struct) type_info.get_type_info(T); + vertex_attr := 0; + for attr: vertex_info.members { + defer vertex_attr += 1; + glEnableVertexAttribArray(vertex_attr); + + switch attr.type { + case Vector2 do glVertexAttribPointer(vertex_attr, 2, GL_FLOAT, false, sizeof T, ~~attr.offset); + case Vector3 do glVertexAttribPointer(vertex_attr, 3, GL_FLOAT, false, sizeof T, ~~attr.offset); + case u32 do glVertexAttribIPointer(vertex_attr, 1, GL_UNSIGNED_INT, sizeof T, ~~attr.offset); + case i32 do glVertexAttribIPointer(vertex_attr, 1, GL_INT, sizeof T, ~~attr.offset); + case #default { + buf: [256] u8; + msg := conv.str_format(buf, "Unknown type for GL vertex attribute, {}.", attr.type); + assert(false, msg); + } + } + } - glGenBuffers(1, ^mesh.index_handle); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.index_handle); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof i32 * indicies.count, indicies.data, GL_STATIC_DRAW); + if indicies.count > 0 { + glGenBuffers(1, ^mesh.index_handle); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.index_handle); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof i32 * indicies.count, indicies.data, GL_STATIC_DRAW); + } glBindVertexArray(-1); return mesh; } -mesh_draw :: (use mesh: ^Mesh) { +mesh_draw :: (use mesh: ^Mesh($T)) { glBindVertexArray(handle); if index_count > 0 { glDrawElements(GL_TRIANGLES, index_count, GL_UNSIGNED_INT, ~~0); @@ -58,6 +62,17 @@ mesh_draw :: (use mesh: ^Mesh) { glBindVertexArray(-1); } +mesh_free :: (mesh: ^Mesh($T)) { + glDeleteBuffers(1, ^mesh.vertex_handle); + glDeleteBuffers(1, ^mesh.index_handle); + glDeleteVertexArrays(1, ^mesh.handle); + cfree(mesh); +} + + + +#if false { +// Old code for making a single cube mesh_make_cube :: (x, y, z: f32) -> ^Mesh { data := random.between(0x0000, 0xffff); @@ -93,9 +108,4 @@ mesh_make_cube :: (x, y, z: f32) -> ^Mesh { return mesh_make(vertex_data, index_data); } - -mesh_free :: (mesh: ^Mesh) { - glDeleteBuffers(1, ^mesh.vertex_handle); - glDeleteBuffers(1, ^mesh.index_handle); - glDeleteVertexArrays(1, ^mesh.handle); -} +} \ No newline at end of file diff --git a/src/shader.onyx b/src/shader.onyx new file mode 100644 index 0000000..2b3279d --- /dev/null +++ b/src/shader.onyx @@ -0,0 +1,146 @@ + +use package core +use package opengles + +Shader :: struct { + vs, fs: GLuint; + prog: GLuint; +} + +window_matrix_block_buffer: GLuint; +world_matrix_block_buffer: GLuint; + +shaders_init :: () { + glGenBuffers(1, ^window_matrix_block_buffer); + glGenBuffers(1, ^world_matrix_block_buffer); + + glBindBuffer(GL_UNIFORM_BUFFER, window_matrix_block_buffer); + glBufferData(GL_UNIFORM_BUFFER, sizeof f32 * 16, null, GL_DYNAMIC_DRAW); + + glBindBuffer(GL_UNIFORM_BUFFER, world_matrix_block_buffer); + glBufferData(GL_UNIFORM_BUFFER, sizeof f32 * (16 + 16 + 16), null, GL_DYNAMIC_DRAW); + + glBindBuffer(GL_UNIFORM_BUFFER, -1); + + glBindBufferBase(GL_UNIFORM_BUFFER, WINDOW_MATRIX_BLOCK, window_matrix_block_buffer); + glBindBufferBase(GL_UNIFORM_BUFFER, WORLD_MATRIX_BLOCK, world_matrix_block_buffer); +} + +shader_make :: (vertex_path, fragment_path: str) -> Shader { + vertex_shader := os.get_contents(vertex_path); + fragment_shader := os.get_contents(fragment_path); + vs := compile_shader(vertex_shader, GL_VERTEX_SHADER); + fs := compile_shader(fragment_shader, GL_FRAGMENT_SHADER); + + prog := link_program(vs, fs); + + return Shader.{vs, fs, prog}; +} + +shader_use :: (shader: Shader) { + glUseProgram(shader.prog); +} + +WINDOW_MATRIX_BLOCK :: 0; +WORLD_MATRIX_BLOCK :: 1; + +shader_link_window_matrix_block :: (use shader: Shader) { + matrix_block_index := glGetUniformBlockIndex(prog, #cstr "u_window_matrix_block"); + glUniformBlockBinding(prog, matrix_block_index, WINDOW_MATRIX_BLOCK); +} + +shader_link_world_matrix_block :: (use shader: Shader) { + matrix_block_index := glGetUniformBlockIndex(prog, #cstr "u_world_matrix_block"); + glUniformBlockBinding(prog, matrix_block_index, WORLD_MATRIX_BLOCK); +} + +shader_set_uniform :: (shader: Shader, uniform: cstr, value: $T) { + glUseProgram(shader.prog); + location := glGetUniformLocation(shader.prog, uniform); + + switch T { + case i32, u32 do glUniform1i(location, value); + case #default do assert(false, "Bad case."); + } +} + +update_view_matrix :: () { + view_mat: [16] f32; + camera_get_view_matrix(^camera, view_mat); + + glBindBuffer(GL_UNIFORM_BUFFER, world_matrix_block_buffer); + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof typeof view_mat, ^view_mat); + glBindBuffer(GL_UNIFORM_BUFFER, -1); +} + +update_world_matrix :: () { + world_mat: [16] f32; + camera_get_world_matrix(^camera, world_mat); + + glBindBuffer(GL_UNIFORM_BUFFER, world_matrix_block_buffer); + glBufferSubData(GL_UNIFORM_BUFFER, 16 * sizeof f32, sizeof typeof world_mat, ^world_mat); + glBindBuffer(GL_UNIFORM_BUFFER, -1); +} + +update_window_matrix :: () { + window_mat: [16] f32; + camera_get_window_matrix(^camera, window_mat); + + glBindBuffer(GL_UNIFORM_BUFFER, window_matrix_block_buffer); + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof typeof window_mat, ^window_mat); + glBindBuffer(GL_UNIFORM_BUFFER, -1); +} + +update_model_matrix :: (v: Vector3) { + model_mat: [16] f32; + model_mat[0] = 1; + model_mat[5] = 1; + model_mat[10] = 1; + model_mat[12] = v.x; + model_mat[13] = v.y; + model_mat[14] = v.z; + model_mat[15] = 1; + + glBindBuffer(GL_UNIFORM_BUFFER, world_matrix_block_buffer); + glBufferSubData(GL_UNIFORM_BUFFER, 32 * sizeof f32, sizeof typeof model_mat, ^model_mat); + glBindBuffer(GL_UNIFORM_BUFFER, -1); +} + + +#local { + compile_shader :: (source: str, type: GLenum) -> GLint { + shader := glCreateShader(type); + source_data := source.data; + source_len := source.count; + glShaderSource(shader, 1, ^source_data, ^source_len); + glCompileShader(shader); + + success: GLint; + if glGetShaderiv(shader, GL_COMPILE_STATUS, ^success); success == GL_FALSE { + buf_data: [1024] u8; + buf := str.{ ~~buf_data, 0 }; + glGetShaderInfoLog(shader, 1024, ^buf.count, buf.data); + println(buf); + } + + return shader; + } + + link_program :: (vertex_shader, fragment_shader: GLint) -> GLuint { + prog := glCreateProgram(); + glAttachShader(prog, vertex_shader); + glAttachShader(prog, fragment_shader); + glLinkProgram(prog); + + success: GLint; + if glGetProgramiv(prog, GL_LINK_STATUS, ^success); success == GL_FALSE { + buf_data: [1024] u8; + buf := str.{ ~~buf_data, 0 }; + glGetProgramInfoLog(prog, 1024, ^buf.count, buf.data); + println(buf); + } + + return prog; + } +} + diff --git a/src/vecmath.onyx b/src/vecmath.onyx index bded115..e6bf75d 100644 --- a/src/vecmath.onyx +++ b/src/vecmath.onyx @@ -1,3 +1,7 @@ +Vector2 :: struct { + x, y: f32; +} + Vector3i :: struct { x, y, z: i32; } diff --git a/src/world.onyx b/src/world.onyx new file mode 100644 index 0000000..c740e6d --- /dev/null +++ b/src/world.onyx @@ -0,0 +1,36 @@ + +use package core + +World :: struct { + chunk_dist: u32; + chunks: [] ^Chunk; +} + +world_make :: (allocator := context.allocator) -> ^World { + world := new(World, allocator); + world.chunk_dist = 3; + memory.alloc_slice(^world.chunks, world.chunk_dist * world.chunk_dist * world.chunk_dist); + + for x: 0 .. 3 do for y: 0 .. 3 do for z: 0 .. 3 { + chunk := chunk_make(x, y, z); + + for z: 32 do for x: 32 { + chunk_set(chunk, x, 0, z, block_make(0.2, 1, 0.2, 0.8)); + } + for z: 32 do for x: 32 { + if random.between(0, 10) >= 7 do continue; + chunk_set(chunk, x, 1, z, block_make(random.float(0, 1), random.float(0, 1), random.float(0, 1), 1)); + } + + world.chunks[x * world.chunk_dist * world.chunk_dist + y * world.chunk_dist + z] = chunk; + } + + return world; +} + +world_draw :: (use world: ^World) { + for chunks { + chunk_build_mesh(it); + chunk_draw(it); + } +} \ No newline at end of file -- 2.25.1