Рендеринг текста в моде Minecraft обрезан по вертикали до 2/3JAVA

Программисты JAVA общаются здесь
Anonymous
Рендеринг текста в моде Minecraft обрезан по вертикали до 2/3

Сообщение Anonymous »

Я работаю над модом Minecraft, в котором я визуализирую собственный текст с помощью OpenGL. Однако текст не отображается полностью вертикально и обрезается на 2/3 своей высоты. Я подозреваю, что это может быть проблема с обрезкой или что-то связанное с метриками шрифта, но я не знаю, как диагностировать и устранить эту проблему. Вот соответствующий код для класса FontCharacter и метода рендеринга:

Код: Выделить всё

package keystrokesmod.utility.font.impl;

import net.minecraft.client.renderer.GlStateManager;
import org.lwjgl.opengl.GL11;

public class FontCharacter {

private final int texture;
private final float width;
private final float height;

public FontCharacter(int texture, float width, float height) {
this.texture = texture;
this.width = width;
this.height = height;
}

public void render(final float x, final float y) {
GlStateManager.bindTexture(texture);
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(x, y);
GL11.glTexCoord2f(0, 1);
GL11.glVertex2f(x, y + height);
GL11.glTexCoord2f(1, 1);
GL11.glVertex2f(x + width, y + height);
GL11.glTexCoord2f(1, 0);
GL11.glVertex2f(x + width, y);
GL11.glEnd();
}

public int getTexture() {
return texture;
}

public float getWidth() {
return width;
}

public float getHeight() {
return height;
}
}
Мое использование в другом файле

Код: Выделить всё

public int drawString(String text, double x, double y, final int color, final boolean shadow) {

if (!this.international && this.requiresInternationalFont(text)) {
return FontManager.getInternational(this.font.getSize() - 1).drawString(text, x, y, color);
}

final FontCharacter[] characterSet = this.international ? internationalCharacters : defaultCharacters;

double givenX = x;
GL11.glPushMatrix();
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glScalef(SCALE, SCALE, SCALE);

x -= MARGIN_WIDTH / SCALE_INVERSE;
y -= MARGIN_WIDTH / SCALE_INVERSE;
x *= SCALE_INVERSE;
y *= SCALE_INVERSE;
y -= fontHeight / 5;

final double startX = x;
final int length = text.length();
glColor(shadow ? 50 : color);

for (int i = 0; i < length; ++i) {
final char character = text.charAt(i);

try {
if (character == '\n') {
x = startX;
y += height() * 2;
continue;
}

final FontCharacter fontCharacter = characterSet[character];
fontCharacter.render((float) x, (float) y);
x += fontCharacter.getWidth() - MARGIN_WIDTH * 2;
} catch (Exception exception) {
System.out.println("Character \"" + character + "\" was out of bounds " +
"(" + ((int) character) + " out of bounds for " + characterSet.length + ")");
exception.printStackTrace();
}
}

GL11.glDisable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_TEXTURE_2D);
GlStateManager.bindTexture(0);
GL11.glPopAttrib();
GL11.glPopMatrix();

return (int) (x - givenX);
}
Я попробовал проверить метрики шрифта и убедиться, что высота символа правильно установлена ​​и используется при рендеринге. Я ожидал, что текст будет отображаться полностью вертикально без обрезки.
Изображение



Подробнее здесь: https://stackoverflow.com/questions/787 ... y-to-2-3rd

Вернуться в «JAVA»