42_cube3D/MLX42/docs/Textures.md
Etienne Rey-bethbeder bc5fc2fc59 Add MLX42 V2
2023-04-26 13:39:03 +02:00

2.6 KiB

Textures

Textures are disk loaded images stored in memory and hold a buffer of pixel data along with information about the image such as width, height, and bytes per pixel.

Textures on their own are not displayed to the screen but have to be displayed using Images. To do so you can use the mlx_texture_to_image function that creates an image large enough to store the texture which then can be displayed.

Textures vs Images

There might be a bit of confusion at first between what an image and a texture is.

Textures:

  • Can be interpreted as a painter's "color palette".
  • Created by loading an image file FROM disk.
  • Simply contain the pixels, width, height and bytes per pixel information.
  • Do not get displayed on the window directly.

Images:

  • Can be interpreted as a painter's "canvas".
  • Can be created FROM a texture or an empty buffer!
  • Carries more information besides what the image buffer is such as instance count.
  • Also holds pixel data but is shared among its instances, it is not loaded from disk but stored in memory.

Example

To summarize, in order to display a sprite image onto our window we would first load the texture from disk into our memory and store the information in a mlx_texture_t*. After that we create a new mlx_image_t* based on the information given by the texture and then we can display our image onto the window.

Below is a small code example of how this would be achieved:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "MLX42/MLX42.h"
#define WIDTH 512
#define HEIGHT 512

static void error(void)
{
	puts(mlx_strerror(mlx_errno));
	exit(EXIT_FAILURE);
}

int32_t	main(void)
{
	// Start mlx
	mlx_t* mlx = mlx_init(WIDTH, HEIGHT, "Test", true);
	if (!mlx)
        error();

	// Try to load the file
	mlx_texture_t* texture = mlx_load_png("./temp/sus.png");
	if (!texture)
        error();
	
	// Convert texture to a displayable image
	mlx_image_t* img = mlx_texture_to_image(mlx, texture);
	if (!img)
        error();

	// Display the image
	if (mlx_image_to_window(mlx, img, 0, 0) < 0)
        error();

	mlx_loop(mlx);

	// Optional, terminate will clean up any leftovers, this is just to demonstrate.
	mlx_delete_image(mlx, img);
	mlx_delete_texture(texture);
	mlx_terminate(mlx);
	return (EXIT_SUCCESS);
}