Треклятая трава! Рендер (1.7.10)

Статус
В этой теме нельзя размещать новые ответы.
4,045
63
645
Всем привет!
Я таки начал решать эту непосильную задачу: написание своего рендера для подобия блока травы.

Кое как удалось создать макет кода для нескольких пассов рендера.
Использовал этот тутор, немного его изменив.

Но вот беда... Те цели, которые мне нужны, а именно: наложение поверх травы и её окраска в цвет биома, этот тутор не решает. А все попытки найти хоть что-нибудь подходящее утыкаются в несуществующие страницы!
ДА! То самое, что мне нужно, уже решалось много раз, но ВСЕ ссылки на готовый код не работают!
В частности эта. ЭТО ВСЁ ЗАГОВОР! :blink:

В общем, помогите плиз! Что именно нужно писать во 2-м пассе рендера, что б получилась таки трава? Думаю, что здесь полно людей, для который такая задача - семечки.

Пока что рендер выглядит так:
Код:
package ru.liahim.saltmod.main;

import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.init.Blocks;
import net.minecraft.world.IBlockAccess;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;

public class SaltGrassRenderer implements ISimpleBlockRenderingHandler {

    @Override
    public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
        renderer.renderBlockAsItem(Blocks.grass, 1, 0.0F);
    }

    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
            RenderBlocks renderer) {

        if (ClientProxy.renderPass == 0)
        {
            renderer.renderStandardBlock(SaltMod.saltGrass, x, y, z);
        }
        else
        {
            renderer.renderStandardBlock(Blocks.glass, x, y, z);
        }
        
        return true;
    }

    @Override
    public boolean shouldRender3DInInventory(int modelId) {
        return true;
    }

    @Override
    public int getRenderId() {
        return ClientProxy.saltGrassRenderType;
    }
}

В сомом блоке травы добавил следующие методы:
Код:
@Override
    public boolean renderAsNormalBlock()
    {
        return false;
    }
    
    @Override
    public int getRenderType()
    {
        return ClientProxy.saltGrassRenderType;
    }
    
    @Override
    public boolean canRenderInPass(int pass)
    {
        ClientProxy.renderPass = pass;
        return true;
    }
    
    @Override
    public int getRenderBlockPass()
    {
        return 1;
    }

    @SideOnly(Side.CLIENT)
    public static IIcon getIconSideOverlay()
    {
        return Blocks.grass.getIconSideOverlay();
    }

Ну и верультат (всё работает, правда совсем не то, что мне надо :D )

7wZhPjFReSs.jpg


P.S. Боковая сторона блока травы сейчас не красится совсем. То, что бы видите - это просто текстура, очень похожая по цвету на биом.
 
47
0
А в самом блоке травы это не написано? В кодах майника все по идеи быть должно.
[merge_posts_bbcode]Добавлено: 09.10.2015 11:56:13[/merge_posts_bbcode]

Вот. Нашел. Но сам разбирать не хочу (ибо мне это пока-что не надо)
Посмотри в net.minecraft.Block пакете класс BlockGrass. Там есть функции за цвет блока отвечающие (они в самом низу).
 
4,045
63
645
Эх... Народ. В блоке травы я уже ковырялся и все методы отвечающие за окраску у меня есть... Но одной окраски мало... Знающие люди поймут.

Мой вопрос именно по мультипасс-рендеру.
Как сделать, чтобы окрашивался именно 2-й пасс, а так же задать ему прозрачность на нужных сторонах блока?
 
164
1
4
Для себя делал блок с двумя слоями, делал так:
Код:
IIcon icon = block.getIcon(6, 0);
Tessellator tessellator = Tessellator.instance;
        
tessellator.setColorOpaque(0, 255, 0); //Цвет нижнего слоя

renderer.renderFaceYNeg(block, x, y, z, icon);

renderer.renderFaceYPos(block, x, y, z, icon);

renderer.renderFaceZNeg(block, x, y, z, icon);

renderer.renderFaceZPos(block, x, y, z, icon);

renderer.renderFaceXNeg(block, x, y, z, icon);

renderer.renderFaceXPos(block, x, y, z, icon);

renderer.renderStandardBlock(block, x, y, z);
 
