OBJ на 1.12 (Рендер)

Версия Minecraft
1.12.2
355
2
17
Добро, помогите войти в курс дела как обстоят дела с Obj на 1.12+

Необходимо подгрузить напрямую OBJ (Без дополнительных json файлов) и отрисовать в списке GLList.
Попробовал подгружать так:

Java:
IModel model = OBJLoader.INSTANCE.loadModel(
new ResourceLocation(modelPath));

А отрисовал в листе так (нашел тут на форуме)

Java:
GL11.glNewList(indexRenderer, GL11.GL_COMPILE);

Function<ResourceLocation, TextureAtlasSprite> spriteFunction = location -> Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(location.toString());
model.bake(new OBJModel.OBJState(ImmutableList.of("base"), false), DefaultVertexFormats.ITEM, spriteFunction);

GL11.glEndList();

Соответственно ничего не сработало, возможно проблема еще крылась где-то в парсинге, ибо вывело в консоль:

OBJLoader.Parser: command 's' (model: 'default/default.obj') is not currently supported, skipping. Line: 52 's 1'

Как собственно отрисовать то, что на 1.7.10 работает хорошо?
 
355
2
17
посвятите непосвященного, почему бы не забрать майновский загрузчик с 1.7?

Это по сути форжовский загрузчик, не я же форжом занимаюсь, они решили обновить его под стандарты новых версий, а как теперь по простому загрузить и отрисовать - интересно.
 
355
2
17
а разве нельзя просто скопипастить его себе (со старых версий разумеется), и отрисовывать как раньше?
Не думаю что годный вариант, зачем тащить старые отрасли и скручивать, когда уже все реализовано.

Получилось отрисовать модельку, но текстура отсутствует.

Запекаю модель:
bakedModel = model.bake(TRSRTransformation.identity(), DefaultVertexFormats.ITEM, ModelLoader.defaultTextureGetter());

Рисую.
Java:
        Tessellator tessellator = Tessellator.getInstance();
        BufferBuilder worldRenderer = tessellator.getBuffer();
        worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.ITEM);

        for (BakedQuad bakedquad : model.getQuads(null, null, 0))
        {
            worldRenderer.addVertexData(bakedquad.getVertexData());
        }

        tessellator.draw();

Пробовал вначале биндить текстуру, тщетно.
mc.getTextureManager().bindTexture(item.getTexture());

1580675329102.png
 
5,018
47
783
С текстурой и я в свое время бился. В итоге все дело оказалось в том, что 3ds max делает какую то не такую матлибу, которая не нравится форджу и он с ней не дружит. В итоге мне сказали, что в блендере все работает, но проверять, качать спецом для этого блендер было лень и я забил. Так что если делаешь в максе, то лучше делай в блендере
 
355
2
17
Так что если делаешь в максе, то лучше делай в блендере
Собственно в Блендере и делаю, результат тот же. И еще, не могу понять, работают ли списки GL11.glCallList с этим новым рендером, чет как-то не особо выходит.
 
5,018
47
783
нет, с этим форджевским загрузчиком там немного не так работает, там через json все.
Посмотри пример тут

или ты не блок рендеришь, а просто в интерфейсе?
 
355
2
17
Ну это принцип а-ля зарегистрировать новую модель для блока, мне это совершенно не подходит.
Мне нужен старый принцип спарсить .obj по указанному адресу, сохранить в переменную и по нужде отрендерить в инвентаре или же на игроке.

UPD:
Также важно иметь тот факт, что модель может быть одна а бинды текстур разные, из-за чего собственно не выйдет править mtl файл
 
Последнее редактирование:
1,173
28
168
Не думаю что годный вариант, зачем тащить старые отрасли и скручивать, когда уже все реализовано
Реализовано неудобно, имхо. Почему нет? Не считаю там что то старым, вполне годная вещь. Плюс есть поддержка дисплей листов, что несомненно радует. Попробуй
 
355
2
17
Попробовал, слишком много зависимостей тащит за собой, плюс в новых версиях переписанный Тесселятор и еще ряд вещей, которые использует старый загрузчик.

Где-то вроде видел уже вырезанный отдельный загрузчик, не могу вспомнить только где.
 
1,038
57
229
loadModelData() {...}
 
1,173
28
168
Взял форджевский, тебе вроде только вот это надо отредачить в классе Face

Java:
@SideOnly(Side.CLIENT)
    public void addFaceForRender(Tessellator tessellator, float textureOffset)
    {
        if (faceNormal == null)
        {
            faceNormal = this.calculateFaceNormal();
        }

        tessellator.setNormal(faceNormal.x, faceNormal.y, faceNormal.z);

        float averageU = 0F;
        float averageV = 0F;

        if ((textureCoordinates != null) && (textureCoordinates.length > 0))
        {
            for (int i = 0; i < textureCoordinates.length; ++i)
            {
                averageU += textureCoordinates[i].u;
                averageV += textureCoordinates[i].v;
            }

            averageU = averageU / textureCoordinates.length;
            averageV = averageV / textureCoordinates.length;
        }

        float offsetU, offsetV;

        for (int i = 0; i < vertices.length; ++i)
        {

            if ((textureCoordinates != null) && (textureCoordinates.length > 0))
            {
                offsetU = textureOffset;
                offsetV = textureOffset;

                if (textureCoordinates[i].u > averageU)
                {
                    offsetU = -offsetU;
                }
                if (textureCoordinates[i].v > averageV)
                {
                    offsetV = -offsetV;
                }

                tessellator.addVertexWithUV(vertices[i].x, vertices[i].y, vertices[i].z, textureCoordinates[i].u + offsetU, textureCoordinates[i].v + offsetV);
            }
            else
            {
                tessellator.addVertex(vertices[i].x, vertices[i].y, vertices[i].z);
            }
        }
    }
И в GroupObject

Java:
@SideOnly(Side.CLIENT)
    public void render()
    {
        if (faces.size() > 0)
        {
            Tessellator tessellator = Tessellator.instance;
            tessellator.startDrawing(glDrawingMode);
            render(tessellator);
            tessellator.draw();
        }
    }
Тут кода исправить под 1.12 не составит труда
Не думаю что там еще что-то надо изменять :/

по больше степени проблема с отрисовкой, там она реализована
Класс Mesh
 
1,173
28
168
BufferBuilder bufBuilder = tessellator.getBuffer();
Может здесь есть? Я за 1.12 не сильно шарю, только знаю что там вот этот билдер добавили. Мэ бы посмотреть на фул код обоих этих классов Тесса и буффербилдера, мб да чо подскажу
 
1,038
57
229
нормали не нужны, если ты строишь полигон: против часовой стрелки - нормаль определяется наружу, по часовой - вовнутрь. Если вы работает например с блендером, он всегда предоставляет полигоны в нужном направлении, что исключает необходимость вектора нормали
 
1,038
57
229
OpenGL не требует их. Скорее всего он строит её сам в случае её отсутствия. Это не сложное вычисление. Полигон есть плоскость, а нормаль плоскости можно найти по трём точкам, что мы обычно и указываем. А если там их 4е или пять, то использоваться будут всё равно только первые три. Но это всё к теме не относится конечно.
 
Сверху