Connected Textures¶

The textures appear to "connect".¶
File location
/assets/minecraft/optifine/ctm/**/*.properties
Connected Textures (CTM) connects matching blocks together, making them appear unified.
For each block or terrain tile to override with connected or random textures, create a .properties
file in the /assets/minecraft/optifine/ctm
folder of the resource pack.
Properties files can be organized into subfolders of any depth.

Button and tooltip for the option, found in .¶
Different types of connected texture methods are available with different requirements and restrictions.
General properties¶
Note
See Paths before continuing, or else the documentation may be confusing.
Note
matchTiles
and matchBlocks
can be omitted if they can be inferred from the filename instead:
~/ctm/xxx/<name>.properties
assumesmatchTiles=<name>
~/ctm/xxx/block_<name>.properties
assumesmatchBlocks=<name>
(unless either property is specified explicitly; defined keys override inferred filenames)
method
¶
ctm
, ctm_compact
, horizontal
, vertical
, horizontal+vertical
, vertical+horizontal
, top
, random
, repeat
, fixed
, overlay_ctm
,
overlay_random
, overlay_repeat
, or overlay_fixed
Method to use when choosing a block's replacement texture:
ctm
: Standard 8-way method, 47 tiles.ctm_compact
: Compact 8-way method, uses 5 tiles. Cannot be combined with anyoverlay
method.horizontal
: Connect to blocks on left and right only.vertical
: Connect to blocks above and below only.horizontal+vertical
: Connect horizontally, then connect vertically.vertical+horizontal
: Connect vertically, then connect horizontally.top
: Connect to block above only.random
: Pick a tile at random.repeat
: Repeat a fixed pattern over large areas.fixed
: Use a single fixed tile, equivalent torandom
with only one tile.overlay
: Overlay for block transitions, uses 17 tiles.overlay_ctm
: Overlay variant ofctm
method.overlay_random
: Overlay variant ofrandom
method.overlay_repeat
: Overlay variant of therepeat
method.overlay_fixed
: Overlay variant offixed
method.
Note
The overlay
method can be combined with other methods if it comes before the other methods in the order alphabetically.
Warning
The ctm_compact
method cannot be combined with any overlay
method.
tiles
¶
List of replacment tiles to use. Each tile must be a separate image, just like terrain and item textures Tiles can be specified in several ways:
0
->0.png
8-11
->8.png, 9.png, 10.png, 11.png
name
->name.png
name.png
->name.png
full/path/name.png
->full/path/name.png
<skip>
: Skip this tile, continue with next CTM properties.<default>
: Use the default texture for that block/tile.
In all cases except the last (<default>
), the PNG file must be in the same directory as the properties file itself.
The formats can be mixed and matched: tiles=0-4 5 some/other/name.png
.
Note
The overlay
methods may use the special name <skip>
for empty tiles to be skipped;
overlay
methods cannot use the <default>
special name.
matchTiles
¶
List of tiles this method should apply to.
Multiple .properties
file can refer to the same block/tile and they will be processed in alphabetical order by filename.
All tile-based entries are checked before block ID-based ones; the first match wins.
matchBlocks
¶
List of blocks this method should apply to.
To refer to a tile from vanilla Minecraft, simply use its name in textures/block
: matchBlocks=dirt
To refer to a tile from a mod, its name must be known: matchBlocks=botania:blazeblock
Tiles output by CTM rules can also be matched by another rule;
the tile name is simply the full path to the tile: matchBlocks=optifine/ctm/mygrass/1.png
Block format: (optional parts are in []
) [namespace:]name[:property1=value1,value2...:property2=value1,value2...]
For example:
Short name:
oak_stairs
Full name:
minecraft:oak_stairs
Full name + properties:
minecraft:oak_stairs:facing=east,west:half=bottom
weight
¶
0
If multiple properties files match the same block, the highest weighted one is used.
In the event of a tie, the properties filenames are compared next.
connect
¶
block
, tile
, material
, or state
block
for blocks, tile
for tilesThe conditions under which two blocks should connect. For methods that connect to adjacent blocks, this rule specifies how the game should decide if two blocks should be connected:
block
: Connect if this block's name == neighbor block's name.tile
: Connect if this block's tile texture == neighbor tile's texture.material
: Connect if this block's material (stone, dirt, etc.) == neighbor block's material.state
: Connect if this block's full state (block + properties) == neighbor block's state.