164
1
4
Liahim написал(а):
А это ты во 2-й слой кидал? Или это как бы получается два в одном?
Ладно... Дома попробую поковыряться.
Спасибо.
Это два в одном, смысл в том что ты регистрируешь две текстуры для блока, затем делаешь это в блоке:
Код:
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta)
{
    if (side < 6)
    {
         return outer; //Верхняя текстура
    }
    else
    {
        return inner; //Нижняя текстура
    }
}
Затем это пишешь в рендере в renderWorldBlock:
Код:
IIcon icon = block.getIcon(6, 0); //Получаем нижнюю текстуру
Tessellator tessellator = Tessellator.instance;
        
tessellator.setColorOpaque(0, 255, 0); //Цвет нижнего слоя

//Рендерим стороны с нижней текстурой
renderer.renderFaceYNeg(block, x, y, z, icon);

renderer.renderFaceYPos(block, x, y, z, icon);

renderer.renderFaceZNeg(block, x, y, z, icon);

renderer.renderFaceZPos(block, x, y, z, icon);

renderer.renderFaceXNeg(block, x, y, z, icon);

renderer.renderFaceXPos(block, x, y, z, icon);

//Рендерим стандартный блок (с верхней текстурой)
renderer.renderStandardBlock(block, x, y, z);

У тебя, думаю будет немного по другому, но принцип тот же.
 
4,045
63
645
Хм... Честно говоря, не очень понял последовательность, поэтому сделал, как понял:
Код:
@Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
            RenderBlocks renderer) {

        if (ClientProxy.renderPass == 0)
        {
            renderer.renderStandardBlock(block, x, y, z);
        }

        else
        {
            renderer.renderFaceYPos(block, x, y, z, block.getIcon(1, 0));
            renderer.renderFaceXPos(block, x, y, z, block.getIcon(6, 0));
            renderer.renderFaceXNeg(block, x, y, z, block.getIcon(6, 0));
            renderer.renderFaceZPos(block, x, y, z, block.getIcon(6, 0));
            renderer.renderFaceZNeg(block, x, y, z, block.getIcon(6, 0));
        }
       
        return true;
    }

Результат на картинках ниже.
Проблемы:
  1. Верхняя текстура то тёмная, то светлая... Если пихнуть блок во тьму, то чаще всего светлая.
  2. Верхняя текстура рендериться после частиц. Когда я разбиваю блок, она закрывает собой ошмётки.
  3. Не понимаю, как заставить текстуру красится под цвет биома. На данный момент это прописано в самом блоке (так же как и в ванильной траве) и окрашивается только 1-й пасс.
dvh_vnmnIyg.jpg
Q3hWo6_NtYE.jpg


Жду умных людей )))
 
4,045
63
645
Попробовал сделать так
Код:
    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
            RenderBlocks renderer) {

            if (ClientProxy.renderPass == 0)
            {
                renderer.renderStandardBlock(block, x, y, z);
            }
            
            else
            {
                Tessellator tessellator = Tessellator.instance;
                tessellator.setColorOpaque_I(block.getBlockColor());
                
                renderer.renderFaceYPos(block, x, y, z, block.getIcon(1, 0));
                renderer.renderFaceXPos(block, x, y, z, block.getIcon(6, 0));
                renderer.renderFaceXNeg(block, x, y, z, block.getIcon(6, 0));
                renderer.renderFaceZPos(block, x, y, z, block.getIcon(6, 0));
                renderer.renderFaceZNeg(block, x, y, z, block.getIcon(6, 0));
            }
        
        return true;
    }

Цвет появился, но мерцание осталось.
Кто-нибудь может подсказать, как с этим справится?
 
4,045
63
645
Итак, ещё одна итерация )
Код:
    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
            RenderBlocks renderer) {

            if (ClientProxy.renderPass == 0)
            {
                renderer.renderStandardBlock(block, x, y, z);
            }
            
            else
            {
                Tessellator tessellator = Tessellator.instance;
                tessellator.setColorOpaque_I(block.colorMultiplier(world, x, y, z));
                tessellator.setBrightness(240);
                
                renderer.renderFaceYPos(block, x, y, z, block.getIcon(1, 0));
                renderer.renderFaceXPos(block, x, y, z, BlockGrass.getIconSideOverlay());
                renderer.renderFaceXNeg(block, x, y, z, BlockGrass.getIconSideOverlay());
                renderer.renderFaceZPos(block, x, y, z, BlockGrass.getIconSideOverlay());
                renderer.renderFaceZNeg(block, x, y, z, BlockGrass.getIconSideOverlay());
            }
        
        return true;
    }

