{"id":17476685,"url":"https://github.com/anthofoxo/vulpengine","last_synced_at":"2026-04-28T20:32:04.792Z","repository":{"id":258085522,"uuid":"860694614","full_name":"anthofoxo/vulpengine","owner":"anthofoxo","description":"Experimental early-stage rendering engine for Windows and Linux.","archived":false,"fork":false,"pushed_at":"2024-10-16T02:43:21.000Z","size":74,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-10-18T22:10:04.157Z","etag":null,"topics":["cpp","cpp20","opengl","opengl4"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anthofoxo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-21T00:21:11.000Z","updated_at":"2024-10-16T02:42:44.000Z","dependencies_parsed_at":"2024-10-17T15:59:01.568Z","dependency_job_id":"12863a52-dd71-4ae0-8b46-083f48f41a8a","html_url":"https://github.com/anthofoxo/vulpengine","commit_stats":null,"previous_names":["anthofoxo/vulpengine"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/anthofoxo/vulpengine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthofoxo%2Fvulpengine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthofoxo%2Fvulpengine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthofoxo%2Fvulpengine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthofoxo%2Fvulpengine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anthofoxo","download_url":"https://codeload.github.com/anthofoxo/vulpengine/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthofoxo%2Fvulpengine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32398493,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T19:38:08.556Z","status":"ssl_error","status_checked_at":"2026-04-28T19:37:55.688Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cpp","cpp20","opengl","opengl4"],"created_at":"2024-10-18T19:09:14.682Z","updated_at":"2026-04-28T20:32:04.776Z","avatar_url":"https://github.com/anthofoxo.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Vulpengine\nVulpengine is an experimental early-stage rendering engine for Windows and Linux. Vulpengine is a general toolset developed by myself used to help myself develop games.\n\n## Downloading the repo\nVulpengine is designed to be used as a static library and git submodule. Add Vulpengine to your submodules with `git submodule add https://github.com/anthofoxo/vulpengine your_submodule_path`.\n\n## Required Dependencies\nVulpengine requires C++20 Support.\n\nVulpengine requires the following dependencies.\n* [GLFW 3.4](https://github.com/glfw/glfw/tree/3.4)\n* [Glad](https://gen.glad.sh/)\n\n## OpenGL Requirements and Support\nOpenGL 4.5+ is required.\nOptionally supports:\n* GL_ARB_texture_filter_anisotropic (4.6+ Supported)\n* GL_EXT_texture_filter_anisotropic\n\n## Building\n\n### Include Paths\nBuilding Vulpengine is kept simple. Add `include/vulpengine` to the include paths and add the include paths for all the required libraries.\n* `include/vulpengine`\n* `glfw/include`\n* `glad/include`\n\n### Platforms\nVulpengine supports Windows and Linux.\n* `#define VP_WINDOWS` for Windows builds.\n* `#define VP_LINUX` for Linux builds.\n\n#### Linux\nIf you're building GLFW yourself you will need to generate the xdg headers for wayland. We've bundled a small tool for this `glfw_generate_xdg.sh`.\n\n### Configurations\nVulpengine supports 3 different configurations. If you only have `debug` and `release` then you can use those.\n\n* For debug builds `#define VP_DEBUG`.\n* For release builds `#define VP_RELEASE`.\n* For dist builds `#define VP_DIST`.\n\nDist is similar to release but with extra debugging tools stripped.\n\n### Defines\n* You should define `GLFW_INCLUDE_NONE`.\n* Define `VP_ENTRY_WINMAIN` if you're using the `WinMain` entrypoint.\n\n## Optional Dependencies\n\n### Spdlog\nVulpengine supports [spdlog](https://github.com/gabime/spdlog/tree/v1.14.1). To enable spdlog support add `spdlog/include` to the include paths.\n\n### Tracy\nVulpengine can detect and use [Tracy](https://github.com/wolfpld/tracy/tree/v0.11.1) if available.\n\nAdd `tracy/public` to your include paths. Make sure to `#define TRACY_ENABLE` too.\n\n### RenderDoc\nVulpengine can support [RenderDoc](https://renderdoc.org/) detection. RenderDoc installations include `renderdoc_app.h` in the installation directory. Add this directory to the include paths for Vulpengine to detect and enable support for it.\n\nThe code below shows how to detect RenderDoc.\n\nIf enabled with `VP_FEATURE_RDOC_UNSUPPORTED` the parameter may be set to `true` to attempt to inject RenderDoc at startup. While this does works currently, it *IS NOT SUPPORTED* by the RenderDoc developers and may break.\n```cpp\n#include \u003cvulpengine/vp_rdoc.hpp\u003e\n\n// Do this before graphics api creation\nvulpengine::experimental::rdoc::setup(false);\n```\n\n## stb_image\nIf stb_image is available the `Image` class will be available along with helper functions for `Texture` creation and upload.\n\n# glm\nIf glm is available, the `Transform` and `Frustum` features will be enabled.\n\n## General Usage\nOnce Vulpengine is built. Simply add our `include` directory to your include paths.\n\nAll Vulpengine headers are prefixed with `vp_` to avoid name clashes. You may directly add `include/vulpengine` if you like.\n\n## Entry Point / Main Function\nVulpengine will define the main entrypoint, so you can't directly use that. This is mainly to perform some backend work to ensure logging will work.\n\nOtherwise no other processing happens and the argments are directly forwarded to the Vulpengine entry point.\n\n```cpp\n#include \u003cvulpengine/vp_entry.hpp\u003e\n\nint vulpengine::main(int argc, char* argv[]) {\n\treturn 0;\n}\n```\n\n## Wrap (Experimental)\nWrap is a simply box type to get around some odd reference semantics when using value types such as `std::optional` and `std::span`.\n\nWrap is simply defined as:\n```cpp\ntemplate\u003cclass T\u003e struct Wrap { T value; };\n```\n\nThese utility functions help to easily assist in wrapping reference types.\n\n### `wrap_cref`\nThis takes a reference type and wraps the reference.\n\n### `wrap_rvref`\nThis should be treated like a `std::move`.\nThis performs a `std::move` on the argument and stores the rvalue reference into the wrapper. This is used during resource transfer into Meshes.\n\n## Mesh API (Experimental)\nMeshes are split into 3 parts. Buffers, Vertex Arrays, and Meshes.\nBuffers are just OpenGL buffers: Array buffers, element buffers, uniform buffers etc. Vertex arrays are OpenGL vertex arrays. These are constructed with a list of buffers and a list of attributes. Meshes are simple containers to transfer ownership of these resources.\n\nFor the example usage assume we have these structs defined:\n```cpp\nstruct Vec3f32 final {\n\tfloat x, y;\n};\n\nstruct Vertex final {\n\tVec3f32 position;\n};\n```\n\n### Buffer (Experimental)\n```cpp\nVertex positions[] = {\n\t{ -0.5f, -0.5f },\n\t{  0.5f, -0.5f },\n\t{  0.0f,  0.5f }\n};\n\nvulpengine::experimental::Buffer vertexBuffer = {{\n\t.content = std::as_bytes(std::span(positions)),\n\t.flags = GL_NONE,\n\t.label = \"Test vertex buffer\" // May be omitted\n}};\n```\n\n### Vertex Array (Experimental)\n```cpp\nvulpengine::experimental::VertexArray vertexArray = {{\n\t.buffers = std::array {\n\t\tvulpengine::experimental::VertexArray::BufferInfo {\n\t\t\t.buffer = vertexBuffer,\n\t\t\t.offset = 0,\n\t\t\t.stride = sizeof(Vertex),\n\t\t\t.divisor = 0\n\t\t}\n\t},\n\t.attributes = std::array {\n\t\tvulpengine::experimental::VertexArray::AttributeInfo {\n\t\t\t.size = 2,\n\t\t\t.type = GL_FLOAT,\n\t\t\t.relativeoffset = offsetof(Vertex, position),\n\t\t\t.bindingindex = 0,\n\t\t}\n\t},\n\t// Optionally attach an index buffer\n\t// .indexBuffer = vulpengine::experimental::wrap_cref(indexBuffer),\n\t.label = \"Test vertex array\"\n}};\n```\n\n### Transfer Ownership into a Mesh\nYou'll typically want to transfer all static data into the Mesh, however the Mesh doesn't require ownership of buffers.\n\n```cpp\nvulpengine::experimental::Mesh mesh = {{\n\t// usage of std::move is required, this hints to the developer that this takes ownership\n\t.vertexArray = std::move(vertexArray),\n\t.buffers = std::array {\n\t\t// wrap_rvref\n\t\tvulpengine::experimental::wrap_rvref(vertexBuffer),\n\t\tvulpengine::experimental::wrap_rvref(indexBuffer),\n\t},\n\t.mode = GL_TRIANGLES,\n\t.count = 3,\n\t// May be omitted or `GL_NONE` if no index buffer is used.\n\t.type = GL_UNSIGNED_INT\n}};\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanthofoxo%2Fvulpengine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanthofoxo%2Fvulpengine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanthofoxo%2Fvulpengine/lists"}