aboutsummaryrefslogtreecommitdiffstats
path: root/minilibx/mlx_init_loop.m
diff options
context:
space:
mode:
authorRudy Bousset <rbousset@z2r4p3.le-101.fr>2020-02-09 14:31:57 +0100
committerRudy Bousset <rbousset@z2r4p3.le-101.fr>2020-02-09 14:31:57 +0100
commit4fa8a129e6ecfa168604568673cfbdaa2c8e34b0 (patch)
tree6e97965f1a32c007533eadb15becb4b9405867ea /minilibx/mlx_init_loop.m
parentReverted map to normal size (diff)
download42-cub3d-4fa8a129e6ecfa168604568673cfbdaa2c8e34b0.tar.gz
42-cub3d-4fa8a129e6ecfa168604568673cfbdaa2c8e34b0.tar.bz2
42-cub3d-4fa8a129e6ecfa168604568673cfbdaa2c8e34b0.tar.xz
42-cub3d-4fa8a129e6ecfa168604568673cfbdaa2c8e34b0.tar.zst
42-cub3d-4fa8a129e6ecfa168604568673cfbdaa2c8e34b0.zip
Renamed minilibx
Diffstat (limited to 'minilibx/mlx_init_loop.m')
-rw-r--r--minilibx/mlx_init_loop.m192
1 files changed, 192 insertions, 0 deletions
diff --git a/minilibx/mlx_init_loop.m b/minilibx/mlx_init_loop.m
new file mode 100644
index 0000000..0377771
--- /dev/null
+++ b/minilibx/mlx_init_loop.m
@@ -0,0 +1,192 @@
+// mlx_init_loop.m
+// By Ol
+
+#import <Cocoa/Cocoa.h>
+#import <OpenGL/gl3.h>
+#import <AppKit/NSOpenGLView.h>
+
+#include "mlx_int.h"
+#include "mlx_new_window.h"
+
+#include "font.c"
+
+
+void do_loop_hook2(CFRunLoopTimerRef observer, void * info)
+{
+ ((mlx_ptr_t *)info)->loop_hook(((mlx_ptr_t *)info)->loop_hook_data);
+}
+
+
+void do_loop_flush(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void * info)
+{
+ mlx_ptr_t *mlx_ptr;
+ mlx_win_list_t *win;
+
+ mlx_ptr = (mlx_ptr_t *)info;
+ win = mlx_ptr->win_list;
+ while (win)
+ {
+ if (win->nb_flush > 0 && win->pixmgt)
+ {
+ [(id)win->winid selectGLContext];
+ [(id)win->winid mlx_gl_draw];
+ glFlush();
+ win->nb_flush = 0;
+ }
+ win = win->next;
+ }
+}
+
+
+
+
+void *mlx_init()
+{
+ mlx_ptr_t *new_mlx;
+ int bidon;
+ int i;
+
+ if ((new_mlx = malloc(sizeof(*new_mlx))) == NULL)
+ return ((void *)0);
+ new_mlx->win_list = NULL;
+ new_mlx->img_list = NULL;
+ new_mlx->loop_hook = NULL;
+ new_mlx->loop_hook_data = NULL;
+ new_mlx->main_loop_active = 0;
+
+ new_mlx->appid = [NSApplication sharedApplication];
+
+ // super magic trick to detach app from terminal, get menubar & key input events
+ for (NSRunningApplication * app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.finder"])
+ {
+ [app activateWithOptions:NSApplicationActivateIgnoringOtherApps];
+ break;
+ }
+ usleep(100000);
+ ProcessSerialNumber psn = { 0, kCurrentProcess };
+ (void) TransformProcessType(&psn, kProcessTransformToForegroundApplication);
+ usleep(100000);
+ [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps];
+
+ // load font
+ new_mlx->font = mlx_new_image(new_mlx, (FONT_WIDTH+2)*95, FONT_HEIGHT);
+ i = 0;
+ while (i < 4*(FONT_WIDTH+2)*95*FONT_HEIGHT)
+ {
+ new_mlx->font->buffer[i+0] = font_atlas.pixel_data[i+2];
+ new_mlx->font->buffer[i+1] = font_atlas.pixel_data[i+1];
+ new_mlx->font->buffer[i+2] = font_atlas.pixel_data[i+0];
+ ((unsigned char *)new_mlx->font->buffer)[i+3] = 0xFF-font_atlas.pixel_data[i+3];
+ i += 4;
+ }
+
+
+#ifdef STRINGPUTX11
+ new_mlx->font->vertexes[2] = FONT_WIDTH/1.4;
+ new_mlx->font->vertexes[4] = FONT_WIDTH/1.4;
+ new_mlx->font->vertexes[5] = (-FONT_HEIGHT-1)/1.4;
+ new_mlx->font->vertexes[7] = (-FONT_HEIGHT-1)/1.4;
+#else
+ new_mlx->font->vertexes[2] = FONT_WIDTH;
+ new_mlx->font->vertexes[4] = FONT_WIDTH;
+ new_mlx->font->vertexes[5] = -FONT_HEIGHT-1;
+ new_mlx->font->vertexes[7] = -FONT_HEIGHT-1;
+#endif
+
+ return ((void *)new_mlx);
+}
+
+
+void mlx_loop(mlx_ptr_t *mlx_ptr)
+{
+ CFRunLoopObserverRef observer;
+ CFRunLoopObserverContext ocontext = {.version = 0, .info = mlx_ptr, .retain = NULL, .release = NULL, .copyDescription = NULL};
+
+ mlx_ptr->main_loop_active = 1;
+
+ observer = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeTimers, true, 0, do_loop_flush, &ocontext);
+ CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
+
+ // [[[MlxLoopHookObj alloc] initWithPtr:mlx_ptr] performSelector:@selector(do_loop_hook) withObject:nil afterDelay:0.0];
+
+ [NSApp run];
+}
+
+
+void mlx_pixel_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color)
+{
+ if (!win_ptr->pixmgt)
+ return ;
+ [(id)(win_ptr->winid) selectGLContext];
+ [(id)(win_ptr->winid) pixelPutColor:color X:x Y:y];
+ win_ptr->nb_flush ++;
+}
+
+
+void mlx_int_loop_once()
+{
+ NSEvent *event;
+ NSDate *thedate;
+
+ thedate = [NSDate dateWithTimeIntervalSinceNow:0.1];
+ while (42)
+ {
+ event = [NSApp nextEventMatchingMask:NSEventMaskAny
+ untilDate:thedate
+ inMode:NSDefaultRunLoopMode
+ dequeue:YES];
+ if (event == nil)
+ {
+ [thedate release];
+ return ;
+ }
+ [NSApp sendEvent:event];
+ [NSApp updateWindows];
+ }
+}
+
+
+int mlx_do_sync(mlx_ptr_t *mlx_ptr)
+{
+ mlx_win_list_t *win;
+
+ win = mlx_ptr->win_list;
+ while (win)
+ {
+ if (win->pixmgt)
+ {
+ [(id)(win->winid) selectGLContext];
+ [(id)(win->winid) mlx_gl_draw];
+ glFlush();
+ if (!mlx_ptr->main_loop_active)
+ mlx_int_loop_once();
+ }
+ win = win->next;
+ }
+ return (0);
+}
+
+
+int mlx_loop_hook(mlx_ptr_t *mlx_ptr, void (*fct)(void *), void *param)
+{
+ CFRunLoopTimerContext tcontext = {0, mlx_ptr, NULL, NULL, NULL};
+ CFRunLoopTimerRef timer;
+
+ if (mlx_ptr->loop_hook != NULL)
+ {
+ CFRunLoopTimerInvalidate(mlx_ptr->loop_timer);
+ [(id)(mlx_ptr->loop_timer) release];
+ }
+
+ mlx_ptr->loop_hook = fct;
+ mlx_ptr->loop_hook_data = param;
+
+ if (fct)
+ {
+ timer = CFRunLoopTimerCreate(kCFAllocatorDefault, 0.0, 0.0001, 0, 0, &do_loop_hook2, &tcontext);
+ mlx_ptr->loop_timer = timer;
+ CFRunLoopAddTimer(CFRunLoopGetMain(), timer, kCFRunLoopCommonModes);
+ }
+
+ return (0);
+}