Заменил getBlockColor на colorMultiplier, а так же добавил Brightness 240 (значение нашёл в нете).
Итог: цвет биома берётся правильно, то есть из метода colorMultiplier, прописанного в блоке. То есть, это почти трава )))

Загвоздки:
  1. Днём блок выглядит нормально, по ночам светится... То есть он не воспринимает никакие тени, будь то ночь, либо тень от дерева или иных блоков.
  2. Так же блок сам не является источником амбиент оклюжена... Ставлю его на землю, теней вокруг не появляется.
  3. Частицы перекрываются 2-м пассом рендера, то есть самой травой.
  4. Частицы от разрушения самого блока целиком окрашены в цвет биома (грязный зелёный цвет). Смотрится не очень приятно.
  5. Очень интересный глюк удалось заметить, так как сам блок рассчитан для посадки на него растения. Глюк заключается в том, что сейчас данный блок не имеет твёрдой верхней грани. То есть условие doesBlockHaveSolidTopSurface на нём не работает... Честно говоря, не понимаю, как рендер на это повлиял.
Пока я в тупике... Отзовитесь люди добрые )))
 
Код:
    public boolean renderStandardBlockWithColorMultiplier(Block p_147736_1_, int p_147736_2_, int p_147736_3_, int p_147736_4_, float p_147736_5_, float p_147736_6_, float p_147736_7_)
    {
        this.enableAO = false;
        Tessellator var8 = Tessellator.instance;
        boolean var9 = false;
        float var10 = 0.5F;
        float var11 = 1.0F;
        float var12 = 0.8F;
        float var13 = 0.6F;
        float var14 = var11 * p_147736_5_;
        float var15 = var11 * p_147736_6_;
        float var16 = var11 * p_147736_7_;
        float var17 = var10;
        float var18 = var12;
        float var19 = var13;
        float var20 = var10;
        float var21 = var12;
        float var22 = var13;
        float var23 = var10;
        float var24 = var12;
        float var25 = var13;

        if (p_147736_1_ != Blocks.grass)
        {
            var17 = var10 * p_147736_5_;
            var18 = var12 * p_147736_5_;
            var19 = var13 * p_147736_5_;
            var20 = var10 * p_147736_6_;
            var21 = var12 * p_147736_6_;
            var22 = var13 * p_147736_6_;
            var23 = var10 * p_147736_7_;
            var24 = var12 * p_147736_7_;
            var25 = var13 * p_147736_7_;
        }

        int var26 = p_147736_1_.getBlockBrightness(this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_);

        if (this.renderAllFaces || p_147736_1_.shouldSideBeRendered(this.blockAccess, p_147736_2_, p_147736_3_ - 1, p_147736_4_, 0))
        {
            var8.setBrightness(this.renderMinY > 0.0D ? var26 : p_147736_1_.getBlockBrightness(this.blockAccess, p_147736_2_, p_147736_3_ - 1, p_147736_4_));
            var8.setColorOpaque_F(var17, var20, var23);
            this.renderFaceYNeg(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, this.getBlockIcon(p_147736_1_, this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_, 0));
            var9 = true;
        }

        if (this.renderAllFaces || p_147736_1_.shouldSideBeRendered(this.blockAccess, p_147736_2_, p_147736_3_ + 1, p_147736_4_, 1))
        {
            var8.setBrightness(this.renderMaxY < 1.0D ? var26 : p_147736_1_.getBlockBrightness(this.blockAccess, p_147736_2_, p_147736_3_ + 1, p_147736_4_));
            var8.setColorOpaque_F(var14, var15, var16);
            this.renderFaceYPos(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, this.getBlockIcon(p_147736_1_, this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_, 1));
            var9 = true;
        }

        IIcon var27;

        if (this.renderAllFaces || p_147736_1_.shouldSideBeRendered(this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_ - 1, 2))
        {
            var8.setBrightness(this.renderMinZ > 0.0D ? var26 : p_147736_1_.getBlockBrightness(this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_ - 1));
            var8.setColorOpaque_F(var18, var21, var24);
            var27 = this.getBlockIcon(p_147736_1_, this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_, 2);
            this.renderFaceZNeg(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, var27);

            if (fancyGrass && var27.getIconName().equals("grass_side") && !this.hasOverrideBlockTexture())
            {
                var8.setColorOpaque_F(var18 * p_147736_5_, var21 * p_147736_6_, var24 * p_147736_7_);
                this.renderFaceZNeg(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, BlockGrass.func_149990_e());
            }

            var9 = true;
        }

        if (this.renderAllFaces || p_147736_1_.shouldSideBeRendered(this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_ + 1, 3))
        {
            var8.setBrightness(this.renderMaxZ < 1.0D ? var26 : p_147736_1_.getBlockBrightness(this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_ + 1));
            var8.setColorOpaque_F(var18, var21, var24);
            var27 = this.getBlockIcon(p_147736_1_, this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_, 3);
            this.renderFaceZPos(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, var27);

            if (fancyGrass && var27.getIconName().equals("grass_side") && !this.hasOverrideBlockTexture())
            {
                var8.setColorOpaque_F(var18 * p_147736_5_, var21 * p_147736_6_, var24 * p_147736_7_);
                this.renderFaceZPos(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, BlockGrass.func_149990_e());
            }

            var9 = true;
        }

        if (this.renderAllFaces || p_147736_1_.shouldSideBeRendered(this.blockAccess, p_147736_2_ - 1, p_147736_3_, p_147736_4_, 4))
        {
            var8.setBrightness(this.renderMinX > 0.0D ? var26 : p_147736_1_.getBlockBrightness(this.blockAccess, p_147736_2_ - 1, p_147736_3_, p_147736_4_));
            var8.setColorOpaque_F(var19, var22, var25);
            var27 = this.getBlockIcon(p_147736_1_, this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_, 4);
            this.renderFaceXNeg(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, var27);

            if (fancyGrass && var27.getIconName().equals("grass_side") && !this.hasOverrideBlockTexture())
            {
                var8.setColorOpaque_F(var19 * p_147736_5_, var22 * p_147736_6_, var25 * p_147736_7_);
                this.renderFaceXNeg(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, BlockGrass.func_149990_e());
            }

            var9 = true;
        }

        if (this.renderAllFaces || p_147736_1_.shouldSideBeRendered(this.blockAccess, p_147736_2_ + 1, p_147736_3_, p_147736_4_, 5))
        {
            var8.setBrightness(this.renderMaxX < 1.0D ? var26 : p_147736_1_.getBlockBrightness(this.blockAccess, p_147736_2_ + 1, p_147736_3_, p_147736_4_));
            var8.setColorOpaque_F(var19, var22, var25);
            var27 = this.getBlockIcon(p_147736_1_, this.blockAccess, p_147736_2_, p_147736_3_, p_147736_4_, 5);
            this.renderFaceXPos(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, var27);

            if (fancyGrass && var27.getIconName().equals("grass_side") && !this.hasOverrideBlockTexture())
            {
                var8.setColorOpaque_F(var19 * p_147736_5_, var22 * p_147736_6_, var25 * p_147736_7_);
                this.renderFaceXPos(p_147736_1_, (double)p_147736_2_, (double)p_147736_3_, (double)p_147736_4_, BlockGrass.func_149990_e());
            }

            var9 = true;
        }

        return var9;
    }
