Lumenarium/src_v2/lumenarium_first.cpp

184 lines
4.8 KiB
C++

#include "lumenarium_first.h"
#include "user_space/user_space_incenter.cpp"
Platform_Geometry_Buffer quad0;
Platform_Shader shader0;
static r32 z_ = 0;
static r32 r_ = 0.3f;
static r32 quad_verts[] = {
-r_, -r_, z_, 1.0f,
r_, -r_, z_, 1.0f,
r_, r_, z_, 1.0f,
-r_, r_, z_, 1.0f,
};
static u32 quad_indices[] = {
0, 1, 2,
0, 2, 3,
};
static String shader_code_vert_win32 = lit_str(
"#version 330 core\n"
"layout (location = 0) in vec4 coordinates;\n"
"void main(void) {\n"
" gl_Position = coordinates;\n"
"}"
);
static String shader_code_vert_wasm = lit_str(
"attribute vec4 coordinates;\n"
"void main(void) {\n"
" gl_Position = coordinates;\n"
"}");
static String shader_code_frag_win32 = lit_str(
"#version 330 core\n"
"out vec4 FragColor;\n"
"void main(void) {\n"
" FragColor = vec4(1,0,1,1);\n"
"}"
);
static String shader_code_frag_wasm = lit_str(
"void main(void) {\n"
" gl_FragColor = vec4(1, 0, 1, 1);\n"
"}");
void make_quad()
{
// TODO(PS): TEMP
#if defined(PLATFORM_win32)
String shader_code_vert = shader_code_vert_win32;
String shader_code_frag = shader_code_frag_win32;
#elif defined(PLATFORM_wasm)
String shader_code_vert = shader_code_vert_wasm;
String shader_code_frag = shader_code_frag_wasm;
#endif
quad0 = platform_geometry_buffer_create(
quad_verts, 16, quad_indices, 6
);
String attribs[] = { lit_str("coordinates") };
shader0 = platform_shader_create(
shader_code_vert, shader_code_frag, attribs, 1
);
platform_vertex_attrib_pointer(quad0, shader0, 0);
}
internal App_State*
lumenarium_init()
{
App_State* state = 0;
permanent = bump_allocator_create_reserve(MB(4));
scratch = bump_allocator_create_reserve(KB(64));
run_tests();
App_Init_Desc desc = incenter_get_init_desc();
// TODO(PS): make sure the values make sense in desc
state = allocator_alloc_struct(permanent, App_State);
add_flag(state->flags, AppState_IsRunning);
state->input_state = input_state_create();
en_init(state, desc);
if (!has_flag(state->flags, AppState_NoEditor))
{
ed_init(state);
}
incenter_init(state);
make_quad();
return state;
}
internal void
lumenarium_frame_prepare(App_State* state)
{
allocator_clear(scratch);
input_state_swap_frames(&state->input_state);
en_frame_prepare(state);
if (!has_flag(state->flags, AppState_NoEditor))
{
ed_frame_prepare(state);
}
incenter_frame_prepare(state);
}
internal void
lumenarium_frame(App_State* state)
{
en_frame(state);
if (!has_flag(state->flags, AppState_NoEditor))
{
//ed_frame(state);
Platform_Graphics_Frame_Desc desc = {};
desc.clear_color = { 0.1f, 0.1f, 0.1f, 1 };
desc.viewport_min = { 0, 0 };
desc.viewport_max = { 1600, 900 };
platform_frame_begin(desc);
platform_frame_clear();
platform_geometry_bind(quad0);
platform_shader_bind(shader0);
platform_geometry_draw(quad0);
}
incenter_frame(state);
}
internal void
lumenarium_event(Platform_Window_Event evt, App_State* state)
{
Input_Frame* frame = state->input_state.frame_hot;
switch (evt.kind)
{
case WindowEvent_MouseScroll:
{
frame->mouse_scroll = evt.scroll_amt;
} break;
case WindowEvent_ButtonDown:
case WindowEvent_ButtonUp:
{
frame->key_flags[evt.key_code] = evt.key_flags;
} break;
case WindowEvent_Char:
{
frame->string_input[frame->string_input_len++] = evt.char_value;
} break;
case WindowEvent_WindowClosed:
{
rem_flag(state->flags, AppState_IsRunning);
} break;
invalid_default_case;
}
}
internal void
lumenarium_cleanup(App_State* state)
{
incenter_cleanup(state);
en_cleanup(state);
if (!has_flag(state->flags, AppState_NoEditor))
{
ed_cleanup(state);
}
}