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

Сообщения
218
Лучшие ответы
2
Реакции
5
Версия Minecraft
1.12.2
Добро, помогите войти в курс дела как обстоят дела с 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 работает хорошо?
 
Сообщения
936
Лучшие ответы
18
Реакции
75
посвятите непосвященного, почему бы не забрать майновский загрузчик с 1.7?
 
Сообщения
218
Лучшие ответы
2
Реакции
5
посвятите непосвященного, почему бы не забрать майновский загрузчик с 1.7?
Это по сути форжовский загрузчик, не я же форжом занимаюсь, они решили обновить его под стандарты новых версий, а как теперь по простому загрузить и отрисовать - интересно.
 
Сообщения
936
Лучшие ответы
18
Реакции
75
а разве нельзя просто скопипастить его себе (со старых версий разумеется), и отрисовывать как раньше?
 
Сообщения
218
Лучшие ответы
2
Реакции
5
а разве нельзя просто скопипастить его себе (со старых версий разумеется), и отрисовывать как раньше?
Не думаю что годный вариант, зачем тащить старые отрасли и скручивать, когда уже все реализовано.

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

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

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

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

Где-то вроде видел уже вырезанный отдельный загрузчик, не могу вспомнить только где.
 
Сообщения
590
Лучшие ответы
25
Реакции
106
loadModelData() {...}
 
Сообщения
936
Лучшие ответы
18
Реакции
75
Взял форджевский, тебе вроде только вот это надо отредачить в классе 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
 
Сообщения
218
Лучшие ответы
2
Реакции
5
Вот вроде я на моменте тогда остановился
tessellator.setNormal(faceNormal.x, faceNormal.y, faceNormal.z);

В 1.12.2 они переписали тесселятор и куда дели эти нормали чет не совсем понял.
 
Сообщения
936
Лучшие ответы
18
Реакции
75
BufferBuilder bufBuilder = tessellator.getBuffer();
Может здесь есть? Я за 1.12 не сильно шарю, только знаю что там вот этот билдер добавили. Мэ бы посмотреть на фул код обоих этих классов Тесса и буффербилдера, мб да чо подскажу
 
Сообщения
4,784
Лучшие ответы
45
Реакции
646
аналоги посмотри
 
Сообщения
590
Лучшие ответы
25
Реакции
106
нормали не нужны, если ты строишь полигон: против часовой стрелки - нормаль определяется наружу, по часовой - вовнутрь. Если вы работает например с блендером, он всегда предоставляет полигоны в нужном направлении, что исключает необходимость вектора нормали
 
Сообщения
590
Лучшие ответы
25
Реакции
106
OpenGL не требует их. Скорее всего он строит её сам в случае её отсутствия. Это не сложное вычисление. Полигон есть плоскость, а нормаль плоскости можно найти по трём точкам, что мы обычно и указываем. А если там их 4е или пять, то использоваться будут всё равно только первые три. Но это всё к теме не относится конечно.
 
Сверху