Посмотри как рендерится ванильный блок да и измени как тебе надо.
 
4,045
63
645
Нет, я, конечно, попытался повторить.
Но, мне кажется, что это попытка придумать велосипед. Этак мне и амбиент оклюжн придётся самому собирать.
Неужели нет уже готового решения для 2-го пасса и вообще для подобных задач.

Пока что код выглядит так:
Код:
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {

if (ClientProxy.renderPass == 0)
{
renderer.renderStandardBlock(block, x, y, z);
}
            
else
{
Tessellator tessellator = Tessellator.instance;
int B = block.getMixedBrightnessForBlock(world, x, y, z);
                
if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z - 1, 2))
{
tessellator.setBrightness(renderer.renderMinZ > 0.0D ? B : (int)(block.getMixedBrightnessForBlock(world, x, y, z - 1) * 0.9));
tessellator.setColorOpaque_I(block.colorMultiplier(world, x, y, z));
renderer.renderFaceZNeg(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
}
                
if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z + 1, 3))
{
tessellator.setBrightness(renderer.renderMaxZ < 1.0D ? B : (int)(block.getMixedBrightnessForBlock(world, x, y, z + 1) * 0.9));
tessellator.setColorOpaque_I(block.colorMultiplier(world, x, y, z));
renderer.renderFaceZPos(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
}
                
if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x - 1, y, z, 4))
{
tessellator.setBrightness(renderer.renderMinX > 0.0D ? B : (int)(block.getMixedBrightnessForBlock(world, x - 1, y, z) * 0.9));
tessellator.setColorOpaque_I(block.colorMultiplier(world, x, y, z));
renderer.renderFaceXNeg(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
}
                
if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x + 1, y, z, 5))
{
tessellator.setBrightness(renderer.renderMaxX < 1.0D ? B : (int)(block.getMixedBrightnessForBlock(world, x + 1, y, z) * 0.9));
tessellator.setColorOpaque_I(block.colorMultiplier(world, x, y, z));
renderer.renderFaceXPos(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
}
}
        
