[Tutorial] Геометрия в наложениях (overlays)

svk

1,185
2
Добрый день, тут я расскажу как правильно располагать текстуры в наложениях (Хот-бары, шкалы, интерфейсы и т.п.).

Уверен большинство из нас это знают, но так-же уверен что эта тема отлично поможет новичкам. Это больше сборник кода, чем туториал.

Получить расширение окна:
Код:
//RenderGameOverlayEvent e
int w = e.resolution.getScaledWidth();
int h = e.resolution.getScaledHeight();

Код рендера текстуры определённого размера:
Код:
    public static void drawTextureCustomSize(double posX, double posY, double startPixX, double startPixY, double pieceSizeX, double pieceSizeY, float sizeTextureX, float sizeTextureY)
    {
        float f4 = 1.0F / sizeTextureX;
        float f5 = 1.0F / sizeTextureY;
        Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV((double)posX, (double)(posY + pieceSizeY), 0.0D, (double)(startPixX * f4), (double)((startPixY + (float)pieceSizeY) * f5));
        tessellator.addVertexWithUV((double)(posX + pieceSizeX), (double)(posY + pieceSizeY), 0.0D, (double)((startPixX + (float)pieceSizeX) * f4), (double)((startPixY + (float)pieceSizeY) * f5));
        tessellator.addVertexWithUV((double)(posX + pieceSizeX), (double)posY, 0.0D, (double)((startPixX + (float)pieceSizeX) * f4), (double)(startPixY * f5));
        tessellator.addVertexWithUV((double)posX, (double)posY, 0.0D, (double)(startPixX * f4), (double)(startPixY * f5));
        tessellator.draw();
    }//p.s. лень было удалять скобки и касты.
Текстура в углу:
Код:
RenderHelper.drawTextureCustomSize(0, 0, startPixX, startPixY, pieceSizeX, pieceSizeY, sizeTextureX, sizeTextureY);//Верхний левый угол

RenderHelper.drawTextureCustomSize(w - pieceSizeX, 0, startPixX, startPixY, pieceSizeX, pieceSizeY, sizeTextureX, sizeTextureY);//верхний правый угол

RenderHelper.drawTextureCustomSize(w - pieceSizeX, h - pieceSizeY, startPixX, startPixY, pieceSizeX, pieceSizeY, sizeTextureX, sizeTextureY);//нижний правый угол

RenderHelper.drawTextureCustomSize(0, h - pieceSizeY, startPixX, startPixY, pieceSizeX, pieceSizeY, sizeTextureX, sizeTextureY);//Нижний левый угол
Текстура по центру:
Код:
RenderHelper.drawTextureCustomSize((w - pieceSizeX)/2, (h - pieceSizeY)/2, startPixX, startPixY, pieceSizeX, pieceSizeY, sizeTextureX, sizeTextureY);
Oтцентровка текстуры при glScale:
Код:
float scale = 0.7F //Percent scale;
double posX = (w - pieceSizeX*scale)/scale; //Рендер тексуры справа

GL11.glPushMatrix();
GL11.glScalef(scale, scale, 1);

//Draw

GL11.glPopMatrix();
Oтцентровка текста:
Код:
String text = "svk";

drawString(font, text, posX, posY, new Color(255, 0, 0).getRGB()); //Текст слева направо
drawString(font, text, posX - font.getStringWidth(text)/2, posY, new Color(255, 0, 0).getRGB()); //Текст по центру
drawString(font, text, posX - font.getStringWidth(text), posY, new Color(255, 0, 0).getRGB()); //Текст справа налево.
 
1,137
5
3
Круто. Вот только getScaledWidth не разрешение окна. А красный - 0xFF0000(RRGGBB)
 

mayakplay

SpringFlomaster
217
3
160
Ща накидаю еще методов веселых :)
UPD говногруг:
Код:
/**
 * Рисует круглик
 * @param centerX центральная точка по горизонтали
 * @param centerY центральная точка по вертикали
 * @param radius радиус кружочка
 * @param segments количество точек на окружности
 * @param fillColor цвет заполнения
 * @param alpha255 альфа канал
 */
