create texture and shader functions;

Canoi d0dd6d90 080b9687

Changed files
+148 -34
+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
··· 97 97 extern "C" { 98 98 #endif 99 99 100 - BITE_API void bite_simple_triangle(void); 100 + BITE_API void bite_simple_triangle(be_Context* ctx); 101 101 102 102 /********************* 103 103 * Core
+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