Change Naming Convention, add scroll to microui

This commit is contained in:
SamratGhale
2026-03-28 13:42:24 +05:45
parent a74b46cd64
commit c1b64e9066
12 changed files with 90 additions and 97 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ It's created using folloing tools
1. Odin programming language 1. Odin programming language
2. GLFW for input handling and graphics 2. GLFW for input handling and graphics
3. Dear ImGui for user interfaces 3. Microui for user interfaces
4. Box2d 4. Box2d
## Current Progress ## Current Progress
+1 -1
View File
@@ -174,7 +174,7 @@ DrawPointFcn :: proc "c" (
} }
//After initilizing draw //After initilizing draw
draw_configure_box2d :: proc(state: ^engine_state) draw_configure_box2d :: proc(state: ^Engine_State)
{ {
debug_draw := &state.debug_draw debug_draw := &state.debug_draw
-1
View File
@@ -1566,7 +1566,6 @@ textures_flush :: proc(d: ^Draw)
gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, nil) gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, nil)
} }
gl.Disable(gl.BLEND) gl.Disable(gl.BLEND)
gl.UseProgram(0) gl.UseProgram(0)
+29 -35
View File
@@ -12,6 +12,7 @@ import "shared:odin-imgui/imgui_impl_glfw"
import "shared:odin-imgui/imgui_impl_opengl3" import "shared:odin-imgui/imgui_impl_opengl3"
**/ **/
import "core:fmt"
import gl "vendor:OpenGL" import gl "vendor:OpenGL"
import "vendor:glfw" import "vendor:glfw"
import e2_draw "shared:Edit2D/draw" import e2_draw "shared:Edit2D/draw"
@@ -22,12 +23,13 @@ import mu "vendor:microui"
//Only to be used inside the libarary //Only to be used inside the libarary
__e2d_interal : struct __e2d_interal : struct
{ {
viewport_changed : bool viewport_changed : bool,
mouse_scroll : [2]f64,
} }
engine_state :: struct Engine_State :: struct
{ {
window : glfw.WindowHandle, window : glfw.WindowHandle,
debug_draw : b2.DebugDraw, debug_draw : b2.DebugDraw,
@@ -43,7 +45,7 @@ engine_state :: struct
tex_line : u32, tex_line : u32,
drop_callback : glfw.DropProc, drop_callback : glfw.DropProc,
input : input_state, input : Input_State,
mu_ctx : mu.Context, mu_ctx : mu.Context,
mu_tex : u32, mu_tex : u32,
@@ -51,7 +53,7 @@ engine_state :: struct
MAX_KEYS :: 512 MAX_KEYS :: 512
input_state :: struct Input_State :: struct
{ {
mouse_wheel : [2]f64, mouse_wheel : [2]f64,
mouse : [2]f64, mouse : [2]f64,
@@ -86,7 +88,7 @@ engine_check_types :: proc($Game: typeid)
level_engine_type := reflect.struct_field_by_name(level_map_type.value.id, "engine") level_engine_type := reflect.struct_field_by_name(level_map_type.value.id, "engine")
assert(level_engine_type.is_using, "Should be using engine") assert(level_engine_type.is_using, "Should be using engine")
assert(level_engine_type.type.id == typeid_of(engine_world), "Should be using engine") assert(level_engine_type.type.id == typeid_of(Engine_World), "Should be using engine")
entities_type := reflect.struct_field_by_name(level_map_type.value.id, "entities") entities_type := reflect.struct_field_by_name(level_map_type.value.id, "entities")
entity_defs_type := reflect.struct_field_by_name(level_map_type.value.id, "entity_defs") entity_defs_type := reflect.struct_field_by_name(level_map_type.value.id, "entity_defs")
@@ -104,7 +106,7 @@ engine_check_types :: proc($Game: typeid)
assert(defs_engine.is_using, "Should be using") assert(defs_engine.is_using, "Should be using")
assert(entity_engine.type.id == typeid_of(engine_entity)) assert(entity_engine.type.id == typeid_of(engine_entity))
assert(defs_engine.type.id == typeid_of(engine_entity_def)) assert(defs_engine.type.id == typeid_of(Engine_Entity_Def))
} }
@@ -114,11 +116,16 @@ size_callback :: proc "c" (window: glfw.WindowHandle, width, height : i32)
__e2d_interal.viewport_changed = true __e2d_interal.viewport_changed = true
} }
scroll_callback :: proc "c" (window : glfw.WindowHandle, x, y : f64)
{
__e2d_interal.mouse_scroll = {x, y}
}
/* /*
This will only be called once to initilize the engine This will only be called once to initilize the engine
initilize graphics library, glfw, callbacks initilize graphics library, glfw, callbacks
*/ */
engine_init :: proc($GameType : typeid, state: ^engine_state, font_path : string="") engine_init :: proc($GameType : typeid, state: ^Engine_State, font_path : string="")
{ {
engine_check_types(GameType) engine_check_types(GameType)
@@ -134,9 +141,6 @@ engine_init :: proc($GameType : typeid, state: ^engine_state, font_path : strin
state.window = glfw.CreateWindow(state.width, state.height, state.title, nil, nil) state.window = glfw.CreateWindow(state.width, state.height, state.title, nil, nil)
//gl.DebugMessageControl(gl.DONT_CARE, gl.DONT_CARE, gl.DONT_CARE, 0, nil, gl.TRUE);
assert(state.window != nil) assert(state.window != nil)
glfw.MakeContextCurrent(state.window) glfw.MakeContextCurrent(state.window)
@@ -144,6 +148,7 @@ engine_init :: proc($GameType : typeid, state: ^engine_state, font_path : strin
gl.load_up_to(4, 5, glfw.gl_set_proc_address) gl.load_up_to(4, 5, glfw.gl_set_proc_address)
glfw.SetWindowSizeCallback(state.window, size_callback) glfw.SetWindowSizeCallback(state.window, size_callback)
glfw.SetScrollCallback( state.window, scroll_callback)
state.draw.cam = e2_draw.camera_init() state.draw.cam = e2_draw.camera_init()
@@ -201,9 +206,10 @@ normalize_rect :: proc(rect : mu.Rect, size : i32) -> e2_draw.Rect
} }
update_frame :: proc(state: ^engine_state) update_frame :: proc(state: ^Engine_State)
{ {
state.input.mouse_wheel = {} state.input.mouse_wheel = {}
__e2d_interal.mouse_scroll = {}
glfw.PollEvents() glfw.PollEvents()
keyboard_update(state) keyboard_update(state)
@@ -211,6 +217,9 @@ update_frame :: proc(state: ^engine_state)
x, y:= glfw.GetCursorPos(state.window) x, y:= glfw.GetCursorPos(state.window)
mu.input_mouse_move(&state.mu_ctx, i32(x), i32(y)) mu.input_mouse_move(&state.mu_ctx, i32(x), i32(y))
wheel := __e2d_interal.mouse_scroll
mu.input_scroll(&state.mu_ctx, i32(wheel.x) * 10, i32(wheel.y) * -20)
{ {
for key in key_map for key in key_map
{ {
@@ -221,7 +230,7 @@ update_frame :: proc(state: ^engine_state)
for key in mouse_map for key in mouse_map
{ {
if is_key_pressed(state, key) do mu.input_mouse_down(&state.mu_ctx, i32(x), i32(y), mouse_map[key]) if is_key_pressed(state, key) do mu.input_mouse_down(&state.mu_ctx, i32(x), i32(y), mouse_map[key])
if is_key_released(state, key) do mu.input_mouse_up(&state.mu_ctx,i32(x), i32(y), mouse_map[key]) if is_key_released(state, key) do mu.input_mouse_up( &state.mu_ctx,i32(x), i32(y), mouse_map[key])
} }
} }
@@ -236,21 +245,10 @@ update_frame :: proc(state: ^engine_state)
state.width , state.height = glfw.GetFramebufferSize(state.window) state.width , state.height = glfw.GetFramebufferSize(state.window)
gl.Viewport(0, 0, state.width, state.height) gl.Viewport(0, 0, state.width, state.height)
/*
imgui_impl_opengl3.NewFrame()
imgui_impl_glfw.NewFrame()
im.NewFrame()
*/
} }
end_frame :: proc(state: ^engine_state) end_frame :: proc(state: ^Engine_State)
{ {
/*
im.Render()
imgui_impl_opengl3.RenderDrawData(im.GetDrawData())
*/
//Microui //Microui
fb_x, fb_y := glfw.GetFramebufferSize(state.window) fb_x, fb_y := glfw.GetFramebufferSize(state.window)
@@ -300,27 +298,24 @@ end_frame :: proc(state: ^engine_state)
src_rect = normalize_rect(rect, mu.DEFAULT_ATLAS_WIDTH), src_rect = normalize_rect(rect, mu.DEFAULT_ATLAS_WIDTH),
dst_rect = e2_draw.Rect{f32(c.rect.x), f32(c.rect.y), f32(rect.w), f32(rect.h)}, dst_rect = e2_draw.Rect{f32(c.rect.x), f32(c.rect.y), f32(rect.w), f32(rect.h)},
}) })
} }
} }
} }
} }
cleanup :: proc(state: ^engine_state) cleanup :: proc(state: ^Engine_State)
{ {
//imgui_impl_opengl3.Shutdown() //imgui_impl_opengl3.Shutdown()
//imgui_impl_glfw.Shutdown() //imgui_impl_glfw.Shutdown()
} }
engine_should_close :: proc(state : ^engine_state) -> b32 engine_should_close :: proc(state : ^Engine_State) -> b32
{ {
return glfw.WindowShouldClose(state.window) return glfw.WindowShouldClose(state.window)
} }
keyboard_update :: proc(state: ^engine_state) keyboard_update :: proc(state: ^Engine_State)
{ {
state.input.mouse_prev = state.input.mouse state.input.mouse_prev = state.input.mouse
@@ -341,20 +336,20 @@ keyboard_update :: proc(state: ^engine_state)
} }
} }
is_key_down :: #force_inline proc(state: ^engine_state, key : i32) -> bool{ is_key_down :: #force_inline proc(state: ^Engine_State, key : i32) -> bool{
return state.input.curr[key] return state.input.curr[key]
} }
is_key_pressed :: #force_inline proc(state: ^engine_state, key : i32) -> bool{ is_key_pressed :: #force_inline proc(state: ^Engine_State, key : i32) -> bool{
return state.input.curr[key] && !state.input.prev[key] return state.input.curr[key] && !state.input.prev[key]
} }
is_key_released :: #force_inline proc(state: ^engine_state, key : i32) -> bool{ is_key_released :: #force_inline proc(state: ^Engine_State, key : i32) -> bool{
return !state.input.curr[key] && state.input.prev[key] return !state.input.curr[key] && state.input.prev[key]
} }
draw_flush :: proc(state: ^engine_state) draw_flush :: proc(state: ^Engine_State)
{ {
d := &state.draw d := &state.draw
if __e2d_interal.viewport_changed if __e2d_interal.viewport_changed
@@ -366,7 +361,6 @@ draw_flush :: proc(state: ^engine_state)
d.glyph.height = d.cam.height d.glyph.height = d.cam.height
e2_glyph.glyph_init(&d.glyph, d.font_path) e2_glyph.glyph_init(&d.glyph, d.font_path)
} }
e2_draw.draw_flush(d, __e2d_interal.viewport_changed) e2_draw.draw_flush(d, __e2d_interal.viewport_changed)
+16 -16
View File
@@ -3,9 +3,9 @@ package edit2d
import b2 "vendor:box2d" import b2 "vendor:box2d"
import "core:fmt" import "core:fmt"
static_index :: i32 Static_Index :: i32
static_index_global :: struct Static_Index_Global :: struct
{ {
index : i32, index : i32,
level : string, level : string,
@@ -20,7 +20,7 @@ static_index_global :: struct
*/ */
engine_entity_flags_enum :: enum u64 { Engine_Entity_Flags_Enum :: enum u64 {
POLYGON_IS_BOX, POLYGON_IS_BOX,
MULTI_BODIES, MULTI_BODIES,
CHAIN, CHAIN,
@@ -28,9 +28,9 @@ engine_entity_flags_enum :: enum u64 {
MULTI_SHAPES, MULTI_SHAPES,
} }
engine_entity_flags :: bit_set[engine_entity_flags_enum] Engine_Entity_Flags :: bit_set[Engine_Entity_Flags_Enum]
engine_entity_def :: struct { Engine_Entity_Def :: struct {
body_def : b2.BodyDef, body_def : b2.BodyDef,
shape_def : b2.ShapeDef, shape_def : b2.ShapeDef,
shape_type : b2.ShapeType, shape_type : b2.ShapeType,
@@ -44,9 +44,9 @@ engine_entity_def :: struct {
vertices : [dynamic; b2.MAX_POLYGON_VERTICES]b2.Vec2, vertices : [dynamic; b2.MAX_POLYGON_VERTICES]b2.Vec2,
name_buf : [255]u8 `fmt:"-" cbor:"-"`, name_buf : [255]u8 `fmt:"-" cbor:"-"`,
entity_flags : engine_entity_flags, entity_flags : Engine_Entity_Flags,
index : static_index, index : Static_Index,
//For chain bodies //For chain bodies
//It will replicate itself to the body count and connect themselves with rev_joints //It will replicate itself to the body count and connect themselves with rev_joints
@@ -58,9 +58,9 @@ engine_entity_def :: struct {
link_length_array : [dynamic]b2.Vec2, link_length_array : [dynamic]b2.Vec2,
} }
default_engine_entity_def :: proc() -> engine_entity_def default_engine_entity_def :: proc() -> Engine_Entity_Def
{ {
ret : engine_entity_def ret : Engine_Entity_Def
ret.body_def = b2.DefaultBodyDef() ret.body_def = b2.DefaultBodyDef()
ret.shape_def = b2.DefaultShapeDef() ret.shape_def = b2.DefaultShapeDef()
ret.shape_type = .polygonShape ret.shape_type = .polygonShape
@@ -85,7 +85,7 @@ default_engine_entity_def :: proc() -> engine_entity_def
} }
compare_engine_entity_def :: proc(a, b : engine_entity_def) -> bool compare_engine_entity_def :: proc(a, b : Engine_Entity_Def) -> bool
{ {
ret := false ret := false
@@ -122,14 +122,14 @@ engine_entity :: struct {
bodies : [dynamic]b2.BodyId, bodies : [dynamic]b2.BodyId,
shapes : [dynamic]b2.ShapeId, shapes : [dynamic]b2.ShapeId,
joints : [dynamic]b2.JointId, joints : [dynamic]b2.JointId,
entity_flags : engine_entity_flags, entity_flags : Engine_Entity_Flags,
index : ^static_index, index : ^Static_Index,
joint_id : b2.JointId, joint_id : b2.JointId,
} }
engine_entity_single_body :: proc(def : ^engine_entity_def, world_id: b2.WorldId, index : i32) -> engine_entity engine_entity_single_body :: proc(def : ^Engine_Entity_Def, world_id: b2.WorldId, index : i32) -> engine_entity
{ {
def := def def := def
@@ -139,7 +139,7 @@ engine_entity_single_body :: proc(def : ^engine_entity_def, world_id: b2.WorldId
if def.index != 0 if def.index != 0
{ {
new_entity.index = new(static_index) new_entity.index = new(Static_Index)
new_entity.index^ = def.index new_entity.index^ = def.index
} }
@@ -267,7 +267,7 @@ engine_entity_single_body :: proc(def : ^engine_entity_def, world_id: b2.WorldId
} }
engine_create_chain_shape :: proc( engine_create_chain_shape :: proc(
def : ^engine_entity_def, def : ^Engine_Entity_Def,
world_id : b2.WorldId, world_id : b2.WorldId,
index : i32 index : i32
) -> engine_entity ) -> engine_entity
@@ -308,7 +308,7 @@ engine_create_chain_shape :: proc(
engine_create_entity :: proc( engine_create_entity :: proc(
def : ^engine_entity_def, def : ^Engine_Entity_Def,
world_id : b2.WorldId, world_id : b2.WorldId,
index : i32 index : i32
) -> engine_entity ) -> engine_entity
+1 -1
View File
@@ -9,6 +9,6 @@ game_mode :: enum
engine_game :: struct { engine_game :: struct {
curr_level : string, curr_level : string,
interface : interface_state, interface : Interface_State,
mode : game_mode, mode : game_mode,
} }
+3
View File
@@ -101,6 +101,9 @@ glyph_init :: proc(glyph: ^GlyphState, font_path : string = "")
if !os.exists(font_path) if !os.exists(font_path)
{ {
fmt.eprintln("Font not provided or not exist using default font") fmt.eprintln("Font not provided or not exist using default font")
/* TODO: use microui's font when no font's provided */
font_data := #load("./mononoki-Regular.ttf", []byte) font_data := #load("./mononoki-Regular.ttf", []byte)
stbtt.InitFont(&glyph.font_info, &font_data[0], 0) stbtt.InitFont(&glyph.font_info, &font_data[0], 0)
}else }else
+5 -8
View File
@@ -2,7 +2,6 @@ package edit2d
import b2 "vendor:box2d" import b2 "vendor:box2d"
//import im "shared:odin-imgui" //import im "shared:odin-imgui"
import "core:fmt"
import "vendor:glfw" import "vendor:glfw"
import "base:runtime" import "base:runtime"
import draw "./draw" import draw "./draw"
@@ -46,7 +45,7 @@ import draw "./draw"
*/ */
handle_entity_mode :: proc( handle_entity_mode :: proc(
$E : typeid, $E : typeid,
state : ^engine_state, state : ^Engine_State,
game_data : ^$G, game_data : ^$G,
) -> bool ) -> bool
{ {
@@ -107,7 +106,6 @@ handle_entity_mode :: proc(
ret = true ret = true
} }
else{ else{
//Can only do these actions if a entity is selected //Can only do these actions if a entity is selected
if interface.selected_entity != -1 && len(level.entity_defs) > 0 if interface.selected_entity != -1 && len(level.entity_defs) > 0
{ {
@@ -150,7 +148,6 @@ handle_entity_mode :: proc(
def.scale += f32(state.input.mouse_prev.y / 5) def.scale += f32(state.input.mouse_prev.y / 5)
ret = true ret = true
} }
} }
@@ -162,7 +159,7 @@ handle_entity_mode :: proc(
handle_input :: proc( handle_input :: proc(
$E : typeid, $E : typeid,
state : ^engine_state, state : ^Engine_State,
game_data : ^$G, game_data : ^$G,
) -> bool ) -> bool
{ {
@@ -178,13 +175,13 @@ handle_input :: proc(
if is_key_pressed(state, glfw.KEY_E) if is_key_pressed(state, glfw.KEY_E)
{ {
interface := &game.interface interface := &game.interface
if interface.edit_mode == max(EditMode) if interface.edit_mode == max(Edit_Mode)
{ {
interface.edit_mode = min(EditMode) interface.edit_mode = min(Edit_Mode)
}else }else
{ {
new_val := int(interface.edit_mode) + 1 new_val := int(interface.edit_mode) + 1
interface.edit_mode = EditMode(new_val) interface.edit_mode = Edit_Mode(new_val)
} }
} }
+12 -12
View File
@@ -21,7 +21,7 @@ import b2 "vendor:box2d"
*/ */
Edit_Mode :: enum Edit_Mode :: enum
{ {
ENTITY, ENTITY,
VERTICES, VERTICES,
OVERVIEW, OVERVIEW,
@@ -30,23 +30,23 @@ EditMode :: enum
} }
Interface_State :: struct Interface_State :: struct
{ {
entity_defs : [dynamic]^Engine_Entity_Def, entity_defs : [dynamic]^Engine_Entity_Def,
entities : [dynamic]^engine_entity, entities : [dynamic]^engine_entity,
selected_entity : i32, selected_entity : i32,
world : ^Engine_World, world : ^Engine_World,
state : ^engine_state, state : ^Engine_State,
vertex_index : ^i32, vertex_index : ^i32,
chain_index : ^i32, chain_index : ^i32,
edit_mode : Edit_Mode, edit_mode : Edit_Mode,
curr_joint_index : i32, curr_joint_index : i32,
curr_joint_type : b2.JointType, curr_joint_type : b2.JointType,
curr_static_index : Static_Index_Global, curr_static_index : Static_Index_Global,
} }
@@ -94,7 +94,7 @@ mui_text_height :: proc(font: mu.Font) -> i32
interface_get_default :: proc(interface: ^Interface_State) interface_get_default :: proc(interface: ^Interface_State)
{ {
interface.selected_entity = 0 interface.selected_entity = 0
interface.vertex_index = new(i32) interface.vertex_index = new(i32)
interface.vertex_index^ = 0 interface.vertex_index^ = 0
@@ -126,11 +126,11 @@ interface_draw_options :: proc(state: ^engine_state)
*/ */
mu_interface_game_mode :: proc(state: ^Engine_State, interface: ^Interface_State) mu_interface_game_mode :: proc(state: ^Engine_State, interface: ^Interface_State)
{ {
if mu.begin_window(&state.mu_ctx, "Edit Mode", {1630, 0, 250, 170}) if mu.begin_window(&state.mu_ctx, "Edit Mode", {1630, 0, 250, 170})
{ {
for type in Edit_Mode for type in Edit_Mode
{ {
b : bool = interface.edit_mode == type b : bool = interface.edit_mode == type
if .CHANGE in mu.checkbox(&state.mu_ctx, fmt.tprint(type), &b) do interface.edit_mode = type if .CHANGE in mu.checkbox(&state.mu_ctx, fmt.tprint(type), &b) do interface.edit_mode = type
} }
@@ -139,7 +139,7 @@ mu_interface_game_mode :: proc(state: ^engine_state, interface: ^interface_state
} }
mu_interface_draw_options :: proc(state: ^Engine_State) mu_interface_draw_options :: proc(state: ^Engine_State)
{ {
if mu.begin_window(&state.mu_ctx, "Options", {200, 150, 200, 400}){ if mu.begin_window(&state.mu_ctx, "Options", {200, 150, 200, 400}){
debug_draw := &state.debug_draw debug_draw := &state.debug_draw
@@ -169,7 +169,7 @@ mu_interface_draw_options :: proc(state: ^engine_state)
interface_all :: proc($E: typeid, interface: ^Interface_State, game_data : $G) -> bool interface_all :: proc($E: typeid, interface: ^Interface_State, game_data : $G) -> bool
{ {
ret := false ret := false
if interface.selected_entity <0 if interface.selected_entity <0
{ {
+6 -6
View File
@@ -62,7 +62,7 @@ interface_body_def_editor :: proc(def: ^engine_entity_def)
} }
*/ */
mu_interface_body_def_editor :: proc(interface: ^interface_state, def : ^engine_entity_def) mu_interface_body_def_editor :: proc(interface: ^Interface_State, def : ^Engine_Entity_Def)
{ {
ctx := &interface.state.mu_ctx ctx := &interface.state.mu_ctx
@@ -170,7 +170,7 @@ interface_edit_static_index :: proc(interface:^interface_state, def: ^engine_ent
} }
*/ */
mu_interface_edit_static_index :: proc(interface: ^interface_state, def : ^engine_entity_def) -> bool mu_interface_edit_static_index :: proc(interface: ^Interface_State, def : ^Engine_Entity_Def) -> bool
{ {
curr_index := &interface.curr_static_index curr_index := &interface.curr_static_index
entity := interface.entities[interface.selected_entity] entity := interface.entities[interface.selected_entity]
@@ -192,8 +192,8 @@ mu_interface_edit_static_index :: proc(interface: ^interface_state, def : ^engin
} }
mu_interface_shape_def_editor :: proc( mu_interface_shape_def_editor :: proc(
state : ^engine_state, state : ^Engine_State,
def : ^engine_entity_def) -> bool def : ^Engine_Entity_Def) -> bool
{ {
shape_def := &def.shape_def shape_def := &def.shape_def
@@ -371,7 +371,7 @@ interface_shape_def_editor :: proc(def: ^engine_entity_def) -> bool
} }
*/ */
interface_entity :: proc(interface: ^interface_state) -> bool interface_entity :: proc(interface: ^Interface_State) -> bool
{ {
entity_selected := (interface.selected_entity != -1) && len(interface.entity_defs) > 0 entity_selected := (interface.selected_entity != -1) && len(interface.entity_defs) > 0
@@ -386,7 +386,7 @@ interface_entity :: proc(interface: ^interface_state) -> bool
//interface.edit_mode = .ENTITY //interface.edit_mode = .ENTITY
//Flags //Flags
for flag in engine_entity_flags_enum for flag in Engine_Entity_Flags_Enum
{ {
contains := flag in def.entity_flags contains := flag in def.entity_flags
if .CHANGE in mu.checkbox(ctx, fmt.tprint(flag), &contains) if .CHANGE in mu.checkbox(ctx, fmt.tprint(flag), &contains)
+3 -3
View File
@@ -18,21 +18,21 @@ import draw "./draw"
joint_common :: struct joint_common :: struct
{ {
pivot : [2]f32, pivot : [2]f32,
entity_a, entity_b : static_index, entity_a, entity_b : Static_Index,
bodyIdA, bodyIdB : b2.BodyId, bodyIdA, bodyIdB : b2.BodyId,
} }
revolt_joint_def :: struct revolt_joint_def :: struct
{ {
pivot : [2]f32, pivot : [2]f32,
entity_a, entity_b : static_index, entity_a, entity_b : Static_Index,
using def : b2.RevoluteJointDef, using def : b2.RevoluteJointDef,
} }
distance_joint_def :: struct distance_joint_def :: struct
{ {
pivot : [2]f32, pivot : [2]f32,
entity_a, entity_b : static_index, entity_a, entity_b : Static_Index,
using def : b2.DistanceJointDef, using def : b2.DistanceJointDef,
} }
+12 -12
View File
@@ -18,13 +18,13 @@ import draw "./draw"
A Typical level code A Typical level code
*/ */
engine_world :: struct { Engine_World :: struct {
world_id : b2.WorldId, world_id : b2.WorldId,
//This in engine code? //This in engine code?
static_indexes : map[static_index]int `cbor:"-"`, static_indexes : map[Static_Index]int `cbor:"-"`,
relations : map[^static_index][dynamic]static_index_global `cbor:"-"`, relations : map[^Static_Index][dynamic]Static_Index_Global `cbor:"-"`,
relations_serializeable : map[ static_index][dynamic]static_index_global, relations_serializeable : map[ Static_Index][dynamic]Static_Index_Global,
/* /*
@@ -67,7 +67,7 @@ cbor_flags : cbor.Encoder_Flags :
level_load_from_files :: proc( level_load_from_files :: proc(
$G, $L, $E: typeid, $G, $L, $E: typeid,
game: ^G, game: ^G,
state: ^engine_state state: ^Engine_State
) )
{ {
files, err := os.read_all_directory_by_path("levels", context.allocator) files, err := os.read_all_directory_by_path("levels", context.allocator)
@@ -103,11 +103,11 @@ level_init_from_path :: proc(
$T, $E: typeid, $T, $E: typeid,
level_data : ^T, level_data : ^T,
path : string, path : string,
state: ^engine_state, state: ^Engine_State,
) -> (ret : bool) ) -> (ret : bool)
{ {
level := cast(^engine_world)level_data level := cast(^Engine_World)level_data
if os.is_file(path) if os.is_file(path)
{ {
@@ -118,7 +118,7 @@ level_init_from_path :: proc(
//? //?
level.relations = {} level.relations = {}
level.relations = make(map[^static_index][dynamic]static_index_global) level.relations = make(map[^Static_Index][dynamic]Static_Index_Global)
if len(data) > 0 if len(data) > 0
{ {
@@ -261,10 +261,10 @@ level_reload :: proc($T: typeid, $E: typeid, level: ^T)
If both hash is same the exits If both hash is same the exits
*/ */
level_save_to_file :: proc(level_data: ^$T, state: ^engine_state) level_save_to_file :: proc(level_data: ^$T, state: ^Engine_State)
{ {
level := cast(^engine_world)level_data level := cast(^Engine_World)level_data
level_path := fmt.tprintf("levels/%s.cbor", level.name) level_path := fmt.tprintf("levels/%s.cbor", level.name)
level.cam = state.draw.cam level.cam = state.draw.cam
@@ -370,11 +370,11 @@ level_save_to_file :: proc(level_data: ^$T, state: ^engine_state)
/* /*
The engine assumes that it has attribute entities The engine assumes that it has attribute entities
*/ */
game_to_engine_entities :: proc($Game: typeid, game_data: ^Game, state: ^engine_state) game_to_engine_entities :: proc($Game: typeid, game_data: ^Game, state: ^Engine_State)
{ {
level := &game_data.levels[game_data.curr_level] level := &game_data.levels[game_data.curr_level]
interface : ^interface_state = &game_data.interface interface : ^Interface_State = &game_data.interface
clear(&interface.entities) clear(&interface.entities)
clear(&interface.entity_defs) clear(&interface.entity_defs)