{"id":15051864,"url":"https://github.com/nojoule/joulegl","last_synced_at":"2025-04-10T03:00:27.733Z","repository":{"id":257627358,"uuid":"854797554","full_name":"nojoule/joulegl","owner":"nojoule","description":" Low-level rendering framework in python","archived":false,"fork":false,"pushed_at":"2024-09-17T20:13:57.000Z","size":352,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-24T04:24:18.681Z","etag":null,"topics":["glsl","opengl","python","rendering-3d-graphics"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nojoule.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-09T19:45:26.000Z","updated_at":"2024-12-11T18:12:39.000Z","dependencies_parsed_at":"2024-09-17T20:50:57.252Z","dependency_job_id":"120122e2-d49f-4aaa-93b1-434bbb8c42eb","html_url":"https://github.com/nojoule/joulegl","commit_stats":null,"previous_names":["nojoule/joulegl"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nojoule%2Fjoulegl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nojoule%2Fjoulegl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nojoule%2Fjoulegl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nojoule%2Fjoulegl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nojoule","download_url":"https://codeload.github.com/nojoule/joulegl/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248148218,"owners_count":21055547,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["glsl","opengl","python","rendering-3d-graphics"],"created_at":"2024-09-24T21:37:04.642Z","updated_at":"2025-04-10T03:00:27.692Z","avatar_url":"https://github.com/nojoule.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JouleGL\nLow level rendering framework using OpenGL python bindings. For feedback or questions, feel free to join my stream and community at https://www.twitch.tv/nojoule .\n\n## Test Coverage\n\u003c!-- Pytest Coverage Comment:Begin --\u003e\n\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/README.md\"\u003e\u003cimg alt=\"Coverage\" src=\"https://img.shields.io/badge/Coverage-86%25-green.svg\" /\u003e\u003c/a\u003e\u003cdetails\u003e\u003csummary\u003eCoverage Report \u003c/summary\u003e\u003ctable\u003e\u003ctr\u003e\u003cth\u003eFile\u003c/th\u003e\u003cth\u003eStmts\u003c/th\u003e\u003cth\u003eMiss\u003c/th\u003e\u003cth\u003eCover\u003c/th\u003e\u003cth\u003eMissing\u003c/th\u003e\u003c/tr\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd colspan=\"5\"\u003e\u003cb\u003ejoulegl/opengl_helper\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/buffer.py\"\u003ebuffer.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e166\u003c/td\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003e99%\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/buffer.py#L104\"\u003e104\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/frame_buffer.py\"\u003eframe_buffer.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e33\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/screenshot.py\"\u003escreenshot.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e29\u003c/td\u003e\u003ctd\u003e6\u003c/td\u003e\u003ctd\u003e73%\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/screenshot.py#L27-L\u003e29\"\u003e27\u0026ndash;\u003e29\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/screenshot.py#L38-L40\"\u003e38\u0026ndash;40\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/screenshot.py#L58-L61\"\u003e58\u0026ndash;61\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/texture.py\"\u003etexture.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e46\u003c/td\u003e\u003ctd\u003e9\u003c/td\u003e\u003ctd\u003e71%\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/texture.py#L37-L38\"\u003e37\u0026ndash;38\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/texture.py#L46-L47\"\u003e46\u0026ndash;47\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/texture.py#L60-L62\"\u003e60\u0026ndash;62\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/texture.py#L65\"\u003e65\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/texture.py#L74\"\u003e74\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/vertex_data_handler.py\"\u003evertex_data_handler.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e65\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd colspan=\"5\"\u003e\u003cb\u003ejoulegl/opengl_helper/base\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/base/data_set.py\"\u003edata_set.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e41\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/base/shader.py\"\u003eshader.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e68\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/base/shader_handler.py\"\u003eshader_handler.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e18\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/base/shader_parser.py\"\u003eshader_parser.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e52\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd colspan=\"5\"\u003e\u003cb\u003ejoulegl/opengl_helper/compute\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/compute/shader.py\"\u003eshader.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e36\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/compute/shader_handler.py\"\u003eshader_handler.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e15\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd colspan=\"5\"\u003e\u003cb\u003ejoulegl/opengl_helper/render\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/render/shader.py\"\u003eshader.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e25\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/render/shader_handler.py\"\u003eshader_handler.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e21\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/render/utility.py\"\u003eutility.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e75\u003c/td\u003e\u003ctd\u003e8\u003c/td\u003e\u003ctd\u003e83%\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/render/utility.py#L126-L131\"\u003e126\u0026ndash;131\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/render/utility.py#L138\"\u003e138\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/render/utility.py#L143\"\u003e143\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/render/utility.py#L146\"\u003e146\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/opengl_helper/render/utility.py#L154-L155\"\u003e154\u0026ndash;155\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd colspan=\"5\"\u003e\u003cb\u003ejoulegl/processing\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/processing/processor.py\"\u003eprocessor.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e9\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd colspan=\"5\"\u003e\u003cb\u003ejoulegl/rendering\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/rendering/renderer.py\"\u003erenderer.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e34\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd colspan=\"5\"\u003e\u003cb\u003ejoulegl/utility\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/app.py\"\u003eapp.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e57\u003c/td\u003e\u003ctd\u003e2\u003c/td\u003e\u003ctd\u003e97%\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/app.py#L85-L86\"\u003e85\u0026ndash;86\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/camera.py\"\u003ecamera.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e142\u003c/td\u003e\u003ctd\u003e14\u003c/td\u003e\u003ctd\u003e90%\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/camera.py#L141-L155\"\u003e141\u0026ndash;155\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/camera.py#L222-L225\"\u003e222\u0026ndash;225\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/definitions.py\"\u003edefinitions.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e14\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/file.py\"\u003efile.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e72\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/glcontext.py\"\u003eglcontext.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e14\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/log_handling.py\"\u003elog_handling.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e15\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/performance.py\"\u003eperformance.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e54\u003c/td\u003e\u003ctd\u003e21\u003c/td\u003e\u003ctd\u003e59%\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/performance.py#L13-L38\"\u003e13\u0026ndash;38\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/performance.py#L54-L55\"\u003e54\u0026ndash;55\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/performance.py#L62-L66\"\u003e62\u0026ndash;66\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/performance.py#L71-L\u003e75\"\u003e71\u0026ndash;\u003e75\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/singleton.py\"\u003esingleton.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e10\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py\"\u003ewindow.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e173\u003c/td\u003e\u003ctd\u003e85\u003c/td\u003e\u003ctd\u003e40%\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L18\"\u003e18\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L23-L26\"\u003e23\u0026ndash;26\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L35\"\u003e35\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L39-L41\"\u003e39\u0026ndash;41\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L56\"\u003e56\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L105-L106\"\u003e105\u0026ndash;106\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L114-L116\"\u003e114\u0026ndash;116\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L119\"\u003e119\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L122-L133\"\u003e122\u0026ndash;133\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L136-L142\"\u003e136\u0026ndash;142\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L145-L148\"\u003e145\u0026ndash;148\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L151-L158\"\u003e151\u0026ndash;158\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L161-L189\"\u003e161\u0026ndash;189\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L203-L209\"\u003e203\u0026ndash;209\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L217\"\u003e217\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L230\"\u003e230\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L232\"\u003e232\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L236\"\u003e236\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L243\"\u003e243\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L249-L252\"\u003e249\u0026ndash;252\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L255-L258\"\u003e255\u0026ndash;258\u003c/a\u003e, \u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window.py#L266-L\u003e268\"\u003e266\u0026ndash;\u003e268\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u0026nbsp; \u0026nbsp;\u003ca href=\"https://github.com/nojoule/joulegl/blob/main/joulegl/utility/window_config.py\"\u003ewindow_config.py\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e15\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e100%\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cb\u003eTOTAL\u003c/b\u003e\u003c/td\u003e\u003ctd\u003e\u003cb\u003e1299\u003c/b\u003e\u003c/td\u003e\u003ctd\u003e\u003cb\u003e146\u003c/b\u003e\u003c/td\u003e\u003ctd\u003e\u003cb\u003e86%\u003c/b\u003e\u003c/td\u003e\u003ctd\u003e\u0026nbsp;\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/details\u003e\n\u003c!-- Pytest Coverage Comment:End --\u003e\n\n## Installation\n\nInstall using pip:\n```Shell\npip install -r requirements.txt\n```\n\n## Usage\n\nClone this repo and look in the [demo](./demo) folder for examples.\n\n### Demo: Balls\nShowing compute shader applying noise to vertex positions with dynamic use of two different shader for basic triangles or more complex geometry shader.\n\n```Shell\npython demo/balls/balls.py\n```\n\n![balls, triangle connections between random positions](./docs/balls_demo.png)\n![balls, random positions rendered as spheres](./docs/balls_demo_2.png)\n\n### Demo: Block\nShowcasing dynamic shader generation.\n\n```Shell\npython demo/block/block.py\n```\n\n![block, positions rendered as cubes, with varying color and shading](./docs/block_demo.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnojoule%2Fjoulegl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnojoule%2Fjoulegl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnojoule%2Fjoulegl/lists"}