VertexData как закинуть туда что-то?

Версия Minecraft
1.12.2
476
9
39
Так как отрисовка чем-либо кроме buffer.addVertexData(data) заканчивается проблемами да и удобнее он, нежели вручную всё это делать, в результате появился этот вопрос.
Так как VertexData это массив интов, он не может хранить float/doble, а между тем u/v во float'е.
Соответственно вопрос как сконвертировать свои координаты x,y,z и u,v в int'овый формат?
 
Решение
В методе Tessellator#addVertex описана спецификация формата, в коде.
Конвертировать флоат в инт - Float#floatToRawIntBits.
Могу кинуть скрин с 1.6.4, думаю, формат данных почти не изменился - подкорректируешь сам, если что.
N44cXR.jpg

Одна вершина - 32 байта, сначала 12 байт позиции, потом 8 байт uv, и оставшееся на координаты лайтмапы, цвет и нормаль, если та используется.
476
9
39
https://minecraft.curseforge.com/projects/chameleon Мод вот он, там же и исходники можно найти.

В ваниле без хаков это можно сделать этим модом, как я понял. Там глянь он пишет какие моды его используют можешь их с помощью BON'a деобфусцировать и fernflower'ом декомпильнуть.

А вот в ваниле с хаками нужна хуклиба GloomyFolken'a. И там чутка подменить код надо.
Модель чтобы сделать нужно создать класс пронаследовав от IBakedModel.
Этот класс и будет модель. Строится она по методу List<BakedQuad> getQuads.
В частности по VertexData... (В классе BakedQuad метод int[] getVertexData)
Который возвращает 28 значений, где первые три это коориднаты, x,y,z, далее цвет, потом u,v текстурки и лайтмап(карта цветов?), потом снова. Т.е он возвращает на один BakedQuad координаты и характеристики одного квадрата или куба.
Вот я и сижу думаю как научиться её использовать.
Можно без хуклибы сделать, но там опять же с той либой идёт использованией getVertexData.
Т.е модель строится нестандартно, а именно по VertexData.
Спрайты(иконки, текстуры) же можно задать так создаёшь экземпляр BakedQuad и в параметрах указываешь текстурку типа TextureAtlasSprite. Его можно попробовать получить через ResourceLocation.
Потом все BakedQuad передаёшь в метод getQuads у своей модели. Он строит по ним.

Позже, как со всем разберусь, надеюсь смогу написать гайд/руководство/либу.
 
476
9
39
CoomingSoon написал(а):
Эм, записать в буфер флотов, а потом сконвертировать в инты? Я тебя так понял?
Если да, то запиши в буфер и вызови asIntBuffer(или что-то типа того)

В vertexData валяется непонятная ересь, т.е например обычный 1 там представлен как 141251251.
Так вот как мне туда сконвертировать вот в чём вопрос, чтобы имея int [] customVertexData я мог заносить свои координаты, менять цвет/лайтмап.
Сам же vertexData это массив int'ов т.е int[28].
Мне нужно например поменять u,v.
Мой 0.512512, но там лежит вообще интовое значение?! И метод addVertexData(int[] vertexData) принимает только инты. Т.е я не могу пропихнуть флоат туда.
Кажись нашёл что-то
int i = this.vertexCount * this.vertexFormat.getNextOffset() + this.vertexFormat.getOffset(this.vertexFormatIndex);
this.byteBuffer.putFloat(i, (float)(x + this.xOffset));
 
1,990
18
105
В методе Tessellator#addVertex описана спецификация формата, в коде.
Конвертировать флоат в инт - Float#floatToRawIntBits.
Могу кинуть скрин с 1.6.4, думаю, формат данных почти не изменился - подкорректируешь сам, если что.
N44cXR.jpg

Одна вершина - 32 байта, сначала 12 байт позиции, потом 8 байт uv, и оставшееся на координаты лайтмапы, цвет и нормаль, если та используется.
 
10
0
Oldestkon написал(а):
В методе Tessellator#addVertex описана спецификация формата, в коде.
Конвертировать флоат в инт - Float#floatToRawIntBits.
Могу кинуть скрин с 1.6.4, думаю, формат данных почти не изменился - подкорректируешь сам, если что.
N44cXR.jpg

Одна вершина - 32 байта, сначала 12 байт позиции, потом 8 байт uv, и оставшееся на координаты лайтмапы, цвет и нормаль, если та используется.

У меня тут возник вопрос, который стоит, наверно, в отдельную тему вынести, но вдруг я тут получу ответ. Если я захочу достать эти данные (вертекс, нормаль и т.п.) в шейдерах, можно их как то получить без хуков в тесселятор?
 
Сверху