COWMODSКаталог модов

Really Fast Paintings

Block-backed paintings for Minecraft on Fabric.

6241обновлён 27 сент. 2026 г.
ОптимизацияУтилиты

Описание

Really Fast Paintings

Minecraft Fabric API Java License

Really Fast Paintings is a Fabric performance mod for Minecraft 26.2 that replaces vanilla Painting entities with non-ticking, block-backed decorations while preserving vanilla painting variants, placement behavior, collision/raycast interaction, support checks, and datapack-defined painting dimensions.

Each converted painting uses a single logical PaintingBlockEntity at its anchor and lightweight non-ticking part blocks for the rest of its footprint. This removes the need to keep a full entity alive for every painting while still allowing large paintings to behave like normal wall decorations.


🌟 Key Features

  • Block-Backed Paintings: Converts exact vanilla Painting entities into block-backed decorations with one logical block entity per painting.
  • No Painting Entity Tick Cost: Converted paintings no longer remain as ticking vanilla entities.
  • Compact Multipart Footprints:
    • One anchor PaintingBlockEntity stores the painting state.
    • Remaining occupied tiles use lightweight PaintingPartBlock states.
    • Part blocks encode OFFSET_X, OFFSET_Y, and FACING, allowing the anchor position to be reconstructed with direct arithmetic rather than lookup maps.
  • Vanilla-Compatible Geometry: PaintingFootprint mirrors vanilla painting bounding-box and hanging-support calculations, including multi-block collision/raycast coverage and backing-block validation.
  • Datapack-Compatible Variants: Painting dimensions and assets are resolved dynamically from Registries.PAINTING_VARIANT, supporting variants from datapacks without hard-coded size tables.
  • Variant-Preserving Drops: Broken paintings can retain their exact minecraft:painting_variant data component and restore the same variant when placed again.
  • Safe Migration Tools: Existing vanilla paintings can be converted automatically or manually, and block-backed paintings can be restored to vanilla entities before uninstalling the mod.

🎨 Client Rendering & LOD

Really Fast Paintings uses a custom PaintingBlockRenderer with projected-screen-size LOD selection and hysteresis to reduce geometry and lighting work as paintings become smaller on screen.

LODRepresentation
FULLFull segmented front/back/edge geometry with per-block lighting.
SIMPLIFIEDSimplified box-style geometry with a single light sample.
FARSingle front-facing quad with one light sample.
SKIPPainting is not submitted when its projected size is below the active threshold.

The default projected-size thresholds are approximately:

  • FULL: 64 px and above
  • SIMPLIFIED: 12–64 px
  • FAR: 1–12 px
  • SKIP: below 1 px

Promotion/demotion hysteresis uses separate thresholds to reduce visible LOD flicker while moving toward or away from paintings.


🌄 Distant Decorations Integration

Really Fast Paintings has optional integration with Distant Decorations.

When Distant Decorations is installed:

  • Really Fast Paintings registers its own lightweight server-side decoration provider.
  • Only painting metadata is synchronized through DD: asset ID, facing, width, and height.
  • Physical bounds are calculated from the same PaintingFootprint geometry used by the live painting implementation.
  • The distant client renderer uses the vanilla painting atlas and submits a single front-facing quad.
  • The DD renderer opts into a 0.01 px projected-size culling threshold and can apply up to 16× visual-only far-LOD scaling to keep extremely distant paintings rasterizable without changing their authoritative physical AABB.

Distant Decorations is optional; Really Fast Paintings runs normally without it.


⚙️ Configuration

Configuration is stored in:

config/fastpaintings.json
OptionDefaultDescription
preserveVariantOnDroptruePreserve the exact painting variant when a converted painting is broken and dropped.
convertExistingPaintingstrueConvert vanilla paintings loaded from disk when they enter loaded chunks.
convertOnPlacementtruePlace block-backed paintings directly when a painting item is used.
convertCommandCreatedPaintingstrueConvert newly created vanilla painting entities, including command-created paintings.
skipSpecialEntityDatatrueLeave paintings with special entity data such as custom names, invulnerability, or glowing state as vanilla entities.
debugInstrumentationfalseEnables additional renderer instrumentation counters for profiling/debugging.

🛠️ Commands

All Really Fast Paintings commands require gamemaster-level command permission.

IMPORTANT

  • /fastpaintings convert operates on all currently loaded painting entities across all dimensions.
  • /fastpaintings stats and /fastpaintings restore inspect and operate only on currently loaded chunks around active players (or spawn chunks if no players are online). They do not scan offline region files, unloaded chunks, or unvisited dimensions. To inspect or restore paintings across an entire world, operators or players must visit all areas containing paintings while chunks are loaded.
  • /fastpaintings stats
    • Scans deduplicated loaded chunks around active players/spawn and displays the total count of loaded vanilla painting entities, block painting anchors, and multipart helper parts (including any orphan helper parts).
  • /fastpaintings convert
    • Attempts to convert currently loaded vanilla painting entities across all dimensions to block-backed paintings (explicit operator execution overrides prior restoration suppression).
  • /fastpaintings restore
    • Restores block-backed paintings in loaded chunks around active players/spawn back to vanilla Painting entities for migration or safe uninstallation.

⚠️ Safe Uninstallation Procedure

To uninstall Really Fast Paintings cleanly from a world without losing placed paintings:

  1. Create a complete world backup before making configuration changes or running restoration.
  2. In config/fastpaintings.json, persistently disable all automatic conversion and placement options:
    "convertExistingPaintings": false,
    "convertCommandCreatedPaintings": false,
    "convertOnPlacement": false
    
    Save the file and start the server/client.
  3. Visit all areas and dimensions where block-backed paintings were placed. While players keep those chunks loaded, run /fastpaintings restore. Converted paintings are replaced with vanilla Painting entities marked with persistent suppression tags.
  4. Run /fastpaintings stats across all visited areas to verify that 0 block painting anchors and 0 multipart helper parts remain in loaded chunks.
  5. Shut down the server/client cleanly and safely remove the Really Fast Paintings mod JAR from the mods/ directory.

🧱 Architecture

A converted painting is represented as:

Painting footprint
├── 1 × PaintingBlockEntity anchor
└── N × PaintingPartBlock tiles

The anchor stores the logical painting state and variant. Part blocks store only enough block-state information to reconstruct their anchor position in constant time.

PaintingFootprint is the shared geometry authority for:

  • painting world-space bounds
  • occupied cells
  • backing/support cells
  • anchor/part coordinate conversion
  • vanilla-compatible support validation

This keeps rendering, interaction, conversion, and Distant Decorations metadata aligned to the same physical footprint.


📦 Building from Source

git clone https://github.com/justbecauseph/fast-paintings.git
cd fast-paintings
./gradlew build

The compiled mod JAR will be located in:

build/libs/

The project targets:

  • Minecraft 26.2
  • Fabric Loader 0.19.3
  • Fabric API 0.158.0+26.2
  • Java 25

📄 License

Really Fast Paintings is licensed under the Mozilla Public License 2.0 (MPL-2.0).

Галерея

Really fast paintings

Последние версии

Все версии →
release

Really Fast Paintings 2.0.0

2.0.0
27 сент. 2026 г.295Minecraft: 26.3fabric
Скачать
Что нового
# Really Fast Paintings v2.0.0 Minecraft 26.3 release for Fabric. - Updated painting placement, persistence, rendering, and metadata for Minecraft 26.3. - Requires Fabric Loader 0.19.5 or newer, Fabric API 0.161.0 or newer for 26.3, and Java 25. - Keeps Distant Decorations 2.0.0 optional. Its published Modrinth artifact supplies the compile API. - Added client GameTests that enter a world, render a 2×2 painting, and exercise Distant Decorations record delivery and distant render submission. [Changes since v1.1.0](https://github.com/justbecauseph/really-fast-paintings/compare/v1.1.0...v2.0.0)
release

Really Fast Paintings 1.1.0

1.1.0
12 сент. 2026 г.313Minecraft: 26.2fabric
Скачать
Что нового
# Changelog: v1.0.0...v1.1.0 ### Summary Really Fast Paintings **v1.1.0** focuses on baseline correctness, failure-safe migration and restoration boundaries, prevention of duplicate entities or orphaned helper parts, chunk-granular auditing, and regression test coverage. --- ### 🐛 Bug Fixes - **Anchor Coordinate Resolution Outside Origin:** - Fixed an issue in [`PaintingPartBlock.findAnchorLookup(...)`]( src/main/java/me/justbecause/fastpaintings/block/PaintingPartBlock.java#L110-L162) where search candidates were allocated without setting offset coordinates (defaulting to `(0, 0, 0)`). Multipart paintings placed away from origin now properly resolve their anchor across all 4 horizontal facings. - Implemented [`AnchorLookupResult`]( src/main/java/me/justbecause/fastpaintings/block/PaintingPartBlock.java#L164-L186) (`Found`, `Unloaded`, `Orphan`) to avoid treating part blocks adjacent to unloaded chunks as orphans, eliminating premature self-destruction or forced chunk loading. - **Placement Order & Neighbor Updates:** - Fixed placement sequencing in [`PaintingPlacementService.tryPlacePainting(...)`]( src/main/java/me/justbecause/fastpaintings/painting/PaintingPlacementService.java#L23-L65): the anchor block is placed and its [`PaintingBlockEntity`]( src/main/java/me/justbecause/fastpaintings/block/entity/PaintingBlockEntity.java) variant initialized before placing part blocks, preventing neighbor-update cascades from destroying part blocks during placement. - **Multi-Tick Restoration Suppression Loop:** - Restored vanilla `Painting` entities are tagged with `fastpaintings:restored` and tracked in an in-memory suppressed UUID set in [`PaintingConversionService`]( src/main/java/me/justbecause/fastpaintings/painting/PaintingConversionService.java#L24-L50), preventing automatic conversion listeners from immediately reconverting newly restored entities on the next server tick. - **Removal-Guard State Reset:** - Guaranteed that [`PaintingBlockEntity.setRemoving(false)`]( src/main/java/me/justbecause/fastpaintings/block/entity/PaintingBlockEntity.java#L48-L54) is properly reset during restoration rollback, preventing surviving anchor blocks from remaining permanently locked against future removal. --- ### 🛡️ Safety & Recovery Improvements - **Staged Restoration Recovery & Rollback Boundary:** - Expanded the recovery boundary in [`PaintingConversionService.tryRestore(...)`]( src/main/java/me/justbecause/fastpaintings/painting/PaintingConversionService.java#L180-L336) to begin prior to footprint removal. - Added pre-spawn footprint validation ensuring all cells are cleared of block representations before attempting entity insertion. - Structured recovery into two distinct, independently guarded stages: 1. **Stage 1 (Entity Reconciliation & Cleanup):** Cleans up attempted entities and clears suppression markers via [`EntityCleaner`]( src/main/java/me/justbecause/fastpaintings/painting/PaintingConversionService.java#L143-L146). 2. **Duplicate Representation Prevention:** If entity cleanup fails and the attempted vanilla entity remains active in the level, footprint rollback is skipped to prevent duplicate representations (both active entity and block painting). Throws a location-bearing [`RestorationException`]( src/main/java/me/justbecause/fastpaintings/painting/RestorationException.java) containing the anchor position, preserving all failure causes. 3. **Stage 2 (Footprint Rollback):** Safely restores all footprint cells to their original block states and resets the anchor removal guard only when the entity is confirmed dead/absent from the level. - **Suppression Preservation on Failed Operator Reconversion:** - Preserved restoration tags and UUID suppression when an operator explicitly runs `/fastpaintings convert` and conversion fails due to an obstacle (such as custom entity data). Suppression markers are retained until conversion commits successfully. --- ### 📊 Migration & Diagnostic Commands - **Section-Granular Chunk State Auditing:** - Implemented [`PaintingMigrationCommand.scanChunk(LevelChunk)`]( src/main/java/me/justbecause/fastpaintings/command/PaintingMigrationCommand.java#L209-L239) using palette prechecks (`section.maybeHas(...)`) and intra-section block iteration `(0..15)`: - Counts actual `PAINTING_BLOCK` states directly (`scan.anchorBlocks()`). - Counts `PAINTING_PART_BLOCK` helper states (`scan.helperParts()`). - Separately counts instantiated [`PaintingBlockEntity`]( src/main/java/me/justbecause/fastpaintings/block/entity/PaintingBlockEntity.java)s (`scan.anchorBlockEntities()`). - Missing-BE orphan anchor states never report false clean (0 anchors). - `/fastpaintings stats` output displays: `Block painting anchors: %d (BlockEntities: %d)` alongside helper parts. - Guaranteed zero boundary-crossing reads into unloaded chunks during chunk scans. - **Command Scope & Safe Uninstallation Documentation:** - Updated [`README.md`]( README.md#L87-L119) and in-game feedback to clarify execution scopes: - `/fastpaintings convert` evaluates loaded entities across all dimensions. - `/fastpaintings stats` and `/fastpaintings restore` operate strictly on loaded chunks around active players or world spawn. - Added a step-by-step **Safe Uninstallation Procedure** to guide operators in backing up worlds, disabling conversion configs, restoring paintings in loaded chunks, and certifying 0 remaining anchors/helpers before removing the mod jar. --- ### 🧪 Testing & Verification - **New Unit Tests:** - Added [`PaintingPartBlockUnitTest.java`]( src/test/java/me/justbecause/fastpaintings/block/PaintingPartBlockUnitTest.java) (5 tests), covering: - Anchor lookup candidate calculation within bounded planes. - Strict avoidance of reads into unloaded chunks (`testAnchorLookupCandidateMakesNoReadsIntoUnloadedChunks`). - Proven orphan detection when all candidates are loaded. - Total unit test suite: **67 tests passing (0 failures)**. - **Expanded GameTest Suite:** - Expanded [`FastPaintingsGameTests.java`]( src/gametest/java/me/justbecause/fastpaintings/test/FastPaintingsGameTests.java) from 5 to **22 mod tests (23 total GameTests passing)**: - All 4 horizontal facings (`NORTH`, `SOUTH`, `EAST`, `WEST`) tested for placement and break. - Multipart anchor resolution and break verification outside origin with drop integrity assertions. - Backing wall destruction via natural game physics block updates. - Multi-tick restoration suppression survival. - Atomic rollback on entity insertion failures, spawner crashes, and incomplete removals. - `testRestorationCleanupFailurePreventsDuplicateRepresentations`: Verifies rollback is skipped and `RestorationException` raised if an entity remains active. - `testStatsCountsAnchorBlockWithoutBlockEntity`: Verifies orphan anchor blocks without block entities are counted accurately. - Zero item drops in creative mode. --- ### 📦 Commits (v1.0.0...v1.1.0) - [`7baecfe`](https://github.com/justbecauseph/fast-paintings/commit/7baecfe) `fix: separate cleanup and rollback recovery stages and enumerate anchor block states` - [`9219c07`](https://github.com/justbecauseph/fast-paintings/commit/9219c07) `fix: harden restoration recovery boundary, chunk-granular stats, and regression test suite` - [`84c3faf`](https://github.com/justbecauseph/fast-paintings/commit/84c3faf) `fix: harden restoration safety, uninstallation scope, and honest test harness` - [`105191d`](https://github.com/justbecauseph/fast-paintings/commit/105191d) `fix: address reproduced restoration safety failures` - [`afa0d9e`](https://github.com/justbecauseph/fast-paintings/commit/afa0d9e) `test: cover callback removal and multi-tick restoration` - [`6ccddc9`](https://github.com/justbecauseph/fast-paintings/commit/6ccddc9) `fix: resolve multipart painting anchors outside world origin` **Full Changelog**: https://github.com/justbecauseph/really-fast-paintings/compare/v1.0.0...v1.1.0
release

Really Fast Paintings 1.0.0

1.0.0
21 авг. 2026 г.16Minecraft: 26.2fabric
Скачать
Что нового
**Full Changelog**: https://github.com/justbecauseph/really-fast-paintings/commits/v1.0.0