diff options
Diffstat (limited to 'prge_draw.c')
-rw-r--r-- | prge_draw.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/prge_draw.c b/prge_draw.c new file mode 100644 index 0000000..4228d68 --- /dev/null +++ b/prge_draw.c @@ -0,0 +1,78 @@ +void clear_window(PRGEWindow wnd, V3 clear_color) +{ + glClearColor(clear_color.x, clear_color.y, clear_color.z, 1.0f); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); +} + +void begin3d(PRGEWindow wnd, Shader shader, Camera camera) +{ + F32 ar; + MAT4 proj, view; + + ar = (F32)wnd.w/(F32)wnd.h; + proj = camera_persp(camera, ar); + view = getfpviewmat(&camera); + + glUseProgram(shader.id); + + setmat4fv(shader.id, PRGE_SHADER_PROJ_MAT, proj); + setmat4fv(shader.id, PRGE_SHADER_VIEW_MAT, view); +} + +void end3d(void) +{ + glUseProgram(0); +} + +void begin3d_alpha(PRGEWindow wnd, Shader shader, Camera camera) +{ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + begin3d(wnd, shader, camera); +} + +void end3d_alpha(void) +{ + end3d(); + glDisable(GL_BLEND); +} + +void draw_mesh(Mesh mesh) +{ + S32 i; + + ASSERT(mesh.vao); + + glBindVertexArray(mesh.vao); + + for (i = 0; i < mesh.ntextures; i++) { + glActiveTexture(GL_TEXTURE0+i); + glBindTexture(GL_TEXTURE_2D, mesh.textures[i].id); + } + + if (mesh.ebo) + glDrawElements(GL_TRIANGLES, mesh.nindices, GL_UNSIGNED_INT, 0); + else + glDrawArrays(GL_TRIANGLES, 0, mesh.nverts); + + glBindVertexArray(0); +} + +void draw_model(Shader shader, Model model) +{ + MAT4 modelm, + meshm, + resm; + S32 i; + + modelm = rotatemat4(MAT4_IDENTITY, model.rotate); + modelm = translmat4(modelm, model.origin); + for (i = 0; i < model.nmeshes; i++) { + meshm = rotatemat4(MAT4_IDENTITY, model.meshes[i].rotate); + meshm = translmat4(meshm, model.meshes[i].origin); + resm = mulmat4(modelm, meshm); + + setmat4fv(shader.id, PRGE_SHADER_MODEL_MAT, resm); + draw_mesh(model.meshes[i]); + } +} |