[1.6.4] получение int цветов в Minecraft

Статус
В этой теме нельзя размещать новые ответы.
435
1
Появился вопрос - как получить int цвета minecraft из RGB?
[merge_posts_bbcode]Добавлено: 21.06.2015 11:22:30[/merge_posts_bbcode]

Посмотрел в MapItemRenderer

Код:
... 
   public void renderMap(EntityPlayer par1EntityPlayer, TextureManager par2TextureManager, MapData par3MapData)
    {
        for (int i = 0; i < 16384; ++i)
        {
            byte b0 = par3MapData.colors[i];

            if (b0 / 4 == 0)
            {
                this.intArray[i] = (i + i / 128 & 1) * 8 + 16 << 24;
            }
            else
            {
                int j = MapColor.mapColorArray[b0 / 4].colorValue;
                int k = b0 & 3;
                short short1 = 220;

                if (k == 2)
                {
                    short1 = 255;
                }

                if (k == 0)
                {
                    short1 = 180;
                }

                int l = (j >> 16 & 255) * short1 / 255;
                int i1 = (j >> 8 & 255) * short1 / 255;
                int j1 = (j & 255) * short1 / 255;
                this.intArray[i] = -16777216 | l << 16 | i1 << 8 | j1;
            }
        }
...
[merge_posts_bbcode]Добавлено: 21.06.2015 11:23:18[/merge_posts_bbcode]

И не понял как что и зачем.
 
Ну, суть в том, что это стандартный цвет формата RRGGBB, но переведенный в десятичную систему, и его режут на 3 инта с каждым цветом.

>> 8/16 сдвигает число на 2/4 шестнадцатиричных числа, отрезая все до определенной цифры (Остается RRGG когда 8 или RR когда 16).
Потом вычисляется MOD (остаток от деления) на 255, по сути, отрезая все, кроме последних 2 цифр (Остается RR, GG или BB).
* short1 / 255 просто немного смягчает цвет (насколько сильно, зависит от short1).

...Вот уж действительно, чтоб понять, можно попробовать объяснить кому-то еще.
 
Существует формула для вычисления данного числа из 3 интов R G B? Например R=34 G=76 B=195, как может выглядеть данная формула для этих чисел?
 
Что-то типа RGB = R * 256^2 + G * 256 + B, но я мог напутать константы, поэтому проверь по ванильному коду.

Хотя ванильная формула там чуть пониже: -16777216 | l << 16 | i1 << 8 | j1;
 
Вот например 524040 - ярко-розовый цвет с миссинг текстура.
В RGB выглядит так: 248 0 248 : R G B (фотошоп помог)
Теперь вопрос как получить из 3 чисел 248 0 248 число 524040? (R * 255^2 + G * 255 + B не пойдет)
 
524040 - это грязно-коричневый. Розовый с миссинга - F800F8(Подсчитано по исправленной формуле, проверь мой предыдущий пост. Так и знал, что что-то забыл). В инте это 16253176. Откуда ты взял 524040? CMYK? Да нет вроде, там это чистый M.
 
Но! Вставляя это в код
Код:
                for (int i = 0; i < 2048; ++i)
                {
                    this.intArray[i] = -16253176;
                }
                this.bufferedImage.updateDynamicTexture();
                this.mc.renderEngine.bindTexture(this.field_111276_e);
                GL11.glScalef(2, 2, 0);
                this.drawTexturedModalRect(10, 10, 0, 0, 32, 16);


Я получаю ярко зеленый. 524040 дает розовый с миссинга.
 
Один шаг пропустил. В ванильном коде он, кстати, есть.
Суть в том, что из получившегося числа надо еще 16777216 вычесть. Тогда все норм.
 
И еще все это должно отрицательным быть (хз почему).
 
Потому что так код короче, ололо.
 
Ну в общем получилось! Спасибо лаз! Заркыто.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху