From 05aa5178f7b0cf0962d4125a6a0af76a972150f2 Mon Sep 17 00:00:00 2001 From: iurii plugatarov Date: Sun, 18 Aug 2024 20:44:13 +0300 Subject: light --- src/main.odin | 233 ++++++++++++---------------------------------------------- 1 file changed, 48 insertions(+), 185 deletions(-) (limited to 'src/main.odin') diff --git a/src/main.odin b/src/main.odin index f399fbb..c2c54ef 100644 --- a/src/main.odin +++ b/src/main.odin @@ -27,12 +27,14 @@ SCREEN_WIDTH: f32 : 800.0 SCREEN_HEIGTH: f32 : 600.0 -camera := cam.camera_init(Vec3{0.0, 0.0, 0.3}) +camera := cam.camera_init(Vec3{0.0, 0.0, 3.0}) first_mouse := true last_x: f32 = 800.0 / 2.0 last_y: f32 = 800.0 / 2.0 +light_pos := Vec3{1.2, 1.0, 2.0} + framebuffer_size_callback :: proc "cdecl" (window: glfw.WindowHandle, width, height: i32) { gl.Viewport(0, 0, width, height) } @@ -119,7 +121,18 @@ main :: proc() { glfw.SetScrollCallback(window, mouse_scroll_callback) glfw.SetInputMode(window, glfw.CURSOR, glfw.CURSOR_DISABLED) - shdr, err := shader.shader_init("res/shaders/triangle.vs", "res/shaders/triangle.fs") + light_cube_shader, err := shader.shader_init( + "res/shaders/light_cube.vs", + "res/shaders/light_cube.fs", + ) + if err == shader.SHADER_LOAD_ERROR { + fmt.eprintln("Could not initialize shader") + return + } + + lighting_shader: ^shader.Shader + lighting_shader, err = shader.shader_init("res/shaders/colors.vs", "res/shaders/colors.fs") + if err == shader.SHADER_LOAD_ERROR { fmt.eprintln("Could not initialize shader") return @@ -129,191 +142,116 @@ main :: proc() { -0.5, -0.5, -0.5, - 0.0, - 0.0, 0.5, -0.5, -0.5, - 1.0, - 0.0, 0.5, 0.5, -0.5, - 1.0, - 1.0, 0.5, 0.5, -0.5, - 1.0, - 1.0, -0.5, 0.5, -0.5, - 0.0, - 1.0, -0.5, -0.5, -0.5, - 0.0, - 0.0, -0.5, -0.5, 0.5, - 0.0, - 0.0, 0.5, -0.5, 0.5, - 1.0, - 0.0, 0.5, 0.5, 0.5, - 1.0, - 1.0, 0.5, 0.5, 0.5, - 1.0, - 1.0, -0.5, 0.5, 0.5, - 0.0, - 1.0, -0.5, -0.5, 0.5, - 0.0, - 0.0, -0.5, 0.5, 0.5, - 1.0, - 0.0, -0.5, 0.5, -0.5, - 1.0, - 1.0, -0.5, -0.5, -0.5, - 0.0, - 1.0, -0.5, -0.5, -0.5, - 0.0, - 1.0, -0.5, -0.5, 0.5, - 0.0, - 0.0, -0.5, 0.5, 0.5, - 1.0, - 0.0, 0.5, 0.5, 0.5, - 1.0, - 0.0, 0.5, 0.5, -0.5, - 1.0, - 1.0, 0.5, -0.5, -0.5, - 0.0, - 1.0, 0.5, -0.5, -0.5, - 0.0, - 1.0, 0.5, -0.5, 0.5, - 0.0, - 0.0, 0.5, 0.5, 0.5, - 1.0, - 0.0, -0.5, -0.5, -0.5, - 0.0, - 1.0, 0.5, -0.5, -0.5, - 1.0, - 1.0, 0.5, -0.5, 0.5, - 1.0, - 0.0, 0.5, -0.5, 0.5, - 1.0, - 0.0, -0.5, -0.5, 0.5, - 0.0, - 0.0, -0.5, -0.5, -0.5, - 0.0, - 1.0, -0.5, 0.5, -0.5, - 0.0, - 1.0, 0.5, 0.5, -0.5, - 1.0, - 1.0, 0.5, 0.5, 0.5, - 1.0, - 0.0, 0.5, 0.5, 0.5, - 1.0, - 0.0, -0.5, 0.5, 0.5, - 0.0, - 0.0, -0.5, 0.5, -0.5, - 0.0, - 1.0, } - vbo, vao, texture1, texture2: u32 - gl.GenVertexArrays(1, &vao) + vbo, light_cube_vao, cube_vao: u32 gl.GenBuffers(1, &vbo) - - gl.BindVertexArray(vao) gl.BindBuffer(gl.ARRAY_BUFFER, vbo) gl.BufferData( @@ -323,96 +261,22 @@ main :: proc() { gl.STATIC_DRAW, ) - gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 5 * size_of(f32), 0) + gl.GenVertexArrays(1, &cube_vao) + gl.BindVertexArray(cube_vao) + gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 3 * size_of(f32), 0) gl.EnableVertexAttribArray(0) - gl.VertexAttribPointer(1, 2, gl.FLOAT, gl.FALSE, 5 * size_of(f32), 3 * size_of(f32)) - gl.EnableVertexAttribArray(1) - - gl.GenTextures(1, &texture1) - gl.BindTexture(gl.TEXTURE_2D, texture1) - gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) - gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) - - gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) - gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) - - width, height, nr_channels: libc.int - assert(os.is_file_path("res/images/container.jpg")) - data := image.load("res/images/container.jpg", &width, &height, &nr_channels, 0) - - if data != nil { - gl.TexImage2D( - gl.TEXTURE_2D, - 0, - gl.RGB, - i32(width), - i32(height), - 0, - gl.RGB, - gl.UNSIGNED_BYTE, - data, - ) - gl.GenerateMipmap(gl.TEXTURE_2D) - } else { - fmt.eprintln("Failed to load texture") - return - } - image.image_free(data) - - gl.GenTextures(1, &texture2) - gl.BindTexture(gl.TEXTURE_2D, texture2) - gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) - gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) - - gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) - gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) - - image.set_flip_vertically_on_load(1) - - assert(os.is_file_path("res/images/awesomeface.png")) - data = image.load("res/images/awesomeface.png", &width, &height, &nr_channels, 0) - - if data != nil { - gl.TexImage2D( - gl.TEXTURE_2D, - 0, - gl.RGBA, - i32(width), - i32(height), - 0, - gl.RGBA, - gl.UNSIGNED_BYTE, - data, - ) - gl.GenerateMipmap(gl.TEXTURE_2D) - } else { - fmt.eprintln("Failed to load texture") - return - } - image.image_free(data) - shader.use(shdr) - shader.set_value(shdr, cstring("texture1"), 0) - shader.set_value(shdr, cstring("texture2"), 1) + gl.GenVertexArrays(1, &light_cube_vao) + gl.BindVertexArray(light_cube_vao) + gl.BindBuffer(gl.ARRAY_BUFFER, vbo) + gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 3 * size_of(f32), 0) + gl.EnableVertexAttribArray(0) //gl.PolygonMode(gl.FRONT_AND_BACK, gl.LINE) gl.Enable(gl.DEPTH_TEST) - cube_positions: []linalg.Vector3f32 = { - linalg.Vector3f32{0.0, 0.0, 0.0}, - linalg.Vector3f32{2.0, 5.0, -15.0}, - linalg.Vector3f32{-1.5, -2.2, -2.5}, - linalg.Vector3f32{-3.8, -2.0, -12.3}, - linalg.Vector3f32{2.4, -0.4, -3.5}, - linalg.Vector3f32{-1.7, 3.0, -7.5}, - linalg.Vector3f32{1.3, -2.0, -2.5}, - linalg.Vector3f32{1.5, 2.0, -2.5}, - linalg.Vector3f32{1.5, 0.2, -1.5}, - linalg.Vector3f32{-1.3, 1.0, -1.5}, - } - for !glfw.WindowShouldClose(window) { current_frame: f32 = f32(glfw.GetTime()) delta_time = current_frame - last_frame @@ -420,19 +284,17 @@ main :: proc() { process_input(&window) - gl.ClearColor(0.2, 0.3, 0.3, 1.0) + gl.ClearColor(0.1, 0.1, 0.1, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) - gl.ActiveTexture(gl.TEXTURE0) - gl.BindTexture(gl.TEXTURE_2D, texture1) - gl.ActiveTexture(gl.TEXTURE1) - gl.BindTexture(gl.TEXTURE_2D, texture2) + shader.use(lighting_shader) + object_color := Vec3{1.0, 0.5, 0.31} + light_color := Vec3{1.0, 1.0, 1.0} + shader.set_vec3(lighting_shader, cstring("object_color"), &object_color[0]) + shader.set_vec3(lighting_shader, cstring("light_color"), &light_color[0]) aspect: f32 = 800.0 / 600.0 - - view := cam.get_view_matrix(camera) - projection := linalg.matrix4_perspective_f32( linalg.to_radians(camera.zoom), aspect, @@ -440,35 +302,36 @@ main :: proc() { 100.0, ) - view_location := gl.GetUniformLocation(shdr.id, "view") + view := cam.get_view_matrix(camera) + + view_location := gl.GetUniformLocation(lighting_shader.id, "view") gl.UniformMatrix4fv(view_location, 1, gl.FALSE, &view[0][0]) - projection_location := gl.GetUniformLocation(shdr.id, "projection") + projection_location := gl.GetUniformLocation(lighting_shader.id, "projection") gl.UniformMatrix4fv(projection_location, 1, gl.FALSE, &projection[0][0]) - shader.use(shdr) - - - gl.BindVertexArray(vao) - - for cube_position, i in cube_positions { - model := linalg.matrix4_translate(cube_position) - angle: f32 = linalg.to_radians(20.0 * cast(f32)i) - model *= linalg.matrix4_rotate(angle, linalg.Vector3f32{1.0, 0.3, 0.5}) - + model := linalg.MATRIX4F32_IDENTITY + shader.set_mat4(lighting_shader, cstring("model"), &model[0][0]) - model_location := gl.GetUniformLocation(shdr.id, "model") - gl.UniformMatrix4fv(model_location, 1, gl.FALSE, &model[0][0]) + gl.BindVertexArray(cube_vao) + gl.DrawArrays(gl.TRIANGLES, 0, 36) + shader.use(light_cube_shader) + shader.set_mat4(light_cube_shader, cstring("projection"), &projection[0][0]) + shader.set_mat4(light_cube_shader, cstring("view"), &view[0][0]) - gl.DrawArrays(gl.TRIANGLES, 0, 36) - } + model = linalg.matrix4_translate_f32(light_pos) + model *= linalg.matrix4_scale_f32(Vec3{0.2, 0.2, 0.2}) + shader.set_mat4(light_cube_shader, cstring("model"), &model[0][0]) + gl.BindVertexArray(light_cube_vao) + gl.DrawArrays(gl.TRIANGLES, 0, 36) glfw.SwapBuffers(window) glfw.PollEvents() } - gl.DeleteVertexArrays(1, &vao) + gl.DeleteVertexArrays(1, &light_cube_vao) + gl.DeleteVertexArrays(1, &cube_vao) gl.DeleteBuffers(1, &vbo) } -- cgit 1.4.1-2-gfad0