diff options
author | Rudy Bousset <rbousset@z2r4p3.le-101.fr> | 2020-02-09 14:31:57 +0100 |
---|---|---|
committer | Rudy Bousset <rbousset@z2r4p3.le-101.fr> | 2020-02-09 14:31:57 +0100 |
commit | 4fa8a129e6ecfa168604568673cfbdaa2c8e34b0 (patch) | |
tree | 6e97965f1a32c007533eadb15becb4b9405867ea /minilibx/mlx_new_image.m | |
parent | Reverted map to normal size (diff) | |
download | 42-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_new_image.m')
-rw-r--r-- | minilibx/mlx_new_image.m | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/minilibx/mlx_new_image.m b/minilibx/mlx_new_image.m new file mode 100644 index 0000000..46e1df1 --- /dev/null +++ b/minilibx/mlx_new_image.m @@ -0,0 +1,198 @@ +// mlx_new_image +// +// by Ol +// + + +#import <Cocoa/Cocoa.h> +#import <OpenGL/gl3.h> + +#include "mlx_int.h" +#include "mlx_new_window.h" + + + +void *mlx_new_image(mlx_ptr_t *mlx_ptr, int width, int height) +{ + mlx_img_list_t *newimg; + + // if (mlx_ptr->win_list == NULL) + // return (NULL); // need at leat one window created to have openGL context and create texture + if ((newimg = malloc(sizeof(*newimg))) == NULL) + return ((void *)0); + newimg->next = mlx_ptr->img_list; + mlx_ptr->img_list = newimg; + newimg->width = width; + newimg->height = height; + newimg->vertexes[0] = 0.0; newimg->vertexes[1] = 0.0; + newimg->vertexes[2] = width; newimg->vertexes[3] = 0.0; + newimg->vertexes[4] = width; newimg->vertexes[5] = -height; + newimg->vertexes[6] = 0.0; newimg->vertexes[7] = -height; + newimg->buffer = malloc(UNIQ_BPP*width*height); + bzero(newimg->buffer, UNIQ_BPP*width*height); + + return (newimg); +} + +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; + } + + imgctx = malloc(sizeof(*imgctx)); + imgctx->img = img; + imgctx->next = win->img_list; + win->img_list = imgctx; + + glGenTextures(1, &(imgctx->texture)); + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + 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)); + glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(img->vertexes), img->vertexes, GL_DYNAMIC_DRAW); // 4 points buff + + return (imgctx); +} + + +void mlx_put_image_to_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, mlx_img_list_t *img_ptr, int x, int y) +{ + mlx_img_ctx_t *imgctx; + + if (!win_ptr->pixmgt) + return ; + + [(id)(win_ptr->winid) selectGLContext]; + imgctx = add_img_to_ctx(img_ptr, win_ptr); + + // update texture + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, img_ptr->width, img_ptr->height, 0, + GL_BGRA, GL_UNSIGNED_BYTE, img_ptr->buffer); + + [(id)(win_ptr->winid) mlx_gl_draw_img:img_ptr andCtx:imgctx andX:x andY:y]; + + win_ptr->nb_flush ++; +} + +// assume here 32bpp little endian + +char *mlx_get_data_addr(mlx_img_list_t *img_ptr, int *bits_per_pixel, int *size_line, int *endian) +{ + *bits_per_pixel = UNIQ_BPP*8; + *size_line = img_ptr->width*UNIQ_BPP; + *endian = 0; // little endian for now on mac-intel + return (img_ptr->buffer); +} + +unsigned int mlx_get_color_value(mlx_ptr_t *mlx_ptr, int color) +{ + return (color); +} + +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); + +#ifdef STRINGPUTX11 + y -= (FONT_HEIGHT * 2)/3; +#endif + + [(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]; +#ifdef STRINGPUTX11 + x += FONT_WIDTH/1.4; +#else + x += FONT_WIDTH; +#endif + } + string ++; + } + + win_ptr->nb_flush ++; + + return (0); +} + +int mlx_destroy_image(mlx_ptr_t *mlx_ptr, mlx_img_list_t *img_todel) +{ + mlx_img_ctx_t ctx_first; + mlx_img_ctx_t *ctx; + mlx_img_ctx_t *ctx_to_del; + mlx_img_list_t img_first; + mlx_img_list_t *img; + mlx_win_list_t *win; + + img_first.next = mlx_ptr->img_list; + img = &img_first; + while (img && img->next) + { + if (img->next == img_todel) + img->next = img->next->next; + img = img->next; + } + mlx_ptr->img_list = img_first.next; + + + win = mlx_ptr->win_list; + while (win) + { + ctx_first.next = win->img_list; + ctx = &ctx_first; + while (ctx && ctx->next) + { + if (ctx->next->img == img_todel) + { + [(id)(win->winid) selectGLContext]; + glDeleteBuffers(1, &(ctx->next->vbuffer)); + glDeleteTextures(1, &(ctx->next->texture)); + ctx_to_del = ctx->next; + ctx->next = ctx->next->next; + free(ctx_to_del); + } + ctx = ctx->next; + } + win->img_list = ctx_first.next; + win = win->next; + } + + + free(img_todel->buffer); + free(img_todel); + + // printf("destroy image done.\n"); + return (0); +} |