{"id":21194070,"url":"https://github.com/nahkd123/crystalize","last_synced_at":"2025-07-11T14:38:42.206Z","repository":{"id":228956575,"uuid":"774562730","full_name":"nahkd123/crystalize","owner":"nahkd123","description":"Server-side Fabric library mod for adding models directly from Blockbench","archived":false,"fork":false,"pushed_at":"2024-04-25T08:24:51.000Z","size":6072,"stargazers_count":7,"open_issues_count":3,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-23T19:49:07.929Z","etag":null,"topics":["animation","display-entity","fabricmc","java","library","minecraft","model","polymer","server-side","tater","tiny-potato"],"latest_commit_sha":null,"homepage":"","language":"Java","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/nahkd123.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":"2024-03-19T19:09:19.000Z","updated_at":"2025-02-04T19:54:38.000Z","dependencies_parsed_at":"2024-04-25T09:47:56.646Z","dependency_job_id":null,"html_url":"https://github.com/nahkd123/crystalize","commit_stats":null,"previous_names":["nahkd123/crystalize"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nahkd123/crystalize","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nahkd123%2Fcrystalize","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nahkd123%2Fcrystalize/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nahkd123%2Fcrystalize/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nahkd123%2Fcrystalize/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nahkd123","download_url":"https://codeload.github.com/nahkd123/crystalize/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nahkd123%2Fcrystalize/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264833293,"owners_count":23670617,"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","display-entity","fabricmc","java","library","minecraft","model","polymer","server-side","tater","tiny-potato"],"created_at":"2024-11-20T19:19:20.732Z","updated_at":"2025-07-11T14:38:42.181Z","avatar_url":"https://github.com/nahkd123.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"./docs/banner.png\" width=\"720\"\u003e\n\u003c/p\u003e\n\n---\n# Crystalize\n_I've reimplemented [Nylon](https://modrinth.com/mod/nylon), but at what cost?_\n\nCrystalize uses display entities to display models from Blockbench (non-cube meshes are not supported, obviously) on your Minecraft server. Simply drag and drop Blockbench model to your mod, use `ModelsManager.registerModel()` and you are ready to go! Sounds simple but I wasted more than 40 hours of my life just to cook this library mod (and it's not even finished yet).\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"./docs/froggo.gif\" height=\"200\"\u003e \u003cimg src=\"./docs/vanillaclient.png\" height=\"200\"\u003e\n\u003cbr\u003e\nCustom model animation completely client-side!\n\u003c/p\u003e\n\n## Features\n### Blockbench Models loader\nLoad models directly from your Blockbench project file! Crystalize will automatically construct all model parts as JSON models and assign it to custom model data value of `minecraft:command_block`.\n\n### Inverse Kinematics\nTired of animating each part one by one? Now you can use `FabrikController` ([FABRIK][FABRIK Paper] is the name of the IK algorithm)! This IK controller automatically animates your model parts such that the end position of the chain reaches your target position. _IK constraints is supported but you might need to convert direction vector to rotation and vice versa._\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"./docs/ik.gif\"\u003e\n\u003cbr\u003e\nInverse Kinematics (unconstrained)\n\u003c/p\u003e\n\n## Attaching Crystalize model to your entity\nIt is pretty simple to attach Crystalize model to your entity. Here is an example:\n\n```java\npublic class RoboticArmEntity extends Entity implements PolymerEntity {\n\tprivate static final Identifier MODEL_ID = new Identifier(CrystalizeSampleMod.MODID, \"robotic_arm\");\n\tprivate CrystalizeElementHolder modelHolder;\n\tprivate Vector3f target = new Vector3f();\n\n\tpublic RoboticArmEntity(EntityType\u003c? extends RoboticArmEntity\u003e type, World world) {\n\t\tsuper(type, world);\n\t\tEntityAttachment.ofTicking(modelHolder = new CrystalizeElementHolder(MODEL_ID, TranslateStrategy.TRANSLATION_ONLY), this);\n\n\t\t// Let's make our robotic arm tracking nearby players!\n\t\t// Get these IDs from robotic_arm.bbmodel\n\t\tmodelHolder.addAnimation(new FabrikController(Arrays.asList(\n\t\t\t\"984422d6-82df-2fc5-9509-809912aa01fd\",\n\t\t\t\"fd6d3d3e-aa57-518e-b758-3e56901278ea\",\n\t\t\t\"e99bebd5-5564-9731-9819-3bb487096f1c\"), target));\n\t}\n\n\tpublic RoboticArmEntity(World world, Vec3d pos) {\n\t\tthis(TYPE, world);\n\t\tsetPosition(pos);\n\t}\n\n\t@Override\n\tpublic EntityType\u003c?\u003e getPolymerEntityType(ServerPlayerEntity player) {\n\t\treturn EntityType.INTERACTION;\n\t}\n\n\t// Stripped initDataTracker, readCustomDataFromNbt and writeCustomDataToNbt.\n\n\t@Override\n\tpublic void tick() {\n\t\tsuper.tick();\n\t\tPlayerEntity closest = getWorld().getClosestPlayer(getX(), getY(), getZ(), 3d, false);\n\t\tif (closest == null) return;\n\t\ttarget.set(closest.getPos().toVector3f()).sub(getPos().toVector3f());\n\t}\n}\n```\n\nSee [this code](./crystalize-fabric-samplemod/src/main/java/io/github/nahkd123/crystalize/fabric/sample/entity/RoboticArmEntity.java), which is the code above but with comments.\n\n## Crystalize components\n### Crystalize Base\nThe common code for all platforms and components. Includes Crystalize model structure, animations and animation controllers.\n\n### Crystalize Blockbench\nIncludes codecs for reading Blockbench's \"Generic Model\" project, as well as component for building to Crystalize model (which is `Model`).\n\n### Crystalize Minecraft Model\nIncludes codecs for reading and writing Minecraft JSON models + texture atlases, as well as builder for building `ElementGroup` into JSON model.\n\n### Crystalize Fabric Polymer\nPowered by [Polymer Virtual Entity](https://polymer.pb4.eu/latest/polymer-virtual-entity/basics/), this component allows you to load your Crystalize model in your Fabric server and control it. See `crystalize-fabric-samplemod` for example usage.\n\n### Crystalize Bukkit (WIP)\nBukkit implementation. Work in progress but the priority for this platform is not high.\n\n## License and acknowledgments\nThe Crystalize and its components' code are licensed under [MIT license](./LICENSE).\n\n[Mojang's DataFixerUpper](https://github.com/Mojang/DataFixerUpper) and [JOML](https://github.com/JOML-CI/JOML) are licensed under MIT license.\n\n[Patbox's Polymer](https://github.com/Patbox/polymer) and its components are licensed under [LGPL 3.0](https://github.com/Patbox/polymer/blob/dev/1.20.3/LICENSE).\n\nThe sample models are mainly licensed under CC0 1.0 Universal license, except:\n- The \"Taterinator\" 3D model uses \"Tiny Potato\" texture from Botania by Vazkii/Violet Moon, which is [licensed under custom license](https://github.com/VazkiiMods/Botania/blob/1.20.x/LICENSE.txt). I honestly don't know if they are willing to let me license the model under CC0 1.0, but like, it's just a :), right? RIGHT?\n- The \"tiny_potatog\" test model uses frog entity model from Mojang Studios. (c) Mojang Studios/Microsoft Corporation.\n\nPaper: [\"FABRIK: A fast, iterative solver for the Inverse Kinematics problem\"][FABRIK Paper] by Aristidou, Andreas and Lasenby, Joan. [DOI](https://doi.org/10.1016/j.gmod.2011.05.003).\n\n---\n\u003cimg src=\"./docs/Taterinator.png\" width=\"200\"\u003e\n\n[FABRIK Paper]: http://www.andreasaristidou.com/publications/papers/FABRIK.pdf","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnahkd123%2Fcrystalize","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnahkd123%2Fcrystalize","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnahkd123%2Fcrystalize/lists"}