Changed draw.odin, removed DearImgui
This commit is contained in:
+28
-24
@@ -1,10 +1,9 @@
|
|||||||
package edit2d
|
package edit2draw
|
||||||
|
|
||||||
import "base:runtime"
|
import "base:runtime"
|
||||||
import "core:fmt"
|
import "core:fmt"
|
||||||
import "core:math"
|
import "core:math"
|
||||||
import "core:math/linalg"
|
import "core:math/linalg"
|
||||||
import im "shared:odin-imgui"
|
|
||||||
import gl "vendor:OpenGL"
|
import gl "vendor:OpenGL"
|
||||||
import b2 "vendor:box2d"
|
import b2 "vendor:box2d"
|
||||||
import "vendor:glfw"
|
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_reset_view :: proc(camera : ^Camera) {
|
||||||
camera.center = {0, 0}
|
camera.center = {0, 0}
|
||||||
@@ -40,6 +43,7 @@ camera_init :: proc() -> Camera {
|
|||||||
c : Camera = {
|
c : Camera = {
|
||||||
width = 1920,
|
width = 1920,
|
||||||
height = 1080,
|
height = 1080,
|
||||||
|
zoom = 1,
|
||||||
}
|
}
|
||||||
camera_reset_view(&c)
|
camera_reset_view(&c)
|
||||||
return c
|
return c
|
||||||
@@ -1120,7 +1124,6 @@ solid_capsules_flush :: proc(capsule : ^SolidCapsules, cam : ^Camera) {
|
|||||||
|
|
||||||
for count > 0 {
|
for count > 0 {
|
||||||
batch_count := min(count, 2048)
|
batch_count := min(count, 2048)
|
||||||
//fmt.println(size_of(capsules[0]))
|
|
||||||
|
|
||||||
gl.BufferSubData(
|
gl.BufferSubData(
|
||||||
gl.ARRAY_BUFFER,
|
gl.ARRAY_BUFFER,
|
||||||
@@ -1163,6 +1166,7 @@ SolidPolygon :: struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
solid_polygon_create :: proc(polygon : ^SolidPolygon) {
|
solid_polygon_create :: proc(polygon : ^SolidPolygon) {
|
||||||
polygon.program, _ = gl.load_shaders_source(
|
polygon.program, _ = gl.load_shaders_source(
|
||||||
#load("shaders/solid_polygons.vs"),
|
#load("shaders/solid_polygons.vs"),
|
||||||
@@ -1318,6 +1322,7 @@ solid_polygon_add :: proc(
|
|||||||
color : b2.HexColor,
|
color : b2.HexColor,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
||||||
data : PolygonData
|
data : PolygonData
|
||||||
|
|
||||||
data.transform = transform
|
data.transform = transform
|
||||||
@@ -1327,13 +1332,12 @@ solid_polygon_add :: proc(
|
|||||||
ps := cast([^]b2.Vec2)&data.p1
|
ps := cast([^]b2.Vec2)&data.p1
|
||||||
|
|
||||||
for i in 0 ..< count {
|
for i in 0 ..< count {
|
||||||
//fmt.print(points[i])
|
|
||||||
ps[i] = points[i]
|
ps[i] = points[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
data.count = n
|
data.count = n
|
||||||
data.radius = f32(radius)
|
data.radius = f32(radius)
|
||||||
data.color = make_rgba(color, 1.0)
|
data.color = make_rgba(color, 1.0)
|
||||||
|
|
||||||
append(&polygon.polygons, data)
|
append(&polygon.polygons, data)
|
||||||
}
|
}
|
||||||
@@ -1348,18 +1352,17 @@ solid_polygon_flush :: proc(polygon : ^SolidPolygon, cam : ^Camera) {
|
|||||||
|
|
||||||
gl.UseProgram(polygon.program)
|
gl.UseProgram(polygon.program)
|
||||||
|
|
||||||
|
|
||||||
proj := camera_build_project_matrix(cam, 0.2)
|
proj := camera_build_project_matrix(cam, 0.2)
|
||||||
|
|
||||||
gl.UniformMatrix4fv(
|
//proj := linalg.MATRIX4F32_IDENTITY
|
||||||
polygon.uniforms["projectionMatrix"].location,
|
|
||||||
1,
|
gl.UniformMatrix4fv(polygon.uniforms["projectionMatrix"].location, 1, gl.FALSE, &proj[0][0])
|
||||||
gl.FALSE,
|
gl.Uniform1f(polygon.uniforms["pixelScale"].location, f32(cam.height) / cam.zoom)
|
||||||
&proj[0][0],
|
/*
|
||||||
)
|
gl.UniformMatrix4fv(polygon.uniforms["projectionMatrix"].location, 1, gl.FALSE, &proj[0][0])
|
||||||
gl.Uniform1f(
|
gl.Uniform1f(polygon.uniforms["pixelScale"].location, 0.001)
|
||||||
polygon.uniforms["pixelScale"].location,
|
*/
|
||||||
f32(cam.height) / cam.zoom,
|
|
||||||
)
|
|
||||||
|
|
||||||
gl.BindVertexArray(polygon.vao)
|
gl.BindVertexArray(polygon.vao)
|
||||||
|
|
||||||
@@ -1372,18 +1375,14 @@ solid_polygon_flush :: proc(polygon : ^SolidPolygon, cam : ^Camera) {
|
|||||||
for count > 0 {
|
for count > 0 {
|
||||||
batch_count := min(count, batch_size)
|
batch_count := min(count, batch_size)
|
||||||
|
|
||||||
gl.BufferSubData(
|
gl.BufferSubData(gl.ARRAY_BUFFER, 0, int(batch_count * size_of(PolygonData)), &polygon.polygons[base])
|
||||||
gl.ARRAY_BUFFER,
|
|
||||||
0,
|
|
||||||
int(batch_count * size_of(PolygonData)),
|
|
||||||
&polygon.polygons[base],
|
|
||||||
)
|
|
||||||
gl.DrawArraysInstanced(gl.TRIANGLES, 0, 6, batch_count)
|
gl.DrawArraysInstanced(gl.TRIANGLES, 0, 6, batch_count)
|
||||||
|
|
||||||
check_opengl()
|
check_opengl()
|
||||||
|
|
||||||
count -= batch_size
|
count -= batch_size
|
||||||
base += batch_size
|
base += batch_size
|
||||||
}
|
}
|
||||||
|
|
||||||
gl.Disable(gl.BLEND)
|
gl.Disable(gl.BLEND)
|
||||||
@@ -1408,7 +1407,7 @@ Draw :: struct {
|
|||||||
solid_capsules : SolidCapsules,
|
solid_capsules : SolidCapsules,
|
||||||
polygons : SolidPolygon,
|
polygons : SolidPolygon,
|
||||||
drawCounters : bool,
|
drawCounters : bool,
|
||||||
regular_font : im.Font,
|
//regular_font : im.Font,
|
||||||
frame_buffer : u32,
|
frame_buffer : u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1562,14 +1561,18 @@ DrawPointFcn :: proc "c" (
|
|||||||
|
|
||||||
DrawString :: proc(draw : ^Draw, x, y : int, str: cstring)
|
DrawString :: proc(draw : ^Draw, x, y : int, str: cstring)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
draw_list := im.GetForegroundDrawList()
|
draw_list := im.GetForegroundDrawList()
|
||||||
im.DrawList_AddText(draw_list, {f32(x), f32(y)},im.GetColorU32(.Text), str)
|
im.DrawList_AddText(draw_list, {f32(x), f32(y)},im.GetColorU32(.Text), str)
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawStringVec :: proc(draw : ^Draw, p : b2.Vec2, str: cstring)
|
DrawStringVec :: proc(draw : ^Draw, p : b2.Vec2, str: cstring)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
ps := camera_convert_world_to_screen(&draw.cam, p)
|
ps := camera_convert_world_to_screen(&draw.cam, p)
|
||||||
im.DrawList_AddText(im.GetForegroundDrawList(), ps,im.GetColorU32(.Text), str)
|
im.DrawList_AddText(im.GetForegroundDrawList(), ps,im.GetColorU32(.Text), str)
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawStringFcn :: proc "c" (
|
DrawStringFcn :: proc "c" (
|
||||||
@@ -1607,6 +1610,7 @@ draw_create :: proc(draw : ^Draw, camera : ^Camera) {
|
|||||||
circle_create(&draw.circles)
|
circle_create(&draw.circles)
|
||||||
solid_circle_create(&draw.solid_circles)
|
solid_circle_create(&draw.solid_circles)
|
||||||
solid_polygon_create(&draw.polygons)
|
solid_polygon_create(&draw.polygons)
|
||||||
|
check_opengl()
|
||||||
|
|
||||||
|
|
||||||
bounds : b2.AABB = {{-max(f32), -max(f32)}, {max(f32), max(f32)}}
|
bounds : b2.AABB = {{-max(f32), -max(f32)}, {max(f32), max(f32)}}
|
||||||
+9
-4
@@ -8,8 +8,8 @@ import im "shared:odin-imgui"
|
|||||||
import "shared:odin-imgui/imgui_impl_glfw"
|
import "shared:odin-imgui/imgui_impl_glfw"
|
||||||
import "shared:odin-imgui/imgui_impl_opengl3"
|
import "shared:odin-imgui/imgui_impl_opengl3"
|
||||||
import gl "vendor:OpenGL"
|
import gl "vendor:OpenGL"
|
||||||
import "core:fmt"
|
|
||||||
import "vendor:glfw"
|
import "vendor:glfw"
|
||||||
|
import draw "shared:Edit2D/draw"
|
||||||
import "core:reflect"
|
import "core:reflect"
|
||||||
|
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ import "core:reflect"
|
|||||||
engine_state :: struct
|
engine_state :: struct
|
||||||
{
|
{
|
||||||
window : glfw.WindowHandle,
|
window : glfw.WindowHandle,
|
||||||
draw : Draw,
|
draw : draw.Draw,
|
||||||
restart, pause : bool,
|
restart, pause : bool,
|
||||||
substep_count : u32,
|
substep_count : u32,
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ engine_init :: proc($GameType : typeid, state: ^engine_state)
|
|||||||
imgui_impl_glfw.InitForOpenGL(state.window, true)
|
imgui_impl_glfw.InitForOpenGL(state.window, true)
|
||||||
imgui_impl_opengl3.Init("#version 150")
|
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)
|
display_w, display_h := glfw.GetFramebufferSize(state.window)
|
||||||
state.draw.cam.width = display_w
|
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.cam.zoom = 15
|
||||||
state.draw.show_ui = true
|
state.draw.show_ui = true
|
||||||
|
|
||||||
draw_create(&state.draw, &state.draw.cam)
|
draw.draw_create(&state.draw, &state.draw.cam)
|
||||||
|
|
||||||
cbor.tag_register_type({
|
cbor.tag_register_type({
|
||||||
marshal = proc(_: ^cbor.Tag_Implementation, e: cbor.Encoder, v: any) -> cbor.Marshal_Error {
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -4,6 +4,7 @@ import b2 "vendor:box2d"
|
|||||||
import im "shared:odin-imgui"
|
import im "shared:odin-imgui"
|
||||||
import "vendor:glfw"
|
import "vendor:glfw"
|
||||||
import "base:runtime"
|
import "base:runtime"
|
||||||
|
import draw "./draw"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Handling input
|
Handling input
|
||||||
@@ -67,7 +68,7 @@ handle_entity_mode :: proc(
|
|||||||
interface := &game.interface
|
interface := &game.interface
|
||||||
level := &game_data.levels[game.curr_level]
|
level := &game_data.levels[game.curr_level]
|
||||||
input := &state.input
|
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
|
//Setlect entity
|
||||||
if is_key_pressed(state, glfw.MOUSE_BUTTON_LEFT)
|
if is_key_pressed(state, glfw.MOUSE_BUTTON_LEFT)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package edit2d
|
|||||||
import b2 "vendor:box2d"
|
import b2 "vendor:box2d"
|
||||||
import im "shared:odin-imgui"
|
import im "shared:odin-imgui"
|
||||||
import "core:slice"
|
import "core:slice"
|
||||||
|
import draw "./draw"
|
||||||
import "core:fmt"
|
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)
|
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)
|
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)
|
im.SliderFloat2("Linear velocity", &def.body_def.linearVelocity, 0, 500)
|
||||||
|
|||||||
+11
-10
@@ -3,6 +3,7 @@ package edit2d
|
|||||||
import "core:fmt"
|
import "core:fmt"
|
||||||
import b2 "vendor:box2d"
|
import b2 "vendor:box2d"
|
||||||
import im "shared:odin-imgui"
|
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{
|
if joint_def.entity_a in level.static_indexes{
|
||||||
entity_a := interface.entity_defs[level.static_indexes[joint_def.entity_a]]
|
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{
|
if joint_def.entity_b in level.static_indexes{
|
||||||
entity_b := interface.entity_defs[level.static_indexes[joint_def.entity_b]]
|
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("localAnchorA", &joint_def.localAnchorA, -5, 5)
|
||||||
im.SliderFloat2("localAnchorB", &joint_def.localAnchorB, -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)
|
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)
|
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.Checkbox("Enable Spring", &joint_def.enableSpring)
|
||||||
im.InputFloat("Hertz ", &joint_def.hertz)
|
im.InputFloat("Hertz ", &joint_def.hertz)
|
||||||
im.InputFloat("Damping Ratio", &joint_def.dampingRatio)
|
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)
|
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)
|
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)
|
im.InputFloat("Max Motor Limit", &joint_def.maxMotorTorque)
|
||||||
|
|||||||
+2
-1
@@ -9,6 +9,7 @@ import "core:time"
|
|||||||
import b2 "vendor:box2d"
|
import b2 "vendor:box2d"
|
||||||
import "core:fmt"
|
import "core:fmt"
|
||||||
import "core:encoding/cbor"
|
import "core:encoding/cbor"
|
||||||
|
import draw "./draw"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The engine can provide helper functions so that it'll be easier to write
|
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,
|
revolute_joint_defs : [dynamic]revolt_joint_def,
|
||||||
distant_joint_defs : [dynamic]distance_joint_def,
|
distant_joint_defs : [dynamic]distance_joint_def,
|
||||||
joints : [dynamic]b2.JointId `cbor:"-"`,
|
joints : [dynamic]b2.JointId `cbor:"-"`,
|
||||||
cam : Camera,
|
cam : draw.Camera,
|
||||||
name : string,
|
name : string,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user