Иконка ресурса

Endothermic - нарушаем третий закон термодинамики в отношении запеченных квадов 2.1.2

Нет прав для скачивания
Версия(и) Minecraft
1.12.2
К вопросу актуальности
В последних версиях майнкрафта модели блоков и предметов состоят BakedQuad, запеченных квадов. Для обывателя это выглядит как какие-то массивы интов и вообще непонятно, как с ними работать.
Endothermic - графическая библиотека, сосредоточенная на работе с BakedQuad-ами, как раз решает эту проблему.

Примеры рендеров, сделанных с помощью Endothermic

1587667048275.png



Особенности и цели
Endothermic старается предоставить максимальную производительность, ведь визуальная составляющая модов очень важна и плавная графика без фризов повышает ее качество.
Поэтому код библиотеки, выполняющийся непосредственно во время рендера может делать максимум по 1 аллокации на 1 квад.
С другой стороны Endothermic не обделяет разработчиков абстракциями.


Использование
Прежде чем начинать, убедитесь, что вы вылезли из танка. Если вы все еще танке, прочтите туторы:
Добавление моделей блокам и предметам
Создание моделей при помощи кода

Подключение к проекту
Вы можете добавить Endothermic в ваш проект используя jitpack:
JitPack | Publish JVM and Android libraries

Также стоит указать зависимость в аннотации вашего мода:
@Mod(dependency=”required-after: Endothermic”)

Q: Добавлять «лишние» зависимости в проект? Нихачу!
A: Вы можете добавить исходники Endothermic непосредственно в проект, если ваш продукт распространяется под свободной лицензией. Например, я сделал так в Ender'sMagic

Библиотека делится на следующие пакеты:

quad
В нем вы найдете LazyUnpackedQuad - лениво распаковываемые квады.
Основной метод этих квадов — reconstruct, он позволяет обновить значения атрибутов вершин. Для неизменемого квада этот метод создает новый экземпляр, дли изменяемого — установит значения в текущий экземпляр.
immutableVersion:
LazyUnpackedQuad q1 = LazyUnpackedQuad.apply(quad);
BaseUnpackedQuad translated = q1.translate(0.1f, 0, 1);
BaseUnpackedQuad rotated = q1.rotate((float) Math.PI, 0, 1, 0);
//q1 != translated; q1 != rotated ; translated != rotated
return Lists.newArrayList(translated.toBakedQuad(), rotated.toBakedQuad());
mutableVersion:
hohserg.endothermic.quad.mutable.LazyUnpackedQuad q1 = hohserg.endothermic.quad.mutable.LazyUnpackedQuad.apply(quad);

BaseUnpackedQuad translated = q1.copy().translate(0.1f, 0, 1);//copy for save original version
// q1 != translated

BaseUnpackedQuad rotated = q1.rotate((float) Math.PI, 0, 1, 0);//no copy, no new instance creating
// q1 == rotated

return Lists.newArrayList(translated.toBakedQuad(), rotated.toBakedQuad());

Q: Я пишу на java и не могу юзать reconstruct из-за отсутствия в java аргументов по умолчанию. Что делать?
A: Специально для java-пользователей сделан reconstructBuilder — маленький запуленный билдер, который не вызывает новых аллокаций, если есть свободные билдеры в пуле.
По дефолту количество билдеров - 50. Если вы думаете, что вам этого мало(т.е. ваш код будет одновременно реконструировать более чем 50 квадов) вызовите во время инициализации вашего мода ReconstructBuilder.expandPool(<count>)
Не сохраняйте ссылки на reconstructBuilder!
Java:
return LazyUnpackedQuad.apply(quad)
                .reconstructBuilder()//no allocation
                .v1_x(0.5f)//updated x of first vertex
                .build()
                .toBakedQuad();
Scala:
LazyUnpackedQuad(v1)
      .reconstruct(v1_x = 0.5f)//updated x of first vertex
      .toBakedQuad

Также распаковываемые квады имеют вспомогательные методы, например, translate, rotate, scale, slice и др. Они все реализованы через reconstruct и благодаря этому имеют единственное определение.
Если делаете какую-то свою специфичную операцию, то рекомендуется делать ее на основе reconstruct или его производных, чтобы ваша операция была универсальна для изменяемых и неизменяемых LazyUnpackedQuad

format
Для пользователя в этом пакете интересны поля класса AttributeRepresentation.
Они используются для определения, с каким атрибутом, какой вершины вы работаете через линзы и билдеры

lense
Пакет содержит линзы для извлечения и установки значений атрибутов обычного запеченного квада. Удобно, когда вам нужно произвести с квадом совсем простую операцию и создавать LazyUnpackedQuad слишком жирно

builder
Содержит билдеры новых квадов с нуля

example
Содержит примеры юза библиотеки

Q: Что еще есть прикольного?
A: В либе есть TestingStand - блок позволяющий посмотреть, как разные бечмарки применяются к разным наборам квадов. Пока там жестко закодировано, но парочку простых бечмарков можно посмотреть, просто запустив игру с либой

Ссылки
Github: https://github.com/hohserg1/Endothermic
Curse: todo

Благодарности
Спасибо @Dahaka за то, что терпел мою страсть к ФП и продолжал обсуждать вопросы рендера и оптимизации
Спасибо @frobeniusfg за статью о аффинных преобразованиях, без нее бы не было нормального slice
Спасибо @Крокодил и команде Ender'sMagic, благодаря вам я начал и продолжаю делать руны для мода и это вылилось в необходимость сделать хороший инструмент для работы с моделями
Автор
hohserg1
Скачивания
2
Просмотры
615
Первый выпуск
Обновление
Оценка
5.00 звёзд 1 оценок

Другие ресурсы пользователя hohserg1

Последние рецензии

Тайны и секреты, а также незыблемость json моделей все больше подвергаются сомнению. астанавитес!1!
Сверху