Mipmap

Версия Minecraft
1.12+
4,045
63
645
Как можно достать mipmap из текстуры предмета, а именно её цвет?
Цель: мне нужно рендерить кое-чего на основе усреднённого цвета текстуры предмета. Знаю, что в 4-й mipmap-е текстуры уже "размыты" и представляют из себя один пиксель (ну, это, конечно, при условии, что основные текстуры 16х16).
Вот я и подумал, что проще достать цвет уже готового "усреднённого" пикселя, чем складывать все пиксели обычной текстуры.
...
И следом второй вопрос, касающийся той же самой темы...
Рендерить мне придётся предмет. И загвоздка в том, что я не очень понимаю, где именно хранить полученный цвет?
По идее, не на сервере, ибо у разных игроков могут быть разные текстурпаки... Но ведь сами айтемстаки хранятся как раз таки на сервере. И, например, цвет окрашенной брони, так же записывается в НБТ на сервер...
Но моя задача получить именно усреднённый цвет текстуры... А уж текстур точно на сервере нет...
Вот вам и задачка...
...
Задумался о том, что можно хранить в айтемстаке не сам цвет, а предмет, из которого нужно получить цвет.
С одной стороны, это решает проблему, а с другой - заставляет каждый кадр доставать текстуру и вычислять необходимый цвет, что не очень-то рационально...
...
Может, у кого-нибудь есть идеи по этому поводу?
 

Icosider

Kotliner
Администратор
3,603
99
664
Liahim написал(а):
И, например, цвет окрашенной брони, так же записывается в НБТ на сервер...
Потому что броня это итем, все нбт данные в майне синхронятся с клиентом, а дальше клиент часть просто биндит нужную текстуру по нбт тегу.
 
4,045
63
645
Я понимаю... Но мне-то что делать? У меня нет готовой нужной текстуры, мне её надо делать из текстуры выбранного айтема... Или мне хранить у каждого на клиенте список: айтем - его цвет и дополнять его при необходимости?
...
Ну, это мысля...
А на счёт mipmap-ы кто-нибудь знает?
 
2,505
81
397
Ivasik написал(а):
а дальше клиент часть просто биндит нужную текстуру по нбт тегу.
Лол, что? Для всех итемов есть атлас. Тоже самое для блоков.


Ты вообще уверен, что для предметов создаются мипмаппинги?
 
4,045
63
645
Где-то краем глаза встречал такие файлики...
...
Ладно, подумал, что стоит сделать так:
при загрузке игры просто пробежаться по всем нужным айтемам, "отмипмапить" их текстуры, и создать для клиента список айтемстак - цвет...
...
В деталях пока не разбирался...
Но сразу есть вопрос, в какой момент это лучше делать? Есть ли какой-нибудь эвент, срабатывающий, в финале загрузки предметов?
И как можно получить список не предметов, как таковых, а именно всех зарегистрированных метадат предметов? Так как у всех рыб, например, предмет один, а текстуры у всех разные.
Ну, вы меня поняли )))
 
2,505
81
397
В 1.7.10 есть ивент onTextureStitchEventPost.
Зачем итемстаков, если можно просто итемов.
Для блоков у меня, например, просто массив интов (цветов) 4096*16. Для итемов нужно подумать.
 
4,045
63
645
По вышеописанной причине...
Пример - та же рыба... Айтем у неё один, но у нулевой меты средний цвет будет синим (обычная рыба), а у иной, например у иглобрюха, средний цвет - жёлтый... Поэтому ни массивом не получится, ни обойтись предметами тоже не получится.
 
3,005
192
592
Liahim написал(а):
Где-то краем глаза встречал такие файлики...
...
Ладно, подумал, что стоит сделать так:
при загрузке игры просто пробежаться по всем нужным айтемам, "отмипмапить" их текстуры, и создать для клиента список айтемстак - цвет...
...
В деталях пока не разбирался...
Но сразу есть вопрос, в какой момент это лучше делать? Есть ли какой-нибудь эвент, срабатывающий, в финале загрузки предметов?
И как можно получить список не предметов, как таковых, а именно всех зарегистрированных метадат предметов? Так как у всех рыб, например, предмет один, а текстуры у всех разные.
Ну, вы меня поняли )))

Могу подсказать это - в гуи эвент чекаю майн меню, и сделай булеан. После,цпервокииззагрузки меняет булеан, нчп
 
3,005
192
592
Liahim написал(а):
Есть ли какой-нибудь эвент, срабатывающий, в финале загрузки предметов?

Эвента, который сработает после загрузки предметов - вроде нету. (или я хз)
Есть OpenGuiEvent.
Тебе нужно 1 раз загрузить текстуры для предметов.
Значит делаешь, например boolean, его false.
После в эвенте проверяешь, что boolean false.
После делаешь текстуры для предметов.
Делаешь boolean true.
~~~
В итоге получаешь то, что тебе нужно, а конкретно - у тебя есть текстуры для рендера предметов.
 
2,505
81
397
Список - это слишком долгий поиск. А стаки - дорого. Я бы, наверное, хранил мапу <Integer, Integer>. Значение - цвет, ключ - первые 4 байта id итема, вторые 4 байта мета.


Еще можно немного схитрить. Во-первых, я нигде не видел, чтобы мета > 16 влияла на текстуру итема. Поэтому можно генерить цвет только для этих 16-и значений, а для остальных использовать цвет, как для нулевой. Во-вторых, можно найти максимальный айди итема. Таким образом можно зарезервировать массив интов размерностью maxId * 16.


И для чего тебе вообще цвета итемов, если не секрет?
 
4,045
63
645
Буду смешивать )))
На счёт мапы, да, хитро... Наверное, так будет гораздо удобнее )
...
Вот почитал тебя, и захотелось исходники не гит выложить, что б ты в них порылся и что-нибудь пооптимизировал )))
Глядишь, и мод быстрее работать будет )
 
4,045
63
645
Список - это слишком долгий поиск. А стаки - дорого. Я бы, наверное, хранил мапу <Integer, Integer>. Значение - цвет, ключ - первые 4 байта id итема, вторые 4 байта мета.
@Dahaka help!
Делаю всё по твоему совету... Создаю мапу, ключ беру из айди и меты следующим образом:
Item.getIdFromItem(item) << 16 | meta;
Мапу создаю в пост ините, где, вроде как, уже всё должно быть зарегистрировано...
Но! Это работает только для ванильных предметов!
У моих айди в постините и потом во время проверки в игре РАЗНЫЙ!
Эт как! Он у кастомных предметов плавающий что ли?
Как лучше поступить? Может тогда строчку ресурс локейшена в качестве ключа использовать? Что думаешь?
 
Сверху