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 работает хорошо?
 
посвятите непосвященного, почему бы не забрать майновский загрузчик с 1.7?

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

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

Запекаю модель:
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
 
С текстурой и я в свое время бился. В итоге все дело оказалось в том, что 3ds max делает какую то не такую матлибу, которая не нравится форджу и он с ней не дружит. В итоге мне сказали, что в блендере все работает, но проверять, качать спецом для этого блендер было лень и я забил. Так что если делаешь в максе, то лучше делай в блендере
 
Так что если делаешь в максе, то лучше делай в блендере
Собственно в Блендере и делаю, результат тот же. И еще, не могу понять, работают ли списки GL11.glCallList с этим новым рендером, чет как-то не особо выходит.
 
нет, с этим форджевским загрузчиком там немного не так работает, там через json все.
Посмотри пример тут

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

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

Где-то вроде видел уже вырезанный отдельный загрузчик, не могу вспомнить только где.
 
loadModelData() {...}
 
Взял форджевский, тебе вроде только вот это надо отредачить в классе 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
 
BufferBuilder bufBuilder = tessellator.getBuffer();
Может здесь есть? Я за 1.12 не сильно шарю, только знаю что там вот этот билдер добавили. Мэ бы посмотреть на фул код обоих этих классов Тесса и буффербилдера, мб да чо подскажу
 
аналоги посмотри
 
нормали не нужны, если ты строишь полигон: против часовой стрелки - нормаль определяется наружу, по часовой - вовнутрь. Если вы работает например с блендером, он всегда предоставляет полигоны в нужном направлении, что исключает необходимость вектора нормали
 
OpenGL не требует их. Скорее всего он строит её сам в случае её отсутствия. Это не сложное вычисление. Полигон есть плоскость, а нормаль плоскости можно найти по трём точкам, что мы обычно и указываем. А если там их 4е или пять, то использоваться будут всё равно только первые три. Но это всё к теме не относится конечно.
 
Назад
Сверху