return true;
}

Результат: Трава зелёная, на день и ночь реагирует нормально.
В ванилке затенения боковых сторон блока относительно верхней грани решается через умножение цветовых каналов на 0,8 и 0,6 в зависимости от стороны.
Так как я пока не понял, как из colorMultiplier добыть RGB, временно затеняю боковые стороны с помощью умножения яркости на 0,9. Работает криво.

Проблемы:
  1. Кривое затемнение боковых сторон
  2. Отсутствует амбиент оклюжн
  3. Частицы всё ещё закрываются травой
  4. Блок всё ещё считается не твёрдым
Мне одному кажется, что должен быть вариант проще?
 
4,045
63
645
Итак! Используя забугорные туторы, думайте, прежде чем тупо копировать )

Убрал метод
Код:
    public boolean renderAsNormalBlock()
    {
        return false;
    }

И вуаля! Амбиент появился )))
Немного почесав репу, убрал нафик и 2-й пасс...
И вуаля! Частицы ведут себя нормально.
(p.s. странно, что текстуры не мерцают)

Продолжаю эксперименты.
Так как метод colorMultiplier, прописанный в самом блоке, делает ошмётки от блока грязно зелёными, решил отказаться от него в самом блоке и прописать аналогичный в рендере.

Беда в том, что я не очень понимаю методику преобразования числовых цветов в их РГБ аналоги, поэтому прошу совета у знающих людей.
Что я делаю не так?

Рендер:
Код:
    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
            RenderBlocks renderer) {

        Tessellator tessellator = Tessellator.instance;
        boolean flag = false;

           renderer.renderStandardBlock(block, x, y, z);

                int l = 0;
                int i = 0;
                int j = 0;

                for (int k1 = -1; k1 <= 1; ++k1)
                {
                    for (int l1 = -1; l1 <= 1; ++l1)
                    {
                        int i2 = world.getBiomeGenForCoords(x + l1, z + k1).getBiomeGrassColor(x + l1, y, z + k1);
                        l += (i2 & 16711680);
                        i += (i2 & 65280);
                        j += i2 & 255;
                    }
                }

                l = (l / 9 & 255);
                i = (i / 9 & 255);
                j = j / 9 & 255;

                
                int B = block.getMixedBrightnessForBlock(world, x, y, z);
                
                if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z - 1, 2))
                {
                    tessellator.setBrightness(renderer.renderMinZ > 0.0D ? B : (int)(block.getMixedBrightnessForBlock(world, x, y, z - 1) * 0.9));
                    tessellator.setColorOpaque_F(l, i, j);
                    renderer.renderFaceZNeg(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
                    flag = true;
                }
                
                if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z + 1, 3))
                {
                    tessellator.setBrightness(renderer.renderMaxZ < 1.0D ? B : (int)(block.getMixedBrightnessForBlock(world, x, y, z + 1) * 0.9));
                    tessellator.setColorOpaque_F(l, i, j);
                    renderer.renderFaceZPos(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
                    flag = true;
                }
                
                if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x - 1, y, z, 4))
                {
                    tessellator.setBrightness(renderer.renderMinX > 0.0D ? B : (int)(block.getMixedBrightnessForBlock(world, x - 1, y, z) * 0.9));
                    tessellator.setColorOpaque_F(l, i, j);
                    renderer.renderFaceXNeg(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
                    flag = true;
                }
                
                if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x + 1, y, z, 5))
                {
                    tessellator.setBrightness(renderer.renderMaxX < 1.0D ? B : (int)(block.getMixedBrightnessForBlock(world, x + 1, y, z) * 0.9));
                    tessellator.setColorOpaque_F(l, i, j);
                    renderer.renderFaceXPos(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
                    flag = true;
                }

        return flag;
    }

