카테고리 없음

[FdF] MiniLibX mlx_string_put

mlx_pixel_put에 2번쨰 함수

개인적으로 문자를 적어주는것에 대하여 궁금하긴 했다 

int mlx_string_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color, unsigned char *string)
{
  mlx_img_ctx_t	*imgctx;
  int		gX;
  int		gY;

  if (!win_ptr->pixmgt)
    return(0);

  [(id)(win_ptr->winid) selectGLContext];

  imgctx = add_img_to_ctx(mlx_ptr->font, win_ptr);

  while (*string)
    {
      if (*string >= 32 && *string <= 127)
	{
	  gX = (FONT_WIDTH+2)*(*string-32);
	  gY = 0;
	  //      printf("put char %c pos %d %d\n", *string, gX, gY);
	  [(id)(win_ptr->winid) mlx_gl_draw_font:mlx_ptr->font andCtx:imgctx andX:x andY:y andColor:color glyphX:gX glyphY:gY];
	  x += FONT_WIDTH;
	}
      string ++;
    }

  win_ptr->nb_flush ++;
  
  return (0);
}

일단 보이는건 xy 축과 색을 지정 그리고 문자

이미지 imctx를 만들어 주고

pixmgt 여기도 확인한다 만들때 1로 만들어서 제대로 만든건지 확인하는거 같다

전에 봣던 selectGLContext 

- (void) selectGLContext
{
  if ([NSOpenGLContext currentContext] != [self openGLContext])
    {
      //      printf("ctx: %p => %p\n", [NSOpenGLContext currentContext], [self openGLContext]);
      [[self openGLContext] makeCurrentContext];
    }
}

그리고 add_img_to_ctx

이건 폰트랑 화면 참조하여

