<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.mutigeraffe.com/index.php?action=history&amp;feed=atom&amp;title=BlockyRenderer%3AFile_Format</id>
	<title>BlockyRenderer:File Format - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mutigeraffe.com/index.php?action=history&amp;feed=atom&amp;title=BlockyRenderer%3AFile_Format"/>
	<link rel="alternate" type="text/html" href="https://wiki.mutigeraffe.com/index.php?title=BlockyRenderer:File_Format&amp;action=history"/>
	<updated>2026-10-21T03:38:34Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wiki.mutigeraffe.com/index.php?title=BlockyRenderer:File_Format&amp;diff=2486&amp;oldid=prev</id>
		<title>Maintenance script: BlockyRenderer wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.mutigeraffe.com/index.php?title=BlockyRenderer:File_Format&amp;diff=2486&amp;oldid=prev"/>
		<updated>2026-10-20T21:29:21Z</updated>

		<summary type="html">&lt;p&gt;BlockyRenderer wiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This page describes how Blocky Renderer reads &amp;lt;code&amp;gt;.blockymodel&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.blockyanim&amp;lt;/code&amp;gt; files. The format is not officially documented. The rules here follow the official Hytale plugin for Blockbench and the vanilla files. They have not been compared with the game itself.&lt;br /&gt;
&lt;br /&gt;
Both file types are JSON. Comments and trailing commas are tolerated when reading.&lt;br /&gt;
&lt;br /&gt;
== Models (.blockymodel) ==&lt;br /&gt;
=== Top level ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nodes&amp;lt;/code&amp;gt; || List of top-level nodes. Required.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lod&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;disappear&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;billboard&amp;lt;/code&amp;gt;. Usually &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;character&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;prop&amp;lt;/code&amp;gt;. Often missing.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Units and axes ===&lt;br /&gt;
* 1 block = 32 units. Y points up.&lt;br /&gt;
* The origin is the bottom center of a block, so x and z run from -16 to 16.&lt;br /&gt;
* &amp;lt;code&amp;gt;front&amp;lt;/code&amp;gt; faces +Z, &amp;lt;code&amp;gt;right&amp;lt;/code&amp;gt; faces +X, &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; faces +Y.&lt;br /&gt;
&lt;br /&gt;
=== Node ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; || A number as text in vanilla files. Not always unique. The preview does not use it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; || Node name. Animations address nodes by name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; || Pivot of the node. The node rotates around it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;orientation&amp;lt;/code&amp;gt; || Rotation as a quaternion. No rotation is &amp;lt;code&amp;gt;x = y = z = 0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;w = 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;shape&amp;lt;/code&amp;gt; || The shape of the node, see below.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;children&amp;lt;/code&amp;gt; || Child nodes. They are placed relative to &amp;lt;code&amp;gt;position + shape.offset&amp;lt;/code&amp;gt; of this node.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Shape ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;box&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;quad&amp;lt;/code&amp;gt; (a single face) or &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; (a plain group or pivot)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; || Moves the shape away from the pivot.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stretch&amp;lt;/code&amp;gt; || Scales the shape around its center without changing the UVs. A negative value mirrors it. A value of 0 hides it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;settings.size&amp;lt;/code&amp;gt; || Size of the box. A quad uses only x and y.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;settings.normal&amp;lt;/code&amp;gt; || Quad only: &amp;lt;code&amp;gt;+X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+Y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-Y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+Z&amp;lt;/code&amp;gt; (default) or &amp;lt;code&amp;gt;-Z&amp;lt;/code&amp;gt;. With ±X, &amp;lt;code&amp;gt;size.x&amp;lt;/code&amp;gt; becomes the z extent. With ±Y, &amp;lt;code&amp;gt;size.y&amp;lt;/code&amp;gt; becomes the z extent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;visible&amp;lt;/code&amp;gt; || Whether the shape is drawn. Children are not affected.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;doubleSided&amp;lt;/code&amp;gt; || Draws the back of the faces too.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;shadingMode&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;flat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;standard&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fullbright&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;reflective&amp;lt;/code&amp;gt;. In the preview, only &amp;lt;code&amp;gt;fullbright&amp;lt;/code&amp;gt; is self-lit.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;textureLayout&amp;lt;/code&amp;gt; || Position of each face in the texture. Faces without an entry are not drawn. A quad always uses &amp;lt;code&amp;gt;front&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;unwrapMode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;settings.isPiece&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;settings.isStaticBox&amp;lt;/code&amp;gt; || Not used by the preview.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Texture layout ===&lt;br /&gt;
Each face in &amp;lt;code&amp;gt;textureLayout&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;front&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;back&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;right&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bottom&amp;lt;/code&amp;gt;) has:&lt;br /&gt;
* &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt;: the corner of the face in the texture, in pixels.&lt;br /&gt;
* &amp;lt;code&amp;gt;mirror&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; reverse the reading direction from that corner (to the left or up).&lt;br /&gt;
* &amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt;: 0, 90, 180 or 270. Rotates the texture on the face. 90 and 270 swap width and height.&lt;br /&gt;
&lt;br /&gt;
The size of a face in the texture comes from the box size: front and back use x × y, left and right z × y, top and bottom x × z.&lt;br /&gt;
&lt;br /&gt;
== Animations (.blockyanim) ==&lt;br /&gt;
=== Top level ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;formatVersion&amp;lt;/code&amp;gt; || Format version, 1.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt; || Length in frames, 60 frames per second. If missing or 0, the time of the last keyframe is used, or 120 frames.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;holdLastKeyframe&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;: the animation loops. &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;: the last value stays.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nodeAnimations&amp;lt;/code&amp;gt; || Tracks per node, keyed by node &amp;#039;&amp;#039;&amp;#039;name&amp;#039;&amp;#039;&amp;#039;. The tracks apply to all nodes with that name.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Tracks ===&lt;br /&gt;
Each node can have five tracks. A track is a list of keyframes &amp;lt;code&amp;gt;{ time, delta, interpolationType }&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;interpolationType&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;smooth&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;linear&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;linear&amp;lt;/code&amp;gt; if missing.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Track !! Delta !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;{x, y, z}&amp;lt;/code&amp;gt; || Added to the position of the node&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;orientation&amp;lt;/code&amp;gt; || quaternion || Applied after the rotation of the node&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;shapeStretch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;{x, y, z}&amp;lt;/code&amp;gt; || Multiplies the stretch of the node&amp;#039;s own shape&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;shapeVisible&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Shows or hides the node&amp;#039;s own shape, not its children&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;shapeUvOffset&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;{x, y}&amp;lt;/code&amp;gt; || Moves the texture of the node&amp;#039;s own shape in whole pixels. Negative y moves down in the image.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Between keyframes ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Rotation&amp;#039;&amp;#039;&amp;#039;: spherical interpolation. Between two &amp;lt;code&amp;gt;smooth&amp;lt;/code&amp;gt; keyframes, an asymmetric easing curve from the Blockbench plugin is used.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Position and stretch&amp;#039;&amp;#039;&amp;#039;: linear if both keyframes are &amp;lt;code&amp;gt;linear&amp;lt;/code&amp;gt;, otherwise a Catmull-Rom curve over the neighboring keyframes.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Visibility and UV offset&amp;#039;&amp;#039;&amp;#039;: they jump. The last keyframe up to the current time applies.&lt;br /&gt;
* When the animation loops, position, rotation and stretch run from the last keyframe past the end to the first one.&lt;br /&gt;
&lt;br /&gt;
{{BlockyRenderer Nav}}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
</feed>