{"id":24692730,"url":"https://github.com/zacharycarter/voodoo","last_synced_at":"2025-07-25T23:38:07.828Z","repository":{"id":215930563,"uuid":"739128095","full_name":"zacharycarter/voodoo","owner":"zacharycarter","description":"3D game programming and rapid prototyping library.","archived":false,"fork":false,"pushed_at":"2024-11-20T19:27:15.000Z","size":43844,"stargazers_count":46,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-19T01:53:56.883Z","etag":null,"topics":["3d","3d-graphics","c","emscripten","emscripten-game","game","game-development","games","janet","janet-lang","wasm","webgpu","wgpu"],"latest_commit_sha":null,"homepage":"","language":"C","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/zacharycarter.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-01-04T20:50:54.000Z","updated_at":"2025-01-14T07:14:42.000Z","dependencies_parsed_at":"2024-06-14T07:42:50.775Z","dependency_job_id":"8ff64f79-7d47-49aa-868f-f5f89563d395","html_url":"https://github.com/zacharycarter/voodoo","commit_stats":null,"previous_names":["zacharycarter/voodoo"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zacharycarter%2Fvoodoo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zacharycarter%2Fvoodoo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zacharycarter%2Fvoodoo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zacharycarter%2Fvoodoo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zacharycarter","download_url":"https://codeload.github.com/zacharycarter/voodoo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235757006,"owners_count":19040482,"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":["3d","3d-graphics","c","emscripten","emscripten-game","game","game-development","games","janet","janet-lang","wasm","webgpu","wgpu"],"created_at":"2025-01-26T20:17:05.095Z","updated_at":"2025-01-26T20:17:05.609Z","avatar_url":"https://github.com/zacharycarter.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# voodoo\n![voodoo](https://github.com/zacharycarter/voodoo/blob/master/screenshots/voodoo.png?raw=true)\n\nvoodoo is a 3D game programming library written in C.\n\nvoodoo exposes an API that is intended to be invoked via scripts written in [Janet](https://janet-lang.org/).\n\nvoodoo is presently focused on creating games for the browser. Support for more platforms is planned.\n\nvoodoo is very much WIP.\n\n## Screenshot reflecting current state of renderer\n![ss0.png](screenshots/ss0.png)\n\n\n\n## Video demonstration\n[assets/scripts/game.janet](https://github.com/zacharycarter/voodoo/assets/1181513/b061174c-ac01-4f5e-84a0-370eb4942dc0)\n\n\n## [Example Usage](https://github.com/zacharycarter/voodoo/blob/master/assets/scripts/game.janet)\n\n```janet\n(def actions {:up 0\n              :down 1\n              :left 2\n              :right 3\n              :num 4})\n\n(def bindings @{(actions :up) [input/key/up input/gamepad/dpad/up]\n                (actions :down) [input/key/down input/gamepad/dpad/down]\n                (actions :left) [input/key/left input/gamepad/dpad/left]\n                (actions :right) [input/key/right input/gamepad/dpad/right]})\n\n(def state @{:camera nil\n             :doll-asset: nil\n             :player: nil})\n\n(defn init []\n  (set (state :doll-asset) (asset/load \"doll\" \"assets/dolls/character.doll\"))\n  (set (state :camera) (game/object @[0.0 0.0 0.0] @[0.0 0.0 0.0] @[0.0 0.0 0.0 0.0]))\n  (game/object/set (state :camera) component/camera (cam/orbit @{:min-dist 1.0\n                                    :max-dist 50.0\n                                    :center @[0.0 0.0 0.0]\n                                    :distance 5.0\n                                    :latitude 45.0\n                                    :longitude 45.0\n                                    :nearz 0.01\n                                    :farz 2000.0}))\n\n  (v3d/cube @[0.0 5.0 0.0] @[1.0 1.0 1.0])\n  (v3d/cube @[0.0 -0.9375 0.0] @[5.0 0.125 5.0])\n  (set (state :player) (game/object @[0.0 0.0 0.0] @[1.0 1.0 1.0] @[0.0 0.0 0.0 0.0]))\n  (game/object/set (state :player) component/doll (v3d/doll/create (state :doll-asset)))\n  (loop [[action binding] :pairs bindings]\n    (if (not= (get binding 0) input/invalid)\n      (input/bind input/layer/user (get binding 0) action))\n    (if (not= (get binding 1) input/invalid)\n      (input/bind input/layer/user (get binding 1) action))))\n\n(defn event [e]\n  (def camera\n    (game/object/get\n      (state :camera)\n      component/camera))\n  (game/object/set (state :camera) component/camera (cam/handle-event camera e)))\n\n(defn update-doll []\n  (def player-transform\n    (game/object/get\n      (state :player)\n      component/transform))\n  (def doll\n    (game/object/get\n      (state :player)\n      component/doll))\n\n  (if (\u003e (input/state (actions :up)) 0)\n    (game/object/set (state :player) component/doll\n                     @{:blend_ratio (min (+ (doll :blend_ratio) 0.1) 1.0)})\n    (if (\u003e (input/state (actions :down)) 0)\n      (game/object/set (state :player) component/doll\n                       @{:blend_ratio (max (- (doll :blend_ratio) 0.1) 0.0)})))\n  (if (\u003e (input/state (actions :left)) 0)\n    (game/object/set (state :player) component/transform\n                     @{:position @{:x (+ ((player-transform :position) :x) 0.1)}})\n    (if (\u003e (input/state (actions :right)) 0)\n      (game/object/set (state :player) component/transform\n                       @{:position @{:x (- ((player-transform :position) :x) 0.1)}}))))\n\n(defn update []\n  (def camera\n    (game/object/get\n      (state :camera)\n      component/camera))\n  (update-doll)\n  (cam/update camera)\n  (dbg/draw/camera camera)\n  (dbg/draw/grid 0)\n  (v3d/draw camera))\n\n(defn shutdown [])\n\n(defn voodoo []\n  @{:width 960\n    :height 540\n    :init init\n    :event event\n    :update update\n    :shutdown shutdown})\n```\n\n## Roadmap\n- [x] Memory management \u0026 Allocators\n- [ ] Asset pipeline\n- [ ] Build system :construction:\n- [x] Virtual file system\n- [x] Asset management system\n- [x] Fiber-based job syste m\n- [x] Basic orbit camera\n- [x] Debug drawing\n- [x] Scripting\n- [ ] Visual scripting\n- [ ] Forward renderer :construction:\n- [ ] ImGui\n- [x] Entity component system\n- [x] Skeletal animation\n- [x] Animation blending\n- [ ] Audio\n- [ ] Physics\n- [ ] Networking\n- [x] Web (WASM) support\n- [ ] Windows support\n- [ ] Linux support\n- [ ] MacOS support\n- [ ] Android support\n- [ ] iOS support\n\n## License\nvoodoo is licensed under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzacharycarter%2Fvoodoo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzacharycarter%2Fvoodoo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzacharycarter%2Fvoodoo/lists"}