public static void materialCircle(double centerX, double centerY, double radius, int segments, int fillColor, int alpha255) {
    GL11.glDisable(GL11.GL_TEXTURE_2D);
    GL11.glPushMatrix();
    GL11.glEnable(GL11.GL_BLEND);

    Color color = HEXtoRGB(fillColor);
    GL11.glColor4f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, alpha255 / 255F);

    GL11.glBegin(GL11.GL_POLYGON);

    radius -=0.1F;

    for (int i = 0; i < segments; i++) {
        double rad = -2 * Math.PI * ((double) i) / ((double) segments);
        double x = Math.cos(rad);
        double y = Math.sin(rad);

        GL11.glVertex2d(x * radius + centerX + 0.5F, y * radius + centerY  + 0.5F);
    }

    GL11.glEnd();

    GL11.glDisable(GL11.GL_BLEND);
    GL11.glPopMatrix();
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glColor3f(1,1,1);
}

UPD говнопрямоугольник:
Код:
/**
 * Метод рисует прямоугольник
 * @param posX точка начала по горизонтали
 * @param posY точка начала по вертикали
 * @param width ширина прямоугольника
 * @param height его высота
 * @param hexColor цвет заливки типа 0xFFFFFFFF.
 */
public static void square(double posX, double posY, double width, double height, int hexColor) {
    GL11.glDisable(GL11.GL_TEXTURE_2D);
    GL11.glPushMatrix();

    Color color = HEXtoRGB(hexColor);

    GL11.glColor4f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, color.getAlpha() / 255F);
    GL11.glBegin(GL11.GL_POLYGON);

    GL11.glVertex2d(posX + width, posY);
    GL11.glVertex2d(posX, posY);
    GL11.glVertex2d(posX, posY + height);
    GL11.glVertex2d(posX + width, posY + height);


    GL11.glEnd();
    GL11.glPopMatrix();
    GL11.glEnable(GL11.GL_TEXTURE_2D);
}
 
608
5
15
А можно ли через тессалятор рисовать неправильные текстуры? Например круг затекстуреный?
 
2,505
81
397
Код:
double x = Math.cos(rad);
double y = Math.sin(rad);

Не стоит всегда пересчитывать синусы и косинусы, когда они уже все пересчитаны в MathHelper.
 
1,137
5
3
Dahaka написал(а):
Код:
double x = Math.cos(rad);
double y = Math.sin(rad);

Не стоит всегда пересчитывать синусы и косинусы, когда они уже все пересчитаны в MathHelper.
В Math, как бы, они из таблицы берутся
 
2,505
81
397
Да? Не знал. Нафига тогда их майнкравтовцы рассчитали?
 

Icosider

Kotliner
Администратор
3,603
99
664
Код:
    public static void drawTextureCustomSize(double posX, double posY, double startPixX, double startPixY, double pieceSizeX, double pieceSizeY, float sizeTextureX, float sizeTextureY)
    {
        float f4 = 1.0F / sizeTextureX;
        float f5 = 1.0F / sizeTextureY;
        Tessellator tessellator = Tessellator.getInstance();
        VertexBuffer vertexbuffer = tessellator.getBuffer();
        vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        vertexbuffer.pos(posX, posY + pieceSizeY, 0.0D).tex(startPixX * f4, ((startPixY + (float)pieceSizeY) * f5)).endVertex();
        vertexbuffer.pos(posX + pieceSizeX, posY + pieceSizeY, 0.0D).tex(((startPixX + (float)pieceSizeX) * f4), ((startPixY + (float)pieceSizeY) * f5)).endVertex();
        vertexbuffer.pos(posX + pieceSizeX, posY, 0.0D).tex(((startPixX + (float)pieceSizeX) * f4), startPixY * f5).endVertex();
        vertexbuffer.pos(posX, posY, 0.0D).tex(startPixX * f4, startPixY * f5).endVertex();
        tessellator.draw();
    }
Под 1.8 и выше. Код не проверен, так что возможно где-то косяк. Тест сделаю позднее.
 
Что то всё вышеизложенное не могу применить на 1.8.8 Подскажите, как правильно Тесселятором менять размер текстурок в GUI  в зависимости от размера экрана?
 
7,099
324
1,510
А что, на новых версиях какая-то другая геометрия?)) Мониторы и окна те же самые, формулы те же самые, применимы и за пределами майна
 
Сверху