Files
Edit2D/interface.odin
T

130 lines
2.9 KiB
Odin

package edit2d
import im "shared:odin-imgui"
import "core:fmt"
import b2 "vendor:box2d"
/*
This library will only account for box2d's entities editing
It only deals with one world_id, which means typically one level
All the interface follows a pattern
i.e. It takes interface_state pointer and returns a boolean indicating weather the world needs to be reloaded
*/
EditMode :: enum
{
ENTITY,
VERTICES,
OVERVIEW,
CHAIN,
JOINT,
}
interface_state :: struct
{
entity_defs : [dynamic]^engine_entity_def,
entities : [dynamic]^engine_entity,
selected_entity : i32,
world : ^engine_world,
state : ^engine_state,
vertex_index : ^i32,
chain_index : ^i32,
edit_mode : EditMode,
curr_joint_index : i32,
curr_joint_type : b2.JointType,
curr_static_index : static_index_global,
}
interface_get_default :: proc(interface: ^interface_state)
{
interface.selected_entity = 0
interface.vertex_index = new(i32)
interface.vertex_index^ = 0
interface.chain_index = new(i32)
interface.chain_index^ = 0
}
interface_draw_options :: proc(state: ^engine_state) {
debug_draw := &state.draw.debug_draw
im.SliderFloat("Zoom", &state.draw.cam.zoom, 0, 100)
im.Checkbox("Shapes", &debug_draw.drawShapes)
im.Checkbox("Joints", &debug_draw.drawJoints)
im.Checkbox("Joint Extras", &debug_draw.drawJointExtras)
im.Checkbox("Bounds", &debug_draw.drawBounds)
im.Checkbox("Contact Points", &debug_draw.drawContacts)
im.Checkbox("Contact Normals", &debug_draw.drawContactNormals)
im.Checkbox("Contact Inpulses", &debug_draw.drawContactImpulses)
im.Checkbox("Contact Features", &debug_draw.drawContactFeatures)
im.Checkbox("Friction Inpulses", &debug_draw.drawFrictionImpulses)
im.Checkbox("Mass ", &debug_draw.drawMass)
im.Checkbox("Body Names", &debug_draw.drawBodyNames)
im.Checkbox("Graph Colors", &debug_draw.drawGraphColors)
im.Checkbox("Islands ", &debug_draw.drawIslands)
im.SliderFloat("Rotation", &state.draw.cam.rotation, 0, 360)
}
interface_all :: proc(interface: ^interface_state) -> bool
{
ret := false
if interface.selected_entity <0
{
interface.selected_entity = 0
}
if im.Begin("Edit Mode", nil)
{
for type in EditMode
{
if im.RadioButton(fmt.ctprint(type), interface.edit_mode == type)
{
interface.edit_mode = type
}
}
}
im.End()
if im.Begin("Box2d interface")
{
if im.BeginTabBar("Tabs")
{
if im.BeginTabItem("Entity", nil, {.Leading})
{
if interface_entity(interface) do ret = true
im.EndTabItem()
}
if im.BeginTabItem("Joints", nil, {})
{
if interface_joints(interface) do ret = true
im.EndTabItem()
}
if im.BeginTabItem("Draw Options", nil, {})
{
interface_draw_options(interface.state)
im.EndTabItem()
}
im.EndTabBar()
}
}
im.End()
return ret
}