OSX KeyCode translation table, fixed rendering bug

This commit is contained in:
Peter Slattery 2022-04-16 05:14:55 -07:00
parent 4ef76dacbe
commit b680f90c24
12 changed files with 198 additions and 23 deletions

View File

@ -1,3 +1,3 @@
SCRIPT_REL_DIR=$(dirname "${BASH_SOURCE[0]}") SCRIPT_REL_DIR=$(dirname "${BASH_SOURCE[0]}")
$SCRIPT_REL_DIR/build_.sh debug osx arm64 $SCRIPT_REL_DIR/build_.sh debug osx intel
# $SCRIPT_REL_DIR/build_.sh debug wasm intel # $SCRIPT_REL_DIR/build_.sh debug wasm intel

Binary file not shown.

Binary file not shown.

View File

@ -168,6 +168,15 @@ input_state_create(Allocator* a)
Input_State* result = allocator_alloc_struct(a, Input_State); Input_State* result = allocator_alloc_struct(a, Input_State);
result->frame_hot = result->frames + 0; result->frame_hot = result->frames + 0;
result->frame_cold = result->frames + 1; result->frame_cold = result->frames + 1;
// Clear the new hot input frame
Key_Flags* hot_key_flags = result->frame_hot->key_flags;
Key_Flags* cold_key_flags = result->frame_cold->key_flags;
for (u32 i = 0; i < KeyCode_Count; i++)
{
hot_key_flags[i] = 0;
cold_key_flags[i] = 0;
}
return result; return result;
} }

View File

@ -69,7 +69,7 @@ void geometry_buffer_update(Geometry_Buffer* buffer, r32* verts, u32 verts_offse
// Shaders // Shaders
void geometry_bind(Geometry_Buffer geo); void geometry_bind(Geometry_Buffer geo);
void shader_bind(Shader shader); void shader_bind(Shader shader);
void geometry_drawi(Geometry_Buffer geo, u32 indices); void geometry_drawi(Geometry_Buffer geo, u32 indices, u32 offset);
void geometry_draw(Geometry_Buffer geo); void geometry_draw(Geometry_Buffer geo);
void vertex_attrib_pointer(Geometry_Buffer geo, Shader shader, u32 count, u32 attr_index, u32 stride, u32 offset); void vertex_attrib_pointer(Geometry_Buffer geo, Shader shader, u32 count, u32 attr_index, u32 stride, u32 offset);
void set_uniform(Shader shader, u32 index, m44 u); void set_uniform(Shader shader, u32 index, m44 u);
@ -282,14 +282,14 @@ shader_bind(Shader shader)
} }
void void
geometry_drawi(Geometry_Buffer geo, u32 indices){ geometry_drawi(Geometry_Buffer geo, u32 indices, u32 offset){
glDrawElements(GL_TRIANGLES, indices, GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, indices, GL_UNSIGNED_INT, (void*)(offset * sizeof(u32)));
os_gl_no_error(); os_gl_no_error();
} }
void void
geometry_draw(Geometry_Buffer geo){ geometry_draw(Geometry_Buffer geo){
geometry_drawi(geo, geo.indices_len); geometry_drawi(geo, geo.indices_len, 0);
} }
void vertex_attrib_pointer(Geometry_Buffer geo, Shader shader, GLuint count, GLuint attr_index, GLuint stride, GLuint offset){ void vertex_attrib_pointer(Geometry_Buffer geo, Shader shader, GLuint count, GLuint attr_index, GLuint stride, GLuint offset){

View File

@ -266,11 +266,17 @@ ed_sculpture_updated(App_State* state, r32 scale, r32 led_size)
} }
ed->sculpture_geo = geometry_buffer_create( ed->sculpture_geo = geometry_buffer_create(
geo.buffer_vertex.values, geo.buffer_vertex.values,
geo.buffer_vertex.len, geo.buffer_vertex.len * geo.buffer_vertex.stride,
geo.buffer_index.values, geo.buffer_index.values,
geo.buffer_index.len geo.buffer_index.len
); );
for (u32 i = 0; i < 6; i++)
{
u32 index = geo.buffer_index.values[1008 + i];
r32* values = geo.buffer_vertex.values + (index * 5);
printf("%d -> %f %f %f, %f %f\n", index, values[0], values[1], values[2], values[3], values[4]);
}
vertex_attrib_pointer(ed->sculpture_geo, ed->sculpture_shd, 3, ed->sculpture_shd.attrs[0], 5, 0); vertex_attrib_pointer(ed->sculpture_geo, ed->sculpture_shd, 3, ed->sculpture_shd.attrs[0], 5, 0);
vertex_attrib_pointer(ed->sculpture_geo, ed->sculpture_shd, 2, ed->sculpture_shd.attrs[1], 5, 3); vertex_attrib_pointer(ed->sculpture_geo, ed->sculpture_shd, 2, ed->sculpture_shd.attrs[1], 5, 3);
@ -278,7 +284,7 @@ ed_sculpture_updated(App_State* state, r32 scale, r32 led_size)
// TODO(PS): map leds to pixels // TODO(PS): map leds to pixels
if (ed->sculpture_tex.w != 0) if (ed->sculpture_tex.w != 0)
{ {
invalid_code_path; invalid_code_path;
// TODO(PS): destroy the old texture // TODO(PS): destroy the old texture
} }

