Skip to content

Daniel971O/ApertureMapsLib

Repository files navigation

ApertureMapsLib (Minecraft Forge 1.12.2) README

                         .:--.-+**+++=-:.                             
                     -=*#%%=-#%%%%%%%%%%%#*=:                         
                  -*%%%%%#:+%%%%%%%%%%%%%%%%%#+:                      
               .=#%%%%%%*:#%%%%%%%%%##***+++***#*-                    
              -#%%%%%%%+:#%%#*+=-:..:=*********+==-.                  
             :%%%%%%%%*.#+-:. :=++=    :=#%%%%%%%%%%-                 
            *.#%%%%%%#.:-=*=*= *#=:  .=+=-:+#%%%%%%%%=                
           +%=-%%%%%%::*%#:+*- :     *%%%%#- -*%%%%%%%-               
          :%%%:+%%%%=-%%%%%#+=    .-**#%**%%+.=:+%%%%%#               
          +%%%#:+%%#.%%%#*:       .*++---+%%%:=#=:*%%%%-              
          *%%%%#:+%+ +#:..       .#%%%%%%#*%#:.%%#=-#%%=              
          *%%%%%%--=  .:--+=:    .*%%%%%%%#*: .%%%%*:*%=              
          =%%%%%%%*.    .%%%%#=-     :%%%%#:  :%%%%%#:*:              
          .#%%%%%%%#-    :*%%%%=      *%%%-:  +%%%%%%#.               
           :#%%%%%%%%+.    %%#:       =%#-::=.#%%%%%%#.               
             ===*#%%%%#=.  **.         .  -#-=%%%%%%#:                
             :##*+======+=:.- .....:::::=#%*.#%%%%%*.                 
               =#%%%%%%#**++===-==- :=#%%%#.+%%%%#=                   
                .=#%%%%%%%%%%%#+=-+#%%%%%%-=%%%#=.                    
                   :+#%%%%*+===*%%%%%%%%%-=%#+:                       
                      .:.:+#%%%%%%%%%%%#::-.                          
                            .:-----::.                                

ApertureMapsLib — coremod-библиотека для Forge 1.12.2, которая делает большие прямоугольные (не квадратные) текстуры безопасными и валидными для загрузки в ванильном атласе, также (опционально) чинит несколько едж-кейсов CTM (ConnectedTexturesMod) для паттерн-текстур.

Если вы делаете обои/плитку/панели/узоры, где одна текстура покрывает много блоков (например 7x4, 20x12 тайлов и т.д.), то без специальных мер Minecraft 1.12.2 может:

  • выбрасывать исключение при ститчинге атласа (TextureAtlasSprite): broken aspect ratio and not an animation;
  • «обрезать» её в атласе: часть вашей текстуры визуально заменяется соседними спрайтами;
  • давать мусор/швы на границах при CTM-рендере из-за UV/float погрешностей.

Эта библиотека решает именно такие случаи и подключается без API: включение делается на уровне текстуры через .png.mcmeta.

Если вы строите карту с модом LittleTiles рисуя паттерны текстур с помощью мода, или делаете собственные нестандартные текстуры для блоков, то этот мод-библиотека будет вам полезен.


Требования

  • Minecraft: 1.12.2
  • Forge: 14.23.x (рекомендуется)
  • Java: 8

CTM (ConnectedTexturesMod)

Библиотека может работать и с CTM, и без него:

  • С CTM: дополнительно применяются патчи к UV-математике CTM для больших паттернов.
  • Без CTM: работают только патчи атласа/спрайтов.

По умолчанию CTM считается обязательной зависимостью (но это можно выключить в конфиге). Я добавил эту возможность, если по какой-то причине CTM вам не нужен.


Установка (Клиент)

  1. Положите ApertureMapsLib*.jar в mods/.
  2. (Рекомендуется) Положите CTM в mods/.

Библиотека не требует никаких вызовов из кода: она сама читает .mcmeta рядом с текстурами и применяет патчи.


Подключение в своём моде (для моддеров)

Главная идея

ApertureMapsLib включается точечно: для каждой конкретной текстуры, где вы хотите разрешить не-квадратность и включить безопасный режим атласа.

Для этого рядом с PNG создаётся файл .png.mcmeta и в нём добавляется секция aperturemapslib.