Пробовал варианты:
Код:
                        l += (i2 & 16711680) >> 16;
                        i += (i2 & 65280) >> 8;
                        j += i2 & 255;
                    }
                }

                l = (l / 9 & 255) << 16;
                i = (i / 9 & 255) << 8;
                j = j / 9 & 255;
Красится в белое.

Код:
                        l += (i2 & 16711680);
                        i += (i2 & 65280);
                        j += i2 & 255;
                    }
                }

                l = (l / 9 & 255);
                i = (i / 9 & 255);
                j = j / 9 & 255;
Красится в синее, при этом на определённых координатах голубое или белое.

Ну и по традиции итог.
Амбиент оклюжн присутствует, частицы ведут себя нормально, текстуры (на удивление) не мерцают, ошмётки самого блока имеют нормальные цвета. Блок, наконец, стал твёрдым )

Проблемы:
  1. Не могу разобраться с окраской самой травы.
Использование именно setColorOpaque_F(l, i, j); необходимо для того, чтобы на боковых сторонах делать затемнение текстуры подобно ванильному рендеру, а не через светимость, как я делаю сейчас.
Например setColorOpaque_F(l * 0.8, i * 0.8, j * 0.8);

Вопрос, как мне из цвета биома получить цветовые каналы для использование в setColorOpaque_F?
 

CumingSoon

Местный стендапер
1,634
12
269
В стандартных пакетах есть Color. Пример:
Color c=new Color(0xFFFFFF);
System.out.println(c.getRed());//255
 

CumingSoon

Местный стендапер
1,634
12
269
Это число и есть цвет.Засунь в конструктор Color, потом получай RGB по отдельности
 
4,045
63
645
И к чему его приравнивать? Я щаз мозг сломаю.

Поступил чуть иначе:
Код:
int C = (l / 9 & 255) << 16 | (i / 9 & 255) << 8 | j / 9 & 255;
int C1 = (l / 12 & 255) << 16 | (i / 12 & 255) << 8 | j / 12 & 255;
int C2 = (l / 15 & 255) << 16 | (i / 15 & 255) << 8 | j / 15 & 255;

tessellator.setColorOpaque_I(C);
tessellator.setColorOpaque_I(C1);
tessellator.setColorOpaque_I(C2);
 
4,045
63
645
Так! Народ! Спасибо всем, пытающимся помочь )))
Всё, вроде, работает.