View File

@ -14,12 +14,32 @@ ed_sculpture_visualizer_init(App_State* state)
} }
r32 cam_theta = 0; r32 cam_theta = 0;
u32 offset = 0;
internal void internal void
ed_sculpture_visualizer(App_State* state) ed_sculpture_visualizer(App_State* state)
{ {
Editor* ed = state->editor; Editor* ed = state->editor;
Input_State* in = state->input_state;
u32 delta = 1;
if (input_key_is_down(in, KeyCode_LeftShift) || input_key_is_down(in, KeyCode_RightShift))
{
delta = 100;
}
if (input_key_went_down(in, KeyCode_UpArrow))
{
offset += delta;
printf("%d\n", offset);
}
if (input_key_went_down(in, KeyCode_DownArrow))
{
offset -= delta;
printf("%d\n", offset);
}
offset = clamp(0, offset, ed->sculpture_geo.indices_len);
// Set the viewport to the current layout's region so that the sculpture // Set the viewport to the current layout's region so that the sculpture
// never overlaps any other ui elements // never overlaps any other ui elements
UI_Layout l = *ed->ui.layout; UI_Layout l = *ed->ui.layout;
@ -52,7 +72,7 @@ ed_sculpture_visualizer(App_State* state)
u32 j = 2868; u32 j = 2868;
u32 k = ed->sculpture_geo.indices_len; u32 k = ed->sculpture_geo.indices_len;
u32 h = (i * 6) + 3; u32 h = (i * 6) + 3;
geometry_drawi(ed->sculpture_geo, k); geometry_drawi(ed->sculpture_geo, k, 0);
// reset the viewport for all other rendering // reset the viewport for all other rendering
v2 wds = HMM_MultiplyVec2(ed->window_dim, ed->content_scale); v2 wds = HMM_MultiplyVec2(ed->window_dim, ed->content_scale);

View File

@ -29,7 +29,7 @@ ui_create(u32 widget_pool_cap, u32 verts_cap, Input_State* input, Allocator* a)
result.per_frame_buffer = geometry_buffer_create( result.per_frame_buffer = geometry_buffer_create(
result.geo.buffer_vertex.values, result.geo.buffer_vertex.values,
result.geo.buffer_vertex.cap, result.geo.buffer_vertex.cap * result.geo.buffer_vertex.stride,
result.geo.buffer_index.values, result.geo.buffer_index.values,
result.geo.buffer_index.cap result.geo.buffer_index.cap
); );
@ -225,7 +225,7 @@ ui_draw(UI* ui)
set_uniform(ui->shader, 0, ui->proj); set_uniform(ui->shader, 0, ui->proj);
texture_bind(ui->atlas_texture); texture_bind(ui->atlas_texture);
geometry_bind(ui->per_frame_buffer); geometry_bind(ui->per_frame_buffer);
geometry_drawi(ui->per_frame_buffer, ui->geo.buffer_index.len); geometry_drawi(ui->per_frame_buffer, ui->geo.buffer_index.len, 0);
} }
//////////////////////////////////////////// ////////////////////////////////////////////

View File

