MAC init and basic frame update and render working

This commit is contained in:
Allen Webster 2017-11-05 00:42:55 -04:00
parent f3ea38abec
commit 82882f22f5
5 changed files with 255 additions and 55 deletions

View File

@ -490,6 +490,7 @@ private_draw_glyph_mono(System_Functions *system, Render_Target *t, Render_Font
internal void
launch_rendering(System_Functions *system, Render_Target *t){
DBG_POINT();
char *cursor = t->push_buffer;
char *cursor_end = cursor + t->size;
@ -563,16 +564,21 @@ launch_rendering(System_Functions *system, Render_Target *t){
internal void
font_load_page_inner(Partition *part, Render_Font *font, FT_Library ft, FT_Face face, b32 use_hinting, Glyph_Page *page, u32 page_number, i32 tab_width){
DBG_POINT();
Temp_Memory temp = begin_temp_memory(part);
Assert(page != 0);
page->page_number = page_number;
DBG_POINT();
// prepare to read glyphs into a temporary texture buffer
i32 max_glyph_w = face->size->metrics.x_ppem;
DBG_POINT();
i32 max_glyph_h = font_get_height(font);
i32 tex_width = 64;
i32 tex_height = 0;
DBG_POINT();
do {
tex_width *= 2;
float glyphs_per_row = ceilf(tex_width / (float) max_glyph_w);
@ -580,11 +586,13 @@ font_load_page_inner(Partition *part, Render_Font *font, FT_Library ft, FT_Face
tex_height = ceil32(rows * (max_glyph_h + 2));
} while(tex_height > tex_width);
DBG_POINT();
tex_height = round_up_pot_u32(tex_height);
i32 pen_x = 0;
i32 pen_y = 0;
DBG_POINT();
u32* pixels = push_array(part, u32, tex_width * tex_height);
memset(pixels, 0, tex_width * tex_height * sizeof(u32));
@ -655,7 +663,10 @@ font_load_page_inner(Partition *part, Render_Font *font, FT_Library ft, FT_Face
page->tex_width = tex_width;
page->tex_height = tex_height;
DBG_POINT();
glGenTextures(1, &page->tex);
DBG_POINT();
glBindTexture(GL_TEXTURE_2D, page->tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

View File

@ -929,7 +929,7 @@ LinuxKeycodeInit(Display* dpy){
}
internal void
LinuxPushKey(Key_Code code, Key_Code chr, Key_Code chr_nocaps, b8 (*mods)[MDFR_INDEX_COUNT])
LinuxPushKey(Key_Code code, Key_Code chr, Key_Code chr_nocaps, b8 *mods)
{
i32 *count = &linuxvars.input.keys.count;
Key_Event_Data *data = linuxvars.input.keys.keys;
@ -939,7 +939,7 @@ LinuxPushKey(Key_Code code, Key_Code chr, Key_Code chr_nocaps, b8 (*mods)[MDFR_I
data[*count].character = chr;
data[*count].character_no_caps_lock = chr_nocaps;
memcpy(data[*count].modifiers, *mods, sizeof(*mods));
memcpy(data[*count].modifiers, mods, sizeof(*mods)*MDFR_INDEX_COUNT);
++(*count);
}
@ -1307,11 +1307,11 @@ LinuxHandleX11Events(void)
Key_Code special_key = keycode_lookup_table[(u8)Event.xkey.keycode];
if (special_key){
LinuxPushKey(special_key, 0, 0, &mods);
LinuxPushKey(special_key, 0, 0, mods);
} else if (key < 256){
LinuxPushKey(key, key, key_no_caps, &mods);
LinuxPushKey(key, key, key_no_caps, mods);
} else {
LinuxPushKey(0, 0, 0, &mods);
LinuxPushKey(0, 0, 0, mods);
}
}break;
@ -1748,7 +1748,7 @@ main(int argc, char **argv){
linuxvars.input.first_step = 1;
linuxvars.input.dt = (frame_useconds / 1000000.f);
while (1){
for (;;){
if (XEventsQueued(linuxvars.XDisplay, QueuedAlready)){
LinuxHandleX11Events();
}
@ -1825,7 +1825,7 @@ main(int argc, char **argv){
}
b32 keep_running = linuxvars.keep_running;
app.step(&sysfunc, &target, &memory_vars, &linuxvars.input, &result);
if (result.perform_kill){

View File

@ -12,7 +12,12 @@
#define IS_PLAT_LAYER
#include <stdio.h>
#if 0
#define DBG_POINT() fprintf(stdout, "%s\n", __FILE__ ":" LINE_STR ":")
#else
#define DBG_POINT()
#endif
#include "4ed_defines.h"
#include "4coder_API/version.h"
@ -78,8 +83,17 @@ global System_Functions sysfunc;
////////////////////////////////
struct OSX_Vars{
Application_Step_Input input;
String clipboard_contents;
b32 keep_running;
};
////////////////////////////////
#include "osx_objective_c_to_cpp_links.h"
OSX_Vars osx;
OSX_Objective_C_Vars osx_objc;
OSX_Vars osxvars;
global Render_Target target;
global Application_Memory memory_vars;
global Plat_Settings plat_settings;
@ -135,20 +149,20 @@ Sys_Show_Mouse_Cursor_Sig(system_show_mouse_cursor){
internal
Sys_Set_Fullscreen_Sig(system_set_fullscreen){
osx.do_toggle = (osx.full_screen != full_screen);
osx_objc.do_toggle = (osx_objc.full_screen != full_screen);
return(true);
}
internal
Sys_Is_Fullscreen_Sig(system_is_fullscreen){
b32 result = (osx.full_screen != osx.do_toggle);
b32 result = (osx_objc.full_screen != osx_objc.do_toggle);
return(result);
}
// HACK(allen): Why does this work differently from the win32 version!?
internal
Sys_Send_Exit_Signal_Sig(system_send_exit_signal){
osx.running = false;
osx_objc.running = false;
}
#include "4ed_coroutine_functions.cpp"
@ -161,16 +175,16 @@ internal
Sys_Post_Clipboard_Sig(system_post_clipboard){
char *string = str.str;
if (!terminate_with_null(&str)){
if (osx.clipboard_space_max <= str.size + 1){
if (osx.clipboard_space != 0){
system_memory_free(osx.clipboard_space, osx.clipboard_space_max);
if (osx_objc.clipboard_space_max <= str.size + 1){
if (osx_objc.clipboard_space != 0){
system_memory_free(osx_objc.clipboard_space, osx_objc.clipboard_space_max);
}
osx.clipboard_space_max = l_round_up_u32(str.size*2 + 1, KB(4096));
osx.clipboard_space = (char*)system_memory_allocate(osx.clipboard_space_max);
osx_objc.clipboard_space_max = l_round_up_u32(str.size*2 + 1, KB(4096));
osx_objc.clipboard_space = (char*)system_memory_allocate(osx_objc.clipboard_space_max);
}
memcpy(osx.clipboard_space, str.str, str.size);
osx.clipboard_space[str.size] = 0;
string = osx.clipboard_space;
memcpy(osx_objc.clipboard_space, str.str, str.size);
osx_objc.clipboard_space[str.size] = 0;
string = osx_objc.clipboard_space;
}
osx_post_to_clipboard(string);
}
@ -224,37 +238,172 @@ osx_allocate(umem size){
external void
osx_resize(int width, int height){
DBG_POINT();
osx.width = width;
osx.height = height;
// TODO
osx_objc.width = width;
osx_objc.height = height;
if (width > 0 && height > 0){
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, -1, 1);
glScissor(0, 0, width, height);
target.width = width;
target.height = height;
}
}
internal void
osx_push_key(Key_Code code, Key_Code chr, Key_Code chr_nocaps, b8 *mods)
{
i32 count = osxvars.input.keys.count;
if (count < KEY_INPUT_BUFFER_SIZE){
Key_Event_Data *data = osxvars.input.keys.keys;
data[count].keycode = code;
data[count].character = chr;
data[count].character_no_caps_lock = chr_nocaps;
memcpy(data[count].modifiers, mods, sizeof(*mods)*MDFR_INDEX_COUNT);
osxvars.input.keys.count = count + 1;
}
}
external void
osx_character_input(u32 code, OSX_Keyboard_Modifiers modifier_flags){
DBG_POINT();
// TODO
Key_Code c = 0;
switch (code){
// TODO(allen): Find the canonical list of these things.
case 0x007F: c = key_back; break;
case 0xF700: c = key_up; break;
case 0xF701: c = key_down; break;
case 0xF702: c = key_left; break;
case 0xF703: c = key_right; break;
case 0x001B: c = key_esc; break;
case 0xF704: c = key_f1; break;
case 0xF705: c = key_f2; break;
case 0xF706: c = key_f3; break;
case 0xF707: c = key_f4; break;
case 0xF708: c = key_f5; break;
case 0xF709: c = key_f6; break;
case 0xF70A: c = key_f7; break;
case 0xF70B: c = key_f8; break;
case 0xF70C: c = key_f9; break;
case 0xF70D: c = key_f10; break;
case 0xF70E: c = key_f11; break;
case 0xF70F: c = key_f12; break;
case 0xF710: c = key_f13; break;
case 0xF711: c = key_f14; break;
case 0xF712: c = key_f15; break;
case 0xF713: c = key_f16; break;
}
b8 mods[MDFR_INDEX_COUNT] = {0};
if (modifier_flags.shift) mods[MDFR_SHIFT_INDEX] = 1;
if (modifier_flags.command) mods[MDFR_CONTROL_INDEX] = 1;
if (modifier_flags.caps) mods[MDFR_CAPS_INDEX] = 1;
if (modifier_flags.control) mods[MDFR_ALT_INDEX] = 1;
if (c != 0){
osx_push_key(c, 0, 0, mods);
}
else if (code != 0){
if (code == '\r'){
code = '\n';
}
Key_Code nocaps = code;
if (modifier_flags.caps){
if ('a' <= nocaps && nocaps <= 'z'){
nocaps += 'A' - 'a';
}
else if ('A' <= nocaps && nocaps <= 'Z'){
nocaps += 'a' - 'A';
}
}
osx_push_key(code, code, nocaps, mods);
}
else{
osx_push_key(0, 0, 0, mods);
}
}
external void
osx_mouse(i32 mx, i32 my, u32 type){
DBG_POINT();
// TODO
osxvars.input.mouse.x = mx;
osxvars.input.mouse.y = my;
if (type == MouseType_Press){
osxvars.input.mouse.press_l = true;
osxvars.input.mouse.l = true;
}
if (type == MouseType_Release){
osxvars.input.mouse.l = false;
}
}
external void
osx_mouse_wheel(float dx, float dy){
DBG_POINT();
// TODO
if (dy > 0){
osxvars.input.mouse.wheel = 1;
}
else if (dy < 0){
osxvars.input.mouse.wheel = -1;
}
}
external void
osx_step(){
DBG_POINT();
// TODO
Application_Step_Result result = {};
result.mouse_cursor_type = APP_MOUSE_CURSOR_DEFAULT;
result.trying_to_kill = !osxvars.keep_running;
osxvars.input.clipboard = null_string;
app.step(&sysfunc, &target, &memory_vars, &osxvars.input, &result);
launch_rendering(&sysfunc, &target);
osxvars.input.first_step = false;
osxvars.input.keys = null_key_input_data;
osxvars.input.mouse.press_l = false;
osxvars.input.mouse.release_l = false;
osxvars.input.mouse.press_r = false;
osxvars.input.mouse.release_r = false;
osxvars.input.mouse.wheel = 0;
}
external void
osx_init(){
// TODO(allen): Setup GL DEBUG MESSAGE
#if defined(FRED_INTERNAL) && 0
//
// OpenGL Init
//
typedef PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackProc;
GLXLOAD(glDebugMessageCallback);
if (glDebugMessageCallback){
LOG("Enabling GL Debug Callback\n");
glDebugMessageCallback(&LinuxGLDebugCallback, 0);
glEnable(GL_DEBUG_OUTPUT);
}
#endif
glEnable(GL_TEXTURE_2D);
glEnable(GL_SCISSOR_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//
// System Linkage
//
@ -276,6 +425,9 @@ osx_init(){
memset(&custom_api, 0, sizeof(custom_api));
memory_init();
osxvars.keep_running = true;
osxvars.input.first_step = true;
//
// HACK(allen):
@ -303,7 +455,7 @@ osx_init(){
//
DBG_POINT();
read_command_line(osx.argc, osx.argv);
read_command_line(osx_objc.argc, osx_objc.argv);
//
// Threads
@ -344,13 +496,13 @@ osx_init(){
DBG_POINT();
String clipboard_string = {0};
if (osx.has_clipboard_item){
clipboard_string = make_string(osx.clipboard_data, osx.clipboard_size);
if (osx_objc.has_clipboard_item){
clipboard_string = make_string(osx_objc.clipboard_data, osx_objc.clipboard_size);
}
DBG_POINT();
fprintf(stdout, "%p\n", app.init);
LOG("Initializing application variables\n");
app.init(&sysfunc, &target, &memory_vars, clipboard_string, curdir, custom_api);

View File

@ -11,6 +11,7 @@
#include "4ed_defines.h"
#include "4coder_API/version.h"
#include "4coder_API/keycodes.h"
#define WINDOW_NAME "4coder" VERSION
@ -35,7 +36,7 @@ osx_post_to_clipboard(char *str){
[board declareTypes:typesArray owner:nil];
NSString *paste_string = [NSString stringWithUTF8String:str];
[board setString:paste_string forType:utf8_type];
osx.just_posted_to_clipboard = true;
osx_objc.just_posted_to_clipboard = true;
}
void
@ -81,6 +82,7 @@ static DISPLINK_SIG(osx_display_link);
mods.command = ((flags & NSEventModifierFlagCommand) != 0);
mods.control = ((flags & NSEventModifierFlagControl) != 0);
mods.option = ((flags & NSEventModifierFlagOption) != 0);
mods.caps = ((flags & NSEventModifierFlagCapsLock) != 0);
u32 length = real.length;
for (u32 i = 0; i < length; ++i){
@ -118,10 +120,10 @@ static DISPLINK_SIG(osx_display_link);
- (CVReturn)getFrameForTime:(const CVTimeStamp*)time{
@autoreleasepool
{
if (osx.running){
if (osx_objc.running){
NSPasteboard *board = [NSPasteboard generalPasteboard];
if (board.changeCount != osx.prev_clipboard_change_count){
if (!osx.just_posted_to_clipboard){
if (board.changeCount != osx_objc.prev_clipboard_change_count){
if (!osx_objc.just_posted_to_clipboard){
NSString *utf8_type = @"public.utf8-plain-text";
NSArray *array = [NSArray arrayWithObjects: utf8_type, nil];
NSString *has_string = [board availableTypeFromArray:array];
@ -131,20 +133,20 @@ static DISPLINK_SIG(osx_display_link);
u32 copy_length = data.length;
if (copy_length > 0){
// TODO(allen): Grow clipboard memory if needed.
if (copy_length+1 < osx.clipboard_max){
osx.clipboard_size = copy_length;
[data getBytes: osx.clipboard_data length: copy_length];
((char*)osx.clipboard_data)[copy_length] = 0;
osx.has_clipboard_item = true;
if (copy_length+1 < osx_objc.clipboard_max){
osx_objc.clipboard_size = copy_length;
[data getBytes: osx_objc.clipboard_data length: copy_length];
((char*)osx_objc.clipboard_data)[copy_length] = 0;
osx_objc.has_clipboard_item = true;
}
}
}
}
}
else{
osx.just_posted_to_clipboard = false;
osx_objc.just_posted_to_clipboard = false;
}
osx.prev_clipboard_change_count = board.changeCount;
osx_objc.prev_clipboard_change_count = board.changeCount;
}
CGLLockContext([[self openGLContext] CGLContextObj]);
@ -167,7 +169,7 @@ static DISPLINK_SIG(osx_display_link);
- (void)init_gl
{
if(osx.running)
if(osx_objc.running)
{
return;
}
@ -201,7 +203,7 @@ static DISPLINK_SIG(osx_display_link);
[context makeCurrentContext];
osx.running = true;
osx_objc.running = true;
}
- (id)init
@ -284,6 +286,15 @@ DISPLINK_SIG(osx_display_link){
}
@end
typedef struct File_Change_Queue{
char *buffer;
char *read_ptr;
char *write_ptr;
char *end;
} File_Change_Queue;
static File_Change_Queue file_change_queue = {0};
void
osx_add_file_listener(char *file_name){
NotImplemented;
@ -294,24 +305,47 @@ osx_remove_file_listener(char *file_name){
NotImplemented;
}
void
block_split_copy(void *dst, void *src1, i32 size1, void *src2, i32 size2){
memcpy(dst, src1, size1);
memcpy((u8*)dst + size1, src2, size2);
}
i32
osx_get_file_change_event(char *buffer, i32 max, i32 *size){
i32 result = 0;
NotImplemented;
if (file_change_queue.read_ptr != file_change_queue.write_ptr){
i32 change_size = *(i32*)file_change_queue.read_ptr;
if (max <= change_size){
char *b1 = file_change_queue.read_ptr + 4;
char *b2 = file_change_queue.buffer;
i32 b1_size = Min(change_size, (i32)(file_change_queue.end - b1));
i32 b2_size = change_size - b1_size;
block_split_copy(buffer, b1, b1_size, b2, b2_size);
if (b1 < file_change_queue.end){
file_change_queue.read_ptr = b1 + change_size;
}
else{
file_change_queue.read_ptr = b2 + b2_size;
}
result = 1;
}
else{
result = -1;
}
}
return(result);
}
int
main(int argc, char **argv){
memset(&osx, 0, sizeof(osx));
memset(&osx_objc, 0, sizeof(osx_objc));
umem clipboard_size = MB(4);
osx.clipboard_data = osx_allocate(clipboard_size);
osx.clipboard_max = clipboard_size;
osx.argc = argc;
osx.argv = argv;
osx_init();
osx_objc.clipboard_data = osx_allocate(clipboard_size);
osx_objc.clipboard_max = clipboard_size;
osx_objc.argc = argc;
osx_objc.argv = argv;
@autoreleasepool{
NSApplication *app = [NSApplication sharedApplication];
@ -337,6 +371,8 @@ main(int argc, char **argv){
[window setTitle:@WINDOW_NAME];
[window makeKeyAndOrderFront:nil];
osx_init();
[NSApp run];
}

View File

@ -23,9 +23,10 @@ typedef struct OSX_Keyboard_Modifiers{
b32 command;
b32 control;
b32 option;
b32 caps;
} OSX_Keyboard_Modifiers;
typedef struct OSX_Vars{
typedef struct OSX_Objective_C_Vars{
i32 width, height;
b32 running;
u32 key_count;
@ -45,10 +46,10 @@ typedef struct OSX_Vars{
i32 argc;
char **argv;
} OSX_Vars;
} OSX_Objective_C_Vars;
// In C++ layer.
extern OSX_Vars osx;
extern OSX_Objective_C_Vars osx_objc;
external void*
osx_allocate(umem size);