Несколько вопросов о рендере

Версия Minecraft
1.7.10

Sainthozier

Стрелочник
624
11
369
Всем доброго времени суток.

Появилась необходимость кое-что "дорисовать" предметам, а как это сделать - не знаю.
1. Нужно на фоне айтема в слотах сделать свечение и маленькие, исходящие из него, линии. На словах хз как объяснить, это в идеале выглядит так же, как и линии, что исходят от дракона при смерти.
2. Если айтем в руке, то должно быть просто свечение, яркий ореол.
3. Если айтем дропнутый на блоки, то ореол + линии.

Подскажите, пожалуйста, с чего начать стоит. Возможно что-то полегче для тренировки сделать. У меня даже идей никаких нет. В моей голове это выглядит как простой свитч в методе рендера, где чекается "позиция"(пол, рука, слоты) айтема и соответственно в каждом кейсе своя отрисовка. Возможно всё кардинально отличается.
Я попытался найти гайды по рендеру, но нашёл только конкретизированные туториалы, а хотелось бы почитать что-то обобщённое, чтобы своё уже сделать.
 
1,976
68
220
@Losver, всё ты правильно думал. Так оно и делается. Глянь то ли ExtraUtils, то ли OpenBlocks, где-то там есть предмет с этим эффектом в инвентаре. Сам же метод есть в драконе края. Насчёт ореола - в идеале это шейдер, а такого ты пока не сможешь, так что забудь и используй линии. Ну или 2D кружок рисуй, тоже будет а-ля свечение.
@MagTemTenebrius, и что тут особенного? Ты просто отрисовал текстуру с альфа-каналом. Это буквально пять строк. Текст тоже элементарно, так что истинного веселья ты ещё не познал.
Алсо, проорал > Intellect: 5.0
D83CDF1A.png
 

jopi

Попрошайка
1,421
30
260
ЫЯХАЧУВСТАВИТСВАИ5КАПЕИК!
На 1.5.2 код(ы попробуй переведи)
Просто в модель пихуй этот код как отдельный метод, там уже поверти и посмотри как работает. Вызов по сути на this.reb()