@ -9,7 +9,7 @@ lumenarium_init()
permanent = bump_allocator_create_reserve(GB(2)); permanent = bump_allocator_create_reserve(GB(2));
global_scratch_ = bump_allocator_create_reserve(GB(4)); global_scratch_ = bump_allocator_create_reserve(GB(4));
run_tests(); //run_tests();
scratch_get(scratch); scratch_get(scratch);
App_Init_Desc desc = incenter_get_init_desc(); App_Init_Desc desc = incenter_get_init_desc();
// TODO(PS): make sure the values make sense in desc // TODO(PS): make sure the values make sense in desc
@ -24,10 +24,28 @@ lumenarium_init()
String exe_file_path = os_get_exe_path(scratch.a); String exe_file_path = os_get_exe_path(scratch.a);
u64 run_tree_start = string_find_substring(exe_file_path, lit_str("run_tree"), 0, StringMatch_FindLast); u64 run_tree_start = string_find_substring(exe_file_path, lit_str("run_tree"), 0, StringMatch_FindLast);
u64 run_tree_end = run_tree_start + lit_str("run_tree").len; if (run_tree_start >= exe_file_path.cap)
String run_tree_path = string_get_prefix(exe_file_path, run_tree_end); {
String run_tree_path_nullterm = string_copy(run_tree_path, scratch.a); u64 exe_path_start = string_find_substring(exe_file_path, lit_str("lumenarium"), 0, StringMatch_FindLast);
os_pwd_set(run_tree_path_nullterm); if (exe_path_start < exe_file_path.cap)
{
String run_tree_path = string_get_prefix(exe_file_path, exe_path_start);
String run_tree_path_nullterm = string_copy(run_tree_path, scratch.a);
os_pwd_set(run_tree_path_nullterm);
}
else
{
printf("Unable to set working directory\n");
}
}
else
{
u64 run_tree_end = run_tree_start + lit_str("run_tree").len;
String run_tree_path = string_get_prefix(exe_file_path, run_tree_end);
String run_tree_path_nullterm = string_copy(run_tree_path, scratch.a);
os_pwd_set(run_tree_path_nullterm);
}
en_init(state, desc); en_init(state, desc);
if (has_flag(state->flags, AppState_RunEditor)) ed_init(state); if (has_flag(state->flags, AppState_RunEditor)) ed_init(state);

View File