A diagram of the block matching.
From top to bottom, block
, material
, state
.¶
connectTiles
¶
Connect only to blocks which are using the specified tiles.
Note
This rule only applies to overlay
methods.
faces
¶
Limit CTM to certain faces of the block:
bottom
: Bottom face (negative Y).top
: Top face (positive Y).north
: North face (negative Z).south
: South face (positive Z).east
: East face (positive X).west
: West face (negative X).sides
: Shorthand fornorth south east west
.all
: All sides.
Important
This property is ignored on non-cube blocks like signs and fences.
biomes
¶
Biome restrictions. Modded biomes also can be used.
heights
¶
Height restriction, no limit.
Since 1.18, negative values may be specified for height. When used in a range they have to be put in parenthesis ( )
.
See Ranges.
minHeight
¶
Legacy
Legacy property for heights
.
maxHeight
¶
Legacy
Legacy property for heights
.
ctm.<ctm_index>
¶
Compact CTM tile replacement. Allows definition of replacement tile for a specific CTM case.
<ctm_index>
is the index of the CTM case from the template (0..46
),
Tile index is the index of the tile as defined in tiles
, not the tile name.
With ctm_compact
, more than 5 tiles can be defined and they can use the additional tiles as replacements.
Important
This rule is only for the ctm_compact
method.
tintIndex
¶
-1
, disabledTint index, only for overlay
method.
Tint index is for the tile's texture.
-1
means it is disabled.
Important
This rule only applies to the overlay
methods.
tintBlock
¶
The block used for the tile texture tinting.
Different blocks use different colors for the same tint index.
Important
This rule only applies to the overlay
methods.
layer
¶
cutout_mipped
, cutout
, or translucent
cutout_mipped
The layer on which the overlay texture should be rendered.
Values:
* cutout_mipped
: Transparent textures with mipmaps.
* cutout
: Transparent textures without mipmaps.
* translucent
: Translucent textures with mipmaps.
Important
This rule only applies to the overlay
methods.
name
¶
Only for blocks with have corresponding nameable tile entities. Generally, this means containers that can be renamed.
For example: Beacon, Brewing Stand, Enchanting Table, Furnace, Dispenser, Dropper, Hopper, and Command Blocks.
See Custom GUIs for the syntax.
Method properties¶
ctm
: standard 8-way¶
Note
Implies method=ctm
.

Important
48th tile is unused.
tiles
¶
List of the 47 tiles to use when connecting.
innerSeams
¶
false
Whether to show seams on inner edges when connecting to adjacent blocks.
ctm_compact
: compact 8-way¶
Note
Implies method=ctm_compact
,

tiles
¶
List of the 5 tiles to use when connecting.
innerSeams
¶
false
Whether to show seams on inner edges when connecting to adjacent blocks.
ctm.N
¶
Indexes of replacement tiles for specific CTM cases.
N
is a tile index.
Important
This is generally only used for special cases where you want to override the default behavior.
horizontal
: horizontal only¶
Note
Implies method=horizontal
.

tiles
¶
List of the 4 tiles to use when connecting.
vertical
: vertical only¶
Note
Implies method=vertical
.

