카테고리 없음
[FdF] MiniLibX mlx_loop
Or71nH
2022. 6. 20. 14:56
mlx_loop 화면 만든걸 실행해주는 함수이다
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);
/*
화면을 만들어 주는거같다.
func CFRunLoopObserverCreate(
_ allocator: CFAllocator!, // 메모리 어디 할당할건지
_ activities: CFOptionFlags, // 음 플레그라는데 옵션인가부다
_ repeats: Bool, // 옵저버가 여러번 호출될지 안할지
_ order: CFIndex, // 음 어느 옵저버 부터 시작할지?
_ callout: CFRunLoopObserverCallBack!, // 뭔가 실행될때 ?
_ context: UnsafeMutablePointer<CFRunLoopObserverContext>! // 정보를 담기위해 있는듯??
) -> CFRunLoopObserver!
https://developer.apple.com/documentation/corefoundation/1541546-cfrunloopobservercreate
kCFRunLoopBeforeTimers = (1UL << 1)
*/
CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
/*
func CFRunLoopAddObserver(
_ rl: CFRunLoop!,
_ observer: CFRunLoopObserver!,
_ mode: CFRunLoopMode!
)
https://developer.apple.com/documentation/corefoundation/1542504-cfrunloopaddobserver
CFRunLoopGetMain()
예는 기본으로 CFRunLoop 되있는애를 반환하는거 같다
https://developer.apple.com/documentation/corefoundation/cfrunloop-rht
*/
// [[[MlxLoopHookObj alloc] initWithPtr:mlx_ptr] performSelector:@selector(do_loop_hook) withObject:nil afterDelay:0.0];
[NSApp run];
}
이렇게 만들어서 실행하면 화면이 만들어 지는거 같다
전체적인 코드는 이렇게 되고 중간에
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) selectGLContext
{
if ([NSOpenGLContext currentContext] != [self openGLContext])
{
// printf("ctx: %p => %p\n", [NSOpenGLContext currentContext], [self openGLContext]);
[[self openGLContext] makeCurrentContext];
}
}
- (void) mlx_gl_draw
{
if (pixel_nb <= 0)
return ;
glUseProgram(glsl.pixel_program);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, pixel_vbuffer);
glUniform1i(glsl.loc_pixel_texture, 0);
glBindBuffer(GL_ARRAY_BUFFER, pixel_vbuffer);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst
glBlendEquation(GL_FUNC_ADD);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDisableVertexAttribArray(0);
pixel_nb = size_x*size_y;
while (pixel_nb--) pixtexbuff[pixel_nb] = 0xFF000000;
/*
버퍼를 다 검정색으로 만든다
*/
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, size_x, size_y, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixtexbuff);
pixel_nb = 0;
}