Повторение текстуры

Версия Minecraft
1.7.10
355
2
17
Добро, как можно правильно указать размер текстуры и размер отрисовываемой области с учетом повторения?
В более свежих версиях есть там вот метод:

Java:
    public static void drawModalRectWithCustomSizedTexture(int x, int y, float u, float v, float width, float height, float textureWidth, float textureHeight)
    {
        float f = 1.0F / textureWidth;
        float f1 = 1.0F / textureHeight;
        Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV((double)x, (double)(y + height ), 0.0D,(double)(u * f), (double)((v + (float)height) * f1));
        tessellator.addVertexWithUV((double)(x + width), (double)(y + height), 0.0D,(double)((u + (float)width) * f), (double)((v + (float)height) * f1));
        tessellator.addVertexWithUV((double)(x + width), (double)y, 0.0D,(double)((u + (float)width) * f), (double)(v * f1));
        tessellator.addVertexWithUV((double)x, (double)y, 0.0D,(double)(u * f), (double)(v * f1));
        tessellator.draw();
    }

Там по сути можно указать положение, отступ, размер uv и размер самой текстуры (для scale).
Необходимо чтобы эта область повторялась по указанному размеру.
1583956144233.png
 

timaxa007

Модератор
5,831
409
672
Эм... Ну циклом.
Java:
int переменная_1 = Общий размер.
float переменная_2 = (общий размер / на размер часть текстуры).
int переменная_3 = (int)переменная_2.
if (переменная_2 > переменная_3) переменная_3 += 1;

    for (int i = 0; i < переменная_3; ++i) {
        if (i == (переменная_3 - 1) && переменная_2 > переменная_3) {
            float переменная_4 = 1 - (переменная_2 - переменная_3)
            drawModalRectWithCustomSizedTexture(int x, int y + (переменная_3 * на размер часть текстуры), float u, float v - переменная_4, float width, float height - переменная_4, float textureWidth, float textureHeight)
        } else {
            drawModalRectWithCustomSizedTexture(int x, int y + (переменная_3 * на размер часть текстуры), float u, float v, float width, float height, float textureWidth, float textureHeight)
        }
    }
Ну или типа того. Это нужно пробовать и проверять.
Я только пробовал растягивать текстуру (по горизонтали).
Ну и можно как пример посмотреть на Gui сундука (один или сдвоенный сундук).
 

timaxa007

Модератор
5,831
409
672
Ну так, тебе растянуть текстуру надо значит.
Я только пробовал растягивать текстуру (по горизонтали).
Java:
drawModalRectWithCustomSizedTexture(//Left
                0, 0,//x, y
                0, 0,//u, v
                486, 697,//uWidth, vHeight
                486 / 3, 697 / 3,//width, height
                1024F, 1024F);//tileWidth, tileHeight

drawModalRectWithCustomSizedTexture(//Center
                486 / 3, 0,//x, y
                486, 0,//u, v
                490, 697,//uWidth, vHeight
                width - ((486 + 48) / 3), 697 / 3,//width, height
                1024F, 1024F);//tileWidth, tileHeight

drawModalRectWithCustomSizedTexture(//Right
                width - (48 / 3), 0,//x, y
                976, 0,//u, v
                48, 697,//uWidth, vHeight
                48 / 3, 697 / 3,//width, height
                1024F, 1024F);//tileWidth, tileHeight
Просто x на y, а y на x меняешь и width на height, а так-же изменяешь под свою текстуру.
 
355
2
17
Если растянуть, то контурные пиксели тоже растянет, те которые отвечают за рамку и подобные элементы, у меня есть такой вариант:

Java:
    public static void drawModalRectWithCustomSizedTexture(int xPos, int yPos, float uMargin, float vMargin, float uWidth, float vHeight, float width, float height, float textureWidth, float textureHeight)
    {
        float f = 1.0F / textureWidth;
        float f1 = 1.0F / textureHeight;
        Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV((double)xPos, (double)(yPos + height ), 0.0D,(double)(uMargin * f), (double)((vMargin + (float)vHeight) * f1));
        tessellator.addVertexWithUV((double)(xPos + width), (double)(yPos + height), 0.0D,(double)((uMargin + (float)uWidth) * f), (double)((vMargin + (float)vHeight) * f1));
        tessellator.addVertexWithUV((double)(xPos + width), (double)yPos, 0.0D,(double)((uMargin + (float)uWidth) * f), (double)(vMargin * f1));
        tessellator.addVertexWithUV((double)xPos, (double)yPos, 0.0D,(double)(uMargin * f), (double)(vMargin * f1));
        tessellator.draw();
    }
}

Но растягивание не подходит
 
2,505
81
397
Тебе нужна nine-patch иконка?

Никакого встроенного механизма нет. Если нужны все 9 отсеков, то алгоритм примерно следующий.
Рендеришь сначала угловые квады, которые не нужно скейлить/репитить.
Затем горизонтальные/вертикальные ребра, скейля/растягивая по горизонтали/вертикали.
А затем центральную область скейля/растягивая на всю область.
Если нужно скейлить, то все очевидно - просто один квад с растянутой тектурой. Если репитить, то добавляешь квады в цикле без растяжения.

Так как квадов тут довольно много (даже если достаточно скейла), то советую не использовать хелпер функции drawModalRect*. Лучше написать свою функцию, которая не будет спамить дроуколами.

Совсем забыл. По такому принципу в майне рендерится стандартная кнопка. Можно подсмотреть там.
 
Сверху