{"id":21971436,"url":"https://github.com/Godlander/objmc","last_synced_at":"2025-07-22T17:33:01.437Z","repository":{"id":39991082,"uuid":"444943506","full_name":"Godlander/objmc","owner":"Godlander","description":"A tool to bypass Minecraft Java Edition model limits by baking vertex data into texture.","archived":false,"fork":false,"pushed_at":"2024-10-29T17:03:42.000Z","size":79737,"stargazers_count":520,"open_issues_count":12,"forks_count":45,"subscribers_count":14,"default_branch":"main","last_synced_at":"2024-10-29T18:30:30.551Z","etag":null,"topics":["animation","minecraft","obj","rendering","resourcepack","shader"],"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/Godlander.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}},"created_at":"2022-01-05T20:38:22.000Z","updated_at":"2024-10-29T17:03:47.000Z","dependencies_parsed_at":"2023-02-13T02:15:38.374Z","dependency_job_id":"11c8bdfa-8f9d-4c89-a898-ad2b83d12777","html_url":"https://github.com/Godlander/objmc","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Godlander%2Fobjmc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Godlander%2Fobjmc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Godlander%2Fobjmc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Godlander%2Fobjmc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Godlander","download_url":"https://codeload.github.com/Godlander/objmc/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227149556,"owners_count":17738262,"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":["animation","minecraft","obj","rendering","resourcepack","shader"],"created_at":"2024-11-29T14:50:26.747Z","updated_at":"2024-11-29T14:50:42.867Z","avatar_url":"https://github.com/Godlander.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"i cannot guarantee modded compatibility. core shaders are a vanilla resourcepack feature, if a mod breaks this vanilla feature its likely a decision by the mod creator.\n\n# usage:\nmake sure Python and Pillow is installed, and place the script in the same directory as the input obj and texture files.\n\neither edit the script with your inputs, or run `python objmc.py` with correct arguments in command line to generate the model and texture outputs that go in a resourcepack.\n\nrunning the script without any arguments will open a gui with slightly more limited options.\n\n![image](https://user-images.githubusercontent.com/16228717/223296316-2278b049-0c10-4eb5-8e2e-4e8898dd01fa.png)\n\nplace the model and texture output generated with this tool in the correct location in the resourcepack along with the shaders folder, and should display properly.\n\nmake sure your minecraft version is 1.20.1+ as the shader may not work with lower versions.\n\n### script inputs\n`objs`: array of string names of obj files in the same folder to read. these must have same number of vertices if used in same animation.\n\n`frames`: array of strings of digits defining which index of the obj to use as each frame.\n\n`texs`: array of names of the texture files. the minimum size is 8x8, but a wider texture is recommended if model has a lot of vertices or is animated.\n\n### script output\n`output`: array of two string file names: the json model, and the texture.\n\n### advanced:\n`offset` and `scale`: just adds \u0026 multiplies vertex positions before encoding, so you dont have to re-export the model.\n\n`duration`: total duration of the animation in ticks.\n\n`noshadow`: disable shading the model based on face normals.\n\n`easing`: interpolation method shader uses inbetween vertex animation frames. 0: none, 1: linear, 2: in-out cubic, 3: 4-point bezier.\n\n`interpolation`: interpolation method shader uses inbetween texture frames. 0: none, 1: fade.\n\n`flipuv`: if your model renders but doesn't look right, try toggling this. see [#flipped-uv](#flipped-uv).\n\n*for custom entity model rotation and controllable animation to work, the model has to be an item with overlay color, like Potion or dyed Leather Armor (can use `CustomModelData`).*\n\n`colorbehavior`: defines the behavior of each byte of the overlay color of the item r,g,b. x: pitch rotation, y: yaw rotation, z: roll rotation, t: animation time offset, o: overlay color hue.\n\n*example: `yaw time overlay` defines 1 byte of red color as yaw rotation, the next byte of blue color as animation time offset , and the last byte of green being overlay color hue.*\n\n`autorotate`: tells the shader to estimate rotation from Normals instead of defining it by color. due to byte inaccuracy this will be a little jittery. allows color to be used for other inputs like controlling animation.\n\n`autoplay`: make the animation continuously play, color can still be used to define the starting frame. `colorbehavior = 'time time time'` will override this.\n\n`visibility`: 3 bit number, defines where a model is visible. 1: in gui, 2: in first person hand, 4: in world. (7 would mean visible everywhere.) models with limited visibility can be joined together allowing for different models to show up in different places.\n\n`join`: used by itself to combine generated models. `--join model1.json model2.json` will combine the two or more models into one. the textures still need to be placed in the right paths for all of the models.\n\nThe script can be run with arguments to each of these. Example:\n\n```py\npython objmc.py --objs cube.obj --texs cube.png --autorotate --flipuv --out potion.json texture.png\n```\n\n# samples:\n\nhttps://user-images.githubusercontent.com/16228717/177398816-cf919f1d-8de1-4346-9024-068c48f47cbf.mp4\n\n![teapot](https://user-images.githubusercontent.com/16228717/151483908-2238f6f9-44c7-434b-a411-f9959bf86a3e.gif)\n\n![cat](https://user-images.githubusercontent.com/16228717/148311540-503cf422-b6c7-4c95-b4b4-fca1e136dbfe.png)\n\n![cube](https://user-images.githubusercontent.com/16228717/148442834-78e49a63-c5f8-4668-a822-dcd11d215618.png)\n\n![robo](https://user-images.githubusercontent.com/16228717/148869708-310e7ec4-7d89-40e8-8fc6-38d2e6116cb7.png)\n\n![room](https://user-images.githubusercontent.com/16228717/155235807-250932d3-0ffd-43ca-92c8-3112df12a64e.png)\n\n# heads\narbitrary model display using player skin to encode model data\n\nmodel geometry complexity is limited per skin, and textures must be 32x32\n\n`python objh.py --obj model.obj --tex texture.png --out skin.png --scale 5`\n\nwill output a skin image and a command missing a base64 url in the nbt\n\nupload the skin to your account, then run `python objh.py --skin username` to get the base64 url\n\nor rerun `python objh.py --obj model.obj --tex texture.png --out skin.png --scale 5 --skin username/base64` to automatically insert the url\n\ncomplete the command, then you can run it to summon the model. anyone with the resourcepack will be able to see the model.\n\n## example\n\ntree model:\n\n![image](https://user-images.githubusercontent.com/16228717/218281527-a05341cc-a478-4a80-b41b-0a7da3545f51.png)\n```js\nsummon area_effect_cloud ~ ~1 ~ {Passengers:[{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,-1000f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,-1000f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,-1000f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,-1000f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,-500f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,-500f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,-500f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,-500f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,0f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,0f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,0f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,0f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,500f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,500f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,500f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,500f,-1000f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,-1000f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,-1000f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,-1000f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,-1000f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,-500f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,-500f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,-500f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,-500f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,0f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,0f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,0f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,0f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,500f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,500f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,500f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,500f,-500f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,-1000f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,-1000f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,-1000f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,-1000f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,-500f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,-500f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,-500f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,-500f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,0f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,0f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,0f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[500f,0f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-1000f,500f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[-500f,500f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},{id:\"item_display\",Tags:[\"objh\"],transformation:{translation:[0f,500f,0f],scale:[0f,0f,0f],left_rotation:[0f,0f,0f,1f],right_rotation:[0f,0f,0f,1f]},item:{id:\"player_head\",Count:1b,tag:{SkullOwner:{Id:[I;0,0,0,0],Properties:{textures:[{Value:\"eyd0ZXh0dXJlcyc6IHsnU0tJTic6IHsndXJsJzogJ2h0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjI1YjM1NDhjMjFiZWE5MmU2YjQ5NTViMTZkMTQ1M2YzYmExMzE4MTE3YTgwNGE4ZmIzZTliZGJjNDQwMGM0Myd9fX0=\"}]}}}}},]}\n```\n\n# faqs / random notes about the tool\n\n### general output format\nthis is just a reference, actual format may change as i add/change stuff.\n\n![image](https://user-images.githubusercontent.com/16228717/213836978-89154d30-349a-42a0-bc8f-7ccf85ef7a4a.png)\n\n### modded compatibility\n\ni cannot guarantee modded compatibility. core shaders are a vanilla resourcepack feature, if a mod breaks a vanilla feature i cant do anything.\n\nsodium users might expect complete incompatibility in the future:\n\n![image](https://user-images.githubusercontent.com/16228717/161360296-c5883d7c-c33f-4aa0-bc25-e1360f2f2eca.png)\n\n### performance\nobjmc models do not run much extra calculation. mostly a few extra texture fetches, but there should not be a noticeable performance difference to default minecraft.\n\nif you make a model with 6 faces, you can expect it to perform similarly to a normal cube model.\n\nthus, performance optimization is largely on the user to optimize the face count of the input model.\n\na zombie has a model with 6 elements each with 6 faces. a objmc entity model with 20k faces should expect similar performance to rendering 556 NoAI zombies on the screen. similarly, a objmc block model with 20k faces should expect similar performance to rendering 3333 blocks on screen, *without any culling*.\n\nblock models are a few hundred times more performant than entity models.\n\n### model not rendering\nmost of the time this is due to an error in your resourcepack. make sure the shaders are in the correct place, double check the file paths for model and texture (by default model will point to the root textures folder, not textures/block or textures/items), try using latest version of objmc script and shader if you have an older version.\n\n### flipped uv\nthe uv ends up being upside down sometimes for some reason when exporting from Blockbench. idk why, so i just flip the texture while encoding to compensate.\n\nthis doesnt seem to happen through Blender tho.\n\n### controlling animation\n\nany bits declared as `time` in `colorbehavior` will act as a time offset in ticks from 0 if `autoplay` is off, or from the current tick if `autoplay` is on.\n\nto calculate the offset for a frame while using `autoplay`, you can use this formula:\n\n```\n((([/time query gametime] % 24000) - starting frame) % total duration)\n```\n\nif `colorbehavior` is set to `time time time`, autoplay is automatically on. instead, numbers past 8388608 define the paused frame to display (8388608 + paused frame to show).\n\n### spawner models (deprecated)\nyou use spawners as a block that uses the entity renderer but isn't an entity. they are considerably laggier than normal blocks, but still better than entities, and don't suffer unloading nearly as much.\n```mcfunction\nsetblock ~ ~ ~ minecraft:spawner{MaxNearbyEntities:0,RequiredPlayerRange:0,SpawnData:{entity:{id:\"minecraft:armor_stand\",ShowArms:0b,Small:1b,Invisible:1b,Pose:{Head:[30f,0f,0f]},ArmorItems:[{},{},{},{id:\"minecraft:potion\",Count:1b,tag:{CustomModelData:1,CustomPotionColor:0}}]}}}\n```\ndisplay entities are just better, use those instead\n\n### multiple textures\nthere is no support for stitching multiple textures. you will have to use another program like blender to bake them onto one texture along with the neccesary uv changes on the model itself.\n\nhttps://github.com/Grim-es/material-combiner-addon is a blender addon that can combine multiple textures into an atlas.\n\n### blockbench export\n\nblockbench can export obj per frame with a plugin https://www.blockbench.net/plugins/obj_animation_export\n\n### number of frames\n\nby default most animation programs outputs a lot more frames than you will likely need, especially since objmc shader does interpolation between the frames. you can change the time stretching and frame range in blender to be lower to potentially decrease file size by a lot.\n\n![image](https://user-images.githubusercontent.com/16228717/151484572-927dd40b-bd5d-4046-bb09-2cdf7ae23cf9.png)\n\nin the sample teapot animation, i only exported every 5th frame, and the animation still looks good enough.\n\n### model display\n\nplaced block models are the most performant. they unload when its more than 1 subchunk away directly behind the player. that means objmc can be used in 16x16x16 block sized subchunks if a map is entirely modeled.\n\nitem models shown by entities are a couple hundred times worse performance than block models. entity models stay loaded in front of the player just as well as blocks but unloads if their hitbox is not on screen.\n\nspawner models are special, they unload 1 subchunk away behind and 8 subchunks away in front of the player, behaving similar to blocks with renderdistance 8, but rendering costs the same as entities.\n\n**item/block display entities have controllable `view_range`, at 0 they don't cull and always stay rendered within renderdistance. they are the best entity method of displaying a model.**\n\n### items with overlay color\n\nthese items have custom rgb tint overlay that can be used to pass data:\n\n`potion`, `splash_potion`, `lingering_potion`, `leather_helmet`, `leather_chestplate`, `leather_leggings`, `leather_boots`, `leather_horse_armor`, `firework_star`, `filled_map`\n\n### vertex count limits\n\nthere appears to be a hard vertex count limit per chunk in Minecraft for placed blocks, and exceeding that instantly crashes the game, regardless of whether your computer can handle rendering that many faces, with a crash message similar to this:\n```\njava.lang.IllegalArgumentException: newLimit \u003e capacity: (151999848 \u003e 37748736)\n```\nthis limit seems dependent on hardware. for me, it is `37748736`. keep in mind that for block models all vertices are located in the one placed block, not where they appear in the rendered model.\n\nthe entity renderer has no such limit, and entity models can go over millions of faces regardless of whether your computer can handle rendering that many.\n\n### versioning\ndue to me changing stuff, different versions of the objmc shader may only work with the script texture/model outputs of that specific version.\n\nbut also due to me changing stuff a lot i'm too lazy to try to give this a proper versioning system.\n\nif stuff breaks make sure to double check that you have the latest version of both the shader as well as the script output.\n\n### animation deformation\nwith linear interpolation, vertices travel in a straight line from one point to the next. if a rectangle with 4 vertices is to rotate about its center, the area of the rectangle would not be preserved, and the shape would deform to look smaller in the middle between keyframes.\n\none solution is to simply add more frames, but that can increase texture size by a lot. instead, bezier interpolation can approximate curved motion better with less keyframes.\n\n### preserving rgb\nbasically anything to do with images in js does alpha premultiplying, which ruins rgb values when alpha is anything less than 255. afaik only way to not suffer this is to directly interact with the raw file instead of as an image. so if you wanted to send an image with alpha to someone over discord or something, don't send it as an image. instead, you can change the file extension so discord treats it as some unknown file, or zip it and send the zip to preserve data.\n\n### vertex id\nMinecraft's `gl_VertexID` isn't per model, so it's difficult to find the relative id of a vertex in a model unless you have a constant number of vertices.\n\ni came up with a method to assign each face a unique uv pointing to a pixel in the 'header' of the texture, then encoding the offset of the pixel from top left (relative 0,0 in the texture, some random place in the atlas) as color of the pixel. this also lets vertex know where top left corner of the texture is in the atlas.\n\nwith the offset data i am able to calculate the relative face id, and `gl_VertexID % 4` gives the corner.\n\n![image](https://user-images.githubusercontent.com/16228717/148311858-3bd76267-f80f-4ad6-84c3-3b5f6760bcf4.png)\n\nin the image, the first 6 faces are selected, and their uv is shown highlighted in blockbench uv editor.\n\n### head Pose\nfunction to convert armorstand head Pose to potion color rgb for colorbehavior xyz\n```mcfunction\nexecute store result score r temp run data get entity @s Pose.Head[0] 0.708333333\nexecute store result score g temp run data get entity @s Pose.Head[1] 0.708333333\nexecute store result score b temp run data get entity @s Pose.Head[2] 0.708333333\n\nscoreboard players operation r temp %= 256 const\nscoreboard players operation g temp %= 256 const\nscoreboard players operation b temp %= 256 const\n\nscoreboard players operation rgb temp = r temp\nscoreboard players operation rgb temp *= 256 const\nscoreboard players operation rgb temp += g temp\nscoreboard players operation rgb temp *= 256 const\nscoreboard players operation rgb temp += b temp\n\nexecute store result entity @s ArmorItems[3].tag.CustomPotionColor int 1 run scoreboard players get rgb temp\n```\n\n### questions\nfeel free to contact me on [discord](https://discord.gg/2s6th9SvZd)\n\n# contributors:\n**vilder50** - Original concept of mesh models\n\n**Onnowhere** - Help with formatting and testing\n\n**DartCat25** - Helped me get started\n\n**The Der Discohund** - Help with matrix operations\n\n**Suso** - Idea for controlled interpolated animation\n\n**Dominexis** - Help with spline math\n\n**Barf Creations** - Help replicating Minecraft's jank Pose rotation matrix\n\n**kumitatepazuru** - Adding command line arguments for the script\n\n**Daminator** - Showing me tkinter (this is so painful why)\n\n**thebbq** - Help with edge case debugging and stability\n\n**midorikuma** - Original concept of using player heads to encode arbitrary models\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGodlander%2Fobjmc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGodlander%2Fobjmc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGodlander%2Fobjmc/lists"}