3D модель( .obj) брони. Совместимость со Smart Moving

Версия Minecraft
1.7.10
222
5
28
Здравствуйте. Есть некая модель .obj, которая в точности повторяет структура стива(там отдельные ноги, руки, голова и т.д.). Мне нужно отобразить эту модельку на игроке в тот момент, когда он наденет в слот для нагрудника "специальный нагрудник". Естественно игроки должны видеть, что на нём появилась эта моделька. В подобном деле я полный ноль. Как начать? Что читать? Где можно посмотреть примеры подобного? Может ли кто из Вас предложить примеры или уже готовые решения для этого.
 

timaxa007

Модератор
5,831
409
672
Типа нужно искать в Render Player API код который отвечает за расположении и угол наклона частей модели игрока - это может изменение ванильной, а может быть какой-то отдельный класс, который как-бы заменяется на ванильный класс, и брать от туда нужные значения (т.е. искать определённые переменные).
Что-то более точнее сказать не смогу сейчас.
 
222
5
28
Народ, может есть кто работал с Player Render API и может подсказать как правильно с ним подружиться?

Я вот чё нашёл(официальный тема Player Render API, ответ разраба, гугл транслит):
eAO19kOuxYd1Em.png


Вот его мод со скрина TimTinkers/FractumArmor
В гите решения нет, но мне кажется у него совсем другая ситуация. У него модели .java.
 
Последнее редактирование:
1,976
68
220
Что .obj, что .java, всё в конце рисуется через OGL, так что не суть.
Собственно, на скрине всё описано. Замени в коде Тимахи ModelBiped на ModelPlayer, почини ошибки и всё должно быть супер.

Насчёт 4х вершин, @timaxa007, @Prototype, это, по всей видимости, зависит от видеокарты (поправьте, если ошибся), ибо моя спокойно жрёт нетриангулированные модельки.
 

timaxa007

Модератор
5,831
409
672
@AlexSocol, тут дело не видеокарте, а как отображать полигон: GL_TRIANGLES - по три вершины или GL_QUADS - по четыре вершины, так как и от этого зависит последовательное использование вершин для glBegin(...) (который заканчивает на glEnd()).
 
222
5
28
Что .obj, что .java, всё в конце рисуется через OGL, так что не суть.
Собственно, на скрине всё описано. Замени в коде Тимахи ModelBiped на ModelPlayer, почини ошибки и всё должно быть супер.

Насчёт 4х вершин, @timaxa007, @Prototype, это, по всей видимости, зависит от видеокарты (поправьте, если ошибся), ибо моя спокойно жрёт нетриангулированные модельки.
Я уже пытался делать это с ним - вообще ничего не изменилось, так как по сути этот класс без остального из себя ничего не представляет:
Java:
package api.player.model;

import net.minecraft.client.model.ModelBiped;

public class ModelPlayer
  extends ModelBiped
{
  public ModelPlayer()
  {
    this(0.0F);
  }

  public ModelPlayer(float paramFloat)
  {
    this(paramFloat, 0.0F, 64, 32);
  }

  public ModelPlayer(float paramFloat1, float paramFloat2, int paramInt1, int paramInt2)
  {
    super(paramFloat1, paramFloat2, paramInt1, paramInt2);
  }
}

В этом моде есть 2 API:
- Model Player API
- Render Player API

На столько я смог разобрать из этой каши, мой мод должен напоминать это:

Java:
public class mod_MyModName extends BaseMod {
    public void ModsLoaded() {
        RenderPlayerAPI.register("MyModId", MyModRenderPlayerBase.class);
        ModelPlayerAPI.register("MyModId", MyModModelPlayerBase.class);
    }
}

public class MyModRenderPlayerBase extends RenderPlayerBase {
 
    public MyModRenderPlayerBase(RenderPlayerAPI renderPlayerAPI) {
        super(renderPlayerAPI);
    }
 
    // one of my hook functions
    public void renderPlayer(EntityPlayer entityplayer, double d, double d1, double d2, float f, float f2) {
        if(myModIsActive) {
            // my code
        } else {
            super.renderPlayer(entityplayer, d, d1, d2, f, f2);
        }
    }
 
    // another of my hook functions
    public void loadTexture(String s) {
            if(myModIsActive) {
            // my code
            if(callLoadTextureOfRenderPlayer) {
                renderPlayer.localLoadTexture(s);
            } else if(callLoadTextureOfRenderLiving) {
                renderPlayer.superLoadTexture(s);
            }
            // my code
            if(ownTextureToLoad != null)
                super.loadTexture(ownTextureToLoad);
            else if(dontLoadTexture) {
                // my code
                return;
            } else {
                super.setRotationAngles(s);
            }            
        }
    }
}

public class MyModModelPlayerBase extends ModelPlayerBase {

        public MyModModelPlayerBase(ModelPlayerAPI modelplayerapi) {
            super(modelplayerapi);
        }
     
        // one of my hook functions
        public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {
            if(myModIsActive) {
                // my code
            } else {
                super.render(entity, f, f1, f2, f3, f4, f5);
            }
        }
     
        // another of my hook functions
        public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5) {
            if(myModIsActive) {
                // my code
                if(callSetRotationAnglesOfModelPlayer) {
                    modelPlayer.localSetRotationAngles(f, f1, f2, f3, f4, f5);
                } else if(callSetRotationAnglesOfModelBeped) {
                    modelPlayer.superSetRotationAngles(f, f1, f2, f3, f4, f5);
                    // my code
                }
             
                if(hideHead) {
                    modelPlayer.bipedHead.isHidden = true;
                } else if(mirrorBody) {
                    modelPlayer.bipedBody.mirror = true;
                    // my code
                } else {
                    super.setRotationAngles(f, f1, f2, f3, f4, f5);
                }
            }
        }
}

Так же я нашёл вот такие методы в PlayerRenderBase (тот класс от которого надо наследоваться):
Java:
import api.player.render.RenderPlayerAPI;
import api.player.render.RenderPlayerBase;
import net.minecraft.client.entity.AbstractClientPlayer;

public class RenderPlayerBaseCA extends RenderPlayerBase {

    public RenderPlayerBaseCA(RenderPlayerAPI renderPlayerAPI) {
        super(renderPlayerAPI);
    }

    @Override
    public void beforeSetArmorModel(AbstractClientPlayer abstractClientPlayer, int i, float v) {
        super.beforeSetArmorModel(abstractClientPlayer, i, v);
    }

    @Override
    public int setArmorModel(AbstractClientPlayer abstractClientPlayer, int i, float v) {
        return super.setArmorModel(abstractClientPlayer, i, v);
    }

    @Override
    public void afterSetArmorModel(AbstractClientPlayer abstractClientPlayer, int i, float v) {
        super.afterSetArmorModel(abstractClientPlayer, i, v);
    }

    @Override
    public void beforeSetPassArmorModel(AbstractClientPlayer abstractClientPlayer, int i, float v) {
        super.beforeSetPassArmorModel(abstractClientPlayer, i, v);
    }

    @Override
    public void setPassArmorModel(AbstractClientPlayer abstractClientPlayer, int i, float v) {
        super.setPassArmorModel(abstractClientPlayer, i, v);
    }

    @Override
    public void afterSetPassArmorModel(AbstractClientPlayer abstractClientPlayer, int i, float v) {
        super.afterSetPassArmorModel(abstractClientPlayer, i, v);
    }
}

Тут уже явная связка с бронёй, но я не могу понять как её правильно использовать и вообще это то что мне надо или нет.


-----
К примеру в GalacticcraftCore в классе ```micdoodle8.mods.galacticraft.core.client.render.entities.RenderPlayerBaseGC``` есть явное переопределение метода ```renderModel``` , где я увидел кое что знакомое нам всем в классе предмета тык
Кому интересно вот полный класс.

Короче пока что я всё равно не догоняю.
 
Последнее редактирование:

timaxa007

Модератор
5,831
409
672
@AlexSocol, что-то конкретно сказать не смогу почему так.
И когда я говорил про обработку полигона (треугольный или квадратный) я имел виду не про обработку на видеокарту, а то что OBJ Loader обрабатывает так информацию из obj для создании как-бы в геометрию.
objloader.jpg
 
222
5
28
@Agravaine я тут в одной теме увидел, что вы советовали использовать PlayerRenderAPI для решения одной задачи. Я подумал, что вы умеете работать с этим API и хотел бы спросить могли бы вы ознакомиться с данной темой и подсказать решение, если конечно разбираетесь с PlayerRenderAPI.
 

CumingSoon

Местный стендапер
1,634
12
269
Тогда резонный вопрос, почему на одном компе оно рендерится нормально, а стоит просто перенести на другой - крашит?
Драйвера разные. Кто-то поддерживает Deprecated QUADS, кто-то нет.
 
222
5
28
Убрал super render - ничего не изменилось.
Вот классы, по которым делал то, что показал на видео:
Мод: ModularPowersuits-1.7.10-0.11.1.113

1. Базовый класс брони этого мода - [Java] ItemPowerArmor - Pastebin.com
Все данные в этом моде хранятся в nbt тегах, я от этого решил отказаться, ибо мне такое просто не нужно для моей задачи.
2. Интерфейс - [Java] IArmorModel - Pastebin.com
3. Класс получения модели - [Java] ArmorModelInstance - Pastebin.com
4. Вариант со SM - [Java] SMovingArmorModel - Pastebin.com
5. Без - [Java] VanillaArmorModel - Pastebin.com
6. RenderPart - [Java] RenderPart - Pastebin.com
 
222
5
28
Проблема была здесь:

Java:
    clearAndAddChildWithInitialOffsets(this.field_78116_c, 0.0F, 0.0F, 0.0F);
    clearAndAddChildWithInitialOffsets(this.field_78115_e, 0.0F, 0.0F, 0.0F);
    clearAndAddChildWithInitialOffsets(this.field_78112_f, 5.0F, 2.0F, 0.0F);
    clearAndAddChildWithInitialOffsets(this.field_78113_g, -5.0F, 2.0F, 0.0F);
    clearAndAddChildWithInitialOffsets(this.field_78123_h, 2.0F, 12.0F, 0.0F);
    clearAndAddChildWithInitialOffsets(this.field_78124_i, -2.0F, 12.0F, 0.0F);

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