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]); } }