Рендер модели блока из руки на точке взгляда игрока

Версия Minecraft
1.7.10
API
Forge

VeniVidiVici

Санта Барбарис
327
15
198
Не могу сообразить, как отобразить модель блока на точке, куда смотрит игрок.
Пробовал сделать вот такой страшный самопал:
Event Handler:
@SubscribeEvent
public void onPlayerTick(LivingUpdateEvent event)
{
    if(event.entity.worldObj.isRemote)
    {
        EntityPlayer player;
        if(event.entity instanceof EntityPlayer)
            player = (EntityPlayer)event.entity;
        else
            return;
        if(player.getHeldItem() != null && player.getHeldItem().getItem() == Item.getItemFromBlock(ModBlocks.ourblock))
        {
            MovingObjectPosition mop = Minecraft.getMinecraft().objectMouseOver;
            if(mop.typeOfHit == MovingObjectType.BLOCK)
            {
                System.out.println("Вызов рендера");
                MyRenderer render = new MyRenderer();
                render.preRender(ModBlocks.ourblock, mop.blockX, mop.blockY + 1, mop.blockZ, (byte)0);
            }
            else
                System.out.println("Взгляд не попадает на блок");
        }
    }
}
И сам рендер в виде отдельного метода в основном классе MyRenderer (extends TileEntitySpecialRenderer):
MyRender:
public void preRender(Block block, double x, double y, double z, byte r) {
    GL11.glPushMatrix();
    GL11.glTranslated(x, y, z);
    GL11.glTranslatef(0.5F, 1.0F, 0.5F);
    GL11.glScalef(1.0F, 1.0F, 1.0F);
    GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
    GL11.glRotatef(90, 0.0F, -1.0F, 0.0F);
    if (r > 0)
        GL11.glRotatef(90*r, 0.0F, -1.0F, 0.0F);
    Minecraft.getMinecraft().getTextureManager().bindTexture(getAutoTexture(block));
    renderModel(block);
    GL11.glPopMatrix();
}

В итоге сообщения выводятся корректно, значит условие срабатывает, но ничего само собой не отображается. Я интуитивно понимаю, что как-то неправильно / не там / не тем методом пытаюсь отрисовать эту модель, но не могу сообразить как это делается правильно.

Примечание: методы renderModel(block) и getAutoTexture(block) содержат только GL методы и указание путей, они рабочие, используются в самом рендере этого блока (обычном). Т.е. блок отображается при установке в мире с нужной моделью корректно.

На форуме ничего не нашёл конкретно по этой теме и на этой версии.
 
214
11
59
Скорее всего неправильно задал xyz, телепнись в 0 0 0, чтобы проверить это. Если на 0 0 0 зарендерится что-то, значит отнимай корды объекта от корд игрока, чтобы получится относительное смещение
 

VeniVidiVici

Санта Барбарис
327
15
198
Скорее всего неправильно задал xyz, телепнись в 0 0 0, чтобы проверить это. Если на 0 0 0 зарендерится что-то, значит отнимай корды объекта от корд игрока, чтобы получится относительное смещение
Не, никак. Даже попробовал задать изначально позицию, и на ней проверять. Видать всё же надо как-то иначе вызывать Рендер, но вот как?
 
214
11
59
Времени у меня особо сейчас нет с этим разбираться, но вот тебе код, мб он тебе поможет. Это для 2д рендера, но переделать его в 3д труда большого не составит

Java:
    public static void renderItem(ItemStack itemStack, float itemScale, float offsetX, float offsetY, float x, float y, float width, float height, float rotation) {
        glPushMatrix();
        float minSize = width < height ? width : height;
        float itemSize = 0;
        float dx = 0;
        float dy = 0;
        if (width > height) {
            dx = (height - width) / 2f;
        } else {
            dy = (width - height) / 2f;
        }

        IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(itemStack, INVENTORY);
        if (customRenderer != null) {
            itemSize = minSize / 16f * itemScale;
            renderItem.renderWithColor = false;
        } else {
            float add = height / 10f;
            offsetX += add;
            offsetY += add;
            itemSize = minSize / 20f * itemScale;
            GL11.glEnable(GL11.GL_LIGHTING);
        }

        glTranslatef(x, y, 0f);
        float width1 = width / 2f;
        float height1 = height / 2f;
        glTranslatef(width1, height1, 0);
        glRotatef(rotation, 0, 0, 1);
        glTranslatef(-width1, -height1, 0);
        glTranslatef(offsetX - dx, offsetY - dy,0);

        glScalef(itemSize, itemSize, 1f);
        glDepthMask(true);
        glEnable(GL_DEPTH_TEST);
        renderItem.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), itemStack, 0, 0);
        renderItem.renderItemOverlayIntoGUI(mc.fontRenderer, mc.getTextureManager(), itemStack, 0, 0, null, false);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glDisable(GL_DEPTH_TEST);
        glDisable(GL_ALPHA_TEST);
        glEnable(GL_BLEND);
        glAlphaFunc(GL_GREATER, 0.001f);
        glDepthMask(false);
        glDisable(GL11.GL_LIGHTING);

        if (customRenderer != null) {
            GL11.glColor4f(1f, 1f, 1f, 1f);
            renderItem.renderWithColor = true;
        }

        glPopMatrix();
    }
 

VeniVidiVici

Санта Барбарис
327
15
198
Времени у меня особо сейчас нет с этим разбираться, но вот тебе код, мб он тебе поможет. Это для 2д рендера, но переделать его в 3д труда большого не составит
По-моему это не то)
 
177
4
22
Не знаю даже, поможет-ли это тебе, но у меня есть жуткий но рабочий код


Страшный код:
MovingObjectPosition hoveredObject = Minecraft.getMinecraft().objectMouseOver;
if (hoveredObject.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
    ItemStack currentItem = Minecraft.getMinecraft().thePlayer.getHeldItem();
    if (currentItem != null && currentItem.getItem() instanceof ItemBlock) {
        GameRegistry.UniqueIdentifier id = GameRegistry.findUniqueIdentifierFor(currentItem.getItem());
        Block currentBlock = GameRegistry.findBlock(id.modId, id.name);
        if (currentBlock != null) {
            RenderBlocks renderBlocks = new RenderBlocks();
            renderBlocks.setRenderBounds(0D, 0D, 0D, 1D, 1D, 1D);
            renderBlocks.blockAccess = Minecraft.getMinecraft().theWorld;
            Entity entity = Minecraft.getMinecraft().renderViewEntity;
            double playerX = entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * (double) event.partialTicks;
            double playerY = entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * (double) event.partialTicks;
            double playerZ = entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * (double) event.partialTicks;

            GL11.glPushMatrix();
            Tessellator tessellator = Tessellator.instance;
            tessellator.startDrawingQuads();
            GL11.glEnable(GL11.GL_BLEND);
            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            GL11.glTranslated(-playerX, -playerY, -playerZ);
            renderBlocks.renderBlockByRenderType(currentBlock, hoveredObject.blockX + (hoveredObject.sideHit == 4 ? -1 : 0) + (hoveredObject.sideHit == 5 ? 1 : 0), hoveredObject.blockY + (hoveredObject.sideHit == 1 ? 1 : 0) + (hoveredObject.sideHit == 0 ? -1 : 0), hoveredObject.blockZ + (hoveredObject.sideHit == 2 ? -1 : 0) + (hoveredObject.sideHit == 3 ? 1 : 0));
            tessellator.draw();
            GL11.glDepthMask(true);
            GL11.glDisable(GL_BLEND);
            GL11.glPopMatrix();
        }
    }
}
 
Последнее редактирование:
Сверху