Как библиотека находит .mcmeta

Майнкрафт для каждого спрайта хранит iconName в виде:

  • modid:blocks/texture_name
  • modid:items/texture_name
  • и т.п.

Если iconName = modid:blocks/example, то библиотека будет искать:

  • assets/modid/textures/blocks/example.png.mcmeta

Важно:

  • .mcmeta должен попасть в jar вашего мода.
  • JSON читается как UTF-8.

Формат .png.mcmeta

Поддерживаются два формата.

Вариант 1: минимальный (boolean)

Самый простой вариант: включить библиотеку со стандартными настройками.

{
  "aperturemapslib": true
}

Пример с ConnectedTexturesMod (CTM) Патерн 10×5 блоков

{
  "ctm": {
    "ctm_version": 1,
    "type": "pattern",
    "extra": {
      "width": 10,
      "height": 5
    }
  },
  "aperturemapslib": {
    "enabled": true
  }
}

Эквивалентно:

  • enabled=true
  • square_reserve=true
  • guard=true

Вариант 2: объект с параметрами

{
  "aperturemapslib": {
    "enabled": true,
    "square_reserve": true,
    "guard": true
  }
}

Примечания:

  • enabled по умолчанию true.
  • square_reserve по умолчанию true.
    • Также принимается алиас square.
  • guard по умолчанию true.

Когда отключать параметры

  • square_reserve=false выключает резервирование квадрата в атласе.
    • Это экономит место, но для больших прямоугольных паттернов почти всегда возвращает баги (обрезка/перекрытие).
  • guard=false разрешает ванильному ститчеру применять проблемные пути (поворот/скейл) для этой текстуры.
    • Обычно нужно только для экспериментов.

Если вы не уверены — используйте просто "aperturemapslib": true.


Что делает библиотека (по аспектам)

ApertureMapsLib — это coremod и патчит несколько мест в рантайме.

1) Разрешение прямоугольных спрайтов (TextureAtlasSprite)

В 1.12.2 есть ванильная проверка, которая выбрасывает исключение с текстом:

  • broken aspect ratio and not an animation

Библиотека:

  • оставляет ванильное поведение для обычных текстур;
  • для managed-текстур (где .mcmeta содержит aperturemapslib) отключает это.

Без этого ванильная проверка часто приводит к падению перезагрузки ресурсов на этапе сборки (stitch) атласа (или к missingno, если исключение где-то перехватили).

2) Защита от «обрезки» в атласе (Stitcher)

Самая неприятная проблема: Minecraft пакует все спрайты в один большой атлас через Stitcher. При определённом наборе модов/текстур и размерах атласа прямоугольный спрайт может:

  • быть повернутым/скейленным;
  • или получить ситуацию, когда «свободная область» рядом с ним заполняется чужими спрайтами, из-за чего в игре вы видите, будто ваш спрайт частично заменён чужими текстурами.

ApertureMapsLib лечит это двумя механизмами.

Square reservation (square_reserve)

  • Для managed-спрайта в атласе резервируется квадрат SxS, где S = max(width, height).
  • Реальная текстура занимает только часть этого квадрата, а остальное остаётся пустым.
  • Благодаря этому другие спрайты не смогут «залезть» в область, которая визуально принадлежит вашему паттерну.

Guard (guard)

  • Для managed-спрайтов отключаются проблемные пути ститчера (поворот/скейл), которые чаще всего и приводят к нестабильному поведению на больших текстурах.

Компромисс:

  • Square reservation тратит больше VRAM (атлас может стать больше). Это цена корректности но если у вас хотя бы средний пк вы не заметите разницу.

3) Патчи CTM (если CTM установлен)

Для больших паттерн-текстур CTM иногда упирается в float-погрешности и UV-границы, из-за чего появляются:

  • швы,
  • мусорные пиксели,
  • неверные вырезки паттерна.

Библиотека патчит:

  • интерполяцию Submap (clamp по U/V);
  • паттерн-трансформацию (малый clamp + обход одного проблемного пути subdivide для managed-паттернов).

Важно:

  • Эти CTM-патчи применяются только к .mcmeta-managed текстурам.

Конфиг (config/aperturemapslib.cfg)

Конфиг создаётся автоматически, если его нет.

Текущий шаблон (дефолт):

# ApertureMapsLib debug config\# Дебаг конфиг ApertureMapsLib
# Core behavior is fixed in code: guard + square reservation are always enabled\# Основная логика защита + square всегда включена в коде
# debug.guard_only=true Unstable guard system (disables square reserve)\# debug.guard_only=true Нестабильная система гвард (отключает square)

# Debug settings\# Дебаг настройки
debug.atlas_dump=true
debug.stitch=false
debug.pattern_samples=false
debug.core.verbose=false
debug.guard_only=false
dependency.ctm.required=true

dependency.ctm.required

  • true (по умолчанию): CTM считается обязательным. Если CTM нет, библиотека покажет сообщение в игре и объяснит, как отключить требование.
  • false: разрешить запуск без CTM.

Debug-флаги

  • debug.atlas_dump
    • дампит атлас в PNG + список спрайтов.
  • debug.stitch
    • логирует расширенную информацию по managed-спрайтам (размеры, UV, поворот, origin).
  • debug.pattern_samples
    • печатает ограниченное число сэмплов CTM-паттерна (step/off значения).
  • debug.core.verbose
    • максимально подробные core-логи.
  • debug.guard_only
    • выключает square reservation и оставляет только guard. Это специально помечено как нестабильный режим.

Отладка: куда смотреть

Дамп атласа

При debug.atlas_dump=true библиотека пишет:

  • папка: aperturemapslib_debug/
  • файлы:
    • atlas_blocks.png
    • atlas_blocks_rects.txt

Это самый быстрый способ убедиться, что:

  • ваша текстура реально присутствует в атласе;
  • вокруг неё зарезервирован квадрат;
  • спрайт не повернут;
  • соседние текстуры не перекрывают область паттерна.

Логи

Если вы ловите странные глитчи, включите по очереди:

  • debug.stitch=true
  • debug.core.verbose=true
  • debug.pattern_samples=true

И приложите к репорту:

  • размеры текстуры,
  • atlas_blocks.png,
  • кусок latest.log вокруг стадии stitch.

Рекомендации по текстурам и производительности

Square reservation решает баги, но расходует атлас.

Практические советы:

  • Включайте aperturemapslib только там, где реально нужно (большие прямоугольные паттерны).
  • Важно: для блоковых паттернов размеры PNG должны быть кратны 16 по ширине и высоте (N*16 x M*16), иначе текстура не делится на блоки 16x16 и паттерн будет некорректным.
  • Старайтесь не держать десятки огромных текстур одновременно.
  • Следите за максимальным размером текстуры на GPU:
    • атлас может вырасти до 2048x2048, 4096x4096 и выше;
    • если упереться в лимит будет missing sprites.
  • Для адекватных мипмапов используйте размеры, кратные 16 (и не слишком маленькие для выбранного mipmap level).

Troubleshooting (FAQ)

1) Всё ещё падает с broken aspect ratio...

  • Значит текстура не managed.
  • Проверьте путь .mcmeta и секцию aperturemapslib.

2) В игре паттерн обрезан/заменён чужими текстурами

  • Убедитесь, что square_reserve=true.
  • Убедитесь, что debug.guard_only=false.
  • Включите дамп атласа и проверьте, виден ли квадрат резервирования.

3) Пишет, что CTM отсутствует

  • Поставьте CTM.
  • Или выставьте в конфиге dependency.ctm.required=false.

Сборка из исходников

  • Нужен JDK 8.
  • Сборка:
    • gradlew build
  • Результат:
    • build/libs/ApertureMapsLib1.12.2-<version>.jar

Jar является coremod’ом (в manifest указан FMLCorePlugin) и должен лежать в mods/.


Рекомендации без (возможно излишней воды)

  1. Добавьте PNG паттерна.
  2. Добавьте .png.mcmeta с "aperturemapslib": true.
  3. Запустите с debug.atlas_dump=true.
  4. Проверьте atlas_blocks.png.
  5. Если никаких проблем нету отключите дебаг-флаги перед релизом вашего мода чтобы не спамить лишними логами и дампами.

Демонстрация в игре

2026-03-11_06 35 29

Если хотите улучшить библиотеку, или найдете неприятный баг, в репорт кладите:

  • размер текстуры,
  • .png.mcmeta,
  • atlas_blocks.png и atlas_blocks_rects.txt,
  • кусок latest.log вокруг stitch.