mlx_img_ctx_t	*add_img_to_ctx(mlx_img_list_t *img, mlx_win_list_t *win)
{
  mlx_img_ctx_t	*imgctx;

  imgctx = win->img_list;
  while (imgctx)
    {
      if (imgctx->img == img)
	return (imgctx);
      imgctx = imgctx->next;
      /* 중복되는 이미지를 찾는거 같다 */
    }
	/*  여기도 이전 이미지들을 next로 이어나서 저장하는거 같다 */
  imgctx = malloc(sizeof(*imgctx));
  imgctx->img = img;
  imgctx->next = win->img_list;
  win->img_list = imgctx;

  glGenTextures(1, &(imgctx->texture));
  /* 
  	1, int주소를 넣는데 그게 뭐가 만들어 지는지 아직도 모르겟다..
  	https://developer.apple.com/documentation/opengles/1617621-glgentextures/
  */
  glBindTexture(GL_TEXTURE_2D, imgctx->texture);
  /*
  	이 밑에 부분은 
    https://tech.burt.pe.kr/opengl/opengl-es-tutorial-for-ios/chapter-12
    이분이 자세히 설명해 주셨다
    이미지 픽색 색을 확대 축소했을대 보정하는 방식인거 같다 에매하게 걸친 위치 색?
  */
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,     GL_CLAMP_TO_EDGE);
  glTexImage2D(
	       GL_TEXTURE_2D, 0,           /* target, level of detail */
	       GL_RGBA8,                    /* internal format */
	       img->width, img->height, 0,           /* width, height, border */
	       GL_BGRA, GL_UNSIGNED_BYTE,   /* external format, type */
	       img->buffer               /* pixels */
	       );

  glGenBuffers(1, &(imgctx->vbuffer));
  /*
  	메모리를 조정하는 거라는데 어케하는지 모르겟다
  	http://seorenn.blogspot.com/2017/01/swift-c-pointer-unsafepointer.html
    
  */
  glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer);
  glBufferData(GL_ARRAY_BUFFER, sizeof(img->vertexes), img->vertexes, GL_DYNAMIC_DRAW); // 4 points buff
  
  /*
  	위에 2개가 타겟을 할당하고 그타겟을 실제 버퍼에 넣는거라는데 잘 이해안감...
    결과적으론 img->vertexesr 에 무언가 있을거 같은 느낌이다
  	https://huiyu.tistory.com/entry/OpenGL-VBO%EB%A1%9C-%ED%81%90%EB%B8%8C-%EA%B7%B8%EB%A6%AC%EA%B8%B0
   */

  return (imgctx);
}
- (void) mlx_gl_draw_font:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y andColor:(int)color glyphX:(int)gx glyphY:(int)gy
{
  GLfloat color_tab[4];

  if (pixel_nb >0)
    [self mlx_gl_draw];

	/* 색을 0x?? 형태로 만들어 넣는 작업 */
  color_tab[0] = ((float)((color&0xFF0000)>>16))/255.0;
  color_tab[1] = ((float)((color&0xFF00)>>8))/255.0;
  color_tab[2] = ((float)((color&0xFF)>>0))/255.0;
  color_tab[3] = 1.0;
  /* 음 원래 투명도 조절 못하는건가 ?| 0 | R | G | B | */
  glUseProgram(glsl.font_program);

  glActiveTexture(GL_TEXTURE0);
  /* 
  GL_TEXTURE0 ~ GL_TEXTURE31
  var GL_TEXTURE0: Int32 { get }
  예네 숫자가 바껴도 변하는게 없다.. 뭐지?
  https://heinleinsgame.tistory.com/9
  이분이 설명을 잘 해주신거 같은데 텍스쳐 유닛이라 부르는거 같다
  */
  glBindTexture(GL_TEXTURE_2D, imgctx->texture);
  glUniform1i(glsl.loc_font_texture, 0);
  /* 
  	이녀석이 제일 이해 안간다  glsl 갑자기 튀어나온 여석..뭐지? 
    glsl_info_t 의 정보를 다가지고 있는거 같고 그정보들을 참고하여 무었인가 한다
  */
  glUniform4fv(glsl.loc_font_color, 1, color_tab);
  /* 
  	유니폼이라는 형식으로 만든걸 넣어줘야한다는데 glsl.loc_font_color 는 GLint일 뿐인데??
  	어떻게 되는거지?
    
	// vertexProgram을 active program으로 만든 후 유니폼 설정
	glActiveShaderProgram(pipeline, vertexProgram);glUniformMatrix4fv(glGetUniformLocation(vertexProgram, "mvpTransform"), 1, false, 행렬값);
 
	// fragmentProgram을 active program으로 만든 후 유니폼 설정
	glActiveShaderProgram(pipeline, fragmentProgram);glUniform3fv(glGetUniformLocation(fragmentProgram, "color"), 1, 색상값);
	출처: https://codeonwort.tistory.com/300 [CODEONWORT:티스토리]
  */
  glUniform2f(glsl.loc_font_winhalfsize, size_x/2, size_y/2);
  glUniform2f(glsl.loc_font_posinwin, x, size_y - 1 - y);
  glUniform2f(glsl.loc_font_posinatlas, gx, gy);
  glUniform2f(glsl.loc_font_atlassize, img->width, img->height);
	/*
    	이부분이 2d로 만드는 것이라 하는데 중간지점을 정하고 
        사이즈와 위치도 정하는거 같다
    */
  glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer);
  /* 버퍼 만들기 
  	https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jungwan82&logNo=20108365931
    이분 글을 보면 전체적으로 무엇을 하는 것인지 짐작할 수 있다
  */
  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);
  /* 
  	https://diehard98.tistory.com/entry/OpenGL-%EB%B8%94%EB%A0%8C%EB%94%A9
    만든걸 합쳐주는 거같다
 */
  glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  glDisableVertexAttribArray(0);
  /*
  	glEnableVertexAttribArray(0); // 생성
    glDisableVertexAttribArray(0); // 해지
  */

}

사용방법

#include <stdio.h>  // printf()
#include <stdlib.h> // exit()
#include <mlx.h>
int main(void)
{
	void *mlx_ptr;
	void *win_ptr;
	mlx_ptr = mlx_init();
	win_ptr = mlx_new_window(mlx_ptr, 300, 400, "Work???");
	mlx_clear_window(mlx_ptr, win_ptr);
	mlx_string_put(mlx_ptr, win_ptr, 100, 100, 0xffffff14, "test");
	mlx_loop(win_ptr);
	return (0);
}