diff --git a/draw.odin b/draw/draw.odin similarity index 97% rename from draw.odin rename to draw/draw.odin index 060169a..9d162e0 100644 --- a/draw.odin +++ b/draw/draw.odin @@ -1,10 +1,9 @@ -package edit2d +package edit2draw import "base:runtime" import "core:fmt" import "core:math" import "core:math/linalg" -import im "shared:odin-imgui" import gl "vendor:OpenGL" import b2 "vendor:box2d" import "vendor:glfw" @@ -29,6 +28,10 @@ make_rgba :: proc(color : b2.HexColor, alpha : f32) -> RGBA8 { } } +make_hex_color :: proc(rgba: RGBA8) -> b2.HexColor { + return b2.HexColor((u32(rgba.r) << 16) | (u32(rgba.g) << 8) | u32(rgba.b)) +} + camera_reset_view :: proc(camera : ^Camera) { camera.center = {0, 0} @@ -40,6 +43,7 @@ camera_init :: proc() -> Camera { c : Camera = { width = 1920, height = 1080, + zoom = 1, } camera_reset_view(&c) return c @@ -1120,7 +1124,6 @@ solid_capsules_flush :: proc(capsule : ^SolidCapsules, cam : ^Camera) { for count > 0 { batch_count := min(count, 2048) - //fmt.println(size_of(capsules[0])) gl.BufferSubData( gl.ARRAY_BUFFER, @@ -1163,6 +1166,7 @@ SolidPolygon :: struct { } + solid_polygon_create :: proc(polygon : ^SolidPolygon) { polygon.program, _ = gl.load_shaders_source( #load("shaders/solid_polygons.vs"), @@ -1318,6 +1322,7 @@ solid_polygon_add :: proc( color : b2.HexColor, ) { + data : PolygonData data.transform = transform @@ -1327,13 +1332,12 @@ solid_polygon_add :: proc( ps := cast([^]b2.Vec2)&data.p1 for i in 0 ..< count { - //fmt.print(points[i]) ps[i] = points[i] } - data.count = n + data.count = n data.radius = f32(radius) - data.color = make_rgba(color, 1.0) + data.color = make_rgba(color, 1.0) append(&polygon.polygons, data) } @@ -1348,18 +1352,17 @@ solid_polygon_flush :: proc(polygon : ^SolidPolygon, cam : ^Camera) { gl.UseProgram(polygon.program) + proj := camera_build_project_matrix(cam, 0.2) - gl.UniformMatrix4fv( - polygon.uniforms["projectionMatrix"].location, - 1, - gl.FALSE, - &proj[0][0], - ) - gl.Uniform1f( - polygon.uniforms["pixelScale"].location, - f32(cam.height) / cam.zoom, - ) + //proj := linalg.MATRIX4F32_IDENTITY + + gl.UniformMatrix4fv(polygon.uniforms["projectionMatrix"].location, 1, gl.FALSE, &proj[0][0]) + gl.Uniform1f(polygon.uniforms["pixelScale"].location, f32(cam.height) / cam.zoom) + /* + gl.UniformMatrix4fv(polygon.uniforms["projectionMatrix"].location, 1, gl.FALSE, &proj[0][0]) + gl.Uniform1f(polygon.uniforms["pixelScale"].location, 0.001) + */ gl.BindVertexArray(polygon.vao) @@ -1372,18 +1375,14 @@ solid_polygon_flush :: proc(polygon : ^SolidPolygon, cam : ^Camera) { for count > 0 { batch_count := min(count, batch_size) - gl.BufferSubData( - gl.ARRAY_BUFFER, - 0, - int(batch_count * size_of(PolygonData)), - &polygon.polygons[base], - ) + gl.BufferSubData(gl.ARRAY_BUFFER, 0, int(batch_count * size_of(PolygonData)), &polygon.polygons[base]) + gl.DrawArraysInstanced(gl.TRIANGLES, 0, 6, batch_count) check_opengl() count -= batch_size - base += batch_size + base += batch_size } gl.Disable(gl.BLEND) @@ -1408,7 +1407,7 @@ Draw :: struct { solid_capsules : SolidCapsules, polygons : SolidPolygon, drawCounters : bool, - regular_font : im.Font, + //regular_font : im.Font, frame_buffer : u32, } @@ -1562,14 +1561,18 @@ DrawPointFcn :: proc "c" ( DrawString :: proc(draw : ^Draw, x, y : int, str: cstring) { + /* draw_list := im.GetForegroundDrawList() im.DrawList_AddText(draw_list, {f32(x), f32(y)},im.GetColorU32(.Text), str) + */ } DrawStringVec :: proc(draw : ^Draw, p : b2.Vec2, str: cstring) { + /* ps := camera_convert_world_to_screen(&draw.cam, p) im.DrawList_AddText(im.GetForegroundDrawList(), ps,im.GetColorU32(.Text), str) + */ } DrawStringFcn :: proc "c" ( @@ -1607,6 +1610,7 @@ draw_create :: proc(draw : ^Draw, camera : ^Camera) { circle_create(&draw.circles) solid_circle_create(&draw.solid_circles) solid_polygon_create(&draw.polygons) + check_opengl() bounds : b2.AABB = {{-max(f32), -max(f32)}, {max(f32), max(f32)}} diff --git a/shaders/background.fs b/draw/shaders/background.fs similarity index 100% rename from shaders/background.fs rename to draw/shaders/background.fs diff --git a/shaders/background.vs b/draw/shaders/background.vs similarity index 100% rename from shaders/background.vs rename to draw/shaders/background.vs diff --git a/shaders/circle.fs b/draw/shaders/circle.fs similarity index 100% rename from shaders/circle.fs rename to draw/shaders/circle.fs diff --git a/shaders/circle.vs b/draw/shaders/circle.vs similarity index 100% rename from shaders/circle.vs rename to draw/shaders/circle.vs diff --git a/shaders/solid_capsule.fs b/draw/shaders/solid_capsule.fs similarity index 100% rename from shaders/solid_capsule.fs rename to draw/shaders/solid_capsule.fs diff --git a/shaders/solid_capsule.vs b/draw/shaders/solid_capsule.vs similarity index 100% rename from shaders/solid_capsule.vs rename to draw/shaders/solid_capsule.vs diff --git a/shaders/solid_circle.fs b/draw/shaders/solid_circle.fs similarity index 100% rename from shaders/solid_circle.fs rename to draw/shaders/solid_circle.fs diff --git a/shaders/solid_circle.vs b/draw/shaders/solid_circle.vs similarity index 100% rename from shaders/solid_circle.vs rename to draw/shaders/solid_circle.vs diff --git a/shaders/solid_polygons.fs b/draw/shaders/solid_polygons.fs similarity index 100% rename from shaders/solid_polygons.fs rename to draw/shaders/solid_polygons.fs diff --git a/shaders/solid_polygons.vs b/draw/shaders/solid_polygons.vs similarity index 100% rename from shaders/solid_polygons.vs rename to draw/shaders/solid_polygons.vs diff --git a/edit2d.odin b/edit2d.odin index 1457b39..4929d4a 100644 --- a/edit2d.odin +++ b/edit2d.odin @@ -8,8 +8,8 @@ import im "shared:odin-imgui" import "shared:odin-imgui/imgui_impl_glfw" import "shared:odin-imgui/imgui_impl_opengl3" import gl "vendor:OpenGL" -import "core:fmt" import "vendor:glfw" +import draw "shared:Edit2D/draw" import "core:reflect" @@ -17,7 +17,7 @@ import "core:reflect" engine_state :: struct { window : glfw.WindowHandle, - draw : Draw, + draw : draw.Draw, restart, pause : bool, substep_count : u32, @@ -139,7 +139,7 @@ engine_init :: proc($GameType : typeid, state: ^engine_state) imgui_impl_glfw.InitForOpenGL(state.window, true) imgui_impl_opengl3.Init("#version 150") - state.draw.cam = camera_init() + state.draw.cam = draw.camera_init() display_w, display_h := glfw.GetFramebufferSize(state.window) state.draw.cam.width = display_w @@ -147,7 +147,7 @@ engine_init :: proc($GameType : typeid, state: ^engine_state) state.draw.cam.zoom = 15 state.draw.show_ui = true - draw_create(&state.draw, &state.draw.cam) + draw.draw_create(&state.draw, &state.draw.cam) cbor.tag_register_type({ marshal = proc(_: ^cbor.Tag_Implementation, e: cbor.Encoder, v: any) -> cbor.Marshal_Error { @@ -236,6 +236,11 @@ is_key_released :: #force_inline proc(state: ^engine_state, key : i32) -> bool{ } +draw_flush :: proc(d: ^draw.Draw) +{ + draw.draw_flush(d) +} + diff --git a/handle_input.odin b/handle_input.odin index 5fa23b0..86dd9e4 100644 --- a/handle_input.odin +++ b/handle_input.odin @@ -4,6 +4,7 @@ import b2 "vendor:box2d" import im "shared:odin-imgui" import "vendor:glfw" import "base:runtime" +import draw "./draw" /* Handling input @@ -67,7 +68,7 @@ handle_entity_mode :: proc( interface := &game.interface level := &game_data.levels[game.curr_level] input := &state.input - mpos := camera_convert_screen_to_world(&state.draw.cam, input.mouse) + mpos := draw.camera_convert_screen_to_world(&state.draw.cam, input.mouse) //Setlect entity if is_key_pressed(state, glfw.MOUSE_BUTTON_LEFT) diff --git a/interface_entity.odin b/interface_entity.odin index 0958f11..07f0c6c 100644 --- a/interface_entity.odin +++ b/interface_entity.odin @@ -3,6 +3,7 @@ package edit2d import b2 "vendor:box2d" import im "shared:odin-imgui" import "core:slice" +import draw "./draw" import "core:fmt" @@ -38,11 +39,11 @@ interface_body_def_editor :: proc(def: ^engine_entity_def) im.SliderFloat2("Position", &def.body_def.position, -50, 50) - angle := RAD2DEG * b2.Rot_GetAngle(def.body_def.rotation) + angle := draw.RAD2DEG * b2.Rot_GetAngle(def.body_def.rotation) if im.SliderFloat("Rotation", &angle, 0, 359) { - def.body_def.rotation = b2.MakeRot(DEG2RAD * angle) + def.body_def.rotation = b2.MakeRot(draw.DEG2RAD * angle) } im.SliderFloat2("Linear velocity", &def.body_def.linearVelocity, 0, 500) diff --git a/interface_joints.odin b/interface_joints.odin index c1fd695..92ba12c 100644 --- a/interface_joints.odin +++ b/interface_joints.odin @@ -3,6 +3,7 @@ package edit2d import "core:fmt" import b2 "vendor:box2d" import im "shared:odin-imgui" +import draw "./draw" /* @@ -41,11 +42,11 @@ interface_edit_joint_common :: proc(joint_def : ^joint_common, interface: ^inter { if joint_def.entity_a in level.static_indexes{ entity_a := interface.entity_defs[level.static_indexes[joint_def.entity_a]] - points_add(&interface.state.draw.points, entity_a.body_def.position, 20.0, b2.HexColor.Plum) + draw.points_add(&interface.state.draw.points, entity_a.body_def.position, 20.0, b2.HexColor.Plum) } if joint_def.entity_b in level.static_indexes{ entity_b := interface.entity_defs[level.static_indexes[joint_def.entity_b]] - points_add(&interface.state.draw.points, entity_b.body_def.position, 20.0, b2.HexColor.Plum) + draw.points_add(&interface.state.draw.points, entity_b.body_def.position, 20.0, b2.HexColor.Plum) } } @@ -154,34 +155,34 @@ interface_edit_rev_joint_minimal :: proc(joint_def: ^b2.RevoluteJointDef) im.SliderFloat2("localAnchorA", &joint_def.localAnchorA, -5, 5) im.SliderFloat2("localAnchorB", &joint_def.localAnchorB, -5, 5) - reference_angle := RAD2DEG * joint_def.referenceAngle + reference_angle := draw.RAD2DEG * joint_def.referenceAngle if im.SliderFloat("Reference Angle", &reference_angle, 0, 359) { - joint_def.referenceAngle = DEG2RAD * reference_angle + joint_def.referenceAngle = draw.DEG2RAD * reference_angle } - target_angle := RAD2DEG * joint_def.targetAngle + target_angle := draw.RAD2DEG * joint_def.targetAngle if im.SliderFloat("Target Angle", &target_angle, 0, 359) { - joint_def.targetAngle = DEG2RAD * target_angle + joint_def.targetAngle = draw.DEG2RAD * target_angle } im.Checkbox("Enable Spring", &joint_def.enableSpring) im.InputFloat("Hertz ", &joint_def.hertz) im.InputFloat("Damping Ratio", &joint_def.dampingRatio) - lower_angle := RAD2DEG * joint_def.lowerAngle + lower_angle := draw.RAD2DEG * joint_def.lowerAngle if im.SliderFloat("Lower Angle", &lower_angle, 0, 359) { - joint_def.lowerAngle = DEG2RAD * lower_angle + joint_def.lowerAngle = draw.DEG2RAD * lower_angle } - upper_angle := RAD2DEG * joint_def.upperAngle + upper_angle := draw.RAD2DEG * joint_def.upperAngle if im.SliderFloat("Upper Angle", &upper_angle, 0, 359) { - joint_def.upperAngle = DEG2RAD * upper_angle + joint_def.upperAngle = draw.DEG2RAD * upper_angle } im.InputFloat("Max Motor Limit", &joint_def.maxMotorTorque) diff --git a/level.odin b/level.odin index 730ef34..1830528 100644 --- a/level.odin +++ b/level.odin @@ -9,6 +9,7 @@ import "core:time" import b2 "vendor:box2d" import "core:fmt" import "core:encoding/cbor" +import draw "./draw" /* The engine can provide helper functions so that it'll be easier to write @@ -35,7 +36,7 @@ engine_world :: struct { revolute_joint_defs : [dynamic]revolt_joint_def, distant_joint_defs : [dynamic]distance_joint_def, joints : [dynamic]b2.JointId `cbor:"-"`, - cam : Camera, + cam : draw.Camera, name : string, } diff --git a/misc.odin b/misc.odin index a5eeb7e..c4ef2bc 100644 --- a/misc.odin +++ b/misc.odin @@ -1,6 +1,6 @@ package edit2d -import "core:slice" +import "core:slice" import b2 "vendor:box2d"