Skip to content

Model Types

SuperMartijn624 edited this page Jan 4, 2026 · 3 revisions

Model Types

Fusion adds two new model types: base and connecting. Below is an explanation of how to use Fusion's model types as well as an explanation of each model type.

How to use

Fusion uses the same json models as vanilla. However, now the data in the file is determined by the model type. The model type should be specified under the type key. It is also important to specify "loader": "fusion:model" to ensure Fusion does not interfere with other mods.
A model file would then look as follows:

{
   "loader": "fusion:model",
   "type": "<model type>",
   <configuration>
}

Base models

Base models use the vanilla model format but allow for the processing of the random and continuous texture types.

Tip

You can find a description of the vanilla format at the Minecraft wiki.

In addition, the base model type also allows specifying multiple parent models. When multiple parent models are specified, the model will simply combine the quads from all parent models. Here is an example of a model which combines the models for a torch and a glass block:

{
   "loader": "fusion:model",
   "type": "base",
   "parents": [
      "block/torch",
      "block/glass"
   ]
}

The base model also allows specifying light_emission for model elements the same way vanilla allows in Minecraft 1.21.1+. Here is an example of a cobblestone cube which will always look as if fully lit (at light level 15):

{
   "loader": "fusion:model",
   "type": "base",
   "textures": {
      "all": "block/cobblestone",
      "particle": "#all"
   },
   "elements": [
      {
         "from": [0, 0, 0],
         "to": [16, 16, 16],
         "light_emission": 15,
         "faces": {
            "up": { "texture": "#all" },
            "down": { "texture": "#all" },
            "north": { "texture": "#all" },
            "east": { "texture": "#all" },
            "south": { "texture": "#all" },
            "west": { "texture": "#all" }
         }
      }
   ]
}

Connecting models

Connecting models gather data from blocks around them and make sure any connecting textures connect to the specified blocks. The connecting model type also inherits the properties and format of the base model type, hence random and continuous textures will also be processed when used in a connecting model.

Similar to how textures are specified, the connecting model type allows specifying when the texture on a certain face should connect with a connection key. The connections property then specifies connection predicates for each key. If no connection key is specified for a model element face, the texture key will be used as the connections key.

If a key is not defined in the connections property, connections from the key default will be used.

Below is an example of a connecting model with four different textures. In the model, the ice and lapis textures will end up using the predicates under the blue key, the dirt texture will use the predicates under the dirt key, and the stone texture will use the predicates under the default key.

{
   "loader": "fusion:model",
   "type": "connecting",
   "textures": {
      "ice": "block/oak_tiles",
      "lapis": "block/oak_tiles",
      "dirt": "block/oak_tiles",
      "stone": "block/oak_tiles",
      "particle": "#ice"
   },
   "connections": {
      "blue": [
         {
            "type": "match_block",
            "block": "ice"
         },
         {
            "type": "match_block",
            "block": "lapis_block"
         }
      ],
      "lapis": "#blue",
      "dirt": {
         "type": "is_same_block"
      },
      "default": {
         "type": "is_same_block"
      }
   },
   "elements": [
      {
         "from": [0, 0, 0],
         "to": [16, 16, 16],
         "faces": {
            "up": { "texture": "#ice", "connections": "#blue" },
            "down": { "texture": "#lapis", "connections": "#lapis" },
            "north": { "texture": "#dirt" },
            "south": { "texture": "#stone" }
         }
      }
   ]
}

For simplicity, in case the model only has one connecting texture or all textures should use the same connection predicates, the connection predicates can be specified directly under the connections property without using any connection keys. Here is such an example of an oak tiles block which connects to itself and acacia tiles:

{
   "loader": "fusion:model",
   "type": "connecting",
   "parent": "block/cube_all",
   "textures": {
      "all": "block/oak_tiles"
   },
   "connections": [
      {
         "type": "is_same_block"
      },
      {
         "type": "match_block",
         "block": "acacia_tiles"
      }
   ]
}
Connected model example

Connection predicates

There are 11 types of connection predicates available:

  • is_same_block: connects to blocks with the same type as itself
  • is_same_state: connects to blocks with the same type and block properties as itself
  • match_block: connects to blocks of a given type
    • block: the block which should be matched
  • match_state: connects to blocks of a given type which match the given state properties
    • block: the block which should be matched
    • properties: an object where each key is the name of the property and its corresponding value is an array with allowed values for the property
  • match_block_in_front: connects only if the block in front of the block in a direction is of a given type
    • block: the block which should be matched
  • match_state_in_front: connects only if the block in front of the block in a direction is of a given type and matches the given state properties
    • block: the block which should be matched
    • properties: an object where each key is the name of the property and its corresponding value is an array with allowed values for the property
  • is_direction: connects only to the given directions
    • direction/directions: a direction or array of directions which should be matched, directions top, top_right, right, bottom_right, bottom, bottom_left, left, top_left
  • is_face_visible: connects if the face of the neighboring block is visible
  • and: connects if all given predicates are satisfied
    • predicates: predicates which all need to be satisfied
  • or: connects if at least one of the given predicates is satisfied
    • predicates: predicates of which one needs to be satisfied
  • not: connects only if the given predicate is not satisfied
    • predicate: predicate of which the inverse will be taken
Examples of connection predicates

is_same_block

{
    "type": "is_same_block"
}

is_same_state

{
    "type": "is_same_state"
}

match_block

Evaluates to true when the block in the connection direction is a Redstone Torch.

{
    "type": "match_block",
    "block": "restone_torch"
}

match_state

Evaluates to true when the block in the connection direction is a Redstone Torch that is off.

{
    "type": "match_state",
    "block": "restone_torch",
    "properties": {
        "lit": "false"
    }
}

match_block_in_front

Evaluates to true when the block in front of the block in the connection direction is a Redstone Torch.

{
    "type": "match_block_in_front",
    "block": "restone_torch"
}

match_state_in_front

Evaluates to true when the block in front of the block in the connection direction is a Redstone Torch that is off.

{
    "type": "match_state_in_front",
    "block": "restone_torch",
    "properties": {
        "lit": "false"
    }
}

is_direction

Evaluates to true for connection direction right.

{
    "type": "is_direction",
    "direction": "right"
}

Evaluates to true for connection directions top and bottom.

{
    "type": "is_direction",
    "directions": [ "top", "bottom" ]
}

is_face_visible

Evaluates to true when face of the block in the connection direction is visible.

{
    "type": "is_face_visible"
}

and

Evaluates to true when face of the block in the connection direction is visible and the block in the connection direction is gravel.

{
    "type": "and",
    "predicates": [
        {
            "type": "is_face_visible"
        },
        {
            "type": "match_block",
            "block": "gravel"
        }
    ]
}

or

Evaluates to true when the block in the connection direction is sand or the block in the connection direction is gravel.

{
    "type": "or",
    "predicates": [
        {
            "type": "match_block",
            "block": "sand"
        },
        {
            "type": "match_block",
            "block": "gravel"
        }
    ]
}

not

Evaluates to true when the block in the connection direction is not sand.

{
    "type": "not",
    "predicate": {
        "type": "match_block",
        "block": "sand"
    }
}

Clone this wiki locally