{"id":25420054,"url":"https://github.com/namelessvoid/godot-ingame-mesh-painter","last_synced_at":"2026-02-12T10:32:46.100Z","repository":{"id":262689377,"uuid":"888044607","full_name":"namelessvoid/godot-ingame-mesh-painter","owner":"namelessvoid","description":"Simple in-game mesh painter based on MeshDataTool and material overlay","archived":false,"fork":false,"pushed_at":"2024-11-13T23:43:28.000Z","size":15,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-23T01:37:35.717Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"GDScript","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/namelessvoid.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,"zenodo":null}},"created_at":"2024-11-13T18:04:33.000Z","updated_at":"2025-07-31T12:25:12.000Z","dependencies_parsed_at":"2024-11-13T19:19:50.220Z","dependency_job_id":"b3c892ef-991a-4c1e-98fa-fe87a5c42c00","html_url":"https://github.com/namelessvoid/godot-ingame-mesh-painter","commit_stats":null,"previous_names":["namelessvoid/godot-ingame-mesh-painter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/namelessvoid/godot-ingame-mesh-painter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/namelessvoid%2Fgodot-ingame-mesh-painter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/namelessvoid%2Fgodot-ingame-mesh-painter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/namelessvoid%2Fgodot-ingame-mesh-painter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/namelessvoid%2Fgodot-ingame-mesh-painter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/namelessvoid","download_url":"https://codeload.github.com/namelessvoid/godot-ingame-mesh-painter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/namelessvoid%2Fgodot-ingame-mesh-painter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29363153,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T08:51:36.827Z","status":"ssl_error","status_checked_at":"2026-02-12T08:51:26.849Z","response_time":55,"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":[],"created_at":"2025-02-16T19:35:41.334Z","updated_at":"2026-02-12T10:32:46.078Z","avatar_url":"https://github.com/namelessvoid.png","language":"GDScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Godot In-Game Mesh Painter\n\nSimple in-game painter that allows to draw on arbitrary meshes.\n\n## Example scene\n\nThe project comes with an example scene (`main.tscn`) that includes two meshes that you can paint on (red drawing):\n\n![image](https://github.com/user-attachments/assets/ba74dc7f-76f3-44c8-869e-b65cfa887c2a)\n\nTo move the camera, hold and press right mouse button and move your mouse. Use mouse scroll wheel to zoom.\n\n## How to use\n\nAdd a `Node` to your scene and assign the `Painter` (`painter.gd`) script to it. To make a meshes paintable, assign it or one of its parents to group \"paintable\" (the group name can be configured via exported variable `paintable_group` on the `Painter` instance). Those nodes and their children will be searched recursively for `MeshInstance` nodes. All of them will be picked up by the painter and you will be able to drawn on them.\n\nTo draw, just click on the mesh :)\n\n## How it works\n\nThe `Painter` collects all `MeshInstance`s nodes that are in group `paintable_group` or have a parent that is in `paintable_group`. It parses their `mesh` using `MeshDataTool`. For this to work, it any non-`ArrayMesh` to `ArrayMesh` to be able to initialize the `MeshDataTool`. It also sets the `overlay_material` to an all transparent texture (used to draw on).\n\nPainting is done by a brute-force ray cast. The painter iterates each face of each mesh and performs an `Geometry3D.ray_intersects_triangle()` to detect if the face was clicked. Since it is brute-force, all faces are processed to detect the face that is closest to the camera. If a hitpoint is detected, the corresponding UV coordinate is extracted via barycentric interpolation of the face vertex UVs. It then sets the corresponding pixel of the `overlay_material`'s texture (to red, right now).\n\n## Credits\n\nThis project was heavily inspired by [Godot 4 Vertex Painter](https://github.com/bikemurt/godot-vertex-painter) and [In-game Splat Map Texture Painting](https://alfredbaudisch.com/blog/gamedev/godot-engine/godot-engine-in-game-splat-map-texture-painting-dirt-removal-effect/), basically copying their ideas.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnamelessvoid%2Fgodot-ingame-mesh-painter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnamelessvoid%2Fgodot-ingame-mesh-painter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnamelessvoid%2Fgodot-ingame-mesh-painter/lists"}