Наследованный ModelRenderer

56
2
4
Недавно задавал вопрос, о том, как сделать собственную фигуру при помощи BufferBuilder. Мне хоть и предлагали готовые решения, мне они всё равно не помогли. Не люблю чужой код. Вообщем, над проблемой я много работал. И не зря, результат есть. Forge рисуют треугольники как простой четырехугольник, у которого 3 вершины расположены на одной прямой. Но вопрос не в том.
Известно, что можно добавлять слои к частям тела игрока
Minecraft.getMinecraft().getRenderManager().getSkinMap().get("slim").getMainModel().bipedRightArm.addChild(ModelRenderer model); //добавляет ведущей руке какую-то модель
Так вот, я решил расширить ModelRenderer, использовав мой класс, наследованный, собственно, от выше указанного:
Java:
public class newModelRenderer extends ModelRenderer {
    private boolean compiled=false;
    public int textureOffsetX,textureOffsetY;
    public ModelBase baseModel;
    public List<ModelBox> paralList=new ArrayList<>();
    private int displayList;

    public newModelRenderer(ModelBase model, String boxNameIn) {
        super(model, boxNameIn);
        this.baseModel=model;
    }

    public newModelRenderer(ModelBase model) {
        super(model);
        this.baseModel=model;
    }

    public newModelRenderer(ModelBase model, int texOffX, int texOffY) {
        super(model, texOffX, texOffY);
        this.textureOffsetX=texOffX;
        this.textureOffsetY=texOffY;
        this.baseModel=model;
    }
    public newModelRenderer addParal(String partName, float offX, float offY, float offZ, int width, int height, int depth,float deg)
    {
        TextureOffset textureoffset = this.baseModel.getTextureOffset(partName);
        this.setTextureOffset(textureoffset.textureOffsetX, textureoffset.textureOffsetY);
        this.paralList.add((new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, 0.0F)).setBoxName(partName));
        return this;
    }

    public newModelRenderer addParal(float offX, float offY, float offZ, int width, int height, int depth, float deg)
    {
        this.paralList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, 0.0F));
        return this;
    }

    public newModelRenderer addParal(float offX, float offY, float offZ, int width, int height, int depth, float deg, boolean mirrored)
    {
        this.paralList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, 0.0F, mirrored));
        return this;
    }


    public void addParal(float offX, float offY, float offZ, int width, int height, int depth, float deg, float scaleFactor)
    {
        this.paralList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, scaleFactor));
    }
    @Override
    @SideOnly(Side.CLIENT)
    public void render(float scale)
    {
        super.render(scale);
        if (!super.isHidden) {
            if (super.showModel) {
                if (!this.compiled) {
                    this.compileDisplayList(scale);
                }
                GlStateManager.translate(this.offsetX, this.offsetY, this.offsetZ);
            }
        }
    }
    @Override
    @SideOnly(Side.CLIENT)
    public void renderWithRotation(float scale)
    {
        super.renderWithRotation(scale);
        if (!super.isHidden) {
            if (super.showModel) {
                if (!this.compiled) {
                    this.compileDisplayList(scale);
                }
                GlStateManager.pushMatrix();
                GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale);

                if (this.rotateAngleY != 0.0F)
                {
                    GlStateManager.rotate(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
                }

                if (this.rotateAngleX != 0.0F)
                {
                    GlStateManager.rotate(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
                }

                if (this.rotateAngleZ != 0.0F)
                {
                    GlStateManager.rotate(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
                }

                GlStateManager.callList(this.displayList);
                GlStateManager.popMatrix();
            }
        }
    }
    @Override
    @SideOnly(Side.CLIENT)
    public void postRender(float scale){
        super.postRender(scale);
        if (!super.isHidden) {
            if (super.showModel) {
                if (!this.compiled) {
                    this.compileDisplayList(scale);
                }
                if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F)
                {
                    if (this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F)
                    {
                        GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale);
                    }
                }
                else
                {
                    GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale);

                    if (this.rotateAngleZ != 0.0F)
                    {
                        GlStateManager.rotate(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
                    }

                    if (this.rotateAngleY != 0.0F)
                    {
                        GlStateManager.rotate(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
                    }

                    if (this.rotateAngleX != 0.0F)
                    {
                        GlStateManager.rotate(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
                    }
                }
            }
        }
    }
    private void compileDisplayList(Float scale){
        this.displayList = GLAllocation.generateDisplayLists(1);
        GlStateManager.glNewList(this.displayList, 4864);
        BufferBuilder bufferbuilder = Tessellator.getInstance().getBuffer();
        for (int i = 0; i < this.paralList.size(); ++i)
        {
            ((ModelBox)this.paralList.get(i)).render(bufferbuilder, scale);
        }
        GlStateManager.glEndList();
        this.compiled = true;
    }
    @Override
    public void setRotationPoint(float rotationPointXIn, float rotationPointYIn, float rotationPointZIn)
    {
        super.setRotationPoint(rotationPointXIn,rotationPointYIn,rotationPointZIn);
        this.rotationPointX = rotationPointXIn;
        this.rotationPointY = rotationPointYIn;
        this.rotationPointZ = rotationPointZIn;
    }
Да, для тестирования пока использовал простые кубы, а не объемный параллелограмм, с целью удобства работы. Так вот, в итоге ничего не прорисовывается :(. Вот, кстати, сама модель, которую рисую на игроке:
public newModelRenderer arm=new newModelRenderer(this).addParal(5F,5F,5F,5,5,5,35F); //выполняю в стандартном классе, наследованном от ModelBase
Я не показываю свою необразованность и стремление показать то, как, не имея знаний в движке DirectX, пытаюсь его использовать. Это финальный шаг подготовительного этапа к разработке, не хочу потом над рендером больше работать
 
Последнее редактирование:
56
2
4
Не знаю, прав я, или нет (опыта то нет у бестолкового :)), при рендере моей newModelRenderer внутри класса renderPlayer, выполняется render() из ModelRender, или из моего newModelRenderer?
P.S. Провёл опыт, да, передаётся из newModelRenderer
 
Последнее редактирование:
1,038
57
229

tox1cozZ

aka Agravaine
8,455
598
2,892
Ты создаешь уже какой раз тему, но вопрос вообще какой-то неадекватный.
Что ты хочешь сделать вообще? Зачем тебе ModelRenderer?
Нужна модель - сделай в блендере и загрузи в игру, есть как стандартные форджевские инструменты для этого, так так гугл кишит туториалами.
В данный момент ты мутишь какую-то дичь непонятно вообще зачем. У тебя не получится ничего сделать пока ты не выучишь хотя бы основы OpenGL, как это устроено и как должно работать.
 
56
2
4
Ты создаешь уже какой раз тему, но вопрос вообще какой-то неадекватный.
Что ты хочешь сделать вообще? Зачем тебе ModelRenderer?
Нужна модель - сделай в блендере и загрузи в игру, есть как стандартные форджевские инструменты для этого, так так гугл кишит туториалами.
В данный момент ты мутишь какую-то дичь непонятно вообще зачем.
Я ищу ответ непосредственно в библиотеках, про туториалы забыл
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Каких библиотеках? Ты тупо пытаешься скопипастить что-то и абсолютно не понимаешь что же ты делаешь.
Я абсолютно не понимаю удовольствия тыкать пальцем в небо когда вообще не понимаешь предметную область.
 
1,038
57
229
Да пускай возиться, это неплохо, все через это проходили. Вот когда пытливый ум зайдет в тупик, полезет на уроки nehe и поймет как же много там того, что ему пришлось изучать полгода, а мог понять за несколько дней.
Ну и до конца недели напишу тутор под 1.14. В том числе добавлю туда раздел по OpenGL как на мк.су был, где разжовывал каждую запчасть. Щас занят сильно..
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Сверху