Лицензия: см. файл LICENSE

Если в README чего-то не хватает или осталось непонятно — спрашивайте напрямую в комментариях, я отвечу.


Библиотека создана при поддержке проекта - KharkivTiles 1:1

KharkivTiles 1:1 - проект по воссозданию города Харьков в Minecraft в масштабе 1:1 с модом LittleTiles.

Телеграм канал проекта:

https://t.me/kharkivstroi


Если библиотека помогла вашему проекту - буду рад, если вы укажете её в описании или упомянете о проекте =)

Спасибо всем тем кто активно следит за моим проектом, и помогает мне не выгореть. <3

                                       -+***+:    -+***+:                                          
                                     -%@@@@@@@#:=%@@@@@@@*.                                        
                                     %@@@@@@@@@@@@@@@@@@@@=                                        
                                     #@@@@@@@@@@@@@@@@@@@@=                                        
                                     :%@@@@@@@@@@@@@@@@@@*                                         
                                      .*@@@@@@@@@@@@@@@%=                                          
                                        :*@@@@@@@@@@@%+.                                           
                                          :*%@@@@@@%=.                                             
                                            .=%@@#-                                                
                                               :.                                                  
                                               =.                                                  
                                               +.                                                  
                                               +.                                                  
                                              .#=                                                  
                                              -**-:                                                
                                           -:---=%@%*                                              
                                         ::=+++=-####=:                                            
                                      .-:---:-:- ##%%%#+-                                          
                           ..         ::%=*+-+:: ##*+=**#          .:.                             
                          .==         ::-.-=-*=+ #+**#%%%          -.-                             
                     -::---*%%*=.     --@:--::.: #@%#***%       ..:-+=::.                          
                  -::--=-: @%%@@*-    -:@:+*=%=+ #+++=*#@     -:::--.+%##*:.                       
                  = #==+-: #-+==+*::::+:@:::.-:- #@%@%#*%   .--+==*+.+#=-**#+                      
                  = =--*== @-@#%%@%%##****+*-*-+ #@#@#*++++***+*+=@@:+%##%#**                      
                  = =::-:. @-@###%:-:--:=@##-==* #@%@@@@#---.****=@@:+%*=++=*                      
           =+-:.  = #++#=-.@-@*#*#:%+*+-=@**@=+*********+++*:#*-%+@@:+#==**##  .::=+               
        .::==+=#**+ -::=--.@-@*###.+-++==@*+@=%@%#%#%%%%%@@@-#%%@+@@:+%####*%::=*+#@:.             
        =.-==: #*#+ *--=::.@-***++.=:--:=@--@=%@%=#=*=++=*-@-#*-#+**.+#+-++=%  -@%+*#%:            
        = --:: ::-:.*==#+=.@-@%%@#:%+#*+=@%%@=#@@***####%%%@-##+%*@@.+#+=*##@#*#@####%-            
        =:**=+ -=+=.-::::..@-@%@@#.=:--:=@=-@=#@@.###****+:@-##*%+@@.+%####*%+++@**++#-            
       -=::+-=*:+-#:#==*=-.@-@@@@#:#=*+==@*+@=#@@:@@@@@@#+:@-#*-#+@@.+#+-++=%+@@@=+++##*           
       *++++.::.*=%:=--+--.@-@@@@#.+-+=-=@**@=#@%:@*==#@+ .@-#%%%+@@.+#*+###%+#=%*###%@@           
       *+=+=-++-=:=:%*+%++.@-@@@@#.+:=-:=@--@=#@%:@+:.*@+ .@-#*-#+@@.+%#*##*%++ %****#@@           
   ....*---*--=====+@##@##*@#@@@@%++****#@%%@#%@%*@#++#@#=+@*%@@@#@@+#@@@@@@%##-@@@@@@@@:...       
   -========================================================================================                                                                                    

Chisel Team

Отдельная благодарность команде Chisel Team за создание ConnectedTexturesMod (CTM), который вдохновил часть решений в этой библиотеке и дал возможность использовать паттерн-текстуры

About

Forge 1.12.2 coremod library for safe stitching of large non-square pattern textures (+ optional CTM edge-case fixes).

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages