MLX42 1.0
MLX42
Loading...
Searching...
No Matches
mlx_init.c
Go to the documentation of this file.
1/* ************************************************************************** */
2/* */
3/* :::::::: */
4/* mlx_init.c :+: :+: */
5/* +:+ */
6/* By: W2Wizard <main@w2wizard.dev> +#+ */
7/* +#+ */
8/* Created: 2021/12/28 00:24:30 by W2Wizard #+# #+# */
9/* Updated: 2023/06/08 18:16:19 by XEDGit ######## odam.nl */
10/* */
11/* ************************************************************************** */
12
13#include "MLX42/MLX42_Int.h"
14
15//= Private =//
16
17static void framebuffer_callback(GLFWwindow *window, int width, int height)
18{
19 (void)window;
20 glViewport(0, 0, width, height);
21}
22
24{
26
27 mlxctx->zdepth = 0;
29 glGenVertexArrays(1, &(mlxctx->vao));
30 glGenBuffers(1, &(mlxctx->vbo));
33
34 // Vertex XYZ coordinates
37
38 // UV Coordinates
39 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (void *)(sizeof(float) * 3));
41
42 // Texture index
43 glVertexAttribIPointer(2, 1, GL_BYTE, sizeof(vertex_t), (void *)(sizeof(float) * 5));
45
49
50 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture0"), 0);
51 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture1"), 1);
52 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture2"), 2);
53 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture3"), 3);
54 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture4"), 4);
55 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture5"), 5);
56 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture6"), 6);
57 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture7"), 7);
58 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture8"), 8);
59 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture9"), 9);
60 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture10"), 10);
61 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture11"), 11);
62 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture12"), 12);
63 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture13"), 13);
64 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture14"), 14);
65 glUniform1i(glGetUniformLocation(mlxctx->shaderprogram, "Texture15"), 15);
66
67 return (true);
68}
69
70/**
71 * Compiles the given shader source code of a given shader type.
72 * Returns shader object via param.
73 *
74 * @param code The shader source code.
75 * @param Type GL_VERTEX_SHADER, GL_FRAGMENT_SHADER, GL_GEOMETRY_SHADER, ...
76 * @return Non-zero on success, else 0.
77 */
79{
82 char infolog[512] = {0};
83
84 if (!code || (shader = glCreateShader(type)) == 0)
85 return (0);
86
91 if (!success)
92 {
94 fprintf(stderr, "%s", infolog);
96 return (0);
97 }
98 return (shader);
99}
100
102{
103 uint32_t vshader = 0;
104 uint32_t fshader = 0;
105 char infolog[512] = {0};
107
112
113 // Load all OpenGL function pointers
115 return (mlx_error(MLX_GLADFAIL));
117 return (mlx_error(MLX_VERTFAIL));
119 return (mlx_error(MLX_FRAGFAIL));;
120 if (!(mlxctx->shaderprogram = glCreateProgram()))
121 {
124 return (mlx_error(MLX_SHDRFAIL));
125 }
126 glAttachShader(mlxctx->shaderprogram, vshader);
127 glAttachShader(mlxctx->shaderprogram, fshader);
128 glLinkProgram(mlxctx->shaderprogram);
129
131 glGetProgramiv(mlxctx->shaderprogram, GL_LINK_STATUS, &success);
132 if (!success)
133 {
134 glGetProgramInfoLog(mlxctx->shaderprogram, sizeof(infolog), NULL, infolog);
135 fprintf(stderr, "%s", infolog);
136 glDeleteProgram(mlxctx->shaderprogram);
139 return (mlx_error(MLX_SHDRFAIL));
140 }
141
142 // Detach shaders after linking but before deleting them
143 glDetachShader(mlxctx->shaderprogram, vshader);
144 glDetachShader(mlxctx->shaderprogram, fshader);
145
146 // Delete shaders
149 glUseProgram(mlxctx->shaderprogram);
150 for (size_t i = 0; i < 16; i++)
151 mlxctx->bound_textures[i] = 0;
152 return (true);
153}
154
155//= Public =//
156
157// NOTE: https://www.glfw.org/docs/3.3/group__window.html
158
159// Default settings
160int32_t mlx_settings[MLX_SETTINGS_MAX] = {false, false, false, true, false};
162bool sort_queue = false;
163
165{
167 MLX_ASSERT(width > 0, "Window width must be positive");
168 MLX_ASSERT(height > 0, "Window height must be positive");
169
170 bool init;
171 mlx_t* mlx;
172 if (!(init = glfwInit()))
173 return ((void*)mlx_error(MLX_GLFWFAIL));
174 if (!(mlx = calloc(1, sizeof(mlx_t))))
175 return ((void*)mlx_error(MLX_MEMFAIL));
176 if (!(mlx->context = calloc(1, sizeof(mlx_ctx_t))))
177 return (free(mlx), (void*)mlx_error(MLX_MEMFAIL));
178
179 mlx_ctx_t* const mlxctx = mlx->context;
180 mlx->window = NULL;
181 mlx->width = width;
182 mlx->height = height;
183 mlxctx->initialWidth = width;
184 mlxctx->initialHeight = height;
185
186 // NOTE(W2): For emscripten, this value will be ignored anyway.
188#ifdef EMSCRIPTEN
194#else
200#endif
201#ifdef __APPLE__
203#endif
206 return (glfwTerminate(), (void*)mlx_error(MLX_WINFAIL));
208 return (mlx_terminate(mlx), NULL);
210 return (mlx);
211}
212
214{
215 MLX_ASSERT(setting >= 0 && setting < MLX_SETTINGS_MAX, "Invalid settings value");
217}
enum mlx_settings mlx_settings_t
enum mlx_errno mlx_errno_t
mlx_settings
Definition MLX42.h:398
@ MLX_DECORATED
Definition MLX42.h:402
@ MLX_MAXIMIZED
Definition MLX42.h:401
@ MLX_HEADLESS
Definition MLX42.h:403
@ MLX_FULLSCREEN
Definition MLX42.h:400
@ MLX_SETTINGS_MAX
Definition MLX42.h:404
mlx_errno
Definition MLX42.h:371
@ MLX_MEMFAIL
Definition MLX42.h:383
@ MLX_FRAGFAIL
Definition MLX42.h:381
@ MLX_SHDRFAIL
Definition MLX42.h:382
@ MLX_VERTFAIL
Definition MLX42.h:380
@ MLX_GLADFAIL
Definition MLX42.h:384
@ MLX_WINFAIL
Definition MLX42.h:386
@ MLX_GLFWFAIL
Definition MLX42.h:385
@ MLX_SUCCESS
Definition MLX42.h:372
void mlx_terminate(mlx_t *mlx)
Definition mlx_exit.c:36
#define MLX_NONNULL(var)
Definition MLX42_Int.h:46
bool mlx_error(mlx_errno_t val)
Definition mlx_error.c:43
const char * vert_shader
const char * frag_shader
#define MLX_ASSERT(cond, msg)
Definition MLX42_Int.h:45
#define MLX_SWAP_INTERVAL
Definition MLX42_Int.h:37
GLfloat value
Definition glad.h:2667
#define GL_TRUE
Definition glad.h:140
#define glAttachShader
Definition glad.h:3344
#define glGetUniformLocation
Definition glad.h:3401
#define GL_TEXTURE0
Definition glad.h:705
#define GL_FRAGMENT_SHADER
Definition glad.h:934
#define glGenBuffers
Definition glad.h:3298
GLAPI int gladLoadGLLoader(GLADloadproc)
Definition glad.c:2503
#define glGetShaderInfoLog
Definition glad.h:3395
#define glShaderSource
Definition glad.h:3431
#define glBindBuffer
Definition glad.h:3292
#define glEnable
Definition glad.h:2015
#define glBindVertexArray
Definition glad.h:3874
#define glVertexAttribIPointer
Definition glad.h:3679
#define GL_DEPTH_TEST
Definition glad.h:198
#define glCreateShader
Definition glad.h:3356
#define glGetProgramiv
Definition glad.h:3386
#define GL_SRC_ALPHA
Definition glad.h:161
GLuint shader
Definition glad.h:3342
GLint GLsizei GLsizei height
Definition glad.h:1965
#define GL_BYTE
Definition glad.h:250
GLint GLsizei width
Definition glad.h:1965
unsigned int GLuint
Definition glad.h:99
#define GL_FLOAT
Definition glad.h:256
#define glEnableVertexAttribArray
Definition glad.h:3371
#define GL_ARRAY_BUFFER
Definition glad.h:857
#define glGenVertexArrays
Definition glad.h:3880
GLint GLint GLsizei GLint GLenum GLenum type
Definition glad.h:1980
#define glVertexAttribPointer
Definition glad.h:3605
#define GL_COMPILE_STATUS
Definition glad.h:962
#define glDeleteProgram
Definition glad.h:3359
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
#define GL_BLEND
Definition glad.h:215
#define GL_ONE_MINUS_SRC_ALPHA
Definition glad.h:162
#define glViewport
Definition glad.h:2090
GLuint GLsizei GLsizei * length
Definition glad.h:3372
#define GL_FALSE
Definition glad.h:139
#define glUniform1i
Definition glad.h:3449
#define glDeleteShader
Definition glad.h:3362
void *(* GLADloadproc)(const char *name)
Definition glad.h:55
#define GL_VERTEX_SHADER
Definition glad.h:935
int GLint
Definition glad.h:98
#define glCompileShader
Definition glad.h:3350
#define glCreateProgram
Definition glad.h:3353
#define glGetProgramInfoLog
Definition glad.h:3389
#define glLinkProgram
Definition glad.h:3428
#define glUseProgram
Definition glad.h:3434
#define GL_LINK_STATUS
Definition glad.h:963
#define glGetShaderiv
Definition glad.h:3392
#define glActiveTexture
Definition glad.h:2981
#define glDetachShader
Definition glad.h:3365
#define glBlendFunc
Definition glad.h:2024
static void framebuffer_callback(GLFWwindow *window, int width, int height)
Definition mlx_init.c:17
mlx_t * mlx_init(int32_t width, int32_t height, const char *title, bool resize)
Definition mlx_init.c:164
static bool mlx_create_buffers(mlx_t *mlx)
Definition mlx_init.c:23
void mlx_set_setting(mlx_settings_t setting, int32_t value)
Definition mlx_init.c:213
static bool mlx_init_render(mlx_t *mlx)
Definition mlx_init.c:101
static uint32_t mlx_compile_shader(const char *code, int32_t type)
Definition mlx_init.c:78
bool sort_queue
Definition mlx_init.c:162
Definition MLX42.h:361
void * context
Definition MLX42.h:363
int32_t width
Definition MLX42.h:364
int32_t height
Definition MLX42.h:365
void * window
Definition MLX42.h:362