Java:
public void reb() {
    GL11.glPushMatrix();
    GL11.glTranslatef(0.08F, -1.248F, 0.02F);
    float scale = 0.15F;
    GL11.glScalef(0.15F, 0.15F, 0.15F);
    boolean col = false;
    int age = Minecraft.getMinecraft().renderViewEntity.ticksExisted;
    GL11.glPushMatrix();
    float f1 = 0.0F;
    if (!Minecraft.getMinecraft().gameSettings.fancyGraphics) {
        ;
    }

    boolean q = true;
    Tessellator var22 = Tessellator.instance;
    f1 = (float)age / 500.0F;
    float f2 = 0.9F;
    float f3 = 0.0F;
    Random random = new Random(245L);
    GL11.glDisable(3553);
    GL11.glShadeModel(7425);
    GL11.glEnable(3042);
    GL11.glBlendFunc(770, 1);
    GL11.glDisable(3008);
    GL11.glEnable(2884);
    GL11.glDepthMask(false);
    GL11.glPushMatrix();
    boolean var23 = true;

    for(int i = 0; i < 100; ++i) {
        GL11.glRotatef(random.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F);
        GL11.glRotatef(random.nextFloat() * 360.0F, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(random.nextFloat() * 360.0F, 0.0F, 0.0F, 1.0F);
        GL11.glRotatef(random.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F);
        GL11.glRotatef(random.nextFloat() * 360.0F, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(random.nextFloat() * 360.0F + f1 * 360.0F, 0.0F, 0.0F, 1.0F);
        var22.startDrawing(6);
        float fa = random.nextFloat() * 20.0F + 5.0F + 0.0F;
        float f4 = random.nextFloat() * 2.0F + 1.0F + 0.0F;
        fa /= 10.0F / ((float)Math.min(age, 10) / 10.0F);
        f4 /= 10.0F / ((float)Math.min(age, 10) / 10.0F);
        var22.setColorRGBA_I(16196215, 255);
        var22.addVertex(0.6D, 0.0D, 0.0D);
        var22.setColorRGBA_I(16198159, 0);
        var22.addVertex(-0.866D * (double)f4, (double)fa, (double)(-0.5F * f4));
        var22.addVertex(0.866D * (double)f4, (double)fa, (double)(-0.5F * f4));
        var22.addVertex(0.0D, (double)fa, (double)(1.0F * f4));
        var22.addVertex(-0.866D * (double)f4, (double)fa, (double)(-0.5F * f4));
        var22.draw();
    }

    GL11.glPopMatrix();
    GL11.glDepthMask(true);
    GL11.glDisable(2884);
    GL11.glDisable(3042);
    GL11.glShadeModel(7424);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    GL11.glEnable(3553);
    GL11.glEnable(3008);
    GL11.glBlendFunc(770, 771);
    GL11.glPopMatrix();
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    GL11.glPopMatrix();
}
 
1,976
68
220
@jopi, Дать бы тебе по лицу за этот код.

@Losver, на нормальный (+/-)
Java:
public void renderEquippedItems(long time, float ticks) {
        Tessellator tessellator = Tessellator.instance;
        RenderHelper.disableStandardItemLighting();
        float f1 = time / 500.0F;
        float f3 = 0.9F;
        float f2 = 0.0F;

        int q = !FMLClientHandler.instance().getClient().gameSettings.fancyGraphics ? 5 : 10;

        Random random = new Random(245L);
        glDisable(GL_TEXTURE_2D);
        glShadeModel(GL_SMOOTH);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE);
        glDisable(GL_ALPHA_TEST);
        glDisable(GL_CULL_FACE);
        glDepthMask(false);
        glPushMatrix();

        for (int i = 0; i < q; i++) {
            glRotatef(random.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F);
            glRotatef(random.nextFloat() * 360.0F, 0.0F, 1.0F, 0.0F);
            glRotatef(random.nextFloat() * 360.0F, 0.0F, 0.0F, 1.0F);
            glRotatef(random.nextFloat() * 360.0F, 1.0F, 0.0F, 0.0F);
            glRotatef(random.nextFloat() * 360.0F, 0.0F, 1.0F, 0.0F);
            glRotatef(random.nextFloat() * 360.0F + f1 * 360.0F, 0.0F, 0.0F, 1.0F);
            tessellator.startDrawing(6);
            float fa = random.nextFloat() * 20.0F + 5.0F + f2 * 10.0F;
            float f4 = random.nextFloat() * 2.0F + 1.0F + f2 * 2.0F;
            fa /= 30.0F / (Math.min(time, 10) / 10.0F);
            f4 /= 30.0F / (Math.min(time, 10) / 10.0F);
            tessellator.setColorRGBA_I(0xFFFFFF, (int) (255.0F * (1.0F - f2)));
            tessellator.addVertex(0.0D, 0.0D, 0.0D);
            tessellator.setColorRGBA_I(0xFF00FF, 0);
            tessellator.addVertex(-0.866D * f4, fa, -0.5F * f4);
            tessellator.addVertex(0.866D * f4, fa, -0.5F * f4);
            tessellator.addVertex(0.0D, fa, 1.0F * f4);
            tessellator.addVertex(-0.866D * f4, fa, -0.5F * f4);
            tessellator.draw();
        }

        glPopMatrix();
        glDepthMask(true);
        glEnable(GL_CULL_FACE);
        glDisable(GL_BLEND);
        glShadeModel(GL_FLAT);
        glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        glEnable(GL_TEXTURE_2D);
        glEnable(GL_ALPHA_TEST);
        RenderHelper.enableStandardItemLighting();
    }
Можешь передавать время из мира или любую другую константу изменяющуюся со временем.
Пример вызова: renderEquippedItems(Minecraft.getMinecraft().theWorld.getTotalWorldTime(), RenderWorldLastEvent#partialTicks);
 
Последнее редактирование:
48
1
1,976
68
220
@jopi его только в мусорку выбросить. И не заливай, что это ты его сделал. Скомуниздил из какого-то мода, как и 90% выкладываемого тобой сюда кода. Алсо, твой код работает не как у дракона, из одной точки лучи, а из рандомных, что тоже не к месту.
 
Сверху