Community listing page, reviews here may not be monitored by the author.
TsAssembly
No reviews yet
Dynamically connected textures!
Community voices
Reviews
No reviews yet. Be the first to review this project!
Get it on
Available Platforms
About
Project Details
For authors
Embed Badge
If you're the author of this project, you can embed a live badge anywhere that supports HTML or Markdown. It updates automatically whenever ratings change.
Use HTML for any page that supports it, or Markdown for README files and Markdown-based descriptions.
Identifiers
Platform IDs
Resources
External Links
About
Description
TsAssembly — Dynamic Rule Tile & Connected Textures Engine
TsAssembly is a lightweight, high-performance, client-side dynamic connected textures (CTM) and rule-tile engine for NeoForge. Built for real-time quad manipulation, it seamlessly merges adjacent blocks, glass panes, and complex surfaces using 3x3 composite overlays, 47-tile full connectivity, and directional edge solvers with zero runtime garbage collection overhead.
Beyond standard texture stitching, TsAssembly features an advanced Geometry & Occlusion Culling Suite designed to strip duplicate meshes, eliminate Z-fighting, and perform real-time pixel-level alpha occlusion analysis for non-standard blocks (such as trapdoors, slabs, and multi-layered 3D leaves).
Key Features
Zero-Allocation Quad Remapping: Utilizes precomputed $O(1)$ lookup tables (LUT) and raw vertex transforms during chunk meshing to eliminate micro-stutters.
3 Flexible Connection Modes:
COMPOSITE(3x3 Grid): Dynamic layering with seamless transparent corners and edge overlays.FULL(6x6 Grid / 47-Tile CTM): Complete classic connected texture mapping with inner/outer corner detection.PANE_EDGE: Dedicated glass pane connection solver that removes interior seams while preserving exterior borders.Vector-Based Inward Quad Culling: Evaluates vertex-to-center offset against surface normal vectors ($\vec{N} \cdot \vec{D} < 0$) to dynamically eliminate bloated interior quads injected by 3D resource packs (e.g., dense leaves).
Dynamic Alpha & Flush Occlusion Culling: Inspects actual sprite alpha channels in real time ($O(1)$ cached) combined with strict 2D $1.0 \times 1.0$ geometric boundary checks. Automatically culls fully occluded faces behind solid flush non-cube surfaces (e.g., closed spruce trapdoors, solid slab faces) while safely preserving quads behind perforated textures (e.g., oak/iron trapdoors with cutout holes) or partial edge contacts.
Same-Block & Family Tag Culling: Seamlessly strips interior contact faces between identical blocks or blocks sharing the same tag (e.g., oak leaves touching birch leaves under
#minecraft:leaves).Smart 3D Geometry Detection: Accurately calculates adjacent occlusion, diagonal steps, stair offsets, and inverted quad winding.
Built-in Template Exporter: Generate complete resource pack templates with sliced textures directly from in-game blocks.
In-Game Commands
Generate ready-to-edit resource packs and texture templates directly in the game:
/tsassembly export <block>
/tsassembly export <block> [composite|full]
/tsassembly export <block> [composite|full] <pack_name>
- Exported templates are saved directly to
.minecraft/resourcepacks/<pack_name>/.
Custom Resource Pack Guide
Creating a connected texture pack for TsAssembly requires no Java code—only standard PNG textures and JSON rule files.
1. Folder Structure
Create a resource pack folder (e.g., MyConnectedPack) inside your .minecraft/resourcepacks/ directory:
MyConnectedPack/
├── pack.mcmeta
├── pack.png (Optional: 64x64 icon)
└── assets/
└── <namespace>/ (e.g., "tsassembly" or your custom ID)
├── rule_tiles/ (JSON rule definitions)
│ ├── glass.json
│ └── oak_log_sides.json
└── textures/
└── block/ (Connected texture sheets)
├── glass_composite.png
└── oak_log_sides_full.png
2. pack.mcmeta
{
"pack": {
"pack_format": 34,
"description": "Custom Connected Textures for TsAssembly"
}
}
3. Rule Tile JSON Specification
Place your rule definitions in assets/<namespace>/rule_tiles/<name>.json.
Example: glass.json (3x3 COMPOSITE Mode)
{
"type": "COMPOSITE",
"faces": ["all"],
"texture": "tsassembly:block/glass_composite",
"original_texture": "tsassembly:block/glass_original",
"target_blocks": [
"minecraft:glass",
"minecraft:tinted_glass"
]
}
Example: oak_log.json (Direction-Specific FULL Mode)
{
"type": "FULL",
"faces": ["sides"],
"texture": "tsassembly:block/oak_log_sides_full",
"match_sprite": "minecraft:block/oak_log",
"target_blocks": [
"minecraft:oak_log"
]
}
Configuration Properties Reference
| Property | Type | Default | Description |
|---|---|---|---|
type |
String | "AUTO" |
"COMPOSITE" (3x3 overlay), "FULL" (6x6 47-tile), or "PANE_EDGE" (Glass pane edge removal). |
faces |
Array | ["all"] |
Target faces: "all", "sides", "top", "bottom", "north", "south", "east", "west". |
texture |
String | "" |
Path to the grid sheet texture (<namespace>:block/<texture_name>). |
original_texture |
String | "" |
Fallback texture used when a block is isolated or when an overlay is blank. |
match_sprite |
String | "" |
Exact sprite location on the target quad to match (prevents cross-face misapplication). |
target_blocks |
Array | [] |
List of block registry IDs that connect to each other. |
Texture Dimensions & Sheet Layout
COMPOSITE (3x3 Sheet):
Aspect ratio must be 1:1 (e.g., 48x48, 96x96, 192x192).
Texture resolution must be divisible by 3.
Center tile
(1, 1)is always rendered; border tiles(col, row)are layered on demand.FULL (6x6 Sheet / 47-Tile):
Aspect ratio must be 1:1 (e.g., 96x96, 192x192, 384x384).
Texture resolution must be divisible by 6.
Maps all 47 standard CTM edge, corner, and intersection states into a single unified quad replacement.
Client Configuration (tsassembly-client.toml)
The configuration file is located at .minecraft/config/tsassembly-client.toml:
[rendering]
# =========================================================================
# Dual-Sided Rendering & Backface Correction (FakeCull)
# =========================================================================
# Allow dual-sided rendering (FakeCull) for transparent blocks
enable_fake_cull_blocks = true
# Blocks or tags to receive automatic internal backface quads
fake_cull_blocks = [
"#c:glass_blocks"
]
# Blocks or tags to apply perspective-correct U/V texture inversion on backfaces
invert_backface_blocks = [
"#c:glass_blocks"
]
# Blocks switching UV mirror evaluation based on vertex-to-center offset
relative_position_blocks = []
# =========================================================================
# 3D Resource Pack Compatibility & Model Routing
# =========================================================================
# Active 3D resource pack filenames to natively support without double-meshing
compatible_3d_packs = [
"3D Default 1.20+ v1.15.0.zip"
]
# Granular resource pack model routing rules
# 1. Exclusion: 'Pack.zip=BlockOrTag' (Strips 3D model, falls back to prior pack/vanilla)
# 2. Whitelist: 'Pack.zip!=BlockOrTag' (Locks model to Pack.zip; forces vanilla if disabled)
# 3. Vanilla: '!=BlockOrTag' (Unconditionally forces vanilla 2D model)
pack_block_exclusions = [
"3D Default 1.20+ v1.15.0.zip=#c:glass_blocks",
"3D Default 1.20+ v1.15.0.zip=#c:glass_panes"
]
# =========================================================================
# Advanced Geometry & Inward-Facing Quad Culling
# =========================================================================
# Automatically detects and discards quads whose normal vectors point back toward
# the block center (eliminates internal dual-mesh clutter from custom 3D resource packs)
enable_cull_inward_faces = true
# Blocks or tags subject to inward-facing geometry culling
cull_inward_face_blocks = [
"#minecraft:leaves"
]
# =========================================================================
# Same-Block / Tag Family Culling
# =========================================================================
# Culls touching interior quads when adjacent blocks match identical types or belong
# to the same tag (e.g., eliminates internal seams between connected leaves)
cull_same_block_faces = true
# Blocks or tags to apply same-block interior face culling
cull_same_block_list = [
"#minecraft:leaves"
]
# =========================================================================
# Facing Neighbor Culling
# =========================================================================
# List of target blocks/tags to evaluate for neighbor face culling
cull_facing_blocks = [
"#minecraft:leaves"
]
# Aggressive culling mode for cull_facing_blocks:
# true = Culls touching quads whenever the neighbor is non-air (even partial blocks like slabs/stairs)
# false = Culls touching quads only when the neighbor provides full occlusion
cull_facing_incomplete_blocks = false
# =========================================================================
# Flush & Fully Occluded Face Culling (Global Engine)
# =========================================================================
# Globally culls touching quads when flush against a 100% solid, non-perforated neighbor surface.
# Uses dynamic real-time sprite alpha analysis to safely distinguish solid blocks
# (e.g., closed spruce trapdoors, slabs) from perforated ones (e.g., oak/iron trapdoors with holes).
cull_facing_fully_occluded = true
# Blacklist for fully occluded culling (leave empty to apply globally across all blocks)
cull_facing_fully_occluded_blacklist = []
Versions
Files
Relations
Project Relations
More like this
Similar Mods
Suggestions use data such as tags, dependencies, dependents, descriptions, titles, and more to rank how much they overlap with this mod.
On ModDex
Community snapshot
By the numbers
Statistics
Want to reach Minecraft players?
We're looking for a server hosting partner to feature here and other parts of the site. Interested? Send us a message!
Get in touchGet it on
Available Platforms
On ModDex
Community snapshot
By the numbers
Statistics
Resources