+121
-32
bite.c
+121
-32
bite.c
···
23
23
#include <time.h>
24
24
#endif
25
25
26
+
struct be_Shader {
27
+
GLuint handle;
28
+
GLint world_uniform, modelview_uniform;
29
+
};
30
+
31
+
struct be_Texture {
32
+
GLuint handle;
33
+
int width, height;
34
+
int filter[2];
35
+
int wrap[2];
36
+
};
37
+
38
+
struct be_Framebuffer {
39
+
GLuint handle;
40
+
be_Texture texture;
41
+
};
42
+
26
43
struct be_Window {
27
44
int x, y;
28
45
int width, height;
···
48
65
#else
49
66
GLXContext gl_context;
50
67
#endif
68
+
51
69
int mode;
70
+
GLuint vao, vbo;
52
71
};
53
72
54
73
struct be_Context {
···
210
229
DEFINE_GL(void, glGetProgramiv, GLuint, GLenum, GLint*); // glGetProgramiv
211
230
DEFINE_GL(void, glGetProgramInfoLog, GLuint, GLsizei, GLsizei*, char*); // glGetProgramInfoLog
212
231
DEFINE_GL(void, glUseProgram, GLuint); // glUseProgram
232
+
DEFINE_GL(void, glDeleteProgram, GLuint); // glUseProgram
213
233
214
234
DEFINE_GL(void, glGetActiveUniform, GLuint, GLuint, GLint, GLint*, GLint*, GLint*, char*);
215
235
DEFINE_GL(GLint, glGetUniformLocation, GLuint, const char*);
···
296
316
}
297
317
#endif
298
318
299
-
void bite_simple_triangle(void) {
319
+
void bite_simple_triangle(be_Context* ctx) {
300
320
glClearColor(0.3f, 0.4f, 0.4f, 1.f);
301
321
glClear(GL_COLOR_BUFFER_BIT);
302
-
glBegin(GL_TRIANGLES);
303
-
glColor3f(1.f, 0.f, 0.f);
304
-
glVertex2f(0.f, 0.5f);
305
-
glColor3f(0.f, 1.f, 0.f);
306
-
glVertex2f(-0.5f, -0.5f);
307
-
glColor3f(0.f, 0.f, 1.f);
308
-
glVertex2f(0.5f, -0.5f);
309
-
glEnd();
322
+
// fprintf(stdout, "VAO: %d\n", ctx->render.vao);
323
+
glBindVertexArray(ctx->render.vao);
324
+
glDrawArrays(GL_TRIANGLES, 0, 3);
325
+
glBindVertexArray(0);
326
+
// glBegin(GL_TRIANGLES);
327
+
// glColor3f(1.f, 0.f, 0.f);
328
+
// glVertex2f(0.f, 0.5f);
329
+
// glColor3f(0.f, 1.f, 0.f);
330
+
// glVertex2f(-0.5f, -0.5f);
331
+
// glColor3f(0.f, 0.f, 1.f);
332
+
// glVertex2f(0.5f, -0.5f);
333
+
// glEnd();
310
334
}
311
335
312
336
be_Config bite_init_config(const char* title, int w, int h) {
···
412
436
* Render
413
437
*********************/
414
438
439
+
static GLuint _compile_shader(GLenum type, const char* src) {
440
+
GLuint shader = glCreateShader(type);
441
+
glShaderSource(shader, 1, &src, NULL);
442
+
glCompileShader(shader);
443
+
444
+
int success;
445
+
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
446
+
if (!success) {
447
+
char info_log[512];
448
+
glGetShaderInfoLog(shader, 512, NULL, info_log);
449
+
fprintf(stderr, "Failed to compile shader: %s\n", info_log);
450
+
glDeleteShader(shader);
451
+
return 0;
452
+
}
453
+
454
+
return shader;
455
+
}
456
+
415
457
static GLuint _create_program(GLuint vert, GLuint frag) {
416
-
#if 0
458
+
#if 1
417
459
GLuint program = glCreateProgram();
418
460
glAttachShader(program, vert);
419
461
glAttachShader(program, frag);
···
421
463
422
464
int success;
423
465
glGetProgramiv(program, GL_LINK_STATUS, &success);
424
-
if (!success) {}
466
+
if (!success) {
467
+
char info_log[512];
468
+
glGetProgramInfoLog(program, 512, NULL, info_log);
469
+
fprintf(stderr, "Failed to link program: %s\n", info_log);
470
+
glDeleteProgram(program);
471
+
return 0;
472
+
}
425
473
426
474
return program;
427
475
#endif
428
476
return 0;
429
477
}
430
478
431
-
be_Shader* bite_create_shader(const char* vert, const char* frag) {
479
+
be_Texture* bite_create_texture(int width, int height, int format, void* data) {
480
+
be_Texture* texture = (be_Texture*)malloc(sizeof(*texture));
481
+
if (!texture) {
482
+
fprintf(stderr, "Failed to alloc memory for texture\n");
483
+
return NULL;
484
+
}
485
+
texture->filter[0] = GL_NEAREST;
486
+
texture->filter[1] = GL_NEAREST;
487
+
texture->wrap[0] = GL_CLAMP_TO_BORDER;
488
+
texture->wrap[1] = GL_CLAMP_TO_BORDER;
489
+
texture->width = width;
490
+
texture->height = height;
491
+
492
+
glGenTextures(1, &(texture->handle));
493
+
glBindTexture(GL_TEXTURE_2D, texture->handle);
494
+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
495
+
496
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->filter[0]);
497
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->filter[1]);
498
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap[0]);
499
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap[1]);
500
+
glBindTexture(GL_TEXTURE_2D, 0);
501
+
return texture;
502
+
}
503
+
504
+
be_Shader* bite_create_shader(const char* vert_src, const char* frag_src) {
432
505
be_Shader* shader = NULL;
506
+
GLuint vert, frag;
507
+
vert = _compile_shader(GL_VERTEX_SHADER, vert_src);
508
+
if (vert <= 0) return shader;
509
+
frag = _compile_shader(GL_FRAGMENT_SHADER, frag_src);
510
+
if (frag <= 0) return shader;
511
+
512
+
GLuint program = _create_program(vert, frag);
513
+
if (program <= 0) return shader;
514
+
shader = malloc(sizeof(*shader));
515
+
shader->handle = program;
516
+
433
517
return shader;
434
518
}
435
519
···
440
524
void bite_render_clear(void) {
441
525
glClear(GL_COLOR_BUFFER_BIT);
442
526
}
443
-
444
-
struct be_Texture {
445
-
GLuint handle;
446
-
int width, height;
447
-
int filter[2];
448
-
int wrap[2];
449
-
};
450
-
451
-
struct be_Framebuffer {
452
-
GLuint handle;
453
-
be_Texture* texture;
454
-
};
455
-
456
-
struct be_Shader {
457
-
GLuint handle;
458
-
int world_uniform;
459
-
int modelview_uniform;
460
-
};
461
527
462
528
void bite_bind_framebuffer(be_Framebuffer* fbo) {
463
529
#if 0
···
618
684
BITE_RESULT _init_context(be_Context* ctx, const be_Config* conf) {
619
685
if (_init_window(&(ctx->window), conf) != BITE_OK) return BITE_ERROR;
620
686
if (_init_render(&(ctx->render), &(ctx->window), conf) != BITE_OK) return BITE_ERROR;
687
+
be_Render* render = &(ctx->render);
688
+
glGenVertexArrays(1, &(render->vao));
689
+
glGenBuffers(1, &(render->vbo));
690
+
691
+
float vertices[] = {
692
+
0.f, 0.5f, 1.f, 0.f, 0.f,
693
+
-0.5f, -0.5f, 0.f, 1.f, 0.f,
694
+
0.5f, -0.5f, 0.f, 0.f, 1.f
695
+
};
696
+
697
+
glBindVertexArray(render->vao);
698
+
glBindBuffer(GL_ARRAY_BUFFER, render->vbo);
699
+
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
700
+
701
+
glEnableVertexAttribArray(0);
702
+
glEnableVertexAttribArray(1);
703
+
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 6*sizeof(float), (void*)0);
704
+
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 6*sizeof(float), (void*)(2 * sizeof(float)));
705
+
glBindBuffer(GL_ARRAY_BUFFER, 0);
706
+
glBindVertexArray(0);
707
+
708
+
621
709
return BITE_OK;
622
710
}
623
711
···
1270
1358
GET_GL_PROC(glCompileShader);
1271
1359
GET_GL_PROC(glGetShaderiv);
1272
1360
GET_GL_PROC(glGetShaderInfoLog);
1361
+
GET_GL_PROC(glDeleteShader);
1273
1362
GET_GL_PROC(glCreateProgram);
1274
1363
GET_GL_PROC(glAttachShader);
1275
1364
GET_GL_PROC(glLinkProgram);
1276
1365
GET_GL_PROC(glGetProgramiv);
1277
1366
GET_GL_PROC(glGetProgramInfoLog);
1278
-
1279
-
fprintf(stdout, "glCreateProgram: %p\n", glCreateProgram);
1367
+
GET_GL_PROC(glUseProgram);
1368
+
GET_GL_PROC(glDeleteProgram);
1280
1369
}
1281
1370
1282
1371
BITE_BOOL _load_procs(void) {
+1
-1
bite.h
+1
-1
bite.h
+26
-1
main.c
+26
-1
main.c
···
4
4
#include <emscripten.h>
5
5
#endif
6
6
7
+
const char* vert =
8
+
"#version 140\n"
9
+
"in vec2 a_Position;\n"
10
+
"in vec4 a_Color;\n"
11
+
"out vec4 v_Color;\n"
12
+
"void main() {\n"
13
+
" gl_Position = vec4(a_Position.x, a_Position.y, 0, 1.0);\n"
14
+
" v_Color = a_Color;\n"
15
+
"}";
16
+
17
+
const char* frag =
18
+
"#version 140\n"
19
+
"in vec4 v_Color;\n"
20
+
"out vec4 o_FragColor;\n"
21
+
"void main() {"
22
+
" o_FragColor = v_Color;\n"
23
+
"}";
24
+
7
25
// #include <GL/gl.h>
26
+
be_Texture* tex;
27
+
be_Shader* shader;
8
28
9
29
void key_pressed(be_Context* ctx, be_Event* ev) {
10
30
printf("Pressed: %x\n", ev->key.keycode);
···
19
39
// printf("Entering render function\n");
20
40
be_Context* ctx = (be_Context*)data;
21
41
bite_poll_events(ctx);
22
-
bite_simple_triangle();
42
+
bite_use_shader(shader);
43
+
bite_simple_triangle(ctx);
44
+
bite_use_shader(NULL);
23
45
bite_swap(ctx);
24
46
}
25
47
26
48
int main(int argc, char** argv) {
27
49
be_Config c = bite_init_config("bitEngine", 640, 380);
28
50
be_Context* ctx = bite_create(&c);
51
+
be_u8 pixels[] = {255, 255, 255, 255};
52
+
tex = bite_create_texture(1, 1, 0, pixels);
53
+
shader = bite_create_shader(vert, frag);
29
54
#if defined(__EMSCRIPTEN__)
30
55
emscripten_set_main_loop_arg(main_loop, ctx, 0, 1);
31
56
#else