diff --git a/src/base/types.odin b/src/base/types.odin new file mode 100644 index 0000000..3eaee44 --- /dev/null +++ b/src/base/types.odin @@ -0,0 +1,17 @@ +package base + +// ----------------------------------------- +// Types + +Vec2 :: [2]f32 +Vec3 :: [3]f32 +Vec4 :: [4]f32 + +Mat3 :: matrix[3, 3]f32 +Mat4 :: matrix[4, 4]f32 + +Vertex :: struct #align (4) { + pos: Vec3, + col: Vec3, + uv: Vec2, // texture coordinate +} diff --git a/src/core/obj.odin b/src/core/obj.odin index 41fa720..a8e4b04 100644 --- a/src/core/obj.odin +++ b/src/core/obj.odin @@ -6,6 +6,7 @@ import "core:os" import "core:strconv" import "core:strings" +import "sindri:base" import "sindri:platform" // Minimal OBJ loader: reads v, vt, vn and triangulates convex polygon faces. @@ -14,7 +15,7 @@ import "sindri:platform" load_obj_model :: proc( path: string, ) -> ( - vertices: []platform.Vertex, + vertices: []base.Vertex, indices: []u16, ok: bool, ) { @@ -25,10 +26,10 @@ load_obj_model :: proc( } defer delete(data) - positions: [dynamic]platform.Vec3 - uvs: [dynamic]platform.Vec2 - normals: [dynamic]platform.Vec3 - temp_vertices: [dynamic]platform.Vertex + positions: [dynamic]base.Vec3 + uvs: [dynamic]base.Vec2 + normals: [dynamic]base.Vec3 + temp_vertices: [dynamic]base.Vertex temp_indices: [dynamic]u16 defer { delete(positions) @@ -53,18 +54,18 @@ load_obj_model :: proc( x, _ := strconv.parse_f32(fields[1]) y, _ := strconv.parse_f32(fields[2]) z, _ := strconv.parse_f32(fields[3]) - append(&positions, platform.Vec3{x, y, z}) + append(&positions, base.Vec3{x, y, z}) case "vt": if len(fields) < 3 do continue u, _ := strconv.parse_f32(fields[1]) v, _ := strconv.parse_f32(fields[2]) - append(&uvs, platform.Vec2{u, v}) + append(&uvs, base.Vec2{u, v}) case "vn": if len(fields) < 4 do continue x, _ := strconv.parse_f32(fields[1]) y, _ := strconv.parse_f32(fields[2]) z, _ := strconv.parse_f32(fields[3]) - append(&normals, platform.Vec3{x, y, z}) + append(&normals, base.Vec3{x, y, z}) case "f": face_indices: [dynamic]u16 defer delete(face_indices) @@ -89,7 +90,7 @@ load_obj_model :: proc( vi -= 1 // OBJ indices are 1-based if vi < 0 || vi >= len(positions) do continue - uv := platform.Vec2{0, 0} + uv := base.Vec2{0, 0} if len(vti_str) > 0 { vti, _ := strconv.parse_int(vti_str) vti -= 1 @@ -102,7 +103,7 @@ load_obj_model :: proc( append( &temp_vertices, - platform.Vertex { + base.Vertex { pos = positions[vi], col = {1, 1, 1}, uv = uv, @@ -140,7 +141,7 @@ load_obj_model :: proc( v.pos = (v.pos - center) * scale } - vertices = make([]platform.Vertex, len(temp_vertices)) + vertices = make([]base.Vertex, len(temp_vertices)) indices = make([]u16, len(temp_indices)) copy(vertices, temp_vertices[:]) copy(indices, temp_indices[:]) diff --git a/src/platform/wgpu.odin b/src/platform/wgpu.odin index 3d70735..0ab751e 100644 --- a/src/platform/wgpu.odin +++ b/src/platform/wgpu.odin @@ -14,15 +14,6 @@ import "sindri:base" // ----------------------------------------- // Types -Vec2 :: [2]f32 -Vec3 :: [3]f32 - -Vertex :: struct #align (4) { - pos: Vec3, - col: Vec3, - uv: Vec2, // texture coordinate -} - Camera_Uniform :: struct { mvp: linalg.Matrix4f32, } @@ -247,7 +238,7 @@ frame :: proc "c" () { } // Upload arbitrary vertex/index data to GPU buffers -fill_buffers_with_model :: proc(vertices: []Vertex, indices: []u16) { +fill_buffers_with_model :: proc(vertices: []base.Vertex, indices: []u16) { state.vertex_buffer = wgpu.DeviceCreateBufferWithData( state.device, &{label = "model vertices", usage = {.Vertex}}, @@ -319,7 +310,7 @@ on_device :: proc "c" ( uniforms_struct := to_wgsl_struct(Camera_Uniform, "Uniforms") defer delete(uniforms_struct) vertex_input_struct := to_wgsl_struct( - Vertex, + base.Vertex, "VertexInput", locations = true, ) @@ -423,11 +414,11 @@ on_device :: proc "c" ( // ---------------------------------------- // Buffer shape - vertex_attributes := to_vertex_attributes(Vertex) + vertex_attributes := to_vertex_attributes(base.Vertex) vertex_layout := wgpu.VertexBufferLayout { stepMode = .Vertex, - arrayStride = size_of(Vertex), + arrayStride = size_of(base.Vertex), attributeCount = len(vertex_attributes), attributes = raw_data(vertex_attributes), }