- Версия(и) Minecraft
- 1.12.2
К вопросу актуальности
В последних версиях майнкрафта модели блоков и предметов состоят BakedQuad, запеченных квадов. Для обывателя это выглядит как какие-то массивы интов и вообще непонятно, как с ними работать.
Endothermic - графическая библиотека, сосредоточенная на работе с BakedQuad-ами, как раз решает эту проблему.
Примеры рендеров, сделанных с помощью Endothermic
Особенности и цели
Endothermic старается предоставить максимальную производительность, ведь визуальная составляющая модов очень важна и плавная графика без фризов повышает ее качество.
Поэтому код библиотеки, выполняющийся непосредственно во время рендера может делать максимум по 1 аллокации на 1 квад.
С другой стороны Endothermic не обделяет разработчиков абстракциями.
Использование
Прежде чем начинать, убедитесь, что вы вылезли из танка. Если вы все еще танке, прочтите туторы:
Добавление моделей блокам и предметам
Создание моделей при помощи кода
Подключение к проекту
Вы можете добавить Endothermic в ваш проект используя jitpack:
JitPack | Publish JVM and Android libraries
Также стоит указать зависимость в аннотации вашего мода:
Q: Добавлять «лишние» зависимости в проект? Нихачу!
A: Вы можете добавить исходники Endothermic непосредственно в проект, если ваш продукт распространяется под свободной лицензией. Например, я сделал так в Ender'sMagic
Библиотека делится на следующие пакеты:
quad
В нем вы найдете LazyUnpackedQuad - лениво распаковываемые квады.
Основной метод этих квадов — reconstruct, он позволяет обновить значения атрибутов вершин. Для неизменемого квада этот метод создает новый экземпляр, дли изменяемого — установит значения в текущий экземпляр.
Q: Я пишу на java и не могу юзать reconstruct из-за отсутствия в java аргументов по умолчанию. Что делать?
A: Специально для java-пользователей сделан reconstructBuilder — маленький запуленный билдер, который не вызывает новых аллокаций, если есть свободные билдеры в пуле.
По дефолту количество билдеров - 50. Если вы думаете, что вам этого мало(т.е. ваш код будет одновременно реконструировать более чем 50 квадов) вызовите во время инициализации вашего мода ReconstructBuilder.expandPool(<count>)
Не сохраняйте ссылки на reconstructBuilder!
Также распаковываемые квады имеют вспомогательные методы, например, translate, rotate, scale, slice и др. Они все реализованы через reconstruct и благодаря этому имеют единственное определение.
Если делаете какую-то свою специфичную операцию, то рекомендуется делать ее на основе reconstruct или его производных, чтобы ваша операция была универсальна для изменяемых и неизменяемых LazyUnpackedQuad
format
Для пользователя в этом пакете интересны поля класса AttributeRepresentation.
Они используются для определения, с каким атрибутом, какой вершины вы работаете через линзы и билдеры
lense
Пакет содержит линзы для извлечения и установки значений атрибутов обычного запеченного квада. Удобно, когда вам нужно произвести с квадом совсем простую операцию и создавать LazyUnpackedQuad слишком жирно
builder
Содержит билдеры новых квадов с нуля
example
Содержит примеры юза библиотеки
Q: Что еще есть прикольного?
A: В либе есть TestingStand - блок позволяющий посмотреть, как разные бечмарки применяются к разным наборам квадов. Пока там жестко закодировано, но парочку простых бечмарков можно посмотреть, просто запустив игру с либой
Ссылки
Github: GitHub - hohserg1/Endothermic: Library for minecraft forge for baked quad manipulating
Curse: todo
Благодарности
Спасибо @Dahaka за то, что терпел мою страсть к ФП и продолжал обсуждать вопросы рендера и оптимизации
Спасибо @frobeniusfg за статью о аффинных преобразованиях, без нее бы не было нормального slice
Спасибо @Крокодил и команде Ender'sMagic, благодаря вам я начал и продолжаю делать руны для мода и это вылилось в необходимость сделать хороший инструмент для работы с моделями
В последних версиях майнкрафта модели блоков и предметов состоят BakedQuad, запеченных квадов. Для обывателя это выглядит как какие-то массивы интов и вообще непонятно, как с ними работать.
Endothermic - графическая библиотека, сосредоточенная на работе с BakedQuad-ами, как раз решает эту проблему.
Примеры рендеров, сделанных с помощью Endothermic
Особенности и цели
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: GitHub - hohserg1/Endothermic: Library for minecraft forge for baked quad manipulating
Curse: todo
Благодарности
Спасибо @Dahaka за то, что терпел мою страсть к ФП и продолжал обсуждать вопросы рендера и оптимизации
Спасибо @frobeniusfg за статью о аффинных преобразованиях, без нее бы не было нормального slice
Спасибо @Крокодил и команде Ender'sMagic, благодаря вам я начал и продолжаю делать руны для мода и это вылилось в необходимость сделать хороший инструмент для работы с моделями