tiles
¶
List of the 4 tiles to use when connecting.
top
: top face only¶
Note
Implies method=top
.
tiles
¶
The single tile to use when connecting.
random
: random connect¶
Note
Implies method=random
.
tiles
¶
List of the tiles to use when connecting. Can be infinitely long or short.
weights
¶
List of weights to apply to the random choice.
For example, for tiles=1 2 3 4; weights=10 1 10 5
, tile 1 has weight 10, 2 has 1, 3 has 10, and 4 has 5.
Weights do not have to total any value; in the above example, tiles 1 and 3 will each be used ~38% of the time.
Important
This rule must have the same number of elements as the tiles
rule.
randomLoops
¶
Repeats the random function by this amount to increase randomness. Can be used to make different textures use different random patterns.
Warning
A high randomLoops
value may decrease the chunk loading speed.
symmetry
¶
none
, opposite
, or all
none
Desired level of symmetry for the faces of each block.
Applies to standard 6-sided blocks only (dirt, glass, not fences).
none
: All 6 faces are textured independently.opposite
: 2-way symmetry; opposing faces have the same texture, but each pair can potentially have a different texture.all
: All 6 faces have the same texture.
linked
¶
false
Whether to link textures between related blocks.
If true, OptiFine uses the same random number seed for all parts of a multi-block object. For example, the top and bottom halves of tall grass. This allows randomized textures that will remain consistent within each set of blocks.
If false, the two halves will be scrambled, chosen independently. This property currently only applies to plants, double plants (rose bushes, peonys, etc.), and doors.
Important
For linked
to work, multiple properties files with linked=true
and the same number of replacement textures and same set of weights
must be present.
For example, double_plant_top.properties
:
method=random
tiles=grass_top1 grass_top2 grass_top3
weights=1 2 3
repeat
: repeated¶
Note
Implies method=repeat
.
width
¶
The width of the repeating pattern.
height
¶
The height of the repeating pattern.
tiles
¶
A list of tiles.
The number of elements must equal width
* height
.
symmetry
¶
none
, or opposite
none
Desired level of symmetry for the faces of each block.
Applies to standard 6-sided blocks only (dirt, glass, not fences).
none
: All 6 faces are textured so that the pattern tiling looks the same from all sidesopposite
: 2-way symmetry; opposing faces have the same texture, which means that tiling on the south and east faces will be mirrored left-to-right when comapared to the north and west faces
fixed
: one texture¶
Note
Implies method=fixed
.
tiles
¶
Single tile to use.
JSON schema¶
Note
Although this page is .properties
based, it can be mapped to JSON.
{
"$schema": "http://json-schema.org/draft/2020-12/schema",
"$id": "https://gitlab.com/whoatemybutter/optifinedocs/-/blob/master/schemas/cit.schema.json",
"title": "Connected Textures",
"description": "Connected Textures (CTM) connects matching blocks together, making them appear unified.",
"type": "object",
"properties": {
"method": {
"enum": [
"ctm",
"ctm_compact",
"horizontal",
"vertical",
"horizontal+vertical",
"vertical+horizontal",
"top",
"random",
"repeat",
"fixed",
"overlay_ctm",
"overlay_random",
"overlay_repeat",
"overlay_fixed"
],
"description": "Method to use when choosing a block's replacement texture."
},
"tiles": {
"type": "string",
"description": "Space-separated string of replacment tiles to use."
},
"matchTiles": {
"$ref": "common.schema.json#/$defs/item_id_list",
"description": "Space-separated string of tiles this method should apply to."
},
"matchBlocks": {
"$ref": "common.schema.json#/$defs/item_id_list",
"description": "Space-separated string of blocks this method should apply to."
},
"weight": {
"type": "integer",
"default": 0,
"description": "If multiple properties files match the same block, the highest weighted one is used."
},
"connect": {
"enum": [
"block",
"tile",
"material",
"state"
],
"description": "The conditions under which two blocks should connect."
},
"connectTiles": {
"$ref": "common.schema.json#/$defs/item_id_list",
"description": "Connect only to blocks which are using the specified tiles."
},
"faces": {
"type": "string",
"pattern": "(bottom|top|north|south|east|west|sides|all) ?",
"description": "Limit CTM to certain faces of the block."
},
"biomes": {
"type": "string",
"description": "Space-separated string of biome restrictions."
},
"heights": {
"type": "string",
"description": "Height restriction ranges."
},
"minHeight": {
"type": "integer",
"minimum": -65535,
"deprecated": true,
"description": "Legacy key for heights."
},
"maxHeight": {
"type": "integer",
"maximum": 65535,
"deprecated": true,
"description": "Legacy key for heights."
},
"tintIndex": {
"type": "integer",
"minimum": -1,
"default": -1,
"description": "Tint index, only for overlay method."
},
"tintBlock": {
"$ref": "common.schema.json#/$defs/item_id",
"description": "The block used for the tile texture tinting."
},
"layer": {
"enum": [
"cutout_mipped",
"cutout",
"translucent"
],
"default": "cutout_mipped",
"description": "The layer on which the overlay texture should be rendered."
},
"name": {
"$ref": "common.schema.json#/$defs/item_id_list",
"description": "Only for blocks with have corresponding nameable tile entities."
}
},
"patternProperties": {
"^ctm\\.\\d+$": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Compact CTM tile replacement. Allows definition of replacement tile for a specific CTM case."
}
},
"required": [
"tiles"
],
"additionalProperties": false,
"allOf": [
{
"if": {
"properties": {
"connectTiles": {}
}
},
"then": {
"properties": {
"method": {
"const": "overlay"
}
}
}
},
{
"if": {
"patternProperties": {
"^ctm\\.\\d+$": {}
}
},
"then": {
"properties": {
"method": {
"const": "ctm_compact"
}
}
}
},
{
"if": {
"properties": {
"tintIndex": {}
}
},
"then": {
"properties": {
"method": {
"const": "overlay"
}
}
}
},
{
"if": {
"properties": {
"layer": {}
}
},
"then": {
"properties": {
"method": {
"const": "overlay"
}
}
}
},
{
"if": {
"properties": {
"method": {
"const": "ctm"
}
}
},
"then": {
"properties": {
"innerSeams": {
"type": "boolean",
"default": false,
"description": "Whether to show seams on inner edges when connecting to adjacent blocks."
}
}
}
},
{
"if": {
"properties": {
"method": {
"const": "ctm_compact"
}
}
},
"then": {
"properties": {
"innerSeams": {
"type": "boolean",
"default": false,
"description": "Whether to show seams on inner edges when connecting to adjacent blocks."
}
},
"patternProperties": {
"^ctm\\.\\d+$": {
"type": [
"string",
"integer"
],
"minimum": 0,
"description": "Indexes of replacement tiles for specific CTM cases."
}
}
}
},
{
"if": {
"properties": {
"method": {
"const": "random"
}
}
},
"then": {
"properties": {
"weights": {
"type": "string",
"description": "Space-separated string of weights to apply to the random choice."
},
"randomLoops": {
"type": "integer",
"minimum": 0,
"maximum": 9,
"description": "Repeats the random function by this amount to increase randomness."
},
"symmetry": {
"enum": [
"none",
"opposite",
"all"
],
"default": "none",
"description": "Desired level of symmetry for the faces of each block."
},
"linked": {
"type": "boolean",
"default": false,
"description": "Whether to link textures between related blocks."
}
}
}
},
{
"if": {
"properties": {
"method": {
"const": "repeat"
}
}
},
"then": {
"properties": {
"width": {
"type": "integer",
"minimum": 1,
"maximum": 16384,
"description": "The width of the repeating pattern."
},
"height": {
"type": "integer",
"minimum": 1,
"maximum": 16384,
"description": "The height of the repeating pattern."
},
"symmetry": {
"enum": [
"none",
"opposite"
],
"default": "none",
"description": "Desired level of symmetry for the faces of each block."
}
},
"required": [
"width",
"height"
]
}
}
]
}