From 3febfbb303ccae225db8ab948ba32f02ebf744f4 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 5 May 2021 12:56:50 -0500 Subject: [PATCH] added initial immediate mode rendering module --- .vimspector.json | 4 +- bin/onyx | Bin 353448 -> 353448 bytes core/io/binary_reader.onyx | 3 +- modules/immediate_mode/gl_utils.onyx | 84 ++++++ .../immediate_mode/immediate_renderer.onyx | 276 ++++++++++++++++++ modules/immediate_mode/module.onyx | 5 + progs/odin_example.onyx | 2 +- src/onyxlex.c | 5 + src/onyxsymres.c | 6 + 9 files changed, 381 insertions(+), 4 deletions(-) create mode 100644 modules/immediate_mode/gl_utils.onyx create mode 100644 modules/immediate_mode/immediate_renderer.onyx create mode 100644 modules/immediate_mode/module.onyx diff --git a/.vimspector.json b/.vimspector.json index 428040d8..ca0980d4 100644 --- a/.vimspector.json +++ b/.vimspector.json @@ -5,8 +5,8 @@ "configuration": { "type": "cppdbg", "request": "launch", - "program": "${workspaceFolder}/bin/onyx", - "args": ["-VVV", "tmp/iter_test.onyx"], + "program": "${workspaceFolder}/bin/onyx-debug", + "args": ["-VVV", "tmp/a.onyx"], "stopAtEntry": true, "cwd": "${workspaceFolder}", "environment": [], diff --git a/bin/onyx b/bin/onyx index 9870c926db10c24c9168feef6b46e593171e7037..f0437b204741cbb280418e68bc8cd3849a5e1527 100755 GIT binary patch delta 64119 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�^%C7wh-~#v|0=l<_%mNF+`Lo}?}hA+ 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 Rf6V0ln3FYkl&hBZ{{hf#pZWj* delta 64109 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 F`+pL2hDQJZ diff --git a/core/io/binary_reader.onyx b/core/io/binary_reader.onyx index df6ab705..3202917f 100644 --- a/core/io/binary_reader.onyx +++ b/core/io/binary_reader.onyx @@ -8,7 +8,8 @@ package core.io.binary // After sleeping on it, everything here shouldn't need to exist. The already // existing BinaryReader from binary.onyx should be able to do all of this -// when big endian integers are added to the language. +// when big endian integers are added to the language. This will be moved to +// the ttf library when that is added to the core modules folder. BinaryReader :: struct { data : [] u8; diff --git a/modules/immediate_mode/gl_utils.onyx b/modules/immediate_mode/gl_utils.onyx new file mode 100644 index 00000000..fbf8c1e1 --- /dev/null +++ b/modules/immediate_mode/gl_utils.onyx @@ -0,0 +1,84 @@ +package immediate_mode + +use package core +#private_file gl :: package gl + +// This Shader represents an OpenGL program, not a shader. The name +// is confusing but conceptually for most people, shaders are a bundled +// version of the vertex and fragment shader. +Shader :: struct { + program : gl.GLProgram; + + position_loc : gl.GLint; + color_loc : gl.GLint; + texture_loc : gl.GLint; + + texture_uniform : gl.GLUniformLocation; + view_uniform : gl.GLUniformLocation; + world_uniform : gl.GLUniformLocation; + + make_from_source :: (vertex_source: str, fragment_source: str) -> Shader { + shader: Shader; + init_from_source(^shader, vertex_source, fragment_source); + return shader; + } + + init_from_source :: (use shader: ^Shader, vertex_source: str, fragment_source: str) { + vertex_shader, vertex_compiled := compile_shader(vertex_source, gl.VERTEX_SHADER); + fragment_shader, fragment_compiled := compile_shader(fragment_source, gl.FRAGMENT_SHADER); + assert(vertex_compiled, "Vertex shader failed to compile"); + assert(fragment_compiled, "Fragment shader failed to compile"); + defer { + gl.deleteShader(vertex_shader); + gl.deleteShader(fragment_shader); + } + + shader_program, program_linked := link_program(vertex_shader, fragment_shader); + assert(program_linked, "Program failed to link"); + program = shader_program; + + position_loc = gl.getAttribLocation(program, "a_position"); + color_loc = gl.getAttribLocation(program, "a_color"); + texture_loc = gl.getAttribLocation(program, "a_texture"); + + texture_uniform = gl.getUniformLocation(program, "u_texture"); + view_uniform = gl.getUniformLocation(program, "u_view"); + world_uniform = gl.getUniformLocation(program, "u_world"); + + compile_shader :: (source: str, shader_type: gl.GLenum) -> (gl.GLShader, bool) { + shader := gl.createShader(shader_type); + gl.shaderSource(shader, source); + gl.compileShader(shader); + + success := true; + if gl.getShaderParameter(shader, gl.COMPILE_STATUS) == 0 { + printf("Error compiling shader."); + gl.printShaderInfoLog(shader); + success = false; + } + + return shader, success; + } + + link_program :: (vertex_shader: gl.GLShader, fragment_shader: gl.GLShader) -> (gl.GLProgram, bool) { + program := gl.createProgram(); + gl.attachShader(program, vertex_shader); + gl.attachShader(program, fragment_shader); + gl.linkProgram(program); + + success := true; + if gl.getProgramParameter(program, gl.LINK_STATUS) == 0 { + printf("Error linking program."); + gl.printProgramInfoLog(program); + success = false; + } + + return program, success; + } + } + + free :: (use shader: ^Shader) { + gl.deleteProgram(program); + } +} + diff --git a/modules/immediate_mode/immediate_renderer.onyx b/modules/immediate_mode/immediate_renderer.onyx new file mode 100644 index 00000000..4d55eace --- /dev/null +++ b/modules/immediate_mode/immediate_renderer.onyx @@ -0,0 +1,276 @@ +package immediate_mode + +use package core +#private_file gl :: package gl + +// CLEANUP: Proper multi-line strings need to be added... +// This is a gross abuse of the lexer. +IMMEDIATE_VERTEX_SHADER :: "#version 300 es + +layout(location = 0) in vec2 a_vertex; +layout(location = 1) in vec4 a_color; +layout(location = 2) in vec2 a_texture; + +uniform mat4 u_view; +uniform mat4 u_world; + +out vec4 v_color; +out vec2 v_texture; + +void main() { + gl_Position = u_view * u_world * vec4(a_vertex, 0, 1); + + v_color = a_color; + v_texture = a_texture; +} +" + +IMMEDIATE_FRAGMENT_SHADER :: "#version 300 es + +precision mediump float; + +uniform sampler2D u_texture; + +in vec4 v_color; +in vec2 v_texture; + +out vec4 fragColor; + +void main() { + fragColor = v_color; +} +" + +IMMEDIATE_FRAGMENT_SHADER_TEXTURED :: "#version 300 es + +precision mediump float; + +uniform sampler2D u_texture; + +in vec4 v_color; +in vec2 v_texture; + +out vec4 fragColor; + +void main() { + fragColor = v_color * texture(u_texture, v_texture); +} +" + + + +Vector2 :: struct { + x, y: f32; +} + +Color4 :: struct { + r, g, b: f32; + a: f32 = 1; +} + +Immediate_Vertex :: struct { + position : Vector2; + color : Color4; + texture : Vector2; +} + +Immediate_Renderer :: struct { + // Will point to either the simple_shader or the textured_shader. + active_shader : ^Shader; + + simple_shader, textured_shader : Shader; + + // 'verticies' contains the vertex data and the maximum number of verticies + // that can be rendered at a given time. 'vertex_count' is used to store how + // many verticies will be rendered in the next draw call. 'vertex_count' is + // expected to be a multiple of 3, given that triangles are being rendered. + verticies : [] Immediate_Vertex; + vertex_count : u32; + + clear_color : Color4; + + vertex_array : gl.GLVertexArrayObject; + vertex_buffer : gl.GLBuffer; + + // Needs to be a multiple of 3!! + Default_Max_Verticies :: 1023; + + make :: (max_verticies := Default_Max_Verticies) -> Immediate_Renderer { + ir : Immediate_Renderer; + init(^ir, max_verticies); + + return ir; + } + + init :: (use ir: ^Immediate_Renderer, max_verticies := Default_Max_Verticies) { + simple_shader = Shader.make_from_source(IMMEDIATE_VERTEX_SHADER, IMMEDIATE_FRAGMENT_SHADER); + textured_shader = Shader.make_from_source(IMMEDIATE_VERTEX_SHADER, IMMEDIATE_FRAGMENT_SHADER_TEXTURED); + active_shader = ^simple_shader; + + verticies = memory.make_slice(Immediate_Vertex, max_verticies); + memory.set(verticies.data, 0, verticies.count * sizeof Immediate_Vertex); + + vertex_array = gl.createVertexArray(); + + vertex_buffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer); + gl.bufferData(gl.ARRAY_BUFFER, cast(gl.GLsizei) (max_verticies * sizeof Immediate_Vertex), gl.STREAM_DRAW); + + ir->init_shader_params(^simple_shader); + ir->init_shader_params(^textured_shader); + + gl.useProgram(active_shader.program); + } + + init_shader_params :: (use ir: ^Immediate_Renderer, shader: ^Shader) { + gl.useProgram(shader.program); + + gl.bindVertexArray(vertex_array); + defer gl.bindVertexArray(-1); + + gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer); + + // Position + gl.enableVertexAttribArray(0); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, sizeof Immediate_Vertex, 0); + + // Color + gl.enableVertexAttribArray(1); + gl.vertexAttribPointer(1, 4, gl.FLOAT, false, sizeof Immediate_Vertex, 2 * sizeof f32); + + // Texture + gl.enableVertexAttribArray(2); + gl.vertexAttribPointer(2, 2, gl.FLOAT, false, sizeof Immediate_Vertex, 6 * sizeof f32); + + gl.bindBuffer(gl.ARRAY_BUFFER, -1); + + // TEMPORARY + gl.uniformMatrix4(shader.world_uniform, false, + f32.[ 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 ]); + } + + free :: (use ir: ^Immediate_Renderer) { + simple_shader->free(); + textured_shader->free(); + + gl.deleteVertexArray(vertex_array); + gl.deleteBuffer(vertex_buffer); + } + + flush :: (use ir: ^Immediate_Renderer) { + if vertex_count == 0 do return; + + gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, .{ count = vertex_count * sizeof Immediate_Vertex, data = ~~verticies.data }); + gl.bindBuffer(gl.ARRAY_BUFFER, -1); + + gl.useProgram(active_shader.program); + gl.bindVertexArray(vertex_array); + gl.drawArrays(gl.TRIANGLES, 0, vertex_count); + gl.bindVertexArray(-1); + + vertex_count = 0; + } + + push_vertex :: proc { + // If a color is not provided, the previous color is used. + (use ir: ^Immediate_Renderer, position: Vector2) { + push_vertex(ir, position, color = verticies[vertex_count - 1].color); + }, + + (use ir: ^Immediate_Renderer, position: Vector2, color: Color4, texture: Vector2 = .{0,0}) { + if vertex_count >= verticies.count do ir->flush(); + + vertex_ptr := ^verticies[vertex_count]; + defer vertex_count += 1; + + vertex_ptr.position = position; + vertex_ptr.color = color; + vertex_ptr.texture = texture; + }, + } + + quad :: (use ir: ^Immediate_Renderer, position: Vector2, size: Vector2, color: Color4 = .{1,1,1}) { + push_vertex(ir, .{ position.x, position.y }, color); + push_vertex(ir, .{ position.x + size.x, position.y }); + push_vertex(ir, .{ position.x + size.x, position.y + size.y }); + + push_vertex(ir, .{ position.x, position.y }); + push_vertex(ir, .{ position.x + size.x, position.y + size.y }); + push_vertex(ir, .{ position.x, position.y + size.y }); + } + + textured_quad :: (use ir: ^Immediate_Renderer, position: Vector2, size: Vector2, texture_position: Vector2, texture_size: Vector2, color: Color4 = .{1,1,1}) { + push_vertex(ir, .{ position.x, position.y }, color, .{ texture_position.x, texture_position.y }); + push_vertex(ir, .{ position.x + size.x, position.y }, color, .{ texture_position.x + texture_size.x, texture_position.y }); + push_vertex(ir, .{ position.x + size.x, position.y + size.y }, color, .{ texture_position.x + texture_size.x, texture_position.y + texture_size.y }); + + push_vertex(ir, .{ position.x, position.y }, color, .{ texture_position.x, texture_position.y }); + push_vertex(ir, .{ position.x + size.x, position.y + size.y }, color, .{ texture_position.x + texture_size.x, texture_position.y + texture_size.y }); + push_vertex(ir, .{ position.x, position.y + size.y }, color, .{ texture_position.x, texture_position.y + texture_size.y }); + } + + // NOTE: Calling set_texture without a parameter will disable textured rendering. + set_texture :: (use ir: ^Immediate_Renderer, texture_id: i32 = -1) { + if vertex_count > 0 do flush(ir); + + if texture_id >= 0 do active_shader = ^textured_shader; + else do active_shader = ^simple_shader; + + gl.useProgram(active_shader.program); + gl.uniform1i(active_shader.texture_uniform, math.max(texture_id, 0)); + } + + use_ortho_projection :: (use ir: ^Immediate_Renderer, left: f32, right: f32, top: f32, bottom: f32) { + projection_matrix := f32.[ + 2 / (right - left), 0, 0, -(right + left) / (right - left), + 0, 2 / (top - bottom), 0, -(top + bottom) / (top - bottom), + 0, 0, -2, -1, + 0, 0, 0, 1 + ]; + + gl.uniformMatrix4(active_shader.view_uniform, true, projection_matrix); + } +} + + + + +// While the immediate renderer can be used on its own, below is a set of wrapping functions +// that operate on a global immediate renderer. This is probably the most common way that +// it will be used. + +#private +immediate_renderer : Immediate_Renderer; + +immediate_renderer_init :: () { + Immediate_Renderer.init(^immediate_renderer); +} + +immediate_renderer_free :: () { + Immediate_Renderer.free(^immediate_renderer); +} + +vertex :: proc { + (position: Vector2) { immediate_renderer->push_vertex(position); }, + (position: Vector2, color: Color4) { immediate_renderer->push_vertex(position, color); }, +} + +quad :: (position: Vector2, size: Vector2, color: Color4 = .{1,1,1}) { + immediate_renderer->quad(position, size, color); +} + +textured_quad :: (position: Vector2, size: Vector2, texture_position: Vector2, texture_size: Vector2, color: Color4 = .{1,1,1}) { + immediate_renderer->textured_quad(position, size, texture_position, texture_size, color); +} + +flush :: () do immediate_renderer->flush(); + +set_texture :: (texture_id: i32 = -1) do immediate_renderer->set_texture(texture_id); + +use_ortho_projection :: (left: f32, right: f32, top: f32, bottom: f32) { + immediate_renderer->use_ortho_projection(left, right, top, bottom); +} diff --git a/modules/immediate_mode/module.onyx b/modules/immediate_mode/module.onyx new file mode 100644 index 00000000..1e88679a --- /dev/null +++ b/modules/immediate_mode/module.onyx @@ -0,0 +1,5 @@ + +package immediate_mode + +#load "modules/immediate_mode/immediate_renderer" +#load "modules/immediate_mode/gl_utils" diff --git a/progs/odin_example.onyx b/progs/odin_example.onyx index ab16c27b..1e6bf90b 100644 --- a/progs/odin_example.onyx +++ b/progs/odin_example.onyx @@ -116,7 +116,7 @@ main :: (args: [] cstr) { } use package test { foo as foo_pkg } - use package test as test + test :: package test use test.foo.SomeEnum printf("Val2: %i\n", cast(i32) Val2); diff --git a/src/onyxlex.c b/src/onyxlex.c index 0f60262b..b244065c 100644 --- a/src/onyxlex.c +++ b/src/onyxlex.c @@ -1,6 +1,7 @@ #include "bh.h" #include "onyxlex.h" #include "onyxutils.h" +#include "onyxerrors.h" u64 lexer_lines_processed = 0; u64 lexer_tokens_processed = 0; @@ -210,6 +211,10 @@ whitespace_skipped: while (!(*tokenizer->curr == '"' && slash_count == 0)) { len++; + // if (*tokenizer->curr == '\n') { + // onyx_report_error(tk.pos, "String literal not terminated by end of line."); + // } + if (*tokenizer->curr == '\\') { slash_count += 1; slash_count %= 2; diff --git a/src/onyxsymres.c b/src/onyxsymres.c index ee64296b..e02f608e 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -991,6 +991,12 @@ static SymresStatus symres_polyproc(AstPolyProc* pp) { bh_arr_each(AstPolyParam, param, pp->poly_params) { if (param->kind != PPK_Baked_Value) continue; + // FIX: Looking up symbols immediately in the type of the baked value does not always work + // because I think the following should be possible: + // + // baked_proc :: (x: $T, $f: (T) -> T) -> T ... + // + // The type of 'f' depends on resolving the value for the polyvar 'T'. SYMRES(type, ¶m->type_expr); } -- 2.25.1