Код:
@Override
    public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
        
        Tessellator tessellator = Tessellator.instance;
        GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
        tessellator.startDrawingQuads();
        tessellator.setNormal(0.0F, -1.0F, 0.0F);
        renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 0));
        tessellator.draw();
        tessellator.startDrawingQuads();
        tessellator.setNormal(0.0F, 1.0F, 0.0F);
        renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 1));
        tessellator.draw();
        tessellator.startDrawingQuads();
        tessellator.setNormal(0.0F, 0.0F, -1.0F);
        renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 2));
        tessellator.draw();
        tessellator.startDrawingQuads();
        tessellator.setNormal(0.0F, 0.0F, 1.0F);
        renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 3));
        tessellator.draw();
        tessellator.startDrawingQuads();
        tessellator.setNormal(-1.0F, 0.0F, 0.0F);
        renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 4));
        tessellator.draw();
        tessellator.startDrawingQuads();
        tessellator.setNormal(1.0F, 0.0F, 0.0F);
        renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 5));
        tessellator.draw();
        GL11.glTranslatef(0.5F, 0.5F, 0.5F);
    }

    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
            RenderBlocks renderer) {

        Tessellator tessellator = Tessellator.instance;
        boolean flag = false;

           renderer.renderStandardBlock(block, x, y, z);

               int l = 0;
               int i = 0;
               int j = 0;

               for (int k1 = -1; k1 <= 1; ++k1)
               {
                   for (int l1 = -1; l1 <= 1; ++l1)
                   {
                       int i2 = world.getBiomeGenForCoords(x + l1, z + k1).getBiomeGrassColor(x + l1, y, z + k1);
                       l += (i2 & 16711680) >> 16;
                       i += (i2 & 65280) >> 8;
                       j += i2 & 255;
                   }
               }

               int C = (l / 9 & 255) << 16 | (i / 9 & 255) << 8 | j / 9 & 255;
               int C1 = (l / 12 & 255) << 16 | (i / 12 & 255) << 8 | j / 12 & 255;
               int C2 = (l / 15 & 255) << 16 | (i / 15 & 255) << 8 | j / 15 & 255;
                
               int B = block.getMixedBrightnessForBlock(world, x, y, z);
                
               if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y + 1, z, 1))
               {
                   tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y + 1, z));
                   tessellator.setColorOpaque_I(C);
                   renderer.renderFaceYPos(block, (double)x, (double)y, (double)z, Blocks.grass.getBlockTextureFromSide(1));
                   flag = true;
               }
                
               if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z - 1, 2))
               {
                   tessellator.setBrightness(renderer.renderMinZ > 0.0D ? B : block.getMixedBrightnessForBlock(world, x, y, z - 1));
                   tessellator.setColorOpaque_I(C1);
                   renderer.renderFaceZNeg(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
                   flag = true;
               }
                
               if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z + 1, 3))
               {
                   tessellator.setBrightness(renderer.renderMaxZ < 1.0D ? B : block.getMixedBrightnessForBlock(world, x, y, z + 1));
                   tessellator.setColorOpaque_I(C1);
                   renderer.renderFaceZPos(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
                   flag = true;
               }
                
               if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x - 1, y, z, 4))
               {
                   tessellator.setBrightness(renderer.renderMinX > 0.0D ? B : block.getMixedBrightnessForBlock(world, x - 1, y, z));
                   tessellator.setColorOpaque_I(C2);
                   renderer.renderFaceXNeg(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
                   flag = true;
               }
                
               if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x + 1, y, z, 5))
               {
                   tessellator.setBrightness(renderer.renderMaxX < 1.0D ? B : block.getMixedBrightnessForBlock(world, x + 1, y, z));
                   tessellator.setColorOpaque_I(C2);
                   renderer.renderFaceXPos(block, (double)x, (double)y, (double)z, BlockGrass.getIconSideOverlay());
                   flag = true;
               }
                
        return flag;
    }

Осталась только одна проблемы:
На гранях, нарисованных при помощи renderFaceXPos не работает мягкое освещение. Тени от объектов жёсткие. При отрисовке блока с помощью renderStandardBlock такой проблемы нет.

Существует ли подобный метод для отдельных граней? Или всё таки мне придётся прописывать вручную и амбиент?

Спасибо за последний рывок )))
 
4,045
63
645
Эх...
Я решил, что всё гениальное просто, и снёс нафик всю эту гору кода...

Вот идеальное решение! не считая того, что это жуткий костыль... Но так же сделано в TFC!

Код:
    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
            RenderBlocks renderer) {
               
               renderer.renderStandardBlock(block, x, y, z);
               renderer.renderStandardBlock(SaltMod.grassTop, x, y, z);

        return true;
    }

Всего-то пришлось создать ещё один блок: саму верхушку травы ))) Покрасить этот блок в цвет биома и наложить сверху...

И не забыть облегчить жизнь компу:
Код:
    @SideOnly(Side.CLIENT)
    @Override
    public boolean shouldSideBeRendered(IBlockAccess access, int x, int y, int z, int side)
    {
        if (side > 0) return super.shouldSideBeRendered(access, x, y, z, side);
        else return false;
    }

Всем спасибо, все свободны )))
Тему можно закрывать )))
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху