카테고리 없음

[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;
  
}