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