@ -288,9 +288,11 @@ geo_quad_buffer_builder_push_vt(Geo_Quad_Buffer_Builder* b, v3 p0, v3 p1, v3 p2,
u32 i3 = geo_vertex_buffer_builder_push_vtc(&b->buffer_vertex, p3, t3, (v4){}); u32 i3 = geo_vertex_buffer_builder_push_vtc(&b->buffer_vertex, p3, t3, (v4){});
geo_index_buffer_builder_push_quad(&b->buffer_index, i0, i1, i2, i3); geo_index_buffer_builder_push_quad(&b->buffer_index, i0, i1, i2, i3);
// u32 base = 2869;
// geo_index_buffer_builder_push_quad(&b->buffer_index, base + 0, base + 1, base + 2, base + 3);
} }
internal void internal void
geo_quad_buffer_builder_push_v(Geo_Quad_Buffer_Builder* b, v3 p0, v3 p1, v3 p2, v3 p3) geo_quad_buffer_builder_push_v(Geo_Quad_Buffer_Builder* b, v3 p0, v3 p1, v3 p2, v3 p3)
{ {
u32 i0 = geo_vertex_buffer_builder_push_vtc(&b->buffer_vertex, p0, (v2){}, (v4){}); u32 i0 = geo_vertex_buffer_builder_push_vtc(&b->buffer_vertex, p0, (v2){}, (v4){});

View File

@ -75,14 +75,134 @@ glfw_error_callback(int error, const char* description)
global u8* app_state_data = 0; global u8* app_state_data = 0;
global Key_Code glfw_key_translation_table[] = { global Key_Code glfw_key_translation_table[] = {
[GLFW_KEY_SPACE] = KeyCode_Space,
[GLFW_KEY_APOSTROPHE] = KeyCode_SingleQuote,
[GLFW_KEY_COMMA] = KeyCode_Comma,
[GLFW_KEY_MINUS] = KeyCode_Minus,
[GLFW_KEY_PERIOD] = KeyCode_Period,
[GLFW_KEY_SLASH] = KeyCode_ForwardSlash,
[GLFW_KEY_0] = KeyCode_0,
[GLFW_KEY_1] = KeyCode_1,
[GLFW_KEY_2] = KeyCode_2,
[GLFW_KEY_3] = KeyCode_3,
[GLFW_KEY_4] = KeyCode_4,
[GLFW_KEY_5] = KeyCode_5,
[GLFW_KEY_6] = KeyCode_6,
[GLFW_KEY_7] = KeyCode_7,
[GLFW_KEY_8] = KeyCode_8,
[GLFW_KEY_9] = KeyCode_9,
[GLFW_KEY_SEMICOLON] = KeyCode_SemiColon,
[GLFW_KEY_EQUAL] = KeyCode_Equals,
[GLFW_KEY_A] = KeyCode_A,
[GLFW_KEY_B] = KeyCode_B,
[GLFW_KEY_C] = KeyCode_C,
[GLFW_KEY_D] = KeyCode_D,
[GLFW_KEY_E] = KeyCode_E,
[GLFW_KEY_F] = KeyCode_F,
[GLFW_KEY_G] = KeyCode_G,
[GLFW_KEY_H] = KeyCode_H,
[GLFW_KEY_I] = KeyCode_I,
[GLFW_KEY_J] = KeyCode_J,
[GLFW_KEY_K] = KeyCode_K,
[GLFW_KEY_L] = KeyCode_L,
[GLFW_KEY_M] = KeyCode_M,
[GLFW_KEY_N] = KeyCode_N,
[GLFW_KEY_O] = KeyCode_O,
[GLFW_KEY_P] = KeyCode_P,
[GLFW_KEY_Q] = KeyCode_Q,
[GLFW_KEY_R] = KeyCode_R,
[GLFW_KEY_S] = KeyCode_S,
[GLFW_KEY_T] = KeyCode_T,
[GLFW_KEY_U] = KeyCode_U,
[GLFW_KEY_V] = KeyCode_V,
[GLFW_KEY_W] = KeyCode_W,
[GLFW_KEY_X] = KeyCode_X,
[GLFW_KEY_Y] = KeyCode_Y,
[GLFW_KEY_Z] = KeyCode_Z,
[GLFW_KEY_LEFT_BRACKET] = KeyCode_LeftBracket,
[GLFW_KEY_BACKSLASH] = KeyCode_Backslash,
[GLFW_KEY_RIGHT_BRACKET] = KeyCode_RightBrace,
[GLFW_KEY_GRAVE_ACCENT] = KeyCode_Invalid,
[GLFW_KEY_WORLD_1] = KeyCode_Invalid,
[GLFW_KEY_WORLD_2] = KeyCode_Invalid,
[GLFW_KEY_ESCAPE] = KeyCode_Esc,
[GLFW_KEY_ENTER] = KeyCode_Enter,
[GLFW_KEY_TAB] = KeyCode_Tab,
[GLFW_KEY_BACKSPACE] = KeyCode_Backspace,
[GLFW_KEY_INSERT] = KeyCode_Invalid,
[GLFW_KEY_DELETE] = KeyCode_Delete,
[GLFW_KEY_RIGHT] = KeyCode_RightArrow,
[GLFW_KEY_LEFT] = KeyCode_LeftArrow,
[GLFW_KEY_DOWN] = KeyCode_DownArrow,
[GLFW_KEY_UP] = KeyCode_UpArrow,
[GLFW_KEY_PAGE_UP] = KeyCode_PageUp,
[GLFW_KEY_PAGE_DOWN] = KeyCode_PageDown,
[GLFW_KEY_HOME] = KeyCode_Invalid,
[GLFW_KEY_END] = KeyCode_Invalid,
[GLFW_KEY_CAPS_LOCK] = KeyCode_CapsLock,
[GLFW_KEY_SCROLL_LOCK] = KeyCode_Invalid,
[GLFW_KEY_NUM_LOCK] = KeyCode_Invalid,
[GLFW_KEY_PRINT_SCREEN] = KeyCode_Invalid,
[GLFW_KEY_PAUSE] = KeyCode_Invalid,
[GLFW_KEY_F1] = KeyCode_F1,
[GLFW_KEY_F2] = KeyCode_F2,
[GLFW_KEY_F3] = KeyCode_F3,
[GLFW_KEY_F4] = KeyCode_F4,
[GLFW_KEY_F5] = KeyCode_F5,
[GLFW_KEY_F6] = KeyCode_F6,
[GLFW_KEY_F7] = KeyCode_F7,
[GLFW_KEY_F8] = KeyCode_F8,
[GLFW_KEY_F9] = KeyCode_F9,
[GLFW_KEY_F10] = KeyCode_Invalid,
[GLFW_KEY_F11] = KeyCode_Invalid,
[GLFW_KEY_F12] = KeyCode_Invalid,
[GLFW_KEY_F13] = KeyCode_Invalid,
[GLFW_KEY_F14] = KeyCode_Invalid,
[GLFW_KEY_F15] = KeyCode_Invalid,
[GLFW_KEY_F16] = KeyCode_Invalid,
[GLFW_KEY_F17] = KeyCode_Invalid,
[GLFW_KEY_F18] = KeyCode_Invalid,
[GLFW_KEY_F19] = KeyCode_Invalid,
[GLFW_KEY_F20] = KeyCode_Invalid,
[GLFW_KEY_F21] = KeyCode_Invalid,
[GLFW_KEY_F22] = KeyCode_Invalid,
[GLFW_KEY_F23] = KeyCode_Invalid,
[GLFW_KEY_F24] = KeyCode_Invalid,
[GLFW_KEY_F25] = KeyCode_Invalid,
[GLFW_KEY_KP_0] = KeyCode_Invalid,
[GLFW_KEY_KP_1] = KeyCode_Invalid,
[GLFW_KEY_KP_2] = KeyCode_Invalid,
[GLFW_KEY_KP_3] = KeyCode_Invalid,
[GLFW_KEY_KP_4] = KeyCode_Invalid,
[GLFW_KEY_KP_5] = KeyCode_Invalid,
[GLFW_KEY_KP_6] = KeyCode_Invalid,
[GLFW_KEY_KP_7] = KeyCode_Invalid,
[GLFW_KEY_KP_8] = KeyCode_Invalid,
[GLFW_KEY_KP_9] = KeyCode_Invalid,
[GLFW_KEY_KP_DECIMAL] = KeyCode_Invalid,
[GLFW_KEY_KP_DIVIDE] = KeyCode_Invalid,
[GLFW_KEY_KP_MULTIPLY] = KeyCode_Invalid,
[GLFW_KEY_KP_SUBTRACT] = KeyCode_Invalid,
[GLFW_KEY_KP_ADD] = KeyCode_Invalid,
[GLFW_KEY_KP_ENTER] = KeyCode_Invalid,
[GLFW_KEY_KP_EQUAL] = KeyCode_Invalid,
[GLFW_KEY_LEFT_SHIFT] = KeyCode_LeftShift,
[GLFW_KEY_LEFT_CONTROL] = KeyCode_LeftCtrl,
[GLFW_KEY_LEFT_ALT] = KeyCode_Alt,
[GLFW_KEY_LEFT_SUPER] = KeyCode_Invalid,
[GLFW_KEY_RIGHT_SHIFT] = KeyCode_RightShift,
[GLFW_KEY_RIGHT_CONTROL] = KeyCode_RightCtrl,
[GLFW_KEY_RIGHT_ALT] = KeyCode_Alt,
[GLFW_KEY_RIGHT_SUPER] = KeyCode_Invalid,
[GLFW_KEY_MENU] = KeyCode_Invalid,
}; };
Key_Code Key_Code
osx_translate_key(int glfw_key) osx_translate_key(int glfw_key)
{ {
// TODO: turn this into an actual key_code // TODO: turn this into an actual key_code
return (Key_Code)glfw_key; return glfw_key_translation_table[glfw_key];
} }
Key_Code Key_Code
@ -204,6 +324,8 @@ int main (int arg_count, char** args)
r64 target_seconds_per_frame = 1.0 / 30.0f; r64 target_seconds_per_frame = 1.0 / 30.0f;
Ticks ticks_start = os_get_ticks(); Ticks ticks_start = os_get_ticks();
while(!glfwWindowShouldClose(window) && running && has_flag(state->flags, AppState_IsRunning)) { while(!glfwWindowShouldClose(window) && running && has_flag(state->flags, AppState_IsRunning)) {
lumenarium_frame_prepare(state);
glfwPollEvents();
if (has_flag(state->flags, AppState_RunEditor)) if (has_flag(state->flags, AppState_RunEditor))
{ {
@ -212,13 +334,11 @@ int main (int arg_count, char** args)
state->editor->window_dim = (v2){ (r32)w, (r32)h }; state->editor->window_dim = (v2){ (r32)w, (r32)h };
} }
lumenarium_frame_prepare(state);
lumenarium_frame(state); lumenarium_frame(state);
lumenarium_env_validate(); lumenarium_env_validate();
glfwSwapBuffers(window); glfwSwapBuffers(window);
glfwPollEvents();
Ticks ticks_end = os_get_ticks(); Ticks ticks_end = os_get_ticks();
r64 seconds_elapsed = get_seconds_elapsed(ticks_start, ticks_end, os_get_ticks_per_second()); r64 seconds_elapsed = get_seconds_elapsed(ticks_start, ticks_end, os_get_ticks_per_second());
while (seconds_elapsed < target_seconds_per_frame) while (seconds_elapsed < target_seconds_per_frame)

View File

@ -54,7 +54,7 @@ incenter_init(App_State* state)
} }
r32 rad = 0.05f; r32 rad = 0.05f;
ed_sculpture_updated(state, 10, rad); ed_sculpture_updated(state, 5, rad);
scratch_release(scratch); scratch